首先,为了便于理解问题,我将只保留对理解问题更有用的函数。该代码允许在数组中创建 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)。
有两个最常见的原因: