从 Solidity 到 Javascript 返回类型的问题
P粉482108310
P粉482108310 2024-01-17 00:12:18
0
1
387

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

P粉482108310
P粉482108310

全部回复(1)
P粉262926195

有两个最常见的原因:

  1. 如果您使用 abi 并且合约地址正确。
  2. 如果您选择了正确的网络,例如,如果您的合约位于测试网,您可以选择测试网,或者如果您的合约位于主网,则选择主网。
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!