# 科学分析之如何撸空某项目红包奖池

By [b1oc4](https://paragraph.com/@b1oc4) · 2024-02-17

---

1\. 背景
------

在春节期间，某项目开启了送红包活动，奖池数量为8k个代币，其中领取奖励分为0.1，1，10，100，四个档位

2\. 分析
------

首先进行一次正常领取红包交互，我们会发现项目方并没有做任何限制，只要向合约**_0xaaaffffffffffffffff8_**去调用**_0xffffffff_**方法，合约就会返回随机数量的代币。

注意这里项目方并没有做任何的限制，那么现在就意味着我们可以使用**任意EVM地址**调用合约领取一次红包。

至于奖池中代币数量如何查看，通过区块链浏览器中可以看到这个合约所持有的ERC20代币数量为8K。

![](https://storage.googleapis.com/papyrus_images/9730646dfe6f9377bcc705167e2908857dfa484f5ba168e7a8f73d9c7a246cb9.png)

3\. 代码
------

开始编写代码， 思路很清晰

我需要：

1.  生成N个地址
    
2.  分发Gas到N个地址
    
3.  调用合约领取红包
    
4.  归集
    

### 1\. 生成N个地址

第一个很简单，直接使用Ethers.js的createRandom()来生成1.2W个以太坊钱包，代码如下

![](https://storage.googleapis.com/papyrus_images/6123da9ef19ba7964741905ce2556bfb748567d01b502d798168012563b43631.png)

### 2\. 分发Gas到N个地址

从seeds.txt中读取地址后并发送交易，发送交易的方式每个人都有各自的实现方式，这里不多赘述

![](https://storage.googleapis.com/papyrus_images/4ba950ce71b38e08355a44e2a9dc42818c5adcd4bc5d4700c69f65d5edc4dd32.png)

![](https://storage.googleapis.com/papyrus_images/336d0b8a2f80a2a4ae54c7939418479295f5411ac57b4daab56255c4a53bc319.png)

### 3\. 调用合约领取红包

原理依旧是发送交易，但是增加一个data字段来调用领取红包方法（对，就是打铭文时的十六进制，只不过可以通过这个十六进制调用合约的方法）

![](https://storage.googleapis.com/papyrus_images/60bbb1519a849d44de40653abc5bbaf9fd93a259d745ddbdc75434cb3557e907.png)

### 4.归集

最后的归集，因为归集的是ERC20代币，所以我直接通过对应合约的ABI方式来归集

![](https://storage.googleapis.com/papyrus_images/e997ddff85c993f697f16a69b028177d4f6df01958a19a6be7a501b57fd0fd80.png)

给大家看一下hash，第一笔分发gas，第二笔调用合约，第三笔归集，十分简单明了

![](https://storage.googleapis.com/papyrus_images/fb40e5dbf450103474f6522ecdfc3ae9d457b16e6a542b9c4986fc42641a1de7.png)

收获
--

最后通过1.2w个地址拿到了N个币，本文结束

![](https://storage.googleapis.com/papyrus_images/6ccbd12f87f0d43e30e96a0317bfb3b397ce2d7b356f1decfb86c746e64e1323.png)

---

*Originally published on [b1oc4](https://paragraph.com/@b1oc4/xnlLcI859VxL3wCX77NS)*
