Solidity

如何測試包括selfdestruct()在內的kill函式?

  • March 19, 2019

那裡。

我在下面編寫kill函式:

function kill() public onlyOwner returns (bool) {
 selfdestruct(msg.sender);     
 return true;
}

和我的單元測試程式碼:

function testOwnerCanKillContract() public {
 XToken xtn = XToken(DeployedAddresses.XToken());
 bool isKilled = nmt.kill();
 Assert.equal(isKilled, true, "Owner should have to kill contract with selfdestruct.");
}

但是,在 $ truffle 測試之後,測試失敗並返回錯誤:

Error: Returned error: VM Exception while processing transaction: revert

那麼有誰知道如何解決這個問題或任何想法?

而且,我的環境在這裡:Truffle v5.0.5 (core: 5.0.5) Solidity v0.5.0 (solc-js) Node v10.9.0

提前致謝!

我不太明白程式碼。看起來應該是xtn.kill();

在任何情況下,kill 都會清除狀態和字節碼。如果我沒記錯的話,這return一步永遠不會發生,因為契約被抹殺了。

如果是這種情況,對合約的任何呼叫都應該失敗。這是一種粗略的測試方法。

  1. 您可以測試它是否按預期恢復。一種“現在你看到了,再見,現在你不處理”。您的測試會堅持呼叫/交易必須恢復才能稱其為成功。您將使用相同的模式來確認只有所有者才能使用onlyOwner功能,即測試不應該發生的事情實際上永遠不會發生。
  2. msg.sender您可以通過比較發送方和合約的前後餘額來確認收到的餘額。這是其中的一部分。
  3. 您可以確認該地址不再存在字節碼。在這裡查看接受的答案。因此,響應必須是0x如何檢測地址是否為合約?.

除非你有一個非常好的理由,否則我傾向於使用可暫停模式來避免在區塊鏈上創建令人討厭的空白。自毀是一種殘酷的方式,可能會導致麻煩。

希望能幫助到你。

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