酷玩网

什么是区块链零知识证明(zero-Knowledge)

linx
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

零知识证明(Zero-Knowledge Proof),这个二进制的“杀手级”技术,却始终被一层神秘的面纱所笼罩。它的广告听起来如同梦幻,在不透露任何信息的前提下,让人深信不疑地相信它的神奇。那么,从事电话诈骗,难道不是更快地赚取财富的方法吗?

那么,零知识证明究竟可以保护哪些隐私信息?它是如何保护的?只有了解了这些基本问题,我们才能真正了解它的能力所在,以及它的局限性。

虽然理解零知识证明的概念并不容易,但证明它的过程却相对简单。然而,如果文章中充满了令人眼花缭乱的数字符号,我们可能会感到眼前一片模糊,心中却一片茫然。自己就是那个“零知识”啊〜

实际上,要了解零知识证明的形态,最好的方式还是通过模仿,模仿区块链的实际需求。

没有秘密的区块链

区块链是一个一切都在阳光下透明运作的世界,所有的交易,包括交易的双方、金额等所有信息,都是公开透明的。一个典型的(但简化的)交易可能如下所示:

ps。0x0001的余额是1,500

之所以需要如此详细的信息,是为了让任何人(尤其是矿工)都能轻松验证这笔交易的正确性。我们需要验证Bob(0x0001)是否至少拥有1000元,才能将钱转账给Alice(0x0002)。为此,我们至少需要知道:

鲍勃(0x0001)目前的余额(1,500元)这笔交易的金额(1,000元)

这样任何人(尤其是矿工),只要执行isValid函数,就能确认这笔交易的合法性。

但这样一来,所有的秘密就都暴露在阳光下。每个人都知道0x0001的资金流动状况。区块链对0x0001的唯一保障,仅在于你不知道0x0001就是鲍勃这一点。

零知识证明的区块链

零知识证明试图解决这一问题,它希望交易看起来是这样的:

ps。0x0001的余额是xxx

这里的???,xxx是经过哈希处理后的数字,分别代表1,000和1,500。

问题是,你只有xxx和???,如何确定xxx≥???呢?这就是零知识证明登场的地方。我们不需要知道这些金额的实际数字(零知识),只需要知道isValid函数会返回真值即可。

让我们重新审视一下这个函数:

余额和金额是秘密的,xxx和???是哈希后的值。我们希望任何人在不知道balance和amount的情况下,可以相信这个函数会返回真值。我们给这个函数一个代号C。

现在,让我们看一下零知识证明的大致流程:

阶段会产生两把钥匙,想要产生证明或验证证明的人,就会用到相应的钥匙。

再介绍一下登场人物:

C:上面介绍过的验证函数P(prover):拥有某秘密,想要不揭露该秘密而证明某事的人。在本例中,是0x0001,他不想透露余额和金额,但希望矿工们相信C为真。

V(验证者):验证人(矿工)。

w(witness):可以满足C的一组解(其中包含不能透露的秘密)。在本例中,w =(1500,1000,xxx,???)。

x(public input):可以公开取得的资料。在本例中,x =(xxx,???)。

π(证明):对证人进行转换,将其中的秘密删除后就是证明。

pk / vk:提供者密钥/验证者密钥,用于产生或验证证明所用的密钥。

证明阶段是这样的。Bob是转账的人,他知道所有的信息w =(1500,1000,xxx,???)。其中一些信息会公开在链上,即x =(xxx,???)。他用w、x和pk产生一个证明,这个证明不会包含秘密(1500,1000)。但验证人(矿工)可以用这个证明,结合已经在链上公开的x,确认这个证明满足C的要求。

以上就是零知识证明的大致形态了。虽然符号多了些,但实际上观念还很简单。希望对你有所帮助。

下一步...

但接下来的路还很长,有两个研究方向你可能需要了解:

首先,一切的重点似乎都在C。不同类型的证明需要不同的C。对于不同类型的秘密,似乎也需要编写相应的C。

然而,C并不是用JavaScript或C编写的(哎呀,真巧)。事实上,C并不是一种程序语言,至少不是一个图灵完备的程序语言。有一个工具叫ZoKrates,可以提供一个迷你语言,帮助你生成这组约束,但它还不完整。要编写实用的C,目前只能通过一个c/c++的库libsnark来实现。

第二个方向是,为什么验证者可以相信proof可以让C为真?C需要秘密才能计算,但证明中不包含秘密,不是吗?零知识证明之所以能够实现这一点,与椭圆曲线pairing的一些性质有关。因此,了解pairing也是不错的选择。

同场加映...

Ethereum上的零知识证明

Ethereum在Morden版本之后,也声称支持了零知识证明,但我怎么没看到呢?每笔交易仍然如此透明,没有任何秘密。

这是因为,这些秘密留给智能合约去实现。简而言之,如果我想创建一个秘密的代币,就必须自己编写智能合约来处理证明的验证。请注意,智能合约只是用来验证证明的。为什么?因为完整的w只有用户(客户端)才会知道,如果要用合约来验证,那不是得把w上传到链上,让全世界都知道吗?

虽然验证合约需要你自己编写,但验证证明的过程涉及到非常大量的计算。举个例子,每次配对都有一个这样的计算:

Math.pow(someBigNumber,12092909088188237225393433017559174875623137613219078327682045681675023350320878590139619158941453632724570634378148379186020109423506557278061404249513976103803771139954000579995199902828634263992330574392218791796266323480026479977659504287064359209036331389750395884727865805793574046154686347934603866375769645860851559671200189106819576945533990794197558448169154800495832790107673176422796675256499746815795625450299074794144048526198146639914021389804755241528331708078456200260597013666698340612446162656471808349941941036242500801205678881620332591272087635015318077794473705628671572713897714140224506269671672327501746902155512482220944778556374239955378577691861316356789180373125486706142640931817968722234080019888921817141837856053156323850750365255047978587780912486395587404967932864588640269696396456375831408999624015664858331115319294937654521467886227817728683577577618500683880562054279134724944160)

有时验证证明看起来很复杂,但实际上,最主要的就是应用了三个椭圆曲线的计算(加、乘、pairing-check)。因此,Ethereum将这些计算作为预编译合约,为你节省了不少计算资源。

以上就是零知识证明的大致形态了。虽然符号多了些,但实际上观念还很简单。希望对你有所帮助。

标签: 数字货币