首页 » 区块链:技术驱动金融 » 区块链:技术驱动金融全文在线阅读

《区块链:技术驱动金融》6.5 零币和零钞

关灯直达底部

在零币和零钞陆续出现之前,还没有哪个加密数字货币的匿名化方案可以让人如此兴奋,不光是因为它们所实施的密码学原理非常高妙,也因为它们承诺可以达到的匿名性非常强大有效。到目前为止,所有我们看到过的匿名加强技术,都是在原来的核心技术协议之上加载匿名化处理,零币和零钞则是在协议层就融合了匿名化处理。我们将在这里以比较大的轮廓阐述一下这个协议,并对某些细节进行了必要的简化,但读者可以在本章结尾的延伸阅读部分找到原始论文作为参考。

兼容性(compatibility)。零币和零钞为保证很强的匿名性,是有代价的:不同于中心化的混币服务和合币交易,这些协议和现在的比特币不兼容。通过软分叉(soft fork)[1]比特币协议的方式去实施零币在技术上是可行的,但实际操作的难度会对此造成很大的障碍。零钞甚至不能通过软分叉比特币协议的方式去实现,而只能以一种另类币(altcoin)的方式存在。

加密学保证(cryptographic guarantees)。零币和零钞在协议层已经融入了混币功能,其匿名属性来自加密学的保证,从性质上说,这些保证比我们之前讨论的其他混币技术更好。在隐私保护方面,你不需要信赖任何人,比如,混币服务提供商、混币节点,或其他任何形式的中介,甚至是矿工和共识机制协议。和大多数密码学保证一样,这种匿名性的保证仅仅依赖于攻击者的计算能力上限。

零币

为了解释零币,我们首先要介绍一下基础币(Basecoin)的概念,基础币是一种类似于比特币的另类币,而零币是这种数字货币的一种延伸,其所提供的匿名性的核心特点在于,你可以将基础币和零币进行来回转换,并且当你这么做的时候,就打破了旧的基础币和新的基础币之间的关联。在系统里,基础币是你需要进行交易的货币,零币只是提供了一种交易基础币的机制,这种机制可以确保新币和旧币之间毫无关联。

你可以把你所拥有的每一个零币当作一个令牌,用来证明你拥有这么一个零币并且使其不能再被消费。这种证明机制并不会显示你所拥有的是哪一个零币,而仅仅是证明你确实拥有一个零币,稍后你可以将这个证明给矿工看,以赎回这个证明并取得一个新的基础币。用一个比喻来说,就好比你去赌场用现金换了一些扑克筹码,这些筹码就是一种证明,证明你存了多少现金,等你离开赌场时,就可以拿着这些证明去换相同数量的但并不一样的现金。当然,不像扑克筹码,除了你可以稍后用来赎回一个基础币,你并不能拿零币做任何事情。

为了在加密数字货币中让这样的机制正常运转,我们要用密码学的方式来执行这些证明,我们需要确保每一个证明只能赎回一个基础币,否则你就可以通过把一个基础币转换成一个零币,然后多次赎回获取更多的免费基础币。

零知识验证

我们使用的核心加密学工具是零知识验证,这种方式可以证明一个声明(数学上的)是正确的,而不需要展示可推导该声明正确性的任何其他信息。例如,假设你已经做了很多工作解决了一个哈希谜题,并且你想要向其他人证明你做到了。换而言之,你想要证明“我做到了”这个声明。

I know x such that H(x‖〈other known inputs〉)<〈target〉

当然,你可以展示上述公式里的x值来证明你做到了,但是零知识验证可以让你向别人证明你做到了这一点,同时不需要透露x的值,即便在看过你的证明之后。

你也可以证明一个如“我知道一个x值,而公式H(x)的结果属于下面这一个集合{…}”这样的声明。该证明既没有展示x值是什么,也没有证明集合里面到底哪一个元素等于H(x)。至关重要的是,零币就是利用零知识验证来实现其功能的。事实上,零币中被这种方式证明的声明,与后面要提到的例子非常相似。本书中,我们把零知识验证当成一个黑匣子,只说明了零知识验证可以实现的属性以及在这个协议中的哪个部分是必需的,我们并没有深究如何实现这一功能的技术细节。零知识验证是现代密码学的一个基石,是很多相关技术协议的基础。再一次强调,我们建议有兴趣的读者可以参考延伸阅读中提到的文献,去了解更多更加详细的内容。

铸造零币

零币通过铸币过程而产生,而且任何人都可以铸造一个标准面值的零币。为简便起见,我们认为零币只有一种面值,每一个零币价值一个基础币。虽然任何人都可以铸造一个零币,但是产生的零币并不自动具备任何价值——你不可能获得免费的钱。只有把零币放到区块链网络上,并且通过消耗一个基础币的方式,它才能具备价值。

