重新创造比特币17:网络的弹性

作者:何岩,由 recreating.org发行。

0.前言 #

在上一篇中,引出了区块链和区块奖励的技术概念。

本篇将讨论节点的连接机制,让Bitcoin的网络更具弹性。

1.问题所在 #

咖啡馆,中本聪和Gilfoyle按照之前的设计,部署了最新代码。

区块奖励机制,即UTXO之后,又一个皇冠级别的天才设计。

它巧妙的让Bitcoin系统同时实现了,节点记账的激励机制,和货币的铸造发行机制。

中本聪说:“有了区块奖励,记账网络将会吸引更多的陌生节点加入,可按照现在的设计,节点之间的连接会形成星状网络”(见下图)

星状网络

星状网络

中本聪继续说:“星状网络不是我想要的网络形态,星状网络太脆弱。我想要网状结构。”(见下图)

网状网络

网状网络

中本聪说:“形成星状网络的原因,是我们将IP写死在代码里的临时方案导致的,新节点只会去连接那3个老节点。这样的网络很脆弱。因为,那3个节点等于在承载着整个网络的消息中转站,网络负载会过高,一旦那3个节点死了,整个系统就会瘫痪。”

Gilfoyle问:“那如何能让网络形成网状结构呢,总不可能每加入一个新节点,就在代码里加一个IP,那种做法太不符合群系统的特质了。代码的IP列表将会成为系统中的单点。也就是说,系统将依赖维护代码IP列表的那个人。”

中本聪说:“那个方案指定不行,我们现在要想出一个新的解决方案,理想的场景是,不需要人工干涉,节点可以自动的互相连接,形成网状网络。并且当网络遭到部分破坏之后,还可以自我修复。”

Gilfoyle说:“这看起来,Bitcoin网络就像是一个拥有了智能的生命体了,可以自己生长,可以自我恢复。”

中本聪说:“对对,就是生命体的感觉,让整个网络看上去像活着一样,拥有顽强的生命力。”

点对点的网络,像一个活物一样。听起来太奇妙了,中本聪之前只是幻想着,没想到今天自己就要着手设计出一个可运行的“活系统”了。

“模型建立自己的模型,这到底是虔诚还是亵渎?”--凯文凯利《失控》

2.生命力 #

与其说,中本聪在创造一个生命系统,不如说,中本聪在寻找生命力的本质。

生命力不是被创造之物,生命力才是主角,造物不过是生命力表达自我的外衣。而人类的角色正是连接生命力和造物的管道。

中本聪此时此刻就是一个管道。一头连着系统的躯壳,一头在寻找着系统的灵魂。

生命力的本质究竟是什么呢?如何才能碰触存在本身?

生命力即即兴

生命力即即兴,即兴即自由,自由即随机。

即兴就是微观视角下的随机选择。

地球是宇宙的即兴,生命是地球的即兴,人类是生命的即兴。

上帝的本质是概率之神。

生命源自偶然,一种可持续的偶然。

偶然即局部的概率不均。

小概率与大概率形成了一种拉扯力,就像水桶中的冰与水形成的拉扯力,地球就是宇宙中的冰,熵减正是依赖于这种拉扯力。

同时要记住,这种拉扯力也是一种偶然。

正是因为拉扯力的存在,即兴的随机行为才有了方向感。

拉扯力和随机性就像即兴的感性和理性,缺一不可。

没有拉扯力生命就不成形状。没有随机性生命就会变得固浊。

拉扯力是收,随机性是放,一收一放形成节奏,节奏导致演化。

生命被这种拉扯力接生到了世间,一旦生下来,孩子就不再需要接生婆了。
生命一旦开启,熵减就不再停止,生命好似成为了一个以自己尾巴为食的贪吃蛇。

“狂野的生命就像衔尾蛇,它吐出不断变得粗大的尾巴,蛇嘴随之不断扩大,再生出更大的尾巴,把这种怪异图景溢满宇宙。”-凯文.凯利《失控》

图片 1.png

一个人如何活出生命力?

答案是成为他自己。

成为他自己,不是说朝着某一个目标去活。

而是说,他在每一个当下都有随机选择的自由,这种随心而动的自由才是活力之源。

这种随心而动的行为模式,我们称其为,即兴。

3.如何让系统成为TA自己 #

中本聪说:“我要将即兴的灵魂注入到系统之中!”

Gilfoyle问:“什么意思?”

中本聪说:“抽象上来说,让一个系统拥有即兴特质的方式是,注入少量的简单原则,然后放任自流:out of control”

中本聪继续解释:“精髓之处就在于底层原则一定要少且简单,因为只有少且简单,系统在微观层面才有随机变异的空间,

