寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好



Celestia 當時肯定沒做好應對大規模流量的舉措,在 RPC 節點配置方面也很敷衍。

撰文:霧月,極客 Web3

12 月 17 日時,我知道 Celestia 上要出銘文 CIAS,打算臨時趕工寫一個刷銘文的腳本。現在,對於 Celestia 及其所在的 Cosmos 生態,還有 CIAS 這個活動本身,我都有挺多想吐槽的。

其實,寫一個刷銘文的腳本不難,主要分為三個模塊:錢包構建、連接節點、泛洪交易。前兩步只需要在目標公鏈的開發者文檔裡,就能找到快速實現的方法。

我先去 Celestia 官網和 Github 看了一圈,並沒有面向開發者 build 用戶場景的用例,主要都是節點運行等相關的文檔。當然這可以理解,因為 Celestia 並不是一個 ToC 的區塊鏈。Celestia 只是在一個不起眼的地方,提到自己是基於 Cosmos 的,用 CosmJS 就可以與其主網交互。

於是我就直奔 CosmJS。但 Cosmos 怎麼說呢,連文檔都做不好。我直接去的 Github,按常理說,一般這種 JS 都會在 Github 上有使用用例。但它的教程隱藏在一個二級頁面裡,而且點進去以後,按照它的配置做一通,最後報錯。

這報錯還不是環境問題,是因為它的教程沒有跟隨教程版本更新,經常這個類名字改了那個調不了等等。我在老的教程版本上切換了 npm 庫的版本,依然有些用例跑不通,折騰了一會就放棄了。

於是又谷歌了一下,結果發現正確的文檔在官網而不是 Github 上,這有點不符合常理。再次,Github 的 readme 更新一下教程指向官網不好嗎?

拿到正確的教程後,我迅速完成了錢包構建、連接節點這兩個步驟,開始構建泛洪交易模塊。這個模塊說簡單了就是一個處理交易簽名 + 網路請求的 for 迴圈。但這裡卻又碰上一些問題:

CosmJS 庫裡所有的交易方法,都只暴露出了交易本身的參數,但它的 sequence 卻沒有暴露出來(sequence 類比於以太坊裡的 nonce,是為了防止重放攻擊而設置的交易計數器,每筆交易發出後,nonce 和 sequence 都自動 +1)。

寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好插图1

Sequence 居然是它在 sign 簽名的時候去連接網路獲取(chainId 等也是),要經過 sendTokens() -> signAndBroadCast -> sign()。每次提交交易都去網路請求等待返回會影響刷的速度,也會增加沒用的網路請求,對於泛洪是不利的,當然也不利於加速 / 取消某筆交易。

寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好插图3

我們可以回顧下以太坊 Web3JS 的發送交易的方法,其中你可以自己指定 nonce。但 CosmJS 裡不可以。我還是覺得以太坊的設計要合理很多,可以直接指定 nonce 用於取消 / 加速交易,如果一筆交易卡住了,你可以自定義一個 nonce 相同的交易去替代卡住的交易,當然也可以用於我們的泛洪攻擊。

寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好插图5

由於時間很緊張,還有其他幾個需要修改的庫裡的函數,我決定不使用 Proxy 去 hook 重寫了,而是直接在 CosmJS 庫裡修改。

腳本觸發泛洪交易的思路是,通過 for 迴圈不斷的發起交易並生成簽名,發送給 RPC 節點,發起一筆交易後 sequence/nonce 就 +1,發起 20 筆交易後,再重新迴圈一個週期。

Sequence 只在每次泛洪週期開始前,拉取到本地,不必像 CosmJS 庫默認的那樣,每次交易後都向節點重新請求一遍 sequence。而 chainId 則寫成固定的值,不必反覆向節點請求。(編者注:這裡的迴圈次數設置的比較低,顯然作者還沒那麼暴力。某人在打 Conflux 銘文時,曾將每個週期的迴圈次數改為 1000,每分鐘差不多發出去 200 筆不同的交易)

寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好插图7

最終,我得到了一個簡陋的 Celestia 腳本,12 月 17 日當晚 CIAS 拔網線後,我簡單測試了一下這個腳本,發出去了幾百筆交易。在 12 月 19 日凌晨 CIAS 繼續開打後,我確實打到了一些 CIAS(大概 1800 個)。但還是有其他要吐槽的地方:

  • 12 月 17 日,Celestia 的 RPC 節點出現了數據嚴重不同步的問題,不同 RPC 節點的區塊高度差異很大,你向節點請求自己賬戶的 Sequence 時,返回的結果基本不一致,讓人很痛苦。Celestia 區塊瀏覽器也不可用,基本抓瞎。可以說,此時 Celestia 網路雖然沒宕機,還能出塊,但估計也快到極限了。

  • 當天,CIAS 銘文官方眼見 Celestia 快扛不住,臨時宣佈 48460 號區塊高度後上鏈的銘文鑄造交易全部無效,頗有「交易所拔網線」之風。而且 CIAS 自己的網站也崩了。

寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好插图9

  • 有人認為 Cosmos 鏈原生的共識協定,在區塊的共識方面做的很差,對此不作置評,但顯然昨晚 CIAS 拔網線的目的耐人尋味。

  • 12 月 17 日時,你很難選中一個同步數據最快的節點,因為幾乎所有的 RPC 節點都被擠爆了,經常無回應。我後來嘗試寫了一些自動切換節點的代碼。

  • CIAS 本身的銘文格式,和其他銘文不太一致,比如 brc-20 的 json 裡,所有數位都是字串,而 cia-20 裡的卻是一個數字。

寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好插图11

  • CIAS 銘文的成本昨晚最高時,飆漲到了每張 1.5~2U,甚至有人付出了 80U 打了一張銘文。這麼高的手續費反映的就是 TPS 有限,Celestia 創始人自稱,每秒可以處理 10k 筆交易,顯然是在扯淡。

寫 Celestia 腳本後有感:Cosmos 很多工作沒搞好插图13

總體下來,12 月 17 日當晚的體驗就是一句話:Celestia 當時肯定沒做好應對大規模流量的舉措,在 RPC 節點配置方面也很敷衍(很難想像 1 小時就能打炸幾十號 RPC 節點)。

19 號當晚這種情況好了很多,除了 gas 費飆漲之外,其他方面倒沒什麼太大問題,只能說 Celestia 作為一個專門給輕節點分發數據的 DA 網路,暫時性的經受住了考驗,但不知道以後還會不會有什麼別的坑。

聯系郵箱:0xniumao@gmail.com