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