跳转到正文
buybitcoinsmart

术语表 /协议与升级

SegWit

又称隔离见证、Segregated Witness、BIP141。

SegWit 是什么?
SegWit 将签名数据移出了交易中由 txid 所承诺的部分,从而修复了交易延展性问题,并在不改变1 MB 基础限制的情况下提高了区块容量。

规定于 BIP-141。

这一改动是结构性的,而非表面上的。签名被移入旧节点从不下载的见证部分,使得容量提升可以作为软分叉发布,而且每个见证字节只占1个权重单位,而不是4个。因此,从 bc1q 地址花费的成本约为传统输入的一半。

运作方式

隔离见证(Segregated Witness)把一笔交易拆分为两部分,并分别计算哈希。

基础部分包含版本、输入、输出和锁定时间。见证部分为每个输入包含授权该输入的一组数据项,通常是一个签名和一个公钥。交易标识符仅根据基础部分计算,因此见证中的任何内容都无法改变它。第二个标识符 wtxid 同时涵盖两部分,区块中所有 wtxid 的默克尔根被写入 coinbase 交易,因此见证数据同样无法被篡改。

容量的提升源于计量方式的改变,而不是上限的改变。见证之外的每个字节占4个权重单位,见证之内的每个字节占1个,一个区块最多可容纳4,000,000个权重单位。因此,非见证数据仍然不能超过1,000,000字节,与以前完全一样,而签名则利用剩余的额度一并传输。2017年之前的节点按旧方式计量,看到的是一个合法的区块,不会提出异议,这正是此次升级无需硬分叉的原因。

BIP-143重新定义了见证输入的签名方式,其实际收益比听起来更大。旧的签名哈希算法对每个输入都要重新哈希交易的一部分,因此为输入很多的交易签名,耗时会呈二次方增长。新算法复用预先计算好的哈希,并且关键在于,它会承诺所花费的金额。在此之前,硬件钱包可能被欺骗,对某个输入的价值作出错误判断,从而被诱导授权一笔巨额手续费。

隔离见证还为输出类型编了版本号。见证版本0涵盖 P2WPKH 和 P2WSH;见证版本1当时空置,后来由 Taproot 使用。现在可以添加新的输出类型,而不必每次都为新的地址格式争论一番。

购买比特币时为何重要

您自己使用比特币时,有三件事可以直接追溯到这次升级。

第一是转移比特币所需支付的费用。原生隔离见证输入约为68虚拟字节,而传统输入约为148虚拟字节,因此钱包在手续费率为20 sat/vB 时花费三个输入,单笔交易就能节省几千聪。这笔节省发生在您花费时,而不是收款时,所以起作用的是您自己钱包使用的地址类型,而不是交易所提币所用的地址类型。

第二是硬件钱包能够可靠地向您显示什么。由于 BIP-143承诺了输入金额,Trezor 或 Ledger 屏幕上显示的手续费,来自设备可以自行验证的数据,而不是所连接计算机声称的数据。这堵住了一个真实存在的攻击漏洞,也是为什么对传统输入签名时,仍需向设备提供完整的前一笔交易,以便设备自行核对金额。

第三是闪电网络,以及所有建立在其上的交易所。Strike 默认通过闪电网络转移价值,而闪电网络通道是向隔离见证输出注资的,因为没有稳定的 txid,该协议就无法运行。没有隔离见证,就没有通道,也就没有建立在通道之上的即时结算产品。

必须先根除的延展性漏洞

交易延展性听起来像个边缘问题,却是在比特币之上构建任何应用的最大单一障碍。

ECDSA 签名有不止一种有效的编码方式。在隔离见证之前,监视内存池的第三方可以拿到一笔未确认的交易,在不使签名失效的情况下重新编码签名,再重新广播。比特币仍然按相同的金额转到同一个地方,只有交易标识符改变了,而任何记录了原标识符的软件,此时会认为这笔付款已经消失。Mt. Gox 曾公开将暂停提币归咎于延展性,时间是2014年2月,其他开发者当时对这一说法提出异议,但这一底层缺陷确实存在。

支付通道使延展性从令人恼火变成了致命问题。通道的运作方式是持有一笔已签名的退款交易,该交易花费一个以 txid 标识的注资输出,而此时注资交易甚至还没有广播。txid 一旦改变,退款就无法花费,一方便可能扣押另一方的资金作为人质。Joseph Poon 和 Thaddeus Dryja 于2015年发表的闪电网络论文,在其正文中就把延展性的修复列为先决条件。

隔离见证从根源上消除了这一问题,办法是把签名移出标识符的原像。任何花费见证输出的输入,其 txid 都不能被第三方改动,通道协议这才得以按设计构建。

SegWit vs 见证数据

隔离见证是升级,见证数据是它创建的结构。前者是一个有日期的事件,即2017年8月24日,并有一份规范,即 BIP-141。后者是当今网络中大多数交易都具备的一个字段,承载签名和脚本,有自己的序列化方式和自己的折扣权重。说一笔交易“使用了隔离见证”,是指它花费的输入,其授权信息位于该字段中。

SegWit vs Taproot

这是两次相隔四年的软分叉,都与见证有关。隔离见证创建了见证结构,并定义了版本0的输出类型,其地址以 bc1q 开头。Taproot 使用了版本1,加入了 Schnorr 签名,并改变了见证内部脚本的评估方式,产生以 bc1p 开头的地址。Taproot 之所以能以如此低的成本部署,是因为隔离见证已经建立了版本机制,所以这两者最好理解为分阶段实施的同一项设计。

请勿混淆

常见问题

我需要做些什么才能使用 SegWit?

只需选择正确的收款地址。目前大多数钱包默认使用以 bc1q 开头的地址,这是一种原生 SegWit 输出,手续费的节省出现在您日后从该地址花费时,而不是收款时。

SegWit 与 bech32 地址是同一回事吗?

不是。SegWit 是共识层面的变更;bech32 是与之同时设计的文本编码,用于它所创建的地址。嵌套 SegWit 地址以3开头,根本不是 bech32,但仍然花费见证输入。

SegWit 是否将区块大小提高到了4 MB?

并非该数字所暗示的那样。区块上限为4,000,000权重单位,只有几乎完全由见证数据填满的区块才会接近4 MB。普通支付流量产生的区块更接近1.5 MB。

接着阅读

相关术语

协议与升级中的更多术语

阅读本页英文版