最近区块链大热,走到哪儿都有人在讨论区块链和比特币,甚至于一些对密码学完全没有概念的人都开始大肆吹捧,不免让人嗤之以鼻。相信很多技术和非技术的朋友都希望能够更深层次地去了解它是如何工作的。本文将用不到四千字来尝试阐述区块链的实现原理:
为什么需要区块链这么复杂玩意儿?
For every complex problem there is an answer that is clear, simple, and wrong.” — H. L. Mencken
在这里不尝试去给区块链一个准确的定义,而是通过区块链可以被使用的地方去分析和深入理解这项技术可能给世界带来的改变。
可以想象一个场景,你的朋友Joe在国外旅行,在旅行将要结束的第五天,他打电话给你说自己需要借点钱。你在接到电话之后会通知银行进行转账到Joe的指定账户,银行客户经理审查你的账户余额是否足够之后打钱给指定的Joe的账户。然后银行会产生一条转账记录:
在打帐成功之后,银行通知你钱已经转账到位然后你会通知Joe打帐成功让其确认。
这样的转账方式是我们目前乃至几个世纪之前一直使用的,我们需要一个第三方机构进行担保,才能在彼此之间建立一种信任。但是这样的方式往往机构是单一的,也就是说如果这个第三方机构产生腐化,那么造成的影响也是巨大的(金融次贷危机的屡次发生),这就需要很多的人力去维持机构的工作以及政府的有力监管(政企腐败难以监管)。同时还会面临可能出现的几个问题:
- 如果这个第三方机构的数据在一次火灾中被烧毁或者数据库数据直接被篡改。
- 又或者客户经理(第三方机构)在转账数额上动手脚,客户可能根本无法感知到(可以关注相关新闻)。
多年以来我们都将所有的鸡蛋放在第三方机构,并且建立了一种习惯上的信任。
那么我们是否可以自己去建立这种信任,而不是通过第三方…….
所以,区块链是如何工作的?
要达到不通过第三方的目的,我们需要聚集这些志同道合的人形成一个团队,以某种方式在内部建立一种信任机制。
一个空的文件夹
现在我们发给每个人一个空的文件夹,这个团队内部所有的交易都会被写到各自的文件夹中,这些所有文件夹的集合共同建立了一种信任机制。
发生转账事务
每个人都配有一支笔和空白页,当团队内部发生转账交易时,会记录在自己的纸上,纸张满了会将其存入文件夹。那么我们假设#2想转10美元给#9,然后2号大喊一声:“我要转10块钱给9号,所有人都写下这笔记录”。
然后每个人都去check一下2号是否有足够的钱去支持这笔转账,如果有的话每个人都写一份记录在自己的纸上。
持续产生转账记录
通过这样的方式团队中每个人想转账就喊一声让其他人记录下这次转账记录,假设一张纸可以写十条记录,那么十条记录写满之后就需要将这张纸存进文件夹,然后拿出一张新的纸开始循环第二步。
在我们将写满的一页加入文件夹时,我们需要考虑一个问题如何保证这张被记录的纸是可信任的(所有的记录都未被篡改,所有人的纸张内容不一定一致,即使通过非对称加密保证通讯的加密性也不能保证每个节点都是忠诚的为这个分布式系统服务),那么我们需要给这张纸的内容盖一个印章。盖这个章的目的:
- 保证团队所有写入的记录都是未被篡改而且一致。
- 保证团队从文件夹取出的历史记录未被篡改。
如何去进行签章
以前我们通过第三方/中间人建立信任,无条件信任第三方。在区块链这样的分布式和分散系统中,这个印章将会提供信任。在进行签章之前我们需要了解hash算法:
Given an output, it is extremely difficult to calculate the input, but given an input and output, it is pretty easy to verify if the input leads to the output.
- 无冲突。任何一个a通过hash算法能生成一个唯一对应的b。
- 不可逆。任何一个a通过hash算法生成的b是不可逆的,也就是知道b不能推出a。
那么我们可以用一种box的概念来描述这种算法:
一个input对应一个output,现在我们可以假设我们要得到的结果必须以三个零开头,得到这样的结果集算成功。
然后开始不停地计算和重试,挖矿的过程就是计算签章的过程,实际的过程比这更复杂,但是可以用这种方式类比。
经过无数次尝试可能得到结果:
大专栏 WTF is The BlockChain?进行签章?">如何利用hash算法去进行签章?
在hash算法的基础之上,我们需要关联纸张中的内容,通过下面的算法得到签章:
矿工帮我们计算好的到的签章数字为“21191”:
然后我们将签章通知团队中所有的人,他们会各自验证,这个签章的值+纸张内容值的hash结果是不是符合000开头的标准。只要大多数通过,那么这个数值有效,挖出这个数值的矿工会获得相应的奖励,最后所有人都签上这个签章,然后将记录存储在文件夹中:
在矿工工作的过程中,也可能产生欺诈行为,错误的签章数字不能通过团队其他人的校验。其他人如果内容记录被修改过也不能通过校验,这样就保证了被存储的记录永远是可信任的(通过大多数人一致的原则保证)。在挖矿的过程中会消耗“燃料”,这个成本和电力的消耗是巨大的,团队中每个人必须签上章,签章校验不过可能的原因:
- 节点可能误听了网络中的交易。
- 节点可能错写了网络中的交易。
- 节点可能试图盗取或者欺骗网络中的其他节点。
当然无论出于何种原因,校验不通过的节点只能从其他节点中拷贝一份账本到自己的文件夹中。
为什么要建立一种竞争机制
我们可能有个疑问,为什么花费大量的资源去计算这个签章值,建立在竞争机制下的计算出了第一个算力的结果值是有效的。其他的算力都是在产生浪费,之前新加坡一家区块链公司针对比特币产生的大量资源浪费提出了分块计算进行资源利用的优化,但是并没有消除这种竞争,那么我们为什么需要这种竞争?
这就是我们需要了解的激励机制,每个区块链中的节点都可以去竞争这个奖励。第一个计算出来签章的会获得一定的奖励(在消耗大量cpu和电力资源的前提下)。
假设五号计算出了这个签章值,它会获得这个奖励可能是1bitcorn,它的账户余额也会相应增加。这就是比特币以及大多区块链一致存在的原因,不断会有新的节点加入挖矿,成为分布式账本中的一员参与竞争。只有足够多的节点加入,这个区块链才能建立一种更为健全的共识机制。
当有足够的人拥有比特币时,他们的价值就会增长,使其他人想要比特币;使比特币进一步增长;使更多的人想要比特币;使其进一步增长;等等
激励机制使网络中所有节点都在努力工作。
在此之前我并没有提到过一个问题,想象一下如果我们现在的文件夹已经存储了五页纸张,都被签上了各自的签章。那么如果我找到第二页并且企图去修改一次交易信息?签章会保证这次修改再取出的时候被检测到被修改对吧?但是如果我同时计算一个新的签章,并且替换掉旧的签章呢,我可以修改一个就可以修改网络节点中其他的节点,当超过百分之五十的节点都被篡改了签章,那么这页数据也就被成功篡改,网络的共识机制无法感知。所以我们的区块链设计有漏洞?
如何防止签章被篡改
我们其实很容易想到,在上面产生签章的模型中我们用了页面的内容和一个未知值作为input,实际上如果要防止签章数字被篡改。我们可以在input中增加一个数值,将上一页的签章数值作为这一页数值计算的输入:
当我们通过这样的方式将每一页的数据关联在一起的时候,如果有人试图去篡改某一页的签章,那么它需要篡改之前连续很多页的签章和内容,这样的代价是极大的,修改一个节点数据的代价是完全创造一份新的数据,然后为了破坏共识机制还需要修改网络中大于一半的节点数据。
也就是说基于现在区块链的设计,你需要不断去产生新的区块,篡改节点全部的数据,通过计算不断去篡改,但是一个人的篡改速度远远没有其他节点继续计算和不断回写数据的速度。即使是针对同一个节点,最长的链也永远是最可信的:
Longest chain is the honest chain.
绿色的部分是篡改者企图想要开启的一条篡改的链路,红色的部分是正常发展的链路,下面的链路计算能力永远大于上面链路的计算能力,基于共识机制团队中大部分人都是诚实的。
团队中超过半数的人不诚实?
这就是区块链如果可能会崩溃的唯一脆弱的原因。 要知道,这是不太可能发生的,但我们都必须知道系统的弱点。 它建立在大多数人群总是诚实的假设之上。
总结
本文希望给大家一个对区块链较为深入的了解。区块链是如何达到去中心化的目的的,明白了共识机制以及共识机制的基本条件,我们可以尝试去理解区块链能够如何改变我们的生活。其实不难发现,区块链的设计并没有那么复杂,将所有的节点理解为区块,每个区块都是链接起来的账本数据。
向创造区块链思想的中本聪致敬,我们需要从不同的角度去思考现在的生活,正如乔布斯所说,世界上没有一种设计是理所当然的。也许有一天我们不再需要键盘来操作电脑,于是苹果设计了触摸板,至今没有用过比这更有创意的快捷操作。
最后,希望我们都能想孩童一样去思考,创造一个不一样的世界。