Dandelion++ とは?ステムとフラフによるトランザクション中継

· 9 分で読めます

Dandelion++ は、ピアツーピアネットワークで新しいトランザクションを中継する方法の 1 つで、ネットワークを監視している人がどのコンピューターから送られたかを簡単に割り出せないようにします。このガイドでは、Dandelion++ が解決する問題、ステムとフラフのフェーズの仕組み、2018 年の論文が元の設計に加えたもの、そして Blocknet がすべての支払いでそれをどう使っているかを説明します。

Dandelion++ とは何ですか?

簡単な答え

Dandelion++ は、どのノードがトランザクションを作ったかを隠すトランザクション中継プロトコルです。新しいトランザクションは、まず「ステム」に沿って、あるノードから次の 1 つのノードへと数ホップ渡されます。その後「フラフ」してネットワーク全体に広がり、本当の送信者から遠く離れたノードから始まったように見えます。

名前は経路の形に由来しています。細い茎(ステム)があり、その先で綿毛(フラフ)が四方に飛んでいく、タンポポ(ダンデライオン)の姿です。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++ の論文はこれをファーストスパイ推定と呼んでいます。トランザクションを最初に届けた正直なノードを発信元と推測する方法です。単純ですが、フラッディングに対してはよく機能します。

Bitcoin Core がディフュージョンと呼ばれる方式で行っているように、各ノードがトランザクションを渡す前にランダムな遅延を加えると、タイミングのノイズが大きくなります。Dandelion の研究は別の道を選び、経路の形そのものを変えました。

ステムとフラフのフェーズはどのように機能しますか?

簡単な答え

ステムのフェーズでは、各ノードはトランザクションをちょうど 1 つのピアに渡します。ノードは各ホップで重み付きのコインを投げ、たいていはステムを続け、ときどきフラフに切り替えます。フラフのフェーズでは、トランザクションは通常どおりすべてのピアにブロードキャストされるので、観測者にはフラフしたノードから広がったように見えます。

順を追って説明します。

  1. あなたのノードがステムを始めます。 新しいトランザクションを 1 つのピアだけに送ります。
  2. 各中継ノードが判断します。 ピアは、それをさらに 1 つのピアに転送する(ステム)か、ブロードキャストする(フラフ)かのどちらかを行います。
  3. フラフでトランザクションが全体に広がります。 フラフしたノードから、トランザクションは通常の方法でネットワークに行き渡り、マイナーに届きます。

多数のノードを監視しているスパイには、波紋がフラフしたノードから始まったように見えます。そのノードは、あなたから何ホップも離れているかもしれません。ステムの長さはランダムなので、スパイは決まったホップ数を数えて戻ることもできません。論文では、ステムの長さの期待値を 1/q としています。q は各ホップでフラフする確率です。q = 0.1 なら、ステムは平均して約 10 ホップになります。

Dandelion++ は Dandelion から何を変えたのですか?

2017 年の Dandelion の設計は、ステムを 1 本の中継の列に沿って送り、3 つの仮定のもとで強力な結果を証明しました。すべてのノードがルールに従うこと、各ノードが 1 つのトランザクションを送ること、すべてのノードが Dandelion を動かしていることです。2018 年の論文は、これらの仮定を破るスパイがより多くの情報を得られることを示し、そうしたスパイに対しても保証が成り立つよう設計を変えました。処理はエポック単位で進み、各ノードは「10 分程度」で新しいエポックに移ります。各エポック内では 4 つの仕組みを使います。

仕組み 内容
ほぼ 4 正則の中継グラフ 各ノードが外向きの接続から最大 2 つを中継先として選び、1 本の列の代わりに絡み合った経路の網を作ります。
自分のトランザクション用の 1 本のエッジ ノードは自分が作るすべてのトランザクションを同じ外向きのエッジで送るので、複数のトランザクションを送っても明かされる情報は増えません。
疑似ランダムな中継 各エポックで、ノードはステムで受け取るすべてのトランザクションについて中継役か拡散役のどちらかになり、受信したエッジをそれぞれ送信側のエッジに対応付けます。
フェイルセーフのタイマー ステムのトランザクションを送ったり中継したりしたノードは、それがフラフするのをランダムな時間待ち、フラフしなければ自らブロードキャストします。

q の選び方について、論文のシミュレーションでは、q を 0.2 以下に保つと、中継グラフを操作してスパイが得られる情報を抑えられることがわかりました。著者たちは Bitcoin の実際のネットワークで実装を動かし、伝播を目標の 4.5 秒以内に収めるため q = 0.1 または q = 0.2 を選びました。

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 リングが送信者を、使い捨てステルスアドレスが受信者を、Bulletproofs の範囲証明付きのペダーセンコミットメントが金額を隠します。これらの保護は必須なので、Dandelion++ が運ぶ前から、すべてのトランザクションは同じように見えます。

2 つのレイヤーは互いを補い合います。リング署名はどのアウトプットが支払ったかを隠し、Dandelion++ はどのノードが支払いをブロードキャストしたかを隠します。オンチェーンの各レイヤーについては Blocknet が支払いをプライベートに保つ仕組みで、Blocknet ID による名前での支払いを含む概要は Blocknet とは?で説明しています。

送るための BNT を手に入れるには、自宅でマイニングできます。Blocknet のマイニングガイドに従って seine をダウンロードし、bntpool.com に接続すれば、支払いがウォレットのアドレスまたは @name に届きます。

よくある質問

Dandelion++ は IP アドレスを隠しますか?

ネットワーク全体に散らばった観測者から、どのノードがトランザクションを発信したかを隠します。トランザクションが広く拡散するのは、あなたから数ホップ離れた地点でフラフした後です。最初のステムのピアにはトランザクションがあなたのノードから届いたことが見えますが、ステムのメッセージはノードがトランザクションを作った場合も中継している場合も同じに見えるので、どちらなのかはわかりません。

Dandelion と Dandelion++ の違いは何ですか?

Dandelion(2017 年)は、1 本の中継の列でステムとフラフの 2 つのフェーズを導入しました。Dandelion++(2018 年)は 2 つのフェーズを維持しつつ、ルールを破るスパイに対して強化しています。各ノードが 2 つの中継先を選ぶグラフを使い、自分のトランザクションは 1 本の固定されたエッジで送り、エポックごとに新しい中継先を選び、フェイルセーフのタイマーを追加しています。

Dandelion++ を使っている暗号資産はどれですか?

Monero は 2020 年 5 月にリリースしたバージョン 0.16 で Dandelion++ を追加し、Blocknet はすべてのトランザクションをこれで中継しています。Dandelion は、同じ研究グループによって BIP 156 として最初に Bitcoin 向けに提案されました。ノード同士が新しいトランザクションを渡す方法を変えるだけなので、ピアツーピアネットワーク上に構築されたコインならどれでも採用できます。

Blocknet はどんな Dandelion++ の設定を使っていますか?

Blocknet のノードは各ホップで確率 0.9 でステムを続けるので、トランザクションは中継のたびに 10% の確率でフラフします。ステムの経路は 10 分ごとに変わります。自分のトランザクションが 45 秒以内にフラフのフェーズで自分のノードに戻ってこない場合、ノードが自らそれをブロードキャストするので、トランザクションは必ずネットワークに届きます。