第二方交易篡改
当传统交易格式是唯一的交易格式时,开发人员致力于提出方案来最小化第三方篡改,例如 BIP62。然而,即使他们能够完全消除第三方篡改,合约协议的用户仍然面临另一个问题:如果他们需要来自协议中其他参与者的签名,那么该人可以生成替代签名并更改 txid。
例如,Alice 和 Bob 将他们的资金存入一个需要双方签名才能支取的脚本中。他们还创建了一个退款交易,允许他们任何一方随时取回自己的资金。Alice 决定只花费部分资金,因此她与 Bob 合作创建了一系列交易:
Tx0 包含来自 Alice 和 Bob 的签名,将比特币花费到两个输出。第一个输出支付了部分 Alice 的资金;第二个输出将剩余的比特币退还给需要 Alice 和 Bob 签名的脚本。在签署此交易之前,他们创建了一个新的退款交易 Tx1。
Tx1 将 Tx0 的第二个输出花费到两个新的输出,一个给 Alice 作为她在联合资金中的份额,另一个给 Bob。Alice 和 Bob 在签署 Tx0 之前都签署了这笔交易。
这里没有循环依赖,如果我们忽略第三方交易篡改,这看起来应该为我们提供一个无需信任的协议。然而,Bitcoin 签名的一个特性是签名者在创建签名时必须选择一个大的随机数。即使签名的一切保持不变,选择不同的随机数也会产生不同的签名,就像如果你为两份相同合同的副本提供手写签名,每个物理签名都会略有不同一样。
签名的可变性意味着,如果 Alice 尝试广播 Tx0(其中包含 Bob 的签名),Bob 可以生成另一种签名,创建一个与不同 txid 的冲突交易。如果 Bob 的替代版本的 Tx0 被确认,那么 Alice 就无法使用预签名版本的 Tx1 来要求退款。这种变异称为不受欢迎的第二方交易篡改。
Last updated