作者:Brandon Black

来源:https://bitcoinmagazine.com/technical/the-witness-discount-why-some-bytes-are-cheaper-than-others

今年我们看到人们对比特币区块的有限空间的需求大大上升,这导致交易为了得到区块确认必须付出更高的手续费。大部分需求都来自于要用交易来揭晓 “铭文”。这些铭文的内容会作为比特币交易的 “witness(见证)” 字段 1 内的数据的一部分而得到公开。而见证字段内的数据 1 相比于交易其它字段的数据,会折扣成 25% 的体积。为什么要给这些铭文一个折扣呢?我们应该通过软分叉,将见证数据的折扣取消掉码?

为什么一些字节要比另一些字节更便宜?

一般来说,货币,尤其是比特币,是基于对人类的激励而运行的。比特币通过使用原生的比特币来给矿工支付将特定交易纳入他们所构造的区块内的费用,使得矿工和交易者的激励得以兼容。但并不因此就能让节点运营者的激励跟矿工和交易者的激励一致,也不能因此让交易的发送者和接收者的激励一致。

迄今为之,在比特币的激励兼容上,有过三种重大的优化措施:

  1. 限制区块的大小
  2. 将复杂脚本所带来的开销从交易发送者转移到接收者(也即脚本的实际使用人)(P2SH)
  3. 对齐节点运营者和交易者在数据上的开销(隔离见证)

限制区块大小

交易者希望确认大量的交易,矿工也希望收取大量的交易费;但节点运营者不得不转发、验证并存储所有的交易数据,而且他们并不能像矿工那样因此得到补偿。在比特币历史的早期,中本聪通过加入一个固定的区块大小限制(由节点强制执行)来解决这个问题。这个限制是,一个区块最多只能使用 1 百万字节,从而为节点在一定时间段内需要下载和验证的数据设置上限。那时候,中本聪写道:“我们可以在日后需要的时候逐步改变它”。但后来,在提到一个旨在提高这个限制的补丁时,他指出:“不要使用这个补丁,这会让你跟整个网络不兼容”,意思是提高区块大小限制是一种硬分叉变更,比起软分叉需要更多的协调工作。后来的日子里,比特币小心翼翼地避免采用这样不兼容的硬分叉变更,因此也意味着 1 百万字节的区块体积限制得到了保留。

将复杂脚本的代价从发送者转移给接收者

因为作为资金的比特币是靠锁定脚本来保护的,因此总是由可能采用更高级的脚本(比如多签名)来锁定资金。在最初的设计中,一笔比特币交易的发送者需要将接收者的完整锁定脚本放在交易中,并因此需要为在区块内包含这个锁定脚本而支付手续费。开发者们意识到,随着手续费率的提升,发送者可能会犹豫是否要给这种更大体积的锁定脚本的用户支付,因为手续费会更高。这些复杂的锁定脚本也给编码地址、通过低带宽的机制(例如 QR 码)来分享带来了挑战。

为解决这个问题,P2SH 作为一个软分叉,被加入比特币。在这个分叉的规则中,不再需要将接收者的完整锁定脚本放在交易的输出信息中,而只需要放入该脚本的哈希值。当接收者最终要花费这个输出时,他们自己会在花费交易中曝光完整的脚本;脚本的真实性由锁定资金的哈希值来验证。在这一变更之后,任意大小的 “赎回脚本” (即实际编码花费条件的完整脚本)都可以用一段固定长度的锁定脚本来代表,因此发送者也不再需要(也不再能够)根据花费条件的复杂性来区分接收者。

对齐节点运营者和交易者的数据开销

节点对比特币交易执行的最根本的验证是:这些交易尝试花费的比特币,是真实存在的。为此,每个节点都要保存一套包含了每一笔可花费的比特币(未花费的交易输出,UTXO)的索引。这个索引越大,运行一个节点、验证未来交易的开销 2 就越大。因此,提高这套索引的体积的交易(输出多于输入的交易)的长期代价,会比相同体积但减少了这套索引的体积的交易更大。

大部分比特币解锁脚本中的绝大部分都是密码学签名。这些签名的体积大概是对应公钥的两倍,这就意味着,解锁脚本的体积(即使没有 P2SH 也)会比锁定脚本更大。

花费 UTXO vs. 创建 UTXO 的显著更高的成本,在节点运营者和交易者之间产生了一种激励冲突。交易者被反激励花费自己的小额 UTXO(尤其在手续费率高企的时候),相反,花费更大的 UTXO 并创建更多小面额的找零 UTXO 对他们来说更便宜。与此同时,节点运营者要为这些数量日渐积累的小额 UTXO 支付代价:所有交易的验证成本会升高。

虽然乍看起来有点奇怪,但是,验证区块链历史上的每一笔交易所花费的每一个 UTXO 的锁定脚本都被解锁脚本满足了,是显然不那么根本的。因此,运行 Bitcoin Core 26.x 默认配置的节点将不再为区块高度 804000 (预计是 2023 年 8 月 19 日)以前的交易验证完整的锁定脚本执行。

(译者注:作者在此处值的可能是 “Assume Valid” 模式,这是一种用于初始化区块同步的模式,节点可以设置不验证一定区块高度以前的交易,从而加速同步。这是可以手动配置的。)

上述所有,意味着区块链的不同部分给比特币节点带来了不同的开销。用来确认每一笔交易的实质的数据必须得到每一个从创世区块 3 以来同步了所有数据的节点的验证,而长期来看,交易的输出会比交易的输入带来更大的开销(尤其在这些输出会长期存在的情况下),而且除了最近的交易,许多的见证数据甚至不会被检查。

隔离见证

隔离见证(SegWit)” 是比特币迄今为止最大胆的变更。这个变更的最大动机是解决比特币中长期存在 TXID 4 熔融性 5 问题。为了修复熔融性问题,解锁脚本会放在新设立的交易 “见证” 字段。通过不再让授权数据(通常可以被第三方改变而不影响交易的实质)参与 TXID 的计算,依赖于不可改变的 TXID 的协议(例如闪电通道)成为可能。

既然授权数据不再放置在原本的交易结构中,它也就不再参与区块大小的统计。因此,我们需要一种新的限制。那时候人们讨论过许多限制被隔离的见证数据的方法:单独限制见证数据的体积 6、小于 1 百万字节的整体限制 7,或是加权的综合限制。最终,人们选择了加权的综合限制,被隔离的见证数据字节的权重是 1 单位,而交易数据字节的权重是 4 单位,而整个区块的字节不得超过 4 百万单位。在用于手续费计算时,每个权重单位会被视作 1/4 的虚拟字节(vByte)。

为什么要使用这样的权重?我们来看看使用和不使用隔离见证的交易输入和输出的开销:

资金的类型 8作为输出的字节量作为输入的字节量见证字节量作为输入的 vBytes
P2PK441120112
裸 2-of-3 多签名1061860186
P2PKH341460146
P2SH(2-of-3 多签名)322930293
P2WPKH314110767.75
P2WSH(2-of-3 多签名)4341252104

关于这张表格,第一个要指出的事情是,这些见证脚本类型(P2WPKH、P2WSH)作为输入和输出时的字节量(两种都按完整的虚拟字节量)相差无几。一个见证脚本的花费者,在计算交易的体积时,授权她花费的数据会按字节量的 1/4 计算虚拟字节,这些数据中的绝大部分都只会在交易发生的一段时间内被验证(过了这段时间就不再被验证),并且这些数据都不会给 UTXO 索引造成持续的负担。还有一个值得指出的事情是,与升级之前相比,更安全的 2-of-3 多签名与单签名的使用成本差距,从 147 虚拟字节降低到了 36.25 虚拟字节。

Taproot 和铭文改变了一切(也可以说什么都没有改变)

就像我一开始说得,比特币运行在人类激励之上,而且,我们可以看到这些年来比特币上的变更如何优化了使用网络的各方之间的激励兼容。

Taproot 自身 “只是” 另一种使用隔离见证来锁定比特币的方法。它并没有显著改变这些激励。伴随 Taproot 的一项变更是移除了对脚本大小的明确限制。这是为了降低给比特币脚本设计分析工具的复杂性,也是对不同类型的数据的相对成本的承认。移除这个限制让铭文的实现比 Taproot 激活之前更简单,但并没有显著改变网络的激励结构。

现在,进入问题的关键。铭文是在见证数据中揭晓的,所以铭文数据的每个字节只会被统计为 1/4 虚拟字节。这是对见证数据折扣的滥用码?真相是,铭文这样的数据,对网络中的节点来说是验证起来最便宜的数据之一。铭文所用的脚本结构会显式地跳过对铭文数据的执行,所以对它运行的唯一验证就是一次哈希检查(保证实际揭晓的铭文正是计划揭晓的铭文)。这部分数据只会被哈希一次,然后就不会再被节点回顾。所以计算成本是非常低的(比起相同体积的多签名脚本的验证,低了几个数量级)。

但是铭文推高了手续费、挤出了其他用户。

没错!使用当前可用于跟比特币网络互动的软件,铭文兄弟比其他不得不使用其它类型交易的人更有经济激励让铭文上链。

这凸显了增加比特币交易的经济密度的机制的价值。闪电网络通过让几百笔、几千笔甚至几百万笔交易可以被打包成一笔链上交易,向这个目标迈出了一大步。一笔链上交易的每一个字节的经济密度越大,意味着这些经济活动付出的手续费越低。随着比特币交易的经济密度提升,区块空间的其它用法已经被淘汰,也必将继续被淘汰 9

值得指出的是,如果 链下的多签名协议(比如 MuSig2FROST,还有适配器签名)变得普遍,削减甚至消除见证数据折扣 可能 是有意义的。这些协议可以让原本需要耗费大量空间的花费条件只需使用一个签名。也就是说,它结合 Taproot 的高效密钥路径花费,可以让使用几乎任意复杂条件的输入都只需占用 105 字节

结论

应对铭文所导致的高手续费的措施,跟比特币历史上出现过的其它让人担心天要塌下来的情形一样:耐心地开发、更加耐心地开发。我们还可以做很多事情来提高比特币交易的经济密度,从开发更好的闪电钱包,到 Ark谨慎日志合约,等等。(过早地)移除见证数据的折扣、取消 taproot,或者其它类似的具有反作用的措施,都只会减少当前比特币交易的经济密度,并且使情况进一步恶化。

保持谦虚,存好你的聪,然后努力开发。

脚注

1. 这个被比特币世界采用的术语 “见证(witness)” 实际上来自密码学,它指的是高效地验证一个密码学陈述所需的数据。BIP141 将它定义为 “检查交易的有效性所需的、但对确定交易的实质无用的数据”。密码学家的灵感可能来自于制造业的 “witness” 标记,它被用来高效地验证各组件的公差。

2. Utreexo” 项目希望能让部分比特币节点不再需要这样做。Utrexxo 让这些节点可以高效地累加 UTXO 包含根,然后在这些 UTXO 被花费时通过接收它们的包含路径来验证它们。如果这变成了使用比特币的通行办法,它就将更多 UTXO 的负担聪节点转移到了这些 UTXO 的持有者手上。

3. ZeroSync” 希望帮助一些节点在某些环境下改变这一点。

4. 交易 ID:前隔离见证格式的交易连续运行两次 SHA256 的哈希值的倒序字节。

5. 多笔使用相同输入和输出的有效交易却具有不同的交易 ID,原因可能是它们的签名方式不同,或是签名被第三方改动了。

6. 可以是任意数值,不会引发硬分叉,因为旧的节点将不知道隔离的见证数据。

7. 1 百万,或者更少,从而保持与旧节点的兼容,而不会引发 硬分叉。

8. 假设使用压缩公钥以及 71 字节的 低-R/S DER 格式 ECDSA 签名。

9. 还有人记得 “中本聪骰子” 吗?