比特币挖矿究竟在计算一个什么问题?手动验证区块链给出答案

简单回顾下挖矿的流程。

首先先要对所有的交易做验证,剔除有问题的,然后通过一套自定义的标准来选择哪些交易希望打包进区块,比如说提供的交易费与交易占用的字节大小的比值超过某个门槛,这样的交易才被认为有利可图。当然,节点也可以特意选择要加入某条交易,或者故意忽略某些交易。如果是通过矿池挖矿的话,矿池的服务器会去筛选交易,然后分配给每个参与的矿机一个独立的任务。

一旦筛选好交易数据,层层约减,通过这些交易就可以计算出一棵Merkle树,可以确定一个唯一的摘要,这就是Merkl树的根。

然后我们再依次获取挖矿需要的其他信息,这些信息组成一个区块的头。

区块头的字节分配

  • version 版本号,4个字节
  • previous_block_hash 前一区块的摘要,32个字节
  • merkle_root 默克尔树的根,32个字节
  • time 区块生成时间,4个字节
  • bits 难度目标,是一个数字,4个字节
  • nonce 随机数,4个字节

区块头只有80个字节,挖矿只需要对区块头进行运算即可。交易数据都通过merkle树固定了下来,不需要再包含进来。

比特币区块链示意图

这些信息中大部分已经是固定下来的,或者是可计算的。

  • 版本号是跟随比特币客户端而定的,一段时间内不会改变。即使要改变,也会有比特币的核心开发人员来协调升级策略,这个可以理解为一个静态常数。
  • 前一区块的摘要,可以通过数学方法快速计算,因为前一区块早已打包好了。
  • 默克尔树的根,刚才已经得到了结果。
  • 时间,可以取打包时的时间,也不需要很精确,前后几秒,几十秒也都可以。
  • 难度目标,是参考上两周产生的区块的平均生成时间而定的,两周内如果平均10分钟产生一个区块的话,两周会产生2016个区块,软件会计算最新的2016个区块生成的时间,然后做对比,随之调整难度,使得接下来产生的区块的预期时间保持在10分钟左右。因为最近的2016个区块已经确定,所以这个数字也是确定的。
  • 最后一个随机数,就是挖矿的目标了。这个数字可以变化,而且要从0试到最大值。直到最后出现的hash结果,其数字必须低于难度目标值。不过以现在的计算机算力,这个数字用不了一秒就把全部的变化可能计算完了,所以还需要改变区块内部的创币交易中的附带消息,这样就让merkle root也发生了变化,从而有更多的可能去找到符合要求的nonce。

我们以区块277316为例,其信息来自网站http://blockchain.info

Bitcoin Block #277316blockchain.info

选择这个区块的原因是在《Mastering Bitcoin》一书中,中文社区译本和英文原版在介绍这部分内容时有出入,而且作者Antonopoulos并没有提到一个关键点,就是字节顺序的问题,相信很多人可能会踩这个坑。这里还原的细节可以帮助读者与书籍做相互参考。

比特币区块277316的信息
比特币区块277316的hash值

请大家注意下面的每个步骤,注意每一个变化,这是比特币最核心的算法。


第一步,准备数据,转换时间

2 (版本号的十进制)
0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569 (前一区块hash值的16进制)
c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e  (merkle root的16进制)
2013-12-27 23:11:54 (utc时间)
419668748  (难度目标的十进制)
924591752  (随机数的十进制)

转换时间,记住,一定要转为utc的时间戳,此处遇到过坑,小心。

>>> import datetime
>>> from datetime import timezone
>>> datetime.datetime.strptime('2013-12-27 23:11:54', '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone.utc).timestamp()
1388185914.0

第二步,全部转换为16进制

00000002
0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569
c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e
52be093a
1903a30c
371c2688

第三步,从big-endian转化为little-endian

这一步的发现异常艰辛,耗费了大量的查询,大坑,大坑,谨记。发明人中本聪可能为了让机器计算更快,而变为了更接近机器的编码方式little-endian.

02000000
69054f28012b4474caa9e821102655cc74037c415ad2bba70200000000000000
2ecfc74ceb512c5055bcff7e57735f7323c32f8bbb48f5e96307e5268c001cc9
3a09be52
0ca30319
88261c37

第四步,拼接字符串,开始验证

import binascii
from hashlib import sha256 as s
k = '0200000069054f28012b4474caa9e821102655cc74037c415ad2bba702000000000000002ecfc74ceb512c5055bcff7e57735f7323c32f8bbb48f5e96307e5268c001cc93a09be520ca3031988261c37'
hk = binascii.unhexlify(k)
res = binascii.hexlify(s(s(hk).digest()).digest()[::-1])

最终得到的结果就是

0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4

16进制下前面15个0,然后是1; 而难度目标对应的数字是

0000000000000003a30c00000000000000000000000000000000000000000000

16进制下前面15个0,然后是3. 计算结果小于难度目标,符合要求。这个结果与网站上公布的数字一致。

正确的hash值

在挖矿时,nonce随机数是未知的,要从0试到2^32,但是这个数字其实不大,只有4294967296,以现在的矿机动辄14T每秒的算力,全部算完到上限也不需要一秒。刚才提到在这种情况下,需要使用创币交易中的附带信息,额外的字符串成为extra nonce。

另外,创世区块也可以通过上面的方法来验证,有好奇的朋友可以尝试下。

提示:

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

推荐阅读更多精彩内容

  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,882评论 4 88
  • 以下为金马老师《精通比特币》解读的文稿整理。 第一章 介绍 1.1 什么是比特币 (1)比特币是一个区块链实现 (...
    梦之郎阅读 13,188评论 6 61
  • 早上在家休息了一早上,好好的睡了一觉,下午去和海尔的兄弟们一起运动,还是很好的,以后这样的活动可以多组织一下,身体...
    李代唐阅读 94评论 0 0
  • 夏天就快要过去了 秋天一到 冬天也会随着而来 发现时间真的过得太快 来不及好好欣赏 来不及慢慢品味 过不去的过去...
    Butterfly7阅读 102评论 0 0
  • 我一向都性子急,什么都要快,但又什么都想要,看书恨不得一天就能看完还能干别的事,工作第一天就有客户还能做好其他项目...
    追梦哥哥阅读 189评论 0 0