每一个比特币交易,其实可以分为两部份。第一部份是说明结余的进出,第二部份是用来证明这个交易的合法性 (主要是签署)。第一部份可称为「交易状态」,第二部份就是所谓的「见证」(witness)。如果你只关心每个账户的结余,其实交易状态资料就已经足够。只有部份人(主要是矿工)才有必要取得交易见证。
中本聪设计比特币系统时,并没有把两部份资料分开处理,导致交易ID的计算混合了交易状态和见证。因为见证本身包括签署,而签署不可能对其自身进行签署,因此见证是可以由任何人在没有交易双方同意下可以改变的,造成所谓交易可变性 (malleability)。在交易发出后,确认前的交易ID可以被任意更改,因此基于未确认交易的交易是绝对不安全的。在2014年就曾有人利用这漏洞大规模攻击比特币网络,然而这问题一直至今没有解决。
比特币核心开发员Pieter Wuille 在2015年12月于香港提出的隔离见证 (Segregated Witness,以下简称SW) 软分叉非常巧妙地彻底解决了这个问题。SW用户在交易时,会把比特币传送到有别于传统的地址。当要使用这些比特币的时候,其签署 (即见证)并不会记录为交易ID的一部份,而是另外处理。也就是说,交易ID完全是由交易状态 (即结余的进出) 决定,不受见证部份影响。这做法有几个重要的结果:
- 可以用软分叉增加最大区块容量:
因为旧有节点根本看不到这些被隔离的见证,即使真实的区块已超过1MB,它们仍会以为没有超过限制而会接受区块。在整场有关区块容量的辩论中,最大的难点就是硬分叉。SW可以提供约2MB的有效区块空间而没有任何硬分叉风险。
2.从此以后,只有发出交易的人才可以改变交易ID,没有任何第三方可以做到。如果是多重签名交易,就只有多名签署人同意才能改变交易ID。这可以保证一连串的未确认交易的有效性,是双向支付通道或闪电网络所必须的功能。有了双向支付通道或闪电网络,二人或多人之间就可以实际上进行无限次交易,而无需把大量零碎交易放在区块链,大为减低区块空间压力。
- 轻钱包可以变得更轻量,因为它们无需再接收见证数据。
4.可以大幅改善签署结构。在区块链上,曾经有一个超过5000个输入的交易,因为签署设计缺憾,需要半分钟才能完成检查。在建议中的SW软分叉会把这个问题解决掉。
而在该次软分叉完成后,核心开发者们已有计划进一步完善整个系统的可用性和安全性:
1.全节点可以为轻钱包提供很简洁的证明,以检查交易是否合法。以后的节点就不再局限于完全验证和完全不验证,而是可以按个人的资源作部份验证,也就是说一台手机也可以参与保障系统安全。这可以大为降低系统对全节点的依赖,即使以后区块容量提升了,我们仍能保持安全。
- 将会推出全新的交易脚本语言,例如可以把数以千计的不同脚本通过MAST技术压缩至只有32字节;也可以把不同签署合并检查,令检查交易的速度再以倍数上升。