Yann He

programmer for JavaScript, Python, Java

Page 2


重新创造比特币11:群系统(上)

0.前言

本系列的上半部分,主要围绕着交易TX的演进。

从这篇开始,进入下半部分,核心为点对点网络架构。

Bitcoin系统将朝着生命体的方向演进。

1.寻找演进方向

中途镇,咖啡馆。

中本聪和Gilfoyle按照之前的设计,实现了交易脚本机制,Bitcoin就好似生命演化出了细胞。

接下来,中本聪开始思考,如何用细胞拼装出复杂的生命体,甚至是拥有自我意识的超级智能体。

中本聪:“我想将Bitcoin改造成一个可以拥有独立生命的系统,让它可以自给自足,不再依赖我的维护”

Gilfoyle:“啊!你这个IDEA太疯狂了!”

Gilfoyle:“不过仔细想一想,确很符合逻辑。因为如果Bitcoin要成为世界级的通用计算机,那么获得全球的绝对信任是必须,只要系统的运行还要依赖于某一个维护者,那么这个信用就不成立。必须让Bitcoin自食其力,成为一个不依赖某个“老大哥”的自治系统。愿它最终演化成一个不会被杀死的永动机。”

Gilfoyle:“你有思路了吗?”

中本聪:“这世界上最智慧的事物是什么?就是大自然啊,所以我们应该向大自然学习,学习它设计出来的成功案例。例如蜂群,蚁群,甚至人类大脑等有机体。”

中本聪:“我们用一个概念来表达他们的抽象本质,就是群系统。”

中本聪:“如果我们有足够有野心,就要去挑战这世界上的智能的极限,那就是:创造出一个生命系统!”

中本聪:“所以,Bitcoin的演进方向,就是成为一个,群系统!”

2.群系统

究竟什么是群系统呢?

在这个世界上,存在着两类系统,一类是精确系统,另一类是复杂系统。当前阶段的Bitcoin系统属于前者。而,群系统就属于后者。

“有两种极端的途径可以产生“更多”。一种途径是按照顺序操作的思路来构建系统,就像工厂的装配流水线一样。这类顺序系统的原理类似于钟表的内部逻辑——通过一系列的复杂动作来映衬出时间的流逝。大多数机械系统遵循的都是这种逻辑。

还有另一种极端的途径。我们发现,许多系统都是将并行运作的部件拼接在一起,很像大脑的神经元网络或者蚂蚁群落。这类系统的动作是从一大堆乱糟糟且又...

Continue reading →


重新创造比特币12:群系统(下)

0.前言

中本聪和Gilfoyle明确了Bitcoin的演进方向,即,群系统。

那么,如何设计,可以让一个计算机系统,一步一步由一个精确系统变为一个复杂系统呢?

1.群系统无法被“设计”出来

咖啡馆,Gilfoyle喝着咖啡。

中本聪走进来,捧着一堆书,啪的一声将书摔在桌子上。

中本聪:“我是这么想的,既然Bitcoin的演进方向是群系统,而群系统中的尖货是生命系统。那么我们就要去学习生命系统,怎么学,看书呗!这些是我从城里图书馆找来的生命科学方面的书。”

Gilfoyle:“这个思路不错,从上帝的造物中寻找灵感!”

中本聪:“是的!回顾人类历史上很多伟大的发明,很多都是在模仿大自然。例如,由螳螂发明了镰刀、由蝙蝠发明了声纳和雷达、由蜻蜓发明了飞机。”

说完,俩人拿起书开始快速的翻阅起来,好像侦探在搜罗犯罪现场的蛛丝马迹。

通过这几天的研究,中本聪和Gilfoyle更加确信:生命不是被上帝设计出来的。生命是偶然而成。

所以,Bitcoin也同样不可以被设计,只能通过模仿,模仿那个经过几十亿年打磨而成的造物:生命体。

2.Bitcoin和生命体的类比

如果将演进后的Bitcoin类比成一个最简单的多细胞生命。

1)交易即信息

交易类似与细胞之间传递的信息。交易中即可以装载业务数据,也可以装载算法代码。

交易作为Bitcoin系统中唯一的信息载体,其意义在于:装载信息的容器是一个具有共识的标准协议。

什么意思呢?

