分类
Uncategorized

依赖PoW的区块链如何验证哈希是使用算法计算的,而不是由人类组成的?

浏览798次
4
1
区块链如何验证所提供的散列(一个具有前导零的散列,应该是唯一的,使用大量处理能力计算)确实是唯一的,并且它不仅仅是一个随机数,有人提出,然后只是将预期的前导零添加到它?
采矿理论
搞砸
工作证明
块有效性
分享
改进这个问题
跟随
15小时前编辑的
墨奇♦
52.3k3232金徽章144144银徽章455455铜徽章
昨天问
萌芽编码器
14333枚青铜徽章
新贡献者
添加评论
8个答案
7
因为
每个人都可以快速使用事务数据来重新计算哈希值,并检查它是否匹配并且小于目标值。
计算散列并不需要时间,它会改变事务的详细信息(例如“nonce”值),直到您找到一个散列值小于目标值的排列。平均而言,这需要大量的尝试,在每次尝试之间稍微改变事务数据。因此,需要对散列进行大量计算。但只有最后的计算需要验证,而不是大量失败的尝试。
分享
改进这个答案
跟随
昨天回答的
红砂砖
10.8k22金徽章1717银徽章3535铜徽章
下面是一篇很好的文章,解释了如何计算块哈希的细节,并提供了一个python中的验证器:medium.com/hackergirl/……昨天是李文克莱夫
添加评论
5
散列函数将“任意大小的数据映射到固定大小的值”。作为一个非常简单的散列,假设函数只对数字起作用,并且只返回最后3位(十进制)数字(即1、10和100位)。
使用这个简单的散列,5将散列到005,123456将散列到456。
比特币块包含少数字段(来源):
版本
上一个块哈希
梅克尔根
时间戳
难度位
暂时的
所有这些都可以用数字表示(时间戳是Unix时间(source),这意味着它基本上是自1970年1月1日的00:00:00 UTC以来的秒数)。
在这些值中,只有nonce可以自由更改而不会使块无效。时间戳可以取值范围很广(大约“1小时前”到“2小时后”(source)),版本号有很大的灵活性(同上)。我将把重点放在当下,因为那是我最容易谈论的。
在这个简化的场景中,工作证明是通过将所有这些数字相加并找到一个导致哈希为000的nonce来完成的。在这个简化的场景中,这样做很简单:您可以将其他数字相加,对部分和进行散列,然后将nonce设置为1000,即部分散列。所以,这不是一个很好的散列算法。

相反,比特币使用的是SHA256。SHA256有几个优点,这些优点源于它是一个加密散列函数;三大优点是,计算给定值的SHA256散列值“便宜”,但生成一个将生成给定SHA256散列值的值是困难的,输入中的微小变化将导致输出中的巨大变化(雪崩效应)。
事实上,据我们所知,生成产生给定SHA256哈希的输入的唯一方法是不断尝试输入,直到找到一个有效的输入。
所以:与开始时的简单散列不同,我们不能仅仅通过查看其余的数据就知道nonce应该是什么。而且,我们不能仅仅调整nonce来得到我们想要的散列:雪崩效应意味着对输入的每一个小的改变都会对输出产生大的改变。因此,找到产生有效SHA256哈希的nonce的唯一方法是从0开始,直到找到合适的nonce为止。
一旦找到合适的nonce,任何人都可以通过用该nonce对块进行散列并查看散列是否匹配来验证nonce/散列对是否有效。这项检查可以很快完成,并证明谁发现了nonce做的工作。
nonce是一个32位整数(source),这意味着有4294967295个(略低于43亿个)可能的nonce。与Powerball彩票相比,一张彩票中大奖的几率约为1/300000000,随机选择的nonce有效的可能性很小;即使有数千个nonce可以产生一个包含足够前导零的SHA256散列,随机选取临时符号的可能性仍然是惊人的。
然后,时间可以在大约3小时的窗口中取任意值,并且具有第二分辨率,因此它可以取约10800个值。这个版本有一些限制,但它似乎是另一个像nonce一样的4位整数;为了粗略计算,假设它可以使用nonce可以使用的可能值的一半。这意味着大约有9e+22(9后面跟22个零)可能的组合。银河系中大约有2000亿颗恒星(来源);也就是说,2000000000或2e+11。在两个人从整个银河系中随机选择同一粒沙子的情况下,随机找到一个正确的头球很有可能。
分享
改进这个答案
跟随
14小时前编辑的
昨天回答的
明尼马斯
15122青铜徽章
新贡献者
大家好,很好的第一个贡献!短语“在这些值中,只有nonce可以在不使块失效的情况下更改。”可能有点误导:矿工创建块模板并计算头之后,他们将尝试完整的nonce空间(43亿次尝试只是杯水车薪,网络的速度约为1.63亿次/s),但是如果他们没有找到一个能构成一个有效块的nonce,他们会改变头中的其他内容来扩展搜索空间。但是,在找到有效块之后,nonce是头的一部分。–默奇♦ 19小时前
抱歉,我应该在前面链接到这个相关的主题:为了避免重新计算Merkle根,矿工可以更改哪些块头字段?如果你感兴趣的话。–默奇♦ 15小时前
添加评论

