概述
隔离见证软分叉 (SegWit) 包含广泛的功能,其中许多功能都非常技术性。此页面总结了这些功能的一些优势。
可塑性修复
比特币交易由一个 64 位十六进制哈希标识,称为交易标识符 (txid),它基于所花费的币以及谁能够花费交易结果。
不幸的是,txid 的计算方式允许任何人对交易进行小的修改,这些修改不会改变其含义,但会改变 txid。这称为第三方可塑性。BIP 62(“处理可塑性”)试图以零散的方式解决这些问题,但作为共识检查来说过于复杂,已被撤回。
例如,您可以向网络提交 txid 为 ef74…c309 的交易,但发现第三方(例如网络上中继您的交易的节点或将您的交易包含在区块中的矿工)稍微修改了交易,导致您的交易仍然花费相同的币并支付相同的地址,但已在完全不同的 txid 683f…8bfa 下确认。
更一般地说,如果交易的一位或多位签名者修改了他们的签名,则交易仍然有效并向相同的地址支付相同的金额,但 txid 会完全更改,因为它包含了签名。签名数据(而非输出或输入选择)更改修改交易的一般情况称为 scriptSig 可塑性。
SegWit 通过允许比特币用户将交易中可塑的部分移动到交易见证中,并将该见证隔离,从而防止第三方和 scriptSig 可塑性,这样见证的更改不会影响 txid 的计算。
谁受益?
-
跟踪已花费比特币的钱包作者:通过简单地按 txid 查找它们,最容易监控您自己的外发交易的状态。但在存在第三方可塑性的系统中,钱包必须实现额外的代码才能处理更改的 txid。
-
任何花费未确认交易的人:如果 Alice 在交易 1 中支付 Bob,Bob 使用该付款在交易 2 中支付 Charlie,然后 Alice 的付款被篡改并以不同的 txid 确认,则交易 2 现在无效,Charlie 没有收到付款。如果 Bob 可信赖,他将重新向 Charlie 发出付款;但如果不是,他可以简单地将这些比特币据为己有。
-
闪电网络:修复了第三方和 scriptSig 可塑性后,闪电网络的实现变得不那么复杂,并且在区块链上的空间使用方面也更加高效。随着 scriptSig 可塑性的消除,还可以运行轻量级闪电客户端,这些客户端将区块链监控外包,而不是每个闪电客户端都需要成为一个完整的比特币节点。
-
任何使用区块链的人:如今的智能合约(例如微支付通道)以及预期的新的智能合约,在设计、理解和监控方面变得不那么复杂。
注意:只有当 segwit 交易的所有输入都是 segwit 支出(直接或通过向后兼容的 segwit P2SH 地址)时,它们才能避免可塑性。
更多信息
- 比特币维基关于可塑性的页面
- Coin Telegraph 关于 2015 年可塑性攻击的文章
- Bitcoin Magazine 关于 2015 年可塑性攻击的文章
- “闪电网络所需 BIP 概述”的记录
- BIP 62
- BIP 140 – 可塑性修复的替代方法
- 关于 683f…8bfa 交易的 Stack Exchange 答案
签名哈希操作的线性扩展
简单增加比特币区块大小的方法的一个主要问题是,对于某些交易,签名哈希的扩展速度是二次的而不是线性的。
本质上,交易大小加倍可以使签名操作的数量加倍,并且每个签名需要哈希的数据量也加倍。这在现实中已经出现过,其中单个区块需要 25 秒才能验证,而恶意设计的交易可能需要超过 3 分钟。
SegWit 通过更改签名的交易哈希计算来解决此问题,以便交易的每个字节最多只需要哈希两次。这以更有效的方式提供了相同的功能,因此即使恶意生成大型交易或支持更大的区块(因此交易更大)也不会遇到签名哈希问题。
谁受益?
消除签名验证的哈希数据的二次扩展使增加区块大小变得更安全。在不限制交易大小的情况下执行此操作允许比特币继续支持来自或支付给大型群体的付款,例如支付挖矿奖励或众筹服务。
修改后的哈希仅适用于从见证数据发起的签名操作,因此来自基本区块的签名操作将继续需要较低的限制。
更多信息
- BIP 143
- Rusty Russell 关于 25 秒交易的博文
- 比特币维基上的 CVE 2013-2292
- 建议将交易限制为 100kB
- Bitcoin Classic 在 0.11.2 分支上的提交,在 sighash 字节上添加了额外的共识限制
通过支付到脚本哈希 (P2SH) 提高多重签名安全性
多重签名支付目前使用 P2SH,P2SH 由 160 位 HASH160 算法(SHA256 的 RIPEMD)保护。但是,如果其中一位签名者希望窃取所有资金,他们可以在多重签名脚本的一部分的有效地址和一个仅向他们支付所有资金的脚本之间找到冲突,这只需 80 位 (280) 的工作量,这对于资源极其丰富的攻击者来说已经成为可能。(作为比较,以每秒 1 艾哈希的持续速度,比特币挖矿网络每两周完成 80 位的工作量)
SegWit 通过仅对直接支付到单个公钥的支付使用 HASH160(在这种攻击中这种攻击毫无用处)来解决此问题,同时对支付到脚本哈希的支付使用 256 位 SHA256 哈希。
谁受益?
通过 segwit 支付给多重签名或智能合约的每个人都受益于为脚本提供的额外安全性。
更多信息
- Gavin Andresen 询问是否值得担心 80 位攻击
- Ethan Heilman 描述了一种循环查找算法
- Rusty Russell 计算执行攻击的成本
- Anthony Towns 将循环查找算法应用于利用交易
- Gavin Andresen 总结了该主题
脚本版本控制
对比特币脚本的更改既可以提高安全性,也可以提高功能性。但是,脚本的设计仅允许通过用十个额外的 OP_NOP 操作码之一替换一个新的操作码来实现向后兼容(软分叉)更改,该操作码可以有条件地使脚本失败,但在其他情况下则不执行任何操作。这对于许多更改来说已经足够了——例如引入新的签名方法或像 OP_CLTV 这样的功能,但它既有点笨拙(例如,OP_CLTV 通常必须伴随着 OP_DROP)并且不能用于启用像连接两个字符串这样简单的功能。
SegWit 通过为脚本包含版本号来解决此问题,以便原本需要硬分叉才能在非 segwit 交易中使用的其他操作码可以通过简单地增加脚本版本来支持。
谁受益?
更容易更改脚本操作码将使比特币中的高级脚本编写更容易。这包括诸如引入 Schnorr 签名、使用密钥恢复来缩小签名大小、支持侧链或通过使用 Merkle 化抽象语法树 (MAST) 和其他研究级思想来创建更智能的合约等更改。
减少 UTXO 增长
未花费交易输出 (UTXO) 数据库由每个验证比特币节点维护,以确定新交易是有效的还是欺诈性的。为了网络的有效运行,此数据库需要非常快速地查询和修改,并且理想情况下应该能够放入主内存 (RAM) 中,因此尽可能减小数据库的大小(以字节为单位)非常有价值。
随着比特币的增长,这变得更加困难,因为每个新用户必须至少拥有一个自己的 UTXO 条目,并且更喜欢拥有多个条目来帮助提高其隐私和灵活性,或作为支付通道或其他智能合约的支撑。
SegWit 在这里改进了这种情况,因为它使不影响 UTXO 集大小的签名数据比确实影响 UTXO 集大小的数据便宜 75%。预计这将鼓励用户倾向于使用最大程度减少对 UTXO 集影响的交易以最大程度减少费用,并鼓励开发人员以最大程度减少对 UTXO 集影响的方式设计智能合约和新功能。
由于 segwit 是软分叉更改并且不会增加基本区块大小,因此 UTXO 集的最坏情况增长率保持不变。
谁受益?
减少 UTXO 增长将使矿工、企业和运行完整节点的用户受益,这反过来有助于维护比特币网络的当前安全性,因为越来越多的用户加入系统。帮助最大程度减少 UTXO 集增长率的用户和开发人员将比那些忽略其交易对 UTXO 集增长影响的用户和开发人员获得更低的费用。
更多信息
在不验证签名的情况下提高效率
历史交易的签名可能不如未来交易的签名那么有趣——例如,默认情况下,比特币核心不会检查先前检查点交易的签名,并且某些 SPV 客户端根本不检查签名,而是相信矿工或其他节点已经完成了检查。但是,目前,签名数据是交易的组成部分,必须存在才能计算交易哈希。
隔离签名数据允许对签名数据不感兴趣的节点将其从磁盘中修剪,或避免首先下载它,从而节省资源。
谁受益?
随着越来越多的交易使用 segwit 地址,运行修剪或 SPV 节点的人将能够使用更少的带宽和磁盘空间。
区块容量/大小增加
由于旧节点只会下载去见证的区块,因此它们仅对该数据执行 1 MB 区块大小限制规则。因此,理解包含见证数据的完整区块的新节点可以自由地用新的限制替换此限制,从而允许更大的区块大小。因此,隔离见证利用了这个机会将区块大小限制提高到近 4 MB,并添加了一个新的成本限制以确保区块在资源使用方面保持平衡(这实际上导致有效限制更接近 1.6 到 2 MB)。
谁受益?
使用升级版钱包的用户将能够利用更大的区块大小,方法是将签名移动到交易的见证数据部分。
走向单一组合区块限制
目前,区块大小有两个共识强制限制:区块不能大于 1MB,并且独立地,整个区块中的交易最多只能执行 20,000 次签名检查。
在给定单个限制的情况下,找到包含在区块中最有利可图的一组交易是背包问题的实例,可以使用简单的贪婪算法轻松地将其完美解决。但是,添加第二个约束会在某些情况下使找到好的解决方案变得非常困难,并且此理论问题已在实践中被利用,迫使区块以远低于容量的大小进行挖掘。
如果不进行硬分叉或大幅减小区块大小,则无法解决此问题。由于隔离见证无法解决此问题,因此它决定不使其变得更糟:特别是,与其为隔离见证数据引入独立的限制,不如对 UTXO 数据和见证数据的加权和应用单个限制,允许两者同时作为组合实体受到限制。
谁受益?
最终,如果未来的硬分叉将区块容量限制更改为参数的单个加权和,矿工将从中受益。例如
50*sigops + 4*basedata + 1*witnessdata < 10M
这使矿工能够轻松准确地填充区块,同时最大化费用收入,并且这将使用户能够更可靠地计算其交易所需支付的适当费用以进行挖矿。
更多信息
更新 2016-10-19
此页面较早的版本将“紧凑欺诈证明”列为隔离见证的好处。但是,根据实施情况,隔离见证并没有使这变得更容易:无论是否使用隔离见证,未来启用紧凑欺诈证明及其带来的好处的软分叉都需要包含其自己的承诺(例如,在 coinbase 交易中),而不是能够扩展隔离见证使用的承诺数据。
之前的文字是
紧凑欺诈证明
随着比特币用户群的扩大,验证整个区块链自然会变得更加昂贵。为了保持比特币去中心化、无需信任的特性,重要的是要允许那些无力验证整个区块链的人至少能够廉价地验证他们负担得起的尽可能多的区块链。
隔离见证通过允许未来的软分叉扩展见证结构以包含承诺数据来改善这种情况,这将允许轻量级 (SPV) 客户端执行共识规则,例如区块中引入的比特币数量、区块的大小以及区块中使用的 sigop 数量。
谁受益?
欺诈证明允许 SPV 用户帮助执行比特币的共识规则,这可能会极大地提高整个比特币网络的安全性,并减少攻击单个用户的途径。
这些欺诈证明可以作为未来软分叉的一部分添加到见证数据结构中,并且它们将帮助 SPV 客户端即使在不使用隔离见证功能的交易上执行规则。
更新 2020-06-23
此页面较早的版本将“输入值的签名”列为隔离见证的好处。但是,根据实施情况,隔离见证并不能使其安全:无论是否使用隔离见证,都需要进行未来的软分叉才能依赖已签名的输入值。
由于每个输入的值都是单独签名的,因此明显的费用可以用欺骗性的方式进行操纵。(CVE-2020-14199)
之前的文字是
输入值的签名
当硬件钱包签署交易时,它可以轻松验证正在花费的总金额,但只能通过拥有所有正在花费的输入交易的完整副本来安全地确定费用,并且必须对每个交易进行哈希运算以确保它没有被提供虚假数据。由于单个交易的大小可以高达 1MB,因此即使正在签名的交易本身很小,这也不一定是廉价的操作。
隔离见证通过显式哈希输入值来解决此问题。这意味着可以简单地向硬件钱包提供交易哈希、索引和值(并告知使用了哪个公钥),并且可以安全地签署支出交易,无论正在花费的交易有多大或多复杂。
谁受益?
硬件钱包的制造商和用户是显而易见受益者;但是,这可能也使得在小型嵌入式设备中安全地使用比特币用于“物联网”应用程序变得容易得多。
此好处仅在花费发送到启用隔离见证的地址(或通过 P2SH 的隔离见证地址)的交易时可用。
更多信息