HOME/Articles/

保留和替换

Article Outline

保留和替换

🏃🏃🏃

{
    [
        1,
        1,
        1
    ],
    5
}

这个简单的数据结构描述了这样一笔比特币交易,它有 3 个输入,5 个输出,每个输入都使用 SIGHASH_ALL 作为签名选项。

那么,这笔交易中那些部分是可以被替换(指替换了部分内容后,现有的签名依旧合法)的 ———— 没有。

{
    [
        2,
        1
    ],
    3
}

2 个输入,3 个输出,第一个输入使用 SIGHASH_NONE, 第二个输入使用 SIGHASH_ALL

那么,这笔交易中那些部分是可以被替换的 ———— 没有。

{
    [
        2
    ],
    3
}

1 个输入,3 个输出,第一个输入使用 SIGHASH_NONE

那么,这笔交易中那些部分是可以被替换的 ———— 全部的输出都可以被替换。

{
    [
        2,
        3
    ],
    3
}

2 个输入,3 个输出,第一个输入使用 SIGHASH_NONE,第二个输入使用 SIGHASH_SINGLE

那么,这笔交易中那些部分是可以被替换的 ———— 除了第二个输出,其它的输出都可以被替换。

{
    [
        2 | 0x80,
        3 | 0x80
    ],
    3
}

2 个输入,3 个输出,第一个输入使用 SIGHASH_NONE|ANYONECANPAY,第二个输入使用 SIGHASH_SINGLE|ANYONECANPAY

那么,这笔交易中那些部分是可以被替换的 ———— 除了第二个输出,其它的输出都可以被替换;可以添加或删除任意输入;可以改变输入输出对的排序(index相同的输入输出要保持index相同)。

在上一篇记录中,我们知道了使用 locktimesequence 参数可以替换已经被广播了的交易。但新的交易仍需重新签名,这点不太方便。这里我们灵活使用 SIGHASH,可以在不重新签名的情况下,修改交易内容。