---
title: "獵人狩獵：如何找出空投獵人"
description: "在 Hop Exchange 的 Airdrop Hunter Bounty 活動中，跟著 Alchemy 的 Issac Lau 使用 Trace API，學習如何在 Hop Exchange 空投前找出發動女巫攻擊的空投獵人。"
---

# 獵人狩獵：如何找出空投獵人

以往，各種協議和區塊鏈網路都是靠代幣的承諾來吸引使用者和流動性，前提是先做到產品市場契合（product-market fit）。這些代幣代表兩種主要誘因：

1. 對產品發展方向的治理權
1. 金錢上的分配

對 web2 最常見的批評之一，就是使用者對他們所貢獻、所參與的網路和應用程式毫無所有權可言。

Web3 提供了另一種以社群為基礎的所有權模式，而代幣正是這個新典範的核心要素之一。

考量到社群導向思維在代幣分配上的重要性，web3 專案會設法將代幣空投（airdrop，即分發）給對產品成功有切身利益、積極參與社群的成員。

關於誰算是「積極參與社群的成員」，目前仍存在著活躍且合理的爭論，但有一種角色絕對是不折不扣的惡意行為者——也就是利用 sybil 攻擊的使用者和機器人。

## 什麼是 sybil 攻擊？
Sybil 攻擊是指利用單一網路節點，在點對點（P2P）網路中同時操作多個虛假身分。

Sybil 攻擊會導致少數網路行為者獲得不成比例的影響力，若放在空投的情境下，意味著他們能拿到更大份額的治理代幣。

就空投獵人的行為而言，這代表著以不真實的方式與協議和合約互動。

## Hop exchange 的空投獵人對策
雖然過去許多空投都未能真正有效遏止惡意行為者，但 Hop Exchange 推出了一種新機制，借助社群成員的力量來減少 sybil 攻擊的影響：

<CalloutBlock>

_「我們正在接受尚未被發現的 Sybil 位址檢舉。當_[_Hop DAO_](https://hop.mirror.xyz/AI5fOUR0X_l0mktShDOx3mwr-hsB24gp8GvTWtS-MBc)_上線後，我們會提出一項提案，將因此節省下來的代幣中的 25% 獎勵給檢舉 Sybil 位址的人——但須遵守一年的鎖倉期。檢舉將會被審核，獎勵則依先到先審的原則計算。」_

</CalloutBlock>

作為最早以社群為基礎、獎勵「空投獵人的獵人」的舉措之一，Hop 徹底發揮了 web3 開發者社群的力量，其中也包括我自己。

接下來，就讓我們深入了解[我為 Hop DAO 去中心化工作所做的貢獻](https://github.com/hop-protocol/hop-airdrop/issues/377)。

### 發掘空投獵人
以下是我所辨識出、屬於 sybil 攻擊一部分的位址圖形化呈現。

<ImageBlock
  src="https://media.alchemy.com/1704708401-sybil-attack-visualization.png"
  alt="Sybil 攻擊視覺化。"
  width={1409}
  height={1373}
  caption="Sybil 攻擊視覺化。"
/>

**以下說明如何解讀這張 sybil 攻擊視覺化圖表：**

圖中每個位址都是一個節點，所有顯示出來的位址都透過鏈上轉帳彼此相連，每條邊即代表一筆轉帳。

該 sybil 攻擊者展現出兩種明顯的模式：藍色的邊代表**模式一**，綠色的邊則代表**模式二**。

橘色節點代表在所有發生轉帳的 sybil 帳戶之間充當鏈上連接的位址，由於這些位址偏離了本報告所述的兩種主要模式，因此也被納入提交名單中。

#### 模式 \#1
所有由藍色邊連接的位址，都是利用 Hop Exchange 在 Gnosis Chain（原 xDai）和 Polygon 之間來回「乒乓」轉帳。

每個位址都明顯出現以約 1000 美元 $USDC 計價的 Hop 交易（其中 1 筆為 $USDT），每筆交易金額上下浮動約 250 美元，依序在兩條鏈之間交叉往返。

此外，每個位址內的每批交易都是在非常短的時間跨度內完成（大約 1-3 小時）。

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Date", dataType: "object" },
      { key: "2", width: 200, title: "Source", dataType: "object" },
      { key: "3", width: 200, title: "Destination", dataType: "object" },
      { key: "4", width: 200, title: "Transfer ID", dataType: "object" },
      { key: "5", width: 200, title: "Transfer Tx", dataType: "object" },
      { key: "6", width: 200, title: "Token", dataType: "object" },
      { key: "7", width: 200, title: "Amount", dataType: "object" },
      { key: "8", width: 200, title: "Amount USD", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>7 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xc2f05f...e38d7f</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x0d641e...ef4d42</p>", tooltip: "", icon: "" },
        "6": { title: "<p>USDC</p>", tooltip: "", icon: "" },
        "7": { title: "<p>695.2042</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$695.472</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>7 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x9d6c1c...bc8403</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0xcc434d...eea07c</p>", tooltip: "", icon: "" },
        "6": { title: "<p>USDC</p>", tooltip: "", icon: "" },
        "7": { title: "<p>697.0148</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$697.284</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>7 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x5bcd1a...53ec67</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x7664cf...052e68</p>", tooltip: "", icon: "" },
        "6": { title: "<p>USDC</p>", tooltip: "", icon: "" },
        "7": { title: "<p>698.8394</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$699.109</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>7 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xe2e215...724de6</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0xdf5036...189bc4</p>", tooltip: "", icon: "" },
        "6": { title: "<p>USDC</p>", tooltip: "", icon: "" },
        "7": { title: "<p>700.6709</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$700.941</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>7 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x59b08c...9c0e37</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x97aed4...01b3d7</p>", tooltip: "", icon: "" },
        "6": { title: "<p>USDC</p>", tooltip: "", icon: "" },
        "7": { title: "<p>702.5039</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$702.775</p>", tooltip: "", icon: "" },
        id: 4,
      },
      {
        "1": { title: "<p>7 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xee2783...7c9c22</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0xca1dcc...196bd3</p>", tooltip: "", icon: "" },
        "6": { title: "<p>USDC</p>", tooltip: "", icon: "" },
        "7": { title: "<p>704.3302</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$704.602</p>", tooltip: "", icon: "" },
        id: 5,
      },
      {
        "1": { title: "<p>7 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x1dd1ec...a9d0a4</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x526463...9b34b2</p>", tooltip: "", icon: "" },
        "6": { title: "<p>USDC</p>", tooltip: "", icon: "" },
        "7": { title: "<p>707.0044</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$707.277</p>", tooltip: "", icon: "" },
        id: 6,
      },
    ],
  }}
/>

**以下是這種行為的範例：**

