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/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 付款的传递过程:
- 你的节点为每个周期挑选一个茎节点。 在下一个 10 分钟周期到来之前,它把自己创建的每笔交易都发给这个对等节点,这与论文中针对节点自身交易的规则一致。
- 每个中继节点重新做选择。 收到茎交易的节点以 10% 的概率让它进入扩散,否则把它转发给一个随机挑选的、不是来源的对等节点。当 q = 0.1 时,一条茎平均约十跳。
- 所有节点发出的茎消息看起来都一样。 节点开始一条茎和转发一条茎使用的是同一种消息,所以接收方无法分辨交易是你创建的还是你转发的。
- 交易总能送达。 如果某一跳茎无法送达,节点会立即让交易进入扩散,45 秒的禁运计时器则覆盖任何停滞的情况。
- 中继节点会检查所传递的内容。 节点在中继前确认茎载荷是格式正确的交易,并对发送无效数据的对等节点进行惩罚。
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 秒内没有以扩散阶段回到你的节点,你的节点会自己广播它,所以交易总能到达网络。