Login
欢迎来到未来世界

您现在的位置是: 首页 > 计算机 > 区块链

区块链

【深度】一个故事看懂区块链网络节点如何通信!

区块链 加入收藏
本篇文章给大家谈谈【深度】一个故事看懂区块链网络节点如何通信!对应的信息,希望对各位有所帮助,不要忘了收藏本站喔。正文共:6759字预计阅读时间6分钟只要绝大多数节点不作恶,每个节点尽力广播自己的消息,使用工作量证明(POW)的方法,全网就会形成正确共识。你我是两支部队的将军,分立两座山头,围剿山谷中的敌城。敌城很牢固,如果我们独
本篇文章给大家谈谈【深度】一个故事看懂区块链网络节点如何通信!对应的信息,希望对各位有所帮助,不要忘了收藏本站喔。

正文共:6759字预计阅读时间6分钟只要绝大多数节点不作恶,每个节点尽力广播自己的消息,使用工作量证明(POW)的方法,全网就会形成正确共识。

你我是两支部队的将军,分立两座山头,围剿山谷中的敌城。

敌城很牢固,如果我们独立攻城必输,但是合力出击必胜。

看来很简单,我们一起轰上去就能搞定。

但是有一个小问题:山上没有信号,传递消息只能靠通信兵,而通信兵必须经过山谷中的敌城才能传递消息。

假设:你看到一个信使,带来我的消息:“今夜23点攻城”。

请问,你敢信么?如果你信了,半夜出兵,结果被灭了也千万别奇怪,因为我发给你的消息是:“明天早上6点攻城”。

但是,我的通信兵被敌人截杀,他们换了个新的,骗你早点出来。

如果你被灭了,敌人就赢了,因为我单独攻城也是被灭的命。

只传输文字信息带来两个问题:1)原文易被篡改:2)收信人无法验证原文是否被篡改:那该怎么办?两个办法:一是我们熟悉的数字签名,但这只适用于一对一传输的场景。

如果要把消息向全军广播,就得用到第二种方法:工作量证明。

一、什么是工作量证明?工作量证明(proof-of-work)指通过完成一定工作量以阻止网络恶意攻击的方式,简称POW你可以把“一定的工作量”理解为简单体力劳动,相当于去猜福利彩票双色球的中奖号码:你只要趴在桌上写啊写,就一定能够写中下一期的中奖号码,只是要花点力气而已。

但在工作量证明中,猜的可不是双色球号码,而是猜一个普通数字,这个数字添加在原文消息后,使得整个结果的哈希值前面有很多个0。

回到开头的场景,我要发给你的消息是:明天早上6点攻城。

但是我不能直接发,因为容易被敌人截杀。

你我之间可事先约定:我找一个幸运数字,加在消息后面,使得“消息+幸运数字”的哈希值以5个0开头。

如果不是这样,那你收到的消息就肯定不是我发的。

在这里,“5”代表难度,哈希值前缀的“0”越多代表这个幸运数字越难找。

二、用工作量说明“工作量证明”下面,我用简单体力劳动演示简单体力劳动的全过程:下图左侧是14种不同的哈希算法,右侧是不同算法的哈希值结果,我们选用群众喜闻乐见的SHA-256的哈希算法(来源网址:文末链接[1])。

一般的哈希值都不以“0”开头,比如:“明天早上6点攻城”的哈希值以“6600c”开头。

我们的任务是找一个幸运数字,把这个数加在原文消息后面去哈希,当哈希值前面出现5个0的时候,这个幸运数字就是我们要的值。

我们从0开始:把0加在消息“明天早上6点攻城”之后,变成:“明天早上6点攻城0”,得到哈希值:0593feea85b5cc51……这个哈希值不以5个“0”开头,所以0不是符合要求的幸运数字。

哈希值长度为64位,考虑到你手机屏幕的宽度,所以只列前N位哈希值。

找到1个“0”开头的哈希值很容易,冲上来就找到了。

但别忘了,我的任务是找5个“0”开头的哈希值。

