首先,為了方便理解問題,我將只保留對理解問題更有用的函數。該程式碼允許在數組中建立 NFT,其中第一個 NFT 的 idToken 為 0。 當我點擊「從合約取得資料」按鈕時,我想將參數 0 傳遞給 readContract(tokenid) JavaScript 函數以顯示 Power 值,一個 uint8(隨機生成,值從 0 到 100) HTML 檔案。不幸的是,我遇到了一個錯誤,我嘗試了各種方法來解決它,但沒有成功。合約和 JavaScript 已正確連接(如 connectContract() 函數所證明的那樣,這是對此的驗證),因此 ABI 和地址不是問題的一部分。 readContract() 函數應該使用 Solidity 合約中編寫的 getNFTPower 方法,但似乎出了問題:傳回值無效。但對我來說他們是哈哈...... 我還嘗試在第一行程式碼之前和之後在 readContract() 函數中插入一些 console.log 語句: const power = 等待 window.contract.methods.getNFTPower(tokenId).call(); 在該語句之後我沒有看到任何 console.log 輸出,因此問題似乎發生在那裡。
希望有人能給我提示..謝謝。
如下錯誤截圖
以下部分程式碼。
SOLIDITY程式碼
#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> ...
我嘗試以各種方式重寫函數 readContract(),但沒有幫助。我的目標是點擊「從合約中取得資料」按鈕並顯示我將作為參數傳遞的 NFT 的 tokenId 的 POWER 值(在上面的程式碼中,第一個 NFT,tokenId = 0)。
有兩個最常見的原因: