Contract-Development
為什麼我可以多次呼叫包含 selfdestruct 的合約方法?
以下程式碼是我正在使用的智能合約的一部分:
[...] 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 的一次呼叫,因為在那之後契約應該被銷毀(是的,我知道,程式碼仍然存在,但是狀態應該失去等等,對吧?)。在處理契約時,我發現我可以呼叫
complainAbouRoot
afternoComplain
,反之亦然,甚至noComplain
多次呼叫而不會出錯(tx 收據顯示“status=1”)。怎麼可能?如何發現智能合約是否已被銷毀?如果 selfdestruct 不阻止進一步的呼叫,它實際上有什麼好處?
正如 Laurie 所提到的,它的效果
selfdestruct()
是它創造了一個空白。使用者和契約可能認為那裡有契約(因為有),他們可能認為成功意味著功能按預期工作,但是……正如您自己發現的那樣,在不存在的合約中呼叫不存在的函式會返回
true
,因為無事可做。我不鼓勵使用,selfdestruct
因為幾乎在所有情況下都有更好的模式。看看這個解釋器:https ://blog.b9lab.com/selfdestruct-is-a-bug-9c312d1bb2a5
希望能幫助到你。