🎨

NFT標準 ERC-721の日本語概要

2022/02/16に公開

はじめに

NFTを買ってみたつもりなのですが、NFT=アートの所有権じゃないという話を聞き、NFTの標準であるERC-721 Non-Fungible Token Standardを読んでみました。

ちなみに私が購入したNFTは下記です。
https://opensea.io/assets/matic/0x2953399124f0cbb46d2cbacd8a89cf0599974963/42341160255752157244741910060985546796861989052965007096991618884560622714881/

この時点でToken standardがERC-1155なので、NFTを買ったつもりが、そうではないかもしれないです・・・

スコープ

本文書のスコープは下図の赤字のERC-721 NFTの部分です。
NFTアートのマーケットであるOpen Seaも準拠している、ERC-721標準。

NFT(ERC721)超概要

・(狭義の)NFT=ERC721=NFTのインタフェース標準です。
・ERC721に沿って実装すると、NFTの所有者を書き換えられます。
・NFTのデータの中身は、tokenIdとメタデータ(資産の名称と画像のURI)

・ERC721に出てくるパラメータに、アートの画像データそのものは含まれません。

⇒私はNFT tokenId:4234xxxのオーナーです。OpenSeaのHPから確認できます。
 NFTの中のMetadataに、画像へのリンクが含まれてるかもしれません。

詳細

標準文書の原本

ERC 721 Non-Fungible Token Standard

https://eips.ethereum.org/erc

関連する標準

//ERC721では、ERC-20 Token standard等も参照しているので、そちらも読まないと全体像がつかめなそうです。

アブスト

ERC721では、NFTを追いかけて、転送する機能を定めている。
NFTは、デジタル or 物理資産の所有権の代理となりえる[can]
dream up many more:家、芸術、子猫の画像、トレカ、ローン、

モチベーション

イーサリアムを使って、NFTのwallet/broker/auctionアプリが動くインタフェース。
ERC-20 token standardをインスパイアしてるけど、トークンを一意に識別できるようにしたい。

仕様

ER-721準拠なコントラクトは、ERC721とERC165のインタフェースに準拠しなくてはならない[must]

//Solidity(イーサリアムのプログラム言語)のevent/functionがかいてありますが、個人的にわかりにくかったので、各event/functionの入力と戻り値をまとめてみました。
//が、わからないのでさっくりまとめると、
//NFTの所有者を変える。NFTのオーナーを調べる
//NFTに紐づくAsset(資産)のメタデータ(名前とURIと画像1080 pixcelまで)を入手
//特定のオーナーの所有するNFTのtokenIdを入手。
//するあたりの関数が規定されているようです。
//パラメータとしては、From, to, tokenId, owner, metadata等。

Every ERC-721 compliant contract must implement the ERC721 and ERC165 interfaces

A wallet/broker/auction application MUST implement the wallet interface if it will accept safe transfers.

The metadata extension is OPTIONAL for ERC-721 smart contract

This is the “ERC721 Metadata JSON Schema” referenced above.

The enumeration extension is OPTIONAL for ERC-721 smart contracts

** Caveats ??警告?
Solidity(イーサリアムのプログラム言語)で書ききれない部分としては、下記が必須。
・Solidity issue #3412:Mutability guarantee?
・Solidity issue #3419:ERC721MetadataかERC721Enumerableは実装必須
・Solidity issue #2330:externalが定義されているファンクションはpublicにする。
・Solidity issue #3494 this.*.selector で警告が出る。
//よくわからん最新のSolidity(プログラム言語)やOpenZeppelin(ライブラリ)でいい感じに実装されているのかな?

** Rationale ??
//将来の希望を書いてる?
資産を、追跡、識別可能なスマートコントラクトの使い方が色々提案されている。
今後の使い方として、現実の資産の追跡も含まれる。
Cross-functional な資産の管理、販売ができるとエコシステムが強くなるだろう。

** NFTの識別子
NFTの識別子は、uint256のID。contract address, uint256 tokenIDのペア。グローバリーユニーク(一意)。

**転送の仕組み
safeTransferを始めるのは
 NFTのオーナ
 NFTのaprooved address
 NFTの現在のオーナーを認証しているオペレーター

認証されたオーナーは、 approvedアドレスも設定することがある。

標準化してない範囲で、下記の実装もできる。
 ・コントラクトが停止中は、transer禁止。
 ・特定のアドレスからのNFTの受信をブロック
 ・unsare transferを禁止
 ・転送元と転送先から料金を課金する
 ・read only NFT

・転送失敗した場合のベストプラクティスはERC-223, 677, 827, OpenZeppelinのインプリ(SafeERC20.sol)
・NFTを作るmining, 壊すburningは仕様の規定外。

** Reference
// 他のも読まねば

以上です。
認識違いなどあれば、コメント欄に記載いただければ幸いです。

Discussion