はじめに(Introduction)
NFTを取扱いたいという人と話をしていると、どうもコンテンツ(画像など)自体がNFTだと誤解している人が多いように思えます。
「NFTにまつわる「誤解」」によれば以下の誤解がありそうです。
誤解1:NFTはコンテンツの唯一性・真正性・永続性を保証する
誤解2:NFTを保有すれば所有権・知的財産権が得られる
記事自体は2022年のものですが、いまだに誤解している人が多いように思えます。
そこでNFT(ERC-721)の仕組みと何ができるのかを明確にしたいと思います。
NFT(ERC-721: Non-Fungible Token Standard)の仕組み
簡単に言えば以下のメソッドを実装しているコントラクトがNFTコントラクトと言えます。
ただし、ブロックチェーン上にある全てのNFTコントラクトが同じ動きをするとは限りません。
例えば、ERC-5192: Minimal Soulbound NFTsなどは転送不可の為、safeTransferFrom
、transferFrom
などは例外処理(require
、revert
)が発生するはずです。
コンテンツ(画像など)の情報を取得するようなメソッドはありません。
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
コンテンツ情報を取得する場合にはオプションである ERC721Metadata
インターフェースを使用します。
name
、symbol
、tokenURI
メソッドが提供されます。
tokenURI
からURIを取得し、URIからメタデータがJSON形式で取得できます。
メタデータに含まれる最低限の情報は、string
型のname
、description
、image
です。
メタデータのimage
にはURIが設定されているのでコンテンツが取得できます。
/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface ERC721Metadata /* is ERC721 */ {
/// @notice A descriptive name for a collection of NFTs in this contract
function name() external view returns (string _name);
/// @notice An abbreviated name for NFTs in this contract
function symbol() external view returns (string _symbol);
/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
/// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
/// 3986. The URI may point to a JSON file that conforms to the "ERC721
/// Metadata JSON Schema".
function tokenURI(uint256 _tokenId) external view returns (string);
}
{
"title": "Asset Metadata",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Identifies the asset to which this NFT represents"
},
"description": {
"type": "string",
"description": "Describes the asset to which this NFT represents"
},
"image": {
"type": "string",
"description": "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
メソッドでURIを取得します - 1.で取得したURIからメタデータ(JSON)を取得し、JSONデータの
image
からURIを取得します - 2.で取得したURIからコンテンツを取得します
チェーン、コントラクトアドレス、トークンIDがわかれば誰でもコンテンツを取得することができます。
所有権(Ownership)
ERC721コントラクトからはトークンIDの所有権を示すことができます。
所有権があるかどうかを知りたい「検証者」と所有権があることを証明したい「証明者」がいた場合、以下の手順で所有権を証明することができます。
- 検証者は、証明者にメッセージを送ります(メッセージは一意性である必要があります)
- 証明者は、1.で受け取ったメッセージをトークンIDが保有するアドレスに対応する秘密鍵で署名値を算出し、検証者に送ります
-
検証者は、2.で受け取った署名値からアドレスを復元しトークンIDの所有者(
ownerOf
)と一致するかを検証します
メタデータやコンテンツはオフチェーン(ブロックチェーンとは別)で管理されている為、所有権は、完全ではありません。
コンテンツの所有権を完全なものにするためにはコンテンツに対して電子透かしを入れるなどの工夫が必要になります。
まとめ(Conclusion)
NFTに関する誤解はNFT販売所が分かりやすく画像を表示している為のような気がします。
それに加え、ブロックチェーンの特徴である耐改ざん性や暗号による署名・検証などが誤解を生んでいると思われます。
NFTではトークンIDの所有者であるかを示す事ができます。
ただ、NFTコントラクトの作りによっては所有者以外がトークンIDの移転などを可能にすることもできます。
NFTを取り扱うにはどういったNFTなのかを知っておくことが重要となります。