# 12岁深圳小学生RandomDAO突变事件及其分析

By [afawo](https://paragraph.com/@meata12) · 2022-05-06

---

原文发布在 [https://github.com/33357/smartcontract-apps](https://github.com/33357/smartcontract-apps) 这是一个面向中文社区，分析市面上智能合约应用的架构与实现的仓库。欢迎关注开源知识项目！

**RandomDAO事件及其分析**

> 事件概要 2022年2月4日，12岁中国深圳小学生黄振（网传名）在 B站 和 twitter 上发布了自己的solidity教学视频，发布了自己的教学项目 RandomDAO。随着一些大V的转发，这个项目引起了币民们的注意。直到2022年2月8日，已经有超过47000个地址领取了他发布的空投代币 RND，并曾达到ETH消耗gas费排行第二。

> 事件分析 由于这是一个偏向技术的社群，因此我一般只关注技术方面的特点。黄振同学（暂且先这么称呼着）发布的 Random 合约只是一个普通的 ERC20 合约加一个空投逻辑，本来是不值得开篇文章说的。但是区块链网络上出现了一个随之而生的突变：[https://github.com/33357/airdrop\_multi\_claim](https://github.com/33357/airdrop_multi_claim) 这个合约实现了对 Random 合约空投的批量获取，并借此获取了大量收益 [https://etherscan.io/tx/0xfc1d5688c18244764fe3678020b4821a8c215c7a7f42685814b3cf49557967ff（保守估计30多个ETH）](https://etherscan.io/tx/0xfc1d5688c18244764fe3678020b4821a8c215c7a7f42685814b3cf49557967ff%EF%BC%88%E4%BF%9D%E5%AE%88%E4%BC%B0%E8%AE%A130%E5%A4%9A%E4%B8%AAETH%EF%BC%89), 这就非常值得我来好好研究一下它的实现逻辑了。

**合约分析—操作原理**

我们看到 [https://etherscan.io/address/0x1c7E83f8C581a967940DBfa7984744646AE46b29#code](https://etherscan.io/address/0x1c7E83f8C581a967940DBfa7984744646AE46b29#code) 上的获取空投函数是这样写的

    function claim() external{
        if( (uint32(block.timestamp)-release_time) <= 360 days && is_claim[msg.sender] == false ){
            is_claim[msg.sender] = true;
            yet_claim_people.push(msg.sender);
            _mint(msg.sender,return_claim_number());
        }   
    }
    

这里要求对职能的检查只有两个：

(uint32(blocktimestamp)-release) <=60天，领空投稿的时间需要在发布合同的360之3\_time。

is\_claim\[ms\_.ender\]=可以使用claim\[获取ms\_的地址的再地址。基础。

众筹创建签名领取奖牌

multi\_claim\_with\_selfdestruct.txt

在multi\_claim\_with\_selfdestruct.txt文件中，可以看到主方法调用的实现

公共函数调用（uint256 次）{  
for(uint i=0;i<times;++i){  
new claimer(contra);  
}  
} 这里通过for循环实现实现创建契约声明。

看claimer的约定的实现方式

对人{ 构造函数（地址对立）{ 空立）.claim();  
uint 余额余额支付=空投（这个地址）；airdrop(25.balanceOf（这个地址）； airdrop(contra).transfer((tx.origin), balance)；自毁（msg.RND代币 地址））；在获取（msg.RND代币地址） （msg.RND代币地址）代币合约 的代投合约，在获取RND之后的代投合约的代投合约，在RND代的代投合约，申领RND的代空投给构造函数中，调用空投的合约方法，而 投 提到了RND的代空。调用链自空合约约定。

multi\_claim.sol

在 multi\_claim.sol 文件中，可以看到它的实现逻辑和 multi\_claim\_with\_selfdestruct.txt 是一样的地址，还有一个额外的函数

function addressto(address \_origin, uint256 \_nonce) 内部纯返回 (address \_address) { 字节内存数据； if(\_nonce == 0x00) 数据 = abi.encodePacked(bytes1(0xd6), bytes1(0x94), \_origin, bytes1(0x80) ) ) ) ) ) ) )); 否则 if(\_nonce <= 0x7f) 数据 = abi.encodePacked(bytes1(0xd6), bytes1(0x94), \_origin, uint8(\_nonce)); 否则 if(\_nonce <= 0xff)数据=阿比 encodePacked ( bytes1 (0xd7), bytes1(0x94), \_origin, bytes1(0x81), uint8(\_nonce)); 否则 if(\_nonce <= 0xffff) 数据 = abi.encodePacked(bytes1(0xd8), bytes1( 0x94) ), \_origin , bytes1 (0x82), uint16(\_nonce)); 否则 if(\_nonce <= 0xffff) 数据 = abi.encodePacked(bytes1(0xd9), bytes1(0x94), \_origin, bytes1(0x83), uint24( \_nonce) ); 否则数据= abi .encodePacked(bytes1(0xda), bytes1(0x94), \_origin, bytes1(0x84), uint32(\_nonce)); bytes32 哈希 = keccak256（数据）；组件 {  
m(0)  
\_address : mload(0)  
}据预测，在发生此事件的地址，对部署下一个事件发生的我的人的合同发生 }}

契约者声明{ 构造函数（地址selfAdd，地址接收者）{ 地址对=地址（0xbb2A2D70d6a4B80FA2C4d4Ca43a8525da430196c）； 空投().claim();  
uint256 余额 = 空投（对抗）.balanceOf（selfAdd）； 要求（余额> 0，'哦不'）； airdrop(contra).transfer(receiver, balance); 在uint256 balance
=======================================================================================================================================================================================================================

airdrop(contra).balanceOf(selfAdd)中，selfAdd是预测出来的这个正确的合同地址，所以这里获取的平衡。claimer可以移除selfdestruct函数。

疑问

在 README.md 中，说 multi\_claim 自我实现了高效启动（一次交易能力希望理解）没有这种实现 EOA 机构的我是完整的，特别是做地址预测的目标和文件结构的使用，有很大的意识大佬们告诉一下，好填完这个坑。

**文章来源：微信公众号 作者：我是33357**

---

*Originally published on [afawo](https://paragraph.com/@meata12/12-randomdao)*