同时由于原则的逻辑边界的拉扯,随机的行为不至于太不靠谱。

这样系统运行起来,整体上就会朝着一个方向自我演化。”

Gilfoyle说:“也就是说,想要设计一个群系统,对于设计者来说,可以做的事其实很少,就是设计底层原则那一下子,那一下子对了,系统就活了,不对,后面再怎么努力也没用。好似治大国如烹小鲜。”

中本聪说:“对,就是这个感觉,真正的剑客对抗,一招定生死。”

Gilfoyle问:“那么,记账网络的底层原则是什么呢?”

中本聪说:“我思考了好久,得出了两条底层原则:随机连接和信息共享。
也就是说,只要将这两条原则注入系统,记账网络就能呈现出网状结构,同时会拥有自我修复的弹性”

我们把视角切换到节点身上,代码如果注入了这两条原则之后,会有什么样的行为表现呢?

网络发现 #

一个新节点被启动了,我们就叫它:小男孩。

小男孩睁开眼睛,身边漆黑一片,自己仿佛是漂浮在宇宙中的一颗孤独星球。

小男孩的内心出现了一个声音:“寻找同类,建立连接!”

“原来宇宙中存在我的同类,我要找到他们”

小男孩伸出触角,随机的在互联网的黑暗宇宙中摸索,期待着摸到些什么,如果半天没有结果,就伸长触角,继续向远处探索。

小男孩的行为,就是所谓的网络发现。

小男孩的触角就是Client Socket,Client Socket向一个随机IP的Server Socket的8332端口发起网络请求,然后等待回应。

当然大概率小男孩是收不到回应的,因为,要么那个IP根本不存在,要么即便存在,也不属于Bitcoin系统的节点。

一旦发现没有回应,小男孩会继续随机出下一个IP,重复上面的动作。
如此反复,直到遇到Bitcoin系统中的记账节点。

时间一天一天的流失,小男孩已经尝试了10万多次的碰触,正在小男孩准备放弃的时候,一个IP通了!小男孩终于找到同类了!

对方的IP是138.68.248.103,这不是老板Bob的那台节点3嘛。

首次握手 #

小男孩马上发起首次握手的请求(version):“我叫小男孩,(nickName:小男孩)
我的软件版本是0.0.5,(version:0.0.5)
当前时间是1552978426,(nTime:1552978426)
我的IP是211.13.32.104,(addrMe:211.13.32.104)
从我这里看到你的IP是138.68.248.103,(addrYou:138.68.248.103)
我的区块高度是0,(BestHeight:0)”

然后,就紧张的等待对方的回复。

节点3这时发现了一个陌生IP的请求,从请求中得知,是一个叫小男孩的新节点请求与自己相连。

节点3马上返回了一句(verack):“同意”。

接着,节点3也向小男孩发起了一条握手请求(version):
“我的软件版本是0.0.5,(version:0.0.5)
当前时间是1552978426,(nTime:1552978426)
我的IP是138.68.248.103,(addrMe:138.68.248.103)
从我这里看到你的IP是211.13.32.104,(addrYou:211.13.32.104)
我叫节点3,(nickName:节点3)
我的区块高度是211,(BestHeight:221)”

小男孩收到节点3的应答同意连接后,又马上收到节点3的握手请求,小男孩学着节点3也应答了一句(verack):“同意”

这样一来小男孩就与节点3建立了对等连接,通过节点3,小男孩终于加入了记账网络。(见下图)

对等节点间的首次握手

对等节点间的首次握手

地址的传播与发现 #

但是,只连接节点3这一个节点还是太脆弱,如果节点3能作为一个介绍人,让我和更多节点相连就好啦。

“我可不想再和同类失去联系。”小男孩自言自语。

小男孩向节点3发出了第二轮的请求(addr):"我的地址是:211.13.32.104,请将我介绍给你的邻居节点吧,让他们来找我连接吧!”

小男孩还是不放心,紧接着又向节点3发出了第三轮的请求(getaddr):“请共享一下你已经连接的邻居节点的IP地址吧,我自己去主动连接他们。”

节点3接连收到小男孩的两轮请求,有点不耐烦,心想这小子真没安全感。赶紧把邻居的地址发给他,让他骚扰其他邻居节点去吧。

接着,就将收到的小男孩的addr信息,广播给自己的邻居(addr):“各位,有个新节点来了,你们谁有空就去连接他吧!我把他的地址信息发过来,你们随意啊!”

然后,又将自己的所有相连的邻居节点的地址,共享给小男孩:“我的邻居就这些,地址是:xxx,xxx,xxx,你主动找他们连接吧。"

