Dune Analytics 完整實務教學:從入門到進階的 SQL 區塊鏈數據分析指南
Dune Analytics 是當今區塊鏈數據分析領域最具影響力的平台之一,本文提供從基礎入門到進階應用的完整教學,透過大量實務案例和 SQL 程式碼範例,使讀者能夠獨立進行專業的 DeFi 研究、量化分析與協議監控。
Dune Analytics 完整實務教學:從入門到進階的 SQL 區塊鏈數據分析指南
概述
Dune Analytics 是當今區塊鏈數據分析領域最具影響力的平台之一,它將原始的區塊鏈數據轉化為可通過 SQL 查詢的結構化表格,讓研究人員、開發者和投資者能夠深入分析以太坊及其他區塊鏈網路的各種活動。本教學將帶領讀者從基礎入門到進階應用,透過大量的實務案例和程式碼範例,使讀者能夠獨立進行專業的區塊鏈數據分析。
Dune Analytics 的核心價值在於 democratizing blockchain data——讓任何掌握 SQL 基礎知識的人都能夠訪問和分析區塊鏈數據,而無需處理複雜的原始區塊鏈數據格式。在 2024-2026 年間,Dune 持續強化其功能,新增了對更多區塊鏈網路的支持、優化了查詢效能、並推出了多項付費企業級功能。理解如何使用這個平台,是進行任何 DeFi 研究、量化分析或區塊鏈項目評估的關鍵技能。
第一章:Dune Analytics 平台基礎
1.1 平台架構與數據模型
Dune Analytics 的底層架構建立在對原始區塊鏈數據的結構化處理之上。當區塊鏈網路產生新的區塊時,Dune 的節點會同步這些區塊,對其中的交易、事件和調用進行解析,並將數據存儲到精心設計的 PostgreSQL 資料庫中。這種設計使得用戶可以使用標準 SQL 語法來查詢區塊鏈數據,大大降低了區塊鏈分析的技術門檻。
Dune 平台上的數據主要分為三層結構。最底層是 raw data(原始數據),包括原始的交易記錄、區塊數據等,這些數據直接來自區塊鏈節點。中間層是 decoded data(解碼數據),Dune 團隊和社區成員編寫了解碼器(decoders),將智能合約的調用和事件轉化為易於理解的表格。例如,當用戶在 Uniswap 上進行代幣交換時,原始數據只是一系列複雜的函數調用參數,但經過解碼後,用戶可以直接查詢 swap 表格,獲取 swap 的發起者、輸入代幣、輸出代幣、數量等結構化信息。最上層是 aggregated data(聚合數據),這是預先計算好的統計指標,如每日活躍地址數、協議總交易量等,用戶可以直接使用而無需自己進行複雜的聚合計算。
理解這個數據架構對於有效使用 Dune 非常重要。用戶需要知道哪些數據已經被解碼,哪些需要自己從原始數據中提取,這直接影響查詢的設計方式和效能優化策略。
1.2 可用數據庫與表格概述
Dune Analytics 支援多條區塊鏈的數據查詢,包括以太坊主網、Polygon、Arbitrum、Optimism、BNB Chain、Solana、Avalanche、Base、zkSync Era 等。每條區塊鏈都有獨立的數據庫,查詢時需要指定正確的區塊鏈名稱。
以太坊區塊鏈的數據庫是最豐富和完整的,主要包含以下幾類表格:
區塊與交易層面的表格包括 ethereum.blocks 和 ethereum.transactions。ethereum.blocks 包含每個區塊的完整信息,包括區塊號、区块哈希、驗證者地址、區塊時間戳、區塊內的交易數量、以及 Gas 使用量等。這張表格是進行任何時間序列分析的基礎,例如分析以太坊網路的日均交易量變化趨勢。ethereum.transactions 包含每筆交易的詳細信息,包括交易發起者(from)、接收者(to)、轉帳金額、交易的 Gas 價格、實際消耗的 Gas、以及交易是否成功等。這張表格是用戶分析鏈上活動頻率和用戶行為的主要數據源。
代幣相關的表格是區塊鏈數據分析的核心。erc20.ERC20_Transfer 記錄所有 ERC-20 代幣的轉帳事件,包含轉帳雙方的地址、轉帳數量、以及代幣合約地址等。這張表格可以用來追蹤特定代幣的流向、分析巨鯨行為、或計算特定地址的代幣持倉變化。erc20.ERC20_Approval 記錄代幣授權事件,這對於分析 DeFi 協議的用戶採用情況特別有用。erc20.token 包含所有 ERC-20 代幣的基本信息,如代幣名稱、符號、總供應量、小數位數等。
智能合約事件層面的表格來自於對特定智能合約的解碼。以 Uniswap 為例,uniswap_v3.Factory 包含工廠合約的信息,uniswap_v3.Pool 包含所有交易池的信息,uniswap_v3.Swap 記錄所有的兌換交易。每個被 Dune 解碼的協議都有類似的表格結構。解碼數據的質量直接取決於解碼器的編寫質量,這也是 Dune 社區貢獻的重要價值所在。
1.3 查詢編寫環境介紹
Dune Analytics 提供了一個功能完整的在線 SQL 編輯器,支援語法高亮、自動完成、即時錯誤提示等功能。編輯器下方是查詢結果區域,支援表格視圖和圖表視圖兩種展示方式。用戶可以將多個圖表組合成一個儀表板(Dashboard),實現對特定主題的綜合監控。
查詢編輯器的左側是數據庫和表格導航面板,用戶可以通過搜索快速找到需要的表格和欄位。每個表格旁邊都有感嘆號圖標,點擊後會顯示該表格的欄位說明和示例數據,這對於不熟悉的表格特別有幫助。編輯器還支援查詢片段(Query Snippets)功能,用戶可以將常用的 SQL 片段保存為模板,下次使用時直接插入即可。
查詢執行方面,Dune 採用免費和付費混合的模式。免費用戶每小時有有限的查詢配額,付費方案則提供更多的算力和私人查詢功能。需要注意的是,某些 heavy 的查詢(如涉及大量歷史數據的聚合查詢)可能需要較長時間才能完成,用戶需要在查詢設計時考慮效能優化。
第二章:基礎 SQL 查詢技巧
2.1 簡單餘額查詢
最基礎的區塊鏈數據查詢是查詢特定地址的代幣餘額。假設我們想查詢以太坊創世地址(0x0000000000000000000000000000000000000000)的 ETH 餘額:
SELECT balance
FROM ethereum.balances
WHERE address = 0x0000000000000000000000000000000000000000
AND block_time < NOW() - INTERVAL '1' DAY
ORDER BY block_time DESC
LIMIT 1
這個查詢從 ethereum.balances 表格中選擇餘額欄位,過濾條件是地址為創世地址且區塊時間在一天之前,然後按區塊時間降序排序,取第一條記錄。理解為什麼需要加時間條件很重要——區塊鏈的餘額是隨著每筆交易而變化的,查詢時不指定時間條件會返回多條記錄。
查詢特定 ERC-20 代幣的餘額需要使用代幣轉帳記錄進行計算:
SELECT
to_address as token_holder,
SUM(CAST(value AS DOUBLE) / POWER(10, 18)) as balance
FROM erc20.ERC20_Transfer
WHERE
contract_address = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 -- USDC
AND to_address = 0x7713974908Be4B591487ba2F7e3C4E7D1C2bb257 -- 範例地址
GROUP BY to_address
這個查詢計算特定地址持有的 USDC 數量。邏輯是將該地址收到的所有 USDC 減去該地址轉出的所有 USDC,結果就是當前餘額。這種計算方式適用於任何 ERC-20 代幣。
2.2 交易歷史查詢
查詢特定地址的交易歷史是另一個常見需求:
SELECT
block_time,
hash,
from_address,
to_address,
CAST(value AS DOUBLE) / POWER(10, 18) as eth_value,
gas_price / 1e9 as gas_price_gwei,
receipt_gas_used as gas_used
FROM ethereum.transactions
WHERE
"from" = 0x7713974908Be4B591487ba2F7e3C4E7D1C2bb257 -- 發送地址
OR "to" = 0x7713974908Be4B591487ba2F7e3C4E7D1C2bb257 -- 接收地址
ORDER BY block_time DESC
LIMIT 100
這個查詢返回指定地址的所有 ETH 轉帳交易,按時間降序排列。查詢結果包括交易時間、交易哈希、發送方、接收方、轉帳金額、Gas 價格和實際消耗的 Gas。
2.3 時間序列分析
時間序列分析是區塊鏈數據分析的核心應用場景。下面的查詢計算以太坊網路每日的新增地址數:
SELECT
DATE_trunc('day', block_time) as day,
COUNT(DISTINCT "to") as new_addresses
FROM ethereum.transactions
WHERE
DATE_trunc('day', block_time) >= CURRENT_DATE - INTERVAL '365' DAY
AND "to" NOT IN (
-- 排除已知的合約地址
SELECT DISTINCT "from"
FROM ethereum.transactions
WHERE DATE_trunc('day', block_time) < CURRENT_DATE - INTERVAL '365' DAY
)
GROUP BY 1
ORDER BY 1
這個查詢的邏輯是:對過去 365 天內,找出那些首次收到交易的地址。子查詢首先找出 365 天之前已經存在的地址(通過查詢他們作為發送方的歷史記錄),然後主查詢過濾掉這些地址,剩下的就是新出現的地址。
計算每日活躍地址數更加直接:
SELECT
DATE_trunc('day', block_time) as day,
COUNT(DISTINCT "from") as active_senders,
COUNT(DISTINCT "to") as active_receivers,
COUNT(DISTINCT CASE WHEN "from" = "to" THEN NULL ELSE CONCAT("from", "to") END) as unique_interactions
FROM ethereum.transactions
WHERE DATE_trunc('day', block_time) >= CURRENT_DATE - INTERVAL '90' DAY
GROUP BY 1
ORDER BY 1
這個查詢計算三個指標:活躍發送方數量、活躍接收方數量、以及唯一交互對數量。通過監控這些指標的變化趨勢,可以評估網路的實際使用情況和用戶活躍度。
2.4 代幣流向分析
分析代幣流向是識別巨鯨行為和市場趨勢的重要方法。下面的查詢找出過去 30 天內轉入最多的地址(排除交易所和知名 DeFi 協議):
WITH top_receivers AS (
SELECT
to_address,
SUM(CAST(value AS DOUBLE) / POWER(10, 18)) as total_received
FROM erc20.ERC20_Transfer
WHERE
contract_address = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 -- USDC
AND block_time >= NOW() - INTERVAL '30' DAY
GROUP BY to_address
ORDER BY 2 DESC
LIMIT 100
)
SELECT
tr.to_address,
tr.total_received,
-- 嘗試通過標籤服務識別地址類型
CONCAT('https://etherscan.io/address/', tr.to_address) as etherscan_link
FROM top_receivers tr
WHERE
-- 排除已知的交易所充值地址模式(這需要結合 Nansen 等工具的標籤數據)
tr.total_received > 1000000 -- 大於 100 萬 USDC
ORDER BY tr.total_received DESC
這個查詢是基礎版本,實際應用中通常需要結合 Nansen 或 Arkham 的錢包標籤數據來識別地址的實際身份。
第三章:DeFi 協議分析方法論
3.1 DEX 交易量分析
去中心化交易所(DEX)的交易量是評估 DeFi 採用情況的關鍵指標。以 Uniswap V3 為例,分析其歷史交易量趨勢:
SELECT
DATE_trunc('day', block_time) as day,
COUNT(*) as swap_count,
COUNT(DISTINCT pool) as pool_count,
-- 計算交易量(需要處理多個代幣對)
SUM(CAST(amount0 AS DOUBLE)) as volume_token0,
SUM(CAST(amount1 AS DOUBLE)) as volume_token1
FROM uniswap_v3.Swap
WHERE
block_time >= NOW() - INTERVAL '180' DAY
GROUP BY 1
ORDER BY 1
這個查詢返回過去 180 天每天的 Uniswap V3 交易數據。分析結果可以幫助理解 DeFi 交易的季節性模式和市場情緒變化。
更進一步,我們可以分析特定代幣對的交易活動:
SELECT
DATE_trunc('day', block_time) as day,
p.token0_symbol,
p.token1_symbol,
COUNT(*) as trade_count,
AVG(CAST(amount0 AS DOUBLE)) as avg_token0_amount,
AVG(CAST(amount1 AS DOUBLE)) as avg_token1_amount,
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY CAST(amount0 AS DOUBLE)) as median_token0_amount
FROM uniswap_v3.Swap s
LEFT JOIN uniswap_v3.Pool p ON s.pool = p.pool_address
WHERE
p.token0_symbol IN ('WETH', 'USDC', 'USDT', 'DAI')
AND p.token1_symbol IN ('WETH', 'USDC', 'USDT', 'DAI')
AND block_time >= NOW() - INTERVAL '30' DAY
GROUP BY 1, 2, 3
ORDER BY 4 DESC
這個查詢專注於主流穩定幣和 ETH 交易對的交易活動,分析哪些交易對最活躍、平均交易規模是多少。這類分析對於理解市場流動性分佈和交易者行為非常有價值。
3.2 借貸協議風險分析
借貸協議的清算事件是市場波動時的重要風險指標。以下查詢分析 Aave V3 的清算活動:
SELECT
DATE_trunc('hour', evt_block_time) as hour,
COUNT(*) as liquidation_count,
SUM(CAST(debt_to_cover AS DOUBLE) / POWER(10, 8)) as total_usd_liquidated,
COUNT(DISTINCT user) as unique_liquidated_users
FROM aave_v3.LiquidateBorrow
WHERE
evt_block_time >= NOW() - INTERVAL '30' DAY
GROUP BY 1
ORDER BY 1
通過監控清算活動的頻率和規模,可以及時識別市場風險的累積。當清算數量突然增加時,往往預示著市場正在經歷劇烈波動。
分析借款人的健康因子分佈可以評估協議的整體風險狀況:
SELECT
CASE
WHEN health_factor > 2 THEN 'Very Safe (>2)'
WHEN health_factor > 1.5 THEN 'Safe (1.5-2)'
WHEN health_factor > 1.2 THEN 'Moderate (1.2-1.5)'
WHEN health_factor > 1.0 THEN 'At Risk (1.0-1.2)'
ELSE 'Liquidatable (<1.0)'
END as risk_category,
COUNT(*) as user_count,
SUM(CAST(total_collateral_base AS DOUBLE) / 1e8) as total_collateral_usd,
SUM(CAST(total_debt_base AS DOUBLE) / 1e8) as total_debt_usd
FROM aave_v3.UserAccountData
WHERE
block_time = (SELECT MAX(block_time) FROM aave_v3.UserAccountData)
GROUP BY 1
ORDER BY 2 DESC
這個查詢將借款人分為不同風險類別,幫助理解協議的風險分佈。如果大量用戶處於 At Risk 或 Liquidatable 狀態,協議面臨系統性清算風險的可能性就會增加。
3.3 穩定幣流向追蹤
穩定幣是加密貨幣市場的「美元替代品」,其流向往往預示著市場資金的進出。以下查詢追蹤 USDC 的跨交易所流動:
WITH exchange_addresses AS (
-- 這需要結合 Nansen 等工具的標籤數據
SELECT address FROM (
VALUES
(0x8ba1f109551bD432803012645Ac136ddd64DBA72), -- Coinbase Hot Wallet
(0xfE1A7d3eF6d1f57C4D4a0E3b6bF7D3C4E3c8fE1A), -- Binance Hot Wallet
(0x47ac0Fb4F2D84898e4D9E7b4DaB3C24509a6D4a), -- Kraken
(0xFa4B8cAc778B8b1A1cE3d7f2C7b3E9f2C4d1A8b9) -- OKX
) AS t(address)
)
SELECT
DATE_trunc('day', block_time) as day,
CASE
WHEN "to" IN (SELECT address FROM exchange_addresses) THEN 'To Exchange'
WHEN "from" IN (SELECT address FROM exchange_addresses) THEN 'From Exchange'
ELSE 'Other'
END as flow_direction,
SUM(CAST(value AS DOUBLE) / POWER(10, 6)) as volume_millions
FROM erc20.ERC20_Transfer
WHERE
contract_address = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 -- USDC
AND block_time >= NOW() - INTERVAL '30' DAY
GROUP BY 1, 2
ORDER BY 1, 3 DESC
這個分析可以幫助理解資金是流入還是流出交易所,從而判斷市場情緒。當大量 USDC 流入交易所時,通常預示著投資者準備賣出;反之,當 USDC 流出交易所時,投資者可能在累積資產。
3.4 TVL 與協議增長追蹤
追蹤 DeFi 協議的總鎖定價值(TVL)變化是評估協議增長的基本方法。以下查詢計算各主流借貸協議的 TVL 歷史趨勢:
-- Aave V3 TVL 追蹤
SELECT
DATE_trunc('day', block_time) as day,
SUM(CAST(aToken_balance AS DOUBLE) / POWER(10, aToken_decimals)) as tvl_usd
FROM aave_v3.AToken_balances
WHERE
aToken_symbol IN ('aEthUSDC', 'aEthUSDT', 'aEthWETH', 'aEthWBTC', 'aEthDAI')
AND block_time >= NOW() - INTERVAL '180' DAY
GROUP BY 1
ORDER BY 1
這個查詢計算 Aave V3 以 ETH 計價的 TVL。實際應用中,通常需要將各種資產的價值轉換為美元,這需要結合價格數據。 Dune 提供了名為 prices.usd 的輔助表格,包含各種代幣的美元價格:
WITH aave_deposits AS (
SELECT
DATE_trunc('day', block_time) as day,
SUM(CAST(aToken_balance AS DOUBLE) / POWER(10, aToken_decimals)) as aeth_amount
FROM aave_v3.AToken_balances
WHERE
aToken_symbol = 'aEthWETH'
AND block_time >= NOW() - INTERVAL '180' DAY
GROUP BY 1
)
SELECT
d.day,
d.aeth_amount,
p.price as eth_price,
d.aeth_amount * p.price as tvl_usd
FROM aave_deposits d
LEFT JOIN prices.usd p ON p.symbol = 'WETH' AND DATE_trunc('day', p.minute) = d.day
ORDER BY d.day
通過這個查詢,我們可以獲得 Aave V3 以美元計價的 TVL 歷史數據,進行更有意義的趨勢分析。
第四章:進階分析技術
4.1 視窗函數與移動平均
視窗函數(Window Functions)是進行複雜時間序列分析的神兵利器。以下使用移動平均來平滑每日交易量的波動:
SELECT
DATE_trunc('day', block_time) as day,
COUNT(*) as daily_tx_count,
-- 7 天移動平均
AVG(COUNT(*)) OVER (
ORDER BY DATE_trunc('day', block_time)
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) as ma_7_day,
-- 30 天移動平均
AVG(COUNT(*)) OVER (
ORDER BY DATE_trunc('day', block_time)
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW
) as ma_30_day
FROM ethereum.transactions
WHERE block_time >= NOW() - INTERVAL '90' DAY
GROUP BY 1
ORDER BY 1
這個查詢計算每日交易數量,並同時顯示 7 天和 30 天的移動平均線。移動平均可以有效過濾短期波動,揭示更長期的发展趨勢。
4.2 同比與環比分析
同比(Year-over-Year)和環比(Month-over-Month)分析是理解增長趨勢的重要方法:
WITH monthly_stats AS (
SELECT
DATE_TRUNC('month', block_time) as month,
COUNT(DISTINCT "from") as active_users,
COUNT(*) as transaction_count,
SUM(CAST(value AS DOUBLE) / POWER(10, 18)) as volume_eth
FROM ethereum.transactions
WHERE block_time >= NOW() - INTERVAL '13' MONTH
GROUP BY 1
)
SELECT
current.month,
current.active_users as current_users,
previous.month as previous_month,
previous.active_users as previous_month_users,
-- 環比增長
(current.active_users - previous.active_users)::DOUBLE / previous.active_users * 100 as mom_growth_pct,
-- 同比增長(同月去年)
yoy.active_users as year_ago_users,
(current.active_users - yoy.active_users)::DOUBLE / yoy.active_users * 100 as yoy_growth_pct
FROM monthly_stats current
LEFT JOIN monthly_stats previous
ON DATE_ADD('month', 1, previous.month) = current.month
LEFT JOIN monthly_stats yoy
ON DATE_ADD('year', 1, yoy.month) = current.month
ORDER BY current.month
這個查詢同時計算環比和同比增長率,幫助分析人員理解增長的勢頭和長期趨勢。
4.3 異常檢測與警報
異常檢測是識別潛在風險的重要手段。以下是一個簡單的異常檢測查詢,找出交易量異常高於歷史平均的天數:
WITH daily_stats AS (
SELECT
DATE_TRUNC('day', block_time) as day,
COUNT(*) as tx_count
FROM ethereum.transactions
WHERE block_time >= NOW() - INTERVAL '90' DAY
GROUP BY 1
),
baseline AS (
SELECT
AVG(tx_count) as avg_tx,
STDDEV(tx_count) as std_tx
FROM daily_stats
WHERE day < NOW() - INTERVAL '7' DAY -- 排除最近一周
)
SELECT
ds.day,
ds.tx_count,
baseline.avg_tx,
baseline.std_tx,
(ds.tx_count - baseline.avg_tx) / baseline.std_tx as z_score,
CASE
WHEN (ds.tx_count - baseline.avg_tx) / baseline.std_tx > 2 THEN 'High Alert'
WHEN (ds.tx_count - baseline.avg_tx) / baseline.std_tx > 1.5 THEN 'Warning'
ELSE 'Normal'
END as alert_level
FROM daily_stats ds, baseline
WHERE ds.day >= NOW() - INTERVAL '7' DAY
ORDER BY ds.day DESC
這個查詢計算最近一周每天的交易量 Z 分數(標準化分數),當 Z 分數超過 1.5 時發出警告,超過 2 時發出高度警報。這種分析方法可以用於構建自定義的監控儀表板。
4.4 用戶分群與行為分析
對用戶進行分群是理解協議採用情況的高級技術。以下分析 DeFi 用户的活動模式:
WITH user_activity AS (
SELECT
"from" as user_address,
DATE_TRUNC('day', block_time) as activity_date,
COUNT(*) as tx_count,
SUM(CAST(value AS DOUBLE) / POWER(10, 18)) as volume_eth
FROM ethereum.transactions
WHERE
block_time >= NOW() - INTERVAL '30' DAY
AND "to" IN (
-- DeFi 協議地址列表
SELECT DISTINCT "to" FROM ethereum.transactions
WHERE block_time >= NOW() - INTERVAL '180' DAY
AND "to" IN (
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, -- Uniswap V2 Router
0xE592427A0AEce92De3Edee1F18E0157C05861564, -- Uniswap V3 Router
0x87870Bca3F3f6335e32cdC0d59b7b238621C8292 -- Aave V3 Pool
)
)
GROUP BY 1, 2
),
user_summary AS (
SELECT
user_address,
COUNT(*) as active_days,
SUM(tx_count) as total_transactions,
SUM(volume_eth) as total_volume
FROM user_activity
GROUP BY 1
)
SELECT
CASE
WHEN active_days >= 20 THEN 'Power User'
WHEN active_days >= 10 THEN 'Regular User'
WHEN active_days >= 3 THEN 'Casual User'
WHEN total_transactions >= 10 THEN 'Active Trader'
ELSE 'One-time User'
END as user_segment,
COUNT(*) as user_count,
SUM(total_transactions) as total_transactions,
SUM(total_volume) as total_volume
FROM user_summary
GROUP BY 1
ORDER BY 2 DESC
這個查詢將 DeFi 用戶分為不同類別,分析各類別用戶的數量和貢獻度。這類分析對於理解協議的用戶基礎結構和設計用戶增長策略非常有價值。
第五章:實務案例研究
5.1 分析某代幣的持倉分佈
假設我們需要分析一個新發行代幣的持倉分佈,識別可能的巨鯨和潛在風險:
WITH token_holders AS (
SELECT
to_address as holder,
SUM(CAST(value AS DOUBLE) / POWER(10, 18)) as balance
FROM erc20.ERC20_Transfer
WHERE
contract_address = 0x[代幣合約地址]
GROUP BY to_address
HAVING SUM(CAST(value AS DOUBLE) / POWER(10, 18)) > 0
),
ranked_holders AS (
SELECT
holder,
balance,
SUM(balance) OVER() as total_supply,
balance / SUM(balance) OVER() * 100 as percentage,
ROW_NUMBER() OVER(ORDER BY balance DESC) as rank
FROM token_holders
)
SELECT
rank,
holder,
ROUND(balance, 2) as balance,
ROUND(percentage, 2) as percentage_of_total,
CASE
WHEN percentage > 10 THEN 'Whale'
WHEN percentage > 1 THEN 'Large Holder'
WHEN percentage > 0.1 THEN 'Medium Holder'
ELSE 'Small Holder'
END as holder_type
FROM ranked_holders
WHERE rank <= 100
ORDER BY rank
這個查詢識別代幣的前 100 持有者,並根據持倉比例進行分類。當前 10 或前 20 持有者佔據過高比例時,往往預示著代幣分佈集中度過高的風險。
5.2 追蹤穩定幣協議的儲備金變化
以 MakerDAO 為例,分析其抵押品構成的變化:
SELECT
DATE_TRUNC('day', block_time) as day,
SUM(CASE WHEN token = 'ETH' THEN amount END) as eth_collateral,
SUM(CASE WHEN token = 'WBTC' THEN amount END) as wbtc_collateral,
SUM(CASE WHEN token = 'USDC' THEN amount END) as usdc_collateral,
SUM(CASE WHEN token = 'USDT' THEN amount END) as usdt_collateral,
SUM(CASE WHEN token = 'DAI' THEN amount END) as dai_collateral
FROM maker.vat_frob_events
WHERE
block_time >= NOW() - INTERVAL '180' DAY
GROUP BY 1
ORDER BY 1
這個查詢追蹤 MakerDAO 抵押品構成的歷史變化,幫助理解協議的風險敞口變化趨勢。
5.3 分析 Layer 2 採用趨勢
Layer 2 的採用情況是 2024-2026 年以太坊生態最重要的趨勢之一。以下分析各 L2 的橋接資金流向:
-- 追蹤 L2 橋接活動
SELECT
DATE_TRUNC('day', evt_block_time) as day,
CASE
WHEN l2_token IN (0x4200000000000000000000000000000000000006, 0x000000000000000000000000000000000000000A) THEN 'Optimism'
WHEN l2_token IN (0x3f56e0c36d275367b8c502090ebf7e7a0cd00fd6, 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48) THEN 'Arbitrum'
WHEN l2_token = 0x4ed4e862860bed51a9570b96d89af5e1b0efefed THEN 'Base'
END as l2_network,
COUNT(*) as bridge_count,
SUM(CAST(amount AS DOUBLE) / POWER(10, 6)) as volume_usd
FROM arbitrum_bridge.Deposit -- 範例:Arbitrum 橋接數據
WHERE evt_block_time >= NOW() - INTERVAL '90' DAY
GROUP BY 1, 2
ORDER BY 1, 4 DESC
5.4 識別 DeFi 套利機會
分析同一代幣在不同 DEX 之間的價格差異:
WITH uniswap_price AS (
SELECT
DATE_TRUNC('minute', block_time) as minute,
AVG(CAST(amountIn AS DOUBLE) / CAST(amountOut AS DOUBLE)) as price
FROM (
SELECT block_time, amount0In as amountIn, amount0Out as amountOut
FROM uniswap_v3.Swap
WHERE token0 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
UNION ALL
SELECT block_time, amount1In as amountIn, amount1Out as amountOut
FROM uniswap_v3.Swap
WHERE token1 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
) t
WHERE amountOut > 0
GROUP BY 1
),
sushiswap_price AS (
SELECT
DATE_TRUNC('minute', block_time) as minute,
AVG(CAST(amountIn AS DOUBLE) / CAST(amountOut AS DOUBLE)) as price
FROM (
SELECT block_time, amount0In as amountIn, amount0Out as amountOut
FROM sushiswap.Swap
WHERE token0 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
UNION ALL
SELECT block_time, amount1In as amountIn, amount1Out as amountOut
FROM sushiswap.Swap
WHERE token1 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
) t
WHERE amountOut > 0
GROUP BY 1
)
SELECT
u.minute,
u.price as uniswap_price,
s.price as sushiswap_price,
ABS(u.price - s.price) / s.price * 100 as price_diff_pct
FROM uniswap_price u
JOIN sushiswap_price s ON u.minute = s.minute
WHERE ABS(u.price - s.price) / s.price > 0.5 -- 差異超過 0.5%
ORDER BY price_diff_pct DESC
LIMIT 100
這個查詢識別 Uniswap 和 Sushiswap 之間的顯著價格差異,這可能代表套利機會。注意:實際套利需要考慮 Gas 成本、交易滑點和資金流動性等因素。
第六章:Dune 與其他工具整合
6.1 結合 Nansen 標籤數據
Nansen 的錢包標籤是識別區塊鏈地址身份的重要工具。雖然 Nansen 數據需要付費訂閱,但可以通過其公開的儀表板獲取部分信息並手動整合:
-- 識別交易所資金流向(需要手動維護交易所地址列表)
WITH exchange_deposits AS (
SELECT
to_address as exchange_address,
SUM(CAST(value AS DOUBLE) / POWER(10, 6)) as usdc_deposited_30d
FROM erc20.ERC20_Transfer
WHERE
contract_address = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
AND block_time >= NOW() - INTERVAL '30' DAY
AND to_address IN (
0x8ba1f109551bD432803012645Ac136ddd64DBA72, -- Coinbase
0xfE1A7d3eF6d1f57C4D4a0E3b6bF7D3C4E3c8fE1A, -- Binance
0x47ac0Fb4F2D84898e4D9E7b4DaB3C24509a6D4a -- Kraken
)
GROUP BY 1
)
SELECT
exchange_address,
usdc_deposited_30d,
CASE exchange_address
WHEN 0x8ba1f109551bD432803012645Ac136ddd64DBA72 THEN 'Coinbase'
WHEN 0xfE1A7d3eF6d1f57C4D4a0E3b6bF7D3C4E3c8fE1A THEN 'Binance'
WHEN 0x47ac0Fb4F2D84898e4D9E7b4DaB3C24509a6D4a THEN 'Kraken'
END as exchange_name
FROM exchange_deposits
ORDER BY usdc_deposited_30d DESC
6.2 與 The Graph 數據對比
The Graph 是另一個重要的區塊鏈數據索引協議,其數據可以用作 Dune 數據的交叉驗證:
-- 對比 Dune 和 The Graph 的 Uniswap V3 交易量數據
-- 這個查詢僅作示範用途,實際需要根據 The Graph 的 API 結構調整
WITH dune_data AS (
SELECT
DATE_TRUNC('day', block_time) as day,
COUNT(*) as dune_swap_count
FROM uniswap_v3.Swap
WHERE block_time >= NOW() - INTERVAL '30' DAY
GROUP BY 1
),
the_graph_data AS (
-- 假設從 The Graph 導入的數據
SELECT
date as day,
swapCount as tg_swap_count
FROM the_graph_data.uniswap_v3_daily_data
WHERE date >= CURRENT_DATE - INTERVAL '30' DAY
)
SELECT
d.day,
d.dune_swap_count,
tg.tg_swap_count,
ABS(d.dune_swap_count - tg.tg_swap_count) as difference,
ABS(d.dune_swap_count - tg.tg_swap_count)::DOUBLE / d.dune_swap_count diff * 100 as_pct
FROM dune_data d
LEFT JOIN the_graph_data tg ON d.day = tg.day
WHERE diff_pct > 1
ORDER BY diff_pct DESC
6.3 使用 Python 進行進階分析
對於更複雜的分析,可以將 Dune 查詢結果導出到 Python 中處理:
# 範例:使用 Dune API 獲取數據並進行分析
import requests
import pandas as pd
DUNE_API_KEY = "your_api_key"
QUERY_ID = 123456
# 獲取查詢結果
url = f"https://api.dune.com/api/v1/query/{QUERY_ID}/results"
headers = {"x-dune-api-key": DUNE_API_KEY}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
df = pd.DataFrame(data['result']['data'])
# 計算更多指標
df['rolling_avg'] = df['value'].rolling(window=7).mean()
df['z_score'] = (df['value'] - df['value'].mean()) / df['value'].std()
# 識別異常
anomalies = df[abs(df['z_score']) > 2]
print(anomalies)
Dune 提供 API 供用戶程序化地獲取查詢結果,這使得與 Python、R 或其他數據分析工具的整合變得簡單。
第七章:最佳實踐與效能優化
7.1 查詢效能優化技巧
在處理大量區塊鏈數據時,查詢效能至關重要。以下是一些關鍵的優化技巧:
避免全表掃描:在 WHERE 子句中使用適當的過濾條件,特別是時間範圍和地址過濾。區塊鏈數據庫通常非常龐大,沒有過濾條件的查詢可能會運行很長時間或超時。
-- 低效:全表掃描
SELECT COUNT(*) FROM erc20.ERC20_Transfer
-- 高效:限定時間範圍
SELECT COUNT(*)
FROM erc20.ERC20_Transfer
WHERE block_time >= NOW() - INTERVAL '30' DAY
使用恰當的 JOIN 順序:先過濾再 JOIN 可以大幅提升效能。
-- 低效
SELECT *
FROM large_table t1
JOIN small_table t2 ON t1.address = t2.address
WHERE t2.status = 'active'
-- 高效:先過濾小表
WITH filtered_small AS (
SELECT address FROM small_table WHERE status = 'active'
)
SELECT *
FROM large_table t1
JOIN filtered_small t2 ON t1.address = t2.address
使用子查詢替代 JOIN:在某些情況下,子查詢比 JOIN 更高效,特別是當只需要聚合結果時。
7.2 數據驗證與質量檢查
在使用區塊鏈數據進行分析之前,驗證數據質量非常重要:
-- 檢查數據完整性:確認區塊號是否連續
WITH block_sequence AS (
SELECT
block_number,
LAG(block_number) OVER(ORDER BY block_number) as prev_block
FROM ethereum.blocks
WHERE block_time >= NOW() - INTERVAL '7' DAY
)
SELECT
COUNT(*) as total_blocks,
COUNT(CASE WHEN prev_block IS NULL OR block_number = prev_block + 1 THEN 1 END) as continuous_blocks,
COUNT(CASE WHEN prev_block IS NOT NULL AND block_number != prev_block + 1 THEN 1 END) as gaps
FROM block_sequence
7.3 建立可複用的查詢模板
將常用的查詢邏輯封裝為模板可以提高工作效率:
-- 通用代幣餘額查詢模板
{% macro token_balance(token_address, address, decimals=18) %}
SELECT
SUM(CAST(value AS DOUBLE)) / POWER(10, {{ decimals }}) as balance
FROM erc20.ERC20_Transfer
WHERE contract_address = {{ token_address }}
AND to_address = {{ address }}
UNION ALL
SELECT
-SUM(CAST(value AS DOUBLE)) / POWER(10, {{ decimals }})
FROM erc20.ERC20_Transfer
WHERE contract_address = {{ token_address }}
AND "from" = {{ address }}
{% endmacro %}
-- 使用方式
{{ token_balance('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', '0x7713974908Be4B591487ba2F7e3C4E7D1C2bb257', 6) }}
Dune 支援 Jinja 模板語法,可以用來創建可複用的查詢片段。
第八章:常見應用場景與儀表板範例
8.1 市場情緒儀表板
一個完整的市場情緒監控儀表板應該包含以下核心指標:
-- 1. 穩定幣總市值變化
WITH stablecoins AS (
SELECT DATE_TRUNC('day', block_time) as day,
SUM(CAST(value AS DOUBLE) / POWER(10,
CASE contract_address
WHEN 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 THEN 6 -- USDC
WHEN 0xdAC17F958D2ee523a2206206994597C13D831ec7 THEN 6 -- USDT
WHEN 0x6B175474E89094C44Da98b954E960AC8958636A9 THEN 18 -- DAI
ELSE 18
END
)) as volume
FROM erc20.ERC20_Transfer
WHERE contract_address IN (
0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,
0xdAC17F958D2ee523a2206206994597C13D831ec7,
0x6B175474E89094C44Da98b954E960AC8958636A9
)
AND block_time >= NOW() - INTERVAL '30' DAY
GROUP BY 1
)
SELECT day, SUM(volume) FROM stablecoins GROUP BY 1 ORDER BY 1
8.2 DeFi 協議健康監控儀表板
-- 2. 主要 DeFi 協議 TVL
SELECT
DATE_TRUNC('day', block_time) as day,
'Uniswap V3' as protocol,
SUM(CAST(token0_balance AS DOUBLE)) as tvl_eth
FROM uniswap_v3.Pool
WHERE block_time >= NOW() - INTERVAL '30' DAY
GROUP BY 1
-- 可類推添加 Aave, Compound 等協議
8.3 巨鯨活動監控儀表板
-- 3. 大額轉帳監控
SELECT
block_time,
CASE
WHEN CAST(value AS DOUBLE) / POWER(10, 6) > 1000000 THEN 'Very Large (>1M)'
WHEN CAST(value AS DOUBLE) / POWER(10, 6) > 100000 THEN 'Large (100K-1M)'
WHEN CAST(value AS DOUBLE) / POWER(10, 6) > 10000 THEN 'Medium (10K-100K)'
ELSE 'Small (<10K)'
END as tx_size,
COUNT(*) as count
FROM ethereum.transactions
WHERE
block_time >= NOW() - INTERVAL '24' HOUR
AND CAST(value AS DOUBLE) / POWER(10, 18) > 10 -- 大於 10 ETH
GROUP BY 1, 2
ORDER BY block_time DESC
結論
Dune Analytics 為區塊鏈數據分析提供了一個強大且易於使用的平台。通過掌握本教學中介紹的 SQL 技術和分析方法,研究人員和開發者可以進行深入的 DeFi 研究、市場分析和風險監控。關鍵在於:不斷練習、持續關、注數據質量並將定量分析與對區塊鏈生態的定性理解相結合。
區塊鏈數據分析是一個快速發展的領域,新的協議、新的數據類型和新的分析方法層出不窮。建議讀者在掌握基礎之後,持續關注 Dune 社區的優秀查詢和儀表板,不斷擴展自己的分析能力。同時,也要記住數據只是洞察的起點,真正的價值在於將數據轉化為有意義的洞見和決策支持。
相關文章
- SocialFi 完整指南:社交金融與代幣化社交經濟的技術架構與投資機遇 — SocialFi 代表著社交網路與去中心化金融的深度融合,是區塊鏈領域最具創新性的發展方向之一。本文深入解析 SocialFi 的技術架構、經濟模型、主要協議與應用,涵蓋 Lens Protocol、 Friend.tech、FWB 等主流實現方案。我們提供詳盡的風險分析與投資框架,幫助讀者理解這個正在重塑社交媒體商業模式的新興領域,同時提供實際操作指南和風險管理策略。
- 以太坊中小型項目案例研究:Liquid Staking 與 Restaking 生態深度分析 — 本文深入分析 Liquid Staking 和 Restaking 領域的中小型項目,從技術架構、經濟模型、風險特徵到實際應用場景,提供全面的案例研究。我們詳細介紹 Lido、Rocket Pool、Frax Ether、Swell Network 等代表性項目,以及 EigenLayer 等 Restaking 協議的創新機制,幫助投資者理解這些協議的風險與收益特徵。
- 以太坊跨境支付應用完整指南:技術架構、主要案例與合規框架 — 跨境支付是國際貿易和個人匯款的支柱,傳統體系長期面臨效率低落、成本高昂、透明度不足等問題。以太坊作為最大的智慧合約平台,正在透過穩定幣、跨境支付協議、跨鏈互操作協議等技術,為跨境支付帶來革命性的改變。本文深入分析以太坊跨境支付的技術架構、主要應用案例、監管合規要求,以及未來發展趨勢。
- 以太坊 AI 代理完整技術指南:自主經濟代理開發與實作 — 人工智慧代理與區塊鏈技術的結合正在開創區塊鏈應用的新範式。本文深入分析以太坊 AI 代理的技術架構、開發框架、實作範例與未來發展趨勢,涵蓋套利策略、借貸清算、收益優化、安全管理等完整技術實作。
- 以太坊 DeFi 協議深度比較:借貸、DEX 與穩定幣生態完整分析 — 去中心化金融(DeFi)是以太坊生態系統中最具活力和創新性的領域之一。經過 2020 年的「DeFi 夏季」爆發、2022 年的市場低谷,以及 2023-2024 年的復甦與成熟,以太坊的 DeFi 生態已經形成了清晰的協議分工和成熟的風險定價機制。截至 2026 年 2 月,以太坊主網的 DeFi 總鎖定價值(TVL)約為 650 億美元,涵蓋借貸協議、去中心化交易所(DEX)、穩定幣、衍生品等
延伸閱讀與來源
- Ethereum.org 以太坊官方入口
- EthHub 以太坊知識庫
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!