The Space 鏈上分析之二: Hall of Fame 繪圖英雄榜,占地排名榜,以及地價榜单
上周看到『The Space | 瘋狂的一夜,一晚畫了一千像素』就一直想知道,當前地圖上這樣瘋狂畫圖的人 除了 @Daisy 還有多少?
續上一篇 thespace."TheSpaceRegistry_evt_Color" events table 的使用,因為所有的繪圖事件 (events) 都一定會 emit 出一個 color event, 那麼查詢 evt_Color table 就能拿到所有人的繪圖過程,
SELECT owner, COUNT(*) AS count_drawings, COUNT(DISTINCT "tokenId") AS count_pixels FROM thespace."TheSpaceRegistry_evt_Color" GROUP BY 1 ORDER BY count_drawings DESC
上一篇已提到 COUNT(*) 可以做整體統計,除此以外它還可以分類統計,就是 GROUP BY 語句, 在 SELECT 之后放上 想要分類的項,此处用 owner, 并且在 FROM ...table 之后加上 GROUP BY ... 那麼 SELECT 后面就可以用 COUNT 作 「對此 owner 分類的」計數,比如 COUNT(*) 統計了整個繪圖次數,還可以用 COUNT(DISTINCT "tokenId") 統計不重複的 tokenId 數,此處 tokenId 對應的是 一百萬個像素的編號,也通俗理解為地塊編號;點击「Run」查詢,可以看到截止現在有 203 個錢包曾有過畫過;還可以看到 count_drawings vs count_pixels 是有差别的,應該是有很多像素發生了争搶的情况,被人繪成别的,自己再搶回来,當然也可能是很多人對畫好的顏色并不滿意,再来繪一次别的顏色。
SELECT owner, COUNT(*) AS count_drawings, COUNT(DISTINCT "tokenId") AS count_pixels, SUM(gas_used*gas_price)/1e18 AS gas_matic FROM thespace."TheSpaceRegistry_evt_Color" JOIN polygon.transactions ON hash=evt_tx_hash GROUP BY 1 ORDER BY count_drawings DESC
除此之外,因為 event table 都有存了原始的 對應 鏈上交易的 evt_tx_hash 此處也可以 順便展示其用途,即 對 polygon.transactions 這樣的 raw table 進行 JOIN Query, 聯合查詢,聯合的 field 是 evt_tx_hash 對應 polygon.transactions 上的 hash 這樣 可以想像两張 table 按相同的 hash 對接在一起 方便用。這里的例子只用到 polygon.transactions 里面的 gas_used*gas_price 這就是實際用到的 matic gas fee, 在 GROUP BY 語句中 除了 COUNT 還有類似的 SUM(...) 顾名思義就是統計求和,看看他們分别在 TheSpace 費了多少 Gas, 因為 Gas 的使用單位是 Matic, 内部与 Ether 相同的有小數點后 18位,所以 除以 科學計數法 (1e18) 就是變为以 Matic 為單位了
查詢結果已加入 https://dune.com/bluebasketbooks/thespace-dashboard 這張 Dashboard
其中 Daisy 的帳號 \x2af159c310... 也僅排第二而已,那麼排名榜單第一的 \x64110f5b... 究竟是誰?
又或者,因為上面結果是 TheSpace上線十几天以来的總計,如果按單日計算呢,Daisy的一晚畫了一千像素會不會是第一?答案在這里有了, https://dune.com/queries/920536?d=7 提示:按ㄖ分類也只不過是增加一個 GROUP BY 的維度,在 PostgreSQL 的語法是 date_trunc('day', evt_block_time) ::date AS ... 轉換為日期,結果仍然是 \x64110f5b... 以單日 1,117 drawings 排名榜首~ ( 當然這里通用的是 UTC 國際日期,而你所實際住地的 單日 繪了很多有可能在 UTC 被分到前后两日去了,有兴趣者還可以查 PostgreSQL 的時區函式来轉換使用當地ㄖ期 )
(二) 占地排名榜
上面問題在前幾天已加上到 Dashboard, 被眼尖的讀者 ( @裸子 ) 已發現,與 Polygonscan 上去對照,怎麼會不一樣?確實有可能有差異,因為上一篇說了,Dune的數據可能有 up to 3 hours delay。但如果三小時已過, TheSpace 上當前的近三小時并未有 新的繪圖 events, 那么就肯定是有一邊數據并未更新到最新。
另外一個原因,則来自,可能統計的是事情的不同面向。
與 Poygonscan 上的這個 Quantity(token) 數量對不起來,
具體來說,繪圖事件 與 Planck (PLK) holders 并非同一概念。繪圖事件僅僅是繪圖,可能是自己涂自己的地,只是變換顏色未有所有權轉移;而 hold 一個 Planck (PLK) 則有可能只是單純的買地,并未變換顏色。
于是,在 Polygonscan 上再研究,如果只買地不重畫顏色,會有何種 events?答案在 thespace."TheSpaceRegistry_evt_Transfer" 里面找到了,這一張 events table 記录的就是單純 ownership 轉移,有 "from" "to" "tokenId" 這几項就够用了,當然,与其它 events table 類似的是 也有 evt_block_time/evt_hash/.. 等等,在有需要時可以用于 JOIN Query
WITH last_owners AS ( SELECT DISTINCT ON ("tokenId") * FROM thespace."TheSpaceRegistry_evt_Transfer" ORDER BY "tokenId", evt_block_number DESC, evt_index DESC ) SELECT "to", COUNT(*), MAX(evt_block_time) AS latest, (ARRAY_AGG("tokenId" ORDER BY evt_block_time DESC))[1:5] AS last_5 FROM last_owners GROUP BY 1 ORDER BY count DESC, latest DESC
這里同樣先說結好了,需要從 thespace."TheSpaceRegistry_evt_Transfer" 里面查到結果,但因為這張事件表 記录了所有 ownership 轉移的情况,而為了對每 Planck (PLK) 只查最后一任 owner (地主), 需要一次 DISTINCT ON ("tokenId") 查詢,其含義是對每個 Planck 交易情况,只需要知道最后一次易手纪录,在 ORDER BY "tokenId" 之后可以按時間查詢 Descending 排序的最后一次記录,里面可以使用 evt_block_time DESC 与 evt_block_number DESC 也几乎相同,但在其它類似 高頻交易中有 多個 tokenId 在相同 block_number 的情况,得到相同的 evt_block_time, 于是外加上 evt_index DESC 更多一層保障。
得到 \x2af159c310e... 以 2841 holdings 與 Polygonscan 結果完全對應! 197 個帳號持有 27,000+ 對應2萬7千多個已開發地塊,并且与前 面 203 accounts 并不一致的原因是有人曾畫過但后来其手上所有 地塊都被人買走了
這里,還同時使用了 MAX(evt_block_time) 得到 每 owner 的最后一次 入手時間,以及 (ARRAY_AGG(...))[1:5] 等等順便取得每人的最后 5 次入手的地塊 (Planck) 編號,更為方便對照。
(三) 地價榜单
地價榜單,也是最多人問及的。同樣的工作原理,也是在 Polygonscan 上去尋找,定價過程中會觸發什麼 events? 然后在 thespace.* 這些 decoded tables 中去寻找
答案在 thespace."TheSpaceRegistry_evt_Price" 找到
WITH prices AS ( SELECT DISTINCT ON ("tokenId") price/1e18 AS price_spaces, * FROM thespace."TheSpaceRegistry_evt_Price" ORDER BY "tokenId", evt_block_time DESC ) SELECT * FROM prices -- WHERE price_spaces>=100 ORDER BY price_spaces DESC, evt_block_time DESC
同樣的原理,也使用 DISTINCT ON ("tokenId") 只关心查每 Planck 的最后一次定價,去重複,得到 臨時 prices table, 同時,因為 $Space幣同樣内部使用了小數點后 18位, 為了讀價方便,這里先計算 price/1e18 AS price_spaces 得到以 $Space為單位的數字
最后從 SELECT * FROM prices 讀出所有 columns, 想知道 定價榜单?就 按 定價 price_spaces 排降序就是了,得到 已開發過的 (minted) 所有 27,000+ 地塊的 價目表,
其中 "-- WHERE price_spaces>=100" 以 -- 開頭在 SQL 中是注釋掉,暫不運行的意思,你也可以試試 取消注釋,看看定價大于 100$Space 幣的地塊有多少?想知道定價最貴的地塊價錢是多少 ? 答案是 1,0000,0000 $Space, 一個億的 $Space幣!!
price_spaces tokenId price owner 100000000 728415 1e+26 \x437b672246e4e2.... 100000000 683092 1e+26 \x437b672246e4e2....
具體位置在哪儿,都来觀摩一下? 根據 tokenId 728415 = (y-1)*1000+x 来反向計算,其定位在 (415,729), 在這兒~
那個 紅色 「Default Risk」什麼意思? 應該喊「清稅官」在哪里 ?這位已經 Due Tax 3千4百多萬了
Like my work? Don't forget to support and clap, let me know that you are with me on the road of creation. Keep this enthusiasm together!
- Author
- More