• 注册
    • 查看作者
    • 《重新创造比特币》第17章:网络的弹性

      0.前言

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

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

      1.问题所在

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

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

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

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

      《重新创造比特币》第17章:网络的弹性

      星状网络

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

      《重新创造比特币》第17章:网络的弹性

      网状网络

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

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

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

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

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

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

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

       

      2.生命力

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

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

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

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

      生命力即即兴

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

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

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

      上帝的本质是概率之神。因为,量子物理告诉我们:“上帝是掷骰子的”

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

      偶然即局部的概率不均。

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

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

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

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

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

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

      生命被这种拉扯力接生到了世间,一旦生下来,孩子就不再需要接生婆了。

      生命一旦开启,熵减就不再停止,生命好似成为了一个以自己尾巴为食的贪吃蛇。

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

      《重新创造比特币》第17章:网络的弹性

      一个人如何活出生命力?

      答案是成为他自己。

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

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

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

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

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

      Gilfoyle问:“什么意思?”

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

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

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

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

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

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

       

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

      中本聪说:“我思考了好久,得出了两条底层原则:随机连接和信息共享。

      也就是说,只要将这两条原则注入系统,记账网络就能呈现出网状结构,同时会拥有自我修复的弹性”

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

      网络发现

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

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

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

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

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

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

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

      当然大概率小男孩是收不到回应的,因为,要么那个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,小男孩终于加入了记账网络。(见下图)

      《重新创造比特币》第17章:网络的弹性

      对等节点间的首次握手


      地址的传播与发现

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

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

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

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

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

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

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

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

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

      《重新创造比特币》第17章:网络的弹性

      地址的传播与发现

      数据的传播

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

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

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

      《重新创造比特币》第17章:网络的弹性

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

       

       

      网络的弹性

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

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

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

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

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

      在如此美妙的国度,每个节点都拥有着同样即兴的自由:

      想要连接谁?随意!

      连接几个邻居?随意!

      想要更换邻居?随意!

      停机还是启动?随意!

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

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

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

      4.后记

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

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

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

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

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

    • 0
    • 0
    • 0
    • 108
    • 请登录之后再进行评论

      登录
    • 单栏布局 侧栏位置: