版本

序列化比特币交易的前四个字节是其版本号。比特币交易的最初版本是版本 1(0x01000000)。所有比特币交易必须遵循版本 1 交易的规则,其中许多规则在本书中有所描述。

版本 2 的比特币交易是在 BIP68 软分叉更改比特币共识规则时引入的。BIP68 对序列字段增加了额外的约束条件,但这些约束条件仅适用于版本为 2 或更高的交易。版本 1 的交易不受影响。BIP112 也是与 BIP68 同一软分叉的一部分,它升级了一个操作码(OP_CHECKSEQUENCEVERIFY),如果它作为版本小于 2 的交易的一部分进行评估,将会失败。除了这两个更改之外,版本 2 的交易与版本 1 的交易相同。

保护预签名交易

在将交易广播到网络以包含在区块链中之前的最后一步是对其进行签名。然而,可以在不立即广播的情况下对交易进行签名。您可以将这种预签名交易保存几个月甚至几年,认为在以后广播时可以将其添加到区块链中。在此期间,甚至可能丢失访问签署另一笔消费资金所需的私钥(或密钥)。这并非是假设性的:建立在比特币之上的几个协议,包括闪电网络,都依赖于预签名交易。

对于协议开发人员来说,当他们帮助用户升级比特币共识协议时,这就产生了挑战。添加新的约束(例如 BIP68 对序列字段所做的)可能会使一些预签名交易无效。如果没有办法为等价交易创建新的签名,那么在预签名交易中使用的资金就永久丢失了。

这个问题通过将一些交易特性保留给升级解决,比如版本号。在 BIP68 之前创建预签名交易的任何人都应该使用版本 1 的交易,因此仅将 BIP68 的额外约束应用到版本 2 或更高版本的交易上不应该使任何预签名交易无效。

如果您实施了一个使用预签名交易的协议,请确保它不使用任何保留给未来升级的功能。比特币核心的默认交易中继策略不允许使用保留的功能。您可以通过在比特币主网上使用比特币核心的 testmempoolaccept RPC 来测试交易是否符合该策略。

截至撰写本文时,普遍考虑开始使用版本 3 交易的提案正在广泛讨论中。该提案并不旨在改变共识规则,而只是改变比特币全节点用于中继交易的策略。根据该提案,版本 3 交易将受到额外约束,以防止某些拒绝服务(DoS)攻击,我们将在第 212 页的“交易固定”中进一步讨论这些攻击。

Last updated