【Solidity】第6章第4回:ERC-721(NFT)の基本と実装

本記事では、Solidityを用いてERC-721トークン、いわゆるNon-Fungible Token(NFT)の基本と実装について解説します。NFTは、唯一無二のデジタル資産をブロックチェーン上で表現するための標準規格です。
0. 記事の概要
この記事を読むメリット
- ERC-721の基礎理解:NFTの規格とその基本的な仕組みを学べます。
- 実践的なNFT開発:Solidityを用いたNFTの作成と管理方法を理解できます。
- 応用力の向上:NFTを活用したDAppの構築に挑戦できます。
この記事で学べること
- ERC-721の特徴とユースケース
- 基本的なNFTの実装手法
- トークン管理と拡張機能の実現方法
1. ERC-721とは?

1.1 ERC-721の概要
ERC-721はEthereum上で唯一無二のデジタル資産を表現するための標準規格です。この規格は、以下の特徴を持っています:
- 各トークンが一意のIDを持つ
- トークンが相互に置き換え不可能
- 所有者情報がブロックチェーン上で追跡可能
1.2 ERC-721の主なユースケース
- デジタルアートやコレクティブル
- ゲーム内アイテムのトークン化
- 不動産や知的財産のデジタル表現
2. SolidityでのERC-721トークンの実装

2.1 基本的なコード例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyNFT is ERC721 {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
constructor() ERC721("MyNFT", "MNFT") {}
function mintNFT(address to) public {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_mint(to, tokenId);
}
}
動作解説
このコードでは、ERC721
を継承してNFTを実装しています。mintNFT
関数を呼び出すことで、新しいNFTを指定したアドレスに発行できます。
2.2 トークンURIの追加
// トークンURI機能を追加
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFTWithURI is ERC721URIStorage {
uint256 private _tokenIdCounter;
constructor() ERC721("MyNFT", "MNFT") {}
function mintNFT(address to, string memory tokenURI) public {
uint256 tokenId = _tokenIdCounter;
_tokenIdCounter++;
_mint(to, tokenId);
_setTokenURI(tokenId, tokenURI);
}
}
動作解説
このコードでは、ERC721URIStorage
を使用してトークンにURIを紐付けています。_setTokenURI
関数で各トークンのメタデータを設定できます。
3. NFT開発時の注意点

3.1 ガスコストの最適化
ERC-721トークンは複雑な構造を持つため、以下の方法でガスコストを削減しましょう:
- 不要なストレージ操作を避ける
- 効率的なメタデータ管理を行う
3.2 セキュリティの確保
- ミント権限を適切に制御する
- トークンIDの重複を防ぐ
- トランザクションのエラーハンドリングを実装する
4. 練習問題
以下の課題に挑戦してみましょう:
- トークンURIを動的に更新できるNFTを実装してください。
- 特定の条件下でのみミントが許可されるNFTを設計してください。
5. まとめ
本記事では、ERC-721トークン(NFT)の基本と実装について解説しました。NFTは、独自の資産やコレクションをブロックチェーン上で管理する強力なツールです。これを活用して、革新的なDAppを構築してみましょう。