cover_image

我为什么反对Taproot

Kurt Pan XPTY
2021年06月16日 18:58

翻译自:https://freicoin.substack.com/p/why-im-against-taproot

作者:Mark Friedenbach

译者:Kurt Pan

开发人员:我们正在为比特币添加 Schnorr 签名!

:太棒了。

开发人员:我们通过隐藏最常见支付路径背后的输出脚本来增强隐私。

:看起来很聪明。

开发人员:您甚至可以将环签名用于大型匿名集合成员证明!

:哇,太酷了!

开发人员:我们正在安排每个比特币在不可预测的不久将来的某一天被盗

:等等,什么???

开发人员:...

Taproot到底是什么?

Taproot是比特币开发者向社区提议采用的最新的软分叉功能扩展,以下是简短的总结:

比特币核心参考实现的开发人员提议比特币网络采用一种新型脚本来保护比特币输出,该脚本与旧脚本系统相关,但具有许多显着优势。最重要的是,这个新脚本用更简单、更容易实现且功能更强大的 Schnorr 数字签名方案取代了古老的 ECDSA 签名算法。由于定义 Schnorr 签名的数学更简单,这允许许多多方或多密钥的用例在签名时进行优化,从而产生更小的交易,而不会改变底层的加密安全性。完成此优化后,多方/多密钥用例变得与典型钱包生成的单密钥签名无法区分。这允许具有定制签名规则的高级用户“隐藏在人群中”并防止他们的自定义规则会为他们的交易添加水印。

与 2017 年激活的隔离见证更新一样,还有大量其他脚本改进被添加到 Taproot 脚本中,这些更多是因为出现的机会,而非与Schnorr签名本身有任何关系[1] :一个允许更容易的脚本更新的内部脚本版本,一个签名“附件”将在未来用于实现委托和其他数字签名扩展,一个新的签名验证操作码,以及各种脚本限制的放宽。

比特币开发者认识到几乎所有比特币上的智能合约都是“要么每个人都同意,要么确保满足以下条件来解决冲突:_________ ”的形式。“每个人都同意”的部分可以表示为多方/多密钥 Schnorr 签名,并且大多数合约都是合作解决的[2] 。为了利用这一事实,Taproot 赋予“每个人都同意”的合作关闭特权,使其在链上看起来像一个单密钥签名,没有其他未使用的冲突解决条件的公开可见指示。

到现在为止都还好。这些都是我过去所提倡的,其中一些甚至是我的建议或与已经在 Tradecraft/Freicoin 上激活的功能有关。我绝对支持比特币在上述方向上的渐进式发展。

作为最后的一个效率提升点,Taproot扩展将“每个人都同意”的多密钥聚合 Schnorr 公钥作为裸公钥放置在 Taproot输出的 scriptPubKey 中。与 Tradecraft/Freicoin 的 MAST实现以及[3]与我向比特币提出的 BIP 98/116/117 不同,Taproot 的冲突解决机制是通过将它们承诺到上述裸公钥之中来隐藏的,该裸公钥是 UTXO 集合的一部分。如果需要冲突解决脚本,则承诺会在支付时解开。否则,合作关闭的结果看起来就像任何其他单密钥支付。这种聪明的技巧通过允许所有输出和合作支付在链上看起来相同来实现隐私优势;节省空间,因为公钥不需要重复在支出见证中出现;并允许一些非常酷的技巧,如高效的非交互式环签名所有权证明,确认你拥有特定值的输出,但不确切揭示哪个输出是你的。即使是那些不共享“所有人都同意”的多方合作结果的少数脚本也可以通过选择一个随机公钥(没人知道其离散对数),作为对其实际支付脚本的承诺的基密钥。

但是,让我重复一遍:这个最后的的效率提升和其他好处来自在创建输出时在链上提供裸 secp256k1 公钥,该公钥对底层的比特币具有绝对支付权限。恐怕这就是未来的历史学家会注意到这一切都变得非常非常错误的地方。

谈谈经典计算机

