DAOONE知识整理:挖矿
整理人:DAOONE@擒龙
说到挖矿,很多人都会联想到采矿业。采矿业是你对于矿产资源用一定劳动力进行挖取,是一定可以挖到的。而区块链里面的挖矿,不是挖就能挖到的,这个概率是随机的,而且挖到的不是矿,而是记账权。挖矿的人称为矿工,但是区块链会作为回报给矿工数字货币作为奖励,也就是苦力费。
比特币的本质是一个互相验证的公开记账系统,而挖矿的本质则是在争夺记账权。从工作内容来看,“挖矿”是将过去一段时间内发生的、尚未经过网络公认的交易数量收集、检验、确认,最后打包加密成为一个无法篡改的交易记录信息块,从而成为这个比特币网络上公认已经完成的交易记录,永久保存。
矿工们为争夺记账权所运行的计算,实际上是根据哈希值反向求解随机数。大家比赛的是在10分钟内看谁找到一个随机数,这个随机数与上一个数据块的哈希以及10 分钟内验证过的新交易记录合起来可以得到满足某个条件的最小哈希值。这个值越小对应的比特币网络的难度系数越高。由于哈自值得结果相当随机,无法预知结果大小,所以只能暴力破解,利用穷举法比拼算力。若矿工10分钟内没有抢到记账权,就只能等待下一轮的竞争。
1、专有名词
1.1、区块
比特币的区块由区块头及该区块所包含的交易列表组成。区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle Root Hash、4字节的时间缀(当前时间)、4字节的当前难度值、4字节的随机数组成。
区块包含的交易列表则附加在区块头后面,其中的第一笔交易是coinbase交易,这是一笔为了让矿工获得奖励及手续费的特殊交易。
区块的大致结构如图所示:
块字段的详解:
区块头和区块体
1.2、区块链
区块链是通过数据链条将各个区块连接起来,又称为全网总账本,它永远保存在每个节点上。
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。(挖矿当中的共识机制是POW)
数据存储
在区块链技术中,数据以区块的方式永久储存。区块按时间顺序逐个先后生成并连接成链,每一个区块记录了创建期间发生的所有交易信息。区块的数据结构一般分为区块头(header)和区块体(body),如图4-2所示。其中,区块头用于链接到前一个区块并且通过时间戳特性保证历史数据的完整性;区块体则包含了经过验证的、区块创建过程中产生的所有交易信息。
分布式存储
按照数据库的数据结构组织形式
Key-Value型:读写性能很高,能支持海量并发读写请求,而且可扩展性强,操作接口简单,支持一些基本的读、写、修改、删除等功能,但不支持复杂的SQL功能和事务性。
关系型数据库:采用关系模型来组织数据,支持各种SQL功能,功能性强,支持事务性,读写性能一般,可扩展性弱。
按照数据库的部署形式
单机型:保证强一致性和较好的可用性
分布式:高并发的读写性能和容错,强可用性和分区容错性,只能保证数据最终一致性
1.3、POW
PoW即工作量证明,就是大家熟悉的挖矿,通过运算,计算出一个满足规则的随机数,即获得本次记账权,发出本轮需要记录的数据,全网其它节点验证后一起存储。
比特币在区块的生成过程中使用了POW机制,一个符合要求的区块Hash由N个前导零构成,零的个数取决于网络的难度值。要得到合理的区块Hash需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的区块Hash值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件。当节点拥有占全网n%的算力时,该节点即有n/100的概率找到区块Hash。
2、挖矿
2.1、挖矿过程
挖矿的过程实际上就是新块诞生的过程。
节点监听全网交易,通过验证的交易进入节点的内存池,并更新交易数据的Merkle Hash值。
更新时间戳
尝试不同的随机数(Nonce),进行hash计算。
重复该过程至找到合理的hash。
打包区块:先装入区块meta信息,然后是交易数据。
对外部广播新的区块。
其他节点验证通过后,链接至区块链,主链高度加一,然后切换至新区块后面挖矿。
随机数什么时候满足?
SHA256(SHA256(版本号+前一区块哈希值+Merkle根哈希+时间戳+难度值+随机数))≤ 目标值
2.2、难度值
难度值(difficulty)是矿工们在挖矿时候的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。
2.3、难度值调整
难度值的调整是在每个完整节点自动发生的,每隔2016个区块统一自动调整难度值,每10分钟产生一个区块。
难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难。
这个公式可以总结为如下形式:
新难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160分钟 )
2.4、目标值(Target)
工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计 算公式如下:
目标值 = 最大目标值 / 难度值
其中最大目标值为一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。
我们也可以简单理解成,比特币工作量证明的过程,就是通过不停的变换区块头(即尝试不同的nouce值)作为输入进行SHA256哈希运算,找出一个特定格式哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,代表难度越大。
2.5、Merkle Tree
拥有80字节固定长度的区块头,就是用于比特币工作量证明的输入字符串。因此,为了使区块头能体现区块所包含的所有交易,在区块的构造过程中,需要将该区块要包含的交易列表,通过Merkle Tree算法生成Merkle Root Hash,并以此作为交易列表的摘要存到区块头中。
其中Merkle Tree的算法图解如下:
Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。
作用:
提高了区块链的运行效率和可扩展性
支持“简化支付验证”
2.6、挖矿的作用
产生新的比特币
维系比特币的支付功能
通过算力保障系统安全
通过不断消耗的算力与能源为比特币注入价值
2.7、挖矿经历的时代
CPU挖矿→GPU挖矿→FPGA挖矿→ASIC挖矿→大规模集群挖矿
image.png
2.8、挖矿需要注意分叉问题
区块链的分叉问题是指某一节点若收到多个针对同一前续区块的后续临时区块,则该节点会在本地区块链上建立分支,多个临时区块对应多个分支。僵局的打破要等到下一个工作量证明被发现。
会默认选择高度最高的分叉链作为主链,每一个区块代表高度为1。分叉包括,硬分叉和软分叉两种。
- 硬分叉:指比特币区块格式或交易格式(这就是广泛流传的“共识”)发生改变时,未升级的节点拒绝验证已经升级的节点生产出的区块,不过已经升级的节点可以验证未升级节点生产出的区块,然后大家各自延续自己认为正确的链,所以分成两条链。
-
软分叉:指比特币交易的数据结构(这就是被广泛流传的“共识”)发生改变时,未升级的节点可以验证已经升级的节点生产出的区块,而且已经升级的节点也可以验证未升级的节点生产出的区块。
说白了,软分叉是旧的节点并不会意识到比特币代码发生改变。
3、总结
区块链挖矿是矿工利用矿机争夺记账权的一个过程。记什么账?在区块链链上发生的交易需要放在区块当中,每10分钟产生一个区块,每个区块可以容纳的交易数量是有限的,区块当中存在随机值,矿工们通过不断的尝试这个随机值,直到满足条件,就为挖到矿。那么交易怎么在区块当中存在的?交易会依次通过哈希函数产生一个哈希值代替该交易,依次排列在merkle的根节点,然后两两根节点对应的继续哈希,称为父节点,这样哈希值数量减半,依次向上直到最后一个哈希值,称为根哈希。然后矿工通过里哈希函数,来找到对应的随机数Nonce。为什么需要6个区块来验证?是为了防止硬分叉,而且这个数字可以不是6。
如有任何问题,请与我们(DAO.ONE)联系!
1.微信公众号:daoonecommunity
2.官方网址:http://daoone.org
3.小密圈: daoone知识星球:https://t.zsxq.com/zbYVzvr
网友评论