39 / 736CBTX

Coinbase交易

分配区块挖矿奖励的交易

比特币没有中央金库,谁给矿工发奖励?矿工在区块开头的一笔特殊交易中写明奖励,其他节点检查它是否超过规则允许的金额。这笔交易就是 coinbase。

Coinbase 交易分配区块奖励,包括允许新发行的比特币和其他交易的手续费。与普通付款不同,它不会花费此前收到的资金。但它只能作为有效区块的一部分生效,奖励也不能立即花费。这里的名称指交易类型,不是 Coinbase 交易所。

假设安娜正在准备一个用于挖矿的候选区块。她收集用户付款,在前面放入一笔指定奖励接收者的特殊交易。本例中,规则允许新发行 3.125 BTC,选入的付款另有 0.075 BTC 手续费。因此,安娜最多可以领取 3.2 BTC。最前面的这笔交易就是 coinbase。但写上奖励还不等于已经赚到它:区块还要满足挖矿要求及其他全部条件,接收区块的节点会自行检查。若安娜多领奖励,节点就会拒绝整个区块,无论她为找到它花了多少电力。没有中央账户给她转账。新币按照共同规则,在被接受的区块中产生。本例的 3.2 BTC 中只有 3.125 BTC 是新币,其余是用户支付的手续费。这里说明的是奖励,不是净利润,挖矿成本还没有扣除。 [6] [4]

允许的新发行量叫作 Block Subsidy,会在 Halving 时定期减半。Satoshi 是比特币的最小单位。手续费则取决于区块中的具体付款,因此两个区块的奖励可能不同。 奖励上限是该高度允许的新币发行量,加上区块内其他有效交易的全部手续费;Bitcoin Core 用 GetBlockSubsidy 计算前者。只有新发行部分增加供应量,手续费来自已有的 satoshi。矿工可以少领,却不能以后补领差额:未领取的新币不会发行,未领取的手续费则永久无法花费。哪怕多领一个 satoshi,整个区块也会无效。 [4] [6]

奖励常常发给协调多个矿工工作的矿池。锁定脚本是一段简短程序,规定以后花费输出时必须满足哪些条件。下文的 PPS、FPPS 和 PPLNS 是矿池在参与者之间分配收入的不同方式。 Coinbase 输出使用普通锁定脚本。奖励可以发送到一个汇总地址,也可以分给多个接收者,或包含矿池运营方的份额。节点验证金额和花费条件,不验证合同或实际所有者。PPS、FPPS、PPLNS、最低支付门槛及之后向参与者转账,属于矿池规则,而不是 Bitcoin 共识规则。 [6] [7]

安娜能在区块里看到奖励,却还不能拿它交电费。不是交易所扣住了钱,而是比特币规则要求等待。区块高度是区块的位置编号;这里的 H 表示产生奖励的区块高度。 COINBASE_MATURITY 要求花费输出的区块高度与输出创建高度相差至少 100。在高度 H 创建的输出,最早可在有效区块 H+100 中花费。钱包显示的确认数可能看起来不同,因为创建区块本身已算第一次确认。关键是高度差,不是估计过了多少小时。满足这一条件也不能保证区块永远不会离开链。 [5]

重组是指节点转向另一条累计挖矿工作量更多的有效分支。UTXO 是尚未花费的输出,也就是一笔笔可用金额。奖励可能随着产生它的区块一起从这个集合中消失。 重组可能将原区块移出累计工作量最大的有效活动链。它的 coinbase 输出随之从当前 UTXO 集合中消失,花费这些奖励的后续交易也可能受影响。等待 100 个区块可以限制短期重组的影响,却不是绝对保障。矿池必须分清奖励是否在活动链上、是否可花费,以及自己对矿工的支付义务。 [4] [5]

先说明格式中的几个名称:输入通常指定要花费的资金,输出规定金额和花费条件。txid 标识交易,版本规定其格式,locktime 可以限制交易何时能够被纳入区块。 每个区块至少有一笔交易,只有第一笔可以是 coinbase。它恰有一个输入,对前序输出的引用为空:哈希由 32 个零字节组成,索引为 0xffffffff。这个引用称为 outpoint,并不花费之前的输出,因此无需验证授权花费该输出的普通签名。不过,这笔交易仍有自己的 txid、版本、locktime,以及一个或多个输出。 [1] [2] [3]

