Zweifel an der Ausführung der Javascript-Funktion

Hallo Leute, ich habe diese Vertragsfunktion:

function teste(uint _oX) public returns (uint value) {
    return 34;
}

Und ich versuche, JS auf diese Weise aufzurufen:

 MyContract.teste(1).then(value => console.log(value) );  

Aber ich habe stattdessen den Wert 34 erhalten:

{blockHash: "0xd43e64033fdc8058be7da224059f15ef5f3268813294f2a9087a747d1ed674da", blockNumber: 2600, contractAddress: null, cumulativeGasUsed: 21722, from: "0xc5a5d47b525851bde4811aa870a331024156eeec", …}blockHash: "0xd43e64033fdc8058be7da224059f15ef5f3268813294f2a9087a747d1ed674da"blockNumber: 2600contractAddress: nullcumulativeGasUsed: 21722events: {}from: "0xc5a5d47b525851bde4811aa870a331024156eeec"gasUsed: 21722logsBloom : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"status: "0x1"to: "0x7b475783cee479de3b270193b61450c649b2abef"transactionHash: "0x4455026eeae746f58e49f977f42597321426f9fe6cc3818deffac63dd9c61909"transactionIndex: 0__proto__: ObjectObjektObjekt

jemand kann mir dabei helfen :| Tank dich

Antworten (1)

Ethereum-Verträge haben zwei Aufrufmethoden.

Eine Möglichkeit besteht darin, den lokalen Knoten und seine Kopie der Blockchain schreibgeschützt abzufragen. Dieser Weg wird 34wie erwartet zurückkehren.

Die andere Möglichkeit besteht darin, eine Transaktion an das Netzwerk zu senden, die möglicherweise den Vertragsstatus ändert. Auch wenn Ihre Funktion nichts speichert, würde eine solche Transaktion dennoch zirkulieren und abgebaut werden und in einem Block auftauchen, sodass sich alle Knoten darauf einigen können, dass nichts passiert ist.

Sie verwenden die zweite Methode, also erhalten Sie Informationen über die gesendete Transaktion, ihren Erfolg, den Transaktions-Hash, die Blocknummer ... alle möglichen Dinge außer 34. Dies liegt daran , dass returnauf Werte mit dieser Methode nicht zugegriffen werden kann.

Was Sie wollen, ist, den Vertrag zu lesen. Es gibt zwei Möglichkeiten, dies zu tun.

Sie können den Vertrag in Ruhe lassen und die Funktion mit der .call()Methode aufrufen, um explizit zu sagen, dass der Client möchte, dass es sich um eine schreibgeschützte Operation handelt, und Sie möchten tatsächlich 34.

MyContract.teste.call(1).then(value => console.log(value) );

Sie können dieses Verhalten in den Vertrag einbacken, was eine gute Form für Funktionen ist, die nichts mit dem Staat tun, dh den Staat überprüfen sollen. pureist rein rechnerisch und benötigt keinen Zugriff auf den Status und viewist schreibgeschützt, benötigt jedoch Zugriff auf den Status.

function teste(uint _oX) public pure returns (uint value) { return 34; } Mehr dazu: https://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

Weiter, weiter. Die Antwort wird eine seltsam aussehende Sache sein. Es ist eine "bigNumber" (separates Thema), da JavaScript die 256-Bit-Ganzzahlen von Ethereum nicht verarbeiten kann. Sie können es so entpacken und Sie sollten 34.

console.log(value.toString(10));

Ich hoffe es hilft.

Tank du Rob, das hilft mir wirklich :)