見出し画像

NFTのSCAM防止機能、ContractAllowListの紹介

最近いくつかのNFTに導入されているContractAllowList(以下CAL)について、大まかな機能について説明したいと思います。
なお、この説明は導入するエンジニア向けに書いているので、NFTを購入するかたが見てもわからないことが多いかもしれません。

リンク

npmパッケージ

ソースコード

機能

CALで実現したいことは、ホルダーがSCAMにあわないようにすることです。それを実現するために、大きく分けて2つの機能があります。

NFTを転送するコントラクトを制限する機能

SCAMで一番多いパターンは、scammerがホルダーにsetApprovalForAllを叩かせてNFTの転送権限を貰い、それからNFTをsafeTransferFromで奪うというものです。
もう少し細かく説明すると、setApprovalForAllはNFTコントラクトにあるメソッドです。転送権限を付与/剥奪する対象となるアドレスと、付与するか剥奪するかを引数として渡します。ホルダーがsetApprovalForAllでscammerのアドレスを設定することで、scammerがそのNFTコントラクトにおいて、そのホルダーのNFTを自由に転送することが出来るようになります。

これを防ぐために、CALではsetApprovalForAllやsafeTransferFromするコントラクトを制限する機能があります。
CALがあらかじめCALの運営チームによってブロックチェーン上にデプロイされており、NFTコントラクトはCALを参照して許可の判定を行います。
CALで現在許可されているのは、EthereumチェーンではOpenSea、AstarチェーンではtofuNFTです。
CALを導入したNFTコントラクトでは、CALで許可されているアドレスしかsetApprovalForAllできないため、scammerのアドレスはsetApprovalForAllできません(エラーになります)。当然、scammerがNFTをsafeTransferFromで奪うことは出来ません。

CALの許可にはレベルがあります。レベル1が最も信頼性が高く、レベルが2,3,4,,,と大きくなるにつれて信頼性が下がっていくという考え方になっています。
今はまだレベル1にOpenSeaとtofuNFTがあるだけですが、今後x2y2やバッチトランスファーのコントラクトも増やしていくかもしれません。
NFTプロジェクトを運営するメンバーが、どのレベルまで許可するかを選べるようにと考えています。
CALにアドレスを登録する役割は、CALの運営チームが担っています。

また、独自にNFTマーケットを作ったり、どこかの新興マーケットと提携してNFTを売買できるようにするなど、CALには登録されていないマーケットで売買を行いたいケースが考えられます。
その場合は、独自にアドレスを許可することで、CALに登録されていないマーケット(のアドレス)でもNFTを取り扱うようにできます。

NFTをロックする機能

これはぼくのプロジェクトでは使わなかったのであまり分かっていないのですが(すいません)、NFTのロック/解除を行う機能です。
考え方としては、NFTをロックしておくと、解除しない限り転送ができない、というものです。NFT Aopanda Partyの「ぱんだロック: APPをロック」がそれにあたります。

よく見たらCALの説明もありましたね。

ただ、NFTをロックする機能は「ロック/解除できるのは誰か」を決めるが難しいです。ホルダーが自分のウォレットでロックする方法だと、scammerがこの機能のことを知っていると簡単にロックを解除されてしまいます。そのため、時限式の解除であったり、別ウォレットでの解除であったりと、堅牢で扱いやすいロックの方法がまだ検討されている段階です。

また、ホルダーのみがロックできるようにすると、マーケットに安値で売りに出しつつロックしておいて実際には買えないようにする、という嫌がらせを防げません。そのため、解除はNFT運営メンバーも出来るようにしたほうが良いのではないか、いやでもそれだと中央集権に・・・というジレンマもあります。

さらにロックする機能には、token_id単位のロック、ウォレット単位のロック、NFTコレクション全体のロックとロックの段階が複数用意されています。それぞれのロックを誰が出来るのか、それぞれのロックのどちらが優先されるのかなども使うに当たって理解しておく必要があります。

CALで防げないもの

シークレットリカバリーフレーズや秘密鍵を知られてしまった場合、CALではNFTを守ることは出来ません。もし知られてしまった場合は、速やかに別の新しく作ったウォレットに資産を移してください。と、ホルダーさんに伝えるようにしてください。
あ、MetaMaskで「アカウントを作成」してしまうとシークレットリカバリーフレーズが同じウォレットが出来てしまうので気をつけましょう。

もう一つ、ロックしていない場合、本人のウォレットから転送のトランザクションが発行された場合、防ぐことが出来ません。

導入手順

こちらに導入手順を書きましたので、導入する際は参考にしてください。

ここまで、いかがでしたでしょうか。
わからない点や、間違えている点がありましたら、ぜひ教えて下さい。よろしくおねがいします。


この記事が気に入ったらサポートをしてみませんか?