首頁  >  問答  >  主體

從 Solidity 到 Javascript 回傳類型的問題

首先,為了方便理解問題,我將只保留對理解問題更有用的函數。該程式碼允許在數組中建立 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粉482108310P粉482108310276 天前393

全部回覆(1)我來回復

  • P粉262926195

    P粉2629261952024-01-17 22:42:01

    有兩個最常見的原因:

    1. 如果您使用 abi 並且合約地址正確。
    2. 如果您選擇了正確的網絡,例如,如果您的合約位於測試網,您可以選擇測試網,或者如果您的合約位於主網,請選擇主網。

    回覆
    0
  • 取消回覆