通过源码学习比特币原理--挖矿构造区块链

2018-07-18  本文已影响0人  zeJasonZhang

挖矿的过程就是区块生成的过程 同时也是比特币“发行”的过程。

1. 矿工节点通过暴力碰撞法找到满足条件的哈希值(下文详述) 即为挖矿成功,从而获取比特币奖励

2. 矿工奖励分为两部分:coin base 交易奖励 + 新建区块中交易费用总和

下面是计算矿工奖励的比特币源码:

 int64_t GetBlockValue(int nHeight, int64_t nFees) {         *// nFees = Sum(vin[i]) - Sum (vout[i]) 区块包含的交易费用总和*

        int64_t nSubsidy = 50 * COIN; *                                //COIN = 100000000 (一亿聪),初始奖励50比特币*

                 int nHalving = nHeight / 210000; *                     //nHeight:区块高度*

                 if (nHalving >= 64) 

                        return nFees;

                nSubsidy >>= nHalving;                                  *//每210000个区块奖励减半(右移位操作 提高运算效率)*

                return nSubsidy + nFees;

}

3. 交易发起者创建交易后,将其broadcast到相邻节点。每个节点独立的对接收到的交易进行验证

下面是比特币源码相关函数

   CheckInputs();

   CheckTransaction();

   AcceptToMemoryPool();

符合规则的交易被加入内存的交易池并broadcast到其他节点

4. 挖矿节点对内存交易池的交易按优先级排序,由于区块大小有限制 ,优先级低的交易不能被打包进区块

交易优先级计算:

priority = sum (vin[i].value * vin[i] age)/sizeof(Tx)

- vin[i].value: 交易输入金额 以聪为单位;
- vin[i] age : 交易输入所指向的utxo所在的区块的深度 (距离最新区块高度的距离 每天增大144)

5. 创币交易:即上文提到的给矿工的coin base 交易奖励, 作为每个新生成的block的第一笔交易

6. 挖矿算法:通过不断变换nNonce值 使SHA256(SHA256(区块头))的哈希值小于等于目标哈希值nhashTarget

详情请参考另一篇博客: https://www.jianshu.com/p/122642177711

7. 区块链分叉

8. 51%攻击:

1Eh == 1000Ph; 
1Ph == 1000Th; 
1Th == 1000Gh; 
1Gh == 1000Mh; 
1Mh==1000Kh  
(h:hash/sha256)

9. 双重支付攻击

当一笔交易A被加入到一个区块中得到确认后,买家通过自己控制的拥有超高算力的矿池,生成一个交易B 并将交易A的utxo发给自己钱包 同时删除交易A, 利用自己强大的算力生成分叉区块并让自己的分叉成为主链。之前交易A所在的区块则成为了一个分叉...

10. 拒绝服务攻击

上一篇下一篇

猜你喜欢

热点阅读