Solidity
銷毀智能合約並收集其資金
我對智能合約/Solidity 很陌生,我正在為研究生課程學習。
在其中一項任務中,我們必須實現一個荷蘭拍賣的簡短範例(wiki 連結)。現在我的問題是,在一種方法中,具體來說
finalize()
,契約的所有者必須銷毀它並收集它的資金。這是我的程式碼:function finalize() public creatorOnly biddingClosedOnly { selfdestruct(_creator); if(finalPrice > 0) { _creator.transfer(finalPrice); } }
契約的其餘方法在 Remix 中執行良好,但是當我呼叫
finalize
方法時,智能合約沒有被破壞並且仍然存在,因此任何人都可以像以前一樣呼叫其他函式。我究竟做錯了什麼 ?
您需要做的就是擁有該
selfdestruct(address payable recipient)
功能。selfdestruct
接受一個參數,將合約中的所有 ETH 發送到該地址。在您的情況下,您可以執行以下操作:function finalize() public creatorOnly biddingClosedOnly { selfdestruct(_creator); }
從文件:
selfdestruct(address payable recipient)
:銷毀目前合約,將其資金發送到給定地址您仍然可以在合約被編輯後
selfdestruct
呼叫該函式的原因是因為從技術上講地址仍然有效。但是,不再存在契約(數據)。因此,您仍然可以將 ETH 發送到該地址,並且您仍然可以將帶有數據的交易發送到該地址,但 EVM 不會像使用非
selfdestruct
地址地址那樣執行該功能。編輯:您可以使用
get_code
RPC 方法來驗證契約是否實際上已被銷毀。使用 ethers.js,將給出以下輸出:
// Deploy contract ethersProvider.getCode('0xDCcd6331401b62ebcE7F3a22e966b26ACe27559d').then(console.log) > 0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634bb278f3146044575b600080fd5b348015604f57600080fd5b5060566058565b005b3373ffffffffffffffffffffffffffffffffffffffff16ff00a165627a7a7230582077ca7684f4d93293e360c5c695d0e416f54dde89713426cc4d6fddb9f9963faa0029 // Self destruct contract ethersProvider.getCode('0xDCcd6331401b62ebcE7F3a22e966b26ACe27559d').then(console.log) > 0x