blog

DeNAのエンジニアが考えていることや、担当しているサービスについて情報発信しています

2024.01.11 その他

NFTリテラシー検定の裏側の話

by ten3

#nft #web3 #zkp #crypto #blockchain #metatx #ethereum #polygon #ten3

みなさま初めまして!だったり、知っている人もいるかもしれませんが初めまして!
DeNAのデジタルエンタテインメント事業部でWeb3担当しているten3でーす!
本日は自分が開発担当していた NFTリテラシー検定 リリースということでエンジニアブログ書かせていただくことになりました!

NFTリテラシー検定のサイトバナー

NFTリテラシー検定ってなんなんじゃい!

みなさん!NFTってご存じですか?
ご存知の方、そうでない方いらっしゃると思います。

NFTと聴いてどんなことを想像されますでしょう?
名前くらい聞いたことがある方だと、デジタルアートだとか、デジタルアートの売買だとかを想像されるかもしれません。
また、Blockchainに詳しい方であれば、Blockchainの改竄に強い特徴と持続性を利用したデジタル証書を想像されるかもしれません。
そして、NFT取引に絡む投機性だったり、詐欺などの犯罪について想像される方もいらっしゃるかもしれません。

そんな環境の中、NFTリテラシー検定はユーザーにNFTを安全に利用いただけるように必要最低限の知識をつけていただくことができるe-learningサイトです。

  • NFTとは何か?
  • 詐欺とか怖い話も聞くし、興味はあるけど手が出せない!
  • ちょっと怪しいcontractに署名してしまったどうしよう!

こんな状況に対して、知ってて役に立つ知識を問題集とテキストを通して学習して、全て答えると合格証として他人に譲渡不可能なNFTを発行することができます。

合格証はさながら、素敵な券面のライセンスカードみたいなイメージですね!
サービスの詳しいことやNFT自体に興味が沸いた!という方は是非 NFTリテラシー検定 にアクセスしてみてください!
合格証のサンプルイメージ

ここから本題!

っと、NFTリテラシー検定の宣伝はこのくらいにしておいて、ten3はエンジニアblogを書きに来たので技術的なお話をそろそろしていこうかと思います。
NFTリテラシー検定は、宣伝の項目でも書いた通りNFTを利用した合格証をご自身でmint(発行)することがユーザー視点でのサービス上のゴールです。

Smart Contract

Ethereum上ではSmartContractと呼ばれるプログラムをblockchain上にデプロイすることができます。
blockchainは多くのnodeによって管理された台帳システムではありますが、この台帳システム上にプログラムをデプロイして全員でContract(契約)を履行することによって多くのアカウントの状態を書き換え保存しています。
NFTもSmartContractの1種で特定のアカウントと何かの所有権の結びつけを行うプログラムです。

NFTリテラシー検定では合格証の所持状態の管理や、ユーザーが問題集を終了させたことをもとに合格証を発行するか?を判定する為の処理などにSmartContractを利用しています。

NFTリテラシー検定とZKP

NFT自体はEthereumというpublic blockchain上のプログラムとしてデプロイされており、このプログラムにmintのtransactionを送信することで最終的にNFTが発行され、所有者としてユーザーのaccountが結び付けられます。

しかし、public chain上にデプロイされたプログラムにユーザー自身が発行依頼を行うということは何も考えずに作成した場合、NFTリテラシー検定の問題集を完了せずに発行を行うことができてしまいます。

では、NFTコントラクト自体に回答結果を送信してチェックすれば合格した人だけがmintできるか?
これもpublic chain上にNFTコントラクトがdeployされているため、etherscanなどで過去にNFTコントラクトに対してのtransaction履歴を遡って内容を調べればカンニングができてしまうという状況です。

そこで、zkp(Zero Knowledge Proof)を利用して、回答内容を含まずに問題を解いたことの証明を作成してチェックを行っています。
(あれ?この話どこかで聞いたぞ?という方は、きっとDeNA Techcon 2023で ZKPオンチェーン検証を活用したNFT検定サービスの取り組み をご覧になった方ですね)

もうちょっと突っ込んだZKPの話

NFTリテラシー検定で利用しているZKPはzk-SNARKsという証明構文を利用しています。
具体的には snarkjs というライブラリと circom という回路コンパイラを利用してzk-SNARKsの証明と検証装置を作成しています。

ユーザーがDeNAの作成した問題を回答して、全ての回答結果を元にsnarkjsで作成した証明書として取得したのちに、ethereum上にある回答受付コントラクトに対して証明書を送ることで、zkp検証コントラクトが証明の内容を検証し全ての問題集をクリアしたことが検証されたのちにNFTがmintされるという作りになっています。

登場人物が多くてさっぱりわからないですね!
なので、図を書きます。

カンニングダメ!

全体としてはこの様な流れで、回答結果を隠蔽した状態で回答済みであることを証明し、NFTを発行するための門番として回答受付コントラクトと検証コントラクトを配置しています。
ここで、鋭い方は「transactionの履歴が観れるのならば、証明をコピーして送りつければよくないか?」と思われるかもしれません。
しかし、これについてもzk-SNARKs証明作成時にnullifierというものを使うことで対策が可能です。
nullifierとはone timeのhash値の様なもので、証明を作るたびにユニークな値を確保し、それを証明の中に含ませています。
検証時に適切なnullifierを使っていなければ作成される証明自体が食い違ったものになるため、検証でエラーとなります。
そして、検証完了時に検証済みnullifierを検証コントラクトに登録することで、同じnullifierの値を使った証明が送られてきても、それもう使った事ある証明なので受付ないよ!と弾けるのです。
認証周りに詳しい方だとOpenID Connectのnonceを想像していただけるとわかりやすいかもしれません。

合格証NFTコントラクト

NFTリテラシー検定の合格証のNFTコントラクトは通常のNFTコントラクトに対していくつかの制限が設けられています。
具体的な制限は以下の通りです。

  • NFTコントラクトのmintの制限
  • 他人への譲渡ができないようtransferの処理を呼び出しても、transferを実行しない

これらはNFTリテラシー検定の合格証としてNFTを利用する為に必要な仕様であるための制限です。

NFTコントラクトのmintの制限

通常のNFTも発行について制限がある場合があります。
例えば、デジタルアートの著作権者(最初のオーナー)のみがmintできるというものです。
これはデジタルアートの著作権者以外がデジタルアートを保持する資格を誰でも作成できてしまっては問題だからです。

では、NFTリテラシー検定の合格証の場合はどういった制限が必要でしょう?
合格証を合格証たらしめるのは、NFTリテラシー検定の問題集を終了したことを証明できた人のみが保有できます。
言い換えると、前述したzkpの証明をもって終了を証明できた人となります。

つまり、NFTリテラシー検定の合格証のNFTコントラクトはzkpの回答受付コントラクトからのみmintができるという制限を行っています。
この制限により、回答受付コントラクトと検証コントラクトを迂回して直接NFTリテラシー検定の合格証NFTコントラクトに対してmintのトランザクションを発行したとしてもrejectされてmintができなくなっています。

他人への譲渡ができないようtransferの処理を呼び出しても、transferを実行しない

NFTリテラシー検定の合格証には、通常のNFTと違いtransfer(他人への譲渡)を実行できないようにSmartContract内で設定しています。
これはNFTリテラシー検定の提供する問題集を全て完了したということを証明するNFTであるため、終了した証を他人に譲渡できるのはおかしいですよね?
例えば、運転免許証の様な能力を証明するものを他人に譲渡することがダメなのと同じためです。

より多くのユーザーに使っていただくために

さて、ここまでの文章なのですが、実は8/17時点までの開発状況で書かれています。
なのにこのブログが公開されるのは12月!
何があった!?

