目次
OpenZeppelin で ERC721(NFT) トークンの作成
ほぼ OpenZeppelin オフィシャルのドキュメント通りに NFT スマートコントラクトを実装します。
今回作成する GameItem スマートコントラクトは NFT の生成プログラムです。GameItem の awardItem メソッドを呼び出したときに NFT が生成されます。生成された NFT には NFT の所有者とtokenURIを保持します。tokenURI が指し示す先にゲームアイテムデータの実体があります。
tokenURI は NFT を生成する際に指定されます。その指定された URI の所有者を NFT で記録しているということになります。 URI はブロックチェーンの外にありますので、所有者が所有する物はブロックチェーンの外にあることになります。このようなデータを「オフチェーン」と呼びます。逆に、所有する物もブロックチェーン上に記録することを「オンチェーン」と呼びます。
オフィシャルのドキュメントより引用。
Note
you’ll notice that the item’s information is included in the metadata, but that information isn’t on-chain! So a game developer could change the underlying metadata, changing the rules of the game! If you’d like to put all item information on-chain, you can extend ERC721 to do so (though it will be rather costly). You could also leverage IPFS to store the tokenURI information, but these techniques are out of the scope of this overview guide.
GameItem スマートコントラクトは ERC721URIStorage を継承しているため「オフチェーン」になります。オンチェーンにしたい場合は ERC721 を継承すればOKです。「オンチェーン」の場合は「オフチェーン」よりもガス代が割高になります。また、tokenURI に IPFS の URI を指定することもできます。
つまり、ethereum ブロックチェーン上の NFT と IPFS を組み合わせれば、非中央集権を保ったまま改竄できない NFT を実現できます。
前提
npm、Truffle、Ganache をインストールしておいてください。
プロジェクト作成
Truffleを使ったスマートコントラクト開発 を参考に truffle-config.js の設定をしてください。(どの ethereum ブロックチェーンに接続するか設定する必要があります。)
OpenZeppelin のインストール
npm を使用して OpenZeppelin をインストールします。
NFTの実装
マイグレーション
デプロイ
実行(Mint)
今回作成したスマートコントラクトの awardItem を実行すると、新しい NFT が生成されます。 新たな NFT を生成することを Mint と言います。実際 awardItem のソースコードでは「_mint(player, newItemId);」と _mint メソッドを呼び出しています。ERC721(NFT) トークンだけでなく ERC20 トークンを新たに生成することも Mint と言います。 Mint は英語の「Minting 鋳造(ちゅうぞう)」から来ています。(例: minting authority 造幣局)
トランザクションログから Mint した NFT の TOKENID を取得します。 (GameItem スマートコントラクトは内部的に自動インクリメントする TOKENID を生成しています。これが主キーの役割を果たしています。)
Mint した NFT の所有者と NFT に保存されている tokenURI を確認します。
