Heim  >  Fragen und Antworten  >  Hauptteil

Probleme mit Solidity-zu-Javascript-Rückgabetypen

Um das Verständnis des Problems zu erleichtern, behalte ich zunächst nur die Funktionen bei, die für das Verständnis des Problems nützlicher sind. Dieser Code ermöglicht die Erstellung von NFTs in einem Array, wobei der erste NFT einen idToken von 0 hat. Wenn ich auf die Schaltfläche „Daten aus Vertrag abrufen“ klicke, möchte ich den Parameter 0 an die JavaScript-Funktion readContract(tokenid) übergeben, um den Power-Wert anzuzeigen, eine uint8-HTML-Datei (zufällig generiert, Wert von 0 bis 100). Leider bin ich auf einen Fehler gestoßen und habe auf verschiedene Arten versucht, ihn zu beheben, ohne Erfolg. Der Vertrag und JavaScript sind korrekt verbunden (was durch die Funktion connectContract() bewiesen wird, die dies überprüft), sodass ABI und Adresse nicht Teil des Problems sind. Die Funktion readContract() soll die im Solidity-Vertrag geschriebene Methode getNFTPower verwenden, aber etwas scheint nicht zu stimmen: Der Rückgabewert ist ungültig. Aber für mich sind sie haha... Ich habe auch versucht, vor und nach der ersten Codezeile einige console.log-Anweisungen in die Funktion readContract() einzufügen: const power = wait window.contract.methods.getNFTPower(tokenId).call(); Ich sehe nach dieser Anweisung keine Ausgabe von console.log, daher scheint das Problem dort aufzutreten.

Ich hoffe, jemand kann mir einen Hinweis geben. Danke.

Der Fehler-Screenshot unten

Teil des Codes unten.

SOLIDITÄTSCODE

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

Ich habe versucht, die Funktion readContract() auf verschiedene Arten umzuschreiben, aber es hat nicht geholfen. Mein Ziel ist es, auf die Schaltfläche „Daten aus Vertrag abrufen“ zu klicken und den POWER-Wert der tokenId des NFT anzuzeigen, den ich als Parameter übergebe (im Code oben der erste NFT, tokenId = 0).

P粉482108310P粉482108310276 Tage vor390

Antworte allen(1)Ich werde antworten

  • P粉262926195

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

    有两个最常见的原因:

    1. 如果您使用 abi 并且合约地址正确。
    2. 如果您选择了正确的网络,例如,如果您的合约位于测试网,您可以选择测试网,或者如果您的合约位于主网,则选择主网。

    Antwort
    0
  • StornierenAntwort