ご存知の方も、もしかしたらいらっしゃるかもしれませんがNFTリテラシー検定が8/17~8/18にかけて一瞬リリースされていました。
しかし、すぐに長期メンテナンスに入り10/26に再リリースとして現在のサイトを公開させていただいております。

なぜ2ヶ月間もメンテナンスになった!?

NFTリテラシー検定の お知らせ にも記載されていますが、合格証のmintにかかるガス代が高いぞ!という声をたくさんいただきました。
ガス代はBlockchain上での計算にかかる手数料のようなもので、前述した通り合格証はSmartContractとしてBlockchain上にデプロイされています。
さらに、NFTリテラシー検定ではZKPの検証を行っているため、通常のNFTのmintよりも余分にガス代がかかってしまうのです。

ガス代は処理を呼び出した人、NFTリテラシー検定においては合格証の発行を申請したユーザー自身が払う必要があるため、ガス代が高いとユーザーの皆さまの負担が大きくなることを意味します。
この問題に対してチームで協議を行い、より多くの方にNFTリテラシー検定をご利用いただき合格証の発行を行っていただくにはどうすればいいか?ということを検討しました。

対策!

ガス代問題に対してNFTリテラシー検定では以下の2つの対策を行いました。

  • ガス代が安いBlockchainの利用
  • DeNAがガス代を負担し、ユーザーは無料でNFTを入手

ぱっと見、片方でも十分効果がありそうですが両方の対応を行うことに決定しました。
理由としては以下のものです。

  • ガス代が安いBlockchainの選択肢を取った場合、該当chainのガス代を払うためのネイティブトークンの入手難易度が上がる
  • DeNAがガス代を負担する場合、ガス代負担がプロジェクト運営コストとして乗るため可能な限り軽くしたい。

当初はガス代が安いBlockchainを利用する対応だけを取るつもりではありましたが、NFTリテラシー検定はNFTをはじめとしたWeb3初心者の方にこそ触って欲しいサービスですので両方の対応を行うことにいたしました。

以降は、これら2つの対応について具体的に行った内容を見ていきましょう。

ガス代が安いBlockchainの利用

結論から書いてしまえば、この点に関しては「 Polygon PoS 」というBlockchainを利用することにしました。
Polygon PoSはEthereumの開発ツールと互換性が高いEthereumのLayer2スケーリングソリューションです。

Ethereumの開発ツールと互換性があるためEthereum向けに開発したSmartContractおよび、開発ツールがそのまま利用できます。
また、Polygon PoS上の状態は一定のチェックポイント毎にEthereum上で検証されて確定されるシステムになっているため、Ethereumの外の混雑していない環境でガス代を安くでき、且つEthereumの大規模なネットワークによるセキュリティを利用できるものです。(これがLayer2スケーリングソリューション)

同様のことが可能なソリューションは他にも候補はありましたが、情報の入手のしやすさや取引量などを勘案して今回はPolygon PoSを採用しています。

この対応によりガス代自体はかなり削減できました。
価格自体は常に変動しているので単純比較しづらいですが、
Ethereumで1ステップあたりの処理にかかるガス代が約$0.000035354149969
Polygonでの1ステップあたりの処理にかかるガス代が約$0.000000074310768
桁数が多すぎてわからないですねw
ざっくりというとEthereumのガス代の約1/500となります。

DeNAがガス代を負担

次にDeNAがガス代を負担するという対応です。
Polygon PoSを採用したことでガス代が高いという問題は大雑把には解決しました。
しかしEthereumのネイティブトークンであるETHに比べてPolygon PoSのネイティブトークンのMATICは少し入手が難しいです。

取引所によってPolygon PoS上のネイティブトークンのMATICとEthereum上でのERC-20トークンとしてのMATICがあり、取引所によってどちらが扱われているかが違ってくるためです。
ガス代として使用する場合はPolygon PoS上のネイティブトークンが必要で、ERC-20トークンとしてのMATICを入手した場合は、追加でネイティブトークンに移行する手順が必要になります。

