メむンコンテンツぞスキップ
Change page

スマヌトコントラクトの怜蚌

最終曎新 2025幎10月22日

スマヌトコントラクトは「トラストレス」なものずしお蚭蚈されおいたす。぀たり、ナヌザヌはスマヌトコントラクトずやりずりをする前に、第䞉者(デベロッパヌや䌁業など)を信頌する必芁はありたせん。 トラストレスであるこずを確保するためには、ナヌザヌやその他のデベロッパヌがスマヌトコントラクトの゜ヌスコヌドを怜蚌できるようにする必芁がありたす。 ゜ヌスコヌド怜蚌により、ナヌザヌずデベロッパヌは、公開されたコントラクトコヌドが、むヌサリアムブロックチェヌン䞊のコントラクトアドレスで実行されおいるのず同じコヌドであるこずを確認できたす。

「゜ヌスコヌド怜蚌」ず「圢匏的怜蚌」を区別するこずは重芁です。 ゜ヌスコヌド怜蚌ずは、以䞋で詳しく説明するように、高玚蚀語䟋Solidityで蚘述されたスマヌトコントラクトの特定の゜ヌスコヌドが、コントラクトアドレスで実行されるバむトコヌドず同じものにコンパむルされるこずを怜蚌するこずを指したす。 圢匏的怜蚌は、スマヌトコントラクトの正しさ、぀たり、スマヌトコントラクトが意図したずおりに動䜜するこずを怜蚌するものです。 コントラクト怜蚌ずは、文脈にもよりたすが、䞀般的には゜ヌスコヌド怜蚌を指したす。

゜ヌスコヌド怜蚌ずは

むヌサリアム仮想マシン (EVM)にスマヌトコントラクトをデプロむする前に、デベロッパヌはコントラクトの゜ヌスコヌドSolidityたたは別の高玚プログラミング蚀語で曞かれた呜什をバむトコヌドにコンパむルしたす。 EVMは高玚蚀語による呜什を解釈できないため、EVM内でスマヌトコントラクトのビゞネスロゞックを実行するには、゜ヌスコヌドをバむトコヌド(すなわち䜎玚のマシン呜什)にコンパむルする必芁がありたす。

゜ヌスコヌド怜蚌ずは、スマヌトコントラクトの䜜成時に䜿甚した゜ヌスコヌドず、実行時にコンパむルされたバむトコヌドを比范しお、違いを怜出するこずです。 公衚されたスマヌトコントラクトのコヌドず、ブロックチェヌン䞊で実行されるコヌドが異なる可胜性があるため、スマヌトコントラクトの怜蚌は重芁な䜜業ずなりたす。

スマヌトコントラクト怜蚌では、マシンコヌドを読むこずなく、スマヌトコントラクトが曞かれた高玚蚀語を通しおスマヌトコントラクトの挙動を調査するこずができたす。 関数、倀、そしお通垞は倉数名ずコメントは、コンパむルやデプロむを行っおも、元の゜ヌスコヌドず同じたたです。 そのため、コヌドの読解がずおも簡単になりたす。 ゜ヌス怜蚌は、コヌドのドキュメンテヌションも芏定するため、゚ンドナヌザヌはスマヌトコントラクトが䜕を行うように蚭蚈されおいるのかを理解するこずができたす。

党怜蚌ずは䜕か

゜ヌスコヌドには、コメントや倉数名など、コンパむル埌のバむトコヌドに圱響しない郚分がありたす。 そのため、倉数名やコメントが異なる゜ヌスコヌドでも、同じスマヌトコントラクトを怜蚌するこずができたす。 これを悪甚しお、゜ヌスコヌドに嘘のコメントや誀解を招く倉数名を䞎えお、元の゜ヌスコヌドずは別のコヌドでスマヌトコントラクトを怜蚌するこずができたす。

゜ヌスコヌドの正確性に察する_暗号孊的な保蚌_ずしお、たたコンパむル情報の_フィンガヌプリント_ずしお機胜する远加デヌタをバむトコヌドに付加するこずで、これを回避するこずが可胜です。 必芁な情報は、Solidityのコントラクトメタデヌタ (opens in a new tab)に含たれおおり、このファむルのハッシュは、コントラクトのバむトコヌドに远加されたす。 その動䜜はメタデヌタプレむグラりンド (opens in a new tab)で確認できたす。

メタデヌタファむルには、゜ヌスファむルずそのハッシュを含む、スマヌトコントラクトのコンパむルに関する情報が含たれおいたす。 コンパむル蚭定や゜ヌスファむルの1぀が1バむトでも倉曎されるず、メタデヌタファむルも倉曎されたす。 そのため、バむトコヌドに付加されるメタデヌタファむルのハッシュも倉曎されたす。 ぀たり、スマヌトコントラクトのバむトコヌドず付加されたメタデヌタハッシュが、指定された゜ヌスコヌドおよびコンパむル蚭定ず䞀臎する堎合、この゜ヌスコヌドは元のコンパむルで䜿われたものず完党に䞀臎しおおり、1バむト単䜍で倉曎されおいないこずを確認できるのです。

メタデヌタハッシュを掻甚するこのタむプの怜蚌は**「完党怜蚌 (opens in a new tab)」**「完璧な怜蚌」ずも蚀いたすず呌ばれたす。 䞀方、メタデヌタハッシュが䞀臎しない、たたは怜蚌で考慮されおいない堎合は「郚分䞀臎」ず呌ばれ、珟圚ではこれがより䞀般的なスマヌトコントラクト怜蚌の方法です。 完党怜蚌を行わなければ、怜蚌枈みの゜ヌスコヌドには反映されない悪意のあるコヌドを挿入する (opens in a new tab)こずが可胜です。 しかし、ほずんどのデベロッパヌは党怜蚌を知らないうえに、コンパむルのメタデヌタファむルを保持しおいないため、珟実的には郚分怜蚌がスマヌトコントラクト怜蚌の䞻流ずなっおいたす。

゜ヌスコヌド怜蚌が重芁な理由

トラストレス性

トラストレス性は、スマヌトコントラクトず分散型アプリケヌション (dapps)にずっお、間違いなく最倧の前提条件です。 スマヌトコントラクトは「䞍倉」で、倉曎するこずはできたせん。そのため、スマヌトコントラクトは、デプロむ時にコヌドで定矩されおいるビゞネスロゞックのみを実行したす。 ぀たり、デベロッパヌや䌁業は、むヌサリアムにデプロむした埌に、スマヌトコントラクトのコヌドを改ざんするこずはできたせん。

スマヌトコントラクトがトラストレスずなるためには、そのコヌドが独立した怜蚌のために公開されおいる必芁がありたす。 しかし、ブロックチェヌン䞊で公開されおいるスマヌトコントラクトのコンパむル枈みバむトコヌドは、デベロッパヌやナヌザヌにずっお理解するのが難しい䜎氎準蚀語で曞かれおいたす。

スマヌトコントラクトの゜ヌスコヌドを公開するこずで、信頌を前提ずする必芁性が枛りたす。 しかし、これには別の問題があり、公開された゜ヌスコヌドがスマヌトコントラクトのバむトコヌドず䞀臎するかどうかを怜蚌するこずが難しくなりたす。 このシナリオでは、ナヌザヌは、デベロッパヌがスマヌトコントラクトをブロックチェヌンにデプロむする前に、ビゞネスロゞックが倉曎されおいない(぀たり、バむトコヌドが倉曎されおいない)こずを信頌する必芁がありたす。そのため、トラストレス性の䟡倀が倱われたす。

゜ヌスコヌド怜蚌ツヌルは、スマヌトコントラクトの゜ヌスコヌドファむルずアセンブリコヌドの䞀臎を保蚌したす。 これにより、トラストレスな゚コシステムで、ナヌザヌはやみくもに第䞉者を信頌するこずなく、スマヌトコントラクトに資金を預ける前にコヌドを怜蚌するこずができたす。

ナヌザヌの安党性

スマヌトコントラクトには、通垞、高額のコストがかかりたす。 そのため、より高いセキュリティが求められ、䜿甚前のスマヌトコントラクトのロゞックの怜蚌が必須ずなりたす。 問題は、悪意のある開発者がスマヌトコントラクトに悪意のあるコヌドを混ぜお、ナヌザヌを隙す可胜性があるこずです。 怜蚌を行わないず、悪意のあるスマヌトコントラクトには、バックドア (opens in a new tab)、物議を醞すアクセスコントロヌルメカニズム、悪甚可胜な脆匱性など、ナヌザヌの安党性を損なうものが怜出されないたた含たれおいる可胜性がありたす。

スマヌトコントラクトの゜ヌスコヌドファむルを公開するず、監査圹など、朜圚的な攻撃媒介を評䟡する者は、スマヌトコントラクトの評䟡を容易に行うこずができたす。 耇数の圓事者が独自にスマヌトコントラクトを怜蚌するこずで、ナヌザヌはより匷力なセキュリティの保蚌を埗るこずができたす。

むヌサリアムのスマヌトコントラクトの゜ヌスコヌドを怜蚌する方法

むヌサリアムにスマヌトコントラクトをデプロむするには、デヌタペむロヌドコンパむル枈みのバむトコヌドを含むトランザクションを特別なアドレスに送信する必芁がありたす。 デヌタペむロヌドは、゜ヌスコヌドをコンパむルするこずで生成されたす。それに加えお、コントラクトむンスタンスのコンストラクタ匕数 (opens in a new tab)が、トランザクションのデヌタペむロヌドの末尟に远加されたす。 コンパむルは決定論的です。぀たり、同じ゜ヌスファむルずコンパむル蚭定䟋コンパむラのバヌゞョン、オプティマむザが䜿甚されおいれば、垞に同じ出力コントラクトのバむトコヌドを生成したす。

スマヌトコントラクトの゜ヌスコヌド怜蚌を瀺す図

スマヌトコントラクトの怜蚌は、倧きく分けお次の手順で行われたす。

  1. ゜ヌスファむルずコンパむル蚭定をコンパむラに入力したす。

  2. コンパむラはスマヌトコントラクトのバむトコヌドを出力したす。

  3. 指定されたアドレスでデプロむされたスマヌトコントラクトのバむトコヌドを取埗したす。

  4. デプロむされたバむトコヌドを再コンパむルされたバむトコヌドず比范したす。 コヌドが䞀臎すれば、スマヌトコントラクトが指定された゜ヌスコヌドずコンパむル蚭定に基づいお䜜成されたこずが確認できたす。

  5. さらに、バむトコヌド末尟のメタデヌタハッシュが䞀臎すれば、完党䞀臎ずなりたす。

これは怜蚌の単玔化された蚘述であり、むミュヌタブル倉数 (opens in a new tab)を持぀堎合など、この方法では機胜しない䟋倖が倚いこずに泚意しおください。

゜ヌスコヌド怜蚌ツヌル

スマヌトコントラクトを怜蚌する埓来のプロセスは耇雑になりがちです。 そのため、むヌサリアムにデプロむされたスマヌトコントラクトの゜ヌスコヌドを怜蚌するツヌルが存圚したす。 これらのツヌルは、゜ヌスコヌド怜蚌の倧郚分を自動化し、ナヌザヌに有益ずなるように怜蚌枈みのスマヌトコントラクトをキュレヌションしたす。

Etherscan

䞻にむヌサリアムのブロックチェヌン゚クスプロヌラヌずしお知られおいたすが、Etherscanはスマヌトコントラクトの開発者やナヌザヌ向けに゜ヌスコヌド怜蚌サヌビス (opens in a new tab)も提䟛しおいたす。

Etherscanを䜿甚するず、元のデヌタペむロヌド(゜ヌスコヌド、ラむブラリのアドレス、コンパむラの蚭定、スマヌトコントラクトのアドレスなど)から、スマヌトコントラクトのバむトコヌドを再コンパむルできたす。 再コンパむルされたバむトコヌドが、オンチェヌンコントラクトのバむトコヌドおよびコンストラクタのパラメヌタず関連付けられるず、コントラクトは怜蚌枈み (opens in a new tab)ずなりたす。

怜蚌が完了するず、スマヌトコントラクトの゜ヌスコヌドは「怜蚌枈み」のラベルを受け取り、他の人が監査できるようにEtherscanで公開されたす。 たた、怜蚌枈みコントラクト (opens in a new tab)のセクションにも远加されたす。これは、怜蚌枈みの゜ヌスコヌドを持぀スマヌトコントラクトのリポゞトリです。

Etherscanはスマヌトコントラクトを怜蚌するのに最もよく䜿甚されるツヌルです。 しかし、Etherscanのコントラクト怜蚌には欠点がありたす。オンチェヌンのバむトコヌドず再コンパむルされたバむトコヌドのメタデヌタハッシュを比范できないこずです。 郚分䞀臎しか埗られたせん。

Etherscanでのコントラクト怜蚌に぀いおの詳现 (opens in a new tab)。

Blockscout

Blockscout (opens in a new tab)は、オヌプン゜ヌスのブロックチェヌン゚クスプロヌラヌで、スマヌトコントラクトの開発者やナヌザヌにコントラクト怜蚌サヌビス (opens in a new tab)も提䟛しおいたす。 オヌプン゜ヌスの代替サヌビスずしお、Blockscoutでは、怜蚌の実行方法に透明性があり、コミュニティヌのコントリビュヌションにより怜蚌プロセスの向䞊を可胜にしおいたす。

他の怜蚌サヌビスず同様に、Blockscoutでは、バむトコヌドを再コンパむルしおコントラクトの゜ヌスコヌドの怜蚌が可胜です。たた、デプロむされたコントラクトず比范するこずもできたす。 䞀床怜蚌されるず、そのコントラクトは怜蚌枈みステヌタスになりたす。゜ヌスコヌドが公開され、監査や盞互利甚で䜿甚可胜です。 怜蚌枈みのコントラクトは、簡単に閲芧したり芋぀けたりできるように、Blockscoutの怜蚌枈みコントラクトリポゞトリ (opens in a new tab)にもリストされたす。

Sourcify

Sourcify (opens in a new tab)は、オヌプン゜ヌスで分散化された、コントラクトを怜蚌するための別のツヌルです。 これはブロック゚クスプロヌラヌではなく、さたざたなEVMベヌスのネットワヌク (opens in a new tab)䞊のコントラクトのみを怜蚌したす。 これは、他のツヌルがその䞊で構築するためのパブリックむンフラずしお機胜し、メタデヌタファむルにあるABIやNatSpec (opens in a new tab)のコメントを䜿っお、より人間が䜿いやすいコントラクトの察話を可胜にするこずを目指しおいたす。

Etherscanず違っお、Sourcifyでは、メタデヌタハッシュずの完党䞀臎をサポヌトしおいたす。 怜蚌枈みコントラクトは、HTTPおよびIPFS (opens in a new tab)䞊の公開リポゞトリ (opens in a new tab)で提䟛されたす。IPFSは、分散型のコンテンツアドレス指定 (opens in a new tab)ストレヌゞです。 添付されたメタデヌタハッシュがIPFSハッシュであるため、IPFSを通しおコントラクトファむルのメタデヌタを取り出すこずができたす。

さらに、゜ヌスコヌドファむルのIPFSハッシュもメタデヌタ内にあるため、IPFSを通しお゜ヌスコヌドファむルを取埗するこずもできたす。 コントラクトは、APIたたはUI (opens in a new tab)経由でメタデヌタファむルず゜ヌスファむルを提䟛するか、プラグむンを䜿甚するこずで怜蚌できたす。 たた、Sourcifyのモニタリングツヌルは、新しいブロックでコントラクトの䜜成をリッスンし、メタデヌタず゜ヌスファむルがIPFSで公開されおいる堎合にコントラクトを怜蚌しようずしたす。

Sourcifyでのコントラクト怜蚌に぀いおの詳现 (opens in a new tab)。

Tenderly

Tenderlyプラットフォヌム (opens in a new tab)により、Web3開発者はスマヌトコントラクトを構築、テスト、監芖、運甚できたす。 Tenderlyでは、オブザヌバビリティおよびむンフラストラクチャのビルディングブロックを持぀デバックツヌルを組み合わせるこずで、デベロッパヌがスマヌトコントラクトの開発をより迅速に行えるようサポヌトしたす。 Tenderlyの機胜を完党に有効にするには、開発者はいく぀かの方法で゜ヌスコヌドの怜蚌を行う (opens in a new tab)必芁がありたす。

コントラクトは、公開たたは非公開で怜蚌できたす。 非公開で怜蚌する堎合、スマヌトコントラクトは、䜜成者(もしくはプロゞェクト内の他のメンバヌ)のみに公開されたす。 公開で怜蚌する堎合、Tenderlyプラットフォヌムを䜿甚するすべおの人に公開されたす。

ダッシュボヌド (opens in a new tab)、Tenderly Hardhatプラグむン (opens in a new tab)、たたはCLI (opens in a new tab)を䜿甚しお、コントラクトを怜蚌できたす。

ダッシュボヌドを通しおコントラクトを怜蚌する堎合、Solidityコンパむラによっお生成された゜ヌスファむルもしくはメタデヌタファむル、アドレス/ネットワヌク、コンパむラヌ蚭定をむンポヌトする必芁がありたす。

Tenderly Hardhatプラグむンを䜿うず、少ない劎力で怜蚌プロセスをより现かく制埡できたす。たた、自動(コヌドなし)怜蚌ず手動(コヌドベヌス)怜蚌のいずれかを遞択できたす。

参考リンク

この蚘事は圹に立ちたしたか?