主页 > imtoken多签钱包 > 【区块链】比特币学习 - 5 - 代币交易

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

imtoken多签钱包 2023-01-17 02:59:32

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

参考文章:掌握比特币和这里

一、基本概念

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

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

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、矿工费

一个区块包含多笔交易,矿工费为输入总和与输出总和之差:总费用 = Sum(Inputs) - Sum(Outputs)

2、与普通交易相比

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

造币交易的输出:由获胜的矿工构造比特币是一串代码吗,并将造币奖励和矿工费支付到自己的比特币钱包地址。

3.代码实现

拦截创建新区块时创建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; 
...