Solidity

銷毀智能合約並收集其資金

  • May 23, 2020

我對智能合約/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_codeRPC 方法來驗證契約是否實際上已被銷毀。

使用 ethers.js,將給出以下輸出:

// Deploy contract

ethersProvider.getCode('0xDCcd6331401b62ebcE7F3a22e966b26ACe27559d').then(console.log)
> 0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634bb278f3146044575b600080fd5b348015604f57600080fd5b5060566058565b005b3373ffffffffffffffffffffffffffffffffffffffff16ff00a165627a7a7230582077ca7684f4d93293e360c5c695d0e416f54dde89713426cc4d6fddb9f9963faa0029

// Self destruct contract

ethersProvider.getCode('0xDCcd6331401b62ebcE7F3a22e966b26ACe27559d').then(console.log)
> 0x

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