环签名让你代表一个群组签名:任何人都能验证签名来自该群组中的某一个密钥,但没有人能分辨是哪一个。本文介绍环签名如何运作,从 2001 年提出它的论文,到密钥镜像和 CLSAG,并说明 Blocknet 如何用 16 成员的环保护每一笔付款的付款人隐私。
什么是环签名?
环签名是一种数字签名,由一个私钥加上一组其他人的公钥生成。验证者可以确认这些公钥中某一个的持有者签了名,但无法分辨是哪一个。签名者当场挑选这个群组,不需要事先设置,也不需要其他成员配合。
普通的数字签名把一条消息和一个公钥绑定在一起。环签名则把消息和一组公钥绑定在一起,这组公钥称为环。签名者只需要自己的私钥;其他成员除了他们早已公开的公钥之外,什么都不用提供。在外人看来,环中的每个成员都同样可能是签名者。
环签名是从哪里来的?
Ron Rivest、Adi Shamir 和 Yael Tauman 在 ASIACRYPT 2001 上发表了题为 “How to Leak a Secret” 的论文,提出了环签名。论文中的例子是一位内阁成员,他想把一条消息泄露给记者,既要证明消息确实来自内阁,又不透露是哪位成员。他用自己的私钥加上其他内阁成员的公钥签名,记者可以验证签名,却无从得知是谁写的。
这个构想有两个突出的特点。第一,没有能揭示签名者身份的群组管理者,这让环签名有别于更早的群签名。第二,环是临时组建的:签名者可以在签名时用任何已公开的公钥组成环。作者选用这个名字,是因为“环是边缘均匀、没有中心的几何区域”:每个成员都在边上,没有人居于主导地位。签名算法也是同样的形状,一串计算最终绕回到起点。
环签名是如何运作的?
加密货币中使用的现代方案用哈希和椭圆曲线密钥来构建这个环。下面用简单的步骤说明一个包含 16 个公钥的环:
- 从自己的位置开始。 签名者选一个随机秘密数,把它和消息一起做哈希。这个哈希值就成为环中下一个位置的挑战值。
- 为其他每个位置伪造一个响应。 对其他 15 个成员中的每一个,签名者选一个随机响应,把它和该成员的公钥以及当前挑战值组合起来,算出再下一个位置的挑战值。
- 闭合这个环。 绕完一整圈后,计算链回到签名者自己的位置。只有持有这个位置私钥的人,才能算出那个让计算链恰好回到起点的响应。
签名由起始挑战值加上 16 个响应组成。验证者可以从任意位置开始,用公钥和响应逐个重新计算挑战值,绕环一周,检查这个环是否闭合。每个位置看起来都一样:一个公钥和一个看似随机的响应。没有任何东西标示签名者从哪里开始,所以验证者只知道有一个私钥闭合了这个环,却不知道是哪一个。
密钥镜像如何防止双花?
普通环签名用于货币时有一个缺口:如果每次花费都隐藏在其他输出之中,网络就看不出同一笔币被花了两次。可链接环签名解决了这个问题。Joseph Liu、Victor Wei 和 Duncan Wong 在 ACISP 2004 上描述了第一个这样的方案 LSAG(ePrint 2004/027)。用同一个私钥生成的两个签名可以相互关联,而签名者依然隐藏在环中。
2013 年的 CryptoNote 设计把这一点做成了密钥镜像。对于私钥为 x、公钥为 P 的输出,钱包计算 I = x · Hp(P),其中 Hp 把公钥哈希成曲线上的一个点。签名证明 I 属于签了名的那个环成员,但不说明是哪一个。由于密钥镜像只取决于被花费的输出,再次花费这个输出总会产生同一个 I。每个节点都保存已经出现过的密钥镜像列表,并拒绝任何重复使用密钥镜像的交易。
从 MLSAG 到 CLSAG
同时隐藏金额的加密货币,需要环签名再证明一件事:被隐藏的输入金额与交易花费的金额相符。Shen Noether 2015 年的论文 “Ring Signature Confidential Transactions for Monero”(RingCT)用 MLSAG 做到了这一点,MLSAG 是一种覆盖两组密钥的环签名,一组用于证明所有权,一组用于金额承诺。
CLSAG 由 Brandon Goodell、Sarang Noether 和 Arthur Blue 提出(ePrint 2019/654),能以更紧凑的方式证明同样的两件事。Monero 在 2020 年 10 月的升级中从 MLSAG 切换到 CLSAG。Monero 文档称验证速度提高约 20%,一笔典型的两输入、两输出交易从约 2.5 kB 缩小到 1.9 kB。
环大小对隐私意味着什么?
环大小是每个环中的输出数量:真实输出加上诱饵。16 成员的环意味着观察者对每个输入都看到 16 个同样有效的候选。固定的环大小和足够大的环大小同样重要,因为当每个输入都使用相同大小时,大小本身不会透露任何关于交易构建者的信息。
诱饵是链上的真实输出,所以每一个都真的可能是被花费的那笔币。如果环大小可以变化,选择不常见大小的钱包就会让自己的交易显得与众不同。Monero 在 2022 年 8 月的升级中把环大小从 11 提高到 16,而 Blocknet 通过共识让每个输入都使用 16。
Blocknet 如何使用环签名
Blocknet 的每个输入都用 CLSAG 和 RingCT 签名,环恰好包含 16 个输出。这些规则由共识强制执行,任何钱包都无法绕过:
- 固定 16 成员的环。 守护进程会拒绝环成员不是恰好 16 个的任何输入。它的代码固定环大小,“以防止可变环大小造成的信息泄露”。
- 只用真实输出。 每个环成员都必须是链上已有的真实输出,所以每个诱饵都是一笔真的可能被花费的币。
- 随机诱饵和随机位置。 钱包用密码学安全的随机数生成器打乱链上的输出,从中选出 15 个诱饵,再把你的真实输出放在环中的随机位置。
- 所有权和金额在同一个证明里。 每个签名都证明你拥有一个环成员,并且你输入的隐藏金额与该成员的承诺相符,因此金额无需公开就能收支平衡。
- 密钥镜像与链上记录核对。 密钥镜像是签名数据的一部分,如果该密钥镜像已经被花费过,或者在同一笔交易中出现两次,网络就会拒绝这笔交易。
交易格式没有透明模式,所以链上的每一笔付款都带有这样的环。环签名隐藏付款人;一次性隐身地址隐藏收款人,Pedersen 承诺加 Bulletproofs 隐藏金额。Blocknet 如何保护支付隐私逐一介绍了这些保护层,以及它们在你付款时意味着什么。
Faraday 升级接下来会带来什么
根据 blocknetcrypto.com,Blocknet 计划进行一次名为 Faraday 的网络升级,计划在 2027-02-16 前后激活。用该网站的话说:“Today a spend hides among 16 outputs. After Faraday, it hides among every output on the chain.”(如今一次花费隐藏在 16 个输出之中。Faraday 之后,它将隐藏在链上的所有输出之中。)Faraday 还将带来新的花费证明,网站将其描述为“Built so a quantum computer cannot forge a spend.”(设计上让量子计算机无法伪造花费。)设计、测试和对抗性审查正在进行中,日期是计划日期,并非最终确定。
获取一些 BNT 来私密转账
获得使用这些环的币,一个简单的方法是挖矿。seine 挖矿软件免费、开源,并会根据你的电脑自动调整,bntpool.com 是它的默认矿池,所以几分钟内就能开始挖矿。挖矿指南介绍了设置步骤,你可以直接挖到你的地址或 Blocknet ID 名称。
常见问题
环签名和群签名有什么区别?
群签名需要一个管理者事先建立群组,并且管理者可以揭示是谁签的名。环签名没有管理者,也不需要事先设置:签名者当场挑选任意一组公钥,事后任何人,包括那些公钥被用到的人,都无法证明是哪个成员生成了这个签名。
环签名中的密钥镜像是什么?
密钥镜像是由被花费输出的私钥计算出来的一个值。同一个输出总是产生同一个密钥镜像,所以网络会拒绝对它的第二次花费,但密钥镜像不会透露哪个环成员才是真实的。它把环签名变成可链接环签名,从而防止双花。
什么是 CLSAG?
CLSAG 是 Brandon Goodell、Sarang Noether 和 Arthur Blue 在 2019 年描述的一种可链接环签名方案。它证明签名者拥有环中的一个输出并且金额收支平衡,同时用密钥镜像阻止双花。Monero 在 2020 年 10 月采用了它,Blocknet 用 CLSAG 和 RingCT 为每个输入签名。
Blocknet 使用多大的环?
Blocknet 的每个输入都使用恰好 16 个成员的环:真实输出加上 15 个诱饵,每个诱饵都是链上已有的真实输出。共识会拒绝任何其他大小。由于每个输入的环大小都相同,环大小永远无法用来区分某笔交易,而且真实输出在环中的位置是随机的。
环签名会隐藏付款金额吗?
不会。环签名隐藏的是哪个输出付了款。金额由另一层隐藏:Pedersen 承诺锁定一个数字但不显示它,Bulletproofs 范围证明则证明每个金额有效。Blocknet 在每笔交易上同时使用这些技术,再加上隐藏收款人的一次性隐身地址。