比特币挖矿到底在计算什么?

比特币挖矿是一种用计算机参与比特币交易并获得激励的过程,而挖矿的核心是计算哈希值。

比特币是一种基于区块链技术的加密数字货币,其中交易的数据被存储在一个分布式的公共账本中,称为区块。为了维护比特币网络的安全性,每个新的区块必须经过一定的工作量证明(PoW)计算,以保障区块链的不被篡改性。哈希值就是这个计算过程的核心。

哈希值是一种将输入数据压缩成固定长度输出的算法,可以将任意大小的数据转换为一个固定长度的字符串。在比特币中,挖矿是为了计算一个新的区块头的哈希值,这个哈希值必须具备一定的特征,比如前面若干位必须是0,以保证难以计算得到。

在比特币网络中,多个矿工使用自己的计算机向网络中发送不同的区块信息,同时尝试计算哈希值,挖到符合规则的哈希值最先的那个矿工就获得了挖矿奖励,就像是一场竞赛一样。但是,由于每个哈希值的计算是相对独立的,因此谁能够最先找到符合条件的哈希值是相对随机的,也就是说,参与挖矿的计算机数量越多,最先找到符合条件的哈希值的概率就越小,因此挖矿难度就越大。




比特币的底层技术是区块链,你可以把它看成为点对点的交易系统。区块链技术支撑着比特币的全网数据运行和相对应的存储,只有比特币的区块链技术,按照比特币白皮书中也就是2008年的10月31日中本聪发表在全网的那份长达9页的论文设定的规则来运行,才能够支撑起整个比特币世界的运转。

很多朋友不明白什么是区块链技术,并且也不明白当前的比特币挖矿到底在计算着什么?

举一个通俗简单的例子,我们当前相互之间进行转账,要么是通过银行,要么是通过支付宝,要么是通过微信。这些都是我们所有人都认可的支付机构和第三方支付平台。但如果某一天这些可信任的银行机构和第三方支付平台都消失了,你怎么给我转钱?

比特币的区块链技术解决的就是这个问题。也就是说当可信任的中心化节点消失以后,如何建立能够达成全网共识的去中心化节点的问题,建立起点对点的交易网络。

这样即便是没有银行或者支付宝微信这些可信任的第三方支付机构,当你向我转钱时你只需要通过网络向所有人同时记账的账本发布一条转账信息,区块链技术就会回溯你的个人账本,然后将你的钱打包传递给我。我们之间只需要通过相对应的地址就能够进行价值传输。

而在这个过程中进行数据的传送记录,以及你的钱包数额的回溯过程,就被称之为计算,通俗来讲也就是挖矿。你的计算能力越强,你的计算能力越大你的穷举能力越高你获得的区块链奖励就越多。

看到这里我们也能够明白比特币挖矿就是指运转比特币整个网络世界的节点信息,你的记录能力越强,计算能力越强,你所获得的区块链代币奖励也就是比特币越多,目前打包一个区块能够获得6.25个比特币,按照当前一枚比特币42万元人民币来计算的话,价值260万人民币。

所以总的来讲,比特币的底层区块链技术创造了一个新的世界,它解决了中心化可信任节点缺失以后如何进行新的沟通方式。通过共识和相对应的规则设立建立起点对点的交易系统,然后通过数据的储存和运输然后通过数据的储存和运转,来支撑起整个区块链世界的运行。




希望大家看完给一些赞,加我好友,也不枉我写了快三个星期


比特币挖矿的算法,可以简单地总结为对区块头做两次sha256哈希运算,得到的结果如果小于区块头中规定的难度目标,即挖矿成功。


区块头的结构如下



区块头的结构

那么挖矿的算法可以表达为


block_header = version + previous_block_hash + merkle_root + time + target_bits + nonce

for i in range(0, 2**32):

if sha256(sha256(block_header)) < target_bits:

break

else:

continue



简单回顾下挖矿的流程。挖矿节点首先对交易做验证,剔除有问题的,然后通过一套自定义的标准来选择哪些交易希望打包进区块,比如通过交易费与交易占用的字节大小的比值超过某个门槛来判断,这样的交易才被认为有利可图。当然,节点也可以特意选择要加入某条交易,或者故意忽略某些交易,每个挖矿节点有很大的自由裁度权力。


如果是通过矿池挖矿的话,矿池的服务器会去筛选交易,然后分配给每个参与的矿机一个独立的任务。这个任务的难度小于总的挖矿难度,完成了小难度的计算,即确认了自己参与的工作量。每台不同的矿机计算的问题不会重复,当其中一台矿机成功挖矿时,其他矿机依据工作量分配获得的总收益。


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


ABCDEEEE .......Merkle root

/

ABCD EEEE

/ /

AB CD EE .......E与自己配对,奇数树叶时

/ / /

A B C D E .........交易

merkle树中,任何节点的变化,都会导致merkle root发生变化,通过这个值,可以用来验证区块中的交易数据是否被改动过。


然后我们再依次获取挖矿需要的每一项区块头的信息。 区块头只有80个字节,挖矿只需要对区块头进行运算即可。交易数据都通过merkle树固定了下来,不需要再包含进来。而所谓的区块链,其实也是通过区块头而链接在一起的。下面的示意图比较简单明确地解释了区块链和区块的构成。



比特币区块链示意图

区块头中的信息,在挖矿前大部分已经是固定下来的,或者是可计算的。


版本号