开始体力劳动:你只需注意以0开头的哈希值出现的频率。

消息+幸运数字哈希值(前N位)明早上6点攻城0 0593feea85b5cc51明早上6点攻城1 5c14326badbde132明早上6点攻城2 434fe85e6c397d38明早上6点攻城3 ea1ee28cb2827fa9明早上6点攻城4 8559db7af65e2bc9明早上6点攻城5 6ec12acfe954ffe43明早上6点攻城6 53bd9133146631a明早上6点攻城7 d348d29e9398d88明早上6点攻城8 276cfca1386ffba0d明早上6点攻城9 f78628f2b0e4941c6明早上6点攻城10f92e8cd090f34feb2f明早上6点攻城115cc0bc8a34f5fb81b明早上6点攻城12764154add623fee9c明早上6点攻城1396c3bcb245fd955f1明早上6点攻城147c18fb827e48ea685明早上6点攻城15283f7de03f0165fac5明早上6点攻城16bce71436c4907d14明早上6点攻城174f76be60fb2b0da75明早上6点攻城18182530c711a1cd98明早上6点攻城196d59c71c30c17f378明早上6点攻城20b0161336bbbe8671明早上6点攻城21a1f35a0522b3a7ff8e明早上6点攻城22e118e2ce041d2a7f4明早上6点攻城23652083fffd51d0ae7f明早上6点攻城24678aa3a7ce73b5c9明早上6点攻城25f4a1f9d9b2fb9b1b4明早上6点攻城26c87c2c4e884ea133明早上6点攻城272b3fb751465404de明早上6点攻城28227bac9dc398936e明早上6点攻城29888b7a21af071d5c明早上6点攻城30f4e9bb78cab0ff886明早上6点攻城3191594c8e41636a55明早上6点攻城32a7e8e2259ef52af4f明早上6点攻城338b55a6ac71191a0e明早上6点攻城34a8304e90a8af8c7u明早上6点攻城35d57a2113827cbcdd明早上6点攻城36 09c1eeaff85866243f寻找“0”开头的哈希值相对容易,一下找到2个,对应的数字分别是0和36,但没有“00000”开头的哈希值,甚至没有“00”开头的。

继续:明早上6点攻城377dfb6f433c3645462明早上6点攻城387572b6a6aa98910a明早上6点攻城395ac0d7c30d2890ca明早上6点攻城409be18e61d82d1752明早上6点攻城419541e2a4326e26a2明早上6点攻城42808f9e53e2fdfcde4f明早上6点攻城43cf9158dec66779f89明早上6点攻城4458c9b2b0b9e0c851明早上6点攻城45 0e35034199718f0fd明早上6点攻城466684da32f8dd10b17明早上6点攻城47 53e75d1bf17a577ef8明早上6点攻城4849f5ea6a963c63620明早上6点攻城4914532b88606aeaad5明早上6点攻城502b421e6ca5e184c21明早上6点攻城5132f6b4dc0e6c4d534明早上6点攻城52 7b61def8dd77f08c25明早上6点攻城53 59ec7fdd8457aa39f2明早上6点攻城54 ba9697b6b4bbada44明早上6点攻城55 130d07e46333ab39a明早上6点攻城56 a7a3e432ac5660fb7c明早上6点攻城57 ab72f349e783a2a4b8明早上6点攻城58 039c996ace6dbc7d4明早上6点攻城59 105626ff7234569223明早上6点攻城60b182960d7c0a6668明早上6点攻城61 48233ba8877b40ead明早上6点攻城62 d286d115c912c6205明早上6点攻城63 fbf8e794aca4a2f8a92明早上6点攻城64 4192c87e6911f9d8ea明早上6点攻城65 fa5f19484c040ded83明早上6点攻城6642956b52051f1242be明早上6点攻城67 68ecab13753c945671明早上6点攻城68 70895ad85e9cf99407明早上6点攻城69 d4ae89d8c6c968f035明早上6点攻城70 4a6eb62c842417fe6a明早上6点攻城71 2676fbd40437e60219明早上6点攻城72 540e4a3347171077d明早上6点攻城7321be059d3c4dba03d明早上6点攻城74 0d359bbca099eb63c1明早上6点攻城75255b4ff42e9a52830c6明早上6点攻城7655da96691231c2b921明早上6点攻城77 d96bea5b456fbb080b明早上6点攻城78 cd814aeb96ab6a795c明早上6点攻城79 86ae1b4298637efb56明早上6点攻城80 5b03962a07fe916c79明早上6点攻城81 4b219e4e26e5883216明早上6点攻城82 b64488ed650ce928df明早上6点攻城83 a361cb170b37a57a61明早上6点攻城84e6f543f7c5665857088明早上6点攻城85 468db8901982df4c14明早上6点攻城86e13fac9a65fa76e477b明早上6点攻城871821cb6741f34ea5554明早上6点攻城88fda69eae2282f6c049fb明早上6点攻城8983bd626cb8fc04662cc明早上6点攻城90 5a7cb656e9957de9c2明早上6点攻城91 e4813bc08139e59e7d明早上6点攻城92 ad70094cf25902427a明早上6点攻城93 20d92beaef0f1dac96f明早上6点攻城9413dce00f7477d70a9e2明早上6点攻城95 e8e711a4d6eb00341e明早上6点攻城969cfde03631631dfba67明早上6点攻城97 ce78f0ead3cd569d1d明早上6点攻城98 ca9ab59025aeceb608明早上6点攻城9937c2e33202248931b4明早上6点攻城100 4310137ff5e2329929f以0开头的哈希值很稀薄,100个后缀数字只有五个以1个“0”开头的哈希值。

