コントラクトの検証状況を確認する
- 執筆
- CRYPTO PORT 編集部
- 公開日
- 更新日
- 読了目安
- 6 分
結論
ブロックエクスプローラーには、そのコントラクトのソースコードが公開され、実際に動いているバイト列と一致すると確認されているかどうかが表示されます。未検証なら、中身が何をするかを外部から読む手段がありません。ただし検証済みという表示は「読める」ことを示すだけで、書かれている内容が利用者に不利でないことは意味しません。
要点
- 検証済みとは「公開ソースとデプロイ済みバイトコードが一致する」という意味だけ
- 未検証のコントラクトは、外部から挙動を読む手段がない状態だと考える
- 検証済みでも、権限設定・アップグレード可能性・停止機能は別途読む必要がある
- 読めない項目があるなら、確認できなかったという事実をそのまま結論にする
定義
デプロイ済みのコントラクトについて、公開されたソースコードをコンパイルした結果がチェーン上のバイトコードと一致するとエクスプローラー側で確認されている状態のこと。
順序としては、まずチェーンとアドレスを確定させることから始めます。コントラクトはチェーンごとに別物で、同じ文字列のアドレスが別のチェーンに存在することもあります。プロジェクトの公式ドキュメントからアドレスを取得し、そのチェーンのブロックエクスプローラーで検索してください。アドレスの出どころが第三者のSNS投稿しかないなら、その時点で確認は成立していません。
次に、コントラクトのページでソースコードの区画を見ます。検証済みであれば、コンパイラのバージョン、最適化の設定、そしてソースコード本体が読める形で置かれています。未検証であれば、そこにはバイト列が並ぶだけです。ここで分かるのは「読めるか、読めないか」であって、安全か危険かではありません。未検証は危険の証明ではありませんが、確認の手段が閉じているという意味では十分に重い事実です。
検証済みだった場合に続けて見るのは、権限に関わる部分です。所有者だけが呼べる関数があるか、発行量を後から増やせるか、送金を止められるか、手数料の率を変更できるか。これらはコード中の修飾子や関数名から読み取ることになり、ある程度の技術的な理解が必要です。エクスプローラーによっては、読み取り専用の関数を呼んで現在の設定値を確認できる区画が用意されています。
さらに、そのアドレスがプロキシ(実装を後から差し替えられる構造)かどうかも確認対象です。プロキシの場合、読んでいるコードが現在の実装とは限りません。エクスプローラーがプロキシとして認識していれば、実装側のアドレスへの導線が示されることがあります。差し替え可能ということは、今日確認した内容が明日も同じである保証はない、という意味になります。
最後に、この確認で分からないことを整理しておきます。コードが読めても、想定外の組み合わせで起きる脆弱性は読み取れません。外部のオラクルや他のコントラクトに依存している部分の安全性も分かりません。運営者が鍵をどう管理しているかは、そもそもチェーン上に書かれていません。検証状況の確認は、判断材料を一つ増やす作業であって、結論を出す作業ではありません。
注意点
- · 検証済みという表示を「監査済み」「安全」と読み替えないでください。別の話です
- · プロキシ構造では、実装が後から差し替えられます。一度の確認は永続しません
- · 確認のためにウォレットを接続する必要はありません。閲覧だけで接続を求めるサイトは疑ってください
よくある質問
未検証のコントラクトは必ず詐欺ですか?
いいえ。公開の手続きを踏んでいないだけの場合もあります。ただし利用者の側から見れば、中身を確認する手段がないという点は変わりません。読めないものに資金を預ける判断は、その前提を理解したうえで行ってください。