跟随比特币客户端而定,一段时间内不会改变。即使要改变,也会有比特币的核心开发人员来协调升级策略,这个可以理解为一个静态常数。


前一区块的哈希摘要

一次哈希即可。前一区块已经是打包好的。


默克尔树的根

刚才已经得到了结果,根据本次交易包含的交易列表得到。


时间

取打包时的时间。也不需要很精确,前后几秒,几十秒也都可以。


难度目标

参考上两周产生的区块的平均生成时间而定。两周内如果平均10分钟产生一个区块的话,两周会产生2016个区块,软件会计算最新的2016个区块生成的时间,然后做对比,随之调整难度,使得接下来产生的区块的预期时间保持在10分钟左右。因为最近的2016个区块已经确定,所以这个数字也是确定的。


随机数nonce

这个就是挖矿的目标了。这是一个32位的数字。


随机数可以变化,而且要从0试到最大值2^32。直到最后出现的hash结果,其数字低于难度目标值。不过以现在的计算机算力,一台矿机用不了一秒就把全部的变化可能计算完了,所以还需要改变区块内部的创币交易中的附带消息,这样就让merkle root也发生了变化,从而有更多的可能去找到符合要求的nonce。


挖矿中,第一笔交易是创币交易。创币交易可以附带一段文字消息,这段信息可以用来提供更多的nonce. 比如中本聪在挖出创世区块时植入的信息


The Times 03/Jan/2009 Chancellor on brink of second bailout for banks



讲完了基本的原理,我们开始使用实际数据来验证这个算法。我们以区块277316为例,其信息来自网站http://blockchain.info


Bitcoin Block #277316

blockchain.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。 为了得到这个数字,需要花费我近一个星期的时间,先从椭圆曲线加密算法开始学起,再到各种原始资料的阅读,还下载了难懂的源代码,论坛也翻了个遍。看到前面有一堆0,感觉胜利的曙光快来了。


不急,我们仍然要验证最后一步,是否满足难度目标。当然是满足的,因为我们是在验证结果嘛,不过如果是在正向计算的挖矿过程中的话,就一定要验证。


难度目标对应的数字是


0x03a30c*0x0100**(0x19-0x03) =

0000000000000003a30c00000000000000000000000000000000000000000000

16进制下前面15个0,然后是3。


计算结果小于难度目标,符合要求。那这个结果就一定是网站上公布的数字了。


正确的hash值

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


对这个结果我们解释下意味着什么,在2013年年底时,这个区块产生,这需要算力达到8T/s的设备,即每秒8*10^15次暴力验证,连续工作10分钟。这对于2018年的现在来说的确不算什么,一台矿机,不比两三块砖头大多少,就拥有14T/s的算力,只需要6,7分钟单独就可以挖到。但在当时,8T也是全网千分之一的算力了,需要当时最好的矿机上百台一起工作。而如果这个计算使用一台普通的桌面电脑,需要26年。如果使用2018年最好的手机iphoneX的话,每秒可以做70次计算,那么将需要四百万年。


通过上面的算法我们完整地回顾了比特币区块链的工作量证明算法,如果各位完全理清了其中的思路,也就可以手动实现自己的挖矿程序,或者另外尝试设计一些新的区块链产品了。最艰深的技术,我们希望能够在底层去了解,然而拨开云雾,其实底层的逻辑并不难。


不过比特币里面的技术远不止挖矿算法,加密算法,Script智能合约,各种协议,各种网络,交易的验证,每一个都充满了魔性,进出之间,不由得让人惊叹发明人知识的深度与广度。无论比特币是什么,将会怎样,但是以比特币为第一个大规模应用的区块链技术,已经扩散了开来,整个系统的严密与逻辑的复杂,的确让人着迷。


One more thing...


创世区块也可以通过上面的方法来验证,有好奇的朋友可以尝试下。虽然创世区块后来硬编码在客户端,但仍然是挖出来的。


提示:


对于创世区块,版本号是1。

前一区块的hash摘要,猜想会是什么呢?对于创世区块,是没有前一区块的。

难度目标是1,这是定义为一个sha256结果的前32位是0,也就是对应的16进制字符串要有8个0,那么难度bits此时是0x1d00ffff。这个数字的得出需要概率论的知识,同时也是中本聪的一个规定。

然后再用上面的解法去求解随机数就可以了。

编辑于 2020-01-10・著作权归作者所有




比特币挖矿,需要从区块链说起,区块链顾名思义是无数个区块一起组成的链,随意叫区块链。在比特币网络当中,每个区块就是一个存储数据的空间,这些数据就是你的转账数据,而比特币挖矿其实指的就是开发出新的区块出来,这样就能继续记录比特币交易记录。

注意一点,比特币并不是存在这个区块当中的,而是额外的奖励。

区块本身是不存在的,如何算出来呢,这就要提到哈希值,(哈希值就不多做解释了,主要讲挖矿)比特币网络每10分钟会出一个新的区块,但是这个区块是需要你的计算机计算的,计算出来一个符合标准的哈希值出来,这个时候就需要不断地试错(也就造成了谁的算力比较大谁的机会就比较多的可能性)。谁算出来谁就开发了一个新的区块,谁就获得奖励。

不过因为比特币是有上限的,也就是说比特币终究是会被“挖”完的到后续会怎么样,矿工何去何从还需要时间的验证。——Hubox研究院

展开阅读全文

页面更新:2024-04-01

标签:随机数   账本   区块   节点   工作量   字符串   算法   难度   目标   数字   时间   数据   财经   技术   网络   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top