我不是在谈论我童年时代的经典计算机比如Commodore 64 或 Apple ][。至少不是具体的谈论。我说的是计算机科学领域研究的机器,它包括所有信息处理设备,这些设备可以在受牛顿力学经典定律或麦克斯韦电磁学支配的宇宙中建造。5 纳米硅晶体管,或瑞士精美手表的发条机制——它们都具有相同的特性,计算机科学家在上个世纪已经发现了这些特性。

经典计算机操作信息、存储信息、转换信息并与其他数据进行比较以做出决策。数字计算机的基本单位是比特,表示为 1 或 0。任何东西都可以简化为数学模型,而所有数学都可以用数字逻辑表示。我们可以通过数学得出各种实际问题的固有难度,即解决一般问题所需的最少工作量。例如,如果你给我一个随机排列的 1000 个整数的列表,我可以编写一个对列表进行排序的程序。但是无论我如何构建我的程序,它仍然需要至少 10000 步来排序,因为排序具有 [4]的固有复杂性。

有点令人惊讶的是,我们并没有关于解决构成密码学基本原语的各种数论挑战的严格复杂性的证明。但是我们有针对任何加密系统的一般攻击,并且有充分的理由[5]相信当前使用的系统不存在更好的攻击。

对于像 SHA-256 这样的散列函数,需要 次运算才能找到散列为相同值的输入(不一定是相同的输入),称为原像;需要 次运算才能找到散列到相同值的两个输入(碰撞),其中 是散列函数的长度(对于 SHA-256,)。

对于椭圆曲线数字签名,使用 Pollard 的 rho 算法需要 次操作才能发现给定公钥的私钥,其中 是群大小的对数。比特币的 secp256k1 曲线是一个大约有个元素的群,因此破解一个密钥大约需要 次操作。

谈谈量子密码学

经典物理学定律,牛顿力学和麦克斯韦电磁学,假设世界由每时每刻都具有确定的实在状态的事物组成。晶体管不可能同时发出信号和不发出信号,电容器不可能既充满电又是空的,猫不可能既是活的也是死的。然而在 1920 年代,物理学家发现世界在亚原子尺度上的运行并不是如此整洁,孤立的粒子有可能表现出奇怪的行为,它会同时占据两个或多个状态,并且只有在测量时才随机确定最终状态. 至关重要的是,经历这种量子模糊性的两个或多个粒子可以相互作用并导致它们的状态相互纠缠,这意味着其中一个一个的值取决于另一个的尚未确定的值。

物理学家和计算机科学家自然想知道是否可以建造利用这些量子特性来执行计算的设备。答案是肯定的,而且事实证明,这样的机器可以做经典计算机不能做的事情。直观上并不太复杂:经典计算机通过机械方式计算答案。如果你正在寻找一个问题的解,你需要检查每一个可能的输入,直到找到要找的答案。如果你很聪明,你可以通过使用输入的结构来减少你的工作量,以避免测试不必要的解。密码学就建立在那些我们认为没有比尝试每个输入更快的方法来找到解的问题上的[6]

但量子计算机的工作方式不同。本质上,你是将一堆量子比特纠缠在一起,首先初始化以保存所有可能的值。然后以阻止任何错误答案的方式限制它们的纠缠态,以致它们确实具有的值就是解。然后测量量子比特,迫使它们输出单一值。因为受到很强的限制,以至于唯一能输出的值就是你要解决的问题的正确答案。

例如,要求解256位椭圆曲线离散对数,将需要几千个量子比特和大约1000 亿个门操作(即前面提到的对量子比特的限制)。为数千亿次门操作保持数千个量子比特稳定是一项重大挑战,但如果可以的话,你可以在几分钟或几小时内将 secp256k1 公钥反转为其底层私钥。

散列函数的情况明显好一些。Grover 算法是寻找散列函数的原像或碰撞的最佳通用方法。它将查找SHA-256原像所需的操作数量减少到 ,将碰撞减少到 。用Anatoly Dyatlov不朽的话来说:“问题不大,也不可怕。” 将抗碰撞性安全性降低到 80 位只是对隔离见证之前的 P2SH 安全级别的回归,该级别在今天仍然被认为是安全的。

Kurt Pan 注:Anatoly Dyatlov是切尔诺贝利核电站的副总工程师,切尔诺贝利核事故的直接负责人。

好吧,但量子计算机不是“永远在未来”吗?

不。这确实是一个合理的默认直觉,因为量子计算机已经被讨论了几十年,但大部分时间都没有明显的进展。但是现在进步来得又快又猛,量子能力以超指数的速度增长。

  • 可以保持纠缠在一起的量子比特的数量一直在以指数速度增加,每一年半增加一倍左右。

  • 量子计算机的错误率也在以类似的速度下降,这意味着支持的门操作数量因此呈指数增长。

  • 在理论方面,应用于密码分析问题的量子计算机算法的效率不断提高。打破实际密码系统所需的资源需求的任何减少都会使实际可用的估计日期更近。

这些领域中的每一个能力都以指数速度增加,导致总体上以超指数进步。我们距离使用当前算法攻击 secp256k1 所需的规模只有大约六次翻倍的距离。在每次翻倍之间大约有 18 个月的时间,所以最快会在这个十年末到来。为了避免你说服自己我们正处于接受曲线的末端,请考虑以下这点:

2019 年和 2020 年,IBM 和谷歌都首次展示了所谓的量子霸权。他们使用量子计算机(大约 50 个量子比特)来计算经典方法无法解决的问题的解。解决的问题确实是玩具问题,但并非玩具大小的实例。量子计算机现在是解决现实世界问题的实用手段,这引发了对做出更好的量子计算机的军备竞赛的大规模投资,包括新进入该领域的参与者。资金和兴奋的水平前所未见,虽然这并没有改变基本挑战,但这确实意味着研究不再资源受限。“众人拾柴火焰高”。故在此谨慎地预期未来几年的进展会加速,而不是放缓。

这种情况与过去十年围绕人工智能和深度学习的增长非常相似。几乎就在十年前的2011年,谷歌斥资数百万美元训练计算机识别Youtube上的猫视频,从而推动了这一领域的发展。当我在2021年写这篇文章时,特斯拉正在向Beta测试用户推出全自动驾驶,“deep fakes“正在破坏我们对音频/视频证据的信任。不要低估一个成长型行业十年所能取得的成就。

与此同时,自隔离见证并入比特币核心以来已经过去了近5年,隔离见证的采用率仍然徘徊在 50% 左右。不要错误地高估新技术在我们行业中的部署和采用速度。我会回到这一点。

密码末日对比特币意味着什么?

高效的大规模量子计算机攻破了椭圆曲线离散对数。任何暴露的公钥都很容易受到攻击,可以在几分钟或几小时内得到其底层私钥。这些量子计算机只会削弱散列函数的有效性,这足以推动后量子密码学的有序采用,但不会达到可以立即窃取资金的程度。

正如脚注中提到的BIP-341所指出的,在2019 年有大约625万个比特币有已知公钥保护。因此,如果人们能够使用足够大的量子计算机来进行 secp256k1 离散对数运算,那么就有625万个比特币很容易立即被盗。这大约是目前存在的所有比特币的1/3。

那很糟。真的,真的很糟糕。最坏的情况是,如果所有的625万枚暴露的比特币突然被同时移动,这将是历史上最大的盗窃案,并彻底摧毁公众对比特币的信心。更有可能的是,随着时间的推移,这种情况会慢慢发生,从较老的身份不明的币开始,这些币的失窃不太可能被所有者注意到。尽管如此,最终还是有人会注意到,当消息传出时,市场就会恐慌。正如 Taproot 提案的开发者之一所说:

我相信这些数字可以证明“公钥哈希可以抵御量子计算机”的论点(目前)是虚假的。即使你自己的代币具有PKH结构的阻挡,如果 37% 的供给处于风险中,你也不能要求太多安全性。

  • Pieter Wuille(2019 年 3 月 19 日)

我对这条推文感到失望。首先,它将两个独立的问题混为一谈:从比特币的早期历史中恢复丢失或长期不用的币,以及从地址/公钥重用中窃取大量较新的比特币。通过区块链上公开的公钥,只有大约175万比特币易受攻击,其中大部分是早期独立开采的币或多密钥脚本,这些脚本早于 P2SH 的广泛采用。超过 400 万个易受攻击的币是由于重复使用的密钥或脚本实现的,这是最近的一种做法,也不幸的是某些托管服务的普遍做法。任何盗窃都是坏事,但如下两种盗窃之间存在实践上的区别:少数早期采用者的币被盗,他们已经十多年没有动币并且可能完全丢失了密钥 VS 对广泛使用的托管钱包或交易所的冷钱包的洗劫。前者令人遗憾但并非致命,后者将成为我们可能无法从中恢复的公众信任危机。幸运的是,当前流通的比特币的密钥和脚本重用正是我们可以解决的问题。

其次,它没有明确区分两种可能的解释:

  1. 比特币目前比你想象的更容易受到量子突破的影响。我们需要部署后量子密码学,并让人们在此类突破之前移动他们的币。

    或者:

  2. 我们无法修复这些量子漏洞,暴露程度是如此之高,一旦敌手能够破解 secp256k1,比特币就会死亡。当这最终发生时,让我们感谢我们曾有一次好的运行。谢谢大家参与,拜拜!

鉴于该通信平台的固有局限性,我不将恶意归咎于推文作者。此外,我与 Pieter 共事多年。我 99% 肯定他属于(1)。但我无法理解的是,任何相信 (1) 的人怎么会同时倡导一项技术,只是为了获得 Schnorr 签名的好处,该技术就迫使用户选择量子漏洞。

作为开发者,我们有责任尽我们所能防止、阻止或以其他方式减轻这种不可避免的代币盗窃的下游影响。这意味着为代币所有权创建或维护抗量子解决方案,并促进防止暴露量子漏洞的托管实践,例如在创建时而不是在支付时在输出中显示公钥。

是的,这确实意味着我们将为 Taproot 的每个输出提供额外的 32 个字节(如果我们想要主动地处理后量子哈希的输出宽度,则可能需要额外的 48 个字节)。这也意味着如果没有庞大的零知识哈希原像证明,我们将无法拥有非常紧凑的环签名。但这些是我们应该愿意为对抗量子敌手的安全性付出的代价。

但Taproot 却反其道而行之。在 Taproot 模型中,我们放弃了抗量子性,以换取这些小的效率增益和流行的加密特性。我相信,这类似于充分了解全球变暖带来的危险,却决定在 2021 年建造新的燃煤电厂。

我们可以,而且应该做得更好。

我们能做些什么来解决这个问题?

替换散列函数为量子安全变体很容易——只需增加宽度即可。从 SHA-256 切换到 SHA-512 就足够了。虽然替换 P2WPKHP2WSH 输出中使用的哈希函数会相对简单,但这样并不能完全达成目标,因为链最终要依赖于使用SHA-256的Merkle哈希树。为整个链迁移到 SHA-512 将需要使用诸如Forward Blocks(http://freico.in/forward-blocks-scalingbitcoin-paper.pdf)之类的东西,但它还没有完全准备好。不过,需求并不那么紧迫:在可预见的未来,80 位的安全性仍然足够。

替换椭圆曲线数字签名要重要得多,但不幸的是,目前可用的选项较少。有一些成熟的后量子数字签名方案,例如基于散列的Lamport签名方案,但它们很大并且没有附加的零知识证明系统。在 NIST 后量子密码 (PQC) 标准化项目中,有大量后量子数字签名方案正在开发中并相互竞争。其中一些具有比特币开发人员正在寻找替代 Schnorr 签名的那些属性,例如紧凑的密钥和/或签名大小、构建多密钥签名方案的能力以及附加的零知识证明系统。但这仍然是一个快速发展的具有诸多可能性的领域,目前没有明确的赢家。由于共识层数字签名方案并不容易更新,明智的选择是等待并观察PQC 标准化决赛入围者的表现。

所以目前真的没有一个技术解决方案可以被立即部署。我们需要赞助用量子安全替代方案(例如PQC竞赛数字签名决赛候选之一以及基于SHA-512 的Forward Block区块链替换哈希树)替换 secp256k1 和 SHA-256 的工作。但与此同时,我们需要与现有的服务运营商合作,改革或删除导致公钥暴露的现有协议,并转移易受攻击的旧比特币。我们需要开展一项公共服务活动,以提高对该漏洞的认识,并帮助人们确保自己的代币不受量子攻击者的侵害。

但最重要的是,我们需要停止让情况变得更糟。当你发现自己落在一个坑里时的首要原则是,停止继续挖坑。如上所述,我们不应该部署Taproot,或者任何其他需要在链上使用裸公钥的技术。

去向何方

比特币存在严重的量子漏洞,Taproot 扩展提案只会让情况变得更糟。我们不应该允许 Taproot 在比特币上激活,或者如果它激活了,那么我们应该阻止它的使用。

我们应该投入时间和资源开发可替代椭圆曲线数字签名的后量子紧凑数字签名和零知识证明系统。我们应该继续研究迁移方法,以摆脱基于 SHA-256 的 Merkle 树和承诺结构。

于此同时,我们应该将普遍更好的 Schnorr 签名引入比特币,但我们需要在不会使比特币生态系统更易受量子敌手攻击的的背景下这样做。


参考资料

[1]

1: 然而新的签名验证操作码CHECKSIGADD是通过Schnorr签名的属性实现的

[2]

2: 冲突解决机制的存在至关重要,否则就会出现特有的问题。但是如果特定合约的冲突解决机制存在并且固定,那么任何一方都不会从避免合作关闭中获得任何好处,因为合作关闭通常涉及较小的交易,因此对所有各方的评估费用较少。

[3]

Merkleized Alternative Script Trees: Tradecraft/Freicoin的Segwit实现允许输出的创建者承诺任意数量的可能花费路径,每个路径都有不同的脚本,但只需要在花费时显示一个。

[4]

4: 读作大O,意思是个整数必须至少需要个单独的比较和交换操作才能完成。因此,当时,必须至少需要次比较和交换操作才能对包含个随机整数的列表进行排序。

[5]

5: 这是个谎言,其实我们并不知道。例如没有人能够证明将整数分解为素数因子实际上很难。很可能有一种简单的方法可以做到这一点。但是经过半个世纪的努力后,在任何找到解决方案的人可以名利双收的情况下,依然没有人找到。所以我们假设在经典计算机上分解大合数是一个难题,然后围绕它构建系统。

[6]

6: 某种程度上可以这么说,散列函数也是如此。质因数分解和椭圆曲线离散对数都具有比蛮力更快的解法。但解决这些问题的难度确实与实际使用的搜索空间的大小有关。例如,Pollard的rho算法对离散对数的搜索空间提供平方缩减,但自1975年发布以来,我们还没有找到更快的通用算法。因此,我们认为256位曲线上的ECDL需要在经典计算机上进行2^(256/2)=2^128次操作。