深入技术
Coinbase 交易

Coinbase 交易

Coinbase 交易是矿工用来领取区块奖励的交易, 是区块中的第一个交易。

在普通交易中, 交易的输入都是一个或多个 UTXO(未花费的交易输出), 但在 Coinbase 交易中, 输入只能有一个不存在或者是空白的 UTXO

区块 860951 中的 Coinbase 交易:

020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff310317230d04c455e2662f466f756e6472792055534120506f6f6c202364726f70676f6c642f489917cef303000000000000ffffffff0322020000000000002251203daaca9b82a51aca960c1491588246029d7e0fc49e0abdbcc8fd17574be5c74b5f61d212000000002200207086320071974eef5e72eaa01dd9096e10c0383483855ea6b344259c244f73c20000000000000000266a24aa21a9ed832ff9a3afcd0b092d75690f9523de4e8205b8a09199ada0d91bd6f5526a46040120000000000000000000000000000000000000000000000000000000000000000000000000

其交易输入只有一个, 如下所示:

[
  {
    "txid": "0000000000000000000000000000000000000000000000000000000000000000",
    "vout": "ffffffff",
    "scriptSigSize": "31",
    "scriptSig": "0317230d04c455e2662f466f756e6472792055534120506f6f6c202364726f70676f6c642f489917cef303000000000000",
    "sequence": "ffffffff"
  }
]
  • txid - 要花费的 UTXO 来自于哪笔交易, Coinbase 交易中必须全部为零, 表示没有花费 UTXO
  • vout - 要花费的 UTXO 来自于交易的哪个输出, Coinbase 交易中设置为最大值
  • scriptSigSize - scriptSig 字段的长度, 单位是字节
  • scriptSig - 交易的输入脚本, 用于解锁 UTXO, 但在 Coinbase 交易中, 可以为空, 因为没有要花费的 UTXO。 在 BIP 34 升级后, 规定了必须以区块高度开头。示例中 scriptSig 开头是 0317230d, 03 表示操作码 OP_PUSHBYTES_3, 17230d 是区块高度的小端序, 转换为正常字节序为 0d2317, 再转换为十进制为 860951, 与交易所在区块高度一致。

在交易的输出中, 有三个输出:

[
  {
    "amount": "2202000000000000",
    "scriptPubKeySize": "22",
    "scriptPubKey": "51203daaca9b82a51aca960c1491588246029d7e0fc49e0abdbcc8fd17574be5c74b"
  },
  {
    "amount": "5f61d21200000000",
    "scriptPubKeySize": "22",
    "scriptPubKey": "00207086320071974eef5e72eaa01dd9096e10c0383483855ea6b344259c244f73c2"
  },
  {
    "amount": "0000000000000000",
    "scriptPubKeySize": "26",
    "scriptPubKey": "6a24aa21a9ed832ff9a3afcd0b092d75690f9523de4e8205b8a09199ada0d91bd6f5526a4604"
  }
]

可以看出, 有两个输出的金额不为零, 一个输出的金额为零。在一笔交易中, 只允许一个金额为0的输出(该输出不能作为交易的输入)。另外两个金额不为零的输出用来领取区块补贴和手续费。

尽管交易输入中的 txid为 0, 但却能产生金额不为零的 UTXO。这正是能够产生新的比特币的原因。

区块奖励

区块奖励来源于两部分:

  1. 区块补贴 - 新挖出的比特币, 在比特币网络中, 每 210000 个区块, 区块补贴减半。在一个补跌周期内, 每个区块的区块补贴都是相同的。
减半次数区块高度区块补贴(BTC)日期(东八区)已挖总量(BTC)
0050.00000000 btc2009-01-03 18:15:050
121000025.00000000 btc2012-11-28 15:24:3810,500,000
242000012.50000000 btc2016-07-09 16:46:1315,750,000
36300006.25000000 btc2020-05-11 19:23:4318,375,000
48400003.12500000 btc2024-04-20 00:09:2719,687,500
510500001.56250000 btc2028-04-1620,343,750
612600000.78125000 btc2032-04-0520,671,875

区块补贴

每4年减半
区块高度
区块补贴: 0 sats = 0.00000000 btc
  1. 交易手续费 - 交易的发起者支付给矿工的费用

一笔交易的手续费并不需要发起者手动指定, 自动计算为交易输入和输出之间的差额。例如交易输入中包括两个 UTXO, 总金额是 1btc。但指定的输出中只有一个金额是 0.8btcUTXO, 那么剩下的 0.2btc 就是交易手续费。

打包该区块的矿工能获得的交易手续费就是所有交易的手续费之和。因此矿工会优先选择手续费高的交易打包到区块中。

花费

区块奖励需要等到 100 个区块后才能花费, 主要是避免链重组导致的交易失效问题。

例如: 攻击者矿工成功挖出了包含 Coinbase 交易的区块, 但不广播, 转而继续挖下一个区块, 来构造自己的私有区块链。其他诚实矿工正常挖掘区块, 此时网络上的共识区块链是诚实矿工的区块链。当攻击者矿工挖出了比诚实矿工更长的链, 并广播出去, 按照最长链的原则, 诚实矿工的区块链就会被取代, 触发链重组。这时, 诚实矿工挖出的区块中的 Coinbase 交易就会失效。攻击者矿工将获得所挖出的区块奖励。相当于原本的区块奖励被攻击者矿工私有化了。而等到100个区块后才能花费的限制无疑会增加攻击者的成本, 可能成本会高于收益。

假设现在正常挖出一个区块的成本是 5, 区块奖励是 15。攻击者矿工的总资金是50, 为了更快的挖出区块, 攻击者矿工挖出一个区块的成本是10, 在连续挖了5个区块后, 资金耗尽并发布了自己构建的最长链。并成功替换了网络上的区块链, 获得了区块奖励 75, 但由于 100 个区块的限制, 攻击者矿工无法花费获得的区块奖励, 也就无法回款。此时其他诚实矿工, 发现自己的区块链被替换, 原本自己已经挖出的区块的奖励被攻击者领取后, 可能会选择继续在原本的区块链上构建。而攻击者矿工, 由于资金耗尽, 无法继续挖矿。最终, 诚实矿工的区块链会成为最长链, 攻击者矿工的区块链会被抛弃。

攻击者矿工唯一的办法就是连续构建 100 个区块, 以便可以花费构建区块的区块奖励以支持后续的挖矿。但这样的成本非常高, 也是不现实的。

Copyright © 2025 HeapUp