0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【NFT入門】備忘録:ERC-721とNFTの基本を整理する

Posted at

✅ 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とコンテンツの紐づけ方法

  1. tokenId ごとに メタデータ(JSON形式) を用意
  2. 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の例

  1. コンテンツをオフチェーンにアップロード(例:IPFS、S3等)
  2. アップロードURLを、メタデータの image に記述
  3. メタデータをJSON形式で作成し、これもオフチェーンへアップロード
  4. NFTのミント時に tokenIdtokenURI を指定

✅ オンチェーン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ステップを行っています。


📚 参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?