blockchain:トレーサビリティを提供するdapps開発
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
blockchain:トレーサビリティを提供するdapps開発 [2022/05/24 02:14] – dot | blockchain:トレーサビリティを提供するdapps開発 [2022/05/31 04:49] (現在) – dot | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | |||
+ | ====== トレーサビリティを提供する DApps ====== | ||
+ | |||
+ | |||
{{: | {{: | ||
行 5: | 行 9: | ||
* deliver は ERC721.sol の transferFrom(from, | * deliver は ERC721.sol の transferFrom(from, | ||
* burn は ERC721.sol の burn(tokenId) で実現できる | * burn は ERC721.sol の burn(tokenId) で実現できる | ||
- | * トレースは ? | + | |
- | * トランザクションログからトレース? | + | ===== 課題 ===== |
+ | |||
+ | |||
+ | - トレースはどう実現すべきか? | ||
+ | * ブロックチェーンのトランザクションログからトレース? | ||
+ | * 追加で履歴を書き込まないためガス代が安く済むと思われる | ||
* スマートコントラクトに transferFrom の履歴を保持する? | * スマートコントラクトに transferFrom の履歴を保持する? | ||
+ | * 追加で履歴を表すデータを書き込むためガス代がかかる | ||
+ | - あるアカウントが所有している NFT を全件取得するには? | ||
+ | * balanceOf(address) で所有する 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開発.1653358457.txt.gz · 最終更新: 2022/05/24 02:14 by dot