以太坊:用於狀態網絡的可擴展廣播方案
在我之前的新型交易 gossip 廣播網絡設計中其實可以看到我最初在為狀態網絡設計 gossip 廣播方面的嘗試。在之前的文章中,我介紹了一種設計,可以讓節點在無需處理完整交易池的情況下參與 gossip 廣播。
從較高層面上來說,我們關於交易 gossip 廣播的問題陳述如下(忽略 DOS 攻擊/安全性要求):
交易來自整個網絡。
一些網絡參與者本身就需要維護完整的交易池(例如,礦工、搶跑交易者)。
一些網絡參與者缺少足夠的資源來處理完整的交易池(例如,輕客戶端)。
我提議的交易 gossip 廣播方案採用了距離指標【我們稱之為 radius
(半徑)】,讓節點可以自行調整它們必須處理的交易池規模。節點採用一組簡單的規則來管理與之連接的對等節點集合,從而形成網絡拓撲結構。半徑最大的節點被視為網絡的“中心”,半徑最小的節點被視為網絡的“邊緣”。
該方案之所以有效,主要的兩點原因如下:
第一,我們預期,節點的半徑值會有很大差別,但 同時 都會相對較大。這種差異源自那些有動力維護“完整”半徑以及“較大”半徑的參與者。正是這些節點將位於網絡邊緣的節點連接到了一起。
第二,我們關於半徑值較大的預期是根據鍵空間推測出的。根據 Peter 最近關於交易池的文章,geth 節點默認最多可維護 4000 筆交易。在任意時刻,整個網絡中的待處理交易高達 4 萬至 40 萬筆。輕節點無法處理 4000 筆交易,但是處理其中 5% 不成問題。因此,我們預期半徑值通常在整個鍵空間的 1% 至 100% 之間。
將同樣的設計應用到狀態 gossip 廣播上(並不奏效)
我最初嘗試將這種設計應用到針對狀態網絡的 gossip 廣播上,但是沒有成功。主要原因如下:
第一,狀態網絡中各節點在半徑值上的差異會小得多。我們預期不太可能會有網絡參與者維護“完整”半徑。這會導致網絡中缺少一個起到連接邊緣作用的“中心”。
第二,半徑值會很小。假設有 200 GB 的狀態,平均每個節點提供 100MB 的存儲空間,且復制因子為 10,那么計算下來我們需要一個由 2 萬個節點組成的網絡。平均每個節點需要存儲 0.002%(1/20,000)的數據。
正是上述兩個不同之處從根本上改變了網絡拓撲結構,導致原來的交易 gossip 廣播網絡設計失靈。
與交易 gossip 廣播不同的目標
別忘了,交易 gossip 廣播的目標之一是,讓交易進入礦工所在的網絡“中心”。位於網絡邊緣的節點其實不是很在乎是否能看到所有待處理交易,即使一個都看不到也沒關系。它們主要關心的是能否廣播自己的交易,並讓這些交易可靠地打包進區塊內。
狀態網絡不僅缺少中心,而且數據流向與交易 gossip 廣播相反。狀態 gossip 廣播的目標是將數據發送到網絡邊緣進行存儲。
另外,在交易 gossip 廣播中,消息來自整個網絡;在狀態網絡中,我們預期新數據只會來自一小部分友善的橋節點。這些橋節點負責生成證明,並將這些證明發送到狀態網絡。
中繼機制會導致 DOS 攻擊和不可歸因的錯誤
我想到的一個改進方向是引入中繼節點。
我們預期每個節點會對網絡中 0.002% 的數據(體量很小)感興趣。我認為,根據我的結論可以構建出多個不同的網絡模型,但是一種簡單的做法是,根據 DHT 網絡中每個節點的路由表為 gossip 節點之間的連接構建模型。在這樣一個網絡中,數據需要經過 log(n) 跳才能到達需要它的節點那裏。
這裏的問題在於,如果一個節點轉發了其它節點都不感興趣的數據,但是這個數據需要經歷一次以上的跳躍,就會變成一個放大向量。惡意節點可以通過在 gossip 網絡中廣播無用數據來放大 DOS 攻擊。
一個笨辦法
目前,我比較偏向於一個 “笨” 辦法,旨在從非網絡層面解決上述問題。
有 “一小批” 狀態提供商節點為每個區塊內新的狀態數據生成證明。
每個證明預期有大約 2000 個 trie 節點。其中一部分節點是新數據或更新後的數據。只有這個子集需要發送到網絡中。
已知每個節點只關心每個區塊中 0.002% 的數據,也就是說不同節點感興趣的數據之間很少有重疊。如果一個區塊內包含 2000 條新數據,我們可以預見每條數據要發送給完全不同的節點。這就意味着,為了在區塊時間內廣播新區塊的證明數據,一個狀態提供商每 15 秒要將 2000 個不同的證明發送給 2000 個不同的節點。要做到這點不是不可能,但是會很難。一旦證明大小增加或網絡延遲稍微高一點,狀態提供商就無法在區塊時間內發送完整的證明數據。
幸好我們可以有不止一個數據提供商。我們可以合理預期將會出現數量不多(但是不會很少)的狀態提供商發送證明數據。在這個模型下,我們可以設計一個能夠在不同狀態提供商之間平均分配負載的系統。
每個狀態提供商都會為每一個新區塊生成證明。狀態提供商會按照距離其節點 ID(node_id
)的遠近對該證明包含的每項數據進行排序,先從那些距離最近的數據开始,查詢對這些數據感興趣的節點,並將它們廣播出去。在這個模型中,負載會在不同狀態提供商之間平均分配。等輪到那些距離其節點 ID 較遠的數據時,狀態提供商會發現節點對這些數據的興趣減弱,因為其節點 ID 距離這些數據較近的提供商已經廣播了這些數據。
可以改進/擴展/優化之處
或許,我們可以稍微優化一下這個方案。
我們的網絡結構需要存儲的不僅是葉節點,還有中間節點。也就是說,如果按葉子節點和對等節點的需要來分割區塊證明,這些碎片證明之間會出現大量重疊。例如,當要你要證明一個葉節點的時候,其證明中也會包含對其默克爾路徑上所有中間節點的數據的證明。
如果網絡中的某個節點想存儲某個葉子,TA 當然希望獲得該葉子節點的中間節點也可以在網絡中找到。如果這些中間節點不可得,甚至都沒有人會請求葉子節點數據,因為本地還沒有中間節點的數據,還沒法順着這些中間節點發現對葉子節點的需要。我們或許可以利用這一點在整個網絡中分散廣播數據的責任。
狀態提供商只通過 gossip 方式廣播葉節點數據的證明。
節點一收到自己想要存儲的內容的證明,就會找出 “父證明” —— 對上一級中間節點數據的證明 —— 並發送出去。
這一 “遞歸” 過程可以讓狀態提供商只需將葉節點數據發送至網絡,並將廣播中間節點數據的責任分配給那些對葉節點數據感興趣的節點。這些節點會一級一級地把上一層級的中間節點的數據的證明推送到網絡中,直到所有節點都把最終的狀態根推送到網絡中。
原文鏈接:
https://ethresear.ch/t/scalable-gossip-for-state-network/8958
作者: Piper Merriam
翻譯&校對: 閔敏 & 阿劍
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC
7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC一個引...
悅盈:比特幣68000的空完美落地反彈繼續看跌 以太坊破前高看回撤
一個人的自律中,藏着無限的可能性,你自律的程度,決定着你人生的高度。 人生沒有近路可走,但你走的每...