[https://explorer.hop.exchange/?account=0x4bc25a712b87c1e4a42df9ffac3662fe467b7e9a](https://explorer.hop.exchange/?account=0x4bc25a712b87c1e4a42df9ffac3662fe467b7e9a)

#### 模式 \#1 是如何被發現的？
模式 \#1 是透過追蹤 Ethereum 上的鏈上轉帳，使用 Alchemy Transfers API 所發現的。經過調查後發現，有一組相連的位址集合，也就是模式 \#2，是透過追蹤中樞位址（0xb23691043293de4deeae3b565bd33bc059f264eb）與其在 Avalanche 主網上關聯的分支位址之間的轉帳，而與模式 \#1 產生連結。

#### 模式 \#2
對於由綠色邊連接的位址，攻擊者在數個小時內多次使用 Hop Exchange，主要進行從 Gnosis Chain（原 xDai）到 Polygon 的反覆兌換。

所有交易金額通常介於 200 到 300 美元之間，使用 $DAI、$USDC 或 $USDT。

整體而言，模式二發生的時間跨度為 2022 年 1 月 15 日至 1 月 24 日，為期一週。

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 150, title: "Date", dataType: "object" },
      { key: "2", width: 150, title: "Source", dataType: "object" },
      { key: "3", width: 150, title: "Destination", dataType: "object" },
      { key: "4", width: 180, title: "Transfer ID", dataType: "object" },
      { key: "5", width: 180, title: "Transfer Tx", dataType: "object" },
      { key: "6", width: 120, title: "Token", dataType: "object" },
      { key: "7", width: 150, title: "Amount", dataType: "object" },
      { key: "8", width: 150, title: "Amount USD", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xff8fdd...3425e0</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0xd0620e...65a5d7</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>151.7367</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$152.328</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x2b7b50...244c1f</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x74af1a...349d7d</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>187.0714</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$187.8</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x72de10...8aed0a</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x38b797...743d8f</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>223.8656</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$224.738</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xffd955...6f9db2</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0xcb643f...26366a</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>275.6120</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$276.686</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x2cef20...07e90d</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x6459e5...3eb30b</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>215.9183</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$216.76</p>", tooltip: "", icon: "" },
        id: 4,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xfc36c5...6191cc</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0xdd9488...7a4c49</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>170.2939</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$170.807</p>", tooltip: "", icon: "" },
        id: 5,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xf4314e...f06488</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x1ed8f3...b8d68e</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>254.4636</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$255.229</p>", tooltip: "", icon: "" },
        id: 6,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xd41505...d09c9c</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0xefc5e9...b37607</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>218.8310</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$219.49</p>", tooltip: "", icon: "" },
        id: 7,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0x674400...b0a772</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x25c9b8...83d62a</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>225.7740</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$226.454</p>", tooltip: "", icon: "" },
        id: 8,
      },
      {
        "1": { title: "<p>4 months ago</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Gnosis</p>", tooltip: "", icon: "" },
        "3": { title: "<p>Polygon</p>", tooltip: "", icon: "" },
        "4": { title: "<p>0xf1f178...8306f5</p>", tooltip: "", icon: "" },
        "5": { title: "<p>0x866775...30dd94</p>", tooltip: "", icon: "" },
        "6": { title: "<p>DAI</p>", tooltip: "", icon: "" },
        "7": { title: "<p>201.0280</p>", tooltip: "", icon: "" },
        "8": { title: "<p>$201.633</p>", tooltip: "", icon: "" },
        id: 9,
      },
    ],
  }}
/>

**以下是這種行為的範例：**

[https://explorer.hop.exchange/?account=0x1cccff3de9b0a7c466acb31f33910691f1cb6e14](https://explorer.hop.exchange/?account=0x1cccff3de9b0a7c466acb31f33910691f1cb6e14)

### 連接模式 \#1 與模式 \#2
模式 \#1 與 \#2 之所以被發現是相連的，是因為該 sybil 攻擊者在 [Ethereum 主網](https://www.alchemy.com/rpc/ethereum) 和 Avalanche 主網上進行了重疊的交易。

具體來說，這些位址之間的轉帳同時發生在兩條鏈上，顯示出兩種模式之間的關聯性。

- 0x1100cc….d34e76a8e ←→ 0xb2369….59f264eb
- 0xb23691….f264eb ←→ 0x80d….19b9

面對超過 [30,000 個位址](https://github.com/hop-protocol/hop-airdrop/blob/master/src/data/finalDistribution.csv) 需要逐一檢視，要找出彼此相連的子集合相當具有挑戰性，但 [Transfers API](https://www.alchemy.com/enhanced-apis/?a=566c1048c9) 能有效追蹤 Ethereum 上的交易。

## 如何找出空投獵人
透過搜尋 Ethereum 和 Avalanche 主網上所有符合資格位址的轉帳紀錄，我們得以追蹤共同的鏈上活動，藉此找出彼此相連的位址。

為了減少找出符合資格位址所需的暴力運算量，我們透過剔除共享位址數量較少的群集，來縮小群集的搜尋範圍。

在篩除不太可能的位址後，我們查詢了 Hop Exchange 在其支援的各條區塊鏈上的 subgraph，為每個位址群集建立基本的資料輪廓。

如果某個群集的輪廓顯示出重複的位址行為模式，就會被標記為需要人工驗證。

### 我要如何獵捕空投獵人？
只要有一個[免費的 Alchemy 帳號](https://alchemy.com/?a=566c1048c9)、Etherscan 的 API 金鑰、subgraph 的存取權限，再加上一些基本的 Python 程式撰寫能力，你也能成為空投獵人的獵人。

如果你有找出空投獵人的好方法、對加密貨幣研究有興趣，或想聊聊 web3 專案，歡迎在 Twitter 上聯絡我（[@crypt0zeke](https://twitter.com/crypt0zeke)）。

在那之前，請持續留意新的社群倡議，我們下次獵捕行動再見！
