cari

Rumah  >  Soal Jawab  >  teks badan

Isu dengan jenis pengembalian Solidity to Javascript

Pertama sekali, untuk memudahkan pemahaman masalah, saya hanya akan kekalkan fungsi yang lebih berguna untuk memahami masalah. Kod ini membenarkan mencipta NFT dalam tatasusunan, di mana NFT pertama mempunyai idToken 0. Apabila saya mengklik butang "Dapatkan data daripada kontrak", saya ingin menghantar parameter 0 kepada fungsi JavaScript readContract(tokenid) untuk memaparkan nilai Kuasa, uint8 (dijana secara rawak, nilai dari 0 hingga 100) fail HTML. Malangnya, saya menghadapi pepijat dan saya mencuba pelbagai cara untuk menyelesaikannya tanpa berjaya. Kontrak dan JavaScript disambungkan dengan betul (seperti yang dibuktikan oleh fungsi connectContract(), yang merupakan pengesahan ini), jadi ABI dan alamat bukan sebahagian daripada masalah. Fungsi readContract() sepatutnya menggunakan kaedah getNFTPower yang ditulis dalam kontrak Solidity, tetapi ada sesuatu yang tidak kena: nilai pulangan adalah tidak sah. Tetapi bagi saya mereka haha… Saya juga cuba memasukkan beberapa pernyataan console.log dalam fungsi readContract() sebelum dan selepas baris pertama kod: const power = tetingkap tunggu.contract.methods.getNFTPower(tokenId).call( Saya tidak nampak sebarang keluaran console.log selepas kenyataan itu, jadi masalah itu nampaknya berlaku di sana.

Semoga ada yang dapat memberi petunjuk..Terima kasih.

Tangkapan skrin ralat di bawah

Sebahagian daripada kod di bawah.

KOD KEPADUAN

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>
...

Saya cuba menulis semula fungsi readContract() dalam pelbagai cara, tetapi ia tidak membantu. Matlamat saya adalah untuk mengklik butang "Dapatkan data daripada kontrak" dan memaparkan nilai POWER tokenId NFT yang saya lalui sebagai parameter (dalam kod di atas, NFT pertama, tokenId = 0).

P粉482108310P粉482108310370 hari yang lalu461

membalas semua(1)saya akan balas

  • P粉262926195

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

    Terdapat dua sebab yang paling biasa:

    1. Jika anda menggunakan abi dan alamat kontrak adalah betul.
    2. Jika anda memilih rangkaian yang betul, contohnya, anda boleh memilih testnet jika kontrak anda di testnet, atau mainnet jika kontrak anda di mainnet.

    balas
    0
  • Batalbalas