Coinbase
交易是矿工用来领取区块奖励的交易, 是区块中的第一个交易。
在普通交易中, 交易的输入都是一个或多个 UTXO
(未花费的交易输出), 但在 Coinbase
交易中, 输入只能有一个不存在或者是空白的 UTXO
。
区块 860951 中的 Coinbase
交易:
其交易输入只有一个, 如下所示:
[
{
"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
。这正是能够产生新的比特币的原因。
区块奖励
区块奖励来源于两部分:
- 区块补贴 - 新挖出的比特币, 在比特币网络中, 每 210000 个区块, 区块补贴减半。在一个补跌周期内, 每个区块的区块补贴都是相同的。
减半次数 | 区块高度 | 区块补贴(BTC) | 日期(东八区) | 已挖总量(BTC) |
---|---|---|---|---|
0 | 0 | 50.00000000 btc | 2009-01-03 18:15:05 | 0 |
1 | 210000 | 25.00000000 btc | 2012-11-28 15:24:38 | 10,500,000 |
2 | 420000 | 12.50000000 btc | 2016-07-09 16:46:13 | 15,750,000 |
3 | 630000 | 6.25000000 btc | 2020-05-11 19:23:43 | 18,375,000 |
4 | 840000 | 3.12500000 btc | 2024-04-20 00:09:27 | 19,687,500 |
5 | 1050000 | 1.56250000 btc | 2028-04-16 | 20,343,750 |
6 | 1260000 | 0.78125000 btc | 2032-04-05 | 20,671,875 |
区块补贴
- 交易手续费 - 交易的发起者支付给矿工的费用
一笔交易的手续费并不需要发起者手动指定, 自动计算为交易输入和输出之间的差额。例如交易输入中包括两个 UTXO
, 总金额是 1btc
。但指定的输出中只有一个金额是 0.8btc
的 UTXO
, 那么剩下的 0.2btc
就是交易手续费。
打包该区块的矿工能获得的交易手续费就是所有交易的手续费之和。因此矿工会优先选择手续费高的交易打包到区块中。
花费
区块奖励需要等到 100 个区块后才能花费, 主要是避免链重组导致的交易失效问题。
例如: 攻击者矿工成功挖出了包含 Coinbase
交易的区块, 但不广播, 转而继续挖下一个区块, 来构造自己的私有区块链。其他诚实矿工正常挖掘区块, 此时网络上的共识区块链是诚实矿工的区块链。当攻击者矿工挖出了比诚实矿工更长的链, 并广播出去, 按照最长链的原则, 诚实矿工的区块链就会被取代, 触发链重组。这时, 诚实矿工挖出的区块中的 Coinbase
交易就会失效。攻击者矿工将获得所挖出的区块奖励。相当于原本的区块奖励被攻击者矿工私有化了。而等到100个区块后才能花费的限制无疑会增加攻击者的成本, 可能成本会高于收益。
假设现在正常挖出一个区块的成本是 5, 区块奖励是 15。攻击者矿工的总资金是50, 为了更快的挖出区块, 攻击者矿工挖出一个区块的成本是10, 在连续挖了5个区块后, 资金耗尽并发布了自己构建的最长链。并成功替换了网络上的区块链, 获得了区块奖励 75, 但由于 100 个区块的限制, 攻击者矿工无法花费获得的区块奖励, 也就无法回款。此时其他诚实矿工, 发现自己的区块链被替换, 原本自己已经挖出的区块的奖励被攻击者领取后, 可能会选择继续在原本的区块链上构建。而攻击者矿工, 由于资金耗尽, 无法继续挖矿。最终, 诚实矿工的区块链会成为最长链, 攻击者矿工的区块链会被抛弃。
攻击者矿工唯一的办法就是连续构建 100 个区块, 以便可以花费构建区块的区块奖励以支持后续的挖矿。但这样的成本非常高, 也是不现实的。