1.3挖矿,矿池

xiaoxiao2021-07-27  133

目录

 

1.1 挖矿原理与区块的产生

1.2 挖矿难度


1.1 挖矿原理与区块的产生

比特币的挖矿和节点软件是基于对等网络、数字签名来发起和验证交易的。节点向网络广播交易,这些广播出来的交易需要经过矿工的验 证,矿工们会用自己的工作证明结果来表达确认,确认后的交易会被打包到数据块中,数据块会串起来形成连续的数据块链。

每一个比特币的节点都会收集所有尚未确认的交易,并且会将其归集到一个数据块中,这个数据块将和前面一个数据块集成在一起。矿工 节点会附加一个随机调整数,并计算前一个数据块的SHA-256 Hash运算值。挖矿节点不断进行重复尝试,直到它找到的随机调整数使得产生的Hash值低于某个特定的目标为止。由于Hash运算是不可逆的,因此寻找到符合要求的随机调整数将会非常困难,因此需要一个可以预计总次数的不断试错的过程。这时,工作量证明机制就发挥作用了。当一个节点找到了符合要求的解,那么它就可以向全网广播自己的结果。其他节点就可以接收这个新解出来的数据块,并检验其是否符合规则。只要其他节点通过计算Hash值发现其确实满足要求(比特币要求的运算目标),那么该数据块就是有效的,其他的节点就会接受该数据块,并将其附加在自己已有的链条之后。当挖矿时,你会经常对区块头进行散列,你正在挖的区块也会时常进行更新,一个区块头如上文所述的表1-3所示。

表1-3中的大部分数据项对所有用户都是一致的,不过,在时间戳上可能会有些区别。如果当前区块的时间戳大于前11个区块的平均时间 戳,并且小于“网络调整时间(Network-Adjusted Time)”+2小时,则认为该时间戳是有效的。其中的“网络调整时间”是指与你相连接的所有节点的平均时间。当节点A连接到节点B时,A将从B处得到一个UTC的时间戳,A先将其转换成本地UTC并保存起来,网络调整时间等于所有节点的本地UTC时间+所有相连节点的偏移量平均值,然而,该网络时间永远不会调整到超过本地系统时间70分钟以上。

Nonce随机数通常都不会相同,但是它以严格的线性方式在增长,从0开始,每次执行散列时都会增长,当Nonce溢出时(此事经常发 生),挖矿交易的extraNonce项就会增长,其将改变Merkle树的根节点。

假定针对这些数据项,人们经常会独自产生同样序列号的Hash值,那么,最快的矿机通常会赢。然而,两人产生同样的Merkle根节点基本 上(或几乎)是不可能的,因为区块中的第一个交易是挖矿交易并且会“发送”到你独一无二的比特币地址上。而你的区块与其他人的区块是有区别的,因此,产生的Hash值肯定也会(几乎可以肯定)不同,你计算的每个Hash值和网络中的其他人一样,都有同样的获胜会。会“发送”到你独一无二的比特币地址上。而你的区块与其他人的区块是有区别的,因此,产生的Hash值肯定也会(几乎可以肯定)不同,你计算的每个Hash值和网络中的其他人一样,都有同样的获胜机会。

比特币使用SHA256(SHA256(区块头))计算Hash值,但要注意字节序。

实际的Hash值是一串256位的数值,首部有许多零。当以大头端十六进制常数方式打印或存储时,它的首部有许多零;如果它以小头端打印或存储时,零就会变换到尾部。例如,如果表示成字节串-最低(或者开头)的字节串地址显示最小位的数,那么这就是小头端表示。blockexplorer的输出把Hash值显示为大头端表示的数值,因为数字的表示通常是首部数字是最大的数字(从左向右读)。

1.2 挖矿难度

挖矿难度是对挖矿困难程度的度量,即指计算符合给定目标的一个Hash值的困难程度。比特币网络有一个全局的区块难度,有效的区域必 须有一个Hash值,该Hash值必须小于给定的目标Hash值。矿池也会有一个自定义的共享难度,用来设定产生股份的最低难度限制。

难度每过2016块就会改变一次,计算公式为:

difficulty=difficulty_1_target/current_target

其中,目标(target)是一个256位长的数值。

测量难度有许多不同的方法,通过这些方法得到的difficulty_1_target有可能也会不同。传统情况下,它表示一个Hash值,前32位为0,后续部分为1(称之为矿池难度或pdiff),比特币协议把目标Hash值表示成一个固定精度的自定义浮点类型,因而,比特币客户端用该值来估计难度(称之为bdiff)。

难度经常被存储在区块中,每个块存储一个十六制的目标Hash值的压缩表达式(称之为Bits),目标Hash值可以通过预先定义的公式计算 出来。例如:如果区块中压缩的目标Hash值为0x1b0404cb,那么十六进制的目标Hash值就为如下形式:

 

0x0404cb×2 8×(0x1b-3) =0x00000000000404CB000000000000000000000000000000000000000000000000 因而目标Hash值为0x1b0404cb时,难度为: 0x00000000FFFF0000000000000000000000000000000000000000000000000000/0x00000000000404CB000000000000000000000000000000000000000000000000 =16307.420938523983(bdiff) 或者: 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/0x00000000000404CB000000000000000000000000000000000000000000000000 =16307.669773817162(pdiff) 其中: 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 是挖矿机使用的最大目标Hash值。而 0x00000000FFFF0000000000000000000000000000000000000000000000000000

则是比特币网络使用的浮点编码类型,后面的位数被缩短了。

最大难度大约等于maximum_target/1(因为0会导致无穷大),这是一个非常大的数值,大约为2 224 ;当maximum_target为最小值1时,则最小难度值也为1。难度可根据以前2016个区块的产生时间而定,每过2016块就会改变一次预计每隔10分钟产生一个区块,因而产生2016个区块要花费2周时间。如果前2016个区块的产生时间多于两周,则难度会降低;否则难度就会增加

 

其中,难度是当前的难度,算力是指矿机的计算能力,以hashes/s为单位,时间是你找到两个区块的平均时间。

具体实现需要请留言,我会飞机票发过去, 这写感觉写的不太完整。

转载请注明原文地址: https://www.6miu.com/read-4823371.html

最新回复(0)