视角杂志

只用纸和笔,怎样玩转区块链?

子川 思想

译者按

在区块链过气前,有必要向大家普及下区块链的运作原理到底是什么。作为区块链应用的开发者,Tal Kol以荒岛求生为例,形象具体地阐述了一个最简的区块链模型。

要是你被困在荒岛上,知道如何达成分布式共识——也就是说,手动运行一个最简单的区块链——会很有用。你所需要的只是一些幸存者,这篇文章,还有一支笔和几张纸。

回到原来的故事,让我们和那几位无畏的英雄们一起经历这个过程:雨果、索耶、凯特和杰克,他们的飞机刚刚坠毁在南太平洋的某个荒岛上。

简要回顾:这拨人正在努力实施一种叫做岛币的革命性新货币,这种新货币将结束这个岛屿不中用的以物易物交易。每个人都从100个硬币开始,所有人都同意这很公平。由于缺少铸造硬币的金属,他们只能靠几张纸完成。因为信任的问题,他们无法由谁来记录交易。所以,他们只能共同记录余额。

我们将从最简单的区块链实现开始。之后的文章里,我们可以探索其他能实现的方面,并与工作量证明(Proof of Work)和持有量证明(Proof of Stake)等挂钩,这将帮助我们看到它的利弊。但现在,让我们从最简单的开始。

我们想达到什么目的?其实很简单,我们只想在纸上记账,而这个账本会显示每个人有多少硬币。诀窍在于,因为一张纸并不能让我们确保真实无误,而我们又需要保证平等,所以得让每个人持有他们自己的版本——这是所谓的“分布式”。当然,我们也希望所有纸最终显示的一样——这是所说的“共识”。

那这张纸长什么样?

雨果有100个币,索耶有100个币,凯特有100个币,杰克有100个币

雨果签名 索耶签名 凯特签名 杰克签名

这张纸是我们第一次达成的一致意见,也是为什么它被标记为第一天。余额是从哪来的?我们之前已经达成共识,一开始每人100个硬币是公平的。我们还需要有人来写这张纸

这张纸是我们第一次达成的一致意见,也是为什么它被标记为第一天。余额是从哪来的?我们之前已经达成共识,一开始每人100个硬币是公平的。我们还需要有人来写这张纸。到底是谁并不重要,就让雨果来吧。他会把这张纸发给每个人,确保他们都保存一份(忘提了,岛上有一台神奇的复印机)。

因为余额会变,所以我们每天结束时都要更新一下。不过也并不总是雨果发布更新,毕竟我们想让事情尽可能公平。

另一个关键是,由于团队互相缺乏信任,需要让每个人单独对更新进行确认。做到这点有个简单的方法,让每个人签署每份文件,前提是他们同意上面的内容。

一份文件需要多少人签名,才能被认为是最终的决议?因为要达成共识,所以需要多数人参与。我们总共有4个人,那么在4个人中多数人指的是至少3个。上面的文件是由四个人签名的,所以这个决议绝对是最终的。但为什么我们不要求所有文件上都有全部的签名?因为这会让一个人危及整个过程。如果索耶钓了几天鱼,只要他还没回来,这个团队就不能更新收支,这给了一个人过多的权力。 那为什么我们需要多数,2/4的签名还不够?如果我们只需要4个中的2个,最终我们可能会有两个人(像雨果和索耶)签署的一个版本,另外两个人(凯特和杰克)签署了另一个不同版本。我们认定的最终方案不能有两个相互矛盾的版本。

第二天早上,凯特想买一个西红柿。雨果的西红柿价格是2个硬币。她想把两枚硬币转给雨果,凯特拿起一张新的纸,在上面写下转账的内容:

凯特动作#1:向雨果转账2两个币 凯特签名

这是凯特的第一次动作,所以她就按上面这么写了。当然,凯特签署了这份文件。我们必须有她的签名,以确保没人能伪造她的转账申请。

第二天即将结束,他们希望公布最新的账本。雨果在第一天就把账本公示了出来,并集齐了每个人的签名。这种事情轮流做会更有效。所有人同意用一个简单的旋转顺序:雨果,索耶,凯特,杰克,雨果,索耶等等。这意味着第二天就要由索耶负责公布文件了。他公示的文件显示了凯特的转账:

第2天

凯特动作#1:向雨果转账2个币 - 凯特签名

雨果现在有102个币,索耶有100个币,凯特有98个币,杰克有100

索耶签名

索耶记的账本并不是最终的,因为它只有索耶的签名,他还需要更多签名。索耶要求每个人核实并签字。账本很容易核实,验证者可以先查看下他自己手头的文件,并找到前一天(即第一天)的记录。接下来,验证者需要重新检查新的转账。我们只有一个凯特的转账记录,并且很容易验证,我们可以确保它确实是由凯特签名的,也能确保凯特确实有足够的硬币来支付给雨果。

一旦每个人都核实好并签完名,索耶就有了第二天的最终账本,并能公布给每个人。每个人都复制了一份,然后高兴地睡了。

第2天

凯特动作#1:向雨果转账2个币 - 凯特签名

雨果现在有102个币,索耶有100个币,凯特有98个币,杰克有100

索耶签名 雨果签名 凯特签名 杰克签名

