看完這篇文章,你可以知道⋯⋯
✔️ DuneSQL 將成為唯一的引擎
✔️ Dune 可以做的兩種 NFT 持有者分析
前言
如果有在追蹤鏈上數據的人們對於 Dune 應該不會太陌生!
Dune 是一個能夠使用 SQL 語言便能抓取鏈上數據的一個平台,讓使用者可以做數據分析、簡單的資料視覺化。除了使用者自己創建的查詢外,也能看見平台上其他使用者創建的查詢,還有使用者做了許多好用的 DashBoard,讓你能掌握現在現在的趨勢!
這篇文主要將會著重於介紹 Dune 可以做的很基礎的兩種 NFT 項目分析,還有讓大家知道最近即將要拔掉的搜尋引擎(想到就想哭)。若想要了解最一開始如何使用的話,可以參考這篇去年 Lab 的文章。而我在這次的 Lab 的專案中第一次使用了 Dune,也是第一次學習 SQL 語言,目前發現在台灣也比較少有 Dune 相關的文章,所以希望這篇文可以幫助要使用 Dune 的人們!
那麼,我們就開始吧!
Contents
- 將在未來唯一僅存的 DuneSQL
- Dune 可以做哪些 NFT 持有者分析
將在未來唯一僅存的 DuneSQL
在 Dune 上進行查詢時,使用的引擎有許多種,可以依個人習慣、查詢目的來選擇引擎,而在我剛開始使用 Dune 的時候,我是學 SparkSQL 的語法,所以便理所當然地使用 SparkSQL 來進行查詢,而當時還有 Ethereum、DuneSQL 等其它引擎選擇,其中 DuneSQL 是 Dune 自己開發的引擎,當時他還是 Beta version 測試版。
因為當時的 Project 需要,所以我們都統一使用 SparkSQL。但是,Dune 在今年三月初宣布在今年內將會只剩下 DuneSQL 引擎,其他引擎將陸續退場,這便意味著當時我們用 SparkSQL 做的查詢,在未來若沒有改成 DuneSQL 的話,將會沒有辦法再使用。當時這個訊息實在來的非常突然,在當晚團隊便火速開始看兩者的語法差異(其實沒有差很多,都是非常細節上的不同),後來陸續把原本的 SparkSQL 引擎上的查詢搬運到 DuneSQL 上了。
在換成 DuneSQL 後,Dune 其實一直有強調這個引擎將會成為最快的引擎,因為過去用別的引擎查詢時,資料量較多時很常就需要 2 分鐘以上,剛開始換成 DuneSQL 時也確實有感受到他的迅速,但用久了其實覺得也沒有差非常多,每次按下 run 之後,依然還是跑去其他頁面做其他事再回來看跑出什麼。
講了這麼多心中的 OS,其實只是想讓大家知道未來只會剩下 DuneSQL,所以還沒轉換引擎的趕緊轉換引擎吧!
Dune 的 NFT 分析 — 與持有者相關
在讓大家知道接下來 Dune 將只留下 DuneSQL 引擎後,這裡的介紹也將會以 DuneSQL 引擎來呈現,並且將以 nft.trades 這張表作為示範。這張表上面記載了 NFT 的交易數據,如交易時間、買方地址、賣方地址、合約地址等。而 NFT 相關的表還有很多,如 nft.transfers,但本篇文將僅專注於 nft.trades 的應用,並且介紹與持有者相關的數據、圖表。
持有數排名&分佈圓餅圖
由於 nft.trades 這張表有記載著每一筆交易數據的買方、賣方,以及交易數量,因此可以使用該特性來計算個別地址的 NFT 持有數,並且再進一步做持有數排名,或是將持有數進行分類。
關於持有數排名,由於每筆資料都有 buyer 和 seller,記載著錢包地址,但直接看表的話難以看出各個持有者擁有多少張 NFT。因此,在此需要分別就 seller 和 buyer 的交易數量做處理。
在此我先建立名為 trade_detail 的子查詢,seller 部分將其數量乘以(-1),代表將 NFT 販售出去;buyer 部分將其數量保持原樣,代表購買 NFT 進來。接著再利用該子查詢地址所擁有的 NFT 數量加總,若賣出則會讓其數量 -1,買入則會 +1,再依據地址分組,便可得到各個地址所擁有的數量。
上述的步驟,以 DuneSQL 程式碼呈現如下:
with trade_detail as (
select seller as trader,
-1 * number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}
union all
select buyer as trader,
number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}
)
select trader,
sum(hold_items_count) as hold_items_count
from trade_detail
group by trader
order by 2 desc
以上的程式碼將會得到以下的持有者數量排名表:
根據上述的程式碼,可以再將各個持有者的數量標籤化。例如,將所有使用者分為持有 80 張以上、持有 50 張以上、持有 20 張以上等。因此,在這邊便用 case 來針對使用者的持有數量來給予數量標籤。程式碼如下:
with trade_detail as (
select seller as trader,
-1 * number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}
union all
select buyer as trader,
number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}
),
summ as (
select trader,
sum(hold_items_count) as hold_items_count
from trade_detail
group by trader
order by 2 desc
)
select *,
(case when hold_items_count >= 80 then 'hold 80+'
when hold_items_count >= 50 then 'hold 50+'
when hold_items_count >= 20 then 'hold 20+'
when hold_items_count >= 10 then 'hold 10'
when hold_items_count >= 5 then 'hold 5+'
when hold_items_count >= 3 then 'hold 3+'
when hold_items_count >= 2 then 'hold 2+'
else 'hold 1'
end) as hold_type
from summ
經過標籤化後,便可以計算各個組內擁有多少使用者,如以下程式碼(其中 pie 是上方程式碼將最後一個查詢命名為 pie 做的子查詢):
select distinct hold_type,
count(trader) as UsersCounts
from pie
group by 1
order by 1
以上步驟都完成後,就可以做出如下面的圓餅圖了!
買方與賣方數量
接下來,可以透過瞭解 NFT 項目的買方與賣方數量,來了解市場上對於該 NFT 的需求。
同樣在 nft.trades 的表中,分別取出 buyer 和 seller 的地址,並且接下來計算不重複地址的數量,最後再計算 buyer 和 seller 分別有多少人,如以下程式碼:
with buyers as (
select buyer as buyers_num,
from nft.trades
where nft_contract_address = {{nft_contract}}
),
sellers as (
select seller as sellers_num,
from nft.trades
where nft_contract_address = {{nft_contract}}
),
buyers_count as(
select count(distinct(buyers_num)) as buyers_amount
from buyers
),
seller_count as (
select count(distinct(sellers_num)) as sellers_amount
from sellers
),
summary as (
select *
from buyers_count
join seller_count on true
)
select *
from summary
接著便能使用 counter 來呈現該項目的 Buyer 與 Seller 分別有多少。