大家好,今天小编带来分析比特币区块链上节点数量下降或因矿工退出而导致的问题,以下是小编对此问题的归纳整理,来看看吧。
分析比特币区块链上节点数量下降或因矿工退出而导致
三言财经12月23日消息,据CCN报道,Bitnodes数据显示,比特币区块链上的可到达的节点数量在2018年从11845降至95***,下降了18.98%。

在同一时期,无法到达的节点数量也从98000降至65500,下降了33%。比特币区块链上的可达节点是一个既发送又接收来自比特币网络的连接的节点,而不可达节点只能进行传出连接,不能接受传入连接。无法到达的节点不接受传入的连接,因为它们要么位于Tor这样的防火墙后面,要么受到网络地址转换-NAT-的保护,后者在通过路由器传输数据包时修改IP报头中的网络地址信息。

从理论上讲,区块链上存在大量无法访问的节点是一个好消息,因为与可访问的对等节点相比,这实际上增加了黑客路上的障碍,从而使网络更加安全,并且增加了对去匿名化的***。然而,在实践中,可达节点在比特币协议中起着重要作用,因为只有它们能够作为完整节点运行,对所有的区块链交易进行完整的记录。
这保持了比特币区块链的完整性。过去一年观察到的可达节点数量下降有很大可能是因为比特币矿工退出导致。2019年的市场状况是否会改善并鼓励这些矿工的回归还有待观察。

全球区块链发展现状?
解决比特币区块链不断膨胀的问题的主要方法还是扩容,这也是最近比特币出现分歧的主要原因。比特币网络传输的数量有了很大的增长,在一定程度上引发了比特币网络的传输拥堵。为解决此问题,比特币核心开发者加文·安德烈森提出将区块扩容到最大上限20M。目前全球比特币行业对此存在较大的争议。中国矿池生产区块占全球约43%。部分国际讨论者支持加文·安德烈森的观点,但这势必会对中国矿场造成一定伤害。在社区讨论中,部分激进的外国讨论者认为不用考虑中国的宽带情况,如果中国矿工无法完成挖矿任务,在没有中国人的情况下也可以继续比特币事业。但就目前实际情况来看,比特币生产环节几乎一半分布在中国地区,因此中国对比特币基础设施的相关事宜尤其是挖矿领域有着重要的发言权。目前,中国的几大矿池均明确表示反对比特币扩容***。
区块链和比特币(一)
区块链(Blockchain)是一种很早就被学界提出但近几年才被比特币带火的一个概念。比特币是基于区块链技术的一种实现,比特币是一种加密货币,或者叫数字货币也可以。我们先以比特币入手谈谈比特币是怎么利用区块链技术的。
***设06年世界杯决赛期间,两个互相不认识的足球迷碰到了,意大利打法国,法国球迷说我们法兰西有齐达内肯定赢你们意大利,意大利球迷不服气说我们意大利是战无不胜的,不信咱俩赌100欧元。现实世界里,怎么办呢?
我之前讲过我们搞计算机的,90%以上的时间都在处理异常情况,如果人类都很讲信用的话,那这个世界可能就不是现在这样了。秦国当年许给楚怀王那600里地就不是6里了,说不定统一中国的就是楚国了呢也说不定。如果把钱交到第三方手里,万一第三方也跑了怎么办?把钱私吞了。所以现实的陌生世界单靠一颗善良的心是靠不住的,必须有手段稳稳地保证这个承诺,法律契约等。如今很通用的做法是第三方要找权威机构,比如***,银行等,要么找个有头有脸的人或组织,归根结底还是找个有公信力的机构或人。但一般情况下这个第三方肯定会“雁过拔毛”,收取一定比例的手续费。
那么到底还有没有办法来解决这个难题呢?这就是比特币最初设计的一个初衷,解决两个陌生人之间的信任问题。
加密算法 + 多人记账
首先说加密算法,这里又要我之前提过的非对称加密,即公钥私钥。每个人都可以有一对或多对公钥私钥,但一个公钥只能有对应的私钥,反之亦然。其原理就是两个非常大的质数(p和q)相乘得一个数字(n),如果要根据公钥破解私钥的话理论上必须暴力破解,算出这个数字是由哪两个大质数相乘得来的。目前世界上没有公布可以破解***位以上的私钥,所以***用***或者2048甚至更长的私钥是非常安全的。
那么有了公钥私钥,我作为个人就可以用私钥加密,然后发布公钥,任何人都可以用我的公钥解密来确定这就是我本人发布的东西。同理别人给我的转账我也可以用他的公钥解密,从而判断这个就是某人的身份,这也叫数字签名。原理都是一样的,都是加密算法,利用数学欧拉公式,质数相乘等原理得到的。这是个非常伟大的算法,叫RSA,由3个数学家提出,我们普通人只要理解到公钥私钥的概念和用处就好了。
之前传统模式里,银行或者***机构都有自己单独的账本,比如张三转给了李四100块,那账本里怎么记?张三的账户里扣除100, 李四的账户里增加100,对吧?
多人账本也是一样的道理,只不过从之前的中心化机构变成了分布式,去中心化的多个机构甚至个人。好比李白给杜甫转了100两银子,以前是财政部记账,区块链里则是唐太宗,杨玉环,张小静,贺知章等多个人一起记账,记到李太白转给了杜子美100两银子,以此为证,后面附有李白的印章。这样一来,有了多个账本,想要篡改那就难于登天了,李白可以放心的转给杜甫并且不担心他会篡改金额或者抵赖。
这样做就可以解决开始提到的球迷打赌的问题,但还有个问题,别人为什么要帮我们记账?
答案是有报酬,这符合人性,不然谁肯帮忙记一笔跟自己没关系的账呢?
但最终记账的人有且只有一个,不然就要乱套了。
有好处的前提下,如何保证哪一个人来记账呢?这里要涉及到一个数学知识,每个要记账的人,其实也就是所谓的矿工他在记账钱必须要解一个数学问题,这个数学问题没有取巧的办法,只能通过把数字带入公式里硬算,算法就是一个Hash(哈希)算法,类似于算一串数字出来,矿工只可以猜,除此之外别无他法。而且目前比特币里这个猜到的概率是万亿分之一,大概一台普通计算机要持续不断的猜一年才可以猜出来这个数字。
但世界上有成千上万台计算机,它们如果一起算的话速度会快很多,因为从概率上讲肯定会有一个计算机算出来,现实情况也确实如此。看个比特币真实的例子。
除此之外,还可以看到Miner(挖矿人)是谁, 这个块里包含了多少比交易(Number of Transactions)。
如果这个矿工是个别有用心的人,他在算出来后,私自篡改转账记录和金额怎么办?
A. 篡改交易记录 / 金额
前面我们介绍了公私钥加密技术,矿工本身理论上是没有发款人或收款人的私钥的,所以他篡改过的交易记录在用正确的公钥解密的时候会出错,最终被认定为非法(这里作者本人不太确定是在什么时间点做的鉴定,但确定这个记录是可以被证伪的)。
B. 删除交易记录
***设一个场景,张三要在北京4环买一个两室一厅的房子,但张三不想出这钱还想白占房子,想到了一种偷鸡摸狗的办法就是篡改交易记录。理论上,在张三付款后,这个记录产生但并未确认,记录需要等到一个解出谜题的矿工来做,***设这个矿工是他自己人,他让矿工把这条记录抹掉,没有问题。但做法有几种:
众所周知比特币挖矿需要很长一段时间,因为要做提到很麻烦的数学题,现在这个周期大概是10分钟所有,这是基于全世界几十万矿机同时满负荷工作的前提下。也就是说每十分钟有上万笔交易会被统一确认并放到一个不可改变的区块里,并且这几十万台矿机同时更新自己本地的记录。
2.1 如果这笔交易刚生成,房东看到了,然后下一秒就把产权过户给张三,那么张三如果想篡改这个付款记录他必须满足几个条件:
成功的难度取决于在篡改的记录之后有多少块被确认过的区块。如果只有一个,那么太简单了,因为区块链算法默认矿工在发布新的区块时,***用第一个收到且较长的区块。所以这次修改后就一劳永逸,因为所有的账本都会背同步,但也有一个问题,就是这次同步会被记录,如果房东查不到账,张三最终还是会被抓起来的。如果有很多个,比如张三转账完后,房东在确认转账后1小时才做的产权过户,那么张三就必须篡改之前差不多6块左右的区块信息,这个很麻烦,因为每一个区块都会指向上一个区块,并且每个区块都会有一个摘要(Hash),这是当前区块所有交易记录的汇总。所以如果试图修改一个很久前的区块,那么后面的区块的摘要都会变掉,这就是哈希树(MerkleTree)。其他节点是可以报告区块链被篡改的信息的。这就要涉及到最重要的一点,经常有人提到的51%算力,就是说如果张三拥有了超过50%的账本都承认这次修改,那么其他节点按照算法设计也会承认这次修改。不过,先不谈世界上基本没人可以同时做到以上两点,就算做到了,如果有人对此有疑问,依然可以把系统强制修复,之前以太坊就出过类似的问题,结局是以太坊篡改了整个区块,追回了被盗取的财产。 以太坊分叉*** 。
以上只是粗浅的介绍了应用区块链技术实现的比特币的特征,它可以很好的实现公开,公正,中立和平等。世界上任意两个陌生人可以依赖比特币或者其他区块链技术实现互相信任。
超详细!当最后一枚比特币开***完后,比特币矿工将何去何从?
1、比特币一共可以开***2100万枚,预计将在2140年左右开***完毕。
2、一旦比特币开***完即流通量达到最大,比特币矿工将不再获得区块奖励。
3、***设从现在开始,比特币在开***完之前没有出现重大协议更改,矿工将只能获得交易费作为奖励。
众所周知,比特币的总数只有2100万枚。一旦开***完成,就代表着不会再有新的比特币进入流通市场了。
所以比特币是不断通缩的,它不同于国家货币,因为法定货币会不断增发,导致通货膨胀,钱不再值钱,因此***从而可以从中受益。
而对于比特币来说,总数固定的情况下,每年不断的被开***出来的比特币会越来越少,而这些新币将会使比特币越来越值钱,这是供求不平衡关系导致的,通缩才是比特币最值钱的地方。
虽然比特币开***了所有2100万个BTC后,它的比特币网络基本还会跟现在一样运行,但对矿工来说,开始出现区别了。
比特币的矿工大约每十分钟,就可以发现一个新区块,当矿工成功的解决了密码难题,就可以将新发现的区块添加到区块链中。而作为发现区块的奖励,矿工可以获得固定数量的比特币,这被称为“区块奖励”。
比特币首次推出时,奖励被设置为50 BTC,但每210,000个新区块奖励减少一半,大约每四年奖励少一次。
因此,随着时间的流逝,区块奖励会减少到25 BTC,12.5 BTC和6.25 BTC。
现在已经完成了第三次减半即在2020年5月比特币完成了第三次区块奖励,现在的区块报酬只有6.25 BTC。而下一个减半预计将在2024年发生。
在最后一枚比特币被挖出来之前,矿工还是可以继续获得区块奖励的,不过比特币一旦全部被挖出来以后,就不会再有新的比特币流入市场了。
短短十年内就被挖出了超过1,869万枚BTC,相当于最大供应量的89%。但是,有趣的是,想挖出最后一枚比特币还得挖120年。
一旦所有2100万比特币都被挖出之后,比特币矿工仍将能够参与发现区块的过程,但不会得到区块的奖励。
但是除此之外,比特币矿工还是有其他收入的。
除区块奖励外,比特币矿工还可以获得在每个新发现的区块中包括交易上花费的所有费用。
现在的比特币交易费仅占矿工收入的一小部分,因为矿工目前每天的区块奖励约为900 BTC(约合3980万美元),但每天可赚取60至100 BTC(260万美元至440万美元)的交易费。这意味着交易费目前最多仅占矿工收入的11%,但到2140年,交易费将激增至矿工收益的100%。
2017年12月(交易费用达到2021年4月中旬的峰值),当比特币的价值为14,000美元时,每天支付的总交易费用飙升至1,495 BTC。
结果,矿工当天赚取了总计2100万美元的交易费,这大概是他们当天从区块奖励中赚取的一半。
自2017年以来,随着交易批处理和协议升级,比特币用户额外支付了5亿美元的交易费用。
在网络活跃期间,比特币交易费用通常会飙升。随着比特币网络充斥着待处理的交易,矿工倾向于优先选择收费较高的交易。而在5月减半期间,比特币收费达到了自2019年夏天以来的最高水平。
此外,早在2019年8月,比特币的总交易费用已接近10亿美元大关。目前,比特币总交易费用已接近20亿美元。
随着比特币网络的使用量激增,那么对区块空间的竞争可能会急剧增加。这会增加矿工的交易费奖励,而比特币的价格上涨和逐渐降低的能源成本(新能源的出现)意味着其中依旧有利可图。
在2017年的峰值时发送比特币的平均成本为55.17美元。2021年4月21日,该数字创下了 历史 新高59.87美元。在此之前的十天,它只有14.86美元;平均交易费用飙升了300%以上,这说明只要有更多的人使用网络通就会有更高的交易费用。
如果比特币矿工无法接受从区块奖励到交易费用的奖励结构方式的转变,直接选择不挖了怎么办?
这是一个很有趣的***设,既然奖励结构转变了,那么肯定会有一些比特币矿工不服这个机制,他们如果在开***完之前***了,不开***比特币了,那么比特币网络会出现什么情况呢?
不管***的矿工数量多不多,其实区别并不大,因为矿工数量减少会直接导致全网算力下降。而比特币网络会根据全网算力来调整数学题的难度,来保障大约10分钟左右出一个新区块。
简单来说,反正只要有人挖,比特币最后一定会被挖到2100万个,矿工越少,单次挖出来的数量就越多,剩余的矿工恨不得没有人跟他们抢,当然那时候比特币得没有归零。(哈哈)
如果所有矿工都***了呢?
那这事情就大条了,因为确认交易是需要新的区块才行的,矿工全体***,区块不生产了,那么未来就也不会花费任何一枚比特币。
但是使用比特币的人们仍然可以查看哪些钱包地址持有比特币,持有多少比特币,并且还可以查看曾经进行的每笔比特币交易的全部 历史 记录。
交易才能赋予价值,都没有区块来确认交易信息了,那比特币就真的世界末日了。
不过区块链已经起来了,你比特币倒了,还有其他加密货币站了起来,矿工又不是只能选择比特币,话说真的有人会放着白花花的银子不要吗?
先普及一个小知识:在很偶然的情况下,比特币网络中会同时产生两个(或多个)区块,这就会导致区块链出现临时分叉,当两个临时分支的长度出现了一长一短后,短的那个(少于 2 个区块)分支就会被放弃,短分支上的所有区块被判定无效,这些区块中的所有交易记录当然也就被判定为无效了,而我们常说的51%攻击就是通过这种方式,通过制造出分叉,把自己的分叉区块加长超过另外的分叉,好让自己的区块成为主流。
比特币开***完毕后,将不会有新的比特币被挖出,但是矿工依旧可以发现新的区块,那么问题来了,如果有矿工发现了一个新的区块,不选择释放它,而是保留,那么网络就会利用额外的***再来挖一个区块,这些被保留的区块便暂时不会进入区块链中。
接下来就是在交易费用是100%收益的制度下,好矿工就是挖出区块,添加至区块链中,获得交易费作为报酬,但那些作恶的矿工则可以通过持有保留的区块更长的时间来赚更多的钱,简单说,在交易费100%的未来,这种坏矿工比好矿工更赚钱!
比如说:现在甲较早的发现一个区块后,说服另一个矿工乙来扩展自己的区块。
在仅奖励矿工交易费用的网络中,甲可以说服乙扩大甲矿区的区块,并包括较少的交易费用。如果甲那未授权交易费用的区块大大低于其他区块块中包含的费用,那么使用甲的区块将符合乙的利益。
如果甲和乙两人一起将保留的区块延长,超越另外分叉的区块长度,那么甲和乙就可以将自己的区块作为主流,而短的那一截区块将会被放弃。
这意味着一旦成功,甲和乙的区块中的交易记录可以随意改写,比如这么跟你说,甲跟丙以1比特币兑换金钱,甲将1比特币转入了丙的钱包后,甲也从丙处获得了钱,现在甲发动51%的攻击,甲转移出去的1比特币又再一次回到了自己手中,这样甲不但拿到了钱,比特币也还在自己的钱包中。
这种作恶行为在很大程度上会影响很多人。
可以预见的是由于交易费作为100%的激励机制,将会使这种削弱主流算力的行为在比特币网络中变得普遍可见,那么比特币网络的可怕的“ 51%攻击”也会突然变得可行起来。
因为作恶的矿工始终会挖掘自己的块,而其他矿工却不会统一的挖一个区块。这将使51%的攻击成为可能,而散户的算力却远远低于51%。”
交易费用可能不足以为网络安全提供足够的激励,所以大大增加了51%攻击的可能性。”
但是不要害怕,除非比特币网络彻底没人玩了,全网算力低的不行,不然想要作恶的成本实在是太高了,这种情况出现在比特币网络中可比上天还难。
详解比特币挖矿原理
可以将区块链看作一本记录所有交易的公开总帐簿(列表),比特币网络中的每个参与者都把它看作一本所有权的权威记录。
比特币没有中心机构,几乎所有的完整节点都有一份公共总帐的备份,这份总帐可以被视为认证过的记录。
至今为止,在主干区块链上,没有发生一起成功的攻击,一次都没有。
通过创造出新区块,比特币以一个确定的但不断减慢的速率被铸造出来。大约每十分钟产生一个新区块,每一个新区块都伴随着一定数量从无到有的全新比特币。每开***210,000个块,大约耗时4年,货币发行速率降低50%。
在2016年的某个时刻,在第420,000个区块被“挖掘”出来之后降低到12.5比特币/区块。在第13,230,000个区块(大概在2137年被挖出)之前,新币的发行速度会以指数形式进行64次“二等分”。到那时每区块发行比特币数量变为比特币的最小货币单位——1聪。最终,在经过1,344万个区块之后,所有的共20,999,999.***69亿聪比特币将全部发行完毕。换句话说, 到2140年左右,会存在接近2,100万比特币。在那之后,新的区块不再包含比特币奖励,矿工的收益全部来自交易费。
在收到交易后,每一个节点都会在全网广播前对这些交易进行校验,并以接收时的相应顺序,为有效的新交易建立一个池(交易池)。
每一个节点在校验每一笔交易时,都需要对照一个长长的标准列表:
交易的语法和数据结构必须正确。
输入与输出列表都不能为空。
交易的字节大小是小于MAX_BLOCK_SIZE的。
每一个输出值,以及总量,必须在规定值的范围内 (小于2,100万个币,大于0)。
没有哈希等于0,N等于-1的输入(coinbase交易不应当被中继)。
nLockTime是小于或等于INT_MAX的。
交易的字节大小是大于或等于100的。
交易中的签名数量应小于签名操作数量上限。
解锁脚本(Sig)只能够将数字压入栈中,并且锁定脚本(Pubkey)必须要符合isStandard的格式 (该格式将会拒绝非标准交易)。
池中或位于主分支区块中的一个匹配交易必须是存在的。
对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝。
对于每一个输入,在主分支和交易池中寻找引用的输出交易。如果输出交易缺少任何一个输入,该交易将成为一个孤立的交易。如果与其匹配的交易还没有出现在池中,那么将被加入到孤立交易池中。
对于每一个输入,如果引用的输出交易是一个coinbase输出,该输入必须至少获得COINBASE_MATURITY (100)个确认。
对于每一个输入,引用的输出是必须存在的,并且没有被花费。
使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在规定值的范围内 (小于2100万个币,大于0)。
如果输入值的总和小于输出值的总和,交易将被中止。
如果交易费用太低以至于无法进入一个空的区块,交易将被拒绝。
每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证。
以下挖矿节点取名为 A挖矿节点
挖矿节点时刻监听着传播到比特币网络的新区块。而这些新加入的区块对挖矿节点有着特殊的意义。矿工间的竞争以新区块的传播而结束,如同宣布谁是最后的赢家。对于矿工们来说,获得一个新区块意味着某个参与者赢了,而他们则输了这场竞争。然而,一轮竞争的结束也代表着下一轮竞争的开始。
验证交易后,比特币节点会将这些交易添加到自己的内存池中。内存池也称作交易池,用来暂存尚未被加入到区块的交易记录。
A节点需要为内存池中的每笔交易分配一个优先级,并选择较高优先级的交易记录来构建候选区块。
一个交易想要成为“较高优先级”,需满足的条件:优先值大于57,600,000,这个值的生成依赖于3个参数:一个比特币(即1亿聪),年龄为一天(144个区块),交易的大小为250个字节:
High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000
区块中用来存储交易的前50K字节是保留给较高优先级交易的。 节点在填充这50K字节的时候,会优先考虑这些最高优先级的交易,不管它们是否包含了矿工费。这种机制使得高优先级交易即便是零矿工费,也可以优先被处理。
然后,A挖矿节点会选出那些包含最小矿工费的交易,并按照“每千字节矿工费”进行排序,优先选择矿工费高的交易来填充剩下的区块。
如区块中仍有剩余空间,A挖矿节点可以选择那些不含矿工费的交易。有些矿工会竭尽全力将那些不含矿工费的交易整合到区块中,而其他矿工也许会选择忽略这些交易。
在区块被填满后,内存池中的剩余交易会成为下一个区块的候选交易。因为这些交易还留在内存池中,所以随着新的区块被加到链上,这些交易输入时所引用UTXO的深度(即交易“块龄”)也会随着变大。由于交易的优先值取决于它交易输入的“块龄”,所以这个交易的优先值也就随之增长了。最后,一个零矿工费交易的优先值就有可能会满足高优先级的门槛,被免费地打包进区块。
UTXO(Unspent Transaction Output) : 每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。
块龄:UTXO的“块龄”是自该UTXO被记录到区块链为止所经历过的区块数,即这个UTXO在区块链中的深度。
区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase交易。这个交易是由挖矿节点构造并用来奖励矿工们所做的贡献的。***设此时一个区块的奖励是25比特币,A挖矿的节点会创建“向A的地址支付25.1个比特币(包含矿工费0.1个比特币)”这样一个交易,把生成交易的奖励发送到自己的钱包。A挖出区块获得的奖励金额是coinbase奖励(25个全新的比特币)和区块中全部交易矿工费的总和。
A节点已经构建了一个候选区块,那么就轮到A的矿机对这个新区块进行“挖掘”,求解工作量证明算法以使这个区块有效。比特币挖矿过程使用的是SHA256哈希函数。
用最简单的术语来说, 挖矿节点不断重复进行尝试,直到它找到的随机调整数使得产生的哈希值低于某个特定的目标。 哈希函数的结果无法提前得知,也没有能得到一个特定哈希值的模式。举个例子,你一个人在屋里打台球,白球从A点到达B点,但是一个人推门进来看到白球在B点,却无论如何是不知道如何从A到B的。哈希函数的这个特性意味着:得到哈希值的唯一方法是不断的尝试,每次随机修改输入,直到出现适当的哈希值。
需要以下参数
? block的版本 version
? 上一个block的hash值: prev_hash
? 需要写入的交易记录的hash树的值: merkle_root
? 更新时间: ntime
? 当前难度: nbits
挖矿的过程就是找到x使得
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
上式的x的范围是0~2^32, TARGET可以根据当前难度求出的。
简单打个比方,想象人们不断扔一对色子以得到小于一个特定点数的游戏。第一局,目标是12。只要你不扔出两个6,你就会赢。然后下一局目标为11。玩家只能扔10或更小的点数才能赢,不过也很简单。***如几局之后目标降低为了5。现在有一半机率以上扔出来的色子加起来点数会超过5,因此无效。随着目标越来越小,要想赢的话,扔色子的次数会指数级的上升。最终当目标为2时(最小可能点数),只有一个人平均扔36次或2%扔的次数中,他才能赢。
如前所述,目标决定了难度,进而影响求解工作量证明算法所需要的时间。那么问题来了:为什么这个难度值是可调整的?由谁来调整?如何调整?
比特币的区块平均每10分钟生成一个。这就是比特币的心跳,是货币发行速率和交易达成速度的基础。不仅是在短期内,而是在几十年内它都必须要保持恒定。在此期间,计算机性能将飞速提升。此外,参与挖矿的人和计算机也会不断变化。为了能让新区块的保持10分钟一个的产生速率,挖矿的难度必须根据这些变化进行调整。事实上,难度是一个动态的参数,会定期调整以达到每10分钟一个新区块的目标。简单地说,难度被设定在,无论挖矿能力如何,新区块产生速率都保持在10分钟一个。
那么,在一个完全去中心化的网络中,这样的调整是如何做到的呢?难度的调整是在每个完整节点中独立自动发生的。每2,016个区块(2周产生的区块)中的所有节点都会调整难度。难度的调整公式是由最新2,016个区块的花费时长与20,160分钟(两周,即这些区块以10分钟一个速率所期望花费的时长)比较得出的。难度是根据实际时长与期望时长的比值进行相应调整的(或变难或变易)。简单来说,如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。
为了防止难度的变化过快,每个周期的调整幅度必须小于一个因子(值为4)。如果要调整的幅度大于4倍,则按4倍调整。由于在下一个2,016区块的周期不平衡的情况会继续存在,所以进一步的难度调整会在下一周期进行。因此平衡哈希计算能力和难度的巨大差异有可能需要花费几个2,016区块周期才会完成。
举个例子,当前A节点在挖277,316个区块,A挖矿节点一旦完成计算,立刻将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。当这个新区块在网络中扩散时,每个节点都会将它作为第277,316个区块(父区块为277,315)加到自身节点的区块链副本中。当挖矿节点收到并验证了这个新区块后,它们会放弃之前对构建这个相同高度区块的计算,并立即开始计算区块链中下一个区块的工作。
比特币共识机制的第三步是通过网络中的每个节点独立校验每个新区块。当新区块在网络中传播时,每一个节点在将它转发到其节点之前,会进行一系列的测试去验证它。这确保了只有有效的区块会在网络中传播。
每一个节点对每一个新区块的独立校验,确保了矿工无法欺诈。在前面的章节中,我们看到了矿工们如何去记录一笔交易,以获得在此区块中创造的新比特币和交易费。为什么矿工不为他们自己记录一笔交易去获得数以千计的比特币?这是因为每一个节点根据相同的规则对区块进行校验。一个无效的coinbase交易将使整个区块无效,这将导致该区块被拒绝,因此,该交易就不会成为总账的一部分。
比特币去中心化的共识机制的最后一步是将区块***至有最大工作量证明的链中。一旦一个节点验证了一个新的区块,它将尝试将新的区块连接到到现存的区块链,将它们组装起来。
节点维护三种区块:
· 第一种是连接到主链上的,
· 第二种是从主链上产生分支的(备用链),
· 第三种是在已知链中没有找到已知父区块的。
有时候,新区块所延长的区块链并不是主链,这一点我们将在下面“ 区块链分叉”中看到。
如果节点收到了一个有效的区块,而在现有的区块链中却未找到它的父区块,那么这个区块被认为是“孤块”。孤块会被保存在孤块池中,直到它们的父区块被节点收到。一旦收到了父区块并且将其连接到现有区块链上,节点就会将孤块从孤块池中取出,并且连接到它的父区块,让它作为区块链的一部分。当两个区块在很短的时间间隔内被挖出来,节点有可能会以相反的顺序接收到它们,这个时候孤块现象就会出现。
选择了最大难度的区块链后,所有的节点最终在全网范围内达成共识。随着更多的工作量证明被添加到链中,链的暂时性差异最终会得到解决。挖矿节点通过“投票”来选择它们想要延长的区块链,当它们挖出一个新块并且延长了一个链,新块本身就代表它们的投票。
因为区块链是去中心化的数据结构,所以不同副本之间不能总是保持一致。区块有可能在不同时间到达不同节点,导致节点有不同的区块链视角。解决的办法是, 每一个节点总是选择并尝试延长代表累计了最大工作量证明的区块链,也就是最长的或最大累计难度的链。
当有两个候选区块同时想要延长最长区块链时,分叉***就会发生。正常情况下,分叉发生在两名矿工在较短的时间内,各自都算得了工作量证明解的时候。两个矿工在各自的候选区块一发现解,便立即传播自己的“获胜”区块到网络中,先是传播给邻近的节点而后传播到整个网络。每个收到有效区块的节点都会将其并入并延长区块链。如果该节点在随后又收到了另一个候选区块,而这个区块又拥有同样父区块,那么节点会将这个区块连接到候选链上。其结果是,一些节点收到了一个候选区块,而另一些节点收到了另一个候选区块,这时两个不同版本的区块链就出现了。
分叉之前
分叉开始
我们看到两个矿工几乎同时挖到了两个不同的区块。为了便于跟踪这个分叉***,我们设定有一个被标记为红色的、来自加拿大的区块,还有一个被标记为绿色的、来自澳大利亚的区块。
***设有这样一种情况,一个在加拿大的矿工发现了“红色”区块的工作量证明解,在“蓝色”的父区块上延长了块链。几乎同一时刻,一个澳大利亚的矿工找到了“绿色”区块的解,也延长了“蓝色”区块。那么现在我们就有了两个区块:一个是源于加拿大的“红色”区块;另一个是源于澳大利亚的“绿色”。这两个区块都是有效的,均包含有效的工作量证明解并延长同一个父区块。这个两个区块可能包含了几乎相同的交易,只是在交易的排序上有些许不同。
比特币网络中邻近(网络拓扑上的邻近,而非地理上的)加拿大的节点会首先收到“红色”区块,并建立一个最大累计难度的区块,“红色”区块为这个链的最后一个区块(蓝色-红色),同时忽略晚一些到达的“绿色”区块。相比之下,离澳大利亚更近的节点会判定“绿色”区块胜出,并以它为最后一个区块来延长区块链(蓝色-绿色),忽略晚几秒到达的“红色”区块。那些首先收到“红色”区块的节点,会即刻以这个区块为父区块来产生新的候选区块,并尝试寻找这个候选区块的工作量证明解。同样地,接受“绿色”区块的节点会以这个区块为链的顶点开始生成新块,延长这个链。
分叉问题几乎总是在一个区块内就被解决了。网络中的一部分算力专注于“红色”区块为父区块,在其之上建立新的区块;另一部分算力则专注在“绿色”区块上。即便算力在这两个阵营中平均分配,也总有一个阵营抢在另一个阵营前发现工作量证明解并将其传播出去。在这个例子中我们可以打个比方,***如工作在“绿色”区块上的矿工找到了一个“粉色”区块延长了区块链(蓝色-绿色-粉色),他们会立刻传播这个新区块,整个网络会都会认为这个区块是有效的,如上图所示。
所有在上一轮选择“绿色”区块为胜出者的节点会直接将这条链延长一个区块。然而,那些选择“红色”区块为胜出者的节点现在会看到两个链: “蓝色-绿色-粉色”和“蓝色-红色”。 如上图所示,这些节点会根据结果将 “蓝色-绿色-粉色” 这条链设置为主链,将 “蓝色-红色” 这条链设置为备用链。 这些节点接纳了新的更长的链,被迫改变了原有对区块链的观点,这就叫做链的重新共识 。因为“红”区块做为父区块已经不在最长链上,导致了他们的候选区块已经成为了“孤块”,所以现在任何原本想要在“蓝色-红色”链上延长区块链的矿工都会停下来。全网将 “蓝色-绿色-粉色” 这条链识别为主链,“粉色”区块为这条链的最后一个区块。全部矿工立刻将他们产生的候选区块的父区块切换为“粉色”,来延长“蓝色-绿色-粉色”这条链。
从理论上来说,两个区块的分叉是有可能的,这种情况发生在因先前分叉而相互对立起来的矿工,又几乎同时发现了两个不同区块的解。然而,这种情况发生的几率是很低的。单区块分叉每周都会发生,而双块分叉则非常罕见。
比特币将区块间隔设计为10分钟,是在更快速的交易确认和更低的分叉概率间作出的妥协。更短的区块产生间隔会让交易清算更快地完成,也会导致更加频繁地区块链分叉。与之相对地,更长的间隔会减少分叉数量,却会导致更长的清算时间。
后缀:分析:比特币区块链上节点数量下降或因矿工退出而导致