就是说,在系统中的任何需要处理信息的地方,大家都心照不宣的有一个共识,信息只会是交易(TX)这一种载体。所以解析信息就省事了,因为不可能出现其它形式的信息,所以各个环节只需要按照交易的约定格式进行拆解,组装,发送。

这就好像,集装箱是统一尺寸,搬运货物的轮船、吊车、汽车等等只要接触集装箱的环节,都可以按照共识来设计尺寸。因为集装箱的尺寸不会变。

这就是协议的意义。Bitcoin中的交易(TX)就是一种标准协议。

集装箱的标准化

具体如何实现呢?

例如我想将这样一句话“Hello World”装入到一个交易(TX)中。

当然是将其...

Continue reading →


重新创造比特币13:P2P网络

0.前言

中本聪在生命体上找到了Bitcoin演进的灵感,下一步是将技术落地。

生命体演进的顺序是从单细胞到多细胞,之后才出现器官,最后才是大脑。

换句话说,生命可以没有大脑,没有器官,但不能没有生殖细胞。

中本聪开始着手设计事关Bitcoin生存的基础(漩涡模型的内环),即,点对点的记账网络。

点对点,英文是:peer-to-peer ,缩写为:P2P。

Bitcoin的定义从此可以变为:一个点对点电子现金系统。

当然,未来Bitcoin的定义还会发生变化,也许是:一个点对点的通用计算机、一个点对点的超级智能体、或者世界之根:元网(Metanet)。

anyway,有点扯远了,我们回到脚下,开始记账网络的落地。

1.从2个节点开始

中本聪:“现在运行着的Bitcoin服务端,就可以看成是一个单节点。”

Gilfoyle:“可以把它看成是一个单细胞生命体吗?”

中本聪:“不能,它和单细胞生命有着本质的区别。因为,单细胞是生活在同类之间形成的群系统中的,例如之前我们讨论过的费氏孤菌。而当前的Bitcoin是一个世界上孤零零的一个单细胞,在自然界中孤独的单细胞是无法生存下去的。我们的Bitcoin之所以可以生存至今,是因为有我们在维护着它,给他供电,换一种说法,它的生存不可持续。所以,它还不算是一个自治系统。而我们现在要做的事,就是将它升级成一个自治的群系统,这样它就可以靠着自己存活下去,甚至自我演化下去。”

中本聪:“我们先从最简单的场景开始,加入一个新节点,让Bitcoin系统发生质变,成为拥有2个节点的极简群系统。”

Gilfoyle:“我们需要一个新的服务器,正好我家里有台多余的主机,我这就去抱过来”

中本聪:“太棒啦!我还在愁这个月没有闲钱买新主机呢!”

过了一会,Gilfoyle将一个老旧的主机放到了咖啡桌上,现在他们拥有了两台服务器啦。

直接装载之前Bitcoin的服务端代码,是没有效果的,因为两台主机会认为自己是世界上唯一的Bitcoin系统,互相老死不相往来。

中本聪:“首先,我们要让这两个节点连接上,彼此感知到对方的...

Continue reading →


重新创造比特币14:交易的同步

0.前言

在上一篇中,中本聪和Gilfoyle搞定了最简单的点对点网络。但是无法正常运行,因为账本还没实现同步机制。为了解决账本的同步,需要先引出交易的同步。

1.账本不一致

咖啡馆,中本聪对着老板Bob说:“老板,这几天Bitcoin系统要升级,暂时无法用了”

Bob说:“我看到了,你们又是搬机器,又是写代码,这次升级动静够大的。”

中本聪说:“是啊,Bitcoin要发生质变了,对了,你家要是有不用的机器也搬过来,我们需要更多节点。”

Bob说:“好啊,我家还真有一台,不过运行Bitcoin我能得到什么好处呢?”

中本聪说:“好处……这个我得想想,暂时还没有,纯是友情支持。”

Bob说:“好吧,看在你是我的老客户,我去给你搬过来。”

中本聪说:“太好了!你真是个慷慨的老板!”

中本聪对Gilfoyle说:“我们将要有第3个节点啦!现在,我们来解决账本的同步问题吧!”

我们假设一个交易场景:

1.Alice账本中的余额是50,并且记账节点1和记账节点2的账本一致。

2.Alice的客户端连接的是记账节点1。

3.Carol的客户端连接的是记账节点2。

4.Alice向节点1发送一个交易消息:Alice to Bob 50

5.Carol向节点2发送一个交易消息:Carol to Alice 30

6.这时候的Alice的正确余额本应该是30。但是由于账本没有同步,所以在节点1中Alice的余额是0,在节点2中Alice的余额是80,都不正确。(见下图:账本不一致)

账本不一致

面对这个场景,应该如何解决账本不一致的问题呢?

中本聪解释到:“解决这个场景还算简单。只需要节点互相将自己的账本发送给对方节点,收到对方的账本后,找出自己账本中缺少的交易记录,然后将此交易记录补充到自己的账本,这样俩个节点的账本就又一致了。”

在上面这个场景中,

节点1补充进自己账本的交易记录是:Carol to Alice 30。

节点2补充进自己账本的交易记录是:Alice to Bob 50。

这样在俩个节点中的账本又恢复一致,Alice的余额都显示为...

Continue reading →


重新创造比特币15:账本的同步

0.前言

上一篇描述了交易的同步,如果光是交易的同步是不够的,还需要考虑账本的同步

交易内存池代表着系统的当下,账本代表着系统的过去。

1.3个节点

咖啡馆,老板Bob给中本聪抱来了之前答应过的旧主机。中本聪接过老板怀中的主机,一顿表达感谢。

现在桌子上放着3台主机,由于桌子地方不够用了,第三台机器堆在了另外两台的上面,看起来像个金字塔。

中本聪对Gilfoyle说:“之前的2个节点已经可以正常的提供记账服务了,我们现在把第3个节点也接入Bitcoin网络吧。”

Gilfoyle说:“好,不过我感觉八成会出问题,先运行起来再说,反正现在是测试阶段,遇到问题解决问题。”

中本聪给节点3配置好IP,部署了最新的代码,重启运行。节点3很顺利的自动连接上了节点1和节点2(因为临时方案:代码中写死了节点1和节点2的IP),并且开始同步交易了。(见下图)

节点3加入记账网络,开始同步交易

运行了一会,中本聪发现问题了:“我给忘了,账本的同步还是需要的,新加入网络的节点账本是空的”

Gilfoyle说:“那就改一下代码,每次程序启动,向自己订阅的节点申请账本的同步。”

这个逻辑很简单,中本聪马上改好代码,重新部署了,启动。(见下图:账本的同步,但是内存池缺失交易)

账本的同步,但是内存池缺失交易

这次节点3完成了账本的同步。

但是观察了一会,中本聪又发现了另一个问题:“我发现节点3的交易记录一直缺失2条交易记录”

原来问题出在这里,节点3加入记账网络的时候,节点1和节点2已经提前在内存中同步好了2条记录:“Alice to Bob 50” 和 “Carol to Alice 30"。而这2条记录还没来得及写入到账本,所以即便节点3得到最新账本,也不会包含这两条交易记录。

而继续运行,节点3只会同步之后发生的交易,即:“Bob to Alice 5”。

所以,节点3就会一直缺失那两条记录。

这就好像,一个中学的课堂上,老师在上面讲课,学生在下面记笔记。这时候一个叫老三的学生迟到了,慌慌张张的坐下来之后,不知道老师刚才讲了啥,赶紧管同桌老大借笔记来抄。但是问题来了,老师讲了3道题,老大的笔记只记了1道题,剩下...

Continue reading →


重新创造比特币16:Block Chain

0.前言

Bitcoin的点对点网络架构中,已经实现了交易的同步和账本的同步。

虽然,账本的同步是一个依赖中心化单点Timestamp Server的临时方案,但是我们先不管它。

我们先来关注Gilfoyle想到的新点子,即,账本的拆解。

1.失控中的即兴

咖啡馆,Gilfoyle一进来就看到中本聪已经喝着咖啡在等他了。

中本聪说:“来来,我们继续讨论,昨天你提到的账本拆解的点子。”

Gilfoyle说:“好,等我也要杯咖啡去。”

老板Bob把咖啡端过来:“最近哥俩咖啡喝的挺频啊,来灵感啦?快点升级好,早点让Bitcoin恢复上线啊!”

中本聪说:“好好,我们正努力呢!你再等等,快好啦!”

中本聪嘴上说快了,其实心里一点谱都没有。

这一次系统的演进,可谓Bitcoin的质变,精确系统变成复杂系统,可谓物种级别的突变。