为了铸造一个零币,你需要使用加密学承诺。回顾一下我们在第1章讲过的内容,承诺方案类似于将一个值放入一个信封,并将信封置于所有人的视野中(见图6.11)。

图6.11 一个序列号的承诺

注:密码学承诺好比把一个序列号封装到一个信封里。

铸造零币的过程分为三步:

1.生成一个序列号S和一个随机密钥r。

2.计算一个函数Commit(S,r),这是序列号S的承诺。

3.如图6.12所示,在区块链上发布该承诺,这需要消耗一个基础币,此币不可再被花费,进而创建了一个零币。此时并S和r仍然是保密的。

图6.12 在区块链网络上设置一个零币

注:为了将一个零币置于区块链中,需要创建一个铸币交易,其输出地址是零币序列号的一个密码承诺,而铸币交易的输入则是一个基础币,这个基础币也会在创建零币的过程被消耗掉,整个交易过程并不需要公示这个序列号。

为了消耗一个零币并赎回新的基础币,你需要证明你之前已经铸造了一个零币,你可以通过公开之前的承诺也就是说公示S和r的值来证明这一点,但是这样显然就建立了一个你的旧的基础币和新的基础币之间的关联,那么我们怎样才能打破这个关联呢?这个时候就用到零知识验证了,在任何时间节点,区块链网络上都有很多的承诺对象——我们将其命名为c1,c2,…,cn。

以下是消耗一个具有序列号S的零币以赎回一个新基础币的步骤:

● 创建一个特殊的“花费”交易,这个交易包含序列号S和一个具备零知识验证的声明:“我知道在承诺对象(S,r)中的r在以下的集合里:{c1,c2,...,cn}”。

● 矿工将会验证你的零知识验证,这将给予你打开区块链中一个零币承诺的能力,而你并不需要真的打开它。

● 矿工也会查询序列号S,确认这个零币没有在之前的花费交易中被使用过(为了防止双重消费)。

● 你的花费交易的输出将形成一个新的零币,你应使用你所拥有的一个地址来作为输出地址。

图6.13 花费一个零币

注:花费交易展示了之前铸币交易中所锁定的序列号S,以及S和之前的铸币交易的关联性的零知识验证。不像一个铸币交易(或者一个普通的比特币/基础币的交易),这个花费交易没有输入地址,因此也没有签名,只有一个零知识验证的证明来确立它的有效性。

一旦你花费了一个零币,其序列号就变得公开了,那么你就不能再次赎回同一个序列号所对应的零币,由于每一个零币都仅有唯一的序列号,正如我们从安全角度所要求的那样,每一个零币只能被花费一次。

匿名性。在整个过程中,我们可以发现r一直是保持隐匿状态,不管是铸币交易还是花费交易都没有展示过r,这意味着没有人知道哪一个序列号对应哪一个具体的零币,这就是零币匿名性背后的核心概念。在区块链上,生成序列号S的铸币交易和稍后公示S以赎回一个零币的花费交易之间,并没有关联性。这种听起来像魔术般的特性是无法使用实体的封装系统来实现的,但在密码学中是可以做到的。好比我们在桌上放了一些装有不同序列号的密封过的信封,你可以证明某一个序列号是这些信封里面的一个,而不需要展示是哪一个,也不需要打开任何一个信封。

效率。回忆一下我们在花费交易中证明过的一个声明:

“我知道在承诺对象(S,r)中的r在以下的集合里:={c1,c2,…,cn}”。

其中,n代表的就是曾经被创建过的零币的数量。听起来这种零知识验证的实施会变得非常没有效率,因为证明中包含的集合大小会随着n的增加而线性增大。神奇的是,零币可以让这种验证的复杂度仅仅是n的对数。我们需要注意到这一点,即使需要被验证的声明的长度是线性的,声明本身并不需要被包括在证明里,而是隐含的。由于矿工们知道区块链上所有零币的集合,声明就可以被矿工们自行推断出来。这样证明本身就可以非常短。尽管如此,跟比特币相比较,零币还是增加了相当大的额外开销,大概50KB。

建立信任

用于搭建零币的工具之一(RSA累加器)需要进行一次性信任设置。特别的是,一个被信任方需要选择两个大的质数p和q,并且公示N=p×q作为所有人在系统的整个生命周期中使用的参数。我们可以把N看作一个公钥,只不过它被用于所有的零币而不是仅仅对应于某一个体。只要这个被信任方,销毁任何关于p和q的记录,系统就可以被认为是安全的。需要强调的是,这一做法是基于对两个大质数的积进行因子分解是不可行的这一假设的普遍认可。但是,如果任何人知道了秘密的因数p和q(也被称为“陷阱门”),他们就可以在不被监测到的情形下,为自己创建新的零币。所以,这些秘密的输入只能被使用一次,在用于产生相对应的公钥后就被销毁。

