比特币源码解读十八(挖矿)

     本篇我们就看挖矿成功后对区块的有效性进行检测的代码。也就是CheckWork所做的事情。检验之时,线程的优先级必须为THREAD_PRIORITY_NORMAL。现在我们就直接看下CheckWork()函数的代码逻辑。

CheckWork检测

通过代码我们看到在进行ProcessBlock()正式检测之前要对难度值和父区块进行检测。如果这两项检测通过后,再正式调用ProcessBlock()进行新挖区块的检测。需要说明的是这个ProcessBlock()区块检测和从其他节点发送过来的区块信息("block")检测过程是一样的。都是调用这个ProcessBlock()进行检测。

    我们现在就进入ProcessBlock()函数进行源码解读,由于这个函数很大,检测项目很多,我们也向往常一样分段来分析解读:

对块的基本信息和扩展信息检测

上在的代码对是否是旧块(重复添加),基本信息(checkBlock()),和扩展信息进行了检测,块的基本信息检测包括:1。块的大小,2。(工作量证明)CheckProofOfWork 3。时间戳(区块时间戳早于验证时刻未来两个小时)4。块的第⼀一个交易信息必须是coinbase和有且有一个coinBase交易5。交易信息(CheckTransaction)6。检测多重支付(有2个或以上的同样的交易信息)7。签名的有效性8。MerkleRoot(默克树根)的有效性。

现在我们就看下checkBlock()的源码,就是按照这样一个检测列表进行检测的:

基本信息检测

上面对基本信息和扩展信息进行了检测,我们接着往下看:

检测孤块和存储区块数据到磁盘中

我们说一下孤块的概念和形成原因

如果节点收到了一个有效的区块,而在现有的区块链中却未找到它的父区块,那么这个区块被认为是“孤块”。孤块会被保存在孤块池中,直到它们的父区块被节点收到。一旦收到了父区块并且将其连接到现有区块链上,节点就会将孤块从孤块池中取出,并且连接到它的父区块,让它作为区块链的一部分。当两个区块在很短的时间间隔内被挖出来,节点有可能会以相反的顺序接收到它们,这个时候孤块现象就会出现。

现在我们看AcceptBlock是如何将新区块存储到磁盘中的,在写入磁盘之前还要进行精确的POW校验。我们就直接通过源码来看下这个校验列表,这个函数很长,我分两部分截图来看:

一。区块普通检测

写入区块校验1

二。区块版本检测

区块版本校验

通过区块版本检测可以看到这里是用于区分比特币分叉之后的处理,这里用的方案就是平常说的大数投票方案(IsSuperMajority)简称ISM,这个方案的规是这样的,大家可以对着代码了解:

1.在对比特币协议进行升级时,是用区块的nVersion进行+1区分的。

2.升级开始后,如果在过去1000个区块(6~7天)内,有750个区块的nVersion为新版本号(也就是说75%的算力已升级),那么新功能会被激活。所有新版本软件产生的区块会按照新规则进行验证,未验证通过会被拒绝。而旧版本软件产生的区块依然按照旧规则进行验证,只要合格同样可被网络接受。

3.在版本号大于等于2的区块中,达到在过去1000个区块内有950个区块的nVersion为新版本号,那么所有由旧版本软件产生的旧版本号区块会被拒绝,这样软分叉激活就完成了。

我把IsSuperMajority函数截出来,大家可以更深刻的理解下。

IsSuperMajority函数

对版本检测完成后,下面就开始真正的写入磁盘了。

存储和广播区块

到这里基本上一个区块挖出来后就已经被记录下来了,但我们还有一个没有处理,那就是孤链池,就是如果有此区块的子区块,则可以被链记录了。所以ProcessBlock()最后的部分就是处理孤链池。

循环处理孤链池

这个函数循环孤链池mapOrphanBlocksByPrev,通过区块hash值不断循环查找。然后调用AsseptBlock()处理所有依赖此区块的孤块。

到这里基本上一个挖矿的过程就完了,我们基本上了解挖矿的过程,和挖矿成功后是如何处理最新的交易和区块的。最后又是如何进行全网广播的,大家可以在源码中了解更详细的处理。

我们如果有理解不对的地方,欢迎大家指正。



作者:区块链研习社比特币源码研读班,black

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

推荐阅读更多精彩内容