比特币挖矿淘汰 说说比特币的“全网难度”

币种 2周前 (06-23) 12次浏览 0个评论

最近,很多朋友问我如何理解比特币的“全网难度”。每个人都在纠结这个东西是什么,它意味着什么,以及它是如何调整的。本文将尝试澄清这些问题。

0. 先决条件

从对区块链、比特币比特币挖掘的一些了解开始。

1.区块头结构及挖矿

比特币区块头共80字节

struct header_structure {      // BYTES   NAME
 uint32_t nVersion;            // 4       version
 uint8_t hashPrevBlock[32];    // 32      previous block header hash
 uint8_t hashMerkleRoot[32];   // 32      merkle root hash
 uint32_t nTime;               // 4       time
 uint32_t nBits;               // 4       target
 uint32_t nNonce;              // 4       nonce
};

比特币区块头结构

简单地说

2.目标值(目标)

区块头中的Bits字段标识Hash后应该小于或等于当前区块头的目标值(target)。注意块头的SHA256结果有256位,而Bits只有32位(4字节)。 Bits 通过以下操作获得目标。以277316区块为例

Bits值(十进制),该值以系数/指数格式存储,前2位16进制为幂,后6位为系数。本区块中,0x19为幂( )和系数( ),计算公式为

target = coefficient * 256^(exponent – 3)

所以这个块的目标值为

target = 0x03a30c * 256^(0x19 - 3)
       = 238,348 * 256^22
       = 22,829,202,948,393,929,850,749,706,076,701,368,331,072,452,018,388,575,715,328

十六进制

也就是说,高度为277316的有效区块头信息的hash值必须小于或等于这个目标值。区块高度277136的hash值其实是

3.难度()

从中本聪的创世区块可以看出比特币挖矿淘汰,当Bits为(十进制)时,难度()为1(注意区块头中没有存储字段)

根据Bits计算得到的目标是*256^26,也就是00。也就是说,为了构造下一个合法区块,需要不断地对区块头进行SHA256运算比特币挖矿淘汰,直到得到一个hash结果找到块头,前32位的值为0(小于target

比特币挖矿淘汰_比特币挖矿淘汰_比特币挖矿教程

SHA256运算的结果被认为是一致的随机序列。可以说SHA256结果中某位的值是0或1的概率相同。所以做一个计算满足以上条件(前32位的值都是< @0) 是 1 / (2^32),即平均需要 2^32 次操作才能找到这个值

为了便于理解,我们定义为了使块头的SHA256结果小于某个目标值(target)而要尝试的平均计算次数,为难度(),1≈2^32次 = 次 ≈ 4.2 * 10^9 次 ≈ 4G 操作

比如最近几天的区块501509,Bits值是(十进制),目标是*256^21。创世块的目标是*256 ^ 26,难度为1,因此获得块501509的难度为

(0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21)
= 65535/38469 * (256^5)
= 1.703579505575918 * 2^40
= 1873105475221.611
≈ 1.87 * 10^12

即1.87T (1T = 10^12)

方块高度#501509

综上,可以得到公式

difficulty_当前 = target_创世区块 / target_当前

其中,区块为固定值00,根据当前区块头中的Bits字段计算

比特币挖矿淘汰_比特币挖矿淘汰_比特币挖矿教程

同时可以得出另一个结论

出块时间(单位:秒) ≈ difficulty_当前 * 2^32 / 全网算力

当前比特币全网难度1.93T,全网算力15.32EH/s(15.32E哈希计算在1秒),计算出的输出块时间约为。

1.93T * 2^32 / 15.32EH/s
= 1.93 * 10^12 * 4.295 * 10^9 / 15.32 * 10^18
= 8289.35 * 10^18 / 15.32 * 10^18
≈ 541 秒

总结

4.难度()调整

如前所述,区块头目标哈希值(target)决定难度(),进而影响比特币出块时间。按照设计,比特币应该保证每10分钟的平均出块速度,这是新比特币发行和交易完成的基础,需要长期保持相对稳定。

矿机不断更新淘汰,矿工不断加入和流失,导致全网算力实时变化,但整体在不断提升。为了保证比特币的平均出块时间稳定在十分钟左右,需要定期调整难度。

难度调整逻辑写在代码中,在每个全节点中独立自动发生。每 2016 个区块,网络中的所有全节点都会调整难度。难度调整公式是通过将生成最新的 2016 块所需的时间与 20160 分钟(两周,即这些块预计以 10 分钟的速度生成所需的时间)进行比较来计算的。难度会根据实际时长与期望时长的比值进行相应的调整(更难或更容易),简单来说,如果网络发现出块速度快于 10 分钟,就会增加难度。如果你发现它慢于 10 分钟,请降低难度。

这个逻辑可以简单表示为

Difficulty_新 = Difficulty_原 * ( 20160分钟 / 产生2016个区块的实际花费时长 )

比特币挖矿淘汰_比特币挖矿教程_比特币挖矿淘汰

从代码中可以看出,为了防止难度变化太快,在每个周期调整的时候,如果调整范围超过4倍,就只调整4倍(难度调整为4倍)或 1 /4)调整

unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
{
    if (params.fPowNoRetargeting)
        return pindexLast->nBits;
    // Limit adjustment step
    int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
    if (nActualTimespan < params.nPowTargetTimespan/4)      //  params.nPowTargetTimespan*4)      // <==== 看这里
        nActualTimespan = params.nPowTargetTimespan*4;
    // Retarget

比特币挖矿教程_比特币挖矿淘汰_比特币挖矿淘汰

const arith_uint256 bnPowLimit = UintToArith256(params.powLimit); arith_uint256 bnNew; bnNew.SetCompact(pindexLast->nBits); bnNew *= nActualTimespan; bnNew /= params.nPowTargetTimespan; if (bnNew > bnPowLimit) bnNew = bnPowLimit; return bnNew.GetCompact(); }

再次请注意,难度调整是通过调整区块头中的Bits字段来实现的。区块头不直接存储全网的难度()字段

5.总结

至此,相信你已经知道文章开头问题的答案了。简单来说,就是比特币全网难度()

6.参考

挖矿网Ethos中文站简单易用的挖矿系统,为挖矿产业提供教程软件以及矿机测评交易信息等,挖矿网各种数字货币挖矿收益对比计算,挖矿网介绍挖矿的工具,以及矿场的最新消息等。http://www.ethospool.com/

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址