主页 > imtoken下载app钱包 > 比特币挖矿难度简介.pdf 24 页

比特币挖矿难度简介.pdf 24 页

imtoken下载app钱包 2023-07-25 05:16:33

区块链 在比特币主链上,平均每十分钟产生一个区块。随着数字货币的发展,参与的矿工数量与日俱增,挖矿技术日新月异,全网算力也在以惊人的速度增长。在BTC中,为了保证主链的平均高度增长率保持原设置,设置了挖矿难度调整功能。深入了解挖矿难度的概念以及如何调整挖矿难度对于开发者和矿工来说非常重要,因为不合理的挖矿难度设置可能会导致全网出块速度极不稳定。本文将详细介绍BTC&BCH的挖矿难度及调整方案。让我们从 PoW 算法开始。 1. PoW 算法 PoW(Proof-of-Work)工作量证明算法是一种针对服务和资源滥用,或阻止服务攻击的经济对策。一般要求用户进行一些耗时且适当的复杂操作,而区块链案例可以由服务商快速核对,将所消耗的时间、设备和能源作为保证成本,保证服务和资源是真实的。需要使用。 PoW算法具有去中心化、单向性、随机性、易于调整目标难度等特点。因此,包括BTC、BCH在内的很多币种都采用了PoW共识机制。在实现上,PoW算法的输入是任意长度,输出是固定长度。比如SHA256算法通常用于输出256位。

在挖矿过程中,矿工使用PoW算法计算整个区块头的哈希值。由于 SHA256 的特性:如果块头的任何一位发生变化,得到的哈希值就会变得完全不同,大小变化的方向是不确定的。因此,我们比较hash值是否小于某个值(其实这个值就是区块头中保存的nBit“解压后”的current_target值)来判断是否满足要求;如果小于,则广播该块;如果不小于 ,则根据当前挖矿节点的规则改变区块头中可以改变的值,然后再次计算区块头的哈希值,以此类推,直到结果小于目标价值。可以看出current_target值越小,满足挖矿要求的概率越小,挖矿难度越大。 2. 区块头& Coinbase 交易区块链 区块头生成:矿工开始新一轮打包时,首先会创建一个空区块。块结构分为两部分:块头和块信息。先打包区块信息,再根据区块信息填充区块头。首先看一下已经打包成功的块。下图是撰写本文时捕获的最新 BTC 区块详细信息。区块信息存储了从内存池中取出的一系列交易信息。矿工基于此创建一个 Merkle 树。交易信息的哈希值作为叶子,最终生成的Merkle Root将填充到区块头中。

值得注意的是,交易列表中的第一个是一个非常独特的交易:CoinbaseTransaction。 Coinbase Transaction 与普通交易的主要区别在于: Blockchain1) Coinbase Transaction 不消耗 UTXO 2) 只有一个输入,称为 Coinbase 3) 输出地址为矿工的 btc/bch 地址 4) 值为5)值得注意的是输入中没有Unlocking-script,而是Coinbase e Data(这部分数据包括ExtraNonce,在挖矿难度非常高的时候会起到非常重要的作用) Coinbase 交易input 结构如下: Coinbase 数据,该字段的数据长度范围为 2 字节到 100 字节:区块链区块高度 Coinbase 最初没有包含区块高度信息。由于重复交易的问题,诞生了BIP30,然后是第二套解决方案BIP34)。

比特币挖矿难度周期

