Zerocash: Decentralized Anonymous Payments from Bitcoin

本文主要讲 E.B.Sasson, A.Chiesa, et al. "Zerocash: Decentralized Anonymous Payments from Bitcoin."2014 IEEE Symposium on Security and Privacy. IEEE, 2014.

Abstract

比特币是第一种被广泛采用的数字货币。虽然支付是用假名进行的,但比特币不能提供强有力的隐私保障: 支付交易记录在一个公共分散分类账中,从中可以推断出许多信息。\(Zerocoin\)通过从支付来源解除交易链接来解决一些隐私问题。但是,它仍然可以显示支付的目的地和金额,并且功能有限。

在本文中,我们构建了一个完全成熟的基于分类账簿的数字货币,具有强大的隐私保障。我们的研究结果利用了零知识的最新进展,简洁的非交互式知识论证\(zero-knowledge\ Succinct\ Non-interactive\ ARguments\ of\ Knowledge\) (\(zk-SNARKs\))。

首先,我们制定并建立了去中心化匿名支付方案\(decentralized\ anonymous\ payment\ schemes\)(\(DAP\ Schemes\))。\(DAP\)方案允许用户直接私下支付对方: 相应的交易隐藏了支付的来源、目的地和转移的金额。我们提供了结构安全性的正式定义和证明。

其次,我们构建了 \(Zerocash\),一个 \(DAP\) 方案构造的实例。在 \(Zerocash\) 中,交易量不超过1kb,验证时间不超过6ms —— 比匿名度较低的 \(Zerocoin\) 更有效率,而且与普通比特币更具竞争力。

I. Introduction

\(Mix\) 们有三个限制:

  • 回收硬币的延迟时间必须很长,以容许足够的硬币混入其中;
  • 混合硬币可追踪硬币的来源;
  • 混合硬币可能盗取硬币。

对于有「要隐藏的东西」的使用者来说,这些风险可能是可以接受的。
但典型的合法使用者:

  • 希望保持他们的消费习惯不被其他人知道;
  • 规避风险,不愿意不断努力保护他们的隐私;
  • 往往没有充分意识到他们受到损害的隐私。

Zerocoin: a decentralized mix

\(Zerocoin\) 扩展了比特币,提供了强大的匿名保证。像许多电子现金协议一样,\(Zerocoin\) 使用零知识证明来防止交易图形分析。然而,与早期实用的电子现金协议不同的是,\(Zerocoin\) 并不依赖于数字签名来验证硬币,也不需要中央银行来防止双重支出。相反,\(Zerocoin\) 使用零知识认证硬币。现在,他们属于一个有效的硬币公开名单(可以维持在区块链)。\(Zerocoin\) 不是一种完全匿名的货币,而是一种去中心化的 \(Mix\),用户可以通过改协议定期“清洗”他们的比特币。而日常交易必须通过比特币进行,具体原因如下:

  • 性能。\(Zerocoin\) 消耗更多的时间和存储空间。消耗 \(Zerocoin\) 需要双重离散对数知识证明,其大小超过45kb,需要450ms来验证(在128位安全级别)。这些证明必须通过网络传播,每个节点都要验证,并永久保存在账本里。从数量级来看,相比于比特币,\(Zerocoin\) 消耗的成本更高,可能会对正常规模运营的比特币网络造成沉重负担。
  • 功能性。尽管 \(Zerocoin\) 构建了一个基本的电子现金方案,但它缺乏完全匿名支付所需的关键特性。首先,零币使用固定面值的硬币: 它不支持以确切价值支付,也不提供在交易后进行变动的方法(即分币)。其次,\(Zerocoin\) 没有机制让一个用户直接用 \(Zerocoin\) 支付另一个用户。第三,尽管 \(Zerocoin\) 通过将支付交易与其原始地址分离来提供匿名性,但它并不隐藏有关网络上交易的金额或其他元数据。

Our contribution

我们通过两个main contribution来解决上述问题。

  • 去中心化匿名支付方案\(decentralized\ anonymous\ payment\ schemes\)(\(DAP\ Schemes\))。
  • 构建并实现了 \(Zerocash\) 系统,且与 \(Zerocoin\) 相比,我们的系统:
    • 减少97.7% 的硬币交易量。
    • 减少98.6% 的交易验证时间。
    • 允许可变金额的匿名交易。
    • 隐藏交易金额和用户持有的硬币价值。
    • 允许直接支付到用户的固定地址(没有用户互动)。

为了验证我们的系统,我们通过在一个1000个节点的测试网络(大约\(\frac{1}{16}\)\(unique IP\)在比特币网络以及 \(\frac{1}{3}\) 的节点在任何给定的时间可达)中进行实验来衡量其性能和建立可行性。这激发了信心,\(Zerocash\) 可以作为一个分支的比特币,并在相同的规模运作。因此,由于其显著改进的功能和性能,使得 \(Zerocash\) 作为匿名替代品完全替代传统的比特币支付成为可能。

Concurrent work

使用 \(zk-SNARKs\) 减少 \(Zerocoin\) 的证明大小和验证时间

A. zk-SNARKs

B. Decentralized anonymous payment schemes

我们构造了一个中央化的匿名支付( \(DAP\) )方案,它是一个分散的电子现金方案,允许任意数量的直接匿名支付。正式定义见第三部分。在这里,我们概述了我们的建设在六个增量步骤,建设的细节在第四节。

  • \(Step 1: user anonymity with fixed-value coins.\)

我们首先描述一个简化的结构,其中所有的硬币具有相同的价值,例如,1 btc。这个结构,类似于零硬币协议,显示了如何隐藏支付的来源。在工具方面,我们使用 zk-snark (回顾以上)和一个承诺计划。设 comm 表示一个统计隐藏的非交互式承诺方案(即,给定随机性 r 和消息 m,承诺为 c: = compr (m) ; 随后,通过揭示 r 和 m 打开 c,可以验证 compr (m)等于 c)。

在简化结构中,一个新的硬币 c 被生成如下: 用户 u 采样一个随机序列号 sn 和一个陷门 r,计算一个硬币承诺 cm: = compr (sn) ,并设置 c: = (r,sn,cm)。一笔包含 cm (但不包含 sn 或 r)的相应造币交易 txmint 被发送到分类账; txmint 只有在你向支持托管池支付了1btc 的情况下才被附加到分类账中(例如,1btc 可以通过 txmint 编码的纯文本信息支付)。因此,铸币交易是存款证,其价值来自支持托管池。

随后,让 cmlist 表示分类账上所有硬币承诺的列表,你可以通过发布一个消费交易 txspend 来消费 c,其中包含(i)硬币的序列号 sn; (ii) np 语句“ i know r such that compr (sn) appears in the list of coin commitments”的 zk-snark proof π。假设 sn 没有出现在分类账上(作为过去消费交易的一部分) ,你可以赎回1btc 的存款金额,你可以自己保留,转让给其他人,或者立即存入一个新的硬币。(如果 sn 已经出现在分类账中,那么这被认为是重复支出,并且交易被丢弃。)

用户匿名是因为证明 π 是 zeroknowledge: 当 sn 被揭示时,没有关于 r 的信息,并且找到 cmlist 中的众多承诺中的哪一个对应于一个特定的花费事务 txspend 等价于反演 f (x) : = commx (sn) ,这被假定为不可行。因此,付款的来源是匿名的。

  • \(Step 2: compressing the list of coin commitments.\)

在上述 np 语句中,cmlist 被明确指定为一个硬币承诺列表。这种朴素的表示严重限制了可伸缩性,因为大多数协议算法(例如,证明验证算法)的时间和空间复杂度都随着 cmlist 线性增长。此外,为了降低成本,不能从 cmlist 中删除与已用硬币相对应的硬币承诺,因为它们无法识别(由于提供匿名性的同样零知识属性)。

正如在[3]中一样,我们依赖于一个抗冲突的 hash 函数 crh 来避免 cmlist 的显式表示。我们在(正在增长的)列表 cmlist 上维护一个高效的可更新的基于 crh 的 merkle 树(cmlist)。用 rt 表示树的根(cmlist) ,众所周知,根据插入新叶的时间和空间与树的深度成正比,可以对 rt 进行更新。因此,时间和空间复杂度从 cmlist 大小的线性降低到对数。考虑到这一点,我们将 np 语句修改为: “ i know r such that compr (sn) appear as a leaf in a crh-based merkle tree whose root is rt”。与 cmlist 的朴素数据结构相比,这种修改使得给定 zk-snark 实现可以支持的 cmlist 的大小呈指数增长(具体地说,使用深度为64的树,zerocash 支持\(2^{64}\)个币)。

  • \(Step 3: extending coins for direct anonymous payments.\)

到目前为止,硬币 c 上的硬币承诺 cm,是对硬币序列号 sn 的承诺。但是,当将 c 传输给另一个用户时,会产生一个问题。事实上,假设一个用户 ua 创建了 c 而 ua 将 c 发送给另一个用户 ub。首先,既然 ua 知道 sn,ub 的 c 开销就不是匿名的(因为 ua 知道 c 什么时候花,通过认识 sn)和冒险(因为 ua 仍然可以先花 c)。因此,ub 必须立即花 c 和铸造一个新的硬币 c0来保护自己。其次,如果 ua 实际上想要转移到 ub,例如,100 btc,那么这样做既不方便(因为需要100次转移) ,也不是匿名(因为转移的数量被泄露)。第三,不支持金额不是1btc (硬币的固定价值)倍数的转移。因此,简化的建设所描述的是不充分的支付计划。

我们通过修改硬币承诺的来源来解决这个问题,并使用伪随机函数来确定支付目标,并得出序列号,如下所示。我们使用三个伪随机函数(从一个伪随机函数派生而来)。对于种子 x,它们分别表示为 prfaddrx ()、 prfsnx ()和 prfpkx ()。我们假设 prfsn 是防碰撞的。

为了提供支付目标,我们使用地址: 每个用户 u 生成一个地址密钥对(apk,ask)。U 的硬币含有 apk 的价值,只有在知道ask的情况下才能花掉。通过选择一个随机种子询问并设置 apk: = prfaddrask (0) ,对密钥对(apk,ask)进行取样。用户可以生成和使用任意数量的地址密钥对。

Zerocash

II. Background on zk-SNARKs

III. Definition of A Decentralized Anonymous Payment Scheme

posted @ 2021-11-23 15:00  Weisswire  阅读(470)  评论(0编辑  收藏  举报