blockchain:トレーサビリティを提供するdapps開発
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| blockchain:トレーサビリティを提供するdapps開発 [2022/05/29 00:38] – dot | blockchain:トレーサビリティを提供するdapps開発 [2022/05/31 04:49] (現在) – dot | ||
|---|---|---|---|
| 行 17: | 行 17: | ||
| * 追加で履歴を書き込まないためガス代が安く済むと思われる | * 追加で履歴を書き込まないためガス代が安く済むと思われる | ||
| * スマートコントラクトに transferFrom の履歴を保持する? | * スマートコントラクトに transferFrom の履歴を保持する? | ||
| - | * 追加で履歴を表すデータを書き込むためガス代がかかると | + | * 追加で履歴を表すデータを書き込むためガス代がかかる |
| - | - あるアカウントが所有している NFT を取得するには? | + | - あるアカウントが所有している NFT を全件取得するには? |
| * balanceOf(address) で所有する NFT の総数は分かる | * balanceOf(address) で所有する NFT の総数は分かる | ||
| * ItemNFT に所有する NFT を全件返すメソッドを実装すれば実現することはできる | * ItemNFT に所有する NFT を全件返すメソッドを実装すれば実現することはできる | ||
| * 他に良い方法がないのか? | * 他に良い方法がないのか? | ||
| + | |||
| + | ===== コード ===== | ||
| + | |||
| + | 実装中のコード。 | ||
| + | |||
| + | ItemNFT.sol | ||
| + | |||
| + | <code JavaScript> | ||
| + | // SPDX-License-Identifier: | ||
| + | pragma solidity >=0.4.22 <0.9.0; | ||
| + | |||
| + | import " | ||
| + | import " | ||
| + | import " | ||
| + | import " | ||
| + | import " | ||
| + | |||
| + | contract ItemNFT is ERC721, ERC721Enumerable, | ||
| + | using Counters for Counters.Counter; | ||
| + | |||
| + | bytes32 public constant MINTER_ROLE = keccak256(" | ||
| + | Counters.Counter private _tokenIdCounter; | ||
| + | |||
| + | constructor() ERC721(" | ||
| + | _grantRole(DEFAULT_ADMIN_ROLE, | ||
| + | _grantRole(MINTER_ROLE, | ||
| + | } | ||
| + | |||
| + | function _baseURI() internal pure override returns (string memory) { | ||
| + | return " | ||
| + | } | ||
| + | |||
| + | function safeMint(address to) public onlyRole(MINTER_ROLE) { | ||
| + | uint256 tokenId = _tokenIdCounter.current(); | ||
| + | _tokenIdCounter.increment(); | ||
| + | _safeMint(to, | ||
| + | } | ||
| + | |||
| + | // The following functions are overrides required by Solidity. | ||
| + | |||
| + | function _beforeTokenTransfer(address from, address to, uint256 tokenId) | ||
| + | internal | ||
| + | override(ERC721, | ||
| + | { | ||
| + | super._beforeTokenTransfer(from, | ||
| + | } | ||
| + | |||
| + | function supportsInterface(bytes4 interfaceId) | ||
| + | public | ||
| + | view | ||
| + | override(ERC721, | ||
| + | returns (bool) | ||
| + | { | ||
| + | return super.supportsInterface(interfaceId); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ItemNFT.tsx | ||
| + | |||
| + | <code JavaScript> | ||
| + | import React, { useContext, useState } from " | ||
| + | import { ItemNFTContext } from " | ||
| + | import { SignerContext } from " | ||
| + | import { BigNumber } from " | ||
| + | |||
| + | interface Props {} | ||
| + | |||
| + | export const ItemNFT: React.FC< | ||
| + | const ItemNFT = useContext(ItemNFTContext); | ||
| + | const Signer = useContext(SignerContext); | ||
| + | const [address, setAddress] = useState< | ||
| + | Signer[0]? | ||
| + | setAddress(address); | ||
| + | }); | ||
| + | const [tokenId, setTokenId] = useState< | ||
| + | const [tokenURI, setTokenURI] = useState< | ||
| + | |||
| + | const handleGetAccounts = async ( | ||
| + | e: React.MouseEvent< | ||
| + | ) => { | ||
| + | e.preventDefault(); | ||
| + | console.log(Signer); | ||
| + | }; | ||
| + | |||
| + | const handleSafeMint = async ( | ||
| + | e: React.MouseEvent< | ||
| + | ) => { | ||
| + | e.preventDefault(); | ||
| + | if (!ItemNFT.instance) throw Error(" | ||
| + | if (ItemNFT.instance) { | ||
| + | const tx = await ItemNFT.instance.safeMint(address); | ||
| + | const waitLog = await tx.wait(); | ||
| + | const event = waitLog.events ? waitLog.events[0] : undefined; | ||
| + | if(event !== undefined){ | ||
| + | const _tokenId = event.args ? event.args.tokenId : undefined; | ||
| + | setTokenId(_tokenId); | ||
| + | } | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | const handleTokenURI = async ( | ||
| + | e: React.MouseEvent< | ||
| + | ) => { | ||
| + | e.preventDefault(); | ||
| + | if (!ItemNFT.instance) throw Error(" | ||
| + | if (ItemNFT.instance) { | ||
| + | if (tokenId !== undefined && tokenId.toNumber() >= 0){ | ||
| + | const tokenURI = await ItemNFT.instance.tokenURI(tokenId); | ||
| + | setTokenURI(tokenURI); | ||
| + | } | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | return ( | ||
| + | <div> | ||
| + | <button onClick={(e) => handleGetAccounts(e)}> | ||
| + | < | ||
| + | <button onClick={(e) => handleSafeMint(e)}> | ||
| + | < | ||
| + | <button onClick={(e) => handleTokenURI(e)}> | ||
| + | < | ||
| + | </ | ||
| + | ); | ||
| + | }; | ||
| + | </ | ||
| + | |||
blockchain/トレーサビリティを提供するdapps開発.1653784697.txt.gz · 最終更新: by dot
