Solidity

function.call() 在松露測試中的行為與 function() 不同

  • December 16, 2017

我正在使用 Truffle 4.0.1 和 Node 9.2.1

在我的solidity智能合約中,我有一個功能

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

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

   isFinalized = true;
}

在我的測試中,我有以下

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

哪個輸出

isFinalized false

如果我將程式碼更改為閱讀

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

然後它輸出

isFinalized true

為什麼有區別?

在第一個範例中,當您執行 await contract.finalize.call() 時,使用 call() 執行函式而不修改狀態,這使得在函式呼叫內部對狀態變數進行的更改“未保存”。

您應該使用 .call() 來執行不修改狀態變數的常量/視圖/純函式。使用松露,您甚至可以放棄 .call()。

如果 Solidity 函式被標記為 view/constant/pure,truffle 會知道你只是在嘗試讀取一個值而不是修改任何東西。

引用自:https://ethereum.stackexchange.com/questions/33154