交易延展性 | Transaction Malleability

没有一个比他被的签名哈希脚本可以保护签名脚本,所以给有限的DoS攻击留下了方便之门,也称之为交易的延展性。签名脚本(signature script) 包含一个secp256k1的椭圆曲线加密签名,但是不能签名签名脚本自己,这使得攻击者可以对交易进行非功能的修改但交易依旧有效。例如,攻击者可以向签名脚本添加一些数据,这些数据会在之前的公钥脚本计算前被删除。

尽管修改是没有影响交易功能,所以攻击者既不能修改input 也不能修改output,但是他们修改了交易的hash值。因为交易会通过交易hash链接之前的交易作为交易标识符(txid),所以一个被修改的交易不具有创建者期望的交易id(txids)。

这对大部分交易都是不成问题的,因为交易应该被迅速的打包到区块链中。但是如果output 在交易被打包之前就被花出去了,这就会是一个严重的问题。

比特币的开发者一直努力降低标准交易类型的延展性,但是完整的修复交易的延展性仍然处于规划阶段。目前,新的交易不应当依赖尚未打包到区块的交易,尤其是处于高风险的大额比特币交易。

交易的延展性也影响交易的追踪,Bitcoin Core 客户端的的RPC接允许根据交易id (txid)查找交易。但是如果txid因为交易被修改而变更,客户端会认为交易从网络中消失了。

目前跟踪交易的最佳实践应当是跟踪作为交易input的未花费输出(UTXOS),因为utxo 只能在有效交易的情况下被改变。

最佳的实践方案进一步规定,如果一个交易看上去从网络中消失并且需要重新广播,那么它将使丢掉的交易无效的方式重新发布。一种总是可用的方式是,重复广播丢失的交易,保证相同的input 和 output。