1
@Sprout Coder获胜的矿工不向要验证的网络提供哈希。他供给街区。比特币块的前80个字节是块头。如果标头的哈希值大于目标哈希值,则该块无效。矿工们反复地散列80字节的头,每次都做一个小的改变。当一个矿工发现一个头部有一个足够小的散列,他发送整个块到一个或多个比特币节点。如果该块无效,节点将丢弃它,并且不将其传播到其邻居
分享
改进这个答案
跟随
21小时前回答的
路易斯·汤姆普森
2111青铜徽章
添加评论
0
谁/什么造成了散列并不重要,只要它对给定的散列函数正确工作。
假设你在记事本中手动将一个块打包在一起,在脑海中随机想到一个数字,然后用你刚刚梦到的哈希值标记这个块,假设你是宇宙中最幸运的人,你碰巧用这种方式打包了一个积木,所以它确实与你在脑海中想象的数字相符(这种可能性是难以置信的,难以置信的,难以置信的不太可能,但不是绝对不可能的)-恭喜,你赢了这一轮的比赛;网络上的其他人会把你组装的块,按照网络上广泛接受的算法进行散列,得到与你想象的完全相同的数字,宾果-它被证明了。你的解决方案有效!你得到区块奖励,你的区块就被并入区块链
最关键的是,“难以置信,难以置信,难以置信的不可能”的部分,当你向世界惊呼“我有像ABCDEF这样的块,我把它散列到00123,这是有效的,有效的,比难度小,所以给我奖励”。网络的其他部分会去“呃,不,实际上阻止ABCDEF散列到00255这是不正确的”-发生这种情况的可能性(你编造的散列是错误的)是数十亿倍
你必须意识到,一台挖掘机器会有一堆事务和其他的乱七八糟的东西,它可以打包在一个块中,它可以对它进行散列-得到结果200(假设它寻找的是小于100),这比难度要高,所以它做了一些调整,再次散列,得到250,调整,散列得到199,调整/散列/调整/散列。。它以每秒数十亿次的速度这样做,最终,也许它会得到一个小于100次的结果——它现在可以宣布阻塞,其他人会验证它
如果它(或你)只是编造了一个散列,并宣布它是赢家,它是如此难以置信的不可能是正确的,它可能不是一个赢家,不会被网络接受。就像你买彩票时输了号码,然后跑来跑去喊“我中了彩票!我选了1,2,3,4,5,6,昨晚的数字是1,2,3,4,5,6,给我几百万!”每个人都会说“不,昨晚的数字是1,4,7,22,38,49。。“走开”
分享