介绍完,节点3就不管了,小男孩和其他邻居节点之间,会发生随机的连接。网状网络就此形成。

通过这种方式,新节点可以找到新的对等节点并与之连接,如果觉得自己的邻居还不够,就可以重复上面的addr和getaddr的请求,发给其他新节点,来实现更多的新连接。(见下图)

地址的传播与发现

地址的传播与发现

数据的传播 #

当然,节点之间除了共享邻居节点的地址,还会共享区块数据,就是交易的同步和区块的同步,这个之前我们讨论过。

这里要补充一点的是,区块的同步除了同步最新区块,还可以请求从具体的某个区块高度开始同步。

例如最新的区块高度是220,小男孩的区块高度是217,少了3个区块,这时小男孩就可以请求从区块高度为217的地方开始向后同步。(见下图)

节点通过对等节来实现区块同步

节点通过对等节来实现区块同步

网络的弹性 #

现在小男孩的邻居节点一共有3个,分别是节点3、节点4和节点5。

本来小男孩想连接更多的节点,但是发现连接的路径越多,自己的网络压力就越大,所以只能放弃,最后选了3个最喜欢的邻居保持连接。

Bitcoin网络中的节点都是不可靠的,任何节点都可以随时停机,又可以随时启动。

小男孩担心自己的邻居丢失,就每隔一段时间,就通过getaddr和addr来发现新节点,并将新节点的地址缓存记在自己的小本子里,一旦发现有邻居丢失,就马上与新的节点连接。

小男孩如何监听自己的邻居是否丢失呢?原来小男孩有个计时器,如果发现一个邻居一直没有动静,就会每隔30分钟发送一个消息以维持连接。如果邻居在某个连接上超过90分钟都没有通信,小男孩就认为这个邻居丢失了,就会马上寻找新的节点,来替代这个丢失的邻居。

在如此美妙的国度,每个节点都拥有着同样即兴的自由:
想要连接谁?随意!
连接几个邻居?随意!
想要更换邻居?随意!
停机还是启动?随意!

网络看起来就像是一个拥有自我意识的蜂群,时刻自动进行着动态调节,达到了不依赖中央控制的自主伸缩的网络弹性。

Bitcoin系统开始逐渐散发出闪亮的风采。

“当一个节点断开,数据会自动选择别的路径,使整个网络不受影响。而由于不停的有新的节点加入进来,或者一些旧有的节点之间产生了新的连接,网络看起来就像是自我修复了一样。”- 凯文凯利《失控》

4.后记 #

Bitcoin系统演化出了新的网络连接机制,记账网络呈现出了简单的智能感。

由于,我们的假设是,节点都是善良的,所以没有节点的检验和惩罚机制。

但是,只要存在作恶获利的空间,作恶就一定会出现。

下一篇我们将会看到节点如何作恶。

另外,本篇中的节点发现机制,除了通过爬虫随机寻找节点之外,还有一些中心化的方式,例如在代码中写死几个DNS种子等比较接地气的方案,由于想保持故事的简洁就没有写。

下一篇:重新创造比特币18:工作量证明(上)

相关链接 #

重新创造比特币:前言

Part One : 交易
重新创造比特币1:从一个简单的web交易系统开始
重新创造比特币2:第一个版本上线啦
重新创造比特币3:舍弃账户模型
重新创造比特币4:数字签名
重新创造比特币5:公钥和私钥
重新创造比特币6:第二个版本上线啦
重新创造比特币7:UTXO
重新创造比特币8:基于UTXO的系统重构
重新创造比特币9:万物皆交易
重新创造比特币10:交易脚本

Part Two : 群系统
重新创造比特币11:群系统(上)
重新创造比特币12:群系统(下)
重新创造比特币13:P2P网络
重新创造比特币14:交易的同步
重新创造比特币15:账本的同步
重新创造比特币16:Block Chain
重新创造比特币17:网络的弹性
重新创造比特币18:工作量证明(上)
重新创造比特币19:工作量证明(下)
重新创造比特币20:分叉之重组与分裂

书面设计矢量图_36.png

英文版Amazon.com在售 : Recreating Bitcoin

BSV打赏:
1Djc4TdVBi8urzmSXKHwg8cpEAYKcRQxgY

©2019 - Recreating.org all rights reserved

 
1
Kudos
 
1
Kudos

Now read this

Recreating Bitcoin 19:Proof of Work (Part II)

Epilogue # Now let’s design a problem that requires Proof of Work to solve (POW). Looking for the Random Number Many times, in sleep you get the answer you would not get while awake. Satoshi was lucky to have experienced that. But it was... Continue →