中本聪和Gilfoyle就像是两个探险家,在一片原始丛林中前行,没有地图,甚至没有道路,一切都要根据当下情况,即兴的选择路线。前方是否能走出去,是否存在陷阱,两人都无法预知,只能靠着直觉,在失控中走好下一步。

当然,中本聪喜欢这种失控感,因为失控中的控制力才是真正的控制力。这种体验就像是在悬崖上进行徒手攀岩,精微控制着身体,像壁虎一样吸附在镜面般的岩壁上,品尝着生与死的边缘,那才是真正活着的感觉。

to be or not to be that is a question.

徒手攀岩

2.一石二鸟

中本聪说:“你再把昨天说的点子详细说说呗,账本如何拆解?”

Gilfoyle说:“昨天我说到,账本现在是一个大文件:transaction.txt。频繁全网广播太浪费资源。我们可以将账本文件分割成多个小文件,每个小文件就是一个账页,账页按照顺序串连起来还等价与之前的账本。这样,每次同步只需要广播最新的账页即可。

不过,昨天回去我又有了些新的理解。

账本的本质是什么?

账本的本质是系统中过往交易数据的总和。所以账本代表着系统的过去。

而交易内存池中的数据是系统实时进行的行为,所以交易内存池代表着系统的当下。

记账这个动作,本...

Continue reading →


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

0.前言

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

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

1.问题所在

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

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

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

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

星状网络

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

网状网络

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

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

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

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

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

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

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

2.生命力

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

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

Continue reading →


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

0.前言

上一篇,Bitcoin的点对点网络演进成了一个可以自治的群系统。

这一篇,我们将解决最后一个遗留的难题,那就是分配记账权的单点:Timestamp Server

1.最后的单点Timestamp Server

一大早,中本聪和Gilfoyle就来到了咖啡馆,Bitcoin的记账网络演进成了真正意义上的群系统,这让他俩很兴奋,他俩想乘胜追击,一口气拿下最有一个难题,系统中最后的单点:负责分配记账权的Timestamp Server

中本聪说:“最后这个方案太重要了,如果设计不好,我们之前的努力都会前功尽弃。”

Gilfoyle说:“是呀,记账就等于得到区块奖励,记账权就是利益,分配记账权就是分配利益,这关系到Bitcoin系统的生存还是死亡!”

尽管中本聪预感到了,这次的问题很难,但是没想到会如此困难,简直是进入了绝望之地。

老板Bob看着这哥俩早上来,讨论一天,喝了一桌子咖啡杯,晚上垂头丧气的离开。第二天再来,又是一桌子咖啡杯,又是一无所获。如此反复持续了整整一周。

这一天,中本聪实在脑子不转了,趴在桌子上睡着了。

2.梦中的网络世界

在梦中,中本聪看到了自己创造的Bitcoin世界。

在这个世界中,整个网络像星系一样,缓慢转动着。

中本聪感到一种和谐之美,而自己正是这个世界的造物主。

忽然,中本聪发现了那个叫小男孩的节点。

中本聪拉近了视角,听到小男孩正在和邻居节点牛头人抱怨。

小男孩一脸愤懑:“牛头人,我发现了一个叫黄鼠狼的骗子节点,他获得了记账权之后,不守规矩,偷偷的把区块奖励由50Bitcoin给改成500Bitcoin了,这样他就多得了450个Bitcoin。还好我仔细检查了他广播出来的区块数据,才发现了他的骗子行为,这个黄鼠狼太坏了!”

牛头人说:“啊?是吗?稍等我也看看我这里的账本。”

牛头人翻看着之前同步过的区块数据。

牛头人也愤怒了:“真的啊!黄鼠狼记账的那个区块里,的确给自己的区块奖励写成了500个Bitcoin。这个坏蛋太贪了,我们要告发他!”

小男孩说:“可是,我们应该告诉谁呢?告诉我们的邻居们...

Continue reading →


重新创造比特币19:工作量证明(下)

0.前言

本篇我们就来讨论上一篇引出的核心问题:设计出一个可以证明工作量的题目。

1.寻找随机数

很多时候,现实中冥思苦想的问题,在梦中确可以很轻松的得到答案。

中本聪在梦境中尝到了好处,现在还不是醒来的时候。

牛头人问:“什么样的题目可以证明节点付出的工作量呢?”

