NFT規格であるERC721とそのメタデータを調べてみた
猫も杓子もNFTな今日この頃ですが、NFTとはなんでしょうか。私はスマートコントラクトに興味があり、そちらを軽く覗いてみましたのでブログにします。
ERC721とは
いわゆるEthereumにおけるNFTの標準規格です。
規格はERC721として公開されているので誰でも観ることができます。 議論のissue作成開始日は、ERC721は2017年9月末なので結構古いですね。
また、規格を追うときは実装も知っておいた方が理解が捗ります。OpenZeppelinというデファクトスタンダードちっくな実装も眺めると良いそうです。
これを読むと、いわゆる画像などを示していそうな変数を取り扱っているのは"tokenURI"だけっぽいように見えます。ここには単純なURI(雑に言えばURLのことです)が入ります。
もちろん、URLなのでその先が変わってしまえば内容も変わります。その辺りについても説明があります。
ERC721 Metadata JSON Schema
tokenURIの先についてメタデータであるERC721 Metadata JSON Schemaが記載されていました。 nameやdescription(説明)の他には、imageプロパティだけです。
なんと、スキーマ的には画像( mime type image/*)だけが前提なのでした。
プロパティの説明には画像のピクセルサイズとアスペクト比が記載されています。
A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
まとめると、標準の枠組みだけでは、名前、説明書き、サムネ画像が表示できるだけ ということになりそうです。
でも、さすがにこれだけだと乏しすぎるでしょ とか、実際にはもう少しみんな自由にやっているじゃん となります。次からはもう少し具体例をみてみます。
具体的にtokenURIを観察する
私の手元には3つのNFTがあるのでそれを観察してみることにしました。
vividot nft
vividot nftについては、私が過去に記事を書いているのでこちらを参照ください。
HiÐΞブログシステムで馴染みのあるPolygonにあり、MATICだけでゲットすることができます。ゲットすることをmintするっていうみたいです。 私も格好よく以後mintという表現を使います。
OpenSeaで観ることができます。 https://opensea.io/assets/matic/0x445dc5285bb5de6263bbbf6edfd4e0fdac397f6b/28645?locale=ja
エクスプローラーでmintした時のトランザクションを確認します。
https://polygonscan.com/tx/0xab95364763c6f08cf72d2cde5d26e3af1c27b5ee18114b7dc5edf6bed46e7789
既にエクスプローラーが要素に基づいて表示してくれています。
- name: vividot nft
- symbol: VVNFT
- TokenId: 28645
コントラクトを確認します https://polygonscan.com/address/0x445dc5285bb5de6263bbbf6edfd4e0fdac397f6b#readContract
5.nameや8.symbolを確認してみましょう。
さらに、11. tokenURIで先程の番号を入力してみましょう。
すると、https://gateway.pinata.cloud/ipfs/QmY2hdKvLpCDmdG6VfJVmN1ixvubwAYdSbvBEYRj6ETyuW/25.json というURLが返ってきます。
この中身をみると次のようになっています。
~$ curl -s https://gateway.pinata.cloud/ipfs/QmY2hdKvLpCDmdG6VfJVmN1ixvubwAYdSbvBEYRj6ETyuW/25.json | jq
{
"name": "cat #1",
"description": "本NFTの所有者は、本NFTの対象となる画像を「SNS等においてアイコンにする行為」及び商用利用を除き、自由に 利用することができます。著作権や商標権その他の知的財産権は譲渡されません。",
"external_url": "https://nft.vividot-de.fi/",
"image": "https://gateway.pinata.cloud/ipfs/QmVVqUzeWM1RY5feMCNZenKPK8HWcL35eXc9bahapHtpTi/25.png",
"attributes": [
{
"trait_type": "base",
"value": "cat"
},
{
"trait_type": "optional",
"value": "none"
}
]
}
規格にあった3つ以外のプロパティが含まれていることが分かります。これはいったいどこで規定されているものなのでしょうか。
こいつはOpenSeaで見れるのでそっちの拡張を使ってるんかなと妄想して覗きに行きました。
https://docs.opensea.io/docs/metadata-standards
やっぱりそういう話でした。
このように独自拡張があることが分かります。これは規格から外れたプロパティなので正しく処理されるかはクライアント次第ということになります。
FantasyZone at Metaani Store
同じ要領で調べるので結果だけ載せます。
{
"name": "Stack of Fungus at Metaani Store",
"image": "https://arweave.net/HAW_OTdpmljxV8UfWHXHxD4t9d0MkzH9SYx7OJY3P5M",
"description": "Metaani is CryptoArt Collaboration Avatar for metaverse.",
"external_url": "https://conata.world/metaani",
"animation_url": "https://conata.mypinata.cloud/ipfs/QmP7wLBoTTicJxTWhCkf8NiUWBCHVssfF3WcGaRGjbRZTm/",
"attributes": [
{
"trait_type": "Artist",
"value": "hermippe"
},
{
"trait_type": "Art",
"value": "Stack of Fungus"
},
{
"trait_type": "Genre",
"value": "Dot"
},
{
"trait_type": "Type",
"value": "Cat"
} ]
}
いきなりゲーム画面が開くのでびっくりするかもしれませんが、ソースコードを見るとれっきとしたHTMLであることが分かります。
view-source:https://conata.mypinata.cloud/ipfs/QmP7wLBoTTicJxTWhCkf8NiUWBCHVssfF3WcGaRGjbRZTm/
ちなみに1番と2番ではコントラクトの内容が違います😉
1番は次と同じようにバイトコードしかみれません。
HiÐΞのNFT化記事
https://polygonscan.com/address/0xaa6982a4ac7a0ffbbbeb91815c46bd0b709913db#code こちらは見ることができませんでした。もちろんバイトコードは見えますが。
お気軽にたたけないので残念です。
この差はどこから生じるのか有識者の方いましたらコメント頂けると嬉しいです。
おまけ
vividot nftはとてもシンプルなので良いです。コードもsetBaseURI変数だけ追えば何となく雰囲気を掴むことができます。 https://polygonscan.com/address/0x445dc5285bb5de6263bbbf6edfd4e0fdac397f6b#code#L1188
まとめ
- ERC721の規格を簡単に読み解きました。規格化されているスタンダードでは、名前、説明、画像ファイルと本当に単純なものしか扱えないことが分かりました。
- 実際に所有している3つのNFTのメタデータを調べました。
- OpenSeaが規定しているメタデータプロパティがあることが分かりました。
- このことから、他にも独自定義のプロパティが山ほどあることが想像されます。