こういった事情は、Blockchainに詳しくない初心者にとっては単にETHを入手してガス代を支払うという場合よりも、サービスに対しての障壁が高くなるのではないかと勘案してDeNAがガス代を支払う仕組みを追加しました。
ERC-2771: Secure Protocol for Native Meta Transactions (以降Meta Transactionを略してMetaTxと表記します)と呼ばれる規格に沿って、ユーザーが発行するmintトランザクションを、NFTリテラシー検定のWalletを中継して発行します。

MetaTxの詳細

Blockchainにおける典型的なトランザクションでは、sender(送信者)とpayer(ガス代の支払者)は同じEOAが担います。
MetaTxは、トランザクションのsenderとpayerを切り離すことによって、利用者がガス代を必要とせずにトランザクションを送信できるようにする規格です。

以下はNFTリテラシー検定でMetaTx実装の構成です。

MetaTxの構成とフロー

図に記載した内容のコメントはMetaTx対応を行うことで追加された処理が記載されています。
各コメントに振った番号と対応して以下のようなことをやっています。

  1. EIP-712に沿って実行したいトランザクションデータを署名する。
    EIP-712はトランザクションデータの構造化を行うための規格です。
    EIP-712に沿って構造化されたデータに対して署名を行うことで、署名の対象がどのようなデータであるかを明確にすることができます。

  2. 署名済みトランザクションデータをサーバに渡してMetaTxとして実行するためのリクエストを作成しています。
    サーバを介する目的はValidationなどを行うことでAutotasksに対しての不正なリクエストや失敗するリクエストを除外することを目的としています。

  3. 実際のMetaTx実行はOpenZeppelin DefenderのAutotasks + Relayerを使って実行しています。
    OpenZeppelin DefenderのRelayerはMetaTxを実行する際に利用するWalletのような物で、Transactionを発行する際に必要な秘密鍵を適切に管理、利用してくれるサービスです。
    AutotasksはOpenZeppelin Defenderのサービスの一つでRelayerの認証機能が統合されたサーバーレス関数環境です。今回の実装ではWebhookを介して実行しています。
    これらを組み合わせることで、Autotasksを使ってRelayerに対してMetaTxの実行をリクエストすることができます。

  4. OpenZeppelin DefenderのAutotasksで署名とリクエストが有効なものかを検証します。

  5. 署名とリクエストが有効なものであると確認できたらRelayerを使ってMetaTxを実行します。

  6. EIP-2771の規格に沿ったForwarderがRelayerからのTransactionに内包した署名付きTransactionを取り出して実行します。

以降はZKPを利用したmintの処理における「4.証明の検証とmint依頼」からの流れと同一の動作となります。

最後に

NFTリテラシー検定では、この様なblockchainを使った技術や暗号技術を利用してユーザーの皆様がNFTにまつわるリテラシーを高めていただくと共に合格証を発行しています。
合格証に結びつけられるイラストもとても素敵ですし、ぜひNFTリテラシー検定を利用していただけると幸いです。

さらに!国内外で頑張られているWeb3事業者様もNFTリテラシー検定の合格証を持ったユーザー様と何か新しいことやってみたい!など思いついた方いらっしゃいませんか?
NFTリテラシー検定の合格証はERC721のフォーマットで作成されています!
以下にコントラクトアドレスを載せておきますので、合格証を持ったユーザー様とのコラボレーションをされたい事業者様はぜひご利用ください。

コントラクトアドレス: 0xcb598A194CA92f9685F771f2EC82aFB86BD5f785
PolygonScan: https://polygonscan.com/token/0xcb598A194CA92f9685F771f2EC82aFB86BD5f785

もちろんNFTリテラシー検定のサービス自体とのコラボレーションも募集しておりますので、ご興味が湧かれた方は是非是非お問合せください。
お問合せページ: https://nft-dena.com/contact

NFTについて教えてくれるベルちゃんが悪いこと考えてます

最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。

recruit

DeNAでは、失敗を恐れず常に挑戦し続けるエンジニアを募集しています。