为节约你的时间,以下省略所有不以“0”开头的哈希结果。

......“00”开头的哈希值难能可贵,找遍300以内的数,竟然没有,继续:明早6点攻城308 05977df5bd690958ed明早6点攻城345 08884879b8f802455明早6点攻城346 0ae905eb78cb562cc0明早6点攻城347 00254b20c9cea56987遍历到347,终于出现连续一个“00”开头的哈希值,难能可贵,但我们要找的是“00000”开头的哈希值,所以继续:…………一直找……百折不挠……如果不靠省略号的帮助你的屏幕已经下拉了10公里……屏幕已经拉穿了地球……字字读来都是血,十年辛苦不寻常苦心人,天不负。

终于,天开眼了……我发现:用894578149接在原文后面,“明天早上6点攻城894578149”的哈希值符合要求:00000a392277b16……。

“894578149”就是我们要找的幸运数字,找到它就像中彩票一样梦幻。

因为我无法通过哈希值倒推,只能苦算[2]。

你见过的那些灰字和省略号,就是我的工作量证明——虽然每次哈希运算很简单,只要0.001秒,但8.9亿次哈希运算,却需要10天时间。

如果想在1天时间内算出来,得买10台计算机。

如果敌人截获消息,篡改成“后天15点攻城”,那么他得重新算幸运数字,并且,你知道只有你和我约定过“00000”的事。

我把“明天早上6点攻城894578149”发给你,你把原文一哈希,得到“00000a392277b16……”,五个零的前缀让你大喜过望。

你准备明天6点起兵攻城。

但是,你真的可以这样吗?不可以,因为敌人也懂哈希。

你看,理论上我的信息会被截获,敌人拿到原文“明天早上6点攻城894578149”,一哈希,就能发现前面有五个零。

然后敌人为你编了条假消息:“后天13点攻城”。

并且如法炮制,用工作量证明算出了一个幸运数字238925022。

你收到消息:“后天13点攻城238925022”,一哈希,发现哈希值前缀也是“00000”。

如果你信了,后面的剧本就是:我明天一早攻城,比你先死一步。

【深度】一个故事看懂区块链网络节点如何通信!就为大家介绍到这里了。如果你也感兴趣的话,不妨试试网站搜索,相信可能会有不一样的惊喜!
图集详情底部广告位