Contract-Development

為什麼我可以多次呼叫包含 selfdestruct 的合約方法?

  • May 23, 2020

以下程式碼是我正在使用的智能合約的一部分:

[...]
  function noComplain() allowed(receiver, stage.keyRevealed) public {
       selfdestruct(sender);
   }

   // function complain about wrong hash of file
   function complainAboutRoot(bytes32 _Zm, bytes32[depth] memory _proofZm) allowed(receiver, stage.keyRevealed) public {
       require (vrfy(2 * (n - 1), _Zm, _proofZm));
       require (cryptSmall(2 * (n - 1), _Zm) != fileRoot);
       selfdestruct(receiver);
   }
[...]

如您所見,有多個合約方法呼叫selfdestruct. 我希望只noComplain允許對 eg 的一次呼叫,因為在那之後契約應該被銷毀(是的,我知道,程式碼仍然存在,但是狀態應該失去等等,對吧?)。

在處理契約時,我發現我可以呼叫complainAbouRootafter noComplain,反之亦然,甚至noComplain多次呼叫而不會出錯(tx 收據顯示“status=1”)。

怎麼可能?如何發現智能合約是否已被銷毀?如果 selfdestruct 不阻止進一步的呼叫,它實際上有什麼好處?

正如 Laurie 所提到的,它的效果selfdestruct()是它創造了一個空白。使用者和契約可能認為那裡有契約(因為有),他們可能認為成功意味著功能按預期工作,但是……

正如您自己發現的那樣,在不存在的合約中呼叫不存在的函式會返回true,因為無事可做。我不鼓勵使用,selfdestruct因為幾乎在所有情況下都有更好的模式。

看看這個解釋器:https ://blog.b9lab.com/selfdestruct-is-a-bug-9c312d1bb2a5

希望能幫助到你。

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