BIP34规定Coinbase数据的最高字节代表用来表示区块高度的数据段的字节数,后面的字节代表具体的区块高度?终端方法,创世块的高度为0。例如:在Coinbase解析2013-12-28BTC的块时,coinbase数据为0x03443b04...,块高度为16进制的0x043b44 , 和 277316 十进制; extra nonce 后面提到的 Extra Nonce 解决方案的功能会详细讲解;上面 Coinbase 数据中结尾的“/P2SH/”是 12 年矿工的产物,他们投票支持 BTC 采用 BIP16 或 BIP17,现已弃用。 (众所周知,BIP16 P2SH 获得了更多的选票,被 BTC 采用) 交易信息汇总得到 MerkleRoot 后,填充区块头。区块头结构如下(其中nBit是PoW部分提到的current-target的压缩版本):区块链区块头80字节,共6个字段:1.版本号,允许更改但不推荐2.上一个区块的hash值,不允许改变3.MerkleRoot的hash值,Merkle Tree的根节点的值,用于存储区块中的交易信息,允许更改(更改 coinbase 中输入的值) 4. 时间戳,允许根据 MTP11 调整和更改 5. nonce,PoW 算法的随机值,允许更改 6.@ > nBit,PoW算法结果必须小于这个数对应的current_target才算区块打包成功。

比特币挖矿难度周期

这个值是在每个块开始打包之前确定的。区块头 80 字节的任何值都不允许改变,PoW 的 Hash 结果会改变。区块链 3. 挖矿难度和难度调整 了解了 PoW 计算以及可能影响计算结果的因素之后,我们来了解一下难度要求是什么。挖矿难度的描述可以认为有三种形式,难度(难度值,浮点数),curren t_target(当前目标值,256-bit),nbits(32-bit);不同的形式其实表达的难度要求是一样的,这个难度要求是在每个block打包之前就确定好的。难度不是写在区块中,而是以浮点数的形式显示,给人直观的难度感受。难度 = 难度_1 / 当前目标;难度_1是一个常数: 0fff00000000000000000000000000000 000000000000000000000 创世块的current_target =难度_1,所以创世块的难度= 1.0。

比特币挖矿难度周期

nbits 是块头的 nBits 字段的值。 32 位值用于表示 256 位值。它需要牺牲一定的精度。可以理解为是“压缩”后的current_target。在计算current_target时,我们先转换成二进制,然后用公式(a)计算256位的current_target。 (值得注意的是current_target是一个无符号的25位6位值。设置一个Sign字段的原因是为了和bitcoind代码保持一致。保留的符号位是指IEEE浮点表示,其实没什么用。)区块链 这种紧凑的形式仅在比特币中用于编码代表难度目标的无符号 256 位数字,因此实际上不需要符号位,但在这里实现它是为了与 bitcoind 保持一致。计算 current_target 的公式为: 例如 nBits = 0x180192d4 , current_target = 0x192d4 * 2 ^ {(8 * (0x18 - 3))} (最高 16 位为零) 与创世块相比,current_target减少约1/( 236)倍,难度增加约7184404942701倍。

比特币挖矿难度周期

为了保持每十分钟出块的平均频率,BTC中的current_target被设计为一个动态值,current_target根据全网算力的变化进行调整,即调整挖矿难度。在BTC中,挖矿难度调整思路是:以2016个区块(两周)为一个周期比特币挖矿难度周期,每个周期根据上一周期实际时间与理论时间的差值进行调整。新目标值 = 当前目标值 * 2016 年实际出块时间 / 2016 年理论出块时间(2 周)。方案的具体逻辑是:1.判断目标值(2016的整数倍)是否需要更新,如果没有,继续使用上一个区块的目标值区块链2.计算2016块的实际使用时间:如果不到半周,则按半周计算,以防止难度增加超过4倍;超过8周的,按8周计算。防止难度下降到 4 倍以下。 3.实际使用时间乘以当前难度再除以2周4.如果超过最大难度限制,将按照最大难度进行计算过程。 Go 代码如下: 4. BCH 难度调整区块链 BCH 诞生于区块高度 478558,两条链使用相同的 PoW 共识算法(平均 10 分钟产生一个区块),因此矿工可以在 BTC 和BCH随意,但由于BCH在全网通常只占据BTC算力的7%左右,当BCH的利润大于BTC时,大量原始BTC矿工(尤其是大型矿场)会切入生物安全信息交易所所。一段时间后,随着算力的增加,难度值也会增加,矿工会离开并切换回BTC。算力的降低和高难度,让未来出块非常困难。

比特币挖矿难度周期

