这一章,我们尝试解决这样的问题:万一我们的数字档案馆断网了,倒闭了,被灾难摧毁了,怎么办?
玩过游戏的都知道,防止老家被一波摧毁的策略就是开分基地。
在这里,我们拿加盟连锁店来类比。我们的数字档案馆必须有很多个“连锁店”。它们都有独立经营的能力,当其中一部分连锁店关闭时,剩下的连锁店可以正常工作,随后新的连锁店又可以随时加盟。只要不是同时瘫痪,我们的存证服务就可以一直运行。为了让全球各地都能享受到高效服务,最好各地都有连锁店。
需要注意的是,我们不能有“总部”,有总部就会有弱点!
用户在使用的时候,需要向多个节点都发送数据。这时,我们会发现一个新的问题,多个连锁店的数据不一致怎么办?
举个例子。如下面这幅地图所示,巴黎、迪拜、北京各有一家连锁店。在某一时刻,伦敦、伊斯坦布尔、上海同时有人发出数据请求存证,数据分别是A、B、C。
假设,数据传输的时间和城市之前的距离成正比,那么图中 3 个连锁店接收到的 3 条数据的顺序就会不一致:
-
巴黎:A - B - C
-
迪拜:B - A - C
-
北京:C - B - A
所以,它们制造的哈希链条也会不一样。
哈希链条不一样会有什么后果呢?后果就是历史没有统一的标准,遇到有冲突的数据,无法判断哪一个是真实的历史数据。新加盟的连锁店,可以自己制造一个哈希链条,调换里面数据的顺序,或者直接修改数据,谁也不能说它是错的。所以,这些连锁店的历史数据是一定要保持一致的。
怎么让哈希链条一致呢?我们想一个开创性的办法,把哈希链条分割成很多段,每一段以其中某一个连锁店为准。
那怎么划分“段”?按时间划分还是按长度划分?
由于要做到“每一段以其中某一个连锁店为准”,意味着这些连锁店之间要通信,拿到某“段”话语权的连锁店,需要将它的这一段哈希链条的排列顺序告知其他连锁店。
如果按长度划分段,那么随着社会发展,数据量越来越大,每一个段对应的时间就会越来越短,最终短到几毫秒,几微秒,远低于信息在地球上传播所需的时间,这样的系统很难设计。
所以,我们考虑按时间划分段。具体多长时间,我们以后再定。假设是 10 分钟,哈希链条就被划分成 10 分钟一段的链条,如下图所示。
我们换一种方式画图,注意,仅仅是换了图示,并没有改变数据结构:
可以发现,哈希链条可以被看做“段的链条”,我们给“段”换个名字,叫“区块(block)”,那么哈希链条就变成了“区块的链(chain of blocks)”。这就是区块链的雏形了。
那么,目前我们的结论是:每一个区块服从某一个连锁店,如下图。
到这里,我们应该给“连锁店”再换一个概念。和生活中的连锁店不同的是,我们不能给前来加盟的商家设置任何门槛,它们不需要得到我们的许可就可以加盟。只有这样,这个系统才能脱离我们,永远运行下去。这些连锁店应该被称作我们的全球统一存证系统的节点。
所以,这篇文章的结论是:
为了存证系统永远在线,我们需要多个节点。
每个区块服从一个节点,保持历史区块链条一致。
这时,又引出多个新问题:
-
什么原因能驱使节点提供存证服务?
-
如何决定每个区块听谁的?
-
何时以及如何在节点之间同步区块?
不用担心,我们都能解决。