
Coinbase是每个区块中第一笔交易的特殊名称。也被叫做“创币交易”。
获胜的矿工在其区块模版里创建了这个特殊交易。
coinbase交易与普通交易具有相同的格式,但与普通交易不同的是:
- 只有一个交易输入。
- 交易输入的前序输出哈希是0000…0000。
- 交易输入的前序输出index是0xffffff。
- 交易输入的前序输出脚本是一个任意字节数组,在过去,矿工使用这个输出脚本来验证身份,并将消息从获胜的节点传递到整个网络。
- 所有交易输出值的总和不得超过矿工补贴及区块内所有其它交易的挖矿手续费的总和。
在块寻找有效区块的过程中,coinbase还可以被作为“额外的nonce”,因为本来单个ASIC矿机只能够通过改变区块头中的nonce值来测试2^32种可能的组合,而coinbase交易增加了矿机可以操作的随机值区间:coinbase的数据变化将会引起merkle树中的少量哈希值发生变化,进而改变了区块头中的merkle根,此时矿机就可以再多尝试计算一轮2^32种可能的区块哈希值。
一个coinbase交易可以根据矿工的需要附加任意数量的输出。这些输出可用于更高层面的功能,比如:
- 商户用API,也称为MAPI,它允许成功挖出区块的矿工提供可动态访问的交易定价服务,使用户可以在网络上请求矿工提供定价和交易广播服务。
- MinerID:它使用Coinbase交易向网络提供如节点标识、MAPI访问点等信息。这些数据必须使用标准格式,以便用户钱包能够读取和解析信息,为用户提供最新的信息,使他们了解目前网络上有哪些竞争节点,等等。
过去有些区块中仅包含coinbase这一笔交易,并且这些coinbase交易中的信息和输出都完全一致,从而它们的TXID也完全一致,这导致了一些问题,因此矿工们通过共识机制达成一致,开始执行bip0034(作为一种协议规则),这个规则要求矿工在coinbase交易的第一段数据中指定当前区块高度值。在此之前,coinbase脚本大小在2到100字节之间。而现在由于要在可变整数区间(VarInt)内承载区块高度值数据,因此coinbase脚本的最小长度变为了4字节。我们3个字节里可以存储的最大区块高度值为16777215,因此如果网络一直维持在平均每年产生59000个区块的水平,那么从大约在2300年左右,coinbase脚本的最小长度将需要增加到5字节。