Conflux 研究院

摘要: Conflux 研究院 | 交易轉發中的帶寬優化(上)

早期的區塊鏈系統往往吞吐量很低,相應的對帶寬要求也不高,共識協議本身才是它們性能的瓶頸。例如比特幣網絡平均每 10 分鐘只產生 1MB 大小的區塊,在如今的寬帶網絡環境下幾乎是可以忽略不計的。

近年來,隨著 Conflux 等新一代區塊鏈的發展和成熟,區塊鏈的吞吐量有了質的飛躍,網絡帶寬越來越成為限制區塊鏈性能進一步提高的瓶頸。這次,就讓我們來聊一聊 Conflux 是如何優化帶寬的使用效率的。

交易廣播是在區塊鏈上達成共識的第一步。每當用戶發起一筆交易時,這筆交易從客戶端程序出發,被髮往一個或幾個全節點。之後,全節點之間通過點對點網絡將交易轉發給各自的鄰居節點,直到最終所有的全節點都收到這筆交易。

區塊鏈的吞吐量越大則每個節點需要轉發的交易數量也就越多。因此,在區塊鏈的吞吐量和網絡帶寬處於相同的數量級時,交易轉發過程的帶寬利用率將直接影響了整個區塊鏈系統最終的吞吐性能。

我們首先來看一個最簡單的方案:每當一個全節點收到一筆新的交易時,該全節點就將這筆交易發送給它的所有鄰居節點。

按照上述方案,每個節點將多次從不同的鄰居節點收到同一筆交易,這意味著無論是交易的發送還是交易的接收,都有著成倍的冗餘,網絡帶寬的利用率自然也非常低。以一筆 200 字節大小的交易為例,如果每個節點有 8 個鄰居,那麼這筆交易就要為每個全節點帶來約 1.6kB 的發送量和 1.6kB 的接收量——而其中大部分流量是被浪費掉的。

即使是比特幣,作為一個吞吐率只有 7 筆/秒、交易轉發的帶寬利用率完全不構成性能瓶頸的系統,也不再使用上面這種毫無優化的方案了。

Conflux 研究院

比特幣的方案是,當一個比特幣節點 A 第一次收到這筆交易時,它將這筆交易的哈希值(32字節)發送給所有的鄰居節點(除了發給它交易的節點)。鄰居節點 B 收到哈希值後查看自己已經收到的交易中有沒有哈希值一樣的。如果有,就說明 B 已經收到過這筆交易,不需要再接收一次;如果沒有,B 就向 A 請求這筆交易的完整內容。

上述過程中,發送交易哈希值的環節稱為 announcement,對於交易哈希值的檢測可以保證每個節點只需要接收一次完整的交易內容,避免重複傳送完整交易帶來的帶寬浪費。

但是 announcement 本身也需要使用網絡帶寬。粗略地計算可知上述方案中每個節點在announcement 環節約發送 250 字節,雖然比 1.6kB 少了很多,但仍超過了轉發一筆交易的數據量。

我們的目標,是在比特幣交易轉發方案的基礎上,將 announcement 環節產生的數據發送量壓縮至八分之一。

為了實現這一點,最簡單的方法是縮短 announcement 環節廣播的交易哈希值長度。本文中,為了將這個哈希值與應用層面(錢包/智能合約)所使用的 32 字節交易哈希值區分,我們將應用層面交易的哈希值稱為交易的 ID, 轉發中 announcement 環節用到的短哈希值稱為交易的 FID (Forwarding ID).

在比特幣的方案中,FID 與 ID 相等,長達 32 個字節。如果我們將 FID 設為 ID 值的前 4 個字節,就可以達到降低數據發送量的目標。

然而,更短的交易 FID 在節省帶寬的同時也會帶來安全性上的隱患。如果兩筆不同的交易 Tx1 和 Tx2 有相同的交易 FID ,一個節點收到第一筆交易 Tx1 後,在鄰居節點發來第二筆交易 Tx2 的 FID 時,會因為 FID 衝突誤認為自己已經收到了這筆交易,從而不再請求 Tx2 的完整內容。這樣將阻塞第二筆交易 Tx2 在網絡中的廣播。

Conflux 研究院

我們可以具體來算一下交易的 FID 衝突發生的概率:

假設交易的生成速率是每秒 6000 筆交易,每個全節點收到一筆交易 FID 時,會將它和過去 5 分鐘內收到的 FID 對比,來判斷是否請求這筆交易的完整內容。這樣,一筆交易的 FID 和已經存在的交易 FID 衝突的概率是 6000 * 300 / 232,大約是 0.04 %。這意味著每秒平均有 2.4 筆交易會因為 FID 值衝突而無法廣播。

雖然 0.04% 的衝突概率看似不是很高,但這只是沒有攻擊的正常情況。利用特定的攻擊策略,一個攻擊者可以阻塞任意一筆交易的廣播,從而實現阻止特定交易的目的。

攻擊的策略也並不複雜:4 字節的 FID 一共只有 232 個可能的取值,也就是大概 42 億個。攻擊者只要為每一個 FID 取值預先構造一筆交易並存起來,然後就可以根據受害者廣播的交易的 FID 值,從自己預先存的 42 億筆交易中找到 FID 值相同的交易,並搶在受害者前面發送到儘可能多的節點,則先接收到攻擊者發送的交易的節點就會因為 FID 衝突而忽略受害者的交易。即使受害者重發了另一筆交易,攻擊者也有能力重複這個過程。

根據概率上的計算,攻擊者要挑選 42 億個 FID 不同的交易,需要嘗試構造約 1000 億筆交易。對於服務器級的 CPU 來說,構造約 1000 億筆交易只需花一個星期的時間。計算所需的存儲空間在優化後也只需要 32GB。

從整體來說,實施上述攻擊的成本並不算很高。但是在特定的情景下(如 Fomo3D 等合約),交易被阻塞可能為受害者帶來不小的損失。所以這種風險必須從一開始就被排除掉。

在下一篇文章中,我們將介紹如何通過將靜態 FID 轉為動態 FID 的方式解決交易被惡意阻塞的風險。

(1、 內容來自鏈得得內容開放平臺“得得號”,稿件內容僅代表作者觀點,不代表鏈得得官方立場。2、 凡“得得號”文章,原創性和內容的真實性由投稿人保證,如果稿件因抄襲、作假等行為導致的法律後果,由投稿人本人負責。3、 得得號平臺發佈文章,如有侵權、違規及其他不當言論內容,請廣大讀者監督,一經證實,平臺會立即下線。如遇文章內容問題,請發送至郵箱:[email protected]


分享到:


相關文章: