
区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载Mimblewimble 是一种依托强密码学原语构建的区块链格式与协议它同时提供了极佳的扩展性、隐私性与同质化fungibility能力直指当前绝大多数区块链实现中普遍存在的缺陷。Grin 则是将该协议落地为完整区块链与加密货币的开源软件项目。本文以仓库内 doc/translations/intro_DE.md及英文原版 doc/intro.md为主体系统讲解 Mimblewimble 的技术构造从椭圆曲线密码学ECC的加法性质出发逐步推导出隐藏金额的 Pedersen Commitment、基于 excess 签名的所有权证明、Range Proof 非负性保证以及支撑区块级隐私与极致压缩的 Cut-through 剪除机制。读完本文你将理解 Grin 交易与区块既能完全遮蔽、又可以被严格验证的底层逻辑并能对照仓库源码core/src/core/transaction.rs、core/src/core/block.rs 等印证每一个关键环节的真实实现。Grin 项目的目标与特性Grin 是一个实现 Mimblewimble 区块链的开源软件项目其核心目标与特性可以概括为默认隐私Privacy by default隐私是默认行为而非可选项这带来了完整的同质化能力同时不排除按需选择性披露信息。主要随用户数而非交易数扩展一笔交易的证据核心是一个不足 100 字节的kernel相比其他区块链在存储空间上大幅节省。强健且久经考验的密码学Mimblewimble 只依赖椭圆曲线密码学ECC这是已被业界实践检验数十年的密码学基础。设计简洁简洁的设计便于长期审计与维护。社区驱动鼓励挖矿去中心化由社区共同治理。在仓库 README.md 中项目同样被定位为 Minimal implementation of the Mimblewimble protocol其设计哲学贯穿于 core、chain、pool、p2p 等各个 crate 的实现中。预备知识椭圆曲线密码学ECC的加法性质理解 Mimblewimble 之前先回顾 ECC 中与协议直接相关的几条性质不需要深究 ECC 的全部细节。密码学所用的椭圆曲线可以看作一个巨大的点集合记为C。这些点可以相加、相减结果仍是曲线上的点点也可以通过与整数即标量相乘的方式连续叠加即标量乘法。给定曲线上的点H与整数k通过标量乘法可计算k*H它同样是曲线C上的一个点。给定另一个整数j还可计算(kj)*H它等于k*H j*H。椭圆曲线上的加法与标量乘法保持分配律(kj)*H k*H j*H在 ECC 中选取一个非常大的数k作为私钥k*H即是对应的公钥。即使公钥k*H公开反推k也几乎不可能——换言之乘法是平凡的而除以曲线点极其困难。上述公式揭示了重要事实两个私钥相加所得的公钥(kj)*H与这两个私钥各自的公钥相加k*H j*H完全相同。比特币中的分层确定性Hierarchical Deterministic钱包大量依赖这一性质Mimblewimble 与 Grin 的实现同样如此。交易的两大验证支柱Mimblewimble 交易结构体现了一条核心宗旨强隐私与机密性保证。交易的验证依赖两个基本性质零和验证Verification of zero sums所有输出减输入的总和恒等于零从而证明交易没有凭空创造新资金同时不泄露真实金额。私钥所有权Possession of private keys与大多数加密货币一样交易输出的所有权由持有 ECC 私钥保证。但关键区别在于证明某实体持有这些私钥并非通过直接对交易签名完成而是通过下面将要介绍的 excess 签名机制。接下来的余额、所有权、找零、证明四个环节将详细解释这两大支柱如何实现。隐藏余额Pedersen Commitment基于上述 ECC 性质交易中的数值可以被遮蔽。设v是交易输入或输出的金额H是椭圆曲线上的一个点那么可以用v*H代替v嵌入交易。这样仍能验证输出的和等于输入的和v1 v2 v3 v1*H v2*H v3*H对每笔交易验证这一性质协议就能在不知道真实数值的情况下确认交易没有凭空造钱。但这里存在两个隐患其一可用数值是有限的攻击者可以逐一枚举测试来推测你的交易金额其二只要知道某个 v1例如来自历史交易以及它对应的v1*H就能在整条链上识别出所有相同金额的输出。为此协议引入同一条椭圆曲线上的第二个生成点GG只是与H同群中的另一个生成点以及一个用作盲化因子Blinding Factor的私钥r。于是交易中每个输入或输出金额可以表示为r*G v*H其中r是充当盲化因子的私钥r*G是以G为生成点时r的公钥v是输入或输出的金额v*H是以H为生成点得到的另一个公钥。借助 ECC 的基本性质v和r都无法被反推。r*G v*H被称为Pedersen Commitment。举例假设要构建一笔含两个输入、一个输出的交易暂不考虑手续费vi1、vi2 为输入金额vo3 为输出金额。且vi1 vi2 vo3。为每个输入金额生成一个作为盲化因子的私钥并用各自的 Pedersen Commitment 替换上式中的金额(ri1*G vi1*H) (ri2*G vi2*H) (ro3*G vo3*H)其必然推论是ri1 ri2 ro3这就是 Mimblewimble 的第一根支柱验证交易所需的算术可以在完全不知道任何金额的情况下完成。这一思想源自 Greg Maxwell 提出的 Confidential Transactions机密交易而后者又源自 Adam Back 针对比特币提出的同态数值方案。在 Grin 中Pedersen Commitment 的实际生成可见于 keychain/src/keychain.rs 的commit方法先由derive_key基于密钥派生路径与 SwitchCommitmentType 派生盲化私钥再调用secp.commit(amount, key)得到承诺keychain/src/keychain.rs。所有权证明为什么别人偷不走你的钱上一节把私钥作为盲化因子来遮蔽金额Mimblewimble 的第二点洞察是这枚私钥还可以用来证明对金额的所有权。假设 Alice 给你发了 3 个币为了遮蔽金额你选择 28 作为盲化因子实际中盲化因子作为私钥是一个极大的数。链上某处会出现如下输出且只应能被你花费X 28*G 3*HX加法结果对所有人可见金额 3 只有你和 Alice 知道28 只有你自己知道。要把这 3 个币再次转出协议要求以某种方式知道 28。假设你要把这 3 个币转给 Carol需要构造一笔简单交易Xi Y其中Xi是花费你的输出X的输入Y是 Carol 的输出。不知道你的私钥 28就不可能构造并平衡这样一笔交易。事实上如果 Carol 要平衡这笔交易她必须同时知道发送金额和你的私钥才能做到Y - Xi (28*G 3*H) - (28*G 3*H) 0*G 0*H通过检查一切归零可以再次确认没有新钱被创造出来。但等等——如果 Carol 的输出中使用了与你的私钥相同的 28 来保持平衡那么你也知道了 Carol 输出的私钥完全可以把钱偷回来解决方案是Carol 使用她自己选择的私钥。假设她选择 113最终上链的等式变为Y - Xi (113*G 3*H) - (28*G 3*H) 85*G 0*H此时交易不再归零而是产生一个excess value溢出值85它是所有盲化因子相加对应地相减的结果。注意85*G是生成点G上的一个合法公钥。因此协议需要验证交易的参与各方能否共同为结果点Y - Xi生成私钥上例中的 85即以G为生成点、与85*G对应的公钥。最简单的方式是用公钥Y - Xi即85*G去验证一个由溢出值 85 签名的签名。这同时保证了交易参与各方共同掌握公钥Y - Xi对应的私钥即溢出值输出金额之和减去输入金额之和为零否则公私钥无法对应这正是存在签名校验的原因。这笔附加在每笔交易上、连同其他数据如挖矿手续费一起的签名被称为交易 KernelTransaction Kernel由所有验证节点检查。在 Grin 源码中TxKernel结构体正是由三部分组成featureskernel 特性、excess承诺与excess_sig证明 excess 是合法公钥、并对 fee_fields 签名的签名见 core/src/core/transaction.rs。找零与 Range Proof确保数值非负本节进一步展开交易的构造讨论找零Change的引入以及 Range Proof 的必要性使所有数值都被证明为非负。找零Change假设你只想把 Alice 给的 3 个币中的 2 个转给 Carol。为此你需要把剩下的 1 个币作为找零转回给自己。你生成另一个私钥例如 12作为盲化因子来保护找零输出Carol 依旧使用她自己的私钥找零输出: 12*G 1*H Carol 输出: 113*G 2*H最终上链的内容与之前非常相似签名依旧基于溢出值构造本例中为 97(12*G 1*H) (113*G 2*H) - (28*G 3*H) 97*G 0*HRange Proof范围证明前述所有计算都依赖一个隐含假设交易金额始终为正。引入负数将带来灾难性后果——每笔交易都可能凭空造出新钱。例如可以构造一笔输入为 2、输出为 5 和 -3 的交易它在前述定义下依然平衡。这种作恶很难被察觉因为即便x为负曲线上对应的点x*H看起来与其他点并无区别。为解决此问题Mimblewimble 采用了同样源自 Confidential Transactions 的密码学概念Range Proof——在不泄露数值的前提下证明该数值落在给定范围内。我们不必深入 Range Proof 的实现细节只需知道对于任意r*G v*H都可以构造一个证明表明v非负且不会溢出。这里还隐含一个容易被忽略但至关重要的点Range Proof同时覆盖盲化因子与金额。英文原版 doc/intro.md 用一个审查攻击censoring attack的例子说明了其必要性攻击者可以伪造一笔转账如把 Carol 的 UTXO113*G 2*H改成(113 99)*G 2*H由于 Carol 的盲化因子在Y - Xi的差式中相互抵消结果为99*G攻击者无需知道 113 即可完成签名从而在不知道私钥的情况下锁定冻结Carol 的 UTXO而要求对盲化因子也提供 Range Proof 后攻击者因不知道 113也就不知道 11399无法为该输出生成合法证明攻击便无法得逞。Grin 中 Range Proof 的生成与验证见 core/src/libtx/proof.rscreate通过secp.bullet_proof(...)生成 BulletProof 范围证明core/src/libtx/proof.rsverify则调用secp.verify_bullet_proof(...)进行验证core/src/libtx/proof.rs。一笔 Mimblewimble 交易的完整构成综合以上各环节一笔 Mimblewimble 交易包含一组输入Inputs引用并花费一组先前的输出一组新输出Outputs每个输出包含盲化因子r与金额v分别对生成点 G、H 做标量乘法后求和为r*G v*H一个 Range Proof证明v非负以及其他性质一笔明文交易手续费fee一个以溢出值所有输出金额加手续费再减输入金额之和作为私钥生成的签名。在 Grin 的源码中这一结构被明确建模为Transaction结构体包含offsetkernel offset即下面要讲的 k2与body交易体见 core/src/core/transaction.rs交易体TransactionBody则由inputs、outputs、kernels三部分组成core/src/core/transaction.rs输出Output由输出标识features commitment与range proof构成core/src/core/transaction.rs。区块与链状态Cut-through 剪除机制上文说明了 Mimblewimble 交易如何在保持有效区块链所需性质不造钱、私钥证明所有权的同时提供强匿名性。Mimblewimble 的区块格式在此基础上引入了一个额外概念Cut-through。凭借它一条 Mimblewimble 链获得极佳的扩展性绝大多数交易数据可以随时间推移被删除且不损害安全性更强的匿名性通过混合与删除交易数据进一步混淆关联高效的同步能力新节点能以极小的数据量高效地与网络其余部分同步。交易聚合Transaction Aggregation回顾一下每笔交易由以下部分组成一组引用并花费先前输出的输入一组新输出Pedersen Commitment一个交易 kernel包含Kernel Excess对零的 Pedersen Commitment交易签名以 Kernel Excess 作为公钥。交易被签名后签名放入Transaction Kernel。签名以Kernel Excess作为公钥生成从而证明交易归零(42*G 1*H) (99*G 2*H) - (113*G 3*H) 28*G 0*H本例中的公钥是28*G。对任意交易为简化暂忽略手续费都有sum(outputs) - sum(inputs) kernel_excess一旦意识到区块不过是一组聚合后的输入、输出与交易 kernel同样的关系也适用于区块将所有输出求和、减去所有输入得到的 Pedersen Commitment 应与所有 kernel excess 之和相等sum(outputs) - sum(inputs) sum(kernel_excess)简化表述依旧忽略手续费Mimblewimble 区块可以完全像 Mimblewimble 交易一样处理。Grin 中这一聚合逻辑由 core/src/core/transaction.rs 的aggregate函数实现它把所有交易的输入、输出、kernel 收集起来先做 cut-through再把各交易 kernel offset 求和为单一聚合 offset最后构建出多 kernel 的聚合交易。区块构造入口 core/src/core/block.rs 的Block::from_reward也印证了区块即大交易的思想——注释中明确写着 A block is just a big transaction, aggregate and add the reward output and reward kernel。Kernel Offsets解决子集问题上述区块与交易构造方式存在一个微妙的问题有可能有时甚至很 trivial从区块中重建出构成它的原始交易这对隐私显然是灾难。这就是子集问题给定一组输入、输出与交易 kernel其中某个子集可以重组出一笔合法交易。例如给定两笔交易(in1, in2) - (out1), (kern1) (in3) - (out2), (kern2)聚合进同一个区块即聚合交易(in1, in2, in3) - (out1, out2), (kern1, kern2)尝试所有排列组合trivially 就能恢复其中一笔成功归零的交易(in1, in2) - (out1), (kern1)而剩余部分恰好也能重建出另一笔合法交易(in3) - (out2), (kern2)为抑制这一问题Grin 的每个交易 kernel 都携带一个Kernel Offset。它也是一个盲化因子私钥必须被加回到 kernel excess 上才能验证承诺之和为零sum(outputs) - sum(inputs) kernel_excess kernel_offset更精确地说在交易构造过程中将密钥k拆分为k1 k2。对交易 kernel(k1k2)*G发布k1*G即 excess用于签名验证与k2即 offset签名依旧用k1*G作为公钥完成。当把区块中的交易聚合起来时只需把所有k2偏移量求和生成一个覆盖整块交易的聚合 offset存入区块头。由于这个单一 offset 无法被拆解回各个交易的原始 offset子集问题便不复存在交易不再可被重建sum(outputs) - sum(inputs) sum(kernel_excess) kernel_offsetGrin 源码对此的建模非常直观Transaction结构体中的offset字段注释为 The kernel offset k2, excess is k1G after splitting the key k k1 k2core/src/core/transaction.rs区块头BlockHeader中则有total_kernel_offset字段保存自创世区块以来 kernel offset 的累计和core/src/core/block.rs。区块校验时通过 core/src/core/block.rs 的block_kernel_offset从总 offset 中减去前一区块的 offset得到本区块的 offset再与输入输出承诺之和做比对core/src/core/block.rs。底层求和的实现见 core/src/core/committed.rs 的sum_kernel_offsets它把若干BlindingFactor转为私钥并调用secp.blind_sum求和。Cut-through区块内部的输入输出抵消区块允许矿工把多笔交易组装成单个集合加入链中。下面以含 3 笔交易的区块为例只展示交易的输入输出输入引用其花费的输出大写 O 为本区块内新产生的输出小写 x 标记此前区块已出现的输出I1(x1) --- O1 |- O2 I2(x2) --- O3 I3(O2) -| I4(O3) --- O4 |- O5可以观察到两个性质区块内有些输出直接被后续输入花费I3 花费 O2I4 花费 O3每笔交易的具体结构其实无关紧要——因为所有交易各自归零所以全部交易输入输出之和必然为零。与交易类似区块中需要校验的只有所有权已被证明来自Transaction Kernel以及整个区块没有凭空增发货币除挖矿奖励允许的部分外。因此相互匹配的输入与输出可以被删除因为它们对总和数的贡献相互抵消。于是得到更紧凑的区块I1(x1) | O1 I2(x2) | O4 | O5注意所有交易结构已被消除输入与输出的排列顺序也不再重要但输出之和减输入之和仍然保证为零。一个区块因此简化为由以下部分构成一个区块头Block HeaderCut-through 后剩余的输入列表Cut-through 后剩余的输出列表一个覆盖整个区块的聚合 kernel offset所有 kernel offset 之和每笔交易的交易 kernel其中包含公钥(r-a)*G即修改后的kernel excess以修改后的溢出值(r-a)作为私钥生成的签名挖矿手续费。区块内容满足sum(outputs) - sum(inputs) sum(kernel_excess) kernel_offset*G按此结构组织的 Mimblewimble 区块提供了极强的隐私保证中间被 cut-through 的交易只由其交易 kernel 代表所有输出看起来一模一样都是无法相互区分的大数。想排除某个特定输出就必须排除全部所有交易结构被移除无法判断哪个输入对应哪个输出。而它——依然能够完整通过校验Grin 中 cut-through 的实际算法见 core/src/core/transaction.rs 的cut_through函数先将输入与输出按承诺排序再用双指针线性扫描凡输入承诺与输出承诺相等者即为剪除对象最后检查剪除后无重复输入/重复输出。测试 core/tests/transaction.rs 验证了交易内直接花费同承诺输出会因 cut-through 规则而校验失败Error::CutThrough而显式执行 cut-through 后交易恢复合法区块级对应测试见 core/tests/block.rsblock_with_cut_through断言构造出的区块被自动压缩且依然有效与 core/tests/block.rs。Cut-through 贯彻到底链状态最小化回到前面的示例区块被 I1、I2 花费的 x1、x2 必定早已出现在链上。因此在本区块加入之后这些输出连同 I1、I2 也可以从整条链中移除——它们已成为中间交易。推广之任意时刻的链状态不含区块头只需由以下三部分信息概括链上通过挖矿创建的总币数完整的未花费输出UTXO集合每笔交易的交易 kernel。第一项只需通过区块高度距创世区块的距离即可推导。未花费输出与交易 kernel 都极其紧凑这带来两个重要后果节点需要维护的区块链状态非常小文档估计一条规模相当于比特币的链仅约几个 GB且理论上可优化至几百 MB 量级新节点加入网络时需要传输的数据量也非常小。此外UTXO 集合不可能被篡改无论添加还是删除哪怕一个输入或输出都会使交易的求和结果不再为零从而立刻暴露。Grin 对这套思想的工程实现散落在多个模块链状态存储与剪枝由 chain/src/txhashset/txhashset.rs 承担——每个被花费的输出通过apply_input同时从输出 PMMR 与 range proof PMMR 中剪除chain/src/txhashset/txhashset.rs状态校验入口validate依次执行 MMR 根校验、大小校验、kernel sums 校验并在非快速模式下逐输出验证 range proof、逐 kernel 验证签名chain/src/txhashset/txhashset.rs。新节点同步时若所需区块早于 horizon则改为直接下载紧凑的 txhashset 快照而非全量区块相关逻辑见 servers/src/grin/sync/body_sync.rs。值得一提的是区块奖励同样被纳入这套承诺体系挖矿输出Coinbase与奖励 kernel 的铸造见 core/src/libtx/reward.rs其奖励金额由 core/src/consensus.rs 的reward(fee) REWARD fee决定其中REWARD BLOCK_TIME_SEC * GRIN_BASE即每区块 60 秒 × 10 亿 nanogrin区块校验通过verify_coinbase检查 coinbase 输出之和扣除手续费后的奖励承诺与 coinbase kernel 之和是否相等core/src/core/block.rs一旦篡改 coinbase 标志就会触发CoinbaseSumMismatch错误见测试 core/tests/block.rs。coinbase 需要经历成熟期COINBASE_MATURITY DAY_HEIGHT见 core/src/consensus.rs才可被花费这也与 doc/coinbase_maturity.md 中阐述的规则一致。结语本文覆盖了 Mimblewimble 区块链背后的基本原理。借助椭圆曲线点的加法性质我们能够构造出完全不可解读、却仍能被正确验证的交易通过把这一性质推广到区块层面又可以删除海量区块链数据从而获得卓越的扩展能力与新节点快速同步能力。整条链的状态最终收敛为总发行量 UTXO 集合 交易 kernel三部分而每个环节——从 Pedersen Commitment 的生成、Range Proof 的铸造到 kernel offset 的聚合、cut-through 的剪除——都能在 Grin 仓库的源码与测试中找到一一对应的实现。建议读者进一步阅读仓库内的英文原版 doc/intro.md 与更深入的专题文档如 doc/validation/validation_logic.md、doc/pruning.md并结合 core/tests 下的测试用例亲手验证这些机制。赞分享区块链Web3【免费下载链接】grinMinimal implementation of the Mimblewimble protocol.项目地址https://gitcode.com/gh_mirrors/gr/grin点击查看免费下载相关推荐XELIS加密算法详解Ristretto255与椭圆曲线密码学XELIS加密算法详解Ristretto255与椭圆曲线密码学 在区块链技术飞速发展的今天隐私保护和安全通信成为了用户关注的核心议题。XELIS区块链作为一终极免费音频编辑指南Audacity如何让普通人制作专业级音效终极免费音频编辑指南Audacity如何让普通人制作专业级音效 你是否曾梦想制作自己的播客、为视频添加专业音效或是创作属于自己的音乐但面对复杂的音频软件和音频处理桌面应用音视频深入理解Crypton项目中的椭圆曲线密码学深入理解Crypton项目中的椭圆曲线密码学 前言 椭圆曲线密码学 ECC 是现代密码学中最重要的公钥加密技术之一。相比传统RSA算法ECC能够在提供相同安全网络安全文档/教程上一篇ChangeDetection高级技巧自定义监控频率、过滤无关变化提升追踪效率下一篇如何把 Open-ClaudeCode 接上第三方 API 代理settings.json 配置实战教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考