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).
有两个最常见的原因: