主页 > imtoken钱包手机安卓版下载 > 比特币哈希计算复杂度

比特币哈希计算复杂度

比特币难度

首先,我们来看看难度是怎么来的。在比特币挖矿中,有一个计算哈希的目标值。目标值越小,难度越大。简单来说,难度就是计算当前目标值的难易程度的指标。

难度计算公式如下:

diff = diff_1_target/targetHash

目标值是一个非常大的数字。这里有一个 diff_1_target。顾名思义,这是难度为1时的目标值。这是一个常数,非常大的数字。这个值是用0x1d00ffff标记的数字,这个标记是压缩标记,它的实际值是:

0x00ffff * 2^(8*(0x1d - 3)) = 0x00000000FFFF000000000000000000000000000000000000000000000000000

计算时以最后三个字节为基数,第一个字节1d代表幂数,最后得到上面的数。矿池在挖矿时也可以保留的尾数,即

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

至于比特币的挖矿难度,根据上式,与diff_1_target和当前网络目标值(targetHash)有关。代入 diff_1_target 的值得到:

diff=0x1d00ffff/targetHash

调整难度时,只需要调整targetHash的大小即可。 targetHash越小,难度越大;否则,难度越小。矿池一般用一个值后跟FF来表示diff_1_target,计算出来的难度称为矿池难度pdiff。如果用 00 后面的值来表示 diff_1_target,那么计算出来的难度值就是比特币客户端难度 bdiff。这只是为了说明它们有两个值,代表不同的计算方法。其实他们的计算难度差别不大。

diff_1_target 这是难度系数的常数,位系统会给出diff难度系数的值,也就是难度变量

调整网络难度的目的是将出块速度调整为平均每10分钟1个块,每2016个块调整为一个周期,这样正好2周为一个周期如果这 2016 个区块的平均值为 10 分钟出块速度快于 1 个区块,那么在保持这个难度的同时,难度将增加到 10 分钟 1 个区块的水平。什么时候调整难度?由于 2016 年的周期从未改变,因此可以计算出该周期中剩余的块数:

本周期剩余区块数 = 2016 - (当前区块高度 % 2016)

以当前最新区块#482017为例

当前高度 % 2016 = 482017 % 2016 = 193

比特币算法原理

本周期剩余块数 = 2016 - 193 = 1823

也就是这个周期只会出193个区块,等到1823个区块之后才会调整难度。密件抄送也是如此。

矿工难度计算

挖矿时,计算出的区块哈希值小于当前目标哈希值。这个哈希值是一个范围很广的值(从0到(2^256)-1),这个值只能靠矿机蛮力算出来。

1.基本理论与计算方法

如果当前难度是diff,那么根据我们上面讲的公式

diff = diff_1_target/targetHash

2.公式推导

把diff_1_target = (0xffff * (2^208))这个是难度系数常数,位系统会给出diff难度系数的值,即Difficulty变量,代入上式,

diff_1_target,即0x00000000FFFF000000000000000000000000000000000000,FFFF后面有26个字节,即8 * 26 = 208位,所以diff_1_target可以写成0xffff * (2^20<@k).

6

@k6

然后简化它

targetHash = diff_1_target/diff = (0xffff * (2^208)) / diff

得到以下公式

比特币算法原理

targetHash = (0xffff * (2^208)) / diff 标记公式 (1)

3.targetHash每次hash的概率和小hash值的概率,以及计算机CPU需要运行hash的次数

sha256一共有2^256个hash值,所以每个hash值的概率是1/(2^256),找到小于targetHash的hash值是有效的,所以是发现targetHash小的hash值(0~targetHash之前的hash个数)的比值是targetHash*(1/(2^256)),

要搜索这个小于targetHash值的hash值,需要计算的hash数是2^256/targetHash。也就是说,要找到这个值,计算机需要运行的平均哈希数是 (2^256) /targetHash

因为每10分钟产生一个块,需要在10分钟内计算出满足目标的值,那么大约600秒计算的哈希数为(2^256)/targetHash

p>

即每秒计算量((2^256)/targetHash)/600--->((2^256)/600)/targetHash标记公式(2)

这里有三种数据

1.每个hash的概率是1/(2^256)

2.找到高于targetHash的值的概率为targetHash/(2^256),即相当于找到targetHash的哈希运算次数为:(2^256)/targetHash

3.10分钟生成一个块,那么计算机每秒计算的哈希数为((2^256)/600)/targetHash 将此变量标记为cpu_hash_hz

4.公式推导

代入公式(1)(2)可用

cpu_hash_hz = ((2^256)/600)/targetHash = ((2^256)/600)/((0xffff * (2^ 208)) / diff) 标记公式(2)

((2^256)/600)/((0xffff * (2^208)) / diff) ---"

比特币算法原理

(diff*(2^256)/600)/((0xffff * (2^208))) 将分母下的 diff 除数移到分子上 -- -》

(diff*(2^256)/600)/((0xffff * (2^208))) 将分子下的除数600移到分母-- -》

(diff*(2^256))/(600*0xffff * (2^208)) 取消(2^208)---”

(diff*(2^(256-208)))/(600*0xffff) 再次简化---"

(diff*(2^48))/(600*0xffff) 然后去掉分母0xffff---"

(diff*(2^32))/(600)标记公式5

cpu_hash_hz = (diff*(2^32))/(600)标记公式5

假设当前全网难度为888171856257,即diff = 888171856257,(2019年11月29日发现的最新diff值已经是12,973,235,968,799)

然后由公式5

cpu_hash_hz = (diff*(2^32))/(600)=(888171856257*(2^32))/600 =3814669075851427971072/600 = 6357781793085713285.12次

即当全网难度为888171856257时,平均需要635778179308571328次哈希运算才能得到一个块。

即6.35778179308571328512*(10^18)次

全网算力5.68 EH/s,大概接近这个数值。

如果我们的个人电脑平均每秒有 1 亿个哈希值,即 10^8,那么计算这个值的时间是

6.35778179308571328512*(10^18)/(10^8) = 6.35778179308571328512*(10^10)=63577817930sec=(63577817930 /(24*3600*365))year=2016,所以用个人电脑基本不可能在10分钟内计算出hash值。

比特币算法原理

单位

1 kH/s = 1,000 哈希每秒 1000 哈希每秒 10^3

1 MH/s = 每秒 1,000,000 次哈希。每秒 100 万次 10^6

1 GH/s = 每秒 1,000,000,000 次哈希。每秒 10 亿次 10^9

1 TH/s = 每秒 1,000,000,000,000 个哈希值。每秒 1 万亿次 10^12

1 PH/s = 每秒 1,000,000,000,000,000 个哈希值。每秒 1000 万亿次 10^15

1 EH/s = 每秒 1,000,000,000,000,000,000 个哈希值。 100 万 teraflops 10^18

挖矿收益的计算

我们已经看到了难度和计算能力之间的关系。难度越大,所需的计算能力就越大。那么以1Th/s为单位的云合约标准算力,一天能实现多少收益呢?

一天可以计算的哈希数 = 1T * 86400

假设当前难度是diff,那么

产量 = 1T * 86400 / diff / ( 2 * 32) * 块返回

比特币区块的Mekgan是将区块内所有交易的哈希值拼接起来,然后作为一个整体进行哈希处理

每笔交易的输出为:UTXO(未消费)区块地址和索引、公钥、签名(证明自己所有权的私钥签名)

交易发送的签名由钱包地址+私钥计算得出,那么可以通过以下步骤来验证UTXO是否属于发送者

比特币算法原理

1.验证公钥和钱包地址(公钥可以推导出钱包地址),如果不验证,则钱包不属于公钥,直接交易是非法的

2.公钥和钱包地址都是公开的比特币算法原理,任何人都可以拿到别人的公钥和钱包地址,所以第一步只是基础验证,不能证明发起者有所有权钱包,只能证明公钥和钱包匹配

3.用签名解密公钥。如果获取的数据是钱包地址,则证明发送者拥有钱包地址的私钥,则证明发起者拥有钱包的所有权

如果有两个用户A和B,他们的钱包地址是A_ADDR,B_ADDR,公钥A_PUBLIC_KEY,B_PUBLIC_KEY,签名A_SIG,B_SIG,签名是用名为A\B的私钥计算的,没有私钥给别人别人的签名。假设现在用户B要使用A的钱,系统可以判断该交易是非法的,因为交易过程中的逻辑如下。

1.假设B使用:A_ADDR B_PUBLIC_KEY B_SIG(只能用这个或者随便创建一个,但是和A_SIG一样比特币算法原理,基本不太可能)

本次交易的第一步,由于B_PUBLIC_KEY不能直接hash256/160 addr和A_ADDR不一致,直接判断非法交易,没有钱包权限

2.假设 B 使用:A_ADDR A_PUBLIC_KEY B_SIG 发送交易(你只能使用这个或随机创建一个,但像 A_SIG 一样,基本上不太可能)

本次交易在第三步被A_PUBLIC_KEY和B_SIG解密,得到的addr与A_ADDR不一致,判断交易非法,没有钱包权限

所以通过以上两个过程认证,只要用户B拿不到A的私钥,就不可能发出A的有效签名,也就不可能使用A的钱包,从而保证了安全用户资金

签名验证过程:UTXO的hash和钱包地址通过私钥计算得到一个x

根据UTXO的hash和钱包地址,再用公钥计算,得到一个y

x 和 y 不能互相推,直接从 x 中求出匹配 x 的 y 是非常困难的,然后 x 和 y 的计算能量 = 0,证明私钥有效且签名有效

用户在比特币中的钱包地址(收钱的地址)经过公钥哈希,然后HASH160,所以地址可以从公钥计算出来,但是钱包地址不能推导出公钥。

一个用户可以创建多个钱包地址(就像一个用户可以持有很多张银行卡一样),每个钱包地址由一个公钥计算,公钥由私钥生成。

所以用户要新建一个钱包地址,系统随机生成一个0~(2^256-1)的大数据作为私钥,然后从私钥计算出公钥,最后用公钥计算出公钥,密钥是hash256和hash160计算出钱包地址。

即可以推导出公钥==================钱包地址在交易中,即UTXO交易区块地址和索引以及用户发送的公钥可用于第一层验证钱包地址是否与公钥匹配。

私钥导致公钥(反之亦然),公钥导致公钥哈希(反之亦然),公钥哈希导致钱包地址(反之亦然)