本文翻译自英文版 Narayanan A, Bonneau J, Felten E, et al. Bitcoin and cryptocurrency technologies[J]. A comprehensive, 2021. 译者:唐凯
在此致敬该书的全体著作者:Arvind Narayanan, Joseph Bonneau, Edward Felten, Andrew Miller, Steven Goldfeder
如对该书有任何问题,请邮件联系:bitcoinbook@lists.cs.princeton.edu
本书介绍
比特币和加密货币技术令很多人兴奋。 乐观者声称比特币将从根本上改变世界各地的支付、经济甚至政治。 悲观主义者声称比特币本质上是破碎的,并将遭受不可避免的巨大崩溃。这些不同观点的背后是对比特币是什么及其运作方式的严重混淆。 我们写作这本书,旨在帮助消除炒作,并深入了解比特币独特之处的核心。要真正了解比特币的独特之处,我们需要了解它在技术层面上的运作方式。 比特币确实是一项新技术,我们只能通过与过去技术的简单类比来解释它。我们假设您对计算机科学有基本的了解——计算机如何工作、数据结构和算法,以及一些编程经验。 如果您是计算机科学专业的本科生或研究生、软件开发人员、企业家或技术爱好者,这本教科书适合您。在本书中,我们将解决有关比特币的重要问题。 比特币是如何运作的? 是什么让它与众不同? 您的比特币安全吗? 比特币用户的匿名程度如何? 我们可以使用比特币作为平台构建哪些应用程序? 加密货币可以受到监管吗? 如果我们今天设计一种新的加密货币,我们会改变什么? 未来会怎样?
每章都有一系列的课后问题,帮助您更深入地理解这些问题。 此外,还有一系列编程作业,您将以简化模型实现比特币的各种组件。 如果您是听觉学习者,本书的大部分材料也可以作为一系列视频讲座提供。 您可以在我们的 Coursera 课程中找到所有这些内容。您还可以通过在线找到的信息(包括比特币维基、论坛和研究论文)以及与同行和比特币社区的互动来补充您的学习。
读完本书后,您将了解在阅读有关比特币和其他加密货币的声明时区分事实与虚构所需的一切。 您将拥有设计与比特币网络交互的安全软件所需的概念基础。 您将能够将比特币的想法整合到您自己的项目中。
致谢
我们非常感谢帮助开发编程作业的学生以及对本书草稿提供反馈的每个人。 普林斯顿大学的学生 Shivam Agarwal、Miles Carlsten、Paul Ellenbogen、Pranav Gokhale、Alex Iriza、Harry Kalodner 和 Dillon Reisman,以及斯坦福大学的学生 Allison Berke、Benedikt Bünz 和 Alex Leishman 值得特别赞扬。 我们还要感谢 Dan Boneh 和 Albert Szmigielski。
前言——通往比特币的漫漫长路
通往比特币的道路上布满了尝试失败的先驱者。 我编制了一份大约一百个加密支付系统的列表,包括基于电子现金和信用卡的技术,这些系统在某种程度上值得注意。 有些是被广泛引用的学术提案,而另一些则是已部署和测试的实际应用系统。 在这份名单上的所有名字中,可能只有一个你认识——PayPal。 PayPal 之所以能幸存下来,只是因为它迅速放弃了在手持设备上进行加密支付的最初想法!
从这段历史中可以学到很多东西。 比特币的想法从何而来? 为什么有些技术能够幸存,而另一些技术却消亡了? 复杂的技术创新要成功商业化需要什么? 如果不出意外的话,这个故事会让您体会到我们终于拥有了一个真正的、可运行的、源于互联网的支付机制是多么的了不起。
表 1:著名的电子支付系统和提案
传统的金融服务
回顾政府和货币出现之前的历史,一种用于获取商品的系统就是易货贸易。 假设爱丽丝想要一个工具,而鲍勃想要药物。 如果他们每个人碰巧都有另一个人需要的东西,那么他们可以交换并满足他们的需要。另一方面,假设爱丽丝有食物,她愿意用它来换取工具,而鲍勃有工具,但不需要食物, 他想要药物。 爱丽丝和鲍勃不能互相交易,但如果有第三者卡罗尔愿意用药品交换食物,那么就可以安排三方交易,从而让每个人都能得到他们需要的东西。当然,缺点是协调——将一群需求和愿望一致的人同时安排在同一个地方。 为了解决协调问题出现了两种系统:信贷和现金。 历史学家、人类学家和经济学家争论两者中哪一个先发展起来,但这对我们的目的来说并不重要。在基于信用的系统中,在上面的示例中,爱丽丝和鲍勃将能够相互交易。 鲍勃会给爱丽丝工具,鲍勃得到了欠他的人情。 换句话说,爱丽丝有一笔债务需要在未来某个时候与鲍勃清算。爱丽丝的物质需求现在得到了满足,但她有一笔债务想要取消,所以这是她新的“想要”。 如果将来爱丽丝遇到卡罗尔,爱丽丝可以用她的食物换取卡罗尔的药品,然后带着药品回到鲍勃那里并取消债务。另一方面,在基于现金的系统中,爱丽丝会从鲍勃那里购买该工具。 稍后,她可能会将食物卖给卡罗尔,卡罗尔可以将药物卖给鲍勃,从而完成循环。 这些交易可以以任何顺序进行,只要每笔交易的买方手头都有现金。 当然,到最后,就好像没有钱易手一样。这两个系统都没有明显优越性。 基于现金的系统需要通过一些初始现金分配来“引导”,否则任何交易都不会发生。 基于信用的系统不需要引导,但缺点是任何欠债的人都要承担一定的风险。 对方有可能永远不会回来偿还债务。现金还可以让我们准确判断某物的价值。 如果你进行物物交换,很难说工具是否比药物更有价值,或者药物是否比食物更有价值。 现金让我们用数字来谈论价值。 这就是我们今天使用混合系统的原因——即使我们使用信贷,我们也会以解决债务所需的现金数量来衡量债务。这些想法出现在许多情况下,尤其是用户交易某种虚拟商品的在线系统。 例如,点对点文件共享网络必须解决“贪图便宜者”的问题,即下载文件而不依次共享的用户。 虽然交换文件可能有效,但还存在协调问题:找到拥有您想要的文件并且想要您拥有的文件的完美人员。 在 MojoNation 等项目和 Karma 等学术提案中,用户会获得一些虚拟现金的初始分配,他们必须花费这些现金来接收文件,并在向其他用户发送文件副本时赚取收入。 在这两种情况下,一个或多个中央服务器帮助跟踪用户的余额,并可以提供内部货币和传统货币之间的兑换服务。 虽然 MojoNation 没有生存足够长的时间来实现这样的交换,但它成为当今使用的一些协议的智力祖先:BitTorrent 和 Tahoe-LAFS。
网上信用卡的麻烦
信用和现金是基本概念,以至于我们可以将众多电子支付方式分为两类。 比特币显然属于“现金”堆,但让我们先看看另一个。信用卡交易是当今网络上使用的主要支付方式。 如果您曾经从亚马逊等在线卖家那里购买过商品,您就会知道安排是如何进行的。 您输入信用卡详细信息,将其发送给亚马逊,然后亚马逊将这些信用卡详细信息转交给“系统”,即涉及处理商、银行、信用卡公司和其他中介机构的金融系统。另一方面,如果您使用像 PayPal 这样的东西,您看到的是一个中介机构。 您和卖家之间有一家公司,因此您将信用卡详细信息发送给该中介机构,该中介机构批准交易并通知卖家。 中介机构将在每天结束时与卖方结算余额。您从这种机构中获得的好处是,您不必向卖家提供您的信用卡详细信息,这可能会带来安全风险。 您甚至可能不必向卖家提供您的身份,这也将改善您的隐私。 缺点是您失去了与卖家直接互动的简单性。 您和卖家可能都必须在同一中介机构拥有账户。如今,我们大多数人在网上购物时都愿意透露信用卡信息,或者至少我们勉强接受了。 我们也习惯于公司收集有关我们在线购物和浏览活动的数据。 但在 20 世纪 90 年代,网络还是新生事物,协议级加密标准才刚刚兴起,这些担忧让消费者深感不确定和犹豫。 特别是,通过不安全的渠道将您的信用卡详细信息交给信誉未知的在线供应商被认为是疯狂的。 在这样的环境下,人们对中介机构产生了很大的兴趣。一家名为 FirstVirtual 的公司是一家早期的支付中介公司,成立于 1994 年。顺便说一句,他们是最早建立纯虚拟办公室的公司之一,员工分布在全国各地,通过互联网进行交流,因此得名。FirstVirtual 提议的系统有点像 PayPal 当前的系统,但早于它很多年。 作为用户,您需要向他们注册并提供您的信用卡详细信息。 当您想从卖家处购买商品时,卖家会联系 FirstVirtual 并提供所请求付款的详细信息,FirstVirtual 会与您确认这些详细信息,如果您批准,则会向您的信用卡收取费用。 但有两个细节很有趣。 首先,所有这些沟通都是通过电子邮件进行的; 当时的网络浏览器才刚刚开始普遍支持 HTTPS 等加密协议,而支付协议的多方性质又增加了其他复杂性。 (其他中介机构采用将信息编码到 URL 中或在 HTTP 之上使用自定义加密协议的方法。) 其次,客户将有 90 天的时间对费用提出异议,而商家只能在三个月后收到款项! 如今,商家确实会立即收到付款,但是,仍然存在客户提出退款或对信用卡账单提出异议的风险。 如果发生这种情况,商家将不得不将付款退还给信用卡公司。在 90年代中期,有一种中间机构的竞争方法,我们称之为 SET 架构。 SET 还避免了客户向商家发送信用卡信息的需要,而且还避免了用户必须向中介机构注册。 在 SET 中,当您准备购买时,浏览器会将您的交易详细信息视图传递到计算机上的购物应用程序,该应用程序与您的信用卡详细信息一起进行加密,只有中介才能解密,其他人都不能(包括卖家)。 通过这种方式加密您的数据后,您可以将其发送给卖家,因为您知道它是安全的。 卖方盲目地将加密数据连同他们自己对交易细节的看法转发给中介。 仅当您的观点与卖家的观点一致时,中介才会解密您的数据并批准交易。SET 是由 VISA 和 MasterCard 以及当时许多技术巨头:Netscape、IBM、Microsoft、Verisign 和 RSA 共同开发的标准。 这是一个统一了多个现有提案的总括规范。一家实施 SET 的公司名为 CyberCash。 从很多方面来说,这都是一家有趣的公司。 除了信用卡支付处理之外,他们还有一种名为 CyberCoin 的数字现金产品。 这是一个小额支付系统——用于小额支付,例如支付几美分阅读在线报纸文章。 这意味着您的 CyberCoin 账户中的余额在任何时候都可能不会超过 10 美元。 然而,有趣的是,他们能够为每个账户获得高达 10 万美元的美国政府 (FDIC) 保险。更有趣的是,当 CyberCash运营时,美国政府对被视为武器的密码技术出口实施了一项误导性的限制(现已放弃)。 这意味着包含有意义加密的软件无法提供给其他国家/地区的用户下载。 然而,CyberCash 的软件获得了国务院的特殊豁免。 政府的论点是,从 CyberCash 软件中提取加密技术比从头开始编写加密货币更困难。最后,CyberCash 是少数受 Y2K 漏洞影响的公司之一,这一点值得怀疑——这导致他们的支付处理软件向某些客户重复计费。 他们后来于 2001 年破产。他们的知识产权被 Verisign 收购,随后 Verisign 将其出售给了现在的 PayPal。
为什么SET不起作用? 根本问题与证书有关。 证书是一种将加密身份(即公钥)与现实身份安全关联的方法。 这是网站需要从 Verisign 等被称为证书颁发机构的公司获得的信息,以便在浏览器中显示为安全(通常由锁定图标表示)。 将安全性置于可用性之上,CyberCash 和 SET 决定不仅系统中的处理商和商家必须获得证书,所有用户也必须获得证书。 获得证书就像报税一样令人愉快,所以这个系统是一场灾难。 几十年来,主流用户对任何需要最终用户证书的系统都坚决集体说“不”,而此类提案现在已降级为学术论文。 比特币通过完全避免现实生活中的身份,巧妙地避开了这个棘手的问题。 在比特币中,公钥本身就是用户的身份,我们将在第一章中看到。90 年代中期,当 SET 标准化时,万维网联盟也在考虑标准化金融支付。 他们希望通过扩展 HTTP 协议来实现这一点,这样用户就不需要额外的软件来进行交易——他们只需使用浏览器即可。 事实上,他们对于如何扩展协议有一个非常笼统的建议,他们的用例之一就是进行支付。 这从未发生过——整个扩展框架从未部署在任何浏览器中。 大约二十年后的 2015 年,W3C 宣布它希望再次尝试这一领域,而这次比特币将成为该标准化的一部分。 然而,考虑到过去的所有失败,我不会屏住呼吸(有所期待)。
从信贷到(加密)现金
现在让我们转向现金。 我们之前比较了现金和信贷,并指出现金系统需要“引导”,但好处是它避免了买家拖欠债务的可能性。 现金还有两个额外的优势。 首先是更好的匿名性。 由于您的信用卡是以您的名义发行的,因此银行可以跟踪您的所有支出。 但当你用现金支付时,银行就不会介入,对方也不需要知道你是谁。 其次,现金可以实现线下交易,无需打电话给第三方即可获得交易批准。 也许稍后,他们会去银行等第三方存入现金,但这就不那么麻烦了。
比特币并没有完全提供这两个属性,但已经足够接近了,很有用。 比特币的匿名性不如现金。 你不需要使用你的真实身份来支付比特币,但你的交易有可能通过巧妙的算法与公共交易账本绑定在一起,如果您不小心,就会进一步与您的身份相关联。我们将在第 6 章中探讨比特币匿名性背后的混乱但令人着迷的细节。比特币也不能以完全离线的方式工作。 好消息是它不需要中央服务器,而是依赖于像互联网本身一样具有弹性的点对点网络。 在第 3 章中,我们将介绍“绿色地址”和小额支付等技巧,这些技巧使我们能够在某些情况下或在某些假设下进行离线支付。
最早将密码学应用于现金的想法来自于 1983 年的 David Chaum。让我们通过物理类比来理解这一点。 假设我开始分发一些纸条,上面写着:“这张纸币的持有者可以通过将其出示给我来兑换一美元”,并附上我的签名。 如果人们相信我会信守诺言并认为我的签名不可伪造,他们就可以像钞票一样传递这些纸片。 事实上,纸币本身最初是由商业银行发行的本票。 直到最近的历史,政府才介入,集中货币供应并合法要求银行赎回纸币。我可以用数字签名以电子方式做同样的事情,但这会遇到恼人的“双重支出”问题——如果你收到代表一个虚拟现金单位的数据,你可以制作它的两个(或更多)副本并通过它对不同的人说。 为了坚持我们的类比,让我们稍微延伸一下,假设人们可以制作完美的副本,而我们无法区分副本和原件。 我们能解决这个世界上的双重支付吗?这是一个可能的解决方案:我将唯一的序列号放入我发出的每张纸条中。 当你收到某人发来的这样的票据时,你会检查我的签名,但你也会打电话给我,询问带有该序列号的票据是否已经被花掉。 希望我会拒绝,在这种情况下你会接受这张便条。 我会将序列号记录在我的分类账中,如果你尝试花掉这张纸币,它不会起作用,因为收件人会打电话给我,我会告诉他们这张纸币已经被花掉了。 相反,您需要做的是定期将您收到的所有纸币带给我,我将向您发出相同数量的新纸币,并带有新的序列号。这很有效。 但这在现实生活中很麻烦,如果我设置了一个服务器来进行序列号的签名和记录保存,那么数字化就很简单。 唯一的问题是,这不再是真正的现金,因为它不是匿名的——当我给你开一张纸条时,我可以记录序列号和你的身份,当其他人稍后兑换它时,我也可以做同样的事情。 这意味着我可以跟踪你花钱的所有地方。这就是 Chaum 的创新之处。他想办法通过发明以下过程的数字等效物来保持系统匿名并防止双重支出:当我向您发出新通知时,您选择序列号。 你没有写在这张纸上,但是把它遮盖起来,这样我就看不到它了。 然后我就签名了,但还是看不到序列号。 这在密码学中称为“盲签名”。 选择一个长的、随机的序列号以确保它很可能是唯一的,这符合您的利益。 我不必担心你会选择一个已经选过的序列号——这样做只会搬起石头砸自己的脚,最终得到一张无法使用的钞票。这是第一个严肃的数字现金提案。 它有效,但仍然需要由中央机构(例如银行)运行的服务器,并且每个人都信任该实体。 而且,每笔交易都需要这个服务器的参与才能完成。 如果服务器暂时宕机,付款就会停止。 几年后,即 1988 年,Chaum 与另外两位密码学家 Fiat 和 Naor 合作提出了离线电子现金。 乍一看,这似乎是不可能的:如果您尝试在两个不同的商店使用相同的数字纸币或硬币,除非它们都连接到相同的支付网络或中央实体,否则它们怎么可能阻止这种情况?聪明的想法是不再担心防止双重支付,而是在事后当商家重新连接到银行服务器时专注于检测双重支付。 毕竟,这就是为什么即使天空中没有网络连接,您也可以在飞机上使用信用卡。 当航空公司能够重新连接到网络时,交易处理会稍后进行。 如果您的卡被拒绝,您将欠航空公司(或银行)钱。 如果您仔细想想,很多传统金融都是基于检测错误或损失的想法,然后尝试追回资金或惩罚肇事者。 如果您给某人写了一张个人支票,他们无法保证这笔钱确实存入您的帐户,但如果支票被退回,他们可以追查您。 可以想象,如果离线电子现金系统被广泛采用,法律体系将承认双重支付为犯罪行为。
Chaum、Fiat 和 Naor 检测双重支付的想法是一种复杂的密码学舞蹈。 从较高的层面来看,它所实现的目标是:发行给您的每一枚数字货币都对您的身份进行编码,但除了您之外没有人,甚至是银行,可以对其进行解码。 每次您花费硬币时,接收者都会要求您解码编码的随机子集,并且他们会保留此记录。 这种解码不足以让他们确定您的身份。 但如果您双花一枚硬币,最终两个接收者都会去银行兑换他们的纸币,当他们这样做时,银行可以将两条信息放在一起,以极高的概率完全解码您的身份。您可能想知道是否有人可以在这个系统中将您陷害为双花者。 假如您和我一起花了一枚硬币,然后我转身尝试双花它(没有向银行兑换它并获得带有我的身份编码的新硬币)。 这是行不通的——新的接收者会要求我解码一个随机子集,而这几乎肯定与您为我解码的子集不同,所以我将无法满足他们的解码请求。
多年来,许多密码学家研究了这种结构,并以各种方式对其进行了改进。 在 Chaum-Fiat-Naor 计划中,如果一枚硬币价值 100 美元,而您想购买仅花费 75 美元的东西,那么就无法将该硬币分成 75 美元和 25 美元。 您所能做的就是回到银行,将 100 美元的硬币兑现,然后索取 75 美元和 25 美元的硬币。 但 Okamoto 和 Ohta 的一篇论文使用“Merkle 树”创建了一个确实允许您细分您的代币的系统。 Merkle 树也会出现在比特币中,我们将在第一章中见到它们。Chaum-Fiat-Naor 方案也为提高效率留下了很大的空间。 特别是,零知识证明在该方案中的应用(最著名的是 Brands;以及 Camenisch、Hohenberger 和 Lysyanskaya)非常富有成果——零知识证明也已应用于比特币,我们将在第 6 章中看到 。
但回到Chaum:他采纳了自己的想法并将其商业化。 他于 1989 年成立了一家名为 DigiCash 的公司,这可能是最早尝试解决在线支付问题的公司。 他们比我们刚才讨论的 FirstVirtual 和 CyberCash 等其他公司领先了大约五年。 Digicash 系统中的实际现金称为 Ecash,他们还有另一个称为 cyberbucks 的系统。 有一些银行实际实施了它——美国有几家,芬兰至少有一家。 那是在 20 世纪 90 年代,早在比特币出现之前,这可能会让一些比特币爱好者感到惊讶,他们认为银行是技术恐惧、反创新的庞然大物。Ecash 基于 Chaum 的协议。 客户是匿名的,因此银行无法追踪他们如何花钱。 但电子现金的商人并不是匿名的。 他们必须在收到硬币后立即归还硬币,以便银行知道他们赚了多少钱、在什么时间等等。
图 2:DigiCash 的屏幕截图
图 2 显示了该软件的屏幕截图。 正如您所看到的,它显示了您的余额以及银行发行给您的所有硬币。 由于无法分割您的硬币,银行会向您发行一整套硬币,面额为一分、两分、四分等等——二的幂。 这样,您(或您的软件,代表您)始终可以选择一组硬币来支付交易的确切金额。
当您想要进行交易时,例如,如本例所示,您想要向非营利隐私组织 EPIC 捐款,您可以单击捐款链接,将您带到 Digicash 网站。 然后,这将打开一个返回到您的计算机的反向网络连接。 这意味着您的计算机必须能够接受传入连接并充当服务器。 您必须拥有自己的 IP 地址,并且您的 ISP 必须允许传入连接。 如果连接成功,ecash 软件将在您的计算机上启动,您将能够批准交易并汇款。
Chaum 拥有 Digicash 技术的多项专利,特别是其使用的盲签名方案。 这是有争议的,它阻止了其他人开发使用相同协议的电子现金系统。 但一群在所谓的“cypherpunks”邮件列表上闲逛的密码学家想要另一种选择。 Cyperpunks 是中本聪Satoshi Nakamoto后来向全世界宣布比特币的邮件列表的前身,这并非巧合。 我们将在第七章讨论cypherpunks运动和比特币的根源。
Cyperpunks密码学家实现了一个名为 MagicMoney 的 ecash 版本。 它确实侵犯了专利,但被宣传为仅供实验使用。 这是一个很有趣的软件。 该界面全部基于文本。 您可以通过电子邮件发送交易。 您只需将交易复制并粘贴到您的电子邮件中,然后将其发送给其他用户。 希望您能够使用 PGP 等端到端电子邮件加密软件来保护传输中的交易。Ben Laurie 提出了一项名为 Lucre 的提案,得到了许多其他人的贡献。 Lucre 试图用不受专利限制的替代方案来取代 ecash 中的盲签名方案,系统的其余部分基本相同。
伊恩·戈德堡 (Ian Goldberg) 提出的另一项提议试图解决无法分割硬币进行找零的问题。 他的想法是,如果商人有一些硬币,他们可以给你寄回硬币,这样如果你没有确切的零钱,你可能会多付钱,然后你会得到一些硬币。 但请注意,这会带来匿名问题。 正如我们之前看到的,在 ecash 中,发送者是匿名的,但商家不是。 当商家退回现金时,从技术上讲,他们是发送者,所以他们是匿名的。 但是,作为必须将这笔现金退还给银行的人,您并不是匿名的。 在不破坏试图购买商品的用户的匿名性的情况下,无法设计这个系统。 因此,戈德堡提出了一个提案,其中有不同类型的硬币可以允许这些交易发生,允许你找回零钱,并且仍然保持你的匿名性。
那么为什么 DigiCash 会失败呢? DigiCash 的主要问题是很难说服银行和商家采用它。 由于接受电子现金的商家不多,用户也不想要它。 更糟糕的是,它不支持用户到用户的交易,或者至少不是很好。 它确实以用户到商家的交易为中心。 因此,如果商家不参与,就没有其他方法来激发人们对该系统的兴趣。 所以最终,DigiCash 输了,而信用卡公司赢了。
顺便说一句,比特币允许用户对商家和用户对用户的交易。 事实上,该协议没有与用户概念分开的商家概念。 对用户间交易的支持可能促成了比特币的成功。 从一开始就与您的比特币有关:将其发送给其他用户,而社区则试图争取对比特币的支持并让商家接受它。
在公司的后期,DigiCash 还尝试了防篡改硬件,以试图防止双花,而不仅仅是检测它。 在这个系统中,你会得到一个小型硬件设备,通常称为钱包或某种卡。 该设备会记录你的余额,当你花钱时,余额会减少;如果你在卡上充值更多,余额就会增加。 该设备的要点在于,不应该有任何物理或数字方式进入并篡改其计数器的方法。 因此,如果计数器为零,则该卡将无法消费,直到重新加载为止。
还有许多其他公司拥有基于防篡改硬件的电子现金系统。 DigiCash 后来与一家位于欧洲、名为 CAFE 的公司合作。 围绕这一想法成立的另一家公司名为 Mondex,后来被万事达卡收购。 Visa 也有自己的变体,称为 VisaCash。
图 3:Mondex 系统,显示用户卡和钱包。
图 3 显示了 Mondex 系统的用户端。 有一张智能卡和一个钱包单元,您可以在其中任何一个中充值现金。 如果你想进行用户与用户之间的货币交换,给予者用户首先将他们的卡放入钱包,然后将卡上的钱转移到钱包中。 然后收款人会将他们的卡插入钱包,然后你将钱转移到第二张卡上。 这是一种交换数字现金的方式,而且是匿名的。
Mondex 在许多社区试用了他们的技术。 有一个社区恰好是离我长大的地方很近的一个城市:安大略省圭尔夫市。 您可能已经猜到它并没有真正流行起来。 Mondex 卡的一个主要问题是它们就像现金 — 如果您丢失或被盗,钱就会消失。 更糟糕的是,如果卡出现某种故障,如果读卡器无法读取它,则无法确定该卡是否有余额。 在这些情况下,Mondex 通常会承担成本。 他们会假设该卡已加载并补偿用户损失的钱。 当然,这可能会花费公司很多钱。
此外,钱包又慢又笨重。 使用信用卡或现金支付要快得多。 零售商讨厌拥有多个支付终端; 他们只想要一张信用卡。 所有这些因素共同推动了 Mondex 的发展。
然而,这些卡是智能卡,这意味着它们上面有小型微控制器,并且该技术已被证明是成功的。 如今,在许多国家,包括我居住的加拿大,每张信用卡和每张借记卡现在都采用了智能卡技术。 但它有不同的用途。 它不是用来防止双重支付的——这个问题不会出现,因为它不是基于现金的技术。 银行(而不是您的卡)会跟踪您的余额或可用信用额度。 相反,该芯片用于身份验证,即证明您知道与您的帐户关联的 PIN。 但早在这项技术被银行业广泛采用之前,Mondex 就已经开始使用它了。
凭空造钱
在 DigiCash 系统中,如果你有一个价值 100 美元的数字现金物品,是什么让它真的价值 100 美元呢?答案很简单:为了获得价值 100 美元的电子现金,你必须从银行账户中取出 100 美元,然后交给发行电子现金的银行。但是,关于如何做到这一点,有很多不同的建议,不同的公司也有不同的做法。有一种牵强附会的可能性:如果某个国家的政府真的授权服务机构铸造数字货币,凭空创造出新的现金呢?这就是 NetCash 背后的想法,尽管它从未超越提案阶段。e‑Gold 使用的另一种系统是把一堆黄金放在金库里,然后发行与黄金等值的数字现金。另一家名为 Digigold 的公司并非完全由黄金支持,而是拥有部分储备。
所有这些想法最终都将数字现金的价值与美元或商品挂钩。如果美元升值或贬值,你持有的数字货币的价值也会随之变化。一种截然不同的可能性是让数字货币成为自己的货币,其发行和估值独立于任何其他货币。
要创造一种可能获得实际价值的自由浮动数字货币,就必须设计一种稀缺的东西。事实上,稀缺性也是黄金或钻石被用作货币支撑的原因。在数字领域,实现稀缺性的一种方法是设计一个系统,使铸币需要解决一个计算问题(或 “谜题”),而这个问题需要一段时间才能破解。这就是比特币 “挖矿 “的过程,我们将在第 5 章中介绍。
计算谜题的解决方案可以是具有一定价值的数字对象,这一基本理念由来已久。早在 1992 年,密码学家 Dwork 和 Naor 就首次提出了这一想法,并将其作为解决垃圾电子邮件的潜在方案。如果您每次发送电子邮件时,您的计算机都必须解决一个只需几秒钟就能解决的谜题呢?为了执行这一要求,如果你没有附上计算谜题的解法,收件人的电子邮件程序就会直接忽略你的电子邮件。对于普通用户来说,这并不会成为发送邮件的障碍,因为你发送邮件的频率并不高。但如果你是一个垃圾邮件发送者,你要同时发送数千或数百万封电子邮件,解决这些计算难题就会变得令人望而却步。亚当-巴克(Adam Back)后来于 1997 年在一项名为 “哈希现金”(Hashcash)的提案中独立发现了类似的想法。
这些计算谜题需要具备一些特定属性,才能对垃圾邮件起到有效的威慑作用。首先,垃圾邮件发送者不可能解开一个谜题,并将谜底附在他发送的每封邮件上。为了确保这一点,谜题应该针对具体的电子邮件:它应该取决于发件人和收件人、电子邮件的内容以及发送的大致时间。其次,收件人应能轻松查看谜题的解答,而无需重复解题过程。第三,每道谜题都应完全独立于其他谜题,即解开一道谜题不会减少解开其他谜题所需的时间。最后,由于硬件会随着时间的推移而不断改进,解任何特定的计算谜题都会变得更快、更便宜,因此接收者应该能够调整他们所接受的谜题解法的难度。使用加密哈希函数设计谜题可以实现这些特性,我们将在第 1 章对此进行研究。
比特币使用的计算谜题与 Hashcash 基本相同,只是略有改进。不过,比特币比哈希现金做得更多–毕竟,解释比特币需要一整本书!我之所以提到这一点,是因为 Hashcash 的发明者 Adam Back 说过:“比特币是 Hashcash 的扩展,具有通货膨胀控制功能”。我觉得这有点言过其实了。这有点像说 “特斯拉只是一个装在轮子上的电池”。
与密码学中的任何好点子一样,计算谜题也有许多变体,旨在实现略有不同的特性。Rivest 和 Shamir(RSA 密码系统中的 R 和 S)提出了一个建议。请注意,在 Hashcash 中,你解决多个谜题的成本只是各个谜题的成本之和。但这与政府铸币的成本结构不同。如果你想一想纸币的防伪技术,那么购买所有设备、创建防伪功能等初始成本都是巨大的。但一旦他们完成了这些工作,成本就会下降,印一张钞票还是一百张钞票也就不那么重要了。换句话说,铸造纸币的固定成本很高,但边际成本却很低。里韦斯特和沙米尔希望设计出能够模仿这些特性的计算谜题,这样,铸造第一枚硬币就会面临巨大的计算挑战,但铸造后续硬币的成本却会低很多。他们的提议也利用了哈希函数,但方式不同。我们不会深入探讨他们的解决方案的细节,但他们试图解决的问题在高层次上是非常有趣的。
为什么 Hashcash 从未达到其防止垃圾邮件的预期目的?也许垃圾邮件并不是一个足以解决的大问题。对大多数人来说,垃圾邮件是一种困扰,但并不是他们想要花费计算周期来对付的东西。如今,我们已经有了垃圾邮件过滤器,可以很好地阻止垃圾邮件进入我们的收件箱。也有可能 Hashcash 无法真正阻止垃圾邮件发送者。特别是,如今大多数垃圾邮件发送者都使用 “僵尸网络 “发送垃圾邮件,即使用恶意软件控制他人计算机的大型网络。他们完全可以利用这些电脑来获取 Hashcash。尽管如此,使用计算谜题来限制资源访问的想法仍在流传。你可以在一些取代网络协议的提案中看到这种想法,比如 MinimaLT。
在分类账中记录所有信息
比特币的另一个关键组成部分是区块链:一个安全记录所有比特币交易的账本。区块链背后的想法也很古老,可以追溯到哈伯和斯托内塔 1991 年的一篇论文。他们提出的是一种对数字文件进行安全时间戳的方法,而不是数字货币计划。打上时间戳的目的是提供一个文档产生时间的大致概念。更重要的是,时间戳可以准确地传达这些文件的创建顺序:如果一个文件比另一个文件先创建,时间戳就会反映出这一点。安全属性要求文档的时间戳不能事后更改。
在 Haber 和 Stornetta 的方案中,有一个时间戳服务,客户向其发送文档以进行时间戳。服务器收到文件后,会在文件上标注当前时间以及指向前一个文件的链接或指针,并用这些信息签发 “证书”。指针是一种特殊类型的指针,它链接的是一段数据而不是一个位置。这意味着,如果相关数据发生变化,指针就会自动失效。在第 1 章中,我们将学习如何使用散列函数创建这种指针。
这样做的目的是,每个文档的证书都能确保前一个文档内容的完整性。事实上,你可以递归地应用这个论点:每份证书基本上都固定了文档和证书在此之前的整个历史。如果我们假设系统中的每个客户都至少记录了几份证书–他们自己文档的证书,以及前一份和后一份文档的证书–那么参与者就能共同确保历史记录不会在事后被更改。特别是,文件的相对排序会被保留下来。
图 4:链接时间戳。要为文档创建证书,时间戳服务器会包含一个指向上一个文档证书的哈希指针和当前时间,并对这三个数据元素进行签名。
后来的一篇论文提出了一种提高效率的方法:我们可以将文档收集成块,然后以链的形式将块链接在一起,而不是单个链接。在每个区块内,文档将再次链接在一起,但链接方式是树状结构而不是线性结构。这就减少了验证特定文档是否出现在系统历史上某个特定时间点所需的检查量。从外观上看,这种混合方案如图 5 所示。
图 5:高效链接时间戳。箭头表示哈希指针,垂直虚线表示时间间隔。
这种数据结构构成了比特币区块链的骨架,我们将在第 3 章中看到。比特币以一种微妙但重要的方式对其进行了改进:使用哈希算法(Hashcash-esque)来延迟新区块添加到区块链上的速度。这一修改对比特币的安全模型有着深远而有利的影响。比特币不再需要受信任的服务器;取而代之的是,事件由被称为 “矿工 “的一系列不受信任的节点记录。每个矿工都对区块进行跟踪,而不是依靠普通用户。任何人都可以成为矿工,通过解决计算难题来创建区块。比特币还摆脱了签名,只依靠哈希指针来确保数据结构的完整性。最后,实际的时间戳在比特币中并不重要,系统的意义在于以防篡改的方式记录交易的相对顺序。事实上,比特币区块的创建并没有固定的时间表。该系统确保平均每 10 分钟创建一个新区块,但连续区块之间的时间差异很大。
从本质上讲,比特币结合了利用计算谜题来规范创造新货币单位的想法和保护时间戳来记录交易账簿并防止重复消费的想法。早些时候,也有一些不太成熟的提案将这两种想法结合在一起。第一种被称为 b‑货币,由戴伟(Wei Dai)于 1998 年提出。在 b 型货币中,任何人都可以使用类似哈希卡的系统创造货币。这里有一个点对点网络,有点像比特币。每个节点都有一个账本,但它不像比特币区块链那样是一个全球账本。每个节点都有自己的账本,记录它认为每个人的余额。
尼克-萨博(Nick Szabo)提出的另一个类似方案,名为 Bitgold。Szabo说,他早在 1998 年就有了 Bitgold 的想法,但直到 2005 年才在博客上发表。我之所以提到这一点,是因为《纽约时报》的记者纳撒尼尔-波普尔(Nathaniel Popper)发表了一个小阴谋论,他写了一本非常好的关于比特币历史的书。Popper指出,在中本聪发布比特币白皮书之后,博客文章的时间戳被更改了,因此 Bitgold 的提案看起来像是在比特币发布两个月之后写的。Popper 和许多其他观察家一样,认为 Szabo 可能就是中本聪,他认为更改时间戳是 Szabo/Satoshi 试图掩盖他在知道比特币之前就发明了 Bitgold 这一事实的证据。
这种解释的问题在于,如果你真正读过博文的内容,Szabo 非常清楚自己在 1998 年就有了这个想法,而且他并没有试图改变这些日期。因此,更合理的解释是,他只是在比特币普及了类似的想法之后,把这篇文章放到了博客的顶端,以确保人们知道他之前的提议。
比特币与 b‑货币和 Bitgold 有几个重要区别。在这些方案中,计算谜题被直接用来铸造货币。任何人都可以解开谜题,谜题本身就是货币单位。在比特币中,谜题本身并不构成货币。它们被用来保证区块链的安全,只是在有限的时间内间接地铸造货币。其次,b‑money 和 Bitgold 依赖于时间戳服务,这些服务对货币的创造或转移进行签名。正如我们所看到的,比特币不需要可信的时间戳,它只是试图保持区块和交易的相对顺序。
最后,在 b‑money 和 Bitgold 中,如果服务器或节点之间对分类账存在分歧,那么没有明确的解决方法。在两位作者的著作中,似乎都隐含着让多数人来决定的意思。但是,由于任何人都可以建立一个节点–或者隐藏在不同身份下的上百个节点–这些机制并不十分安全,除非有一个中央看门人来控制网络的进入。相比之下,在比特币中,攻击者要改变历史,就必须以比其他参与者总和更快的速度解决计算难题。这不仅更安全,还可以量化系统的安全性。
B‑money 和 Bitgold 都是非正式的提议–b‑money 是邮件列表上的一个帖子,Bitgold 是一系列博客帖子。这两个项目都没有启动,甚至没有直接实施。与比特币白皮书不同,它们没有完整的规范或任何代码。这些提案都是对一些可能解决也可能无法解决的问题的轻描淡写。首先,正如我们已经提到的,如何解决关于分类账的分歧。另一个问题是如何确定计算难题的难度,以便铸造一个货币单位。由于在计算能力固定的情况下,硬件的价格往往会随着时间的推移而大幅降低,因此比特币采用了一种定期自动调整谜题难度的机制。B‑money 和 Bitgold 则没有这样的机制,这可能会导致一些问题,因为如果创造新币变得非常容易,那么这些币就可能失去价值。
关于中本聪的提示
你可能知道中本聪是比特币创造者使用的假名。虽然他的身份仍然是个谜,但他在比特币的早期进行了广泛的交流。让我们利用这一点来探究一些问题,比如他是什么时候开始研究比特币的,他在多大程度上受到了我们之前研究过的想法的影响,以及是什么激励了他。
中本聪说他是在 2007 年 5 月左右开始编写比特币代码的。我相信他的话;他是匿名的,这并不是他撒谎的理由。他在 2008 年 8 月注册了 bitcoin.org 域名。当时,他开始向一些他认为可能对这个提议感兴趣的人发送私人邮件。稍后,在 2008 年 10 月,他公开发布了一份描述比特币协议的白皮书,不久之后,他又发布了比特币的初始代码。在此期间,他在论坛上发布了大量信息,与许多人发送电子邮件,并回应了人们的关切。在编程方面,他提交了代码补丁。他与其他开发人员一起维护源代码,修复出现的问题。到 2010 年 12 月,其他人慢慢接管了项目的维护工作,他也不再与他们交流。
我一直把中本聪称为 “他”,但我没有特别的理由相信中本聪是个男人而不是女人。我只是用了男性代词,因为中本聪是个男性名字。我也一直把他称作一个人。有一种理论认为,中本聪可能是一个人的集合。我不相信这个理论–我认为中本聪可能只是一个人。原因是,如果我们看一下以中本聪为化名的整个在线互动,如果我们想一想中本聪花了两年时间回复电子邮件和修补代码,就很难想象这可能是多人共享用户账户和密码,以相似的风格和相似的声音回复,并确保他们不会相互矛盾。至少中本聪的这部分活动是由一个人完成的,这似乎是一个简单得多的解释。
此外,从他的著作和补丁中可以清楚地看出,这个人了解比特币的全部代码库及其所有设计方面。因此,我们可以非常合理地假设,最初的代码库和白皮书也是同一个人写的。最后,中本聪可能在最初的设计中得到了帮助。然而,在比特币发布之后,我们可以亲眼看到,中本聪很快就把他从其他贡献者那里得到的帮助归功于自己。如果中本聪得到了其他人的帮助,那么他误导我们说是他自己发明的东西就不符合他的性格了。
接下来,我们可能会问自己:“中本聪对ecash的历史了解多少?” 为了更好地理解这个问题,我们可以先看看他在白皮书中引用的内容,以及比特币网站早期版本中的参考资料。在白皮书中,他引用了一些关于基础密码学和概率论的论文。他还引用了我们之前看到的时间戳工作,由于相似之处如此明显,我们很自然地认为他是根据这些参考文献来设计区块链的。他还引用了 Hashcash 方案,该方案的计算谜题与比特币中使用的谜题非常相似。他还提到了 b‑money。后来,他又在网站上提到了 Bitgold 以及 Hal Finney 提出的重复使用计算谜题的方案。
但是,如果我们看一下早期与中本聪通信的人公开的往来电子邮件,我们会发现,b‑money 提议实际上是在亚当-贝克(Adam Back)的建议下事后添加的。中本聪随后给创建了 b‑money的戴伟发了电子邮件,显然,是戴伟告诉他 Bitgold 的。因此,这些建议并不是最初设计的灵感来源。后来,他与哈尔-芬尼(Hal Finney)有过很多通信,这也是他引用芬尼作品的一个合理解释,至少在网站上是这样。
由此看来,在创建比特币时,哈希现金和时间戳是中本聪唯一知道或认为与ecash历史相关的东西。然而,在他知道了 b‑money 和 Bitgold 之后,他似乎意识到了它们的相关性。2010 年年中,维基百科上关于比特币的文章被维基百科的编辑标记为删除,因为他们认为这篇文章不值得关注。于是,中本聪和其他人讨论了如何措辞才能让维基百科接受这篇文章。为此,中本聪建议这样描述比特币:“比特币是1998年戴伟在Cypherpunks上提出的b-money提案和尼克-萨博的Bitgold提案的实现”。因此,中本聪认为把比特币定位为这两个想法的延伸或者是这两个先前系统的实现是对比特币工作原理的很好解释。
但是,其他的东西–Chaumian 电子现金计划和我们研究过的信用卡提案–又是怎么回事呢?中本聪在设计比特币的时候知道这些历史吗?这很难说。他没有任何迹象表明他知道这些历史,但也很有可能他没有提到这些,因为这与比特币无关。比特币使用的是一种完全不同的去中心化模式,因此没有必要纠结于那些已经失败的旧的中心化系统。
中本聪本人在比特币论坛上发表的一篇文章中顺便提到了Chaumian ecash,从而表明了这一点。在写到另一个名为 opencoin.org 的提议时,他指出,他们似乎 “在谈论旧的 Chaumian 中央铸币厂的东西,但也许只是因为那是唯一可用的东西。也许他们会对新的方向感兴趣。很多人都认为电子货币是一项失败的事业,因为自 20 世纪 90 年代以来,很多公司都失败了。我希望大家明白,只是这些系统的中央控制性质注定了它们的失败。我认为这是我们第一次尝试一种去中心化的、非基于信任的系统”。这让我们很清楚中本聪对早期提议的看法,特别是他认为比特币有什么不同。比特币的去中心化的确是一个决定性的特征,它与我们所看到的几乎所有东西都不同。
中本聪的另一句有趣的话表明,他可能不是一名学者。大多数学术研究人员在构建系统之前,都会思考各种想法并立即写下来。中本聪说,他采取了相反的方法: “我实际上是倒着做比特币的。我必须先写出所有代码,然后才能说服自己,我可以解决每一个问题,然后我再写论文。我认为,比起写一份详细的说明书,我能够更快地发布代码”。
由于人们对中本聪有些误解,值得一提的是,他和其他人一样也犯过错误,他并不是一个完美的未来预言家。比特币的原始代码和设计中都存在错误和值得商榷的设计选择。例如,有一个将比特币发送到 IP 地址的功能从未流行起来,现在回想起来,这是个坏主意。当他描述比特币的用处时,他的设想都是围绕着在互联网上使用比特币的想法。当然,这种用途是比特币的核心,但不是唯一的。比如说,他并没有提出去咖啡店用比特币支付咖啡费用的设想。
根据我们对数字现金历史的了解,我们可以问自己的最后一个问题是:“为什么中本聪保持匿名?可能的原因有很多。首先,可能只是为了好玩。许多人匿名写小说,还有像班克斯这样的涂鸦艺术家也保持匿名。事实上,在中本聪当时参与的社区,即 Cypherpunk 社区和密码学邮件列表中,匿名发帖是很常见的做法。
另一方面,中本聪的选择背后可能存在法律问题。Liberty Reserve 和 e‑Gold 这两家美国公司因洗钱而陷入法律纠纷。2006 年,Liberty Reserve 的创始人之一逃离了美国,因为他担心自己会被控洗钱。而 E‑Gold 的创始人则留在了美国,其中一人还被起诉,并最终认罪。就在中本聪建立比特币网站并开始通过电子邮件向人们宣传他的提议之前,他就已经认罪了。尽管如此,已经有无数人发明了生态现金系统,没有人害怕法律影响或选择匿名。因此,这可能是原因,也可能不是原因。
值得一提的还有,ecash 的某些方面已经申请了专利,“赛弗朋克 “运动的成员们担心实施ecash 系统会受到这些专利的影响。事实上,在 Cypherpunks 邮件列表中,有一个帖子建议由一群匿名的程序员来实现 ecash,这样如果有人起诉,他们就无法找到程序员。鉴于比特币的设计与ecash的不同,很难认为比特币会违反ecash的专利,也许中本聪是格外谨慎。又或者,他只是受到了来自密码朋克社区的匿名编码员想法的启发。
最后一个经常被提到的原因是个人安全。我们知道,中本聪早期挖矿挖出了很多比特币,由于比特币的成功,这些比特币现在价值不菲。我认为这是一个合理的理由。毕竟,选择匿名不是一次就能决定的,而是要持续不断地做。尽管如此,这可能并不是中本聪最初的理由。中本聪第一次使用中本聪这个名字时,他甚至还没有发布比特币的白皮书或代码库,很难想象他会想到比特币会如此成功。事实上,在比特币早期的很多时候,中本聪对比特币的前景持乐观但谨慎的态度。他似乎明白,以前的许多努力都失败了,比特币也可能会失败。
结束语
如果考虑到所有尝试比特币的企业都失败了,那么比特币的成功是非常了不起的。比特币有几项显著的创新,包括区块链和支持用户对用户交易的去中心化模式。它为用户提供了实际有用但并不完美的匿名性。我们将在第 6 章详细介绍比特币的匿名性。从某种意义上说,比特币的匿名性弱于 DigiCash 的匿名性,但从另一个意义上说,比特币的匿名性更强。这是因为在 DigiCash 中,只有汇款人而不是商家保持匿名性。比特币给发送者和商家(无论是用户还是商家)提供了相同程度的匿名性。
最后,让我通过我们之前研究过的系统,总结一下我们可以从比特币中学到的一些经验。首先是不要放弃问题。人们在开发数字现金的过程中失败了 20 年,但这并不意味着就没有一个可行的系统。第二是要愿意妥协。如果你想要完美的匿名性或完美的去中心化,你可能需要在设计的其他方面做一些改进。回过头来看,比特币似乎做出了正确的妥协。它稍微降低了匿名性,并要求参与者在线并连接到点对点网络,但这最终被用户所接受。
最后一课是通过数字取得成功。比特币能够建立起一个由热情的用户和愿意为开源技术做出贡献的开发者组成的社区。这与之前的数字现金尝试明显不同,之前的数字现金通常是由一家公司开发的,唯一的技术拥护者就是公司本身的员工。比特币目前的成功在很大程度上要归功于充满活力的支持社区,他们推动了这项技术的发展,让人们使用它,并让商家采用它。
延伸阅读
An accessible overview of digital cash schemes focused on practical issues:
P. Wayner. Digital Cash: commerce on the net (2nd ed). Morgan Kaufmann, 1997.
A cryptographically-oriented overview of e‑cash systems (Chapter 1) and micropayments (Chapter 7):
B. Rosenberg (ed.) Handbook of Financial Cryptography and Security. CRC Press, 2011.
Although not Chaum’s earliest paper on e‑cash, this is arguably the most innovative, and it formed a template replicated by many other papers:
D. Chaum, A. Fiat, M. Naor. Untraceable electronic cash. CRYPTO 1998.
Many papers improved the efficiency of Chaum-Fiat-Naor using modern cryptographic techniques, but arguably the most significant is:
J. Camenisch, S. Hohenberger, A. Lysyanskaya, Compact e‑cash. Theory and Applications of Cryptographic Techniques, 2005
Some practical security observations on the financial industry and proposals, including Mondex:
R. Anderson. Security Engineering (2nd ed). Wiley, 2008.
An overview of the implementation of Chaum’s ecash proposal:
B. Schoenmakers. Basic security of the ecash payment system. State of the Art in Applied Cryptography, 1997.
Two papers cited by Satoshi Nakamoto in the Bitcoin whitepaper that are integral to Bitcon’s design:
A. Back. Hashcash — A Denial of Service Counter-Measure, Online, 2002. S. Haber, W. S. Stornetta. Secure names for bitstrings. CCS, 1997.
More Details