blockchain:openzeppelin_で_erc721_nft_トークンの作成
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
blockchain:openzeppelin_で_erc721_nft_トークンの作成 [2022/05/07 21:28] – dot | blockchain:openzeppelin_で_erc721_nft_トークンの作成 [2022/05/11 06:50] (現在) – dot | ||
---|---|---|---|
行 1: | 行 1: | ||
====== OpenZeppelin で ERC721(NFT) トークンの作成 ====== | ====== OpenZeppelin で ERC721(NFT) トークンの作成 ====== | ||
+ | |||
+ | ほぼ 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: | ||
===== プロジェクト作成 ===== | ===== プロジェクト作成 ===== | ||
行 14: | 行 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. | ||
行 58: | 行 85: | ||
===== NFTの実装 ===== | ===== NFTの実装 ===== | ||
- | |||
<code PowerShell> | <code PowerShell> | ||
行 77: | 行 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) | ||
行 91: | 行 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_トークンの作成.1651958887.txt.gz · 最終更新: 2022/05/07 21:28 by dot