你能找到“每秒数十亿次”的信息吗?如果只有42亿个可能的临时事件,矿工们每秒可以检查数十亿个临时事件,那么大约每秒钟就应该生成一个新的区块;它似乎更接近每10分钟生成一个区块。–23小时前
但是,块的时间戳可以更改,或者事务可以重新排序-nonce不是唯一可以更改块以导致不同哈希结果的东西。挖掘设备以每秒万亿次的速度散列,因此单个设备已经能够每秒对块进行数十亿次的散列,并且在发现一个小于难度的块的散列之前,它们已经多次用完nonce。故意改变难度,使求解速度平均保持在10分钟;如果哈希速度加倍,则时间减半,因此。。——21小时前的凯乌斯·贾德
网络改变了难度目标,有效地使难度提高了一倍,平均每10分钟解决一个障碍的几率提高到1。另外,不要忘记,对于时间戳为Y的特定X块事务,42亿个nonce中可能没有一个能得到比难度小的哈希值;块解算速率与该块检查了多少个nonce无关——Caius Jard 21小时前
添加评论
0
块在以下情况下有效:
它的散列比难度低
它只包括有效的事务
哈希是从80字节的blockheader生成的。然后将得到的哈希值解释为一个数字,以将其与难度目标进行比较。
很难找到一个标头遇到困难的块:比特币网络目前约为163 EH/s,即全球平均每10分钟有163次每秒5百万次的尝试来查找有效的。
另一方面,识别一个虚构的解决方案是微不足道的。成功的矿工必须在公告中提供完整的区块头。它的对等方只是从blockheader重复哈希计算,以验证块是否满足困难。只有这样,对等方才能检查块的剩余内容是否也是有效的。如果块是有效的,它们将块依次转发给它们的对等方。否则,它们会丢弃它(在某些情况下会丢弃提供无效数据的对等方)。
分享
改进这个答案
跟随
15小时前回答的
墨奇♦
52.3k3232金徽章144144银徽章455455铜徽章
添加评论
0
块的散列不是简单的唯一字符串,而是使用散列函数生成的唯一字符串。
散列函数是一种不能反转的单向算法。因此,为了生成所需的输出,您别无选择,只能反复修改所需的输入,直到找到一个有效的输入。
这是一个挖掘过程,计算机(1)获取事务数据,(2)修改事务数据的一小部分,(3)每秒生成数十亿个哈希,试图找到一个给定的小修改,与事务数据的其余部分一起,将生成一个数量为X的零的哈希。
现在hash已经生成,完整的事务数据以及nonce可以提交给BTC网络。尽管要找到正确的nonce来“反转”单向散列函数花费了无数次的尝试,但通过简单地通过散列函数传递它和事务数据来验证它是微不足道的。

回答不错,但加密哈希函数与加密无关。矿工可能会在试图查找块时修改块模板的其他部分,您可以在此处阅读更多内容:bitcoin.stackexchange.com/q/90393/5406–默奇♦ 14小时前
@默奇谢谢,更正。–是的,22 14小时前
添加评论
0
计算给定已知值的散列非常简单。挖掘的工作原理是,您必须获取事务的详细信息,并得出一个值(nonce),该值将使哈希适合预定义的范围。目前使用比特币时,你需要有一些值,并计算一个以18开头的0的散列来“挖掘”一枚硬币。
为了计算散列值,需要获取事务细节并添加一些特殊的调料,然后计算散列值。如果散列有18个前导零,那么您正在挖掘比特币。你把你的特殊价值和散列给网络,如果有足够多的其他矿工同意,它就会成为区块链的一部分。其他矿工接受你的散列,并开始计算新的散列与新的事务和他们自己的nonce得到下一个散列。
如果你用18个前导0和其他46个十六进制数字组成你自己的散列,那么首先会发生的事情是其他矿工会用你的nonce来处理事务细节并自己计算散列。这是一个简单而快速的操作,它使用一个随机的nonce来尝试产生一个新的有效散列。
问题是,对于18个前导0,您需要尝试大量的nonce来找到一个包含18个前导0的散列。您需要尝试大约10000000000000000000个nonce来找到一个将给您一个包含18个前导零的散列。这意味着检查散列需要1/10000000000000的计算能力。当您将哈希提交到网络时,其他节点要做的第一件事就是验证哈希。如果你试图“编造”一个哈希,但无法验证,网络的其他部分将忽略你,甚至停止尝试验证你创建的未来哈希。
分享
改进这个答案
跟随
40分钟前回答的
杰森·戈马特
101
新贡献者
添加评论
0
区块链如何验证
区块链不会验证任何东西;网络会验证。但是区块链可以用来验证事物(事实上,这就是它们的全部意义)。
所提供的散列(带前导零的散列应该是唯一的…)确实是唯一的
根据定义,散列是唯一的,因为每个块头正好有一个散列。
如果“独特”是指“与其他区块不同”,那么:
这并不是比特币规则的一部分。
即使是这样,验证也很简单,至少与验证区块链所需的所有其他计算相比。
无论如何,事实上肯定会是这样,因为像比特币(SHA256)那样的好散列函数几乎不可能找到具有相同散列的两个值。
“独特”这个词可能不适合这个问题。
散列所提供的(使用大量处理能力计算的)
比特币使用的哈希值易于计算(因此易于验证)。困难在于找到哈希值小于目标值的块头。
它不仅仅是一个随机数,有人想出,然后只是添加了预期的前导零?
没有人能够验证所提供的散列来自何处,这并不重要。重要的是:
它实际上是提供的头的散列。
它小于目标值。

T500定制 (36)blockchainBTC比特币区块链

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注