本文由 Bitcoin Core 团队撰写,详细分析了隔离见证(SegWit)的技术代价和风险。文章从序列化代价、区块验证开销、引入 Bug 的风险、复杂性及技术债、软分叉相关风险、以及与更大区块和低手续费相关的风险等方面,全面评估了 Segwit 实施可能带来的负面影响,并探讨了规避和缓解这些风险的措施。文章旨在为相关利益方提供充分的背景知识,以便做出明智的决策。
作者:Bitcoin Core
原文出版于 2016 年 10 月 28 日。
本文是早些时候的博文《隔离见证的好处》的补充,为通过 BIP141 激活的隔离见证(segregated witness)方案可能带来的技术代价和风险给出了概要的说明。
出于本文的目的,我们使用 “ 代价” 一词来表示假如隔离见证部署和激活就一定会发生的负面结果,而 “ 风险” 则表示可能会发生的负面影响,以及一些并不是所有人都公认为负面的变化。
在分析风险时,我们也考虑可以 规避 风险的措施(也就是尽可能降低风险发生的概率),以及可以 缓解 风险的措施(在风险确实发生时,可以降低其影响)。
本文无意定论隔离见证的好处是否大于其风险、隔离见证是否应该激活;不如说,本文是为了提供背景知识,帮助利益相关方做出充分知情的决定。
交易和区块的信息主要出于下面三个理由而需要序列化:
隔离见证会影响两个方面的序列化:
在序列化之后,隔离见证数据格式(见 BIP 141 - witness 程序)有下列效果:
上述的比例都基于 180 字节的交易(一个输入和一个输出)计算出来。如果 输入/输出 的数量同比例增加,上述的比例将大体准确;但如果使用了更加复杂的交易脚本(例如多签名),则会下降。
交易体积的开销变化源于两个因素:
要是没有这两个因素,开销就可以忽略不计了:P2WPKH 将少用 3 个字节;P2WSH 将多用 1 个字节。
第一个因素背后的动机在《 通过 P2SH 提高多签名的安全性》一文中有讨论。
第二个因素是个人用户在公开收款地址时可以权衡的选择。选择 P2WPKH/P2SH 或者 P2WSH/P2SH 将因为开销的上升等比例支付更高的手续费。从长期来看,这会自然限制这种开销的上升会造成的影响。
可以通过对网络和存储的序列化格式的变更,让大部分的开销消失:完全的序列化格式可以通过使用一个简单的标签(指明用到了什么格式,P2PKH、P2WPKH、P2WPKH/P2SH,等等)以及实际的数据(公钥和签名)来覆盖(举个例子, compacted_txn.txt)。
隔离见证在验证区块时引入了额外的开销,这既是为了检查 witness 默克尔树,也是为了处理 P2SH 编码的隔离见证交易。每一笔交易需要多用 5 次 SHA256 运算,每个 P2SH 编码的 P2WSH 输入需要多用 1 次 SHA256 运算,每个 P2SH 编码的 P2WPKH 输出需要多用一次 HASH160 操作。不过,这就相当于在最多 4 MB 的数据运行 6 次 SHA256 运算,或者约等于总计 24MB 的 SHA256 哈希值;再换算过来,就是在树莓派 v1 小型电脑上需要为每个区块多付出 15 秒的处理时间,而在功能更强的硬件上,只需不到 1/10 秒。
隔离见证的补丁包是对比特币的一次重大变更,而且已经在 Bitcoin Core 0.13.0 发布了,只不过还未在比特币主网络上激活。任何这样的重大变更都有多种多样的风险,包括:
为了降低隔离见证激活时发生这些风险的概率,我们已经采取了下列步骤:
公开的报告包括:
技术评审报告有:
测试网络:在开发期间,隔离见证曾被部署到多个测试网络上,让代码可以被诊断、让来自广大生态系统(例如区块浏览器和钱包)的开发者可以保证他们的软件可以跟隔离见证技术正确交互。这些测试网络包括:
减轻所有 bug 的影响的一种重要方法就是将隔离见证实现为一种软分叉。这就意味着:
除此之外,为 “脚本” 语言设置版本控制的能力,带来了为比特币脚本语言修复 bug 的可能性,既包括对先前存在的 bug,也包括任何潜在的、可能由隔离见证引入的新 bug。
“ 技术债” 的意思是,现在使用的权宜之计,可能会在未来导致更多的困难和问题;所以现在多花点时间和力气将被证明反而是更加经济的。
在比特币的语境下,技术债有两种类型:
如上所述,隔离见证的代码已经得到充分的评议,这可以帮助在代码和设计两方面抑制产生技术债。
也如上所述,隔离见证有多个独立的重新实现,这可以帮助在还有回头路的时候发现任何不必要的复杂性和技术债。
为了支持现有的、通过重构和升级比特币代码库来偿还技术债的努力,隔离见证作为一种仅包含代码的升级(code-only update),合并到了 为发布 0.13.0 而积累的工作 中。
比特币已经饱受许多重大设计债的痛苦,隔离见证是专门设计来减少某些债务的 —— 尤其是交易熔融性(transaction malleability,指交易的 ID 可以不因交易内容的变化而变化,译者注)、签名哈希操作的二次方膨胀问题(quadratic scaling of signature hashing,指交易输入数量的增长会导致签名验证时的哈希运算次数呈平方级增长,译者注),以及签名不覆盖输入值的问题(non-signing of input values)。
隔离见证所提供的脚本版本控制方法提供了一种优雅的方式,让未来的软分叉升级可以进一步减少设计债,包括修复现有操作码(比如 CHECKMULTISIG)中的 bug、重新启用先前被禁用的操作码(例如 CAT),以及切换到更好的验证方法(例如 Schnorr 签名,或者聚合签名)。
一般来说,比特币脚本中的设计债是无法完全偿清的,因为永远不能排除有些未花费的交易支付给了使用 “丑陋” 功能的 P2SH 地址。禁用这些特性将让这些交易变成不可花费的,等同于盗窃用户的财产。脚本的版本控制让这些设计债的 “代价” 可以降低,因为这些 “丑陋” 的功能将只对 “旧版本” 脚本可用,新的开发工作也可以在很大程度上忽略这些旧代码。
软分叉指的是会使一些以前有效的交易变得无效的共识规则变更。处理不当的软分叉可能在比特币生态系统中产生许多问题,而且,因为隔离见证让额外的见证数据成了建立比特币的分布式共识的关键数据,处理不当的升级可能增加系统出错的方式。主要的故障模式包括:
许多软分叉都已经在比特币上激活(包括 BIP 16、 34、 65、 66、 68、 112 和 113),而且这种经验已经在为激活软分叉而编写的 BIP9 中得到了明文表述。BIP9 所述的流程曾用于部署 CSV 软分叉(BIP 68、112、113),结果是共识规则的快速升级,没有出现故障。
隔离见证的设计和 BIP9 部署流程以下列特性避免了上面提到的问题:
隔离见证所施加的新限制仅影响当前无人使用的交易,因为:
所以,你无法通过向旧节点转发一笔交易、同时向新节点转发另一笔交易来重复花费同一个隔离见证输出。
但是,这种差异依然会被用在重复花费的策划中,例如,在一笔交易中放置一个非隔离见证的输出和一个隔离见证的输出(那么这笔交易就只会被升级后的交易转发),然后尝试发起手续费更高的重复花费交易并只使用非隔离见证的输出,后一笔交易有可能可以通过旧节点成功转发。
这些担忧只影响交易池中的未确认交易;一旦交易被某个区块确认,重复花费就是不可能的了。只要检测工具可以跟踪隔离见证的花费行为,现有的检测重复花费的方法就依然是有效的。
保证矿工只挖掘有效区块显然是每一个参与者的最高优先级,而在隔离见证上人么也投入了大量的工作来保证这一点。这里面既有直接的工作,例如 BIP145;也有间接的工作,例如 “致密区块( BIP152)”。
如果隔离见证软分叉在激活之后又回滚,发起过隔离见证交易的人就有可能丢钱 —— 举个例子,一个恶意的矿工可以在没有启用隔离见证的链上重播(replay)这笔交易,而在这时候,这笔交易是任何人都可以花费的,然后矿工就可以自己花掉它(偷走它)。有两种可能,隔离见证会在软分叉激活后又回滚、启用了隔离见证的交易会被偷盗:
因此,无论哪一种可能,都不太可能。
隔离见证将 1MB 的区块体积限制变成了 400 万单位的 “重量(weight)” 限制;在统计重量时,序列化的 witness 数据(的 1 字节)会被统计为一个单位,而核心的区块数据(的 1 字节)会被统计为 4 个单位。随着使用隔离见证交易数量的增加,这一变更将允许单个区块包含更多的数据(如果区块内所有的交易都使用隔离见证特性,则预计每个区块会是 2MB 大小,但是,在最恶劣的情况下,单区块可能达到 4MB)。只要允许单区块放入更多的交易,可以预期 UTXO 数据库的增长速度也会变得更快(假设所有的交易都使用隔离见证特性,则增长率会变为大约两倍;但是,因为隔离见证是一种软分叉,在最恶劣的情形下,UTXO 集的增长率不会改变)(译者注:这里的意思可能是,如果无人采用隔离见证,UTXO 集的增长率就不会改变)。
这些结果可能具有积极意义(例如,更多的交易量,意味着可以容纳更多用户),但同样可能有重大的负面效果:
更大区块的负面影响因此下列因素而得到了限制:
UTXO 集膨胀速度的恶化由下列因素得到限制:
比特币区块链的安全性是由哈希算力(hashpower)来提供的,而哈希算力又是奔着固定的区块奖励和浮动的交易手续费而来的。因此,手续费收入的下降有可能使挖掘比特币区块链的算力减少,从而降低比特币区块链的安全性。
因为单体笔交易的手续费是由市场压力(供给和需求)决定的,隔离见证引入的变化可能会提高供给量从而降低价格(假设需求不变,要么因为隔离见证的部署而发生,要么至少会跟隔离见证的部署同步发生),而降低单体交易的价格(手续费水平)又有可能导致整体挖矿收益下降(如果这时候的需求价格弹性恰好处在没有弹性的阶段的话)。
此外,隔离见证带来的变更,可能会让 “layer 2” 解决方案(比如闪电网络)变得更加吸引人。如果这导致用户将 layer 2 解决方案视作链上交易的替代品,那会显著降低对链上交易的需求、对交易的手续费水平产生额外的下行压力。
当前的手续费水平大致是每个区块 0.5 BTC,同时固定的区块收入是 12.5 BTC,大约占矿工收入的 4%,所以对矿工收入(和网络安全性)的潜在影响从短期来看是不大的。
此外,在过去 12 个月里,以 BTC 计量的手续费一直在上涨(从每个区块 0.2 BTC 涨到现在的水平),而且按实际价值计也是如此(一年前 1 BTC 的价格是 300 美元,现在是 600 美元),所以,手续费水平的下降可能只是等同于回到了 12 个月以前的手续费水平,这应该不会产生很大的影响。
矿工可以单方面或者集体限制供给量,既可以单方面为自己挖掘的区块设置最大重量的软限制(就是 “blockmaxweight” 参数,默认是 300 万),也可以集体使用一个软分叉、通过孤立超出特定重量的区块而在事实上降低限制。这种方法也许可以防止任何因为供给量增加而产生的价格下降(实质上,就是通过减少供给量来提高单体交易的手续费,只不过总收益未必会提高),但无法防止因为替代效应(例如采用 layer 2 网络)而导致的手续费收入下降。
虽然 layer 2 网络可能是链上交易的一种替代,但它们无法完全不使用链上交易。而且,启用隔离见证之后,在某些场景下,即使是相对更少的链上交易,也很容易占满链上的吞吐量。即使这些网络的价值只有一小部分可以通过链上交易的手续费捕捉到,那也有可能大大超出当前的手续费价值。
如上所述,所有交易全部采用隔离见证特性,将使链上吞吐量翻倍。这给吞吐量带来了显著的一次性提高,无论从短期还是从中期来看都是如此,只不过取决于采用速度而已。此外,通过加入一些特性来支持 layer 2 网络,中期和长期的额外扩容效果也可部分实现。因为修复了 sighash 的平方级膨胀 bug,隔离见证也降低了进一步提高吞吐量的负面影响。
但是,除了一次性的翻倍效果之外,隔离见证并没有提供任何直接的机制来进一步扩大链上交易吞吐量。
这就带来了长期扩容可能被阻止或者推迟的风险:利益相关者可能认为隔离见证已经 “够了”,并且拒绝开发和支持进一步的扩容努力。
目前,避免这种风险的工作有:
此外,让隔离见证可以实现吞吐量提升的工作(例如 libsecp256k1 和致密区块)显然也会让进一步的扩容更容易实现。
无论在哪个技术层面上,隔离见证都不会让进一步的扩容变得更加困难 —— 这里的风险完全是社会层面的。因此,最有效的缓解措施可能自然也是社会层面的:例如让支持长期扩容的公司提供开发资源、助力其实现。
隔离见证让交易的吞吐量可以提高到当前的两倍,也为扩容的实际影响 —— 例如节点的性能、去中心化、交易需求,以及生态系统升级的速度 —— 提供了验证的机会。这些数据可以合理地收集并用于支持未来的扩容措施,不论是证明某些令人担心的结果比预想的可能性要低,还是证实了某些担心是有效的,未来的工作都可以更加有的放矢。
这一部分为能够部分或者全部实现隔离见证的好处的其它方法提供了简要的比较,并说明了何以这些方法可能会改变相关的代价和风险。
隔离见证的任何硬分叉实现都会增加巨大的代价和风险,因为所有节点都必须在激活之前升级到理解新的规则,这就增加了导致链分裂成 “旧比特币” 和 “新比特币” 的风险,并导致困惑和价值损失。也因为比特币社区缺乏硬分叉的经验,意外的风险和代价也有可能发生,只不过它们在本性上就难以分析。
硬分叉的隔离见证可以通过两种方法来实现:
无论哪一种方法,硬分叉都可以同时大幅改变共识对区块体积的限制。
从逻辑上来说,隔离见证的大部分好处都可以分离为相互独立的变更,并分别评估和部署。但是,许多特性的实现要求是紧密相关的:
逐项修复这些问题会提高比特币代码库的复杂性,因为需要处理在不同时间激活的不同特性;而同时部署它们则可以消除这种复杂性。
因为当前的 CHEKCSIG 和 CHECKMULTISIG 操作码存在 sighash 操作的平方级增长问题,所以提高吞吐量是危险的,而且必须有针对这些操作的限制。因为隔离见证只允许通过升级后的操作码使用优化后的签名操作,旧的操作码将保持天然的限制。所以,如果吞吐量增加是专门部署的,那就需要实现额外的限制来保证这种增加是安全地,可能也会给挖矿和手续费估计增加复杂性。
(完)
- 本文转载自: btcstudy.org/2022/10/04/... , 如有侵权请联系管理员删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!