Pertama sekali, untuk memudahkan pemahaman masalah, saya hanya akan kekalkan fungsi yang lebih berguna untuk memahami masalah. Kod ini membenarkan mencipta NFT dalam tatasusunan, di mana NFT pertama mempunyai idToken 0. Apabila saya mengklik butang "Dapatkan data daripada kontrak", saya ingin menghantar parameter 0 kepada fungsi JavaScript readContract(tokenid) untuk memaparkan nilai Kuasa, uint8 (dijana secara rawak, nilai dari 0 hingga 100) fail HTML. Malangnya, saya menghadapi pepijat dan saya mencuba pelbagai cara untuk menyelesaikannya tanpa berjaya. Kontrak dan JavaScript disambungkan dengan betul (seperti yang dibuktikan oleh fungsi connectContract(), yang merupakan pengesahan ini), jadi ABI dan alamat bukan sebahagian daripada masalah. Fungsi readContract() sepatutnya menggunakan kaedah getNFTPower yang ditulis dalam kontrak Solidity, tetapi ada sesuatu yang tidak kena: nilai pulangan adalah tidak sah. Tetapi bagi saya mereka haha… Saya juga cuba memasukkan beberapa pernyataan console.log dalam fungsi readContract() sebelum dan selepas baris pertama kod: const power = tetingkap tunggu.contract.methods.getNFTPower(tokenId).call( Saya tidak nampak sebarang keluaran console.log selepas kenyataan itu, jadi masalah itu nampaknya berlaku di sana.
Semoga ada yang dapat memberi petunjuk..Terima kasih.
Tangkapan skrin ralat di bawah
Sebahagian daripada kod di bawah.
KOD KEPADUAN
contract NFTGame is ERC721, Ownable { using SafeMath for uint256; address public erc20TokenAddress; struct NFTAttributes { uint8 power; bool inArena; } NFTAttributes[] public nfts; constructor(address _erc20TokenAddress) ERC721(FightArena, FIGA) payable { erc20TokenAddress = _erc20TokenAddress; } function createNFT() external { uint8 power = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender))) % 101); Random number da 0 a 100 nfts.push(NFTAttributes(power, false)); uint256 tokenId = nfts.length - 1; _mint(msg.sender, tokenId); } function getNFTPower(uint256 tokenId) public view returns (uint8) { require(_exists(tokenId), ID del token non valido); return uint8(nfts[tokenId].power); } }
HTML/JS
... <head> ... <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.2.7-rc.0/web3.min.js"></script> ... </head> ... <body> <button onclick="connectMetamask()">CONNECT METAMASK</button> <br> <p id="accountArea"></p> <button onclick="connectContract()">CONNECT TO CONTRACT</button> <br> <p id="contractArea"></p> <button onclick="readContract(0)">GET DATA FROM CONTRACT</button> <br> <p id="dataArea"></p> // 0 is the first NFT minted by the function createNFT() ... </body> ... <script> ... const readContract = async (tokenId) => { const power = await window.contract.methods.getNFTPower(tokenId).call(); const powerString = power.toString(); document.getElementById("dataArea").innerHTML = "Power of NFT " + tokenId + ": " + powerString; } ... </script> ...
Saya cuba menulis semula fungsi readContract() dalam pelbagai cara, tetapi ia tidak membantu. Matlamat saya adalah untuk mengklik butang "Dapatkan data daripada kontrak" dan memaparkan nilai POWER tokenId NFT yang saya lalui sebagai parameter (dalam kod di atas, NFT pertama, tokenId = 0).
Terdapat dua sebab yang paling biasa: