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

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

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

  • 大约每十分钟产生一个区块, 每210000个区块(大约4年)奖励比特币减半

  • 2009.1 -- 50个比特币, 2012.11 -- 25个, 2016 -- 12.5个

  • 到2040年, 总比特币数量达到 2099 9999.98个

  • 2140年后 新区快不再奖励新比特币 矿工收益全部来自交易费

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)
  • 转账金额越大 所使用的utxo越老 字节数越小 的交易优先级越高!
  • priority > 57600000 的tx 定义高优先级;(100 000 000 satoshi * 144)/ 250 byte
  • 每个区块的前50k空间留给高优先级的tx , 剩下的按照"交易费/Kb"由高到低排序 直到达到MAX_BLOCK_SIZE;
  • 节点软件重启 内存交易池会被清空;
  • 如果交易长时间未被加入区块,交易发起节点应提高交易费重新发送;

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

  • 只有一个vin, 其指向的utxo所在的交易hash为0x0000...(32字节)
  • utxo 的输出索引vout nOut 为0xFFFFFFFF 表示不指向任何UTXO;
  • 交易输出金额为系统奖励(目前为12.5BTC) 发给挖矿节点自己的地址,比特币就是这么发行的
  • 不包含scriptSig脚本, 以区块高度开头,剩余字节可由矿工任意填充 (最大100字节)

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

  • nhashTarget 由区块头中的nBits值决定,其大小是依据全网算力不断调整的,全网算力越高难度越大,从而使区块生成速度保持在10分钟左右

  • 难度值调整 函数: GetNextWorkRequired()

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

7. 区块链分叉

  • 节点依据最长链(最多工作量)原则选择主链, 几乎每周都会发生单块的分叉,双块分叉几乎很少发生;

  • 当两个块A,B几乎同时产生时, 节点会加入先收到的块A,抛弃后收到的B(另一部分节点先收到B);

  • 如果先收到B的节点又收到新块C时,B->C作为最长链(主链)广播到全网,A块就会变成备用分叉链;

  • 孤块:节点收到一个新块,它的父块没有在自己的链中找到,则将其加入孤块池,直到接收到其父块后再将其加入主链;

  • 每10分钟产生一个新块,是在更快的交易确认速度和更少的分叉之间做出的权衡。

8. 51%攻击:

  • 并不是拥有51%以上的算力才能攻击,只是拥有的算力越高 成功的概率就越大,事实上 拥有30%的算力就可以尝试攻击。

  • 目前全网算力达到近40Eh/s, 承指数级增长

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

9. 双重支付攻击

  • 小额交易A时(买咖啡) 商家不等交易A被区块确认就交付了商品,这时买家又用同一个utxo进行另外一笔交易B(转给自己的另外一个地址),这交易B就有可能先被加入矿工的区块从而使交易A失效

  • 51% 算力使区块链分叉

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

  • 因此对于大额交易,一般要等至少6个区块确认之后在交付商品,以避免51%算力双重支付攻击。

10. 拒绝服务攻击

  • 拥有超级算力的节点或矿池, 通过删除区块中的某些特定地址的交易 从而使某些地址的交易一直不能被加入到区块链。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容