小男孩说:“我想到的是:寻找随机数。这就好比去猜测一个人的生日,你只要趴在桌子上一直写呀写,总有一次可以猜中,只不过会花些体力,你付出的简单劳作就是工作量。”

牛头人说:“我懂了,题目的本质就是不含任何逻辑的随机碰撞,随机碰撞最公平。”

小男孩说:“对!我想到的工作量证明题目,猜的不是某人的生日,而是猜一个普通数字,这个数字添加到原来的消息后面,再对其求Hash,使得Hash值前面有很多个0。

大家约定,想要拥有记账权,必须先要找到一个幸运数字,使得“区块消息+幸运数字”的Hash值以5个0开头。

这里的“5”就代表难度,Hash前缀的0越多寻找的难度越大。”

停顿了一下,小男孩觉得牛头人可能没有听明白,于是动手开始实际演示。

因为区块消息比较长,我们用一句简短的消息来代替:"安心即乐土"。

先对这句话求Hash,"安心即乐土"的Hash值为7511cedf823f0757d66c26769c8d15f8597e4384420e6cbebb0acbec5e73344a。

我们看到,一般的Hash值都不会以0开头。

接下来的任务,是找到一个幸运数字,使得‘安心即乐土+幸运数字‘的Hash值的前5位都是0,这个幸运数字就是我们要找的随机数。

我们从0开始,将0添加到"安心即乐土"后面,变成:"安心即乐土0",求得Hash值:0b3844eec6204d01……

因为,这个Hash值不以5个0开头,所以0不是符合规则的幸运数字。

继续寻找,开始体力劳动:

消息+幸运数字 Hash值前N位

安心即乐土0 0b3844eec6204

安心即乐土1 ebf1bbf0e1d2bc

安心即乐土2 45963e7cbe226

安心即乐土3...

Continue reading →


重新创造比特币20:分叉之重组与分裂

0.前言

迄今为止,Bitcoin系统的所有技术概念都已经出场。

本篇我们来看看系统运行过程中的一个现象,即分叉。

Bitcoin系统的核心精神就是竞争。

竞争的表象就是分叉。

1.分叉

咖啡馆,中本聪和Gilfoyle围坐在显示屏前,一行行的文字快速滚动着,就像黑客帝国里的场景。

Bitcoin系统日志

Bitcoin系统日志

天书一般的日志,在中本聪和Gilfoyle看来却犹如一部大片,Bitcoin网络好似一个原始的动物战场,矿工之间进行着力量角逐,微观的混乱中蕴含着整体的秩序。

最原始的力量竞争

最原始的力量竞争

算力就是蛮力,谁的算力大,谁就获得区块奖励。

这样的竞争毫无门槛,规则公开,任何人都可以参与,只要你愿意付出成本(电费)。

大多数时间里,节点之间都在各自挖矿,大家相安无事。

可是一旦网络中同时出现两个区块广播,这就会上演短兵相接的较量。系统中的所有节点都会被卷入,每个节点都要表态,选择跟随哪个区块,选择错了,自己的利益就会受损,记账网络分成两派,这就是所谓的分叉。

好戏就这么开始了:

目前,网络中的最新区块为五角星,这是三爷(节点3)在上一轮挖出的区块。(见下图)

记账网络的和平时期

记账网络的和平时期

新的一轮挖矿开始,小男孩和牛头人几乎同时得出随机数。

小男挖出的新区块为三角形(绿色),牛头人挖出的新区块为菱形(蓝色)。(见下图)

短兵相接

短兵相接

这时候其它节点的难题来了,要在这俩个新区块中做出选择。

选择的方式就是“跟随”,即,基于此区块来挖掘自己的下一轮新区块。

网络暂时形成了两个阵营,这种状态就称之为:分叉(forks)。(见下图)

天下大势,分久必合,合久必分。

天下大势,分久必合,合久必分。

2.重组

此时,系统虽然分叉,但是不影响用户使用。

无论客户端连接到哪派,业务处理都一样。

交易写入,两派节点都会写入到交易内存池。

交易查询,两派节点都会返回同样的结果。(内存池+区块,两派相同)

系统是否分叉,用户是感知不到的。

这就好比,美国的总统竞选期间,国会依旧照常办公。

两派的竞争的结果取决于谁呢?

答案是取决于下一轮挖出新区块的节点。

小红帽率挖...

Continue reading →