教你读懂区块链:荒岛求生记
摘要: 如何在荒岛上,运行一个最简单的区块链共识机制?
想象一下美剧《迷失》开头的场景:一架满载的客机坠毁在南太平洋的某个小岛上。只有四名幸存者:Hugo, Sawyer, Kate和Jack。其中Hugo是种菜能手;Sawyer在飞机残骸里找到一把斧头,用来砍柴;Kate是个出色的猎人,擅长捕猎野猪;Jack那儿有抗生素等药品。就这样,岛上以物易物的原始经济方式开始发展了。
后来,Jack提出引入“金钱”的概念来方便大家的岛上生活。由于岛上没有金属来铸造硬币,Jack建议大家把交易转账信息告知他,然后他会写在纸上,每人的初始金额是100个币。然而,大家觉得谁来记帐都不公平,Jack的提议随之搁浅。随后,岛上以物易物的经济陷入了僵局。
在这种情况下,你会发现了解如何运行去中心化共识机制是非常重要的——换句话说,去手动操作一个简单的区块链。你需要的有这些:几位幸存的同伴,这篇文章,以及一支笔和几张纸。
让我们回到之前的情境,同我们英勇无畏的英雄们一起度过难关——Hugo, Sawyer, Kate和Jack乘坐的飞机坠毁在南太平洋的某个荒岛上。
他们尝试使用一种革命性的新货币“IslandCoin”——来结束岛上已经瘫痪的物物交换经济。大家一致同意最开始每人手中有100枚硬币。但是由于岛上没有金属来铸造硬币,所以他们只能用几张纸来制作。因为信任问题,大家无法制定某一人,而是只能一起维护决定一起来维持秩序。
这就是共识机制可以发挥用场的地方了。让我们从可运行的最简单的区块链开始。在之后的文章中我们再探索其他的方法,并与一些概念相结合,如PoS(Proof of Work)和PoW(Proof of Stake),来更清晰的看到其中的好处和缺陷。但现在,一切从简。
我们想要达到什么样的效果?实际上很简单——我们只需要在纸面上做好关于“余额”的表格。这个表格可以显示每人手中硬币的数量。问题在于,我们不可能将某一张纸作为硬币余额数唯一的凭据,因为一切都必须要公平,要让每个人手中都有一份,这就是去中心化。当然,我们还希望这四张纸的显示数量都是一样的,这就是共识。
那么这张纸看起来会是什么样子的呢?
这张纸上的内容是开始我们就已经达成一致的,所以纸上标记着“第1天”。我们怎么来维持公平?一开始,我们就商定每人都有100枚硬币,每人也都在纸上签了字。选谁来都一样,所以由Hugo来把这张纸复印后发给每人一份(这个岛上有一台很棒的复印件,前面我没提到)。
由于大家硬币的余额会发生变化,所以我们会在每天晚上更新纸上的内容。也不会每天都由Hugo来印纸,因为我们要尽量保持公平。
另一点很重要的是,由于相互间缺乏足够的信任,每个人都会去更新硬币的余额。所以最简单的方法就是让每个人都在纸上面签字——前提是他们都同意上面的内容。
纸上要有几个人的签名才会被认可?我们想要达到共识就要有大多数人同意。那么我们四个人至少要有3个人的签名。
为什么我们不要求4个人都签名?因为可能某一个人会有一些困难。如果Sawyer出去旅行几天的话,直到他回来之前我们都更新不了,这种权利就过大了。
为什么我们需要至少三个人的签名?如果我们只需要4个人中的2个,可能有2个人(比如Hugo和 Sawyer)签署了一个版本,Kate和Jack签署了另一个不同的版本。我们不可以有两个不同的版本。
...
第二天一早,Kate想要买一个番茄。Hugo卖两个硬币一个。Kate想要转2个硬币给Hugo,她拿出一张纸条写上:
这是Kate的第一笔帐,所以她这样写。然后,Kate在纸上签了字。我们必要靠她的签名来确保别人不能伪造她的转账。
第二天晚上,大家来更新表格。Hugo把第一天的纸条发给大家让大家签字,大家会按顺序轮流来做更新:Hugo, Sawyer, Kate, Jack, Hugo, Sawyer等等。这样的话就是Sawyer来更新第二天的。Hugo发了纸条给大家,上面有Kate的转账。
Sawyer的这份并不是最终的那份,因为上面只有Sawyer签名。他需要收集更多的签名。Sawyer找到大家,要求每个人进行核实并且签名。这个纸条很容易验证。首先,他必须查看他自己的纸条并找到前一天的余额(本案例中为第一天)的纸条。然后,检查新的转账记录。
本次我们只有Kate的一笔转账。这笔转账很容易被验证,我们可以确定它确实是由凯特签署的,我们可以确定Kate确实有足够的硬币来支付给Hugo。一旦每个人都完成审核程序并签署文件,Sawyer就有了一份最新的纸条,在第二天发布给所有人。每个人都会留一份副本,然后开心满足地睡觉。
...
第三天,整个系统运作良好,每个人都开心地用币。
Hugo想用10个币向Sawyer买些木头。
Sawyer想用25个币从Jack那买些药。
Jack想用2个币向Hugo买一个番茄。
大家把每笔交易用纸条记录下来:
晚上,Kate把纸条打印好发给大家。为了确保Kate的纸条上包含了大家所有的转账,每个人都要把自己的转账请求纸条复印一份给她。因为转账的人可能记不住今天是由谁来更新余额。
Jack没有及时把他的转账纸条给Kate, 而Kate已经写完了今天的记录:
Jack担心今天他的转账不能通过——这就意味着Hugo收不到他的转账,不会卖番茄给他,晚上就会饿肚子睡觉了。他只好去找别的东西吃,没有给Kate的纸条签字。好在Kate得到了其余三个人的签字:
Kate的纸上有了三个人的签名,每个人都证实他们的余额正确,所以这次的结果通过了。
...
第四天,没人知道Jack去哪了。前一晚他去钓鱼了,不巧遇上了风暴,回不来了。这就出现问题了,因为今天刚好轮到Jack来印纸条。
Kate今天想转两次帐,她把内容写下来,然后发给大家:
...
到了晚上,Jack还没有回来。其他三个人商量好,因为找不到他,今天的余额更新暂停。
...
第5天,轮到Hugo 来做今天的更新。下了好几天的雨,Hugo想找个更暖和的地方休息。他问Sawyer能不能给他建一座小木棚。Sawyer想要200个硬币的报酬。可是Hugo只有98个硬币,他有个大胆的想法:今天他来做余额更新,干脆就直接在纸条上写上转给Sawyer 200个硬币好了。
今天没有其他的转账。但是Hugo有Kate昨天的转账和Jack前一天最终没完成的转账。他把这些和他的“假转账”放在一起:
Hugo这样写道,虽然他的转账是假的。为了通过今天的余额更新,他必须得到另外2个签名。当他找到Sawyer和Kate时,他俩注意到之前的表格中(从第3天),Hugo只有92个硬币。他怎么可能转给Sawyer 200个?
他们拒绝在纸条上签字,除非Hugo 把他的数量改正,去掉这个无效的转账。Hugo只好勉强同意发布一份正确的新资产负债表。他不情愿地改正了,又重新打了一份表格之后,Sawyer和Kate才签了字:
最终表上有了三个签名。
...
第6天一早,Jack终于回来了。由于风暴,他这几天过的不容易,错过了前两天的转账和更新。实际上,他不确定自己有多少个硬币。他找到了他看到的第一个同伴,问他最新的余额。他看了第5天的更新然后同意了Kate在第三天的转账。
Jack很容易就和大家同步了。他可以看到表格的更新的确有三个人的签名,所以相对准确。他还可以根据这些转账来自行计算他的余额(送第二天开始)。Jack可以直接参加今天的更新,就像什么都没错过一样。
该系统似乎运作良好。这确实是个简化版本,但对于岛上的居民来说已经够用了。毕竟如果没有白皮书,很难拥有一个可正常运作的区块链!他们四个人坐下来,一起庆祝这个巨大的成就。
为什么这可以算是区块链?
对于初学者来说,每天发布的更新都代表一个区块。每个区块都被编号并指向前一个区块——形成了一个区块链。为了验证当前状态的平衡,任何人都必须从链的起点开始(第1天——创世区块),并依次验证每个块。这种平衡是一步一步建立起来的。
这是一个理想的区块链实施吗?可能不是。它在许多方面还需要改进。例如,它只能支持这四个人。如果还有另外一个人怎么办?这个区块链也适用于他们吗?这一协议需要许可,我们怎么把它变成无需许可协议?如果我们想在其中使用工作量证明(Proof of Work)和股权证明(Proof of Stake)怎么办?我们将在以后的文章中探讨这些问题。
本文由Tal Kol 发自Hacker Noon网站, 熊小猫为您做了不改变原意的编译。
评论(0)
Oh! no
您是否确认要删除该条评论吗?