如果继续使用 BTC 的难度调整方案,BCH 将无法保证 10 分钟/块的稳定出块速度。 EDA),目前使用难度调整规则(DAA)。紧急难度调整规则(EDA) EDA在BTC难度调整算法的基础上增加了紧急难度调整处理方案,主要是为了及时降低出块慢的难度。算法的具体逻辑是:对于高度为2016倍数的区块,获取该高度的前2016个区块的出块时间,采用BTC难度调整方案;对于高度不是2016倍数的block,计算生成前6个block的总时间是否超过12h。 ,如果超过,将挖矿难度降低20%。具体实现代码如下: Blockchain Difficulty Adjustment Rule (DAA) 但是,在三个多月的运行中,EDA 的表现并不理想(非常差),因为它没有响应高出块率,在时间。它依赖于BTC原始的2016年区块调整机制,因此在面对算力波动时表现不佳。区块链自己截取了三条“典型”数据,为了说明以上几点:1.2017.8.26日算力攻击,2017. 8.27日大算力被切断后,出块困难,23小时仅出块13个,导致挖矿难度不断调整(降低)。

区块链1. 2017.10.2 由于矿工逐利,BCH网络的算力猛增,仅仅30个区块就出现了20多个区块分钟。区块链1.用一个更直观的数据,BTC和BCH的起跑线是一样的,都是2017年8月1日,高度478,558,截至2017年11月12日晚BTC挖到高度494,079,而 BCH 达到 503,815 的高度,增加了近 10,000 个区块。因此,区块链优化BCH难度调整方案刻不容缓。在收到几家主要矿池的稳定算力后,2017年11月13日,BCH再次升级,优化EDA。 BCH 开发团队(不是社区)收到了几个 DAA,最终采纳了 BTCABC 开发团队 Amaury Sechet 的 DAA 提案。这个提议的eda可以用一句俗语来形容,“魔鬼一尺高,路一尺高,魔鬼有天花板”。根据前一天的计算能力,可以预测需要设置多少工作才能消耗十分钟。实现逻辑如下: 1. 新算法将在高度504031处生效 2. 假设需要获取target_height的目标难度3. (prevBlock - 1 ) to (prevBlock - 1 - 2 ) 这三个区块的ntime,排序,取中间的ntime作为lastNode blockchain4. 取(prevBlock - 1 - 144) 到(prevBlock - 1 - 144 - 2)的ntime这三个块中,排序比特币挖矿难度周期,取ntime中间的块是firstNode。备注:bch的目标是10分钟出块,每天144块。原力所需的工作量:1.然后通过工作值得到目标难度。

具体实现代码如下: 区块链计算新Target方法如下: 总结区块链,DAA算法有以下特点: 根据区块链的算力逐块设置挖矿难度前 144 个区块;算力遵循指数规律变化时,网络会快速调整难度,保证公平;避免当前算力与目标难度不匹配导致的反馈振荡。它可以在一定程度上减少时间戳操纵等攻击的影响。区块链 DAA 在应对算力攻击方面的效果如何?以下是算力变化的两个极端场景:算力突然翻倍,算力突然减半。 POC代码如下:区块链5,额外的非CE解决方案区块链目前,BTC挖掘难度设置为7184440494270 1. 792(c urrent_target对应于0x17272D92 IS 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来。比目标是1/(272),但是块头的nonce字段只有4bytes,也就是32位。有可能尝试了232个随机数后,结果满足目标找不到。。

因此允许块头中的其他字段更改以生成新结果。允许更改的字段在第二个小节块头中指示。试想一下,如果你频繁更改 Coinbase Data 中的 Extra Nonce 以更改区块头的 Merkle Root 会发生什么?显然效率会很低,所以实际的挖矿策略是:尽量减少区块头中Version、TimeStamp、Merkle Root(绿区数据)值的变化,“疯狂”遍历PoW 的 Nonce 值(红色区域);当遍历后没有找到满足目标的结果时,改变绿色区域的值,然后继续“疯狂”遍历Nonce。如此循环往复,直到找到满足目标的结果或在本轮PoW竞争失败时开始新一轮的打包。区块链