【区块链】比特币学习 - 5 -创币交易

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/loy_184548/article/details/86178298

比特币学习 - 5 -创币交易

参考文章:精通比特币 and here

一、基本概念

区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase交易。

当A挖出区块后:作为他的挖矿奖励,A的节点会创建“向A的地址支付25.09094928个比特币”这样一个交易,把生成奖励发送到自己的钱包。

A挖出区块获得的奖励金额 = 区块奖励(产生了新币) + 区块中全部交易矿工费

1. 区块奖励

在比特币的生命周期中,将会有21,000,000个比特币被发行。所有的比特币均来自创建新区块时对矿工的奖励。第一个创世区块的奖励设定为50个比特币,此后每新建210,000个区块,奖励减半。奖励金在2012年当时候从50比特币减半为25比特币,2016年从25比特币减半为12.5比特币。大概2020年就会再减半为6.25比特币。

代码目录:src/validation.cpp

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    // 减半次数 = 当前区块高度除以减半间隔(210,000个区块)
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    if (halvings >= 64)
        return 0;
    
    // 初始奖励额,50亿聪
    CAmount nSubsidy = 50 * COIN;
    // 根据减半次数,计算奖励金额。右移一次等同于除以二[二进制计算效率更高]
    nSubsidy >>= halvings;
    return nSubsidy;
}

2. 矿工费

区块中包含多笔交易,矿工费则为输入和与输出和的差值:Total Fees = Sum(Inputs) - Sum(Outputs)

二、与普通交易对比

创币交易的输入:创币交易于其他交易的不同点在于其交易输入没有UTXO,也没有“输入脚本”。这个字段被Coinbase数据替代,除开始的几个字节外,矿工可以任意使用Coinbase的其他部分,随意填充任何数据。因此,中本聪在创世区块的Coinbase中填入了这样的数据 “The Times 03/Jan/ 2009 Chancellor on brink of secondbailout for banks”。

创币交易的输出:由挖矿胜出的矿工构建并将创币奖励和矿工费一起支付给了自己的比特币钱包地址。

三、代码实现

截取了创建新块的时候,创建coinbase交易的代码:

...
// Create coinbase transaction.
CMutableTransaction coinbaseTx;
// 没有输入
coinbaseTx.vin.resize(1);
coinbaseTx.vin[0].prevout.SetNull();
// 只有一条输出, 创建发送给A的一笔交易
coinbaseTx.vout.resize(1);
coinbaseTx.vout[0].scriptPubKey = scriptPubKeyIn;
coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
...

猜你喜欢

转载自blog.csdn.net/loy_184548/article/details/86178298