Solidity
function.call() 在松露測試中的行為與 function() 不同
我正在使用 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 會知道你只是在嘗試讀取一個值而不是修改任何東西。