区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载本文依据 Grin 官方 Dandelion 文档 编写并结合作品源码servers/src/common/types.rs、pool/src/transaction_pool.rs、servers/src/grin/dandelion_monitor.rs 等进行深度印证与扩充。Grin 是 Mimblewimble 协议的极简实现Dandelion 是其 P2P 网络中交易广播的关键隐私组件阅读本文后你将掌握 Dandelion 协议的理论背景、Grin 简化实现的具体机制stem/fluff 两阶段、epoch、stempool、embargo 定时器、全部可配置参数及其源码级对应关系并了解当前实现的已知局限与未来改进方向。引言为什么交易传播需要隐私保护Dandelion 交易广播协议由 Fanti 等人提出Sigmetrics 2018其核心目标是防御交易传播过程中的去匿名化deanonymization攻击。在 Grin 中Dandelion 还额外提供了一个机会在交易被广播到全网之前先进行聚合aggregation。本文先概述既有研究成果再详细描述 Grin 中的实现——包括引入它的目标、与原始论文的差异、已知局限以及未来改进方向。前期研究Dandelion 与 Dandelion原始的 Dandelion 协议由 Fanti 等人提出发表于 ACM Sigmetrics 20172017 年 6 月一个更实用、更健壮的变体 Dandelion 以 BIP 形式被提出并于 2018 年被正式化为论文。下面从高层次概述两个协议更深入的文献综述请参阅原始论文。动机对抗大规模去匿名化Dandelion 的诞生源于对抗针对比特币网络层的大规模去匿名化攻击。比特币采用扩散diffusion方式对称地传播交易攻击者可以部署超级节点super-nodes连接网络上大量诚实节点监听诚实节点在疫情式泛洪epidemic flooding或扩散过程中转发的交易。通过观察交易在网络上的传播动态spreading dynamic已被证明可以高精度地将交易以及发送方的比特币地址与源 IP 地址关联起来从而实现对用户的去匿名化。Dandelion 正是为了缓解这一攻击面而设计的。原始 Dandelionstem茎与 fluff絮两阶段原始论文引入了一个蒲公英扩散协议dandelion spreading protocol。蒲公英式传播由两个阶段组成第一阶段是匿名阶段即stem茎阶段第二阶段是扩散阶段即fluff絮阶段如下图所示┌- F ... ┌- D --┤ | └- G ... A --[stem]-- B --[stem]-- C --[fluff]--┤ | ┌- H ... └- E --┤ └- I ...在最初的stem 阶段每个节点将交易转发给一个随机选择的单一对等节点peer从而构造出一条线图line graph。用户后续发起的交易沿图上的同一条路径转发。在沿这条单茎随机经过若干跳之后交易进入fluff 阶段该阶段行为与普通扩散一致。这样一来即使攻击者能够识别 fluff 阶段的发起者也仍然难以追踪 stem 的源头即交易最初的广播者。这条构造出来的线图会在每个 epoch 到期时周期性地随机重建从而限制攻击者积累图知识的能力。Epoch 是异步的——每个节点维护自己的内部时钟一旦达到某个阈值即开启新 epoch。dandelion蒲公英这个名称源自该协议与蒲公英种子传播方式的相似性。Dandelion对抗违约的更强攻击者Dandelion 论文在原始概念上进一步扩展用于防御被允许违反协议的更强攻击者。原始论文做出了三个理想化假设所有节点都遵守协议每个节点恰好生成一笔交易网络上所有节点都运行 Dandelion。攻击者可以违反这些规则从而破坏部分匿名性属性。Dandelion 协议对 Dandelion 的大部分选择做了微小改动导致信息空间以指数方式变得更加复杂从而让攻击者更难对网络去匿名化。论文描述了五类攻击并针对每一类提出了对原始 Dandelion 协议的更新方案下表为摘要形式攻击类型Attack解决方案Solution图学习Graph-learning4-正则匿名图4-regular anonymity graph交集Intersection伪随机转发Pseudorandom forwarding构图Graph-construction非交互式构造Non-interactive construction黑洞Black-hole随机 stem 定时器Random stem timers部分部署Partial deployment盲选 stemBlind stem selectionDandelion 算法细节与原始 Dandelion 协议一样epoch 是异步的每个节点跟踪自己的 epoch论文建议 epoch 时长约为10 分钟。1. 匿名图Anonymity Graph与原始论文中的线图2-正则图不同Dandelion 在每个 epoch 开始时构造一个准 4-正则图quasi-4-regular graph节点从其出站边中均匀随机选择最多两条作为其dandelion 中继relays。进入新 epoch 时会选择新的 dandelion 中继。in1 out1 \ / \ / NodeX / \ / \ in2 out2NodeX与其他节点有四条连接输入节点in1和in2输出节点out1和out2。关于 4-正则图与 2-正则图的取舍选择 4-正则图还是 2-正则线图并非显而易见。作者指出在实际的完全分布式网络中构造精确的 4-正则图是困难的论文中概述了一种构造近似 4-正则图的方法。他们同时写道[...] 我们建议系统构建者根据自身的优先级来权衡 4-正则图与线图的设计选择。**如果交易的可链接性linkability是一阶关注点那么线图可能是更好的选择。**否则我们发现 4-正则图在面对了解图结构的攻击者时能提供恒定阶数的隐私收益。2. 交易转发自身交易在每个 epoch 开始时NodeX从out1和out2中选一条作为其自身交易以 stem 阶段形式广播的路径。整个 epoch 期间都使用同一条路径且NodeX总是转发stem自己的交易。3. 交易转发中继在每个 epoch 开始时NodeX以伪随机方式决定自己是处于 fluff 模式还是 stem 模式论文建议该选择由节点自身身份与 epoch 编号的哈希计算得出。处于 fluff 模式论文中称为路径长度参数q的概率建议为q ≤ 0.2。一旦决定 stem 或 fluff该选择在 epoch 期间适用于所有被转发的交易若NodeX处于fluff 模式它将以扩散方式向全网广播任何收到的交易若NodeX处于stem 模式则每个 epoch 开始时将in1伪随机映射到out1或out2in2同理。基于该映射in1收到的所有交易沿所选路径转发in2的交易亦然。映射在 epoch 期间持续有效。4. 失效保护机制Fail-safe对于每一笔已发送或已转发的 stem 阶段交易NodeX都会跟踪它是否在一段随机时间内再次以 fluff 阶段交易的形式出现。如果没有出现节点将自行 fluff 该交易。该过期定时器由每个 stem 节点在收到待转发交易时设定取值是随机的。节点以超时参数 T_base 初始化。按照论文公式 (7)当 stem 节点v收到一笔交易时它设置过期时间 T_out(v)T_out(v) ~ current_time exp(1/T_base)如果中继v在 T_out(v) 到期前没有再次收到该交易它就用扩散方式广播该消息。这种方法意味着第一个发起广播的 stem 节点在所有见过该消息的 stem 节点中近似均匀分布而非总是源节点。论文还在Proposition 3中给出了初始超时参数 T_base 的取值要求Proposition 3. 对于超时参数T_base ≥ (−k(k−1)·δ_hop) / (2·log(1−ε))其中k、ε是参数δ_hop 是每一跳之间的时间例如网络和/或内部节点延迟则交易在没有任何 peer 发起扩散的情况下传播k跳的概率至少为1 − ε。Grin 中的 Dandelion目标Grin 引入 Dandelion 有两大动因作为大规模去匿名化攻击的对抗措施。与比特币类似Grin P2P 网络同样容易受到部署恶意超级节点的攻击——超级节点连接网络上的大多数 peer并在诚实 peer 扩散交易时进行监控。这会让有动机的行为者以很高的概率推断出交易源自哪个 peerIP 地址造成严重的隐私后果。在交易广播到全网之前先行聚合。这对在协议层支持非交互式 CoinJoin 的区块链如 Mimblewimble尤其有价值。尽管 Mimblewimble 与 Grin 拥有良好的隐私特性但输入与输出之间的部分关联仍然可能被建立。如果知道哪个输入花费到哪个输出就可以构造非常有限的交易图并追踪交易输出TXO链的消费路径。交易聚合使这一过程更加困难因为哪个输入花费到哪个输出变得不那么清晰见下图。要使聚合有效需要足够大的匿名集anonymity set即有大量交易可供聚合。Dandelion 让聚合在交易被 fluff 并扩散到全网之前发生从而为交易图增加混淆——未参与 stem 或 fluff 的恶意观察者不仅需要弄清楚交易从哪里发起还需要判断一组较大的 TXO 中哪些应归因于发起交易。3.1 Transactions (not aggregated) --------------------------------------------- TX1 INPUT_A ______________ OUTPUT_X |_____ OUTPUT_Y KERNEL 1 --------------------------------------------- TX2 INPUT_B ______________ OUTPUT_Z INPUT_C ________| KERNEL 2 --------------------------------------------- 3.2 Transactions (aggregated) --------------------------------------------- TX12 INPUT_A ______________ OUTPUT_X INPUT_B ________|_____ OUTPUT_Y INPUT_C ________|_____ OUTPUT_Z KERNEL 1 KERNEL 2 ---------------------------------------------当前实现Grin 实现了 Dandelion 协议的简化版本并已多次改进最近一次是 1.1.0 版本对应 Dandelion 重写 PR。DandelionEpoch跟踪节点当前的 epoch。该值可通过epoch_secs配置默认 epoch 时长为10 分钟600 秒。Epoch 由各个节点独立设置与跟踪。在每个 epoch 开始时节点随机选择一个已连接 peer 作为其出站中继outbound relay。在每个 epoch 开始时节点决定本 epoch 处于stem 模式还是fluff 模式。该决定持续整个 epoch。默认情况下这是一个随机选择stem 模式概率为 90%即 fluff 模式概率q为 10%。该概率可通过DANDELION_STEM_PROBABILITY配置。一笔交易在到达 fluff 节点前期望经历的 stem 跳数为1/q 1/0.1 10。从入站连接节点收到的交易或节点自身产生的交易首先被加入节点的stempoolstem 交易列表每个节点单独维护。交易在以下情况被移出 stempool节点自行 fluff 了该交易节点看到该交易通过常规扩散传播即已被其他 peer fluff节点收到包含该交易的区块说明交易已被传播并打包进区块。对于加入 stempool 的每笔交易节点设置一个embargo 定时器禁运定时器默认180 秒可通过DANDELION_EMBARGO_SECS配置。无论节点处于 fluff 还是 stem 模式节点自身产生的交易都会作为 stem 交易转发给其中继节点对应始终 stem 本地交易的配置/PR 改进。dandelion_monitor每10 秒运行一次并处理相应任务。若节点处于stem 模式收到 stem 交易并加入 stempool 后将其作为 stem 交易转发给中继节点。由于 peer 随机连接可能形成 stem 模式节点的循环回路如A - B - C - A。因此如果节点从入站节点收到的 stem 交易已存在于自己的 stempool 中节点将fluff它——用常规扩散广播在源码中这一逻辑体现为 pool/src/transaction_pool.rs 的add_to_pool中stem self.stempool.contains_tx(tx)时直接转入非 stem 路径即 fluff。dandelion_monitor检查 stempool 中embargo 定时器已过期的交易并逐一广播fluff。若节点处于fluff 模式从入站节点收到的交易保留在 stempool 中。dandelion_monitor检查 stempool 中是否有超过 30 秒可通过DANDELION_AGGREGATION_SECS配置的交易如果有则聚合后 fluff否则不做任何动作让更多 stem 交易有时间在 stempool 中聚合等待下一次dandelion_monitor触发。在epoch 到期时stempool 中剩余的所有 stem 交易被聚合并 fluff。源码级实现对应以上实现要点与源码的对应关系如下Epoch 数据结构与切换逻辑DandelionEpoch定义于 servers/src/common/types.rs。其next_epoch()方法记录起始时间、从已连接出站 peer 中随机挑选中继peers.iter().outbound().connected().choose_random()并以rng.gen_range(0, 100) stem_probability决定本 epoch 是否 stemis_expired()用Utc::now().timestamp() - start_time epoch_secs判断 epoch 是否到期。日志还会输出is_stem、stem_probability与所选中继地址便于运维观察。配置结构与默认值DandelionConfig定义于 pool/src/types.rs包含epoch_secs默认 600、embargo_secs默认 180、aggregation_secs默认 30、stem_probability默认 90即 90%、always_stem_our_txs默认true与 Dandelion 论文一致。stem 转发 / fluff 回退PoolToNetAdapter::stem_tx_acceptedservers/src/common/adapters.rs在 stem epoch 中把交易发给中继 peerpeer.send_stem_transaction若中继不可用无中继或发送失败则返回DandelionError由调用方回退为直接 flufffluff epoch 中则聚合 stem 交易、等待 Dandelion monitor fluff。P2P 消息类型P2P 层有独立的StemTransaction消息类型见 p2p/src/msg.rs 与 p2p/src/protocol.rstransaction_received(tx, stem)中的stem标志决定交易进入 stempoolstem还是 txpoolfluff并且 stem 交易不记录 tx hash 跟踪见 p2p/src/peer.rs以保证后续 fluff 与 embargo 过期能被正确处理。dandelion_monitor 的实现monitor_transactionsservers/src/grin/dandelion_monitor.rs每 10 秒检查一次fluff 阶段处理由process_fluff_phase完成——若存在超过aggregation_secs的条目或 epoch 已到期则把 stempool 中所有交易聚合成一笔agg_tx并add_to_pool(TxSource::Fluff, ...)过期处理由process_expired_entries完成——注意它实际使用的过期阈值为embargo_secs rand(0, 31)秒即在源码层面 embargo 定时器已经带上了 0~30 秒的随机抖动。该线程在 servers/src/grin/server.rs 中随服务器启动。stempool 生命周期交易经add_to_pool(src, tx, stem, header)pool/src/transaction_pool.rs进入 stempool 或 txpoolstem 交易先入 stempool再经 adapter 转发若 adapter 失败则回退入 txpoolfluff。stempool 有独立的容量上限max_stempool_size默认见 pool/src/types.rs。测试用例 pool/tests/transaction_pool.rs 明确验证了stem 交易进 stempool、聚合后 fluff 进 txpool、重复 stem 交易触发 fluff处理 stem 回路三条核心路径。配置参数一览Dandelion 相关配置位于 grin-server.toml 的[server.dandelion_config]段注释模板见 config/src/comments.rs完整参数如下[server.dandelion_config] # dandelion epoch durationepoch 时长秒 # 默认 60010 分钟 epoch_secs 600 # dandelion aggregation period in secs聚合周期秒 # 默认 30fluff 节点每隔 aggregation_secs 将 stempool 中满足条件的交易聚合后 fluff aggregation_secs 30 # fluff and broadcast after embargo expires if tx not seen on network # embargo 定时器秒若到期仍未在网络上看到该交易则 fluff 并广播 # 默认 180 embargo_secs 180 # dandelion stem probability (stem 90% of the time, fluff 10% of the time) # stem 概率整数百分比默认 90即 90% 时间 stem、10% 时间 fluff stem_probability 90 # always stem our (pushed via api) txs regardless of stem/fluff epoch # (as per Dandelion paper)无论本 epoch 是 stem 还是 fluff始终 stem 通过 API 推送的本地交易 # 默认 true always_stem_our_txs true此外 P2P 配置中还有一个主要用于测试的参数dandelion_peer见 config/src/comments.rs用于指定首选 dandelion peer。已知局限Grin 使用 **2-正则图线图**而非论文提出的 4-正则图。目前尚不清楚具体影响论文指出这涉及交易整体可链接性与对抗知晓全网图结构的攻击者之间的权衡。与 Dandelion 论文不同embargo 定时器在所有节点上默认相同。这意味着在恶意节点扣留交易的黑洞攻击black-hole attack中最可能使 embargo 定时器到期并 fluff 交易的往往是源节点本身从而暴露自己。不过如上述源码所示Grin 在过期判定中加入了 0~30 秒随机抖动缓解了这一默认一致性问题但文档仍将其列为已知局限。未来工作按论文建议随机化 embargo 定时器使哪一节点 fluff 过期交易更具随机性。评估4-正则图是否优于 2-正则线图。对当前实现进行仿真以理解性能表现。加深对fluff 前交易聚合收益的理解。参考文献Fanti et al. (Sigmetrics 2018),Dandelion: Lightweight Cryptocurrency Networking with Formal Anonymity GuaranteesFanti et al. (Sigmetrics 2017),Dandelion: Redesigning the Bitcoin Network for AnonymityDandelion BIP提出 Dandelion 变体的 BIP 提案Grin Privacy PrimerMimblewimble 文档站Grin PR #2628Dandelion 重写Grin PR #2876在配置为始终 stem 时本地交易始终走 stem 路径除非被显式 fluff赞分享区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载相关推荐5分钟掌握camera-controls打造流畅3D相机控制的终极指南 5分钟掌握camera controls打造流畅3D相机控制的终极指南 你是不是在为Three.js项目的相机控制而烦恼想让你的3D场景拥有丝滑的过渡3D渲染前端从零到成品UVR5 人声提取 3 步装好环境人声伴奏分离拿到能直接录制的干声从零到成品UVR5 人声提取 3 步装好环境人声伴奏分离拿到能直接录制的干声 在 Retrieval based Voice Conversion WebU人工智能AI 应用语音音频深度学习WPF UI 控件库集成教程3 个高频场景与 4 个常见坑WPF UI 控件库集成教程3 个高频场景与 4 个常见坑 WPF UIwpfui是一套基于 WPF 框架的现代化 WPF UI 控件库把 WindowUI组件桌面应用上一篇在 YOLOv10 中基于 Caltech-101 数据集训练图像分类模型数据集解析与完整实操指南下一篇OmniGet 桌面端全指南1800 网站的下载器、课程工具与学习库一体方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考