到第三天,这套系统运行良好,每个人都开开心心地花钱。雨果想用十个币从索耶那买一些柴火,索耶想从杰克那里拿25个币的药丸,杰克想要一个西红柿,他想付给雨果两个币。 他们各自创建了一份文件,详细描述了他们的转账:

雨果动作#1:向索耶转账10个币 - 雨果签名

索耶动作#1:向杰克转账25个币 - 索耶签名

杰克动作#1:向雨果转账2个币 - 杰克签名

夜晚临近,今天轮到凯特公示余额了。为了确保凯特把这些转账放在她的账本中,他们每个人都需要给她一份申请转账的复印件。其实有必要把转账的副本分发给每个人,因为想要转账的人不一定记得今天轮到谁公示更新。

杰克一直纠结要不要把转账申请的复印件给凯特,当他把它拿给凯特的时候,她的收支表已经写好了:

第3天

索耶动作#1:向杰克转账25个币 - 索耶签名

雨果动作#1:向索耶转账10个币 - 雨果签名

雨果现在有92个币,索耶有85个币,凯特有98个币,杰克有125

凯特签名

杰克很沮丧,收支表里没他的转账。这意味着雨果不会收到杰克的西红柿钱,也不会把西红柿当晚餐卖给杰克,杰克今晚只能饿着肚子睡觉了。他还没在凯特的账本上签名,就出去找别的东西吃了。不过凯特从其他人那能得到足够的签名:

凯特设法在账本上获得了3个签名,每个签名都确保了余额确实与今天的转账和昨天的余额相符。多数人的签名在列,这个账本也就被承认是最终的版本。

到了第四天,没人知道杰克在哪。前一天晚上他去钓鱼,遇到了暴风雨,没回营地。问题来了,因为今天轮到杰克公布。

凯特今天想转下账,她写在一张纸上,并给每个人一份复印件:

凯特动作#2:向索耶转账10个币 - 凯特签名

凯特动作#3:向雨果转账2个币 - 凯特签名

直到晚上,杰克还没回来。之前大家已经确定由他来公示余额,但他不见了踪迹,所以今天的账本更新被跳过了。

第五天,雨果负责公布当天的更新。雨已经接连下了几天,雨果想找个暖和的地方睡觉。他让 索耶给他建一个小木屋,索耶想要200个币。这该怎么办?雨果只有98个硬币。雨果想赌一把,今天由他公布账本,那为什么不把这笔钱全都转给索耶呢?

雨果动作#2:向索耶转200个币 - 雨果签名

今天没有其他转账。不过,雨果有凯特昨天转来的钱,而杰克前一天的转账也不算数。他补上了这些,加上他的新的疯狂转账:

第五天(第四天跳过)

凯特动作#2:向索耶转账10个币 - 凯特签名

凯特动作#3:向雨果转账2个币 - 凯特签名

雨果动作#2:向索耶转账200个币 - 雨果签名

杰克动作#1:向雨果转账2个币 - 杰克签名

雨果现在有0个币,索耶有295个币,凯特有86个币,杰克有123

雨果签名

即便他的转账不对劲,雨果仍然对这条更新签了名。为了使这条更新得到通过,他还需要收集另外2个签名。当他走到索耶和凯特那,他们注意到上一个的资产负债表上(从第三天开始),雨果有92枚硬币,他怎么能转给索耶200枚?他们拒绝签字,直到他修正这个错误,并删除这条无效转账。雨果不情愿地同意并公布了一份正确的新资产负债表,他们最终签署了这份协议:

第五天(第四天跳过)

凯特动作#2:向索耶转账10个币 - 凯特签名

凯特动作#3:向雨果转账2个币 - 凯特签名

杰克动作#1:向雨果转账2个币 - 杰克签名

雨果现在有96个币,索耶有95个币,凯特有86个币,杰克有123

雨果签名 凯特签名 索耶签名

这张收支表上有三个签名,所以被认定为最终版本。

第六天早晨,杰克终于回到了营地。这几天,他在暴风雨里吃了不少苦头。过去两天的讨论他没有参与,也没有公布新的转账和新的账本。实际上,他不确定自己有多少硬币。杰克询问他见到的第一个同伴,他错过了哪些最新消息。杰克得到了第五天的最后更新,以及第三天凯特发布的账本。

杰克很容易与其他人再次同步。他能看到每次收支表的更新都签署了至少3次,同伴们都很靠谱,他也就放心了。杰克也可以根据这些更新(从第二天开始)自己进行计算,这样他就能参与今天的转账,什么都不会错过。

这个系统似乎运转良好。的确,这个模型有点过于简化,但足以满足岛上居民的需要。不过,没有白皮书,我们就不会有一个正常运作的区块链!所以大家坐下来,通过公布以下伟大的文字来庆祝这个成就:

为什么这被认为是区块链?首先,每天发表的每一个文件都代表一个区块。每个区块都有编号,并指向前一个区块,从而形成一连串的区块。为了验证当前的平衡状态,任何观察者都必须从链的起点(第一天,创世区)开始,并一个接一个地连续验证每一个区块。余额是逐步建立起来的。

实现的这个区块链足够理想吗?也许并不,很多方面它都可以改善。例如,它只支持这4个居民,如果又来一位幸存者怎么办?这个协议能够容纳他们吗?这个协议目前有权限控制,我们怎样才能使它开放权限呢?如果我们想要修改它来使用工作证明或者股权证明呢?

我们将在本专题的之后内容中探讨这些想法。

子川