Dandelion++ 詳解:莖(stem)與擴散(fluff)交易中繼

· 6 分鐘閱讀

Dandelion++ 是一種在點對點網路中中繼新交易的方式,讓觀察網路的人難以判斷交易是從哪台電腦送出的。本文介紹它要解決的問題、莖與擴散兩個階段如何運作、2018 年的論文在原始設計上增加了什麼,以及 Blocknet 如何在每筆付款中使用它。

什麼是 Dandelion++?

簡短回答

Dandelion++ 是一種交易中繼協定,用來隱藏是哪個節點建立了交易。新交易先沿著一條「莖」(stem)傳遞,每次只從一個節點交給下一個節點,持續好幾跳。接著它進入「擴散」(fluff),傳播到整個網路,看起來像是從遠離真正發送者的節點開始的。

這個名字來自路徑的形狀:先是一根細細的莖,然後是一團隨風飄散的種子。Dandelion++ 由 Giulia Fanti、Shaileshh Bojja Venkatakrishnan、Surya Bakshi、Bradley Denby、Shruti Bhargava、Andrew Miller 與 Pramod Viswanath 於 2018 年發表在 Proceedings of the ACM on Measurement and Analysis of Computing Systems(預印本見 arXiv),並在 ACM SIGMETRICS 2018 上發表。它改良了同一團隊 2017 年提出的 Dandelion。

為什麼廣播交易會暴露它的來源?

交易訊息裡並不包含你的 IP 位址,但它的傳播方式會暴露來源。在典型的加密貨幣網路中,建立交易的節點把交易送給它所有的對等節點,它們再送給各自的對等節點,交易就像水波一樣從源頭一圈圈向外擴散。

研究人員證明了這種水波是可以測量的。2014 年,Biryukov、Khovratovich 與 Pustogarov,以及另外獨立研究的 Koshy、Koshy 與 McDaniel,執行了一個連線到幾乎所有可連線 Bitcoin 節點的「超級節點」,記錄每筆交易從每個對等節點到達的時間。最先送來某筆交易的節點,往往就是建立它的節點。Dandelion++ 論文把這種方法稱為首個監視者估計(first-spy estimator):猜測最先送來交易的誠實節點就是交易的來源。這種方法很簡單,對洪泛式傳播很有效。

在每個節點轉送交易前加入隨機延遲(Bitcoin Core 用一種名為 diffusion 的方案這麼做)能讓時間訊號更雜亂。Dandelion 的研究走了另一條路,直接改變了傳播路徑本身的形狀。

莖階段和擴散階段如何運作?

簡短回答

在莖階段,每個節點只把交易交給一個對等節點。每一跳,節點都會擲一枚帶權重的硬幣:多數情況下繼續莖階段,偶爾轉入擴散。在擴散階段,交易像平常一樣廣播給所有對等節點,所以觀察者看到的是交易從進入擴散的那個節點開始傳播。

具體步驟:

  1. 你的節點開始一條莖。 它只把新交易送給一個對等節點。
  2. 每個中繼節點做出選擇。 收到交易的節點要麼再轉送給一個對等節點(莖),要麼廣播出去(擴散)。
  3. 擴散把交易傳遍全網。 從進入擴散的節點開始,交易以一般方式洪泛整個網路,並到達礦工。

監視多個節點的人現在看到的水波起點是進入擴散的節點,而它可能離你有很多跳。莖的長度是隨機的,所以監視者無法簡單地往回數固定的跳數。論文給出的莖的期望長度是 1/q,其中 q 是每一跳進入擴散的機率。當 q = 0.1 時,一條莖平均約十跳。

Dandelion++ 相較於 Dandelion 改變了什麼?

2017 年的 Dandelion 設計讓莖沿著一條單線的中繼路徑傳遞,並在三個假設下證明了很強的結論:每個節點都遵守規則、每個節點只送出一筆交易、每個節點都執行 Dandelion。2018 年的論文展示了打破這些假設的監視節點能多取得哪些資訊,然後修改設計,讓保證在面對這類監視節點時依然成立。它依週期(epoch)運作,每個節點大約「10 分鐘量級」進入新週期,在每個週期內使用四種機制:

機制 作用
近似 4-正則的中繼圖 每個節點從自己的對外連線中挑選最多兩個作為中繼,形成相互交織的多條路徑,取代單一線路。
自己的交易走同一條邊 節點把自己建立的每筆交易都沿同一條對外邊送出,因此送出多筆交易也不會透露更多資訊。
偽隨機中繼 每個週期裡,節點對所有在莖階段收到的交易要麼都作為中繼、要麼都作為擴散者,並把每條對內邊對應到一條對外邊。
失效保護計時器 送出或中繼過莖交易的節點會等待一段隨機時間,看它是否進入擴散;如果沒有,就自己廣播。

關於 q 的取值,論文的模擬發現,把 q 控制在 0.2 或以下,可以限制監視者透過操縱中繼圖得到的好處。作者在 Bitcoin 的主網上執行了他們的實作,並選擇 q = 0.1 或 q = 0.2,讓傳播時間維持在 4.5 秒的目標以內。

Dandelion 曾以 BIP 156 的形式向 Bitcoin 提出。Monero 在 2020 年 5 月發布的 0.16 版本中加入了 Dandelion++。

Blocknet 如何使用 Dandelion++?

每個 Blocknet 節點都用 Dandelion++ 中繼交易,不需要任何開關。你送出 BNT 時,你的節點會先檢查這筆交易並把它加入自己的記憶體池,然後交給 Dandelion++ 路由器。守護程式中的參數如下:

參數 值 含義
莖機率 0.9 每個中繼節點有 90% 的機率繼續莖階段,10% 的機率進入擴散(q = 0.1),與論文測試的 q 相同。
週期 10 分鐘 莖路由每 10 分鐘重新洗牌一次。
禁運計時器 45 秒 如果你的交易屆時還沒有以擴散階段回到你的節點,你的節點會自己廣播它。

一筆 Blocknet 付款的傳遞過程:

Dandelion++ 如何與 Blocknet 的其他隱私層搭配?

Dandelion++ 在網路層運作:它保護的是交易與送出交易的電腦之間的關聯。讓 Blocknet 成為隱私幣的鏈上隱私保護的是交易的內容:每個輸入上 16 個成員的 CLSAG 環簽章隱藏發送者,一次性隱身地址隱藏接收者,Pedersen 承諾加上 Bulletproofs 範圍證明隱藏金額。這些保護都是強制的,所以在 Dandelion++ 傳遞之前,每筆交易看起來就已經一模一樣。

兩層互相補足。環簽章隱藏是哪個輸出付的款,Dandelion++ 隱藏是哪個節點廣播了這筆付款。Blocknet 如何保護付款隱私逐層介紹了鏈上隱私,什麼是 Blocknet?則提供概覽,包括透過 Blocknet ID 以名稱付款。

想擁有可以送出的 BNT,可以在家裡挖礦。依照 Blocknet 挖礦指南下載 seine,連線到 bntpool.com,收益就會支付到你的錢包地址或 @name。

常見問題

Dandelion++ 能隱藏我的 IP 位址嗎?

它能讓分布在網路各處的觀察者難以判斷交易是從哪個節點發起的。交易要在擴散後才會大範圍傳播,而擴散點距離你已有好幾跳。你的第一個莖節點會看到交易來自你的節點,但無論節點是自己建立交易還是在轉送交易,莖訊息看起來都一樣,所以它無法分辨。

Dandelion 和 Dandelion++ 有什麼不同?

Dandelion(2017 年)提出了莖與擴散兩個階段,莖沿著一條單線的中繼路徑傳遞。Dandelion++(2018 年)保留這兩個階段,並強化設計以應對不守規則的監視節點。它使用每個節點挑選兩個中繼的圖,自己的交易沿一條固定的邊送出,每個週期重新挑選中繼,並加入失效保護計時器。

哪些加密貨幣使用 Dandelion++?

Monero 在 2020 年 5 月發布的 0.16 版本中加入了 Dandelion++,Blocknet 的每筆交易也都透過它中繼。同一研究團隊最早以 BIP 156 的形式向 Bitcoin 提出了 Dandelion。任何建立在點對點網路上的幣都可以採用它,因為它只改變節點之間傳遞新交易的方式。

Blocknet 的 Dandelion++ 使用哪些參數?

Blocknet 節點在每一跳以 0.9 的機率繼續莖階段,因此交易在每個中繼處有 10% 的機率進入擴散。莖路由每 10 分鐘更換一次。如果你自己的交易在 45 秒內沒有以擴散階段回到你的節點,你的節點會自己廣播它,所以交易一定能到達網路。