重新创造比特币17:网络的弹性
作者:何岩,由 recreating.org发行。
0.前言 #
在上一篇中,引出了区块链和区块奖励的技术概念。
本篇将讨论节点的连接机制,让Bitcoin的网络更具弹性。
1.问题所在 #
咖啡馆,中本聪和Gilfoyle按照之前的设计,部署了最新代码。
区块奖励机制,即UTXO之后,又一个皇冠级别的天才设计。
它巧妙的让Bitcoin系统同时实现了,节点记账的激励机制,和货币的铸造发行机制。
中本聪说:“有了区块奖励,记账网络将会吸引更多的陌生节点加入,可按照现在的设计,节点之间的连接会形成星状网络”(见下图)
星状网络
中本聪继续说:“星状网络不是我想要的网络形态,星状网络太脆弱。我想要网状结构。”(见下图)
网状网络
中本聪说:“形成星状网络的原因,是我们将IP写死在代码里的临时方案导致的,新节点只会去连接那3个老节点。这样的网络很脆弱。因为,那3个节点等于在承载着整个网络的消息中转站,网络负载会过高,一旦那3个节点死了,整个系统就会瘫痪。”
Gilfoyle问:“那如何能让网络形成网状结构呢,总不可能每加入一个新节点,就在代码里加一个IP,那种做法太不符合群系统的特质了。代码的IP列表将会成为系统中的单点。也就是说,系统将依赖维护代码IP列表的那个人。”
中本聪说:“那个方案指定不行,我们现在要想出一个新的解决方案,理想的场景是,不需要人工干涉,节点可以自动的互相连接,形成网状网络。并且当网络遭到部分破坏之后,还可以自我修复。”
Gilfoyle说:“这看起来,Bitcoin网络就像是一个拥有了智能的生命体了,可以自己生长,可以自我恢复。”
中本聪说:“对对,就是生命体的感觉,让整个网络看上去像活着一样,拥有顽强的生命力。”
点对点的网络,像一个活物一样。听起来太奇妙了,中本聪之前只是幻想着,没想到今天自己就要着手设计出一个可运行的“活系统”了。
“模型建立自己的模型,这到底是虔诚还是亵渎?”--凯文凯利《失控》
2.生命力 #
与其说,中本聪在创造一个生命系统,不如说,中本聪在寻找生命力的本质。
生命力不是被创造之物,生命力才是主角,造物不过是生命力表达自我的外衣。而人类的角色正是连接生命力和造物的管道。
中本聪此时此刻就是一个管道。一头连着系统的躯壳,一头在寻找着系统的灵魂。
生命力的本质究竟是什么呢?如何才能碰触存在本身?
生命力即即兴
生命力即即兴,即兴即自由,自由即随机。
即兴就是微观视角下的随机选择。
地球是宇宙的即兴,生命是地球的即兴,人类是生命的即兴。
上帝的本质是概率之神。
生命源自偶然,一种可持续的偶然。
偶然即局部的概率不均。
小概率与大概率形成了一种拉扯力,就像水桶中的冰与水形成的拉扯力,地球就是宇宙中的冰,熵减正是依赖于这种拉扯力。
同时要记住,这种拉扯力也是一种偶然。
正是因为拉扯力的存在,即兴的随机行为才有了方向感。
拉扯力和随机性就像即兴的感性和理性,缺一不可。
没有拉扯力生命就不成形状。没有随机性生命就会变得固浊。
拉扯力是收,随机性是放,一收一放形成节奏,节奏导致演化。
生命被这种拉扯力接生到了世间,一旦生下来,孩子就不再需要接生婆了。
生命一旦开启,熵减就不再停止,生命好似成为了一个以自己尾巴为食的贪吃蛇。
“狂野的生命就像衔尾蛇,它吐出不断变得粗大的尾巴,蛇嘴随之不断扩大,再生出更大的尾巴,把这种怪异图景溢满宇宙。”-凯文.凯利《失控》
一个人如何活出生命力?
答案是成为他自己。
成为他自己,不是说朝着某一个目标去活。
而是说,他在每一个当下都有随机选择的自由,这种随心而动的自由才是活力之源。
这种随心而动的行为模式,我们称其为,即兴。
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种子等比较接地气的方案,由于想保持故事的简洁就没有写。
相关链接 #
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:分叉之重组与分裂
英文版Amazon.com在售 : Recreating Bitcoin
BSV打赏:
1Djc4TdVBi8urzmSXKHwg8cpEAYKcRQxgY
©2019 - Recreating.org all rights reserved