主页 > imtoken苹果下载不了 > 零几年比特币价格 浅谈零知识证明:背景与起源

零几年比特币价格 浅谈零知识证明:背景与起源

imtoken苹果下载不了 2023-07-05 05:42:57

上学期我在斯坦福大学跟随 Dan Boneh 学习了区块链和数字货币相关技术。与以往的课程不同,今年的课程增加了一个新的章节,叫做零知识证明。可爱的 Dan 和他的大神 phd Ben Fisch 轮流教我们,用了两周的时间讲述了 zkSNARK 的起源、概念和实现。

这两天我完成了期末考试。在复习的过程中,我一次次在脑海中重温整个班级。我觉得最激动人心的部分是零知识证明。想趁着最近放假的时间总结一下,分享给大家。

前言

写完初稿,和朋友Proofread分享的时候,发现很多朋友反映背景知识不够。所以我在开始之前添加了这个额外的部分,注意理解这篇文章所需的背景阅读:

Merkle Tree/Merkle Proof 比特币交易/UTXO 模型 一些基本的加解密概念

读完前言,我们就可以开始正文了。

要说零知识证明在大家的视野中真的很火,其实还是要从比特币说起。

比特币的不足

如果你熟悉比特币,你应该知道,在比特币网络上,每一笔交易都是公开的。

如果 A 想付给 B 一笔钱,那么 A 会用扩音器向全网宣布她要创建一个新的交易(Tx),这个交易的受益人是 B 的公钥(P2PK),或者公钥的散列(P2PKH)。B只要看到这笔交易,就可以用自己的私钥进行数字签名,证明自己确实是公钥的拥有者,从而花钱。

当 A 提交交易支付给 B 时,作为网络上的旁观者 M,她只能看到一串乱码地址 aaaaa 向一串乱码地址 bbbbb 支付 x 个币。后来B给C寄钱的时候,只能看到bbbbb给ccccc寄了一笔钱。我们可以看到比特币中的交易是强关联的。虽然我们不知道谁把钱寄给了谁,但一路上我们可以发现很多交易链。

如果每个用户都乖乖地来回支付,比特币其实还是比较安全的。

一旦用户看穿了,不想玩了,想去交易所提现,那么整个链条的交易信息就会暴露出来。交易所往往有KYC(Know Your Customer)政策,每个用法币兑换数字货币的用户都必须经过实名认证。一旦C从ccccc地址取钱逃跑,那么交易所已经掌握了bbbbb曾经给C发过钱的事实。如果C涉嫌洗钱,此时只需要静静等待B兑现即可出来,然后抓住它。

美国已经有很多公司在做比特币的交易链分析,比如Chainalysis。

不得不说,大家都能感受到比特币的不足之处:随机生成的支付公钥只是一种假象(网名)。一切都在众目睽睽之下完成,完全没有隐私。这就好比有人用网名在贴吧发帖,然后有人用密保找到手机号,然后用手机号找到注册的实名,所以这是一个道理。

匿名和假名

我们对隐私的理解实际上分为两类。

第一个是匿名的,意思是用户不用透露任何与自己相关的信息,比如学校的告白墙,你永远不知道是谁写的,反正字都写在上面。

第二种是假名(Pseudonymous),即用户通过自己创建的假名发布信息,比如贴吧。如果不认识用户,就无法建立网名和真实姓名之间的联系,也不知道发帖的人。是谁。

由此分析零几年比特币价格,比特币实际上是一种假名机制:每个用户随机生成自己的公钥(假名),并通过公钥地址收款。这就好比使用化名小明/小红/二狗/小刚的四个人A/B/C/D在网上匿名交易,只要D在任何一个环节(比如交易所提现)暴露了自己的身份,那么小明/小红/二狗和D的关系马上就暴露了。

我们可以从这两种方法来讨论如何增强比特币的保密性。

CoinJoin,一种增加隐私的方法

由于 A 支付 B 会被看到,C 支付 D 也会被看到,所以有人会想到说他们简单地将 ABCD 的所有四个放在一个交易中。因为比特币交易可以有多个输入输出,所以旁观者会看到,在一笔交易中,aaaaa 和 ccccc 都往里面放了 x 个币,然后 bbbbb 和 ddddd 收到了钱。这样,即使交易所得知这些地址对应四个人ABCD,也很难分辨出谁从谁那里收到了钱。

如果这两组交易仍然太容易识别怎么办?两个不够四个,四个不够八个,以此类推。结合各种人的交易是令人困惑和无法追踪的。这是CoinJoin。

CoinJoin 的缺点是什么?事实上,混合多笔交易并不能完全防止人被跟踪,只能说降低了一路上被人摸到的概率。还有一个很重要的一点,如果要混合AB交易和CD交易,那么它们的交易量必须相同。如果 A 支付 B 10,000 币,C 支付 D 1 币,我们只需要看输入和输出,就可以立即将 CoinJoin 交易拆分为两个独立的交易。因此,混合匹配交易金额相近的交易也是 CoinJoin 实施时不可忽视的难点。

如果你看上面的分类,CoinJoin 只是比特币现有系统的一个棘手操作,其本质仍然是一种假名机制。

保密交易(保密交易/CT)

