Solidity 自毁合约 selfdestruct

Solidity 自毁函数 selfdestruct 由以太坊智能合约提供,用于销毁区块链上的合约系统。

当合约执行自毁操作时,合约账户上剩余的以太币会强制发送给指定的目标,然后其存储和代码从状态中被移除。

所以,Solidity selfdestruct 做两件事。

  • 它使合约变为无效,有效地删除该地址的字节码。
  • 它把合约的所有资金强制发送到目标地址。

销毁合约示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Kill {
    function kill() external {
        selfdestruct(payable(msg.sender));
    }

    function test() external pure returns(uint) {
        return 100;
    }
}

部署后,先调用 test 函数,将会输出 100。然后调用 kill 函数,再次调用 test 函数,结果输出为 0,表明合约被销毁。

强制发送资金示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Kill {
    function kill() external {
        selfdestruct(payable(msg.sender));
    }

    function test() external pure returns(uint) {
        return 100;
    }
}

部署后,先调用 test 函数,将会输出 100。然后调用 kill 函数,再次调用 test 函数,结果输出为 0,表明合约被销毁。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Kill {
    constructor() payable {}

    function kill(address payable to) external {
        selfdestruct(to);
    }
}

contract Receive {
    function getBalance() external view returns(uint) {
        return address(this).balance;
    }
}

首先部署 Receive 合约,用于接收资金。再部署 Kill 合约,初始转入 Eth 123 wei,然后调用 kill 方法,并将 Receive 的地址作为参数。

我们通过 Receive 合约的 getBalance 方法查看余额,资金为 123 wei。

Receive 合约没有定义 fallback 和 receive 函数,正常情况下无法接收资金,但依然被 Receive 合约的 selfdestruct 方法强制转入了资金。

Solidity 的哈希算法使用一个内置函数 keccak256。keccak256函数原型:keccak256(bytes) returns (bytes32)// SPDX-License ...