首先,为了便于理解问题,我将只保留对理解问题更有用的函数。该代码允许在数组中创建 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)。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
有两个最常见的原因: