スマートコントラクトの検証(Verify)とは?
2025/07/21 公開
はじめに
個人開発を進める中で、GitHub CopilotにタスクをIssueに起こした際、デプロイ後にVerify: npx hardhat verify --network sepolia <address> <constructorArgs> (自動化推奨)
というタスクが挙がりました。
デプロイは終わったのになぜVerifyが必要なんだ?と首を傾げました。
調べてみると検証はスマートコントラクトを扱うユーザーに透明性を与えているために重要だということを知りました。
本記事では、**スマートコントラクトの検証(Verify)**についてまとめてみます。
Etherscanとは?
検証の前に説明しておかないといけないサービスがあるのでこちらを先に説明します。
Etherscanはイーサリアム系ブロックチェーンの代表的なブロックエクスプローラーであり、トランザクション履歴やアドレス残高、コントラクトのバイトコードなどをでWeb上で閲覧できるサービスです。
特に開発者向けには API が公開されており、スマートコントラクト検証(Verify)、イベントログ取得、ガス使用量分析など多様な機能が提供されています。
ユーザーが「0x…」形式のアドレスを入力するだけで、送金状況やトークン保有状況、コントラクトとのインタラクションを即座に確認できるため、イーサリアムエコシステムにおける事実上の標準ツールとなっています。
※Sourcifyについて
同じ「コード検証」を行うツールとしてSourcifyがあります。Etherscanが企業運営の集中型サービスなのに対し、Sourcify は IPFS/Ethereum上にメタデータを保存する分散型リポジトリを志向しています。用途やポリシーに応じて使い分けが可能です。
検証(verify)とは?
Etherscanのようなエクスプローラーでは、アドレスに紐付くバイトコードだけでは内部ロジックを読み解くことができません。
検証を行うことで、公開済みのSolidityソースコードをコンパイルした結果がそのバイトコードと完全に一致することを第三者が確かめられるようになります。
Hardhatであれば @nomicfoundation/hardhat‑verify
プラグインが用意されており、コンパイラ設定やライブラリリンク情報を自動で Etherscan API に送信してくれます。
検証によって得られる利益
基本的な機能向上: 検証が完了すると、エクスプローラー上にソースが表示されるだけでなく、ABIが自動配布され、「Read / Write」タブが有効になるためユーザーや各種ツールが簡単にコントラクトと対話できるようになります。
セキュリティの向上: ユーザーがコントラクトの実際の動作を事前に確認できるため、悪意のあるコードやバックドア、予期しない動作の発見が可能になります。これにより、資金を預ける前にコントラクトの安全性を自分で判断できます。
信頼性と透明性の確保: 第三者による監査やコードレビューが容易になり、プロジェクトの透明性が向上します。
開発者体験の改善: デバッグやトランザクション失敗時の原因特定が容易になります。エラーメッセージがより具体的になり、問題の特定と修正が迅速に行えます。また、他の開発者がコントラクトを理解しやすくなるため、統合やフォークが促進されます。
コミュニティによる検証: オープンソースのソースコードにより、コミュニティ全体でコントラクトの動作を検証できるようになります。
Hardhatでの検証手順
まず開発環境に @nomicfoundation/hardhat-verify
を追加します。
npm i -D @nomicfoundation/hardhat-verify
次に hardhat.config.ts
へ EtherscanのAPI キーを設定します。
Keyの取得方法ですが、
Etherscanにログイン→API Dashboardに遷移→
下側にあるAPI KeysのところのAddボタンを押下し、App Nameを追加すればAPI Keyが取得できます。
import { HardhatUserConfig } from 'hardhat/config'; import '@nomicfoundation/hardhat-toolbox'; import '@nomicfoundation/hardhat-verify'; import * as dotenv from 'dotenv'; dotenv.config(); const config: HardhatUserConfig = { solidity: { version: '0.8.28', settings: { optimizer: { enabled: true, runs: 200 }, }, }, etherscan: { apiKey: { sepolia: process.env.ETHERSCAN_API_KEY || '', }, }, // Sourcify を併用して分散型検証も行う場合のみ必要 sourcify: { enabled: true, } }; export default config;
コントラクトをデプロイしたら、以下のコマンドで検証を実行します。
ContractAddress
は、デプロイ済みのスマートコントラクトがブロックチェーン上に存在するアドレスで、”Arg1”や”Arg2”はコントラクトのコンストラクタに渡した引数です。引数がない場合は省略して問題ないです。
npx hardhat verify --network sepolia <ContractAddress> "Arg1" "Arg2"
数十秒ほどで Etherscan上に「✅ Verified」バッジが付き、ソースコードや ABI が公開されます。
https://sepolia.etherscan.io/address/0xfdC8c21FaaBBD69a6bB6a392596a91efB8B773EE#code
よくあるつまずきと対処法
バイトコード不一致
viaIR
の有無、optimizer runs
値がローカルと違うと検証失敗- 対処: 設定を合わせて再ビルド・再実行
コンストラクタ引数ミス
- 順番・型・配列長が違うとエラー
- 対処: デプロイログを確認し、正しい引数をそのまま渡す
その他のエラーは公式ドキュメントの https://docs.etherscan.io/contract-verification/common-verification-errors が網羅的です。
まとめ
スマートコントラクトの検証について自分なりにまとめてみました。Web2アプリケーションとは異なり、常に人にみられる可能性があるんだということを自覚し、安心して使われるコントラクトを書いていこうと思います。
ただ、毎回コマンド打って手動で検証するのはきついので、GitHub Actionsなどを使って検証を自動化するやり方は別の記事で紹介します。
ここまで読んでいただき、ありがとうございました。