既然隐藏我是谁那么麻烦,人们开始思考:如果我们不隐藏交易涉及的公钥,我们也可以隐藏交易金额。当 A 给 B 发钱时,即使 B 暴露了,全网也不会知道 A 给 B 付了多少钱。

如果这一步能够实现,那么我们甚至可以用比特币支付工资。每个人都只能看到你的月薪记入你的账户,但你不知道你赚了多少钱。

要实现具体的方法,首先要了解一种特殊的加密算法:同态加密。

总之,同态加密是一种特殊的加密算法,可以保持密文原有的数学性质。

我们可以假设存在一种加密方法E,如果E是加法同态的,那么E(a) + E(b) = E(a+b)。相反,如果乘法是同态的,则 E(a) x E(b) = E(axb)。

由于本文是一篇关于zkp的科普文章,具体的实现方法我们就不详细了解了。我们只需要了解RSA中的椭圆加密方程和大数模具有某种同态性质。

佩德森承诺

继续讨论隐藏卷的主题。如果 A 有 100 个硬币的余额并支付了 10 个硬币给 B,那么交易看起来像这样:

结合上面提到的加法同态,如果我们有加法同态加密方法E,我们可以把这个交易转化为:

只要第一个数字等于后两个数字之和,旁观者最终是看不到交易量的,但他不得不承认,A确实将一部分钱分配给了B,然后将一部分的钱分配给了B。钱退给A了。。这种称为 Pederson Commitment 的方法隐藏了数据本身,但证明了数据的关系。

负数漏洞

看完这里,有些朋友会发现一个巨大的漏洞:虽然Pederson承诺证明数字之间的关系,但它并没有限制任何数字的取值范围!也就是说,A可以做坏事,提交一笔交易,说他要付-100币给B,然后“找”自己200币,这样等式还是成立的。A 可以利用它无限期地印钞,从而破坏整个系统。

如何避免负数的存在?除了 Pederson 的承诺,我们还需要另外一组证明来证明所有交易中的数字都是正数。换句话说,所有交易中的数字都被限制在从 0 到 2^256(最大正整数值)的范围(范围证明)内。

这听起来并不难,最简单的方法无疑是公开所有这些数字。但这违反了隐藏卷的前提。所以我们只好另找一种证明方法,也就是不暴露原始数字,还要证明它们的特性(取值范围从0到2^256)。听起来有问题吗?不要'别着急,让我们看另一个问题。

所有权漏洞

在我们进一步讨论之前,我想快速指出,目前该协议实际上存在一个巨大的漏洞:所有权未知。

熟悉比特币的朋友可能知道,在创建比特币交易时,需要提供输入交易的UTXO Txid,可以快速验证要付钱给B的A是否真的有钱。.

但是现在,我们从来没有提到任何关于指向上一个交易的事情。也就是说,由于全网不知道A花了多少钱,A可以简单地将输入的数字变成一个奇思妙想的数万,然后全部调用给自己,偷偷给自己铸币。

如何解决这个问题呢?有两种选择。

第一个解决方案是继续引入比特币的交易机制,以最后一笔私人交易的输出作为交易的输入。这种思维有点像问题的转换。本次交易我使用上一次交易的结果,所以只要上一次交易OK,我的交易就没有问题。

这是一个先有鸡还是先有蛋的问题,如何毫无问题地创建第一个私人交易?

我们可以通过特殊交易将普通硬币转换为私人输出。这样一笔交易的输入是一个已有的交易id(比特币UTXO),然后输出就变成了私有输出。通过这种方式,我们召唤出了最早的鸡蛋。(ZCash的屏蔽交易就是这个原理)

第二种选择是证明A的输入确实属于A。在像以太坊这样的系统中,有一个世界状态的概念。世界状态是整个链上所有用户和智能合约的当前平衡和状态。一般来说,一个完整的节点会保留整个世界状态(大尺寸),而轻节点只需要保存世界状态的 Merkle Commit。

除了提交 Pederson 承诺和区间证明外,我们还提供了额外的证明来证明交易中输入的数字与原始世界状态下 A 的余额一致。我们可以使用 Merkle Proof 来实现这个证明。

但是如果我们直接提交 Merkle Proof,所有旁观者都可以看到 A 的交易输入,这违反了隐私交易的前提。再说一遍:我们仍然需要借用上面提到的神秘算法——不仅可以隐藏答案本身(A 的余额),还可以证明这个数字确实属于世界状态。

ZCash:全匿名

当CT的概念被提出时,很多人对现状不满,不禁感叹:能连名字都隐藏起来就好了。

于是提出了 ZeroCoin/ZeroCash 的概念:它基于 CT,但增加了一种新的机制,使交易用户匿名。一旁正在吃瓜的旁观者C零几年比特币价格,真是傻眼了。他看到一串乱码漂浮在网络上,但他不知道那是什么,但他不得不相信这是真的。

ZCash是一种基于ZeroCoin/ZeroCash协议的数字货币,可以实现完全匿名交易。我不会在这里过多介绍,但它仍然依赖于相同的旧密码工具:Pederson promises、interval proofs、Merkle proofs,以及我们一直在谈论的黑魔法:这并没有揭示答案本身证明。

隔了半天,终于要说重点了:这种本身不透露答案的证明方法,叫做零知识证明。

零知识证明(zkSNARKs)

相信看完上面的内容,你大概已经明白了我们要解决的问题了。

我们要证明数字之间的关系,比如 0