Smart Contract-Fehler: Zurückgegebene Werte sind nicht gültig, ist das Gas ausgegangen?

Bereitstellung eines Vertrags mit Remix IDE für Rinkeby Testnet.

Adresse und Code des Etherscan-Vertrags finden Sie hier .

Vertrag SimpleCounter {
    int-Zähler;

    Konstruktor() öffentlich {
        Zähler = 0;
    }

    Funktion getCounter() öffentliche Ansicht gibt zurück (int){
        Rückgabezähler;
    }

    Funktionsinkrement() öffentlich {
        Zähler += 1;
    }

    Funktion Dekrement() öffentlich {
        Zähler -= 1;
    }
}

JavaScript-Client-Code:

    var-Vertrag;

    $(Dokument).ready(Funktion(){
        initContract();
        getCounterValue();
    })

    Funktion initContract(){
        web3 = neues Web3 (web3.aktueller Anbieter);

        var address = "0xc6482382047fb50e8e7b4658425c9756b28f995c";
        var abi = [
                    ...
                    ];

        console.log('Vertrag erstellen...');
        Vertrag = new web3.eth.Contract(abi, address);
        console.log (Vertrag)

    } //initContract()


    Funktion getCounterValue(){
        console.log('getCounter()...');
        Vertrag.Methoden.getCounter().call().then((Ergebnis) => {
            console.log (Ergebnis);
        }).catch(Funktion(err){
            console.log('err...\n'+err);
        });
    }

Fehler:

Vertrag erstellen...

(index):86 o {_requestManager: e, GivenProvider: MetamaskInpageProvider, Anbieter: {…}, _provider: MetamaskInpageProvider, …}

(index):94 getCounter()...

(Index): 99 Fehler ...

Fehler: Zurückgegebene Werte sind ungültig, ist das Benzin ausgegangen?

HINWEIS:

Dies funktioniert gut in Remix IDE (Chrom). Ich kann inkrementieren/dekrementieren/getCounter... mit Compiler-Version:0.4.25+commit.59dbf8f1.Emscripten.clang .

Warum schlägt es fehl, wenn mit ' dist/web3.min.js ' von Web3.js (Branch 1.0) darauf zugegriffen wird?

Antworten (8)

Ich habe den ähnlichen Fehler behoben, indem ich .jsonDateien aus dem Ordner build/contracts gelöscht und dann truffle migrateim Terminal ausgeführt habe.

Der Fehler trat jedoch in Visual Studio Code auf, nicht in der Remix-IDE. Es erschien nach dem Laufen truffle migrate --reset.

Ich möchte diesen Kommentar ergänzen, nachdem Sie .jsonDateien aus dem Ordner „Build/Contracts“ gelöscht haben, blieb das Problem bestehen, bis ich Dateien aus dem Papierkorb gelöscht habe🗑 😅 Stellen Sie also sicher, dass der Papierkorb leer ist

@monkrus Das Problem, das ich gemeldet hatte, war auf die Verwendung von "Kontoadresse" anstelle von "Vertragsadresse" zurückzuführen! . Löschen .jsonwürde das nicht beheben. Möglicherweise möchten Sie zusammen mit dem Fehler „genaues Problem“ hinzufügen, um „Ihr Szenario“ und die zugehörige Lösung zur Verdeutlichung zu unterscheiden.
@Ismael Danke für den Hinweis. Um mehr Klarheit zu schaffen ... das Problem funktionierte in Remix IDE, aber nicht in benutzerdefiniertem JavaScript-Code.

Ich bekam Hilfe von Veniamin .

Ich hatte den Fehler „Fehler: ABI konnte nicht dekodiert werden: 0x.“ bei Anruf Anfrage mit falscher Vertragsadresse bekommen

Ich habe einen Fehler gemacht ... Ich habe "Kontoadresse" anstelle von "Vertragsadresse" verwendet!

