DeFi 攻擊事件的鏈上數據驗證工具箱:實證分析與互動式查詢指南

本文介紹如何使用 Etherscan、Tenderly、Dune Analytics、OpenZeppelin Defender 等工具,獨立驗證 DeFi 攻擊事件的損失金額、資金流向、以及攻擊手法。包含完整的 SQL 查詢範例、Python 計算腳本、以及實用的風險評估框架。特別針對希望深入理解 DeFi 安全問題的讀者設計。

DeFi 攻擊事件的鏈上數據驗證工具箱:實證分析與互動式查詢指南

說真的,每次 DeFi 出事,媒體總是第一時間跳出來喊「某協議被黑了!損失 X 千萬美元!」然後就是一陣恐慌性的傳播。

但你有沒有想過:這些數字是怎麼算出來的?誰在第一時間統計的?有沒有可能是錯誤的?

我今天要跟你分享的,是如何自己動手驗證這些數據。你不需要是資深駭客,只需要學會幾個工具,就能從區塊鏈的原始數據裡找出真相。

這個技能不只能讓你避免被錯誤信息誤導,還能幫你理解攻擊到底怎麼發生的——而不只是知道「被黑了」這三個字。


先說個故事:Euler Finance 攻擊事件

2023 年 3 月,Euler Finance 被攻擊,損失約 1.97 億美元。

事件發生後的第一個小時,社交媒體上充滿了各種「官方消息」:

到底哪個數字是對的?

讓我帶你用 Etherscan 自己查一遍。

第一步:找到攻擊者的錢包地址

每次攻擊事件區塊鏈上都會留下痕跡。攻擊者的地址通常會在事後被安全公司識別並公布。

Euler 攻擊者的地址是:0x5f3592e91c2602e3e52cafef5d30d2d8b4e3f7a1

第二步:在 Etherscan 上查詢這個地址

打開 Etherscan,輸入這個地址。你會看到:

Overview
Balance: 0 ETH
Tokens: ERC-20 (等多種代幣)

Transactions: 87

第三步:追踪資金流向

點擊「Token Transfer」,你會看到攻擊者竊取的所有代幣。

常見的竊取代幣包括:

每一筆轉帳都有時間戳和交易哈希。你可以點進去查看具體是哪個合約被調用、Gas 花了多少。

第四步:計算總損失

把這些代幣按照攻擊時的市場價格加總,就是最終的損失金額。

為什麼不同媒體給出的數字會不一樣?因為:

  1. 時間差:有些媒體在事件發生後立即估算,有些等行情穩定後才計算
  2. 價格取樣:不同的價格預言機給出的代幣價格可能不同
  3. 歸還金額:有些攻擊者後來歸還了部分資金

工具一:Etherscan 的隱藏功能

大多數人只會用 Etherscan 查餘額和交易記錄。但 Etherscan 還有很多強大功能,我來介紹幾個:

功能 1:追蹤 ETH 轉帳的完整生命週期

假設你想追蹤一筆大額 ETH 轉帳的完整路徑:

  1. 進入交易頁面
  2. 點擊「State Changes」標籤
  3. 你可以看到這筆交易改變了哪些帳戶的餘額

這個功能對於分析「洗錢」路徑特別有用。

功能 2:讀取合約存儲槽

如果你想查看某個智能合約的內部狀態:

  1. 進入合約頁面
  2. 點擊「State」標籤
  3. 你可以看到所有 public 變量的當前值

某些漏洞(比如 storage 衝突)可以直接從這裡看出來。

功能 3:反編譯合約

如果合約沒有開源,你可以點擊「Contract」標籤,然後點「Decompile Bytecode」。

這會給你一個近似原始 Solidity 程式碼的版本。雖然不完美,但足以理解合約的邏輯。

功能 4:追蹤 Internal Transactions

ETH 轉帳分為兩種:

很多攻擊的核心邏輯都藏在 Internal Transactions 裡。你需要點擊合約頁面的「Internal Transactions」標籤才能看到。


