Image Courtesy: Medium
好了,让我们想象一下,有一群拜占庭将军想要攻打一座城市,他们将面临两个不同的问题:
为了让合作成功,位于城堡左边的军队派遣一位信使,向城堡右边的军队发送了一则内容为“周三攻击”的信息。
然而,假设右边的军队没有做好攻击准备,并让信使携带一则内容为“不,周五攻击”的信息返回。
而信使需要通过穿越被攻打的城市返回到左边的军队,那么,问题就来了。在这位可怜的信使身上,很多事情都有可能会发生。
例如,他有可能被抓获、泄露信息、或被攻打的城市杀害后将其替换了。
这将导致军队获得被篡改过的信息,从而使作战计划无法达成一致而失败。
上述例子对区块链有明显借鉴意义。区块链是一个巨型网络,你要如何信任他们呢?如果你想从钱包里发送4个以太币给某人,你如何确认网络中的某人不会篡改信息,将4个以太币改成40个?
中本聪发明了工作量证明机制来绕过拜占庭将军问题。
其运行原理是:假设左边的军队想要发送内容为“周一进攻”的信息给右边的军队,他们需要执行如下步骤:
首先,他们会给初始文本添加一个“nonce”,这个nonce可以是任何一个随机十六进制值。
其次,他们将添加了“nonce”的文本进行哈希,得到一个结果。假设说他们决定仅当哈希结果前5位是零的时候,才进行信息共享。
如果哈希结果满足条件,他们就会让信使带着有哈希结果的信息出发。否则,他们会持续随机改变nonce的值,直到得到想要的结果。这一过程不仅冗长耗时,且占用大量的算力。
如果敌人抓到了信使,并企图篡改信息,那么根据哈希函数的特性,哈希结果将会剧烈变化。如果城市右边的将军看到信息没有以规定数量的0作为开头,那么他们就会叫停攻击。
然而,这里有可能有个漏洞。
哈希函数并不是100%免碰撞的。那么,如果城市中的敌人拿到信息之后将之篡改,并通过不断改变nonce值,获得了以规定数量的0作为开头的结果,那该怎么办?
虽然极度耗时,但是仍然可行。针对这种情况,将军们可以使用数字的力量。
假设,如果不是1个左边的将军给1个右边的将军发送信息,而是有3个左边的将军来给右边的将军们发送信息。
为了实现上述目的,他们可以制作自己的信息,然后对累积的信息进行哈希。
紧接着,再给哈希结果添加nonce值后,再次进行哈希。这次,他们希望产生一个以6个0开头的信息。
显而易见,这将会非常耗时。但这次,如果信使被城市抓获,那么敌人想要篡改信息,并且找到符合结果的nonce值,将会耗费无限长的时间,可能历时数年。
例如,将军们派遣多个信使,那么,城市在计算到一半的过程中就可能会遭受攻击并且被摧毁。
右边的将军们要做的非常简单。他们只要将之前给他们的正确的nonce值添加在信息上,并进行哈希,然后对照其结果是否匹配即可。
对一个字符串进行哈希是非常容易的。那么,从本质上来说,工作量证明的过程是:
零知识证明
什么是零知识证明(Zero Knowledge Proof, ZKP)?ZKP意味着A可以向B证明,他知道特定的信息,而不必告诉对方自己具体知道些什么。
在这个例子中,A是证明者,B是验证者。在密码学中,这尤为有用,因为这将为证明者提供一层额外的隐私保护。
运行一个ZKP,要满足以下这些参数:
完整性:如果陈述属实,那么诚实的验证者能被诚实的证明者说服。
可靠性:如果证明者不诚实,他们无法通过说谎来说服验证者相信陈述是可靠的。
零知识:如果陈述属实,那么验证者无法得知陈述的内容是什么。
举一个零知识证明的例子。让我们观察一下阿里巴巴洞穴是如何运作的。
在这个例子中,证明者(P)对验证者(V)说,他知道洞穴后面暗门的密码,并提出在不向验证者透露密码的情况下证明此事。那么,其验证过程如下图所示: