以太坊上的多签要先把所有签名拼进交易,或者依赖合约账户;Schnorr 树签名和门限签名是近年补上这条能力的路。Ergo 走的是另一条更早的路:把「证明」本身做成可编程的构件。它的脚本不是先算出一个布尔值再看签名,而是把条件本身归约成一个可证明的密码学命题,官方文档把它称为 SigmaBoolean。本文按 Ergo 文档拆这套机制,并说明哪些组合是真在链上可验的。
三个动作:承诺、挑战、响应
Ergo 文档对 Sigma 协议的定位是:允许证明者向验证者说明关于某个秘密的某个陈述成立,而不透露秘密本身。协议的骨架固定为三步——先给承诺,再接挑战,最后给响应。链上环境里没有在线的验证者可问,于是用 Fiat-Shamir 变换把「验证者出题」换成对内容做哈希得出挑战值,签名因此变成非交互的。
具体的原语在文档里列得很清楚。离散对数知识证明就是 Schnorr 签名:在 Ergo 里曲线是 secp256k1,公钥形如 Y 等于 g 的 x 次方,链上的挑战哈希用 blake2b256。签名流程是取一个新鲜随机数 r、令 a 等于 g 的 r 次方、把 a、消息和公钥拼起来做哈希得到挑战、再算出响应值;文档还提醒一个实现细节:响应的位长必须不超过 255,否则要重取随机数重试。另一件原语是离散对数相等性证明,即 Diffie-Hellman 元组,用来证明两个不同生成元下的值共享同一个离散对数,文档把它用于隐私相关的构造。
把命题连起来:AND、OR 与 k 取 n

真正让脚本变得像逻辑式编程的是组合算子。文档把可组合的形式列为三类:OR 证明「一组秘密里知道其中一个」,这是环形签名的原理;AND 证明「陈述里所有秘密都知道」,对应多签;门限(k 取 n)证明「至少知道 n 个里的 k 个」,是门限签名的基础。文档还给出链上语法的样子:atLeast(3, Coll(...)) 就是这样一条五把公钥取三的表达式,写在合约里就是一份三取五的策略。用官方的说法,环形签名、多签、门限签名这些功能都不是独立特性,而是同一套组合规则的特例。
花费一笔钱时发生了什么
把机制落到一笔交易的两次调用上会清楚很多。文档说明,想花掉一个 UTXO 的一方先带着它知道的秘密集合构造一个证明器,然后分两步走:第一步归约,用 ErgoTree 解释器把这条花费条件在一个已知的公共上下文(区块链系统状态与被花费的交易)上求值,确定性地归约成一条复合的密码学陈述,也就是 Sigma 命题;第二步签名,把这条可能相当复杂的命题通过 Fiat-Shamir 变换变成一份签名,产出「证明者知道那些秘密」的证据,交易才能被授权。
验证方在每笔输入的校验里同样跑解释器,输入是三样东西:ErgoTree 给出的守卫命题、待验交易所处的区块链上下文、证明者生成的证明(也就是交易签名)。验证也是三步,第一步与证明者相同地做归约,产出 SigmaBoolean 类型的值。文档在这里加了一条容易被忽略的约束:归约必须对任何可能的输入都在一个固定的时间上限内完成,也就是最大成本,由解释器负责检查。这正是脚本语言与自由递归的分水岭——命题可以被组合、被嵌套,但求值代价必须事先可界定。文档还提醒,ErgoScript 里 BigInt 的运算是按 2 的 256 次方取模的,溢出需要显式处理。
能核对什么
读 Ergo 脚本条件时值得分清三层。第一层是布尔条件本身:高度检查、集合运算这类是解释器算出来的事实;第二层是由此归约出的 Sigma 命题,它才决定「谁需要出示什么证明」;第三层才是交易里带的那份签名。三层混着看,就容易把「条件通过了」误读成「某个特定的人签过」。签名方案文档给的曲线、哈希函数、位长约束会随实现版本调整,具体成本上限与 gas 口径应以当时版本的官方文档和节点实现为准。本文按文档描述机制,不涉及任何签名方案强度的量化主张,也不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。