这里有一个有趣的社会学问题,一个个体怎么选择这个N并能够让每个人相信,在设置时使用的相对应的质数p和q,已经被安全地销毁了,这一过程还不是很清楚。如何实现这个目标,会有很多不同的方案,其中就包括“阀值加密”技术,该技术可使用多个代理协同计算出N,而只要其中一个代理将自己的秘密输入销毁,这个系统就可以被认为是安全的。

我们还可以使用其他略有不同的加密构造来避免设置这样一个被信任方。特别是,有实践表明,随机生成一个大数就具有很高的安全性,因为这样一个数字很有可能不能被完全分解。但遗憾的是,这样做会带来很大的效率冲击,因此这种方法并不实用。

零钞

零钞是一种不同的匿名性加密数字货币,它建立在零币的概念之上,但将加密技术提高到了更高的层次。零钞使用的是一种被称为zk-SNARKS[2]的密码学技术,这种技术可以使得零知识验证更加简洁、更加有效率,要点就在于,系统的整体效率可以达到某一定程度,使得整个网络可以不需要依赖一种基础币而运行,所有的交易都可以以零知识验证的方式进行。如我们所看到的,零币也支持那些本不需要无关联性的普通交易,只不过在其上做了计算量昂贵的混币交易进行补充。这种混币交易由固定面值的数字币组成,交易价值的拆分与合并只能在基础币系统里实现。在零钞系统中,这种差异就不存在了,交易金额的大小被封装在一个承诺中,在区块链上不再可见,密码学证据确保了拆分与合并的正确性,用户并不能凭空创造出零钞。

账本公开记录的唯一内容就是交易的存在性,以及矿工们用来验证系统正常运行所需要的关键属性的证明。区块链网络上既不显示交易地址,也不显示交易价值。唯一需要知道交易金额的用户,是本次交易的发送方和接收方,矿工们是不需要知道的。当然,如果其中存在交易费用,矿工们则需要知道的仅仅是手续费,这点也不会影响匿名保护。

就匿名性和隐私性来说,零钞这种完全不可追踪的交易系统自成门派。因为公开账本并不包含交易金额,零钞对针对混币服务的旁路攻击是免疫的。

建立零钞系统

按照技术属性来说,零钞看起来好得有点不真实。其实它确实也有自己的命门。就像零币,零钞也需要一个“公开参数”来设置这个零知识验证系统。但是不同于只需要一个几百个字节长度的数字N的零币,零钞需要的是一个很大的公开参数集——其大小超过1G字节。要再次强调的是,为了生成这些公开参数,零钞需要一组随机并且秘密的输入。如果任何人知道了这些秘密输入,就会产生无法监测的双重消费问题,从而危及整个系统的安全性。

在这里,我们不会过多地深入探讨设置一个zk-SNARK系统所面临的挑战,这个问题也是一个比较活跃的研究方向,但是截至2015年,我们并不知道如何在实际操作中以足够稳妥的方式建立这个系统。迄今为止,zk-SNARK还没有被实际运用。

综合比较,融会贯通

现在,让我们从匿名性以及实际的可操作性两个方面,来比较以下我们所探讨的这些方案,见表6.1。

表6.1 本章所讨论的匿名技术的比较

我们是从比特币,这个已经成功部署了的“默认”系统开始的。但比特币只是化名系统,我们看到,强大的交易图谱分析是可能攻击比特币的匿名性的一种可行办法。我们也探讨了聚集大量地址簇方式,以及如何关联真实世界的身份到这些地址簇的方法。

匿名化技术的下一等级,是用人工的方式实现一个单一混币交易,或者通过人工找交易对手的方式来实现合币交易,这会使输入地址和输出地址之间的关联变得模糊,但同时也会在交易图谱中留下了太多的线索。除此之外,混币服务提供商和参与节点也可能是恶意的,或者因为被黑客攻击的,或者被胁迫公布记录的。即使从匿名性来说离完美还很遥远,但混币服务在现实中存在,并且是现今一个可用的选项。

我们讨论的第三个等级的匿名性,是混币服务链或者合币交易。这种匿名性上的改进,来自更少的对于混币服务提供商或者节点组的依赖。诸如标准化的交易区块大小和客户端的自动化等特性,可以最小化信息泄露的可能性,但是还是有一些旁路风险可能会存在。同时,也还是存在一些攻击者可能控制或者勾结多个混币服务商与参与节点而带来的风险。实现带有混币服务链功能的钱包和服务在技术上是可行的并且应该会被用户所接受,但是据我们所知,一个安全的混币链解决方案还不存在。

接下来,我们探讨了把加密技术直接应用到协议层并提供匿名化的数学保证的零币。我们认为零币的旁路攻击风险还是存在的,但是明显已经优于其他的混币解决方案。不过,零币需要作为相对于比特币的一种另类币的方式发行。

最后,我们探讨了零钞。通过效率上的改进,零钞可以作为一个完全无法追踪——不仅仅是匿名化——的加密数字货币。然而,就像零币一样,零钞和比特币并不兼容,更糟糕的是,零钞需要一个非常复杂的建立流程,数字币领域仍然在研究如何用最好的方式来实现它。

在本章中,我们讨论了很多技术。现在让我们退一步看,比特币的匿名性(或者匿名潜力)是强大的,当和其他一些技术配合的时候会更加强大,尤其是在匿名通信方面。如我们在第7章中将要讨论的,这是一些匿名在线市场所使用的强有力的技术组合方式。

尽管匿名化技术是强大的,但同时也是脆弱的。一个错误就可能造成一个我们不希望看到的,但又是不可逆的关联。匿名化有一些显而易见的有害应用,但同时也存在很多有益的应用,所以是值得保护的。虽然道德层面上的区分很重要,我们还是无法在技术层面清楚地辨识。匿名技术看起来具有深入的和固有的道德模糊性,作为人类社会的一员,我们必须学会怎么面对这个现实。

和关于比特币的道德争论一样,比特币的匿名性也是一个很活跃的技术创新领域。我们仍然不知道比特币的哪一种匿名系统,如果存在的话,将会脱颖而出成为主流。这也将是每一个人的机会——不管你是一个开发者、一个政策制定者,还是一个普通用户——每个人都可以参与其中并做出贡献,希望你在本章中里所学到的内容,可以为你提供一些正确的背景知识去采取行动。

延伸阅读

与前面几章中讨论的主题相比,匿名技术在更快地持续发展中,并且是加密数字货币研究领域中更活跃的一个课题。想要跟上这个领域中最新的进展,可以阅读以下列举的论文,以及引用其他论文。

关于交易图谱分析的《一簇比特币》:

Meiklejohn,Sarah,Marjori Pomarole,Grant Jordan,Kirill Levchenko,Damon McCoy,Geoffrey M.Voelker,and Stefan Savage.“A Fistful of Bitcoins:Characterizing Payments among Men with no Names.”In Proceedings of the 2013 conference on Internet measurement,New York:ACM,2013.

关于我们讨论的混币技术和有效混币原则的来源的研究:

Bonneau,Joseph,Arvind Narayanan, Andrew Miller,Jeremy Clark,Joshua A.Kroll,and Edward W. Felten.“Mixcoin:Anonymity for Bitcoin with Accountable Mixes.”In Financial Cryptography and Data Security. Berlin:Springer,2014.

混币服务实践研究,其中很多种并没有很好的声誉:

Möser Malte,Rainer Böhme,and Dominic Breuker.“An Inquiry into Money Laundering Tools in the Bitcoin Ecosystem.” In 2013 eCrime Researchers Summit .Washington,DC:IEEE,2013.

比特币论坛里,比特币核心开发者格雷·麦克斯韦(Greg Maxwell)发布的有关合币的内容:

Maxwell, Gregory.“CoinJoin: Bitcoin Privacy for the Real World.” Bitcoin Forum, 2013.下载地址https://bitcointalk.org/index.php?topic=279249.0.

来自约翰·霍普金斯大学(Johns Hopkins University)的密码学者开发了零币,请记住零币和零钞是这本书里我们讨论过的最复杂的加密技术:

Miers,Ian,Christina Garman,Matthew Green,and Aviel D.Rubin.“Zerocoin:Anonymous Distributed E-Cash from Bitcoin.”In Proceedings of the 2013 IEEE Symposium on Security and Privacy .Washington,DC:IEEE,2013.

零币的作者和其他一些开发了SNARK技术的研究者共同开发了零钞系统:

Ben Sasson,Eli,Alessandro Chiesa,Christina Garman,Matthew Green,Ian Miers,Eran Tromer,and Madars Virza.“Zerocash:Decentralized Anonymous Payments from Bitcoin.”In Proceedings of the 2013 IEEE Symposium on Security and Privacy .Washington,DC:IEEE,2013.

[1] 所谓软分叉在比特币中的含义是对协议进行向前兼容的修改。修改后的新版本会造成原有的部分区块或交易无效,但是按更新后的协议产生的新交易和区块在旧协议下是有效的。换句话说,新协议是原协议的一个子集。——译者注

[2] zk-SNARK的全称是zero knowledge Succinct Non-interactive ARgument of Knowledge,是近年兴起的一种密码学方法。Snark在英文中本就有鬼魅的含义,用到这个技术上倒也有几分神似。——译者注