高度是区块的位置编号。BIP34 是一项已被比特币采用其规则的提案;scriptSig 是输入中的数据字段,CScript 用于表示脚本指令和数字。 BIP34 要求 scriptSig 以区块高度开头,使用最小编码的 CScript 数值表示。整个字段长度为 2–100 字节。其后可以放 extra nonce、矿池标识或合并挖矿数据。高度或长度错误都会导致区块被拒绝。这个输入虽然不按普通解锁脚本执行,其中的签名操作码仍可能计入签名操作数量限制 sigops。 [1] [9]

挖矿不断计算区块头的哈希,也就是这份区块简要信息的数字指纹。Nonce 是可以改变的数字,Merkle root 是交易的汇总指纹。因此,修改交易能够带来更多尝试。 区块头中的 nonce 只有 32 位,矿机很快就能遍历其取值。因此,软件还会修改 coinbase 中的 extra nonce。这会改变交易的 txid、Merkle 树根,继而改变区块头,获得新的哈希搜索空间。矿池在设备之间分配工作,以免无谓地重复尝试相同方案。Extra nonce 不会创造额外的币。 [6] [7] [12]

SegWit 把签名等部分验证数据单独放在 witness 部分。Commitment 是可以验证的数据绑定关系,不是另一笔付款。下面给出这种关系的技术格式。 如果区块含有 witness 数据,BIP141 要求 coinbase 有一个携带 witness commitment 的输出,即对这些数据的密码学承诺。脚本以 6a24aa21a9ed 开头:OP_RETURN、压入 36 字节的指令和 aa21a9ed 标记。随后是一个 32 字节的双重 SHA-256 哈希,输入为 witness Merkle root 与预留值的拼接。Coinbase 输入的 witness 必须仅包含这一个 32 字节预留值。如果多个输出符合格式,就采用索引最大的那个。这不是可花费的奖励输出;若区块没有 witness 数据,该承诺是可选的。 [10]

Full Node 是独立验证比特币规则的计算机。区块权重衡量允许的数据容量使用情况;Mempool 在本地保存普通未确认交易。检查奖励是检查整个区块的一部分。 Full Node 要求 coinbase 位于第一位,并拒绝同一区块中的额外 coinbase。它检查 scriptSig、BIP34 高度、金额范围、区块权重、手续费及必要的 witness commitment。输出总额不得超过允许发行量与手续费之和;之后的花费还必须满足成熟条件。因此,矿工不能有效地给自己任意金额。脱离所属区块的 coinbase 不会进入 mempool。 [3] [4] [10]

Genesis Block 是比特币的初始区块。它的特殊地位以及早期重复出现的交易标识符,说明不能把今天的普通规则不加区分地套用到所有历史情况。 在强制写入高度之前,不同 coinbase 交易可能有相同的 txid。BIP30 防止覆盖旧交易中尚未花费的输出,BIP34 则在通常的现代区块中加入可区分的高度。Genesis Block 是特殊情况:其存储的区块包含 coinbase,但初始化没有把该输出设为可花费。因此,最初的 50 BTC 无法花费,而不是正常等待 100 个区块即可。 [8] [9] [11]

要获得更完整的理解,请将本词条与以下词条结合阅读: Block, Block Subsidy, Transaction Fees, 挖矿, Block Template, Bitcoin. 反向关联还来自: Block Subsidy, 确认, Reorg, Stale Block.

DOC · 001Bitcoin Developer Reference — Coinbase input文档 DOC · 002Bitcoin Developer Reference — Block chain文档 DOC · 003Bitcoin Core — transaction.h (IsCoinBase)文档 DOC · 004Bitcoin Core — validation.cpp文档 DOC · 005Bitcoin Core — consensus.h (COINBASE_MATURITY)文档 DOC · 006Bitcoin Core — miner.cpp文档 DOC · 007BIP 22 — getblocktemplate规范 DOC · 008BIP 30 — Duplicate transactions规范 DOC · 009BIP 34 — Block height in coinbase规范 DOC · 010BIP 141 — Segregated Witness commitment规范 DOC · 011Bitcoin Core — chainparams.cpp (genesis construction)文档 DOC · 012Stratum V2 — Mining Protocol specification规范
修订日期: 来源优先 · 非投资建议