function.call() verhält sich anders als function() im Trüffeltest

Ich verwende Truffle 4.0.1 und Node 9.2.1

In meinem Solidity Smart Contract habe ich eine Funktion

function finalize() public onlyOwner {
    require(!isFinalized);

    finalization(); // does some stuff
    Finalized();

    isFinalized = true;
}

In meinem Test habe ich folgendes

await contract.finalize.call()
const isFinalized = await contract.isFinalized.call()
console.log('isFinalized', isFinalized)

welche Ausgänge

isFinalized false

Wenn ich meinen Code zum Lesen ändere

const tx = await contract.finalize()
const isFinalized = await contract.isFinalized.call()
console.log('isFinalized', isFinalized)

dann gibt es aus

isFinalized true

Warum gibt es einen Unterschied?

nicht wirklich ein Duplikat, da es in meinem Kontext mehr ums Testen geht, obwohl diese Frage erklärt, was los ist, also danke.

Antworten (1)

Wenn Sie im ersten Beispiel await contract.finalize.call() mit call() ausführen, wird die Funktion ausgeführt, ohne den Zustand zu ändern, wodurch die Änderungen an Zustandsvariablen, die innerhalb des Funktionsaufrufs vorgenommen werden, "nicht gespeichert" werden.

Sie sollten .call() verwenden, um Constant/View/Pure-Funktionen auszuführen, die Zustandsvariablen nicht ändern. Bei truffle kann man sogar auf die .call() verzichten.

Wenn die Solidity-Funktion als view/constant/pure markiert ist, weiß Truffle, dass Sie nur versuchen, einen Wert zu lesen und nichts zu ändern.

Ich benutze es, callweil solcovich es will. Hat etwas damit zu tun, wie es den Solidity-Code instrumentiert.
Kleines Internet. Ich habe nur viel Zeit damit verschwendet, bin aufgewacht, frisch im Kopf, jetzt verstehe ich das Problem :) ethereum.stackexchange.com/questions/16796/…