✅ ERC-721とは?
- Ethereum上でNFT(非代替性トークン)を実装するための標準インターフェース。
- NFTの追跡や譲渡など、基本的な機能を提供するスマートコントラクトのAPI仕様。
- 公式ドキュメント: ERC-721: Non-Fungible Token Standard (ethereum.org)
✅ NFTの本質とは?
NFTは、以下の2つによって一意に識別されます:
- コントラクトアドレス
- トークンID(tokenId)
つまり、「このスマートコントラクトで発行されたこのIDのトークンは唯一無二」という意味になります。
tokenId
は基本的に不変であり、NFTを一意に識別するための鍵です。
✅ NFTはコンテンツを持つ必要がある?
厳密には コンテンツの有無は問われません。
- NFTは「一意な識別子」さえあれば成立します。
- ただし、一般的なNFT(アート、音楽、ゲームアイテムなど)はコンテンツを持っていることが多いです。
✅ NFTとコンテンツの紐づけ方法
-
tokenId
ごとに メタデータ(JSON形式) を用意 - JSON内に、画像や動画のURIを記述(例:
image
フィールド)
{
"name": "My NFT #1",
"description": "This is a sample NFT.",
"image": "https://example.com/images/nft1.png"
}
✅ コンテンツの配置場所
- コンテンツ(画像・音声・映像など)はデータサイズが大きくなりがち
- Ethereumのブロックチェーン上に直接格納するのは非現実的
- 通常は以下のいずれかの方法で保存:
方法 | 特徴 |
---|---|
オフチェーン | 通常のWebサーバー、IPFS、Arweaveなどに格納 |
オンチェーン | 小さいデータ(例:SVG)であれば格納可能。コストが高い |
✅ メタデータとコンテンツの配置パターン
メタデータ | コンテンツ | 説明 |
---|---|---|
オフチェーン | オフチェーン | 一般的。コストが低く現実的 |
オンチェーン | オンチェーン | 完全に分散化されるが高コスト |
オンチェーン | オフチェーン | メタデータだけオンチェーンに保管するパターンもある |
✅ オフチェーンNFTの例
- コンテンツをオフチェーンにアップロード(例:IPFS、S3等)
- アップロードURLを、メタデータの
image
に記述 - メタデータをJSON形式で作成し、これもオフチェーンへアップロード
- NFTのミント時に
tokenId
とtokenURI
を指定
✅ オンチェーンNFTの例
-
tokenURI
に直接、Base64エンコードされたJSONを設定 - 画像(例:SVG)も Base64 で埋め込む
function tokenURI(uint256 tokenId) public view override returns (string memory) {
string memory json = Base64.encode(bytes(string(abi.encodePacked(
'{"name": "OnChain NFT #', tokenId.toString(),
'", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(svgData)),
'"}'
))));
return string(abi.encodePacked("data:application/json;base64,", json));
}
✅ 所有者情報の管理
NFTの所有者情報はコントラクト内で管理されます:
mapping(uint256 => address) private _owners;
- トークンIDをキーとして、所有者アドレスを記録します。
- 標準関数
ownerOf(tokenId)
で所有者を確認できます。
✅ NFTのミント方法
- 通常は
mint(address to, uint256 tokenId)
のような関数を通じてNFTを発行。 - この時点ではコンテンツを持たないNFTも作成可能です。
- 実際には、
tokenURI
を渡すことで、メタデータとの紐づけも行います。
例:
function mint(address to, uint256 tokenId, string memory uri) public {
_mint(to, tokenId);
_setTokenURI(tokenId, uri);
}
❓ 疑問:「ミント関数って何してるの?」
-
_mint(to, tokenId)
:指定されたアドレスに新しいNFTを割り当てます。 -
_setTokenURI(tokenId, uri)
:NFTにメタデータ(URI)を紐づけます。
つまり、NFTの「登録」と「意味づけ(メタデータ)」の2ステップを行っています。
📚 参考資料
- Udemy講座:DApps × NFT入門
- OpenZeppelin ERC-721実装: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol
- ERC-721 仕様: https://eips.ethereum.org/EIPS/eip-721