blockchain:openzeppelin_で_erc721_nft_トークンの作成
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| blockchain:openzeppelin_で_erc721_nft_トークンの作成 [2022/05/07 21:29] – dot | blockchain:openzeppelin_で_erc721_nft_トークンの作成 [2022/05/11 06:50] (現在) – dot | ||
|---|---|---|---|
| 行 3: | 行 3: | ||
| ほぼ OpenZeppelin オフィシャルの[[https:// | ほぼ OpenZeppelin オフィシャルの[[https:// | ||
| + | |||
| + | 今回作成する GameItem スマートコントラクトは NFT の生成プログラムです。GameItem の awardItem メソッドを呼び出したときに NFT が生成されます。生成された NFT には NFT の所有者とtokenURIを保持します。tokenURI が指し示す先にゲームアイテムデータの実体があります。 | ||
| + | |||
| + | tokenURI は NFT を生成する際に指定されます。その指定された URI の所有者を NFT で記録しているということになります。 | ||
| + | URI はブロックチェーンの外にありますので、所有者が所有する物はブロックチェーンの外にあることになります。このようなデータを「オフチェーン」と呼びます。逆に、所有する物もブロックチェーン上に記録することを「オンチェーン」と呼びます。 | ||
| + | |||
| + | オフィシャルの[[https:// | ||
| + | |||
| + | > 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, | ||
| + | |||
| + | GameItem スマートコントラクトは ERC721URIStorage を継承しているため「オフチェーン」になります。オンチェーンにしたい場合は ERC721 を継承すればOKです。「オンチェーン」の場合は「オフチェーン」よりもガス代が割高になります。また、tokenURI に IPFS の URI を指定することもできます。 | ||
| + | |||
| + | つまり、ethereum ブロックチェーン上の NFT と IPFS を組み合わせれば、非中央集権を保ったまま改竄できない NFT を実現できます。 | ||
| ===== 前提 ===== | ===== 前提 ===== | ||
| - | Truffle と npm をインストールしておいてください。 | + | npm、Truffle、Ganache |
| (参考) [[blockchain: | (参考) [[blockchain: | ||
| + | |||
| + | (参考) [[blockchain: | ||
| ===== プロジェクト作成 ===== | ===== プロジェクト作成 ===== | ||
| 行 16: | 行 32: | ||
| > cd nft_project | > cd nft_project | ||
| nft_project> | nft_project> | ||
| + | </ | ||
| + | |||
| + | [[blockchain: | ||
| + | |||
| + | ===== OpenZeppelin のインストール ===== | ||
| + | |||
| + | npm を使用して OpenZeppelin をインストールします。 | ||
| + | |||
| + | <code PowerShell> | ||
| nft_project> | nft_project> | ||
| This utility will walk you through creating a package.json file. | This utility will walk you through creating a package.json file. | ||
| 行 60: | 行 85: | ||
| ===== NFTの実装 ===== | ===== NFTの実装 ===== | ||
| - | |||
| <code PowerShell> | <code PowerShell> | ||
| 行 79: | 行 103: | ||
| Counters.Counter private _tokenIds; | Counters.Counter private _tokenIds; | ||
| - | constructor() | + | constructor() |
| function awardItem(address player, string memory tokenURI) | function awardItem(address player, string memory tokenURI) | ||
| 行 93: | 行 117: | ||
| } | } | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | ===== マイグレーション ===== | ||
| + | |||
| + | <code PowerShell> | ||
| + | nft_project> | ||
| + | nft_project> | ||
| + | </ | ||
| + | |||
| + | <code JavaScript> | ||
| + | const GameItem = artifacts.require(" | ||
| + | module.exports = function(_deployer) { | ||
| + | // Use deployer to state migration tasks. | ||
| + | _deployer.deploy(GameItem) | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | ===== デプロイ ===== | ||
| + | |||
| + | <code PowerShell> | ||
| + | nft_project> | ||
| + | </ | ||
| + | |||
| + | ===== 実行(Mint) ===== | ||
| + | |||
| + | 今回作成したスマートコントラクトの awardItem を実行すると、新しい NFT が生成されます。 | ||
| + | 新たな NFT を生成することを Mint と言います。実際 awardItem のソースコードでは「_mint(player, | ||
| + | Mint は英語の「Minting 鋳造(ちゅうぞう)」から来ています。(例: | ||
| + | |||
| + | <code PowerShell> | ||
| + | nft_project> | ||
| + | truffle(development)> | ||
| + | truffle(development)> | ||
| + | truffle(development)> | ||
| + | truffle(development)> | ||
| + | { | ||
| + | tx: ' | ||
| + | receipt: { | ||
| + | transactionHash: | ||
| + | transactionIndex: | ||
| + | blockHash: ' | ||
| + | blockNumber: | ||
| + | from: ' | ||
| + | to: ' | ||
| + | gasUsed: 153238, | ||
| + | cumulativeGasUsed: | ||
| + | contractAddress: | ||
| + | logs: [ [Object] ], | ||
| + | status: true, | ||
| + | logsBloom: ' | ||
| + | rawLogs: [ [Object] ] | ||
| + | }, | ||
| + | logs: [ | ||
| + | { | ||
| + | logIndex: 0, | ||
| + | transactionIndex: | ||
| + | transactionHash: | ||
| + | blockHash: ' | ||
| + | blockNumber: | ||
| + | address: ' | ||
| + | type: ' | ||
| + | id: ' | ||
| + | event: ' | ||
| + | args: [Result] | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | トランザクションログから Mint した NFT の TOKENID を取得します。 | ||
| + | (GameItem スマートコントラクトは内部的に自動インクリメントする TOKENID を生成しています。これが主キーの役割を果たしています。) | ||
| + | |||
| + | <code PowerShell> | ||
| + | truffle(development)> | ||
| + | </ | ||
| + | |||
| + | Mint した NFT の所有者と NFT に保存されている tokenURI を確認します。 | ||
| + | |||
| + | <code PowerShell> | ||
| + | truffle(development)> | ||
| + | ' | ||
| + | truffle(development)> | ||
| + | ' | ||
| </ | </ | ||
blockchain/openzeppelin_で_erc721_nft_トークンの作成.1651958988.txt.gz · 最終更新: by dot
