Maison  >  Questions et réponses  >  le corps du texte

Problèmes avec les types de retour Solidity to Javascript

Tout d'abord, afin de faciliter la compréhension du problème, je ne conserverai que les fonctions les plus utiles à la compréhension du problème. Ce code permet de créer des NFT dans un tableau, où le premier NFT a un idToken de 0. Lorsque je clique sur le bouton "Obtenir les données du contrat", je souhaite transmettre le paramètre 0 à la fonction JavaScript readContract (tokenid) pour afficher la valeur Power, un fichier HTML uint8 (généré aléatoirement, valeur de 0 à 100). Malheureusement, j'ai rencontré un bug et j'ai essayé différentes manières de le résoudre sans succès. Le contrat et JavaScript sont correctement connectés (comme en témoigne la fonction connectContract(), qui en est une vérification), donc l'ABI et l'adresse ne font pas partie du problème. La fonction readContract() est censée utiliser la méthode getNFTPower écrite dans le contrat Solidity, mais quelque chose ne va pas : la valeur de retour n'est pas valide. Mais pour moi, ils le sont haha… J'ai également essayé d'insérer des instructions console.log dans la fonction readContract() avant et après la première ligne de code : const power = attendre window.contract.methods.getNFTPower(tokenId).call(); Je ne vois aucune sortie console.log après cette instruction, donc le problème semble se produire là-bas.

J'espère que quelqu'un pourra me donner un indice..Merci.

La capture d'écran d'erreur ci-dessous

Partie du code ci-dessous.

CODE SOLIDITÉ

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

J'ai essayé de réécrire la fonction readContract() de différentes manières, mais cela n'a pas aidé. Mon objectif est de cliquer sur le bouton "Obtenir les données du contrat" ​​et d'afficher la valeur POWER du tokenId du NFT que je passe en paramètre (dans le code ci-dessus, le premier NFT, tokenId = 0).

P粉482108310P粉482108310276 Il y a quelques jours392

répondre à tous(1)je répondrai

  • P粉262926195

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

    Il y a deux raisons les plus courantes :

    1. Si vous utilisez abi et que l'adresse du contrat est correcte.
    2. Si vous choisissez le bon réseau, par exemple, vous pouvez choisir testnet si votre contrat est sur testnet, ou mainnet si votre contrat est sur mainnet.

    répondre
    0
  • Annulerrépondre