このガイドは、Solana上でプログラムの検証済みビルドを実装したい開発者向けのリファレンスです。検証済みビルドとは何か、その使用方法、特別な考慮事項、およびオンチェーンでのプログラムの信頼性を確保するためのベストプラクティスについて説明します。
検証済みビルドとは何ですか?
検証済みビルドは、Solanaネットワークにデプロイする実行可能なプログラムが、リポジトリ内のソースコードと一致することを保証します。これにより、開発者とユーザーは、オンチェーンで実行されているプログラムが公開されているコードベースと完全に一致していることを確信でき、透明性とセキュリティを促進します。
検証プロセスでは、オンチェーンプログラムのハッシュとソースコードからローカルでビルドされたプログラムのハッシュを比較します。これにより、2つのバージョン間に相違がないことが保証されます。
検証済みビルドは未検証のビルドよりも安全であるとは限りませんが、ビルドによって開発者はソースコードがオンチェーンにデプロイされたものと一致することを自己検証できます。ソースコードを使用して、開発者はトランザクションを送信する際にコードが実行する内容を検証できます。
検証済みビルドのパイプラインはEllipsis LabsとOtterSecによって考案され、維持されています。詳細については、オリジナルの検証済みビルドリポジトリのガイドに従い、また検証ビルドプロセスをAnzaツールスイートに直接組み込んでください(サポートされた場合)。
どのように機能しますか?
検証プロセスは、オンチェーンプログラムのハッシュとソースコードからローカルでビルドされたプログラムのハッシュを比較することで行われます。Solana Verify CLIとDockerを使用して、制御された環境でプログラムをビルドします。これにより、ビルドプロセスが決定論的になり、異なるシステム間で一貫性が保たれます。実行可能ファイルができたら、Solanaネットワークにデプロイできます。ビルドプロセス中にverify programのPDAが作成されます。このPDAにはプログラムを検証するために必要なすべてのデータが含まれています。PDAにはプログラムアドレス、gitのURL、コミットハッシュ、およびプログラムをビルドするために使用された引数が含まれています。
PDAのデータを使用して、誰でもローカルで検証プログラムコマンドを実行し、プログラムが提供されたソースコードからビルドされたかどうかを確認できます。その後、完全に信頼性を確保しながら自分自身で検証したり、OtterSecが維持している独自のverify APIを実行して、ユーザーが検証を簡単に確認できるアクセスポイントを提供することができます。これらのAPIコールは、Solana ExplorerやSolanaFMなど、さまざまな場所ですでに使用されています。
検証済みビルドを使用する理由
検証済みビルドを使用すると、以下のメリットがあります:
-
セキュリティ:オンチェーンで実行されているプログラムがソースコードと一致することを保証し、悪意のある改変を防止します。
-
透明性:他のユーザーや開発者が、オンチェーンプログラムを公開コードベースと比較することで、信頼性を検証できるようにします。
-
信頼:検証済みビルドはプログラムのオンチェーン動作が公開コードと一致していることを示すため、ユーザーの信頼を高めます。検証可能なプログラムを構築することで、不正または悪意のあるコードの実行に関連するリスクを最小限に抑えることができます。また、ベストプラクティスに準拠し、セキュリティ研究者が簡単に連絡できる方法を提供することも保証します。さらに、ウォレットやその他のツールは、プログラムが検証されている限り、そのプログラムからのトランザクションをより簡単に許可することができます。
-
発見可能性:プログラムの検証済みビルドを提供すると、誰でもソースコード、ドキュメント、プログラムSDKまたはIDLを見つけることができ、問題がある場合はGitHubを通じて簡単に連絡を取ることができます。
検証済みビルドを作成するにはどうすればよいですか?
検証済みビルドを作成するには、次の手順に従う必要があります:
概要:
- コードを公開リポジトリにコミットする
- Dockerで検証済みビルドを構築する
- 検証済みビルドをデプロイする
- デプロイされたプログラムを公開APIに対して検証する
Dockerコンテナ内で構築されていないプログラムを検証しようとすると、Solanaプログラムのビルドは異なるシステム間で決定論的ではないため、ほとんどの場合失敗します。
DockerとCargoのインストール
必要なツールをインストールし、DockerとCargoがインストールされていることを確認してください。Dockerは一貫性を確保するための制御された構築環境を提供し、CargoはRustパッケージの管理に使用されます。
- Docker:Dockerウェブサイトの手順に従って、お使いのプラットフォーム用のDockerをインストールしてください。インストール後、このガイドに従ってDockerサービスが実行されていることを確認してください。
- Cargo:まだCargoがインストールされていない場合は、次のコマンドを実行してインストールできます:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Solana Verify CLIのインストール
Solana Verify CLIは、ビルドを検証するために使用される主要なツールです。Solana Verify CLIは現在Ellipsis Labsによって維持されており、Cargoを使用してインストールできます。
次のコマンドを実行してインストールできます:
cargo install solana-verify
CLIの特定のバージョンが必要な場合は、バージョンを固定できます:
cargo install solana-verify --version $VERSION
必要に応じて、特定のコミットから直接バージョンをインストールすることもできます:
cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2
プロジェクトの準備
リポジトリに対して検証するには、リポジトリのルートディレクトリにCargo.lockファイルが必要です。リポジトリに1つのプログラムのみがあり、ルートにcargo.lockファイルがある場合は、次のステップに直接進んでプログラムをビルドできます。
プログラムがサブフォルダにあり、Rustワークスペースを使用している場合は、リポジトリのルートディレクトリにワークスペースCargo.tomlファイルを作成する必要があります。
このCargo.tomlの例をプリセットとして使用できます:
[workspace]members = ["program/programs/*"]resolver = "2"[profile.release]overflow-checks = truelto = "fat"codegen-units = 1[profile.release.build-override]opt-level = 3incremental = falsecodegen-units = 1
プログラムがworkspace/members配列に含まれていること、およびプログラムのCargo.tomlに正しいlib名が設定されていることを確認してください。
重要なのは
lib nameであり、パッケージ名ではありません!
次のような感じです:
[package]name = "waffle"version = "0.1.0"edition = "2021"[lib]name = "waffle"crate-type = ["cdylib", "lib"][dependencies]solana-program = "2.1.0"
このリポジトリでは、サブフォルダにプログラムがあるワークスペースの例を確認できます。また、プログラムがサブフォルダにある場合、後でverify-from-repoコマンドにこのフォルダを--mount-pathとして追加する必要があることにも注意してください。
このリポジトリではAnchorの例を見つけることができます。このリポジトリではネイティブRustの例を見つけることができます。
このCargo.tomlファイルを配置したら、cargo generate-lockfileを実行してロックファイルを作成し、プログラムのビルドに進むことができます。
検証可能なプログラムのビルド
Solanaプログラムを検証可能な方法でビルドするには、ワークスペースのCargo.tomlファイルがあるディレクトリに移動して、次のコマンドを実行します:
solana-verify build
これにより、環境がDockerコンテナにコピーされ、決定論的な方法でビルドされます。
実際に検証済みビルドをデプロイし、
anchor buildやcargo build-sbfで誤って上書きしないように注意してください。これらは同じハッシュにならない可能性が高く、検証が失敗します。
複数のプログラムを持つプロジェクトでは、ライブラリ名(パッケージ名ではない)を使用して特定のプログラムをビルドできます:
solana-verify build --library-name $PROGRAM_LIB_NAME
このプロセスは決定論的なビルドを保証しますが、特に特定のシステム(例:M1 MacBook)ではDockerコンテナ内で実行されるため、時間がかかることがあります。より速いビルドのためには、x86アーキテクチャを実行しているLinuxマシンの使用が推奨されます。
ビルドが完了したら、次のコマンドを使用して実行可能ファイルのハッシュを取得できます:
solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so
検証可能なプログラムのデプロイ
プログラムをビルドしてハッシュを取得したら、Solanaネットワークにデプロイできます。安全なデプロイのためには、Squads Protocolのようなマルチシグネチャやガバナンスソリューションを使用することが推奨されますが、以下のように直接デプロイすることもできます:
solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --with-compute-unit-price 50000 --max-sign-attempts 100 --use-rpc
現在適切な低優先度の手数料は、例えばQuicknodeなどのRPCプロバイダーから取得できます。
デプロイされたプログラムがビルドされた実行可能ファイルと一致することを確認するには、次のコマンドを実行します:
solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID
異なるバージョンが異なるSolanaクラスター(つまり、devnet、testnet、mainnet)にデプロイされている場合があります。検証したいSolanaクラスターに対して正しいネットワークURLを使用していることを確認してください。リモート検証はメインネットでのみ機能します。
リポジトリに対する検証
公開リポジトリに対してプログラムを検証するには、次のコマンドを使用します:
solana-verify verify-from-repo -u $NETWORK_URL --program-id $PROGRAM_ID https://github.com/$REPO_PATH --commit-hash $COMMIT_HASH --library-name $PROGRAM_LIB_NAME --mount-path $MOUNT_PATH
プログラムディレクトリで検証済みビルドを実行する際、
verify-from-repoを実行するときは--mount-pathフラグを追加する必要があります。これはプログラムのライブラリ名を含むCargo.tomlが格納されているフォルダへのパスになります。
このコマンドは、オンチェーンのプログラムハッシュと指定されたコミットハッシュのソースからビルドされた実行可能ファイルのハッシュを比較します。
コマンドの最後に、検証データをオンチェーンにアップロードするかどうか尋ねられます。アップロードすると、Solana Explorerがすぐにプログラムの検証データを表示します。リモートビルドによって検証されるまでは、未検証として表示されます。次のステップでは、公開APIに対してプログラムを検証する方法について学びます。
検証を特定のリリースに固定したい場合は、コマンドに --commit-hash
フラグを追加できます。
公開APIに対して検証する
最後に、検証APIを実行している誰に対しても直接プログラムを検証することができます:
solana-verify verify-from-repo --remote -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1
無料RPCのレート制限に引っかかる可能性があるため、有料のRPC URLを使用することを推奨します。そのため、
-umの代わりに--url yourRpcUrlを使用することで、より信頼性の高い検証が可能になります。
--remote フラグはOtterSec
APIにビルドリクエストを送信し、プログラムのリモートビルドをトリガーします。ビルドが完了すると、システムはプログラムのオンチェーンハッシュがリポジトリから生成されたビルド成果物のハッシュと一致することを検証します。
デフォルトはOtterSec APIです。
検証データをオンチェーンにアップロードするかどうか尋ねられたら、必ず「はい」を選択してください。これはAPIがあなたが検証データをアップロードしたことを確認するために使用されます。
以下のコマンドを使用して、手動でリモートジョブをトリガーすることもできます:
solana-verify remote submit-job --program-id <program-id> --uploader <address>
アップローダーはPDAに書き込む権限を持つアドレスです。ほとんどの場合、これはプログラム権限であるべきです。プログラムがマルチシグによって制御されている場合は、このガイドの下部にある マルチシグ検証 セクションに進んでください。
これによりOtterSec APIにジョブが送信され、以下のコマンドでジョブのステータスを確認できます:
solana-verify remote get-job-status --job-id <job-id>
検証が正常に完了すると(時間がかかる場合があります)、 単一プログラム用OtterSec API、 Solana Explorer、 SolanaFM、 SolScan でプログラムが検証済みとして表示されます。また、最終的には 0xDeepによって維持されているコミュニティ運営のウェブサイト SolanaVerify.orgや OtterSec検証済みプログラムAPI、そして検証済みプログラムDuneダッシュボード にも表示され、より健全なSolanaエコシステムに貢献します。
Squadsのようなマルチシグによってプログラムが制御されている場合の検証方法
リモート検証を機能させるには、プログラム権限によって署名されたPDAに検証データを書き込む必要があります。プログラムがマルチシグによって制御されている場合は、このPDA書き込みトランザクションをエクスポートし、Squads Protocol またはお好みの他のマルチシグソリューションを通じて送信することができます。
1. 検証可能なプログラムをビルドする
まず、プログラムをビルドします:
solana-verify build
これにより、Cargo.lock
ファイルで指定されたSolanaバージョンを使用して、Dockerコンテナを使った検証可能なビルドが実行されます。
2. プログラムをデプロイする
solana config set --url "PayedMainnetRPCAddress" // the public endpoint will be rate limited too muchsolana program deploy target/deploy/verify_squads.so
このマルチシグガイドの残りの部分では、例としてプログラムID
6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD を使用します。
3. リポジトリに対してコミットして検証する
それが完了したら、プロジェクトをGitHubにコミットします。例えば: https://github.com/solana-developers/verify-squads
オプション:まずローカルで検証できるか確認してください(このコマンドは例としてプログラムID
6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD を使用しています):
solana-verify verify-from-repo https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD
パラメータが正しいことを確認するためです。
4. プログラム権限をマルチシグに転送する
まだプログラムの権限をマルチシグに転送していない場合は、マルチシグの権限をコピーしてください。次のステップで必要になります。
5. PDAトランザクションをエクスポートする
プログラム権限をローカルに持っている場合、solana-verify verify-from-repo
コマンドを使用すると、ビルドデータをオンチェーンにアップロードするよう促されます。
マルチシグを使用している場合はそれができないため、PDAトランザクションを手動でエクスポートし、Squadsを通じてトランザクションをトリガーする必要があります。
solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader <your program authority> --encoding base58 --compute-unit-price 0
これによりbase58形式のトランザクションが返されます。トランザクションインスペクターで使用するためにbase64エンコードされたトランザクションが必要な場合は、--encoding base64を使用できます。
P6vBfcPaaXb8fZoT3NBAYEcdtEj7tubA1k2gBxmFKZ3UWF5YyrmDMFTvLKALCJoUuRsPAjMckudYruCu3eeWQtuDrFbEMLxLFutnKXac974fnkMivcwUdY66VLjbxQT6ATmcy7F4hBtz1G4P1h6iBJLhb8WtrtgY3i4qq45MUEb7RjuMEfUFXKrNgPdGxkz5xvMHq3dxKRcpmEK5k2DkeW6SUQYBVe19Ga3B9GyhTX8k3CMt9JCEah13WyRnQd8GjoK6sTEvGJym6xDNvmd8yiJYSNcaYwEJsjHEUf4Yh6kAC7ki2KRvVAr3NVe1gjqK9McrwSQjtUatvydTG8Zovcr7PPUEMf3yPMgKXjZLB2QpkH63yTTYdNAnWFuv9E6b6nYRqye5XcNi436yKw5U14fXh65yK34bgYLi9328UT1huJELsJU9BRGnGUmb6GWp6c2WL5BhnzgNTSnt9TXFfEgUMzhvKzpVBxLP44hwqqBdyUhHFysCF37531PnmiESq8x1xou23xJ6FcQbc199754MkqQd7tX9CUznGzAEqHGkzn3VBoJnojsKtgYmiTYbdRsT1CU18MbYEE7WvGAvXyxxbpNzbAcc94HrnM6cqRGmwhEBroPfFghTdmzg9D
6. Squadsを通じてトランザクションを送信する
Squadsのトランザクションビルダーに移動し、base58エンコードされたトランザクションをインポートします。シミュレーションでは、トランザクションにosec検証プログラムとコンピュータバジェットプログラムへの呼び出しのみが含まれ、他には何も含まれていないことを確認してください!
7. リモート検証ジョブを送信する
Squadsへのトランザクションが成功したら、リモートジョブを送信できます:
solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD--uploader <your program authority>
これで完了です!公開リポジトリに対してプログラムを検証し、OtterSec APIにリモートジョブを送信しました。これでSolanaエクスプローラーや他の場所で反映されているのが確認できるはずです。
8. プログラムの更新(任意)
プログラムを更新する際は、新しいPDAトランザクションをエクスポートし、再度Squadsを通じて提出する必要があります。
プログラムの更新手順:
solana-verify buildsolana program write-buffer target/deploy/verify_squads.so --with-compute-unit-price 50000 --max-sign-attempts 50
その後、そのバッファ権限をマルチシグに転送するか、マルチシグの権限で直接バッファを作成します。
solana program set-buffer-authority Fu3k79g53ZozAj47uq1tXrFy4QbQYh7y745DDsxjtyLR --new-buffer-authority 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K
9. 新しいPDAトランザクションのエクスポートと提出
変更をGitHubにコミットすることを忘れないでください。PDAアップグレードトランザクションを再度エクスポートします:
solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K
トランザクションを再度Squadsを通じて提出します。
トランザクションの例はこちらで確認できます。
その後、リモートビルドを再度提出します:
solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K
以下のような結果が表示されるはずです:
Verification request sent with request id: b63339d2-163e-49ac-b55d-3454c1c2b5b3Verification in progress... ⏳ [00:18:02] ✅ Process completed. (Done in 18minutes) Program 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD has been verified.✅ The provided GitHub build matches the on-chain hash. On Chain Hash:96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 ExecutableHash: 96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Repo URL:https://github.com/Woody4618/verify-squads/tree/0fb0a2e30c15c51732c0ad5e837975a6f7bbc7edCheck the verification status at:https://verify.osec.io/status/6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD Joburl: https://verify.osec.io/job/b63339d2-163e-49ac-b55d-3454c1c2b5b3
おめでとうございます!マルチシグアップグレード後にプログラムを検証することができました!
Dockerイメージからの検証
以下のコマンドを実行することで、Dockerイメージに対してプログラムを検証することもできます:
solana-verify verify-from-image -eexamples/hello_world/target/deploy/hello_world.so -iellipsislabs/hello_world_verifiable_build:latest -p2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn
このコマンドはellipsislabs/hello_world_verifiable_build:latestに保存されているイメージを読み込み、コンテナ内の実行可能ファイルパスのハッシュがコマンドに提供されたオンチェーンプログラムのハッシュと同じであることを検証します。ビルドはすでにイメージにアップロードされているため、時間のかかる実行可能ファイルの完全な再ビルドは必要ありません。
イメージellipsislabs/hello_world_verifiable_build:latestを作成するDockerfileは、ellipsis
labsリポジトリの/examples/hello_worldにあります。
以下は予想される出力です:
Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network"https://api.mainnet.solana.com" against program ID2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container:"examples/hello_world/target/deploy/hello_world.so"Executable hash:08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Program hash:08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executablematches on-chain program data ✅
検証ビルドの例
このリポジトリのソースコードを使用して、ID
FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWvのサンプルプログラムを検証する例を以下に示します。
solana-verify verify-from-repo https://github.com/solana-developers/verified-program --url YOUR-RPC-URL --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --mount-path waffle --library-name waffle --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e
デフォルトでは、verify-from-repoコマンドはmainブランチの最新コミットを使用します。リポジトリでの作業を続けたい場合は、commit-hashパラメータを使用して特定のコミットを指定することもできます。--commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e
最後に、OtterSec APIに対して直接プログラムを検証することもできます:
solana-verify verify-from-repo https://github.com/solana-developers/verified-program --url YOUR-RPC-URL --remote --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --mount-path waffle --library-name waffle --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e
--remoteコマンドはOtterSec
APIにビルドリクエストを送信し、プログラムのリモートビルドをトリガーします。ビルドが完了すると、システムはプログラムのオンチェーンハッシュがリポジトリから生成されたビルド成果物のハッシュと一致することを検証します。
すでに検証済みの人気プログラム
Phoenix
solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1
最終出力:
Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9On-chain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9Program hash matches ✅
Squads V3
solana-verify verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf
Squadsリポジトリには複数のプログラムが含まれているため、
library-nameを指定する必要があることに注意してください。squads_mplは以前にAnchorで検証されていたため、--bpfフラグを使用します。
最終出力:
Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205cOn-chain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205cProgram hash matches ✅
Drift V2
solana-verify verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift
最終出力:
Executable Program Hash from repo: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828On-chain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828Program hash matches ✅
Marginfi V2
solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi -- --features mainnet-beta
最終出力:
Executable Program Hash from repo: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5On-chain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5Program hash matches ✅
よくある質問
検証が失敗します。どうすればよいですか?
以下の一般的な問題を確認してください:
- 署名者が間違っている:
solana program show YourProgramIdを実行して、署名者がプログラムのアップグレード権限者であることを確認してください - オンチェーンPDAが存在しない:
solana-verify verify-from-repo -umを実行し、プロンプトが表示されたらYESを選択してください。PDAをアップロードしないと、APIが検証メタデータを取得できません。 - PDAデータの不一致: プログラムを再デプロイした場合は、PDAを更新してください。PDAデータはデプロイされたプログラムと一致している必要があります。
- コミットハッシュが正しくない: デプロイ時に使用した正確なコミットハッシュを使用してPDAを作成してください
- ビルド環境の違い: PDAを作成する際は、solana-verifyでDockerを使用してください
ローカルビルドハッシュがオンチェーンハッシュと一致しません。なぜですか?
通常、以下のいずれかが原因です:
- 異なるRust/Solanaツールチェーンバージョンを使用している
- ビルド間で依存関係が更新された
- Dockerコンテナ内でビルドしなかった
- 間違ったコミットをチェックアウトした
デプロイ時に使用した正確なコミットを使用して、Docker内でsolana-verify buildを使ってビルドすることで修正できます。
検証にはどのくらい時間がかかりますか?
プログラムのサイズに応じて、以下の時間が予想されます:
- シンプルなプログラム: 1〜5分
- 複雑なプログラム: 5〜15分
- 非常に大規模なプログラム: 最大30分
ジョブステータスエンドポイントを使用して進捗状況を追跡してください。
プログラムがイミュータブル(アップグレード権限なし)です。どのように検証できますか?
プログラムにアップグレード権限がない場合、またはPDAを作成する前にイミュータブルにされた場合、この状況に対応するホワイトリスト登録されたアドレスがあります。contact@osec.ioまでご連絡いただければ、プログラムの検証をお手伝いいたします。
PDAとは何ですか?なぜ重要なのですか?
あなたのPDA(Program Derived Account)は、トラストレスな検証を可能にします:
- オンチェーンストレージ:検証メタデータ(リポジトリURL、コミットハッシュ、ビルドパラメータ)をOtter
Verifyプログラム(
verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC)が所有するPDA内にオンチェーンで保存します - 暗号学的リンク:PDAはプログラムアドレスから派生し、検証データへの不変のリンクを作成します
- 分散型トラスト:誰でもPDAを読み取り、プログラムを独立して検証できます
API使用前にPDAを作成する必要があるのはなぜですか?
APIがオンチェーンPDAでのみ機能する理由:
- トラストレス:APIは任意のデータを拒否し、アップグレード権限者がオンチェーンに保存したデータのみを使用します
- よりシンプル:署名者とprogram_idを提供するだけで、APIがPDAから残りのすべてを取得します
- 改ざん防止:PDAは誰でも独立して検証できる不変の記録を作成します
- 所有権の証明:署名者はアップグレード権限者である必要があり、プログラムを管理していることを暗号学的に証明します
プログラムをどのくらいの頻度で検証すべきですか?
以下の場合にプログラムを検証してください:
- デプロイまたはアップグレード後
- ソースリポジトリを更新した時
- それ以外の再検証は不要です - APIは24時間ごとにすべてのプログラムを自動的に再検証します
プログラムをアップグレードするとどうなりますか?
アップグレード後は以下の手順に従ってください:
- APIがアップグレードを検出し、プログラムの検証を解除します。
- 新しい検証メタデータでPDAを更新します:
solana-verify verify-from-repo -um \--program-id YourProgramId... \https://github.com/your-org/your-program
- アップグレード権限を使用して新しい検証リクエストを送信します
- APIは更新されたPDAに対して新しいバージョンを検証します
重要:アップグレードされたプログラムの新しいコミットハッシュを使用して、常にアップグレード権限でPDAを更新してください。
検証結果は信頼できますか?
はい - このシステムはトラストレスで独立して検証可能なように設計されています:
信頼できる理由:
- オンチェーンPDA: 検証メタデータはオンチェーンに保存され、中央機関による管理はありません
- アップグレード権限の証明: プログラムのアップグレード権限を持つ者のみがPDAを作成・更新できます
- 独立した検証: 誰でもPDAを読み取り、ローカルで
solana-verifyを実行することで検証できます - 継続的な再検証: APIは全プログラムを24時間ごとに自動的に再検証します
以下の制限を理解してください:
- 検証はソースがデプロイと一致することを確認するもので、コードが安全であることを保証するものではありません
- プログラムとやり取りする前に必ずコードをレビューしてください
- 検証済み ≠ 監査済み、または安全
- PDA内のリポジトリとコミットを確認し、信頼できるソースからのものであることを確認してください
プログラムを独立して検証するにはどうすればよいですか?
オンチェーンPDAを読み取り、ローカルで検証を実行することで、任意のプログラムを自分で検証できます:
ステップ1: オンチェーンPDAを読み取る
# Install solana-verify if you haven'tcargo install solana-verify# Get the PDA datasolana-verify list-program-pdas --program-id YourProgramId...
ステップ2: ローカルで検証する
# Verify using the repository and commit & other arguments from the PDAsolana-verify verify-from-repo \--program-id YourProgramId... \https://github.com/your-org/your-program--commit-hash <commit-hash>... (other arguments from the PDA)# Confirm the hash output matches the on-chain program hash
これにより以下が証明されます:
- PDAメタデータが本物である(オンチェーンに保存されている)
- PDAのリポジトリ内のソースコードがデプロイされたプログラムと一致する
- APIを信頼する必要はない - すべてをオンチェーンで自分で検証できる
許可なく他の誰かが私のプログラムを検証できますか?
はい、そのため署名者がアップグレード権限を持つことを要求しています。検証が有効とみなされるのは、署名者がアップグレード権限を持つ場合のみです。
検証可能なビルドを作成するには何が必要ですか?
以下のツールをインストールしてください:
- Docker(決定論的ビルド用)
- Cargo(Rustパッケージマネージャー)
- Solana Verify CLI:
cargo install solana-verify - ソースコードを含む公開Gitリポジトリ
プライベートリポジトリを検証できますか?
いいえ - 検証には公開されたソースコードが必要です:
- PDAには誰でもアクセスできる公開リポジトリのURLが保存されます
- トラストレスな検証は公開コードへのアクセスに依存します
- ユーザーはプログラムの動作を理解するためにソースコードを読む必要があります
- その目的は、ユーザーがソースとデプロイメントの一致を独立して検証できるようにすることです
プライベートリポジトリは検証システムの中核となる信頼モデルを破壊します。
Squads Multisigで管理されているプログラムを検証するにはどうすればよいですか?
マルチシグで管理されているプログラムの場合、次の手順に従ってください:
# 1. Build and deploy normallysolana-verify buildsolana program deploy <your-program.so> --program-id YourProgramId...# 2. Verify locally first - confirm the hash matchessolana-verify verify-from-repo -um \--program-id YourProgramId... \https://github.com/your-org/your-program# 3. Export the PDA creation transactionsolana-verify export-pda-tx \--program-id YourProgramId... \https://github.com/your-org/your-program# 4. Execute the PDA transaction through your Squads Multisig interface# 5. After multisig execution, trigger remote verificationsolana-verify remote submit-job \--program-id YourProgramId... \--uploader YourMultisigAddress...
重要:PDAトランザクションをエクスポートする前に、必ずローカルで検証(ステップ2)して、ビルドハッシュが一致することを確認してください。
まとめ
Solanaでの検証済みビルドを使用することで、ネットワーク上のプログラムの整合性と信頼性が確保され、開発者はSolana Explorerから直接SDKを見つけることができます。Solana Verify CLIやDockerなどのツールを活用することで、ソースコードと一致する検証可能で安全なビルドを維持できます。常に一貫した環境を使用するよう必要な予防措置を講じ、安全なアップグレードとデプロイメントのためのガバナンスソリューションを検討してください。
セキュリティ + 免責事項
検証済みビルドはSolanaプログラムの整合性を確保するための強力なツールですが、デフォルトのセットアップでは完全にトラストレスではありません。Dockerイメージはソラナ財団によってビルドおよびホストされています。
ダウンロードしたDockerイメージ内でプロジェクトをビルドしており、機密情報を含む可能性のあるセットアップ全体がビルドのためにそのDockerイメージにコピーされることに注意してください。
完全にトラストレスなセットアップを希望する場合は、Dockerイメージを自分でビルドし、自身のインフラストラクチャでホストすることができます。これにより、Dockerイメージが改ざんされていないことを確認できます。独自のDockerイメージを作成するためのスクリプトは検証済みビルドリポジトリにあり、フォークしてGitHub Actionsを自分で実行するか、それらが正しいことを検証することができます。
さらに、リモート検証では、OtterSec APIとSolana Explorerをある程度信頼する必要があります。
APIやSolana Explorerが侵害された場合、誤った情報が表示される可能性があります。
完全にトラストレスなセットアップを希望する場合は、Verify APIを自分で実行するか、プログラムのデプロイ権限とverifyプログラムから派生したPDAに保存されているオンチェーン検証データを使用して、verify-from-repoコマンドでプログラム検証をローカルで実行することができます。
verifyプログラムはOtterSecチームによってデプロイされており、まだフリーズされていないため、いつでもアップグレードすることができます。
Solana Foundation、OtterSec、Ellipsis Labsチームは、検証済みビルドパイプラインの使用により発生する可能性のある損失や損害について一切の責任を負いません。
SolanaプログラムのSecurity.txt
検証済みビルドに加えて、プログラムにsecurity.txtファイルを追加することもできます。将来的に実装されると、security.txtには検証PDAに保存されている検証データへの簡単なアクセスのための検証者公開鍵が保持されます。プログラムの構築と検証に必要なすべての情報を含むPDAは、プログラムのアドレスと検証者の公開鍵から派生します。デフォルトでは、これはプログラムを構築してデプロイしたのと同じ公開鍵ですが、security.txtで指定できる別の公開鍵にすることもできます。
security.txt機能により、開発者はSolanaスマートコントラクト内に連絡先とセキュリティ情報を直接埋め込むことができます。securitytxt.orgにインスパイアされたこのアプローチは、セキュリティ研究者がコントラクトのアドレスしか知らない場合でも、プロジェクトメンテナーに連絡するための標準化された方法を提供します。
security.txtを使用する理由
多くのプロジェクト、特に小規模またはプライベートなプロジェクトでは、コントラクトアドレスだけから開発者を特定することは困難で時間がかかります。プログラムにsecurity.txtファイルを組み込むことで、セキュリティ研究者が適切な担当者に簡単に連絡できるようになり、脆弱性の悪用を防ぎ、タイムリーなバグレポートを確実にすることができます。
security.txtの実装方法
Solanaプログラムにsecurity.txtを追加するには、以下の手順を実行してください:
Cargo.tomlにsolana-security-txt依存関係を追加します:
[dependencies]solana-security-txt = "1.1.1"
コントラクトでsecurity_txt!マクロを使用して、セキュリティ情報を定義します。連絡先の詳細、プロジェクトURL、さらにはセキュリティポリシーを含めることができます。以下は例です:
#[cfg(not(feature = "no-entrypoint"))]use {default_env::default_env, solana_security_txt::security_txt};#[cfg(not(feature = "no-entrypoint"))]security_txt! {name: "MyProject",project_url: "https://myproject.com",contacts: "email:security@myproject.com,discord:security#1234",policy: "https://myproject.com/security-policy",// Optional Fieldspreferred_languages: "en,de",source_code: "https://github.com/solana-developers/solana-game-preset",source_revision: "5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",source_release: "",encryption: "",auditors: "Verifier pubkey: 5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",acknowledgements: "Thank you to our bug bounty hunters!"}
security.txt情報がプログラムに組み込まれると、Solana
Explorerなどのツールを使用して簡単にクエリできるようになり、潜在的な問題を報告しようとする人々に連絡先やセキュリティの詳細が提供されます。
ベストプラクティス
-
リンクの使用: 変更される可能性が高い情報(例:連絡先の詳細)については、コントラクトにハードコーディングするのではなく、Webページへのリンクを使用することをお勧めします。これにより、頻繁なプログラムのアップグレードが不要になります。
-
検証: デプロイする前に、
query-security-txtツールを使用してフォーマットと内容を検証してください。このツールは、オンチェーンプログラムとローカルバイナリの両方を検証できます:
query-security-txt target/bpfel-unknown-unknown/release/my_contract.so
セキュリティ連絡先情報をコントラクトに直接組み込むことで、研究者があなたに連絡しやすくなり、Solanaエコシステム内でより良いセキュリティとコミュニケーションが促進されます。
これは Solana Explorerでのsecurity.txtの表示例です
security.txtプロジェクトは
Neodyme Labsによって管理されています
検証ステータスの確認と検証済みプログラムの閲覧は verify.osec.ioで行えます。
Is this page helpful?