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?
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.
call
weil solcov
ich es will. Hat etwas damit zu tun, wie es den Solidity-Code instrumentiert.
David Sag