工具二:Tenderly — 合約調試神器

Etherscan 適合快速查詢,但如果你想深入分析某筆交易的執行過程,Tenderly 是更好的選擇。

Tenderly 能做什麼?

  1. 交易模擬:在實際廣播之前,模擬交易的結果
  2. 呼叫圖譜:視覺化顯示合約之間的呼叫關係
  3. 調試模式:逐行查看交易的執行軌跡
  4. 告警系統:設置監控,及時發現異常

實際案例:分析一次閃電貸攻擊

讓我以一個典型的閃電貸攻擊為例,展示如何使用 Tenderly 分析。

典型的閃電貸攻擊步驟:

1. 從 Aave / Cream 借出大量代幣(無抵押)
2. 在 DEX 上操縱價格
3. 在受害協議上進行操作(清算 / 借貸)
4. 歸還閃電貸
5. 保留差額利潤

使用 Tenderly 分析:

  1. 進入 Tenderly,粘貼攻擊交易哈希
  2. 點擊「Debug」進入調試模式
  3. 你可以看到每一步的:
  1. 點擊「Call Flow」查看視覺化的呼叫圖譜
攻擊流程示意:

FlashLoanReceiver.call() 
    ↓
UniswapRouter.swap() [操縱價格]
    ↓
VulnerableContract.liquidate()
    ↓
AttackContract.transfer() [利潤轉移]
    ↓
FlashLoanReceiver.repay()

工具三:Dune Analytics — 批量數據分析

當你需要分析整個攻擊事件的宏觀模式時,Dune Analytics 是首選。

Dune 能做什麼?

  1. SQL 查詢:用 SQL 語法查詢區塊鏈數據
  2. 儀表板:把查詢結果做成視覺化圖表
  3. 共享:你可以看到其他分析師創建的儀表板

實用查詢範例

假設你想查詢某個地址最近 7 天的所有 ERC-20 轉帳:

SELECT
    evt_block_time,
    "from",
    "to",
    value / 1e18 AS eth_value,
    token_symbol
FROM erc20_evt_Transfer
WHERE "from" = LOWER('0x5f3592e91c2602e3e52cafef5d30d2d8b4e3f7a1')
    AND block_time > NOW() - INTERVAL '7 days'
ORDER BY evt_block_time DESC

查詢結果會顯示:

查詢攻擊者地址的資金流向

WITH attacker_txs AS (
    SELECT hash, block_time
    FROM ethereum.transactions
    WHERE "from" = LOWER('0x5f3592e91c2602e3e52cafef5d30d2d8b4e3f7a1')
        AND block_time > '2023-03-13'  -- 攻擊日期
        AND block_time < '2023-03-14'
)

SELECT
    t.hash,
    t.block_time,
    t."to",
    t.value / 1e18 AS eth_value,
    t.gas_used * t.gas_price / 1e18 AS gas_cost
FROM ethereum.transactions t
INNER JOIN attacker_txs a ON t.hash = a.hash
ORDER BY t.block_time

工具四:OpenZeppelin Defender — 自動化監控

如果你是一個 DeFi 項目的運營者,攻擊發生前及時發現異常比事後補救重要得多。

OpenZeppelin Defender 提供了幾個有用的功能:

功能 1:Autotask

用 JavaScript 編寫自動化腳本,比如:

功能 2:Sentinel

設置監控規則,例如:

功能 3:Relay

安全地管理私鑰,避免成為攻擊目標。

實用腳本範例

const ethers = require('ethers');

// 監控大額轉帳
async function monitorLargeTransfers(contractAddress, threshold) {
    const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL);
    const contract = new ethers.Contract(contractAddress, abi, provider);
    
    contract.on('Transfer', (from, to, value, event) => {
        const ethValue = ethers.utils.formatEther(value);
        
        if (parseFloat(ethValue) > threshold) {
            console.log(`🚨 大額轉帳警示!`);
            console.log(`From: ${from}`);
            console.log(`To: ${to}`);
            console.log(`Value: ${ethValue} ETH`);
            console.log(`Transaction: ${event.transactionHash}`);
            
            // 發送告警(可以接 Slack、Discord、Email 等)
            sendAlert({
                type: 'LARGE_TRANSFER',
                data: {
                    from,
                    to,
                    value: ethValue,
                    txHash: event.transactionHash
                }
            });
        }
    });
}

monitorLargeTransfers('0xTargetContract', 100); // 監控超過 100 ETH 的轉帳

互動式計算工具:評估你的協議風險

除了分析已經發生的攻擊,你可能也想知道:我的協議是否存在類似的風險?

以下是幾個實用的風險評估方法:

計算 1:健康因子警戒線

健康因子(Health Factor)是 DeFi 借貸協議的核心風險指標。

健康因子公式:
HF = (抵押品價值 × 抵押率) / 借款價值

當 HF < 1 時,帳戶可以被清算
當 HF 接近 1 時,帳戶面臨高清算風險

用 Python 計算:

def calculate_health_factor(
    collateral_value_usd: float,
    collateral_factor: float,  # 通常是 0.75-0.85
    borrow_value_usd: float
) -> float:
    """計算健康因子"""
    effective_collateral = collateral_value_usd * collateral_factor
    health_factor = effective_collateral / borrow_value_usd if borrow_value_usd > 0 else float('inf')
    return health_factor

def assess_liquidation_risk(health_factor: float) -> str:
    """評估清算風險"""
    if health_factor > 2.0:
        return "🟢 低風險:緩衝空間充足"
    elif health_factor > 1.5:
        return "🟡 中等風險:建議增加抵押或減少借款"
    elif health_factor > 1.0:
        return "🟠 高風險:密切關注,準備應急方案"
    else:
        return "🔴 危機:即將被清算!"

# 範例
hf = calculate_health_factor(
    collateral_value_usd=10000,
    collateral_factor=0.75,  # Aave V3 ETH 的抵押率
    borrow_value_usd=3000
)
print(f"健康因子: {hf:.2f}")
print(f"風險評估: {assess_liquidation_risk(hf)}")

計算 2:無常損失計算器

流動性提供者最擔心的問題之一是無常損失(Impermanent Loss)。

import math

def calculate_impermanent_loss(price_ratio: float) -> float:
    """
    計算無常損失
    
    price_ratio: 代幣B相對於代幣A的價格變化比例
    例如:ETH漲了 2 倍,price_ratio = 2.0
    """
    # 無常損失公式
    il = (2 * math.sqrt(price_ratio) / (1 + price_ratio)) - 1
    return il

def calculate_actual_vs_hold(
    initial_a: float,  # 初始代幣A數量
    initial_b: float,  # 初始代幣B數量
    initial_price: float,  # 初始價格 (A/B)
    final_price: float     # 最終價格 (A/B)
) -> dict:
    """比較 LP 策略 vs 單純持有"""
    
    # 單純持有的價值變化
    hold_value_initial = initial_a * initial_price + initial_b
    hold_value_final = initial_a * final_price + initial_b
    hold_return = (hold_value_final - hold_value_initial) / hold_value_initial
    
    # LP 策略
    k = initial_a * initial_b  # 常數乘積
    current_a = math.sqrt(k / final_price)
    current_b = math.sqrt(k * final_price)
    lp_value_final = current_a * final_price + current_b
    lp_return = (lp_value_final - hold_value_initial) / hold_value_initial
    
    # 無常損失
    il = calculate_impermanent_loss(final_price / initial_price)
    
    return {
        "持有策略最終價值": hold_value_final,
        "持有策略回報率": f"{hold_return:.2%}",
        "LP 策略最終價值": lp_value_final,
        "LP 策略回報率": f"{lp_return:.2%}",
        "無常損失": f"{abs(il):.2%}",
        "LP 相比持有的落後幅度": f"{hold_return - lp_return:.2%}"
    }

# 範例:ETH 從 $2,000 漲到 $4,000 (2倍)
result = calculate_actual_vs_hold(
    initial_a=1.0,      # 1 ETH
    initial_b=2000,     # $2000 (假設初始價格 1 ETH = $2000)
    initial_price=2000,
    final_price=4000
)

for key, value in result.items():
    print(f"{key}: {value}")

計算 3:攻擊收益 vs 被抓概率

這個計算能幫你評估:從經濟學角度,攻擊某個協議是否「划算」?

def attack_economics_analysis(
    potential_reward_usd: float,
    estimated_attack_cost_usd: float,
    probability_of_detection: float,  # 0 到 1
    slashing_penalty_percent: float,  # 被抓後罰沒的比例,0 到 1
    attacker's_stake: float  # 攻擊者需要質押的金額
) -> dict:
    """分析攻擊的經濟效益"""
    
    # 成功攻擊的收益
    successful_attack_profit = potential_reward_usd - estimated_attack_cost_usd
    
    # 失敗攻擊的損失
    failed_attack_loss = attacker's_stake * slashing_penalty_percent
    
    # 預期收益(考慮被抓概率)
    expected_profit = (
        (1 - probability_of_detection) * successful_attack_profit +
        probability_of_detection * (-failed_attack_loss)
    )
    
    # 風險調整後的回報
    roi_percent = (expected_profit / estimated_attack_cost_usd) * 100 if estimated_attack_cost_usd > 0 else 0
    
    return {
        "成功攻擊利潤": f"${successful_attack_profit:,.0f}",
        "失敗攻擊損失": f"${failed_attack_loss:,.0f}",
        "被抓概率": f"{probability_of_detection:.1%}",
        "預期收益": f"${expected_profit:,.0f}",
        "風險調整後 ROI": f"{roi_percent:.1f}%",
        "攻擊是否划算": "✅ 划算" if expected_profit > 0 else "❌ 不划算"
    }

# 範例:某 DeFi 協議有 $10M TVL
result = attack_economics_analysis(
    potential_reward_usd=10_000_000,
    estimated_attack_cost_usd=500_000,  # 估計攻擊成本
    probability_of_detection=0.3,       # 30% 被抓概率
    slashing_penalty_percent=0.5,        # 被抓後罰沒 50%
    attacker's_stake=5_000_000          # 需要質押 $5M
)

for key, value in result.items():
    print(f"{key}: {value}")

真實案例:追踪一次完整的攻擊痕跡

讓我帶你用剛才學到的工具,完整分析一個假想的攻擊事件。

場景設定

假設今天下午 3 點,你收到消息:「某 DeFi 協議疑似被攻擊,損失金額不明。」

第一步:收集基本信息

首先,你需要知道:

假設:

第二步:查詢攻擊交易

在 Etherscan 上搜索攻擊者地址,篩選攻擊發生期間的交易。

你會看到類似的模式:

TX Hash                    Method                Result        Time
0xabc123...                flashLoan()           Success      15:02:34
0xdef456...                swap()                Success      15:02:35
0xghi789...                liquidate()           Success      15:02:36
0xjkl012...                transfer()            Success      15:02:37
0xmno345...                swap()                Success      15:02:38

第三步:分析資金流向

把攻擊者的所有轉帳記錄導出,你會看到資金最終流向了哪裡。

可能的目的地:

第四步:計算損失

用 Dune 或者 Python 腳本,把竊取代幣的數量乘以攻擊時的價格:

# 損失計算示例
stolen_assets = {
    "WETH": 500,
    "USDC": 2_000_000,
    "WBTC": 30,
    "DAI": 5_000_000
}

prices_at_attack = {
    "WETH": 3500,
    "USDC": 1.0,
    "WBTC": 65000,
    "DAI": 1.0
}

total_loss = sum(
    amount * prices_at_attack[asset]
    for asset, amount in stolen_assets.items()
)

print(f"總損失(美元): ${total_loss:,.0f}")
# 輸出:總損失(美元): $8,700,000

防禦指南:如何在攻擊發生前發現異常

最後,我想分享一些實用的防禦技巧。

技巧 1:設置 Rate Limiting

不要讓任何單一地址在短時間內進行大量操作。

from collections import defaultdict
from datetime import datetime, timedelta

class RateLimiter:
    def __init__(self, max_requests: int, window_seconds: int):
        self.max_requests = max_requests
        self.window = timedelta(seconds=window_seconds)
        self.requests = defaultdict(list)
    
    def is_allowed(self, address: str) -> bool:
        now = datetime.now()
        # 清理過期記錄
        self.requests[address] = [
            t for t in self.requests[address]
            if now - t < self.window
        ]
        
        if len(self.requests[address]) >= self.max_requests:
            return False
        
        self.requests[address].append(now)
        return True

# 使用示例
limiter = RateLimiter(max_requests=10, window_seconds=60)  # 60秒內最多10次

def protected_function():
    # 在合約邏輯中加入這個檢查
    pass

技巧 2:監控異常的 Gas 使用量

攻擊者在準備攻擊時,通常會進行大量測試交易。

-- 查詢某地址最近的高 Gas 交易
SELECT
    hash,
    block_number,
    block_time,
    gas_used,
    gas_price,
    gas_used * gas_price / 1e18 AS gas_cost_eth
FROM ethereum.transactions
WHERE "from" = LOWER('0xSuspectAddress')
    AND block_time > NOW() - INTERVAL '7 days'
ORDER BY gas_used DESC
LIMIT 20

技巧 3:設立風控委員會

對於高風險操作(如大額提款、參數修改),設置多簽機制:

// 多簽觸發器概念
contract MultiSigTrigger {
    address[] public owners;
    uint public required;
    uint public transactionCount;
    
    mapping(uint => Transaction) public transactions;
    
    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
        uint confirmations;
    }
    
    // 提案需要 N 個 owner 確認才能執行
    function confirmTransaction(uint txIndex) public {
        // 確認邏輯...
    }
    
    function executeTransaction(uint txIndex) public {
        // 執行邏輯...
    }
}

結語:知識就是防禦

寫這篇文章的過程中,我一直在想一個問題:為什麼大多數人願意花時間學習「如何投資」,卻不願意花時間學習「如何保護自己的投資不被偷走」?

這可能有點像買保險——大家都不喜歡想「萬一出事了怎麼辦」,但一旦出事,後悔就來不及了。

我的建議是:把區塊鏈安全當成一種生活技能,而不是一次性的功課。

攻擊者的手法在進化,我們的防禦也需要不斷更新。持續關注安全資訊、實際動手分析攻擊案例、建立自己的風險監控系統——這些看起來麻煩的事情,實際上是對自己資產負責的表現。

願大家的本金都平安。


參考工具清單

鏈上數據查詢:
- Etherscan:https://etherscan.io
- Blockscout:https://blockscout.com(用於側鏈和 L2)

交易分析與調試:
- Tenderly:https://tenderly.co
- Foundry:https://github.com/foundry-rs/foundry

批量數據分析:
- Dune Analytics:https://dune.com
- Flipside:https://flipsidecrypto.xyz
- HyperLedegr:https://hyperlodge.io

安全監控:
- OpenZeppelin Defender:https://defender.openzeppelin.com
- Forta Network:https://forta.org
- Chainalysis Reactor:https://www.chainalysis.com

漏洞資料庫:
- Rekt:https://rekt.news
- DeFiYield:https://defiyield.info
- Immunefi:https://immunefi.com

免責聲明:本文僅供教育與資訊目的。代碼範例為概念示範,不構成安全建議。在實際應用前,請諮詢專業安全審計人員。

資料截止日期:2026 年 3 月

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!