🔗 スマートコントラクトの設計とインターフェース定義
このレッスンでは、ゼロ知識証明を使ってNFTをミントするスマートコントラクトZKNFT.sol
の全体像を設計し、証明を検証するための「窓口」となるインタフ ェースを定義します。
🏛️ スマートコントラクトのアーキテクチャ
このプロジェクトのバックエンドは、2つの主要なスマートコントラクトが連携して動作します。役割分担が重要です。
-
PasswordHashVerifier.sol
(検証者コントラクト) 🕵️♂️:-
これは、前のセクションで
circom
とsnarkjs
を使って自動生成されたコントラクトです。
私たちはこの中身を直接編集しません。 -
役割はただ一つ、「提出されたゼロ知識証明が正しいかどうか」を厳格に検証することです。
verifyProof
という関数を持っており、これに証明データを渡すと、有効であればtrue
を、無効であればfalse
を返します。まさに門番のような存在です。
-
-
ZKNFT.sol
(NFTコントラクト) 🖼️:-
こちらが私たちがメインで開発するコントラクトです。
-
OpenZeppelinの
ERC721
標準を継承しており、NFTとしての基本的な機能(所有権の管理、転送など)を備えています。 -
NFTをミントするための特別な
safeMint
関数を実装します。この関数の内部で、門番である
PasswordHashVerifier.sol
に「この証明は本物ですか?」と問い合わせます。証明が有効な場合にのみ、NFTのミントが実行される仕組みです。
-
このように役割を分離することで、検証ロジックとアプリケーションロジックが明確に分かれ、コードが整理されて読みやすく、メンテナンスしやすい状態になります。
✍️ 検証コントラクトのインタフェースを定義する
ZKNFT.sol
がPasswordHashVerifier.sol
のverifyProof
関数を呼び出すためには、その関数の仕様(どのような引数を受け取り、何を返すか)を定義した 「インタフェース」 が必要です。インタフェースは、異なるコントラクト同士が安全に通信するための「共通言語」や「取り決め」のようなものです。
まず、pkgs/backend/contracts/interface
ディレクトリを作成しましょう。
mkdir -p pkgs/backend/contracts/interface
次に、pkgs/backend/contracts/interface/IPasswordHashVerifier.sol