
区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载Mimblewimble 是一种通过强密码学原语实现可扩展性、隐私性与通约性的区块链格式与协议而 Grin 是对它的最小化开源实现。本文基于 Grin 仓库中的 Mimblewimble 介绍文档英文原文见 doc/intro.md完整讲透其核心机制——Pedersen 承诺、零和验证、交易内核、Range Proof、内核偏移量与 Cut-Through并结合仓库中core模块的源码结构说明这些数学构造在 Grin 代码里是如何落地与校验的。读完后你应能独立解释一笔 Mimblewimble 交易的验证原理并定位到 Grin 中对应的事务体、内核与块校验实现。Grin 的设计目标Mimblewimble 针对的正是几乎存在于所有当前区块链实现中的固有缺陷。Grin 作为开源项目实现了 Mimblewimble 区块链并补齐了构建成完整区块链与加密货币所需的其余部分。其文档明确列出了项目的主要目标与特征默认隐私Integritet som standard默认完全通约同时不阻止按需选择性公开信息状态规模主要由用户数而非交易数驱动交易内核小于 100 字节相比其他区块链可带来显著的空间节省强且久经考验的密码学Mimblewimble 仅依赖椭圆曲线密码学ECC这是一类经受数十年检验的密码学原语极简设计便于长期审查与维护社区驱动鼓励挖矿与去中心化。这篇文档面向具备区块链与基础密码学理解、希望理解 Mimblewimble 在 Grin 中如何应用的读者行文路径是先从椭圆曲线的相关性质入手再依次描述 Mimblewimble 区块链中交易与块的关键要素。椭圆曲线的必要性质理解 Mimblewimble 只需要 ECC 的几个核心性质无需深入其数学细节一条用于密码学的椭圆曲线简单说就是一个很大的点集合记作C这些点可以互相加、减也可以与整数标量相乘给定曲线上一点H和整数k标量乘法k*H仍是曲线C上的一点给定另一个整数j有(kj)*H且满足(kj)*H k*H j*H椭圆曲线上的加法与标量乘法保留了普通加法与乘法的交换律和结合律。在 ECC 中若选取一个非常大的数k作为私钥则k*H即为其公钥。即使知道公钥k*H的值要反推k也几乎不可能——用曲线上的术语说与曲线点相乘是平凡的而除法即离散对数问题则极其困难。再看上面的公式当k和j都是私钥时它说明把两个私钥相加得到的公钥等于两个私钥各自公钥相加k*H j*H。比特币中的层次确定性钱包HD Wallets大量使用了这一原理Mimblewimble 和 Grin 的实现同样如此。Mimblewimble 交易两条基本验证属性交易结构体现了 Mimblewimble 最关键的公理——强隐私与通约性保证。其验证依赖两条基本性质零和控制所有 outputs 之和减去所有 inputs 之和恒等于零。这能在不揭示任何金额的前提下证明该交易没有创造新币私钥持有与大多数加密货币一样outputUTXO的所有权由持有私钥来保证但所有权并不通过对交易直接签名来证明。以下金额、所有权、找零、Range Proof四个小节正是这两条性质如何实现的具体说明。金额Pedersen 承诺基于前述 ECC 性质可以把交易中的金额封装起来。若v是某个 input 或 output 的金额H是曲线C上的一点则可以在交易中嵌入v*H而不是明文v。由于v1 v2 v3 v1*H v2*H v3*H协议仍可通过 ECC 运算确认outputs 之和等于 inputs 之和。对所有交易做这一检查协议即可确认没有任何交易凭空生钱而无需知道具体金额。但仅用v*H不够安全可用的金额是有限集合对手可以逐一尝试来猜测交易金额且若已知某个历史交易中的v1及其对应的v1*H则整条链上所有金额为v1的 outputs 都会暴露。为此Mimblewimble 引入同一条曲线上的第二点G和一个作为**混淆因子blinding factor**的私钥r每个 input 或 output 表达为r*G v*H其中r是用作混淆因子的私钥G是曲线C上的点乘积r*G即为r的公钥以G为生成元v是 input 或 output 的金额H是曲线C上另一点v*H构成另一把公钥以H为生成元。由 ECC 的基本性质v与r都无法从该点中推导出来。r*G v*H被称为Pedersen Commitment佩德森承诺。举例设想创建一笔两 input 一 output 的交易暂不计手续费其中 vi1、vi2 为 input 金额vo3 为 output 金额满足vi1 vi2 vo3为每个 input 生成一个混淆因子私钥并把所有金额替换为各自的 Pedersen Commitment(ri1*G vi1*H) (ri2*G vi2*H) (ro3*G vi3*H)随之必须要求ri1 ri2 ro3这就是Mimblewimble 的第一根支柱验证交易所需的计算可以完全在不知道任何金额的前提下完成。这一思想源自 Greg Maxwell 的 Confidential Transactions机密交易后者又可追溯到 Adam Back 针对比特币提出的同态金额方案。对应到 Grin 源码金额与混淆因子的承诺体现在 TransactionOutput 中Output结构由identifierfeatures commitment与proofRangeProof组成承诺值即为上述r*G v*H的序列化形式。所有权超额Excess与交易内核上一节引入私钥r来隐藏金额Mimblewimble 的第二点洞察是这个私钥恰好可以用来证明对该金额的所有权。Alice 给你转了 3 个币你选 28 作为混淆因子实践中混淆因子是极大的数。链上出现一个 output只有你能花费它X 28*G 3*H其中X对所有人可见金额 3 只有你和 Alice 知道28 只有你知道。要把这 3 个币再转给 Carol协议要求你必须知道 28。设你要构造一笔简单交易Xi YXi是花费你X的 inputY 是 Carol 的 output。不知道私钥 28 就无法构造出这笔交易——若 Carol 要使交易平衡她必须同时知道所转金额与你的私钥于是Y - Xi (28*G 3*H) - (28*G 3*H) 0*G 0*H通过检查一切归零我们再次确认没有创造新币。问题随之而来此时你掌握了 Carol output 的私钥在本例中它必须与你的相同才能平衡你完全可能把 Carol 的钱再偷回来。解决方式是Carol 使用自己选定的私钥假设她选了 113那么链上呈现的是Y - Xi (113*G 3*H) - (28*G 3*H) 85*G 0*H交易不再归零出现了超额excess85它是所有混淆因子之和的结果。由于85*G是生成元G的一把合法公钥可知所有 inputs/outputs 均已平衡交易有效——x*G y*H是G的合法公钥当且仅当 y 0。于是协议只需做两件事验证Y - Xi是生成元G的合法公钥验证交易双方能共同给出其私钥例中的 85。最简单的做法就是要求用超额值85生成一个签名该签名同时确认参与交易的各方能够共同计算私钥超额outputs 之和减去 inputs 之和为零因为只有合法公钥才能通过签名验证。这个签名连同少量其他信息例如挖矿手续费一起附加在交易上称为交易内核transaction kernel由所有验证节点检查。在 Grin 源码中这正是 TxKernel 结构excess字段注释明确写道若交易格式正确金额分量应和为零excess 即为合法公钥即承诺公钥之和excess_sig则是证明 excess 为合法公钥并签署手续费字段的签名。找零Change假设你从 Alice 收到的 3 个币中只想给 Carol 转 2 个那么剩下的 1 个币必须作为找零转回给自己。生成另一个私钥例如 12作为混淆因子来保护找零 output 的金额Carol 仍用她自己的私钥找零 output: 12*G 1*H Carol output: 113*G 2*H链上呈现的结果与前面形式类似签名仍然由超额值生成本例中为 97(12*G 1*H) (113*G 2*H) - (28*G 3*H) 97*G 0*HRange Proof金额必须非负上述所有计算都依赖一个前提所有金额都是正的。若允许负金额攻击者可以每笔交易都印钱——例如 input 金额为 2、output 金额为 5 和 -3交易照样平衡而x*H即使x为负在曲线上也看起来与其他任何点无异难以察觉。Mimblewimble 的解法是Range Proof范围证明同样源自 Confidential Transactions在不泄露数字本身的前提下证明一个数落在某区间内。对每个r*G v*H都可以构造一个证明表明v大于零且不会溢出。值得注意的是Range Proof 对混淆因子和金额都要求存在。原因是防止一种审查攻击censoring attack第三方可以在不知道 UTXO 私钥的情况下锁死某个 UTXO。例如构造Carol 的 UTXO: 133*G 2*H 攻击者的 output: (113 99)*G 2*H由于 Carol 的混淆因子在Y - Xi中被消掉攻击者可以签名Y - Xi ((113 99)*G 2*H) - (113*G 2*H) 99*G该 output 需要同时知道 113 与 99 才能花费攻击者借此成功锁死了 Carol 的 UTXO。而对混淆因子施加 Range Proof 要求可以阻止它——攻击者不知道 113自然也无法证明 (113 99) 落在合法区间。Grin 中 Range Proof 的校验路径可以在源码中得到印证Output 的每个输出都携带一个proof: RangeProof而TransactionBody::validatecore/src/core/transaction.rs#L1232-L1249会对全部 output 执行批量 Range Proof 验证Output::batch_verify_proofs并对全部内核执行批量签名验证TxKernel::batch_sig_verify。轻量级路径validate_read则跳过这两步昂贵校验只做权重、排序与 cut-through 检查。一笔完整交易的构成综合以上一笔 Mimblewimble 交易包含一组 inputs引用并花费一组既有 outputs一组新 outputs每条 output 包含金额与混淆因子即一把新的私钥分别乘以曲线上对应生成元后相加得到r*G v*H一个 Range Proof其中证明v非负一个明文交易手续费一个签名其私钥即超额所有 outputs 与手续费之和减去所有 inputs 之和。对应到 Grin 的代码模型Transaction 由offset交易内核偏移 k2将密钥拆分为 k k1 k2excess 即 k1*G与 TransactionBody 组成后者正是inputs、outputs、kernels三者的集合——这与文档描述的交易构成一一对应。块格式与链状态Cut-Through前面说明了 Mimblewimble 交易如何在不破坏不创造货币与私钥证明所有权这些有效区块链属性的前提下提供强匿名性。Mimblewimble 的块格式在此之上又引入了一个新概念cut-through穿透/剪枝。它带来极佳的可扩展性绝大多数交易信息可以长期被消除而不牺牲安全性更强的匿名性交易信息被混合并移除。交易聚合回顾交易的构成一组 inputs引用并花费若干既有 outputs一组新 outputs一组交易内核每个内核包含内核超额excess 的公钥交易签名其公钥即内核超额。交易的验证就是确认内核超额是合法公钥例如(42*G 1*H) (99*G 2*H) - (113*G 3*H) 28*G 0*H本例中的公钥即28*G。对任意有效交易忽略手续费都有(outputs 之和) - (inputs 之和) 内核超额当我们意识到一个块本质上就是一组聚合后的 inputs、outputs 与交易内核时同样的结论也适用于块把所有 outputs 求和减去所有 inputs 之和所得 Pedersen 承诺应等于所有内核超额之和(outputs 之和) - (inputs 之和) (内核超额之和)忽略手续费后Mimblewimble 块与 Mimblewimble 交易可以用完全相同的方式看待。内核偏移量Kernel Offset与子集问题上述块与交易描述中有一个微妙的问题在多数情况下有时甚至是平凡地可以重构出块中构成它的原始交易——这对隐私很不利。这就是子集问题给定一组 inputs、outputs 与交易内核其中某个子集总可以被组合成一笔有效交易。考虑两笔交易(input1, input2) - (output1), (kärna1) (input3) - (output2), (kärna2)聚合后形成一个块(input1, input2, input3) - (output1, output2), (kärna1, kärna2)穷举所有组合是平凡的可以还原出其中一笔交易求和归零的那组(input1, input2) - (output1), (kärna1)同样剩下的部分即可还原出另一笔交易(input3) - (output2), (kärna2)解决办法回忆内核超额r*G就是超额私钥r的公钥。我们把内核超额从r*G重新定义为(r - kärn_offset)*G并把这个**内核偏移量kärn-offset / kernel offset**分发到每笔交易内核中。该偏移量是一个混淆因子必须加回超额才能让等式成立(outputs 之和) - (inputs 之和) r*G (r - kärn_offset)*G kärn_offset*G或者等价地(outputs 之和) - (inputs 之和) 内核超额 kärn_offset*G对于承诺r*G 0*H与内核偏移量a交易用(r - a)签名a被公开从而可以计算出r*G来验证交易有效性。在构建块时所有内核偏移量求和为一个覆盖整块的总偏移量。单笔交易的偏移量因此变得不可推导子集问题随之解决(outputs 之和) - (inputs 之和) (内核超额之和) kärn_offset*GGrin 的源码结构与这一设计完全吻合BlockHeader 中持有total_kernel_offset: BlindingFactor字段core/src/core/block.rs#L219且块在聚合时通过committed::sum_kernel_offsets将交易偏移与前一累计偏移累加core/src/core/block.rs#L656-L682验证时block_kernel_offset再取回本块自己的偏移当前块累计值减去前一累计值见 core/src/core/block.rs#L734-L749传入verify_kernel_sums。块级求和验证的核心实现位于 core/src/core/committed.rsverify_kernel_sums先调用sum_commitments(overage)把 mining 奖励overage按正负计入 output/input 承诺之和再调用sum_kernel_excesses(kernel_offset)把内核偏移量作为对零的承诺加入内核超额之和最后要求两者相等否则返回KernelSumMismatch。这正是文档公式outputs − inputs Σ内核超额 kernel_offset*G的代码化。Cut-Through块内剪枝块让矿工把多笔交易组装成一个结构追加到链上。考虑下面三笔交易的块表示只画 inputs 与 outputsx标记更早的、被花费的 outputI1(x1) --- O1 |- O2 I2(x2) --- O3 I3(O2) -| I4(O3) --- O4 |- O5观察两个性质块内某些 outputs 被紧随其后的 inputs 直接花费I3 花费 O2I4 花费 O3交易结构其实并不重要既然每笔交易各自求和为零那么所有 inputs 与 outputs 的总和也必然为零。与交易类似验证块只需要所有权证明来自交易内核加上整个块没有凭空造币挖矿奖励除外。因此相互匹配的 input 与 output 对可以直接消除它们的合并效应为零。得到非常紧凑的块I1(x1) | O1 I2(x2) | O4 | O5注意所有交易结构已被消除inputs 与 outputs 的顺序也不再重要所有 inputs 与 outputs 之和保证仍为零。于是一个块由以下部分构成一个块头block headercut-through 后剩余的全部 inputs 列表cut-through 后剩余的全部 outputs 列表一个覆盖整个块的内核偏移量所有内核偏移量之和每笔交易的内核其中包含由所有 inputs 与 outputs 求和得到的公钥r*G由超额生成的签名挖矿手续费。这种结构为 Mimblewimble 块提供了极强的隐私保证中间被 cut-through 掉的交易仅以交易内核形式存在所有 outputs 看起来完全相同都是无法以任何有意义方式区分的巨大数值。若要针对某条特定 output 做审查排除攻击者就必须排除全部 outputs所有交易结构被移除无法看出哪些 input 与哪些 output 相互对应。然而一切仍然可以验证在 Grin 中块内 cut-through 的约束在反序列化/轻量校验阶段强制执行TransactionBody::verify_cut_throughcore/src/core/transaction.rs#L1182-L1190把 inputs 与 outputs 的承诺合并排序后逐一比对若出现相邻相同的承诺即块内未消除的自配对则报CutThrough错误。而块的整体形状就是 [Block { header, body }]core/src/core/block.rs#L496-L506](core/src/core/block.rs#L496-L506)——块头加一个共享的TransactionBody与上文块 聚合交易的论断一致。Block::validatecore/src/core/block.rs#L751-L769则依次执行交易体重校验、kernel lock height 校验、coinbase 校验挖矿奖励的 coinbase output 与 coinbase kernel 求和须含手续费地平衡以及带内核偏移量的verify_kernel_sums。彻底的 Cut-Through 与链状态回到上一示例的块被 I1、I2 花费的 outputs x1、x2 必然更早出现在链上。该块加入链后x1、x2 连同 I1、I2 都可以从链上删除——它们已成为中间交易。由此推断在任意时刻除块头之外整个链状态可以用且仅用三样东西概括挖矿创造的货币总量完整的 UTXO 集合每笔交易的交易内核。其中第 1 项仅需观察块高即可推导。UTXO 集合与交易内核都极为紧凑由此得到两个重要推论Mimblewimble 链上的节点需要存储的链非常小新节点加入网络时同步链所需的同步信息量极少。并且UTXO 集合不可被篡改删掉任何一个元素交易求和就会改变不再等于零。Grin 的链状态正是按此思路组织的chain模块的 txhashset 维护 output 集合、kernel 集合及其对应 Range Proof 等 MMR 视图chain 测试数据目录如chain_compacted/txhashset下的 kernel/output/rangeproof 三个子树展示了压缩后链状态的落地形态与UTXO 内核 块头即全量状态的结论相互印证。小结本文沿 Grin 官方介绍文档的主线走完了 Mimblewimble 区块链的基本原理借助椭圆曲线加法的同态性质我们构造出完全隐匿但可验证的交易——Pedersen 承诺隐藏金额、超额签名证明所有权、Range Proof 排除负值与审查攻击再把同样的性质推广到块层面用内核偏移量解决子集问题用 cut-through 消除海量中间交易信息最终得到一个由块头、UTXO 与交易内核构成的极小链状态从而获得优异的可扩展性。仓库中的 core/src/core/transaction.rs、core/src/core/committed.rs 与 core/src/core/block.rs 为上述每一个数学构造提供了可直接对照的实现与校验入口是进一步深入 Grin 协议层的最佳起点。赞分享区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载相关推荐Grin 与 Mimblewimble 协议详解从 Pedersen 承诺到 Cut-Through 链状态Grin 与 Mimblewimble 协议详解从 Pedersen 承诺到 Cut Through 链状态 Grin 是一个实现 Mimblewimble区块链Web3深入理解 Mimblewimble 协议与 Grin 实现从 Pedersen 承诺到 Cut-Through 链状态压缩深入理解 Mimblewimble 协议与 Grin 实现从 Pedersen 承诺到 Cut Through 链状态压缩 本文基于 Grin 官方文档《In区块链Web3Grin 中 Mimblewimble 协议全解从 Pedersen 承诺到 Cut-Through 区块与源码实现Grin 中 Mimblewimble 协议全解从 Pedersen 承诺到 Cut Through 区块与源码实现 本文以 Grin 仓库官方文档 intr区块链Web3上一篇BetterJoy终极指南三步搞定Switch控制器在PC上的完美体验下一篇AC-Baidu 搜索优化脚本配置项全解析全局调试、去广告、拦截规则与各搜索引擎独有选项创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考