Der Code funktioniert, sobald die richtige 'Vertragsadresse' verwendet wurde.

Es ist erwähnenswert, dass sich die Adresse des Vertrags von der Adresse des Kontos unterscheidet, das den Vertrag erstellt, und sie wird generiert, wenn der Vertrag erstellt wird.
Ich denke, jeder Neuankömmling hat diesen Fehler gemacht. Es ist sehr verwirrend, welche Adresse an welchem ​​Ort benötigt wird.

Hatte das gleiche Problem und es stellte sich heraus, dass ich im Metamask Mainnet statt in Rinkeby war, wo mein Vertrag bereitgestellt wurde.

Ich war nicht einmal bei Metamask angemeldet.
Das Wechseln des Netzwerks hat das Problem behoben, machen Sie es.

Dein Code scheint korrekt zu sein. Ich denke, Ihr Problem ist auf einen Web3js-Fehler zurückzuführen. Sehen Sie sich das in Github gemeldete Problem an:

https://github.com/ethereum/web3.js/issues/1916

Ich empfehle Ihnen, stattdessen web3.js 1.0.0-beta.35 zu verwenden.

Auf Version web3.js 1.0.0-beta.35 umgestellt. Aber diesmal ist der Fehler anders: Error: Couldn't decode from ABI: 0x.
Überprüfen Sie Ihre Vertragsadresse
Bereits behoben. Habe meine Antwort unten hinzugefügt. Habe Hilfe von GitHub bekommen.

Diesen Fehler hatte ich auch. Es wurde behoben, nachdem ich meine web3-Version auf 2.0.0-alpha geändert hatte, was vorher 1.0.0-beta.55 war.

  1. Deinstallieren Sie also einfach Ihr web3 mit npm uninstall web3.
  2. Installieren Sie dann npm web3@2.0.0-alpha.

Hoffentlich wird dies das Problem für Sie beheben.

In meinem Fall (ich verwende den Azure-Blockchain-Dienst) habe ich meine Vertragsdatei geändert, aber den Build vergessen und ihn erneut für meinen Azure-Blockchain-Dienst bereitgestellt. Stattdessen springe ich truffle execdirekt zum Befehl. Nachdem ich diese beiden fehlenden Schritte erneut ausgeführt habe, funktioniert alles einwandfrei.

Das ist mir in meiner React-App passiert.

Ich habe für einen Vertrag mit dem Ropsten-Netzwerk bereitgestellt, aber Metamask hat das Rinkeby-Konto verwendet. Stellen Sie also sicher, welches Netzwerk Sie bereitgestellt haben, Metamask sollte ein Konto aus diesem Netzwerk verwenden.

Ein anderes Mal hatte ich das in next.js. Diese Route ist eine dynamische Route, dh der Vertrag wird von ${contractAddress} abgerufen:

      Router.push(`/campaigns/${recipient}/requests`);

Anstelle der {recipient}Adresse musste ich die Adresse des Vertrages zum Abrufen eingeben

+1 dazu. Ich hatte immer noch den ropsten Alchemy-Endpunkt in meiner .env-Datei für meine React-App konfiguriert, aber vergessen, dass ich ihn im Rinkeby-Testnet neu bereitgestellt hatte. Das hat mich fast 2 Tage lang geplagt. Vielen Dank für diesen Vorschlag!

In meinem Fall habe ich eine "View"-Methode eines Vertrags aufgerufen, der in einem lokalen Hardhat bereitgestellt wird.

und mein nodejs-Code sieht so aus: contract.methods().getterName().call()und bekam diesen Fehler.

Ich habe Stunden damit verbracht und kein Glück. Schließlich habe ich zu Rinkeby Test Network gewechselt, den Vertrag bereitgestellt und die Methode "view" mit fast demselben Code aufgerufen, alles geht gut.

also die lösung ist:

Wenn Sie HardHat verwenden und auf dieses seltsame Problem stoßen, wechseln Sie zu Rinkeby!