Rückgabefunktionswert statt Transaktionsbeleg mit web3 [duplizieren]

Derzeit erhalte ich die Transaktionsquittung anstelle des Rückgabewerts von einer Vertragsfunktion mit web3. Gibt es trotzdem den tatsächlichen Rückgabewert eines Vertragsfunktionsaufrufs mit web3

Beispielcode

Solidität

pragma solidity ^0.4.22;
contract Testing {
    string name;
    function setName(string name) public returns(string) {
        name =name;
        return name;
    }

    function getName() public returns(string) {
        return name;
    }
}

JavaScript

myContract.methods.setName(Hello).send({
    from: 0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db,
    gas: 470000,
})
.then((receipt) => {
    console.log(receipt)  ==> not getting the result
    }
})
Ich denke, es ist einfach, einen Rückgabewert von einer Vertragsfunktion zu erhalten. Bitte geben Sie Ihren Quellcode an.

Antworten (2)

Wenn Sie eine Transaktion zum Vertrag ausstellen, erhalten Sie immer nur eine Quittung, da die Transaktion zuerst von der Blockchain verarbeitet werden muss. Nachdem es verarbeitet wurde, können Sie das Ergebnis mit den Transaktionsinformationen abfragen (web3 hat einige Abkürzungen dafür).

Da Ihre getNameFunktion nur Daten liest, können Sie sie mit dem viewSchlüsselwort kennzeichnen. Wenn eine Funktion eine viewFunktion ist, greift sie nicht auf die Blockchain zu und kann den Wert direkt von Ihrem Knoten lesen. Dann erhalten Sie anstelle einer Transaktionsquittung sofort das Ergebnis.

Wenn Sie den Wert der Solidity-Funktion mithilfe von Web3 zurückgeben möchten, müssen Sie die call()Methode anstelle von verwenden send().

In Ihrem Fall sollte die Änderung einfach sein:

myContract.methods.setName(Hello).call({
    from: 0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db,
    gas: 470000,
})
.then((result) => {
    console.log(result)
    }
})

Es ist jedoch wichtig zu beachten, dass call()nicht wirklich eine echte Transaktion gesendet wird. Stattdessen führt es die Operation im EVM Ihres Ethereum-Anbieters aus und gibt alle Fehler oder Werte zurück, die sich ergeben würden.

Eine Möglichkeit besteht darin, sowohl a call()als send()auch zuerst zu prüfen, ob das Ergebnis Ihren Erwartungen entspricht, und dann die eigentliche Transaktion tatsächlich zu senden.

Die andere Möglichkeit besteht darin, zu warten, bis Ihre Transaktion in einen Block aufgenommen wird, und dann den Status der Variablen, an der Sie interessiert sind, aus dem Vertrag auszulesen. Dies ist möglicherweise am effektivsten, indem Sie ein Ereignis von der Funktion ausgeben und auf dieses Ereignis warten um zu überprüfen, wann die Transaktion ausgeführt wurde.