關於在 Dune 平台上進行 dDAO DashBoard 的一些開發.md

關於在 Dune 平台上進行 dDAO DashBoard 的一些開發

tags: Tools, Dune

背景

dDAO 在 Aragon 創建了一個 DAO,並進行了一些動作(分發代幣、投票等)。然後由於 Aragon 默認提供的面板的展示並不是特別友好所以考慮通過 Dune 來個性化製作一個面板,跟蹤一些想看到的數據。

想看到的數據

  • $DDAO token 每次发放记录

  • $DDAO token holder 及排名

dDao 以及本次面板開發需要用到的一些信息

dDAO 鏈接 代幣分發記錄

$DDAO 合約地址:0x5D8C3E43EBd84d63CfFD00e473ba3Fdb5920CDC1

一些思路和備忘

關於 Dune 上的數據源

本來想直接在 Dune 的 Polygon 分塊上直接搜索類似 “dDAO” 或者 “aragon” 的結果,使用現成的結果集,結果沒有找到。

隨後嘗試使用 polygon.logs 結果集,也沒有發現 dDAO 的合約地址的數據。嘗試查詢了文檔并在社區溝通,了解到需要在 Dune 上提交申請以及相關信息,Dune 才會對涉及的合約以及數據進行處理,形成單獨的數據集。(申請審核時間大概在 2-3 天以上。所以,雖然提交了申請,但本次考慮再嘗試其他方法來完成。)

最終,只能回到 traces、log、transactions 這幾張我理解的原子表,從海量數據里去實現面板展示。

接下來的一些分析

先分析鏈上 tx 信息

常規套路,從鏈上記錄中去找規律,找信息。通過 tx 記錄,找到 log 頁中的信息(如下截圖),最後定位到發放 token 的方法。 Transfer (index_topic_1 address _from, index_topic_2 address _to, uint256 _amount)

根據參數說明,就可以得到:

  • 智能合約地址:0x5d8c3e43ebd84d63cffd00e473ba3fdb5920cdc1

  • topic1: _from 發放 token 的地址

  • topic2: _to 接收 token 的錢包地址

  • data: _amount 發放 token 數量

到 Dune 的數據集里對照著找關係

通過合約地址以及調用方法,在 logs 表中嘗試查找數據進行驗證。通過比對發放數據,基本確認能匹配上了。唯一美中不足的是,相關數據都是 HEX 格式,最終成為可用的分析、展示數據前,還需要進行轉碼(Decode,這時候就體現出了 Dune 提供的針對合約的解碼數據集的優勢)。 至此,大致思路就確定了:通過合約地址、調用方法,在 logs 中抓取相關發送日誌,形成基礎數據,之後在基礎數據上進行各樣的展示。

動手開淦

考慮到要求還未完全確定,同時可能要產出多種形式的數據,而且操作基本都可以基於相同的數據集,所以在著手展示數據前,先形成一個視圖(view),包含:操作時間、合約地址、接收地址、token 量等解碼后的數據。

同時考慮到 tx 需要被成功執行,最終得到生成視圖的代碼如下:

dune_user_generated.ddao_token_v1

CREATE OR REPLACE view dune_user_generated.ddao_token_v1 as 

select
  logs.block_time as transfer_day
  , replace(CONCAT('', substring(logs.topic3 from 13)), '\x', '0x') as transfer_receiver
  , logs.tx_hash as tx_hash
  , bytea2numeric(logs.data) / 1e18 as transfer_amount
  
from
  polygon.logs logs, polygon.transactions txs

where 
  logs.tx_hash = txs.hash
  and txs.success = 'true'
  and logs.contract_address = '\x5d8c3e43ebd84d63cffd00e473ba3fdb5920cdc1'  -- ddao token manager contract address
  and logs.topic1 = '\xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' -- transfer function hex

階段性產出

隨著視圖的完成,後續的事情就變得簡單很多,只需要考慮展示的內容和形式就好。

根據常規分析套路,并基於 Dune 提供的圖形展示方式,簡單的做出了幾個面板上的組件并展示:

  • Token 供應總量

post image
  • Token 發放歷史(按天、按錢包)

post image
  • Token 持有者分析

post image

一些後續和總結

關於 Dune 的 Chart 組件

Dune 提供的 Chart 組件,不知道是我使用得不對,還是本身還需要改進,還有一些展示的不便,後面看看能不能解決。

我遇到的一些問題:

  • 多重分組下, Line Chart 的展示。

  • Stacked Column Chart 中,對數坐標下,數據會覆蓋坐標軸。

dDao 的解碼數據集

準備結束小作文前,看了一下之前提的數據集的解碼申請,很驚喜地發現已經被通過并處理完了。那就順便一起提一下。

最後說幾句題外話,Dune 這個工具大概在一年前就已經了解到,并有一些淺淺的嘗試,由於比較像數據庫操作,加之當時沒有什麼使用場景,就被擱置了。這次是在 dDAO 里正好有需要,終於硬著頭皮重新再來嘗試了 Dune。通過這次面板的嘗試,部分了解了 Dune 的一些機制,一些處理的原理,嗯嗯,蠻不錯的。