比特币入门指南-全-
比特币入门指南(全)
原文:
zh.annas-archive.org/md5/8c8e7ea95f51d51222c2ef5eb602b33b译者:飞龙
前言
在写这本书时,我们希望能够以一种或多或少永恒的方式来解释比特币的概念和潜力。哇,真是太难了。如果我们写一本名为《比特币现状:请在本书出版一年后忽略所有内容》的书,那就简单多了。比特币背后的核心技术,以及围绕它的更大技术基础设施,正随着这本书的印刷而迅速发展。关于比特币的合法性、价格波动和商家采用的辩论,到 2015 年可能已经过时,谁知道它们到 2025 年会变成什么样呢。
为了让这本书对未来依然具有相关性,我们尽力聚焦于那些将永远重要的比特币方面,并尝试以一种有趣的方式进行讲解。我们希望你能喜欢我们对这个迷人主题的处理方式。
第一章:致谢
克里斯·威尔默要感谢他的妻子艾米丽·温洛克和家人,在撰写本书期间给予的耐心和早期反馈。康拉德·巴尔斯基要感谢他的妻子劳伦·巴尔斯基和女儿阿娃·巴尔斯基,在他为完成本书所花费的所有周末和晚上中给予的支持和耐心。
特别感谢理查德·福特·伯利,在本书初稿的重要编辑工作中提供了大量帮助,以及帕特里克·富勒,在审阅编程部分时的贡献。诸多出色的 No Starch Press 团队成员,包括 Serena Yang、Tyler Ortman、Bill Pollock 等,帮助我们完善了这本书的内容。
第二章:1
什么是比特币?
简单来说,比特币只是另一种货币。术语比特币指的是整个货币系统,而比特币是该货币的基本单位。^(1) 就像美元、欧元、日元和金币一样,你可以储存比特币,花它购买商品和服务,或者将其兑换成其他货币。然而,比特币是世界上首个既是数字化又是去中心化的货币。
数字货币是指能够在计算机上轻松存储和使用的货币。按照这个定义,美元也可以被视为数字货币,因为它可以轻松地发送给他人或用于在线购物,但其供应由一个集中的银行组织控制。与此相对,金币是去中心化的,意味着没有中央权威控制世界上金币的供应。事实上,任何人都可以挖掘黄金,创造新金币并进行分发。然而,与数字货币不同的是,用金币支付商品并不容易(至少不可能找到精确找零!),而且无法通过互联网转账金币。由于比特币结合了这两种特性,它有点像数字黄金。历史上从未有过既具备这两种特性又能够作为货币使用的现象,而它对我们日益数字化、全球化的世界的影响可能是深远的。
有时被称为无国籍货币,比特币与任何国家无关。然而,你不应将比特币与私人货币相提并论,过去曾以各种形式存在过数百种私人货币。^(2) 无论是由个人、公司还是非国家组织发行,私人货币都是集中控制的,且由于破产或其他经济原因而面临崩溃的风险。比特币不是一家公司,也没有任何个人或组织发行或控制比特币;因此,它没有中心化的故障点。正因为如此,没人能够膨胀货币供应量,制造类似一战后德国和最近津巴布韦的恶性通货膨胀危机。^(3)

很多人都在问比特币创立背后的动机,所以让我们来探讨一下这种货币的目的。
为什么是比特币,为什么是现在?
直到最近,人们不能在没有中央中介的情况下可靠地相互发送数字现金。一个受信任的中央中介,如 PayPal,可以追踪支付和资金转账,但不清楚一群互不信任的陌生人如何能可靠地完成相同的交易。^(4) 这个被称为拜占庭将军问题的基本难题也出现在计算机科学中,特别是在如何在分布式网络上达成共识的问题上。
2008 年,这个问题被比特币的发明者巧妙地解决了,他的化名是中本聪。中本聪的重大突破使得数字货币能够在没有依赖中央权威的情况下存在。中本聪在一篇名为《比特币:一种点对点电子现金系统》的白皮书中描述了解决拜占庭将军问题的方案以及比特币的发明。但展示这一概念的实际软件是在一年后发布的。
虽然最初的版本是中本聪编写的,但随着软件被成百上千的志愿者改进和维护,它很快成为了一个社区项目。目前,这个软件是开源的,任何人都可以阅读并为其贡献代码。2009 年 1 月,首批比特币使用早期的比特币软件分发,从那时起交易就一直顺利进行。随着时间的推移,越来越多的人开始使用比特币,从最初的实验发展成为一个处理数十万笔交易的数十亿美元经济体(而且还在快速增长)。
使用比特币的好处
比特币本质上是一种国际货币;任何人都可以几乎瞬间将比特币发送给世界上任何其他人,金额不受限制。此外,越来越多的人可以在全球旅行时使用比特币,而无需将其兑换成当地货币。由于没有中介参与,交易费用微乎其微。与信用卡不同,信用卡需要向在线商家提供个人信息,你可以使用比特币在网上购物,同时保持隐私。由于比特币的设计使其供应量固定,因此不存在因恶性通货膨胀而失去积蓄的风险。比特币还从根本上无法伪造。
作为商家,你可以立即开始接受比特币作为支付方式,而无需填写繁琐的文书工作(与设置信用卡交易流程相比)。你还可以拥有比特币而不被他人知晓,任何第三方或政府都无法没收你的资金。(这一特性带来的隐私保护,可能对生活在压迫政权下的政治异见者的安全和自由起到保护作用。)
凭借其所有的好处,比特币的受欢迎程度持续上升;然而,任何熟悉比特币的人都会同意,它背后的技术很难解释和理解。乍一看,很难理解比特币是如何存储的,它是如何使用的,甚至它从哪里来。

比特币的复杂性与困惑
我们很少能看到一种新货币的诞生,更不用说一种与以往货币截然不同的货币了。这给大多数人带来了理解和适应上的重大挑战。
比特币可以类比于多年前纸币的出现,当时每个人都在使用金币和银币。那时,把价值归于小纸片而不是贵金属,一定显得既陌生又令人困惑。如今,纸币看起来相对安全,而将纸币交换成像比特币这样的纯数字资产似乎很奇怪。此外,转向去中心化数字货币的经济和社会后果仍然不明确。即使是中本聪和早期帮助开发这一概念的志愿者们,也无法准确预测比特币会如何被社会使用和估值,正如 1980 年代互联网的创造者们无法预测它会变得如此具有变革性一样。
疑惑也源于比特币本身是一个真正复杂的技术。它不仅依赖于中本聪在分布式网络中达成共识的突破,还依赖于现代的加密技术,如数字签名、公私钥对和安全哈希。(这些加密概念在第七章中有详细介绍。)新货币的发行是通过一种叫做“挖矿”的加密彩票进行的,任何人都可以参与其中。挖矿同时处理比特币用户的交易。为了抵御那些可能想要破坏网络的滥用行为,比特币的设计使用了博弈论,将维护网络的人的激励与那些想要按自身私利行事的人的激励相匹配。(比特币挖矿和博弈论在第八章中有详细说明。)
简单来说,你不可能在一个下午就学会并完全理解比特币。然而,我们希望这本书能帮助你尽快理解比特币的基础知识。
本书内容概览
要理解比特币的技术和现象,你必须从多个角度来看待它。这本书正是围绕这些视角来组织的。
• 首先,我们将从普通用户的角度来看待比特币。在第 2-4 章中,我们描述了比特币是如何运作的,以及如何获取、消费和安全存储比特币——让你能够真正开始使用比特币。
• 接下来,在第五章和第六章中,我们从哲学的角度来探讨比特币。第五章是从密码学家克劳利的视角讲述的一则冒险故事。克劳利被困在一个岛上,需要弄清楚如何与其他遥远岛屿的居民有效交换商品。克劳利通过一次与中本聪的偶遇了解了比特币,但对这种货币有很大的疑虑。在故事中,他通过给比特币一个机会,克服了自己的疑虑(这些疑虑可能和你们的类似)。
第六章继续以哲学的视角探讨比特币可能带来的更广泛影响,以及比特币与其用户与国家主权货币竞争的国家之间可能产生的微妙关系。
• 然后,我们将从高级用户的角度来看待比特币。第 7 至 9 章描述了比特币背后的加密方法、比特币挖矿的细节,以及各种第三方钱包软件解决方案的细节。
• 最后,在第十章中,我们将探讨一个比特币已广泛应用的世界的远未来可能是什么样子。
• 对于刚接触比特币的程序员和开发者,附录中将展示如何编写程序来发送和接收比特币。
当你阅读这本书时,请记住比特币作为一种技术是多么新颖。对于粒子物理学、埃及历史或宪法法学等领域,我们可以向那些将大部分生命献给研究这些学科的权威人物请教;相比之下,实际上没有人是比特币的专家。就像在电力发现之前没有电工,计算机发明之前没有编程大师一样,可以说今天并没有比特币专家。我们都是比特币的初学者,没人能清楚地预测比特币将如何发展,哪怕是未来一两年内。
好的一面是,这意味着如果比特币在未来得到广泛应用,你有可能成为比特币的早期专家之一,因为你正处在这样一个早期阶段学习这项技术。我们希望你能从比特币背后的思想中获得启发,并在未来几年为这一伟大技术做出自己的贡献。
现在,让我们学习一些比特币的基础知识。
第三章:2
比特币基础
根据我们的经验,最简单的方式让一个人对比特币产生兴趣,就是让他用比特币购买一些东西。这也是我们自己被吸引进来的方式。在本章中,我们将帮助你完成第一次比特币交易,而不需要担心太多技术性内容。不过,在这个过程中,我们会讨论比特币是如何运作的。阅读完本章后,你将了解比特币的基础知识——足够在任何鸡尾酒会上聊上几句。

比特币如何简单运作
在比特币系统中,每个人都共同合作来追踪其他人的资金,如第一章中提到的那样,系统中没有中央权威(例如银行或政府)。为了最好地理解系统是如何运作的,我们先通过一个使用美元的例子来讲解。
想象一下,全球只有 2100 万个比特币存在,并且有一份详细的清单列出了所有拥有这些比特币的人。每个人,包括你(尽管你只有 5 美元),都有一份这份清单。当你给朋友 2 美元时,你必须从自己的清单上减去 2 美元,并将 2 美元加到她的清单上。在通知她交易完成后,她也会更新她的清单。事实上,全球每个人都需要更新这份清单,否则清单就会不准确。因此,不仅你需要通知你的朋友,还需要公开宣布你正在更新清单。如果你试图欺骗系统,给朋友 1000 美元,作弊行为会很容易被发现,因为大家都知道你只有 5 美元。
现在,想象所有交易都在通过互联网相互通信的计算机上进行,并将美元替换为比特币。这就是比特币的运作方式。实际上很简单。那么,为什么比特币看起来如此复杂呢?
答案是三重的:首先是一个棘手的问题,关于如何评估任何新货币系统的单位(无论是比特币还是贝壳)。一项理发服务应该值 5000 个比特币还是 0.005 个比特币?其次,实施和使用比特币涉及许多细节,尽管总体概念相当简单。例如,如何获取一份清单,或者比特币是如何最初分配的?第三,比特币世界使用了大量全新的、不熟悉的词汇(例如,挖矿)。
我们将把关于比特币价值的第一个问题留到后面的章节讨论。在本章中,我们将通过解释比特币中使用的主要概念来解决后两个问题,即比特币地址、私钥、比特币钱包和区块链。我们还将简要讨论比特币挖矿,并带你完成接收和发送第一次比特币的过程,让你看到系统是如何运作的。但首先,你需要更详细地了解比特币的单位。
比特币单位
如在第一章中所解释,比特币指的是整个货币系统,而比特币则是该货币的单位。虽然总货币供应量被限制为 2100 万个比特币,但每个比特币可以进一步细分为更小的单位;例如,0.1 比特币和 0.001 比特币。最小的单位是比特币的亿分之一(0.00000001 比特币),为了纪念中本聪,这个单位被称为satoshi。因此,商品的定价可以非常精确,且人们可以轻松地使用准确的零钱支付这些商品(例如,商家可以将一加仑牛奶定价为 0.00152374 比特币,或 152,374 satoshis)。
商家通常不会在价格标签上写出bitcoins,而是使用简写的货币代码BTC或XBT;例如,5 比特币会写作 5 BTC。尽管自比特币开发之初,BTC 这一缩写已被广泛使用,但最近一些商家和网站开始使用 XBT,因为它更符合某些国际命名标准^1。随着比特币的价值上涨,使用比特币的千分之一甚至百万分之一单位变得越来越普遍,这些单位分别被称为毫比特币(mBTC)和微比特币(μBTC)。许多人提出了比特币较小单位的更简单名称,其中一个被广泛接受的名称是将微比特币(虽然很难发音)简称为bits。
1 比特币 = 1 BTC 或 1 XBT
1 BTC = 1,000 mBTC
1 mBTC = 1,000 μBTC
1 μBTC = 100 satoshis = 1 bit
现在你已经了解了各种比特币单位的术语,接下来你需要扩大你的比特币词汇量,那么让我们来谈谈什么是比特币地址。
比特币地址
比特币使用一种公开账本,记录着比特币的数量以及其所有者的身份。但与其将人名与账户关联,账本只列出比特币地址。每个地址可以看作是一个人的化名(或者是一个人群体、企业等),而使用化名正是人们能够使用比特币而无需透露个人信息的原因。以下是一个比特币地址的示例:
13tQ1fbTMB6GxUJfMqCSDgivc8fvkHEh3J
类似于银行账户号码,比特币地址由一串字母和数字组成(通常以数字 1 开头)。要将比特币发送给他人(例如,在线商户、朋友或家庭成员),你只需要知道他们的比特币地址。反过来,当你与他人分享你的地址时,他们也能向你发送比特币。由于比特币地址输入起来较为繁琐,许多人使用二维码(QR)来表示他们的地址(见图 2-1)。^(2) 为了方便,你可以将你的比特币地址,无论是输入的还是二维码(或两者兼有),放在你的名片、个人网站或店面(如果你是商户的话)上。尽管你需要互联网连接来发送比特币,但你不需要连接互联网来接收比特币。例如,如果你在某个慈善组织工作,并发放包含你比特币地址和类似“请考虑用比特币捐赠”的语句的名片,你的组织可以在你睡觉时收取比特币。

图 2-1:QR 码可以用来表示任意数据。它们易于通过智能手机扫描,因此非常方便用于共享比特币地址所使用的长字符串。
如你所知,在传统银行中,从一个账户转账到另一个账户意味着银行会更新其私有账本,记录该银行所有账户的信息。如果火灾或其他灾难摧毁了这个账本,那么关于谁拥有这些资产的信息可能永远丢失。虽然比特币也使用账本,但它的副本是分布在全球数百万台计算机上的。因此,不存在单一的故障点,并且记录在比特币账本上的交易是永久性的,无法抹去。从一个地址转账到另一个地址,相当于向比特币网络上的所有计算机发送指令,要求它们以相同的方式更新每一个账本。
由于比特币账本上的所有交易都是公开信息,保持隐私(如果需要的话)可能会有挑战。虽然账本上没有个人信息,但如果你将比特币地址与朋友共享或将其发布在别人能与你身份关联的公开场所,那么该地址上的比特币余额(包括所有进出的交易)将为所有人所知。为了增强隐私性,你可以使用多个比特币地址,但仅公开其中的一些地址。^(3)
那么,如何将比特币从一个地址转移到另一个地址(即,如何花费它们)呢?这个操作需要一个私钥。
私钥
私钥,像比特币地址一样,是一串长长的数字和字母(通常以数字 5 开头)。与比特币地址一样,二维码常常用于表示私钥,因为它们很长。每个私钥与一个比特币地址配对,并能够解锁该地址上的比特币(即,将其转移到其他地方)。^(4) 以下是一个私钥的示例:
5J2ae37Jwqzt7kSp9rE17Mi2LbkHXx4tzNSzbq7xDp2cQJCzhYo
而比特币地址类似于银行账户号码,私钥则更像一个 PIN:你需要它来授权提款或支出。当一笔交易广播到比特币网络,指示将比特币从一个地址转移到另一个地址时,网络上的计算机会检查交易是否已经授权,然后才会对公共账本进行更新。具体来说,他们会检查交易是否已经数字签名,且该签名只能由拥有相应私钥的人创建。与 PIN 类似,私钥应该保密。如果有人获得了你的私钥,他就可以花掉你的比特币。
请注意,尽管私钥可以用来生成数字签名,但数字签名无法用来获取私钥。数字签名也不能重复使用以进行新交易;因此,向比特币网络广播已签名的交易并不会构成风险。这个操作本质上与使用信用卡在线支付不同。当你使用信用卡时,你将信用卡号提供给某人以授权交易。该号码随后可以被(恶意地)重复使用,授权更多你未曾打算的交易。
与你和银行都知道的 PIN 不同,只有你知道私钥。在这种情况下,你面临的风险是,如果你丢失了存储比特币的地址的私钥,那么这些比特币将永远被锁在该地址中。显然,丢失私钥是非常严重的!幸运的是,你可以轻松地制作私钥的数字备份,或者把它写在纸上并保存在安全的地方。然而,丢失比特币地址并不是问题,因为它可以从相应的私钥恢复(本章后面将介绍的比特币钱包程序可以自动为你完成这项操作)。
尽管只使用一个地址和私钥就可以使用比特币,但在实践中,大多数人会使用多个地址,每个地址都有自己的私钥,并将它们存储在数字钱包中。
比特币钱包
比特币钱包是由一个人拥有的一组地址和私钥的集合。拥有多个比特币地址可以帮助你更好地管理资金。你可能希望为支付房租、网上购物和将来买房存储比特币而拥有不同的地址。因此,一个人可能在他的钱包里有两枚比特币,这些比特币分布在多个不同的比特币地址中(见图 2-2)。
使用多个地址的形式,也有助于保持隐私。这是因为比特币所维护的公共账本,任何人都可以查看,但它无法知道两个地址是否属于同一个钱包并由同一个人拥有(只要该人没有做出任何表明两个地址相互关联的行为,例如使用两个账户中的比特币进行一次购买)。
为了管理多个地址和私钥,人们使用比特币钱包程序。^(5)。比特币钱包是一个抽象的概念,指的是一组比特币地址,而钱包程序是一个具体的工具,帮助用户执行常见的比特币任务,如创建新的比特币地址、向他人发送比特币、备份私钥等。但需要注意的是,关于比特币钱包的术语并不是总是一致的。通常,比特币钱包程序被简称为比特币钱包,这容易混淆这两个不同的概念。当你保存一个比特币钱包(可能是为了制作备份副本)时,你会创建一个钱包文件,其中包含多个比特币地址的信息。之后,你可以将钱包文件加载到比特币钱包程序中。

图 2-2:比特币钱包是一个组织良好的地址集合及其相应的私钥。比特币钱包程序存在的目的是帮助执行常见任务,如发送比特币和管理钱包中的比特币。
有许多比特币钱包程序可以选择;大多数是免费的下载,可以在你的笔记本电脑、手机上运行,甚至可以在你的网页浏览器中使用。我们将在第三章中探讨各种比特币钱包程序,但在本章中,我们将使用 Electrum 钱包,它是开源的、跨平台的,并且非常简单易用。
获取一些“入门资金”来了解比特币
你需要少量的比特币(少于 1 美元)来完成本章的内容。如果你有一个比特币用户朋友,可以考虑请她给你一些零钱用于练习。否则,可以访问 newbiecoins.com/,这是我们(作者)将作为公共服务维护的网站,列出一些其他提供免费比特币的小额赠送的网站。通常会有 一些 信誉良好的网站为新手提供比特币赠送,但这种赠送活动的情况是动态变化的,网站每天都可能有变动,所以我们无法在本书中列出具体的网站。
使用 Electrum 创建您的第一个比特币钱包
为了跟上本节内容,请下载并安装 Electrum(* electrum.org/ *)。如果您选择使用其他比特币钱包程序,本书接下来页面上的大部分说明同样适用于它。
当您第一次运行 Electrum 时,系统会要求您创建一个新钱包(或者恢复一个旧钱包,我们现在暂时忽略恢复选项),如图 2-3 所示。

图 2-3:使用 Electrum 创建一个新的比特币钱包
下一步是 Electrum 特有的;也就是说,它不是大多数比特币钱包程序的标准功能。应用程序会呈现一个种子,由 12 个随机选择的单词组成,并要求您将其写下来(参见图 2-4)。Electrum 使用这个种子来创建您的比特币地址和私钥;因此,种子必须像您的私钥一样保密。因为本章我们只会处理少量的比特币,所以您现在不必过于谨慎。然而,您应该开始牢记这些安全细节。种子的一个重要优点是,如果您丢失了计算机(比如因火灾或被盗),所有内容——您的钱包、比特币地址、私钥和(最重要的)您的钱——都可以从种子中恢复。
下一步是让您创建密码的选项。虽然密码是可选的,但它非常重要。如果您的计算机被盗或不小心落入不法之手,密码可以防止他人花费您的比特币。由于 Electrum(和其他比特币钱包程序)使用密码来加密存储您的比特币钱包,因此没有密码,钱包将无法使用。在许多其他比特币钱包程序中,如果忘记密码,您可能会永久失去访问钱包的权限。但在 Electrum 中,您可以通过种子恢复钱包(无需密码)。

图 2-4:Electrum 向您展示了一个种子。
在最后一步中,Electrum 会要求您输入如何连接到远程服务器的指示。选择自动连接,然后点击下一步(参见图 2-5)。

图 2-5:选择您的服务器连接
您应该看到一个类似于图 2-6 的屏幕。右下角的绿色点表示您已连接到比特币网络。恭喜!您刚刚设置了您的第一个比特币钱包!现在,您可以向钱包中充值比特币了。

图 2-6:这是您的第一个比特币钱包!
在您的钱包中获取比特币
在接收标签页中(参见图 2-7),您应该能看到多个比特币接收地址的列表。

图 2-7:接收标签页
你可以与朋友分享这些地址,这样他们就能向你发送一些起始比特币——这是一种获得比特币的方式!此时,如果你想将大量资金投入比特币,请参阅第四章,我们将在那里详细讨论如何操作(但出于安全原因,务必先阅读第三章)。
要将少量比特币转入你的钱包——无论是从朋友那里还是从* newbiecoins.com/*这样的网站——你需要将你的比特币公共地址提供给那个朋友或网站。写这篇文章时,测试用的小额比特币大约是 0.5 毫比特币(mBTC)。如果你在阅读时,0.5 mBTC 的金额比较大,你也可以使用更小的数额。在朋友(或网站)发送这些比特币几分钟后,你应该能在你的 Electrum 钱包中看到 0.5 mBTC 的余额。(实际上,余额通常会即时更新。)干得好!你现在拥有比特币了,这使你能够展望未来!如何做到这一点?继续往下看。
注意
将私人比特币密钥导入钱包是有风险的。当涉及到小额资金时,你可以使用私人密钥导入资金,但绝不要将这种方法作为管理大额资金的策略,除非你是高级比特币用户。本章末尾的漫画展示了为何直接使用私人比特币密钥可能非常危险。
使用你的钱包消费比特币
尽管现在有成千上万的商家接受比特币,但你用 0.5 毫比特币(mBTC)能买到的东西并不多。你需要在互联网上搜寻优惠的交易!
或者,如果你想进行世纪交易,可以以仅需 0.1 mBTC 的低价在线进行算命。
访问 befuddled.org/,进入我们的算命网站,我们直接将其链接到水晶球。当你将 0.1 mBTC 发送到服务器的比特币地址时,服务器会将算命请求传送给水晶球,水晶球则会预测你的未来。

要获得你的财富,使用 Electrum 的发送功能,将网站的比特币地址粘贴到支付给字段中。在金额字段中,指定0.1 mBTC(如果你的单位设置为 BTC,则输入 0.0001;通过选择工具 ▸ 首选项 ▸ 基本单位来更改默认单位)。比特币交易还需要支付费用。在费用字段中,输入0.1 mBTC(这个金额可能比实际需要的稍多,但我们现在不必担心这个问题)。你的屏幕应该会显示类似于图 2-8 的内容。

图 2-8:通过 Electrum 发送比特币
当你点击发送时,Electrum 会要求输入你的密码,并确认交易已被传输。几乎立即,你应该会在网站上看到你的财富。欢迎来到未来!你刚刚完成了第一次比特币交易!
Electrum 的历史记录部分展示了你过去进行的交易。显示为待处理的交易尚未记录在比特币公共账本上(这通常发生在交易发送后大约 10 分钟)。
如果你对自己的财富不感兴趣,但想练习发送比特币,你会高兴地知道,现在许多慈善机构和非营利组织都接受比特币。一些组织为无家可归者提供食物,捍卫在线隐私权,并支持开源软件(包括比特币)。通过在线搜索,你会找到许多发布了比特币地址的非营利组织。我们推荐你将免费的毫比特币捐赠给 Sean's Outpost,这是一个位于佛罗里达州彭萨科拉,专门为无家可归者提供食物的慈善机构(其捐赠的比特币地址可以在其网站上找到,* seansoutpost.com/ )。与算命网站不同的是,当你捐赠时,可能不会收到网站的回复。但请放心,如果 Electrum 的历史记录部分显示为已确认*,那么收款方已经接受了你的比特币。(有时,确认状态会通过一个小的拨号图标来表示,或者交易可能会显示多个确认。)
你可能会好奇,Electrum 是如何获得比特币地址的。答案是通过你的比特币钱包程序。
由你的比特币钱包程序生成的比特币地址
当你运行一个比特币钱包程序时,它可以在离线状态下为你生成一个新的比特币地址。无需与比特币网络进行任何通信,这一不寻常的特性让很多人感到惊讶。对于其他地址或号码来说,例如当你创建一个新的电子邮件地址时,你必须首先查明这个地址是否被别人使用。同样,当你获得一个新的电话号码或开设银行账户时,也需要确认该号码或账户是否已经被使用。然而,当你想要一个新的比特币地址时,系统会从所有可能的比特币地址中随机选取一个。那么,随机生成的比特币地址与其他人生成的比特币地址相同的概率有多大呢?我们可以用一个类比来说明:想象地球上所有的沙粒——来自所有沙滩和沙漠。当你随机选取一个沙粒作为你的,而另一个人也随机选取一个沙粒作为他的,你们俩选中相同沙粒的概率比你们俩生成相同比特币地址的概率要高出万亿倍。^(6)
虽然你可以在离线状态下创建比特币地址,但你必须在线才能查看你地址中的余额或向他人发送比特币。这是因为这些额外的操作需要你访问比特币的公共账本,我们接下来将讨论这个问题。
区块链
所有比特币交易都会被记录到区块链中。在本书的其余部分,我们将把比特币账本称为区块链。这个名称的原因是,新交易以大块(即区块)的形式附加到账本上。每当一个新的比特币交易广播到网络时,网络上的计算机将其添加到一个不断增长的交易池中。然后,约每 10 分钟,这个交易池中的交易会被打包成一个区块,并添加到区块链中(参见图 2-9)。为了正常运行,所有比特币钱包程序都需要访问最新的区块链副本,每当一个区块被添加时,钱包程序会复制并将该区块添加到它们自己的区块链中。

图 2-9:比特币交易被分组为区块,每 10 分钟被添加到区块链中。
在比特币网络上,收集交易并将其添加到区块链的成千上万台计算机被称为矿工。我们将在本章后面解释矿工及其所做的详细工作。现在,记住,任何人都可以成为矿工(包括你自己),只需在连接到比特币网络的计算机上运行开源的比特币挖矿软件。在任何给定的时刻,成千上万的矿工都连接到比特币网络。他们都自愿提供自己的计算机,用于将新交易添加到区块链中(稍后我们将解释为什么他们这么做)。
每个添加到区块链的区块都是由网络上的单个矿工添加的。然后,比特币网络上的其他人都会跟随更新他们自己的区块链副本(这包括其他矿工和比特币钱包程序)。为什么只有一个矿工添加区块,怎么决定是成千上万的矿工中的哪一个呢?这就是比特币变得有趣——并且有点技术性。
让我们先考虑一下为什么有人会想要更新区块链。当然,如果你想进行交易,你的比特币钱包程序需要最新的区块链副本。然而,你可能几个月都不想发送或接收比特币,那么为什么在这段时间里还要更新区块链副本呢?为了让比特币系统正常运作,许多人需要保持最新的区块链副本。原因是,如果只有一个人拥有最新副本,她就能操控人们账本上的比特币数量。因此,仅凭善意不足以让系统持续运作。但奖励的诱惑始终具有吸引力。
区块链彩票
为了激励用户尽可能频繁地更新区块链,比特币使用了一种基于彩票的奖励系统。许多人成为矿工,尝试成为第一个将区块添加到区块链的人。然后,基于某种概率,选出一个赢家,允许他添加一个区块。
使用像这样的抽奖机制来运行比特币的目的是什么呢?好吧,假设 Crowley 想从 Clarice 那里买一辆 10,000 美元的车。(你将在第五章的漫画中了解更多关于我们朋友 Crowley 鳄鱼的故事。)如果使用传统货币,两个人进行这笔交易时,他们很可能会去银行,并通过银行账户之间的转账完成交易(或者使用类似的银行汇票;见图 2-10)。

图 2-10:Crowley 通过传统银行将 10,000 美元转给 Clarice。
他们会在银行这样做,因为他们需要一个可信的第三方(一个“银行家”),来管理一个“货币账本”并将账本中的资金从一个人的账户转移到另一个人的账户。银行家的工作是发布一个 Crowley 和 Clarice 可以信任的公告;也就是说,确认账本已正确更新。(银行家可能会佩戴单片眼镜,戴高顶礼帽,吸着雪茄,也可能不会。)
在比特币系统中,我们还需要一个人来调整账本,在这种情况下,意味着通过添加一个区块来调整区块链。事实证明,任何人都可以担任这个角色,只要他与交易的任何一方没有关联,因为那样可能会导致利益冲突。通过彩票随机选一个人来担任此角色有助于实现这一点。因此,在比特币中,一次彩票抽奖选出一个随机矿工,然后矿工会向网络宣布某些比特币交易是有效的(见图 2-11)。
当然,矿工确实有可能认识最近交易中的某一方。这也是为什么区块被安排成链的原因:大约每 10 分钟,当下一位彩票中奖者被宣布时,这位中奖者也会在她的公告中确认,她同意前一位彩票中奖者的所有交易(见图 2-12)。

图 2-11:一个运行比特币挖矿软件的随机人被选中来确认比特币交易。
在这个过程中,每一位比特币挖矿彩票的中奖者都会获得奖励,即一定数量的比特币。奖励包括该区块内所有交易的手续费,这激励矿工将尽可能多的交易收集到一个区块中,从而增加他们的奖励。为了有资格获得 10 分钟后添加的下一个区块的奖励,矿工需要拥有最新的区块链副本才能参与下一轮。这个过程是由开源比特币挖矿软件自动完成的,这些软件运行在矿工控制的计算机上。由于这种激励机制,成千上万的矿工不断帮助处理比特币用户的交易,确保区块链始终保持最新。
奖励彩票由社区运行;没有中央权威来选择赢家。我们暂时跳过技术细节(它们在第八章中有讲解),只说矿工不断生成随机数,直到找到一个中奖的数字。这大约需要十分钟。然后,社区通过加密技术验证该矿工找到的数字是否为中奖数字,矿工将一个新区块添加到区块链并收集奖励。当发生这种情况时,通常的说法是矿工找到了一个区块。

图 2-12:在比特币中,每个彩票赢家不仅确认她自己的交易区块,还确认所有之前的区块(她认为是有效的)。
区块链分叉
彩票系统在大多数情况下按预期工作。但偶尔,两个矿工会同时找到一个区块,区块链就会出现分叉,导致两个不同的分支(参见图 2-13)。
以以下场景为例:假设 Crowley 和 Satoshi 是矿工,并且在几秒钟内找到了中奖数字。如果他们在比特币网络上相距较远(例如,位于地球的两端),网络的一部分会将 Crowley 识别为赢家,另一部分则会将 Satoshi 识别为赢家。在这种情况下,Crowley 和 Satoshi 都会将一个区块添加到区块链上(每个人都认为自己是这一轮的赢家)。问题出现在网络的一部分复制了 Crowley 的区块,另一部分复制了 Satoshi 的区块。结果,两个区块链发生了不一致!

图 2-13:比特币矿工 Crowley 和 Satoshi 同时找到一个区块,创建了区块链的两个副本。解决分叉问题发生在 Satoshi 的区块链版本在 Crowley 之前添加了另一个区块,而 Satoshi 获得了奖励。
回想一下,你的比特币钱包程序需要一个最新的区块链副本才能正常运行,但它无法解决分叉的区块链问题。矿工和比特币钱包程序必须决定使用两个区块链版本中的哪一个。通过等待哪一个分支先添加另一个区块来解决分叉问题,这大约会在 10 分钟后发生。然后,较长的分支将被视为真实的区块链,较短的分支将被整个比特币网络忽略或孤立。
对于大多数用户来说,分叉和忽略孤立区块的过程完全不被注意,也不会对比特币的使用产生负面影响。在我们的例子中,只有输掉的矿工 Crowley 遭遇了显著的影响,因为只有两个参与的矿工中的一个能获得奖励。输掉的矿工无疑会感到失望,但矿工们预期这种情况会时不时发生,因此当它发生时并不感到意外。
交易确认、双重支付和不可逆性
交易确认是比特币中的一个常见概念。一些接受比特币的在线商家可能会要求一笔或多笔交易确认,才会交付商品或服务。每笔交易都会存在于区块链中的某个区块中。它后面的区块是较旧的,前面的区块是较新的。一个区块相对于区块链尖端的位置被称为区块深度。最新添加的区块深度为 1,它后面的区块深度为 2,以此类推。一笔交易的确认次数等于它所在区块的深度。因此,尚未被添加到区块链的交易确认次数为零;当它被添加到一个新区块时,确认次数为 1;当一个区块被添加到它前面时,确认次数为 2;依此类推。这个概念足够简单,但为什么商家需要交易确认呢?
对于低价值的交易,例如购买一杯咖啡,商家通常不会要求交易确认。你只需发送比特币,拿到咖啡,然后继续前行。一般来说,比特币交易是不可逆的,商家在你点击发送后的几秒钟内就能知道你已经为饮品(或你购买的其他物品)付款。然而,如果商家出售高价物品,如汽车,就需要考虑交易确认。
一个拥有强大计算资源的恶意用户(想象一下像詹姆斯·邦德风格的超级反派)可能会试图进行双重支付,这本质上是试图欺骗接收方接受已经同时发送给其他人的比特币(这个“其他人”可以是超级反派控制的另一个比特币地址)。当比特币网络上的矿工检测到两笔使用相同比特币的交易(但发送到不同的地址)时,他们通常会接受他们先接收到的那一笔,并忽略第二笔。更重要的是,这两笔交易不可能同时被添加到区块中,因为它们互相矛盾。超级反派的意图是让商家发货,但让交易被忽略并未被添加到区块链中。
幸运的是,这种狡猾的方案通常不会成功,因为许多商家使用特殊的监控软件,并且能够识别出当两个冲突的比特币交易同时广播时(此时超级恶棍可能会被踢出汽车经销商处)。商家防止这种支付欺诈的一个更简单的解决方案是等待 10 分钟,直到交易至少有一个确认,才同意发货。然而,如果超级恶棍拥有真正非凡的资源,例如价值数百万美元的计算机硬件,他可以尝试让比特币网络将区块链中的最新区块孤立,从而导致一个交易确认被忽略。为了应对这种遥远的可能性,销售高端商品的商家通常会等到交易有两个确认后,才将钥匙交给买家。一般来说,交易物品的价值越高,商家要求更多的确认才能认为交易已经完成。恶意黑客双重支付这些比特币的成本随着每个确认的增加呈指数级上升。
现在,您已经了解了比特币区块链的基本功能和概念,接下来将学习关于比特币挖矿的内容,这也许是比特币最神秘的方面。
比特币挖矿
比特币挖矿是收集交易并以区块的形式将其添加到区块链中的竞争过程。为什么叫做挖矿?这个术语源自比特币最初是如何分发的。尽管比特币的总供应量上限为 2100 万,但这一总量是随着时间的推移缓慢达到的。最初,比特币的供应量为零。比特币矿工通过处理他人的交易获得奖励;每个奖励是一小部分新铸造的比特币,这增加了流通中的总供应量。从这个意义上讲,比特币挖矿类似于黄金挖掘:地球上的黄金是有限的,矿工们随着时间的推移慢慢开采它。
如前所述,矿工必须通过反复随机生成数字来找到某个获胜号码,从而赢得这些新铸造的比特币。因为快速的计算机可以更迅速地生成这些随机数字,这就促使矿工使用越来越强大的计算机来挖掘比特币。在比特币的初期,个人计算机通常用于生成随机数字,但很快人们开始制造专门用于比特币挖矿的计算机。如今,挖掘比特币需要大量资金、专业知识和廉价电力的支持。事实上,比特币挖矿的发展与黄金开采的变化类似。曾几何时,挖掘黄金可以由一个人在河床上淘金完成,但现在的挖掘工作是由大型公司使用昂贵的钻探设备进行的。
寻找区块的挖矿奖励有两个组成部分:第一部分是交易费用。当你向某人发送比特币时,会额外加上一小部分比特币作为交易费用。^(7) 交易费用通常是几分钱,属于矿工在赢得区块链“彩票”并将新块添加到区块链时获得的奖励的一部分。由于一个区块包含了数百或数千笔交易,矿工的奖励是该新块中所有交易费用的总和。奖励的第二部分是一定数量的新铸造的比特币。
新铸造的比特币奖励数量会随着时间逐渐减少。前 210,000 个区块——基于每个区块间隔 10 分钟,大约需要 4 年时间才能挖出——为每个获胜矿工提供了每个区块 50 个新铸造的比特币,以及交易费用。接下来的 210,000 个区块(从 210,001 到 420,000 区块)每个区块只奖励矿工 25 个新铸造的比特币。此后,奖励将降至 12.5 个比特币,再到 6.725 个比特币,依此类推。因为这个挖矿过程是唯一的新比特币来源,所以它也是比特币流通总量永远不会超过 2100 万个的原因。
尽管每四年新铸造的比特币奖励数量会减半,但随着比特币用户基础的增长,每个区块的交易费用将继续增长。最终,用户交易费用将超过新铸造的比特币奖励。到那时,比特币网络将完全通过交易费用维持运营。
比特币系统的复杂性
我们大多数人习惯使用集中式支付服务(例如 PayPal、信用卡)。我们将信任放在运行这些服务的公司上,并且不需要了解支付系统是如何运作的。但比特币没有可以信任的公司;相反,我们可以检查系统,决定是否信任它。
如果你调查一下主要信用卡公司用于促进支付的系统,你可能会对它的复杂性感到惊讶。因为我们通常不会考虑数字支付系统是如何运作的,所以比特币系统对大多数人来说令人困惑和复杂并不奇怪。读完这一章后,你应该能对整个系统的运作有一个相当清晰的了解。在后续章节中,我们将进一步探讨一些具体的细节,比如比特币矿工使用的硬件和程序;然而,比特币系统的整体解释不会发生变化,仍将按照本章的描述。从现在开始,我们可以集中精力获取比特币,并思考它们将如何影响我们的全球经济!


第四章:3
安全、可靠且便捷地存储你的比特币
不幸的是,无法做到百分之百的保障防止丢失,但如果操作得当,比特币可以被存储得极其安全可靠,也许比任何其他金融资产都更加安全。然而,如果存储不当,比特币会因技术故障(例如,计算机或硬盘故障)或日常灾难而容易丢失,并且它们也容易成为盗贼的目标。因此,在你购买大量比特币之前,你需要学习如何——以及如何不——存储它们。
在本章中,我们将解释存储比特币的各种方法,并评论它们对于不同使用场景的适用性。有些存储方法比其他方法更安全,但也不那么方便。一旦你掌握了本章讨论的这些方法和概念,你将能够处理任何数量的比特币。

存储你的私钥
你的比特币存储在哪里?这是一个出乎意料的棘手问题。你必须知道,(1) 你的账户中比特币的数量记录在区块链上,并且 (2) 要访问这些比特币,你需要使用私钥。区块链的存储位置可能与私钥不同,而且因为两者都是使用比特币所必需的,乍一看,似乎很难确切地说出比特币存储在哪里。但是,区块链的多个完全相同的副本分布在全世界各地,而且因为没有任何灾难能抹去区块链的每一个副本,你不需要担心它是如何以及存储在哪里的。相反,你应该关注你的私钥。你(只有你)知道你的私钥,所以你存储这个私钥的地方就是你的比特币所在之处。因此,存储比特币实际上意味着存储你的私钥。如果你使用比特币钱包,它是由地址和私钥组成的集合,那么你的比特币就存储在你存储这个集合的地方(通常是在计算机、手机或可移动 USB 驱动器上的钱包文件)。
本章的其余部分将解释存储你的私钥(或私钥集合)面临的挑战,即如何防止私钥的意外丢失和盗窃。比特币允许你成为自己的银行。但是,成为自己的银行意味着你需要承担巨大的责任,并采取严密的安全措施。作为替代,你可以信任第三方服务提供商来做你的比特币银行,这样你就不需要直接担心安全问题;相反,你需要信任你的服务提供商来保护你的比特币安全。幸运的是,安全地存储比特币是很简单的,即使是初学者也能做到(见“纸钱包” 第 39 页 page 39)。
热存储与冷存储
比特币的存储方法通常根据私钥是否存储在连接互联网的设备上来区分为热存储或冷存储。热存储指的是私钥存储在在线设备或计算机上。冷存储指的是私钥无法通过互联网访问。例如,如果你使用一台离线计算机生成一个比特币地址及其对应的私钥,任何发送到该地址的比特币都属于冷存储。但如果你的地址是在一台离线计算机上生成的,别人如何向你发送比特币呢?你只需要与他们分享!你可以安全地复制你的比特币公钥并将其发布在网站上(或者通过电子邮件发送给你的朋友)。然而,私钥只存在于生成它的离线计算机上,并且保持机密。
因为发送比特币需要私钥和互联网连接,热钱包使用起来更方便,但冷存储方法更安全,更适合长期存储比特币。请注意,热钱包不能通过离线变成冷钱包。^(1) 一旦私钥暴露在互联网上,就不能再假设它能提供与从未暴露的私钥相同的保护。
有时,一些公司可能会宣传将客户的比特币资金存储在冷存储中作为安全功能,但同时声称这些资金可以方便地自动转移到热钱包中。这是一个警告信号。如果任何公司声称它有自动化过程可以将资金从冷钱包转移到热钱包,那么很可能没有任何资金存储在冷存储中。冷存储需要一个人亲自访问离线计算机并手动授权比特币交易。在《存储大量比特币》的第 38 页中,你将学习如何做到这一点。
个人钱包与托管钱包
许多公司提供比特币钱包服务和程序,帮助你存储比特币。对于外行人来说,是否这些公司提供的是个人钱包还是托管钱包并不总是很清楚。使用个人钱包时,只有你知道私钥。创建软件的公司不会控制你的比特币。或者,使用托管钱包时,第三方知道你的私钥并且不会透露给你,但公司会代表你发送、接收和存储比特币(这类似于传统银行存储现金在保险库中,并不会给你开锁的钥匙)。一些公司还提供软件即服务。在这种情况下,他们将钱包软件托管在他们的服务器上,但不托管私钥。用户可以使用自己的私钥登录、发送和接收比特币,并监控比特币交易(公司永远不会接触到私钥)。我们将这种服务称为在线个人钱包,因为私钥并没有被托管。
对于两种类型的钱包,用户界面可能看起来相似并且功能相似,但使用其中一种钱包与使用另一种钱包的后果却截然不同。特别是,比特币被盗时谁应负责,可能取决于谁有权访问私钥。如果你不确定,问问自己是否有访问私钥的权限。
注意
如果使用多个私钥来控制相同的比特币,责任划分可能会变得模糊。一些在线服务要求使用两个私钥才能花费相同的比特币,一个由公司持有,另一个由客户持有。在这些情况下,责任划分可能更棘手(尽管正如你在 “分散私钥与多签名地址” 中看到的那样,在 第 41 页 提到,使用多个私钥来存储比特币通常是一个好主意)。
使用托管钱包的好处在于它用户友好,你无需直接担心比特币的存储安全。然而,托管公司必须既是值得信赖的,又是有能力的,确保它不会恶意地带着你的比特币消失,或者让小偷窃取它们。另一个需要考虑的细节是,政府或执法机关可以要求托管公司交出你的比特币。即使你对这一要求有异议,公司也可能会遵从这个请求。
尽管由于易用性,托管钱包可能是许多未来比特币用户的热门选择,但我们将重点讨论个人钱包。即使你决定使用托管钱包并让他人管理安全和保护细节,本章也将帮助你在选择托管钱包服务提供商时做出明智的决定。
安全性、保障性和便利性
在比较存储方法时,考虑三个主要因素:
1. 安全性(防止比特币的意外丢失)
2. 安全性(防止比特币被盗)
3. 便利性(轻松快速地花费比特币的能力)
这些因素有时可能互相冲突。那些使你方便花费比特币的方法,可能无意中也让小偷更容易花费它们。同样,制作许多私钥副本并交给朋友和家人保管是防止意外丢失的好策略;然而,这种策略也增加了私钥落入不法之手的可能性。将安全性、保障性和便利性结合成一种存储方法是一个不断创新的领域,一些新的方法已经展示了三者之间的优秀平衡(参见 “特别提及:比特币硬件钱包” 在 第 42 页)。
大多数人使用两种存储方式:一种是便捷但安全性较低的小额比特币存储方法,另一种是存储大量比特币的方式,虽然不太便捷,但安全性极高。正如克劳利鳄鱼在本章开头的漫画中所示,这就像是将少量现金放在口袋里,但将大部分钱存放在传统银行账户中。
在接下来的章节中,我们将存储方法分为两类:
• 适用于小额比特币存储的方法,这些方法便捷、易于使用,并且合理安全
• 用于长期存储大量比特币的方法,这些方法极为安全可靠(但不那么便捷)
小额比特币存储
许多易于使用的比特币存储方法很方便,但它们都有一个共同的根本缺陷:一个足够精明的攻击者可能突破安全层,远程访问你的比特币。然而,这种情况与传统在线银行的安全事件并没有太大不同。无论攻击者是在本地还是在其他国家,只要他能盗取你的身份信息并破解登录凭证,就能窃取你的银行账户。例如,如果你通过笔记本电脑访问你的网上银行账户,恶意程序可能会监视你的按键(即键盘记录器)并窃取你的密码。银行通过实施严格的每日提款限额或其他措施来缓解这一缺陷,从而减少欺诈访问带来的影响。对于比特币而言,最佳的缓解策略是将大部分资金存储在冷钱包中,冷钱包无法远程访问,仅将更便捷的方法用于日常消费。
以下小节描述了三种可靠且易于使用的发送和接收小额比特币的方法:
• 在线托管钱包服务
• 在线个人钱包服务
• 个人热钱包
在线托管钱包服务
如本章前面简要讨论过的,在线托管钱包服务因其易用性而广受欢迎,用户通常无需了解比特币的内部工作原理。无需安装软件;用户只需通过网站注册并登录自己的钱包。在线托管钱包之所以显得熟悉,是因为它们的运作方式类似于大多数传统金融服务。例如,当你开设一个银行账户时,银行会代表你管理资金,处理所有转账、存款、账单支付和安全措施。比特币托管钱包也是如此:尽管比特币属于你,但它们并不直接由你持有(因为你无法访问私钥)。例如,如果钱包服务提供商破产,你可能会失去比特币。
许多服务提供商代表数百或数千人持有比特币,并且已经投资了大量的安全措施。但如果服务提供商没有透露其存储方法的详细信息,确实很难确定它是否足够安全。要保持谨慎;如果你能够仅通过用户名和简单密码访问你的托管钱包,这表明你的服务提供商可能容易受到在线攻击(如果你可以轻松访问你的比特币,小偷也能如此)。优质的钱包服务提供商,例如美国公司 Coinbase(它还提供便捷的比特币购买方式;参见第四章),要求用户使用双重身份验证来访问他们的比特币。双重身份验证除了用户名和密码外,还需要使用手机或其他二次设备。
不幸的是,由于比特币世界如此新,任何托管钱包提供商都无法声称拥有长期没有发生安全事件的比特币存储记录。^(2) 基于这个原因,目前我们建议你不要将大量比特币托付给任何第三方。另外,请注意,托管钱包在使用比特币时提供的隐私最少,因为服务提供商知道你是谁,你拥有多少比特币,以及你所有的进出交易。
在线个人钱包服务
在线个人钱包,例如 Blockchain.info 提供的 My Wallet 服务,^(3) 看起来和表现得很像托管钱包,但有一个关键区别。^(4) 这些钱包服务为你提供发送和接收比特币的工具,但它们不知道你的私钥。相反,当网站在你的设备上本地加载时(即不再与远程服务器通信),你通过输入的密码生成私钥。每当你向某人发送比特币时,签名的交易会发送到网络服务器,但你的密码(因此你的私钥)永远不会离开你的设备。从根本上来说,这意味着这些服务无法窃取你的资金。此外,如果公司破产或以其他方式消失,你只是暂时不便,且你的比特币不会丢失。
虽然和托管钱包一样易于使用,在线个人钱包却把更大的责任交给了用户。通常,你通过用户名和密码在线访问这些钱包,就像访问托管钱包一样,但如果你忘记了密码,在这种情况下你将没有任何补救措施。因为服务提供商不知道你的密码,所以它们无法帮助你找回密码。^(5) 如果你使用这种方式,务必在多个安全地点记录下你的密码!
与托管钱包相比,在线个人钱包通常提供更大的隐私保护,尤其是当它们不要求注册账户时提供任何个人身份信息。然而,服务提供商可能会跟踪使用模式和其他数据,这些数据可能随后会被执法机构要求提供。
个人热钱包
就像在第二章中讨论的 Electrum 钱包,个人热钱包是一个在你拥有的设备上运行的软件程序。因为不需要第三方来操作个人热钱包,所以使用它保持了比特币去中心化的精神。这些程序让你完全控制你的比特币,同时不牺牲便利性。然而,相比使用在线钱包服务,使用个人热钱包会给你带来更大的责任。你的私钥保存在连接互联网并与比特币网络通信的同一设备上(这是热钱包的标志特征);因此,你需要警惕保护你的设备免受恶意软件、病毒和其他黑客攻击,这些攻击可能导致盗窃。
黑客盗窃有可能发生在你身上吗?要成为攻击目标,你必须将大量比特币存放在热钱包中,并且以某种方式公开这些信息。这两个条件都不推荐!使用个人热钱包就像携带传统的实体钱包;被抢劫的可能性不大,但你不应该在钱包里放太多现金或随意挥舞,以防万一。
和实体钱包一样,你也有可能丢失你的热钱包。如果你将私钥存储在电脑上,请记住,电脑可能会丢失、被盗或被损坏——而你热钱包里的比特币可能比电脑还值钱!幸运的是,与实体钱包不同,你可以备份你的比特币钱包。不过,要注意在哪里存储备份。例如,你可能会避免使用云存储。
许多个人热钱包可供选择(不同选择的详细讨论请参见第九章)。推荐使用 Electrum (electrum.org/)和 Multibit (multibit.org/)。这两款都是开源的,已经使用多年,支持大多数平台,且轻便(不需要大量计算机资源)。原始热钱包 Bitcoin Core(前身为 Bitcoin-Qt;bitcoin.org/)需要大量计算机资源才能运行;因此,普通用户可能不选择使用它。
存储大量比特币
如前所述,冷存储方法需要物理访问无法通过互联网获取的信息。这五种存储方法大大降低了盗窃的风险:
• 纸质钱包
• 加密纸质钱包
• 离线交易签名
• 分散的私钥
• 多重签名地址
与其担心网络盗贼,你只需担心本地窃贼(并且仅限那些了解比特币的人)。这些方法大多适合将大量比特币长期安全存储。然而,如果你存储的是大量比特币财富,建议你请安全专家审计你的存储方法。
请注意,只要使用少量比特币,你可以在在线计算机上安全地尝试这五种方法中的任何一种。一旦你对某种方法感到熟悉,你将需要一台专用的离线计算机(首选),或者至少一台可以临时断开网络的计算机。
在评估冷存储方法时,使用开源比特币钱包生成器(bitaddress.org/)会很方便。
注意
你可以下载整个网站 bitaddress.org/ 并在断开互联网后在你的计算机上运行它。
当你首次访问该网站时,你将被要求随机地将光标移动到一个由字母和数字组成的框中(或输入字母),以提供一个源随机性,网站将用它来生成比特币地址。你需要这么做的原因是,计算机生成随机数字是非常具有挑战性的,因为它们遵循严格的指令,导致结果更具可预测性。对于不重要的应用程序,比如在计算机上玩纸牌游戏,使用普通的随机数生成器来洗牌并不是什么大问题,但对于存储资金来说,高质量的随机性非常重要。
纸钱包
使用纸钱包可能是最简单且最流行的冷存储方法之一。这包括在离线计算机上生成一个比特币地址和私钥,然后将两者写在一张纸上,但不将这些信息保存在计算机上。之后,你可以将纸条存放在文件柜、个人保险箱或银行的保管箱里。将纸条安全地锁好后,你可以继续将比特币发送到关联的比特币地址以便保存。当你最终决定使用存储的比特币时,你可以使用大多数比特币钱包程序中提供的导入私钥或导入纸钱包功能。此时,你的比特币将不再处于冷存储状态。
如果你只想花费部分存储的比特币,而将其余的保存在纸钱包中,在将私钥导入热钱包后,你应该立即将剩余的比特币存储到新的纸钱包中(纸钱包仅限一次使用)。但务必在导入旧纸钱包中的比特币之前,提前准备好新的纸钱包。
注意
另外,您可以使用一种名为离线交易签名的技术来花费部分纸钱包中的比特币,该技术在《离线交易签名》一章中有详细描述,见第 40 页。*
只要您将纸质钱包的私钥保存在安全的地方,纸钱包方法适合无限期地存储大量比特币。然而,请注意洪水和火灾等物理风险。此外,切勿扫描、拍照或以其他复制方式暴露您的纸质私钥,否则您将危及纸钱包的安全。您的比特币安全性取决于您存储私钥的方式中最不安全的方法。特别地,请考虑一些办公室复印机会保存它们复印过的每一份文件的记录。最安全的纸钱包备份方法是手写几份副本,并将这些副本安全存储,这也是推荐的方法。
加密纸钱包
加密纸钱包方法是为了进一步提高纸钱包的安全性而发明的。其本质是,您不再直接写下私钥,而是写下其加密版本。唯一能解密您的私钥的方法是使用您选择的密码,这样可以防止小偷访问您的私钥和比特币。
有数百种加密方案可用于此目的,但最常见的方案是BIP38 加密。
注意
比特币开发者社区维护着一个功能清单,称为比特币改进提案(BIPs),而此加密标准在清单中排第 38 位(已经实现的功能,如此标准,通常仍以其 BIP 编号被称呼)。*
要创建 BIP38 加密的纸钱包(请访问bitaddress.org/,并来回摇动鼠标,直到生成足够的随机数据并且出现纸钱包标签),您需要选择一个密码短语,然后生成一个比特币地址及其相关的加密私钥。您的私钥应以数字 6 开头,而普通私钥则以数字 5 开头。
注意
在计算机科学中,密码通常有两种功能:一种是用来认证用户,要求用户在适当时提供密码,另一种是用来加密数据。对于认证,通常可以使用较短的单词长度密码(尽管这通常不是一个好主意)。然而,用于数据加密的密码必须总是很长:如果密码短于 40 个字符,它们通常容易破解。因此,当密码用于此目的时,如本节所述,通常会约定称其为密码短语。
但需要警告的是:如果你忘记了密码短语,你将永远无法访问你的比特币。因此,最好将密码短语写下来并存放在与纸钱包不同的位置。和普通纸钱包一样,制作加密纸钱包的备份副本,以防洪水、火灾或盗窃。始终假设你的钱包是不安全的,以确保你对安全保持警惕。如果你的加密纸钱包被盗,使用你的副本将比特币导入到热钱包中,然后将其存储在新的加密纸钱包中。即使罪犯最终确定了你的密码短语,到那时你已经将比特币转移了。
离线交易签名
离线交易签名是比特币业务或经常处理大量比特币的高级用户的入门级安全方法。此方法需要两台计算机,且比使用纸钱包更为先进。一台计算机拥有一个个人热钱包,像 Electrum 一样工作,但省略了私钥。因此,当你点击发送比特币时,系统会要求你使用第二台计算机执行额外的授权步骤,第二台计算机包含私钥且不连接到互联网。第二台离线计算机也安装有比特币钱包程序,仅用于授权或数字签名交易。你使用离线计算机创建一个包含数字签名交易的文件,然后将该文件复制到在线计算机并广播到比特币网络(见图 3-1)。

图 3-1:离线与在线计算机如何协同工作,安全签署比特币交易而不暴露私钥到互联网的示意图
在线计算机从未接触私钥。离线交易签名类似于一个没有签名权限的财务管理员开具支票,而支票需要授权人签名后才能邮寄出去。虽然这种方法非常安全,且可以用于存储相当大量的比特币,但每天进行大量交易可能会是一个繁琐的过程。一个潜在的风险是丢失存储在离线计算机上的私钥,因此你应该备份这些私钥以确保其可靠的长期存储。另一个风险是,如果你的离线计算机被盗或被扣押,你的私钥可能会遭到泄露。
离线交易签名相比仅从纸钱包导入私钥的一个优点是,冷钱包到热钱包的过渡永远不会发生。即使你从存储比特币的地址进行消费,你的比特币始终处于冷存储中。
如果你有两台计算机,可以使用 Electrum 离线交易签名功能。另一个强烈推荐的离线交易签名钱包是 Armory Bitcoin 客户端(bitcoinarmory.com/),它是开源的,并且设计时最大限度地考虑了安全性。Armory 提供了许多高级安全功能,如果你对高安全性 Bitcoin 存储非常重视并且是高级 Bitcoin 用户,绝对应该探索这个选项。
分割私钥和多重签名地址
分割私钥和多重签名地址涉及将花费 Bitcoin 所需的信息分割成多个部分,并将它们存储在不同的地理位置。这两种技术都能实现极高的 Bitcoin 存储安全性。作为企业级的 Bitcoin 安全策略,它们应由大型 Bitcoin 企业(如主要的货币交易所、持有 Bitcoin 资产的对冲基金等)实施。让我们逐一了解这两种策略。
分割私钥
使用一种称为秘密分享的加密技巧,Bitcoin 私钥可以被分割成多个碎片,而只需要特定数量的碎片就能重建该私钥。这有时被称为“m of n”私钥,其中m和n*分别代表所需的碎片数量和可用的碎片数量。例如,私钥可能被分成五个碎片,但任何三个碎片都可以用来重建该私钥,这就是所谓的“3 of 5”私钥。单个碎片本身不会泄露任何关于私钥的有意义信息。这个策略对于高安全性的 Bitcoin 存储非常有用,因为公司可以将每个碎片存储在不同的安全地点;如果某个碎片损坏或被泄露,Bitcoin 仍然安全。此外,其他碎片还可以用来将 Bitcoin 转移到新的地址。多个不同的加密协议可以用于秘密分享,但最流行的是 Shamir 的秘密分享方法,组织可以轻松在网上找到其开源实现。
多重签名地址
使用多重签名地址,或者使用多个私钥,而不是将单一私钥分割成多个部分,也提供了类似级别的高度安全存储。比特币存储在一个需要多个私钥才能使用的地址中。公司可以指定有多少个密钥以及完成交易所需的密钥数量;例如,如果指定了三个密钥,任何两个密钥都足以完成交易。为了安全保存,企业也可以将这些密钥分配给不同的人,以防止组织将移动比特币的权力托付给单一人员。例如,比特币银行可以确保没有任何单一员工(即使是 CEO 或总裁)能单独移动客户的资金。每个比特币银行的员工都可以拥有自己的私钥,所有的密钥对应同一个比特币地址,但单一私钥不足以转移比特币。为了授权从银行的比特币地址转移比特币,需要多个员工使用他们的私钥对交易进行数字签名。多个私钥和单一私钥的多个片段之间有一个主要区别:使用多个私钥时,任何时候都不会有一个人拥有完全控制权,而使用多个私钥片段时,合并这些片段并构建私钥的人拥有完全控制权。使用多个私钥是一种极其安全且负责任的方式来管理大量比特币。
特别提及:比特币硬件钱包
硬件钱包是一种相对较新的比特币存储方法。它是一个小型设备,能够放进口袋,并以一种方式存储你的私钥,使得没有人能够从设备中提取它们。硬件钱包充当了之前提到的离线交易签名方法中的离线计算机,但它更加便捷,因为你可以将它插入到你的在线计算机中。即使你的在线计算机上有病毒,你的比特币也永远不会处于风险之中。当你在在线计算机上的比特币钱包软件中点击发送比特币时,你需要在硬件设备上确认交易——通常是按一个按钮。硬件钱包使用内部存储的私钥对交易进行签名,然后将其发送到在线计算机。
这种方法几乎和使用个人热钱包一样方便,但它更安全,因为你的私钥不可能暴露在互联网上。设备上的比特币将始终处于冷存储状态。这个方法的一个缺点是你需要购买一件硬件设备,而不是仅仅下载一个免费的开源程序。使用硬件钱包的另一个缺点是,你可能会丢失它,这可能导致比特币丢失(尽管一些硬件钱包提供备份比特币的方法)。虽然硬件钱包在方便性和安全性之间达到了很好的平衡,但你可能不想依赖它来存储比特币几十年,因为目前没有关于这种设备的使用寿命或耐用性的相关数据。
TREZOR
一款受到了广泛关注的硬件钱包品牌是 Trezor (www.bitcointrezor.com/)。我们认为 Trezor 硬件钱包是一个优秀且相对易于使用的设备,但由于 Trezor 设备是新的,仍然存在可能会发现某个 bug 或安全漏洞的风险(这也是比特币本身的一个原则性问题)。
Trezor 由 SatoshiLabs 创建(见图 3-2),它是一个小型设备,用来“存储你的比特币”(也就是存储你的私钥)。当你想花费比特币时,你使用 USB 线将 Trezor 连接到笔记本电脑。它不一定要连接到你自己的笔记本电脑;你可以使用任何陌生人的笔记本电脑,仍然能够安全地花费你的比特币。这可能就是 Trezor 的定义特点:它不要求你信任你插入的笔记本电脑。如果你正在旅行且没有携带自己的笔记本电脑,这一点尤其有用:你可以在目的地使用任何一台电脑。由于大多数比特币是通过利用智能手机和笔记本电脑中的安全漏洞被盗的,使用 Trezor 显著降低了比特币被盗的风险。那么它是如何工作的呢?

图 3-2:Trezor 设备
智能手机和笔记本电脑也是可以存储私钥的设备,但与 Trezor 不同,它们将这些私钥视为任何其他数据,即可以查看、复制或修改的信息。笔记本电脑上的病毒可以搜索私钥数据,复制它们并将其广播到远程服务器,导致比特币被盗。而 Trezor 则永远不会允许你或病毒查看或复制私钥数据。相反,当你想花费比特币时,它使用其内部私钥签署一笔交易,然后将交易交给你。Trezor 就像一个偏执的厨师,他永远不会透露自己的秘方,但会随时为你烹饪。
配置 Trezor 稍微有些繁琐(对于初学者来说可能需要 5 到 10 分钟),但这只需要做一次。
- 将 Trezor 插入你的笔记本电脑。
2. 访问 mytrezor.com/。安装必要的插件,使你的笔记本能够与 Trezor 通信。插件安装完成后,你可能需要重新启动浏览器以继续操作。
3. 再次访问 mytrezor.com/。网站会识别到你的 Trezor 设备尚未配置,并要求你为设备设置一个唯一的名称。输入一个名称并点击 继续。
4. 使用笔记本输入一个新的 PIN 码。
5. 再次输入 PIN 码以确认你在上一步没有出错。
6. Trezor 设备现在会显示恢复种子,以便在你丢失设备的情况下恢复你的比特币。这是 Trezor 唯一一次会间接显示(其私钥是从种子派生的)其私钥的时刻。一旦配置过程完成,私钥将永远无法再次查看或访问。将恢复种子写在纸上(或两张纸上),并保存在安全的地方。
7. 恭喜你,已经准备好使用你的 Trezor 了!如果你在其他地方存有比特币,可以通过点击“账户 ▸ 收款”来查找一个接收比特币的地址,将比特币发送到你的 Trezor。
操作 Trezor 要简单得多:
1. 将 Trezor 插入笔记本。
2. 打开笔记本上的比特币钱包程序,这个程序已经配置好能与 Trezor 配合使用(或者访问 mytrezor.com/,这是由 SatoshiLabs 创建的专为 Trezor 用户设计的网站)。
3. 在笔记本上,选择你想要花费的比特币数量以及你想要发送的地址。点击 发送。
4. Trezor 会要求你输入 PIN 码。(这是为了防止有人盗取你的 Trezor 并花费你的比特币。)使用笔记本输入 PIN 码。
5. Trezor 会显示交易细节。按下 Trezor 上相应的按钮以确认交易(或按另一个按钮以拒绝交易)。Trezor 现在会创建一个签名的比特币交易并将其发送到笔记本电脑。
6. 笔记本自动将交易广播到比特币网络。你的比特币已被发送!
这些步骤只需一分钟即可完成,对于在线购物等任务非常方便(然而,Trezor 并非设计用来在像咖啡店的收银机这样的销售终端上使用)。
Trezor 还支持一些高级功能,如使用密码(除了 PIN 码)和用于多个账户的分层确定性钱包。由于篇幅有限,这些功能无法完全覆盖,但你可以访问 Trezor 网站 (www.bitcointrezor.com/) 获取更多详情。本文写作时,Trezor 的售价约为 120 美元,但只能使用比特币支付。
特别提及:比特币脑钱包
使用脑钱包存储比特币是一种独特且令人震惊的技术。在这种方法中,你通过记住你的私钥,将比特币完全存储在大脑中。我们需要事先注意到,这种存储方法在几个方面是不切实际的,只推荐给比特币/加密学专家使用。因为没有任何实际的物品可以被盗或被没收,所以当你无法控制你的物理环境时(例如,住在宿舍、通过安检等),可以使用这种方法来存储比特币。然而,你必须创建一个既长又难忘的密码短语,这样你才能记住,特别是当你需要存储大量比特币时。然后你将密码短语输入到一个计算机程序中(该程序运行在离线计算机上),该程序接受任何文本作为输入,并输出一个私钥和比特币地址。在以下示例中,密码短语很短且容易猜测,因此你存储的比特币将面临风险。
passphrase: "bitcoin for the befuddled" <--- way too short
private key: 5JS1PoX1e7b48VnBtaeYohJvoe8NTGBTdBa9KELJR9UjoeL9ukx
bitcoin adddress: 1EjtJ53dXFT7cmP5ETiQuyc9fPy96FEPBh
然而,以下的密码短语足够复杂。
passphrase: "crowley likes beaches, lisp programming, ravioli and sasquatches
conradbarski chriswilmer nostarchpress"
private key: 5Ke7Unhs9Ghc4UmhVZXptjPZiVFn48fnN1xGeoctsKrHdpdJtAD
bitcoin address: 1FqwT4844gvjP6GCELW5NaR1gMCQKRcaSP
在离线计算机上生成密码短语后,你忽略私钥,只复制比特币地址。你不希望将私钥存储在任何地方,即使是在离线计算机上。当你想转移比特币时,你将需要私钥,这时你可以从记住的密码短语中重新创建它(并将其导入到比特币钱包中,如 Electrum,或者用于离线交易签名)。通过不将私钥存储在任何地方,你可以防止别人从你那里偷取它,无论是通过物理方式还是数字方式。当然,你可以写下你的密码短语并将其保存在安全的地方,但那就不严格是一个脑钱包了(然而,这可能是一个好主意)。
脑钱包适用于存储大量比特币的中长期存储(几年),但不适合日常交易。此外,将大量比特币存储在脑钱包中长达数十年可能存在风险,因为你可能会忘记密码。此外,人类本能上在选择计算机无法猜测的密码短语方面存在缺陷,越来越强大的计算机可能能够猜测出人类生成的每一个密码短语。对于长期存储大量比特币,最安全的做法是使用随机生成的私钥(并且使用高质量的随机源)。
选择适合你的存储方法
最好的存储方式是从小处着手,选择一种你觉得舒适的简单存储方法(见图 3-2)。记住,使用复杂的比特币存储方案时,人为错误是一个真实的风险因素。一旦你对比特币的运作方式更加熟悉,你可以逐渐增加你拥有的比特币数量和使用的安全级别。
尽管没有任何系统是百分之百安全的,但你可以比黄金或传统货币更安全地存储比特币。存储比特币可能看起来不像在传统银行账户中存放现金那样安全,但原因可能仅仅是因为许多人对不熟悉的技术感到不那么放心。也许有一天,我们会回头看,认为一个无法伪造、基于加密原理的去中心化货币比传统货币更安全这一点本应显而易见。

图 3-3:比特币存储方法的总结。这些策略涵盖了从低安全性(但便捷)到高安全性(但不便捷)的整个范围。这个图表并不全面,因为新的方法正在不断开发。例如,图表中最好的方法之一——硬件钱包,在 2014 年之前是无法实现的,而比特币的开始时间是五年前。
第五章:4
购买比特币
购买比特币基本上就像购买任何其他类型的货币一样。想想您通常如何将美元兑换成日元或墨西哥比索的各种方式。对于少量资金,您可能可以找到朋友为您兑换一些您想要的货币。对于中等金额,您可以去货币兑换店,比如大多数国际机场的那些,这很方便但收取高额费用。如果您想兑换成千元美元或者您是货币日间交易者且不想支付高额费用,您需要在主要货币兑换所注册一个账户。所有这些对比特币也适用,只是基础设施尚未像传统货币那样发展完善(现在,一个机场货币兑换店可能无法告诉您比特币和香蕉的区别)。

底线是,您今天有许多不同的购买比特币的方式:您可以在本地购买,从您的朋友或您所在地区的人那里购买;您可以从中介公司购买,无论是在线还是实体店;或者您可以从主要的比特币货币交易所购买。重要的是要记住,无论何时购买比特币,您都是从已经拥有它们的人那里购买(交易服务仅促进此转移);比特币不是直接从比特币公司出售的。因此,没有个人设定比特币的价格;价格是由每天买卖比特币的人共同决定的(即,由自由市场决定)。
为什么不直接挖掘比特币?
尽管您可以通过挖掘来获得比特币,但这并不容易(也不是免费的)。除非您打算辞去日常工作成为全职比特币挖矿者(参见第八章),否则通过挖矿获得大量比特币并不切实际。比特币挖矿需要高度专业化的计算机硬件、廉价的电力和高度耐心。
购买比特币的方式
广义上讲,您可以通过三种主要方式购买比特币:
• 简单的方式: 通过中介公司

• 高效的方式: 通过货币兑换所

• 有趣且未来感的方式: 通过点对点购买

中介公司通过帮助人们轻松购买比特币赚钱,减少麻烦。这些公司通常有良好的客户服务,并让您免于理解所有货币交易的复杂性。然而,像所有中介一样,他们为此便利性收取费用。
更高效的方式是直接从比特币交易所购买比特币。交易所通过一个复杂的货币交换系统直接连接买卖比特币的人。这些交易所相对先进,对于初学者可能会让人感到有些畏惧。然而,交易所是大多数比特币大宗买卖发生的地方。正因为如此,交易所通常会提供购买比特币的最佳价格。此外,直接从交易所购买比特币可以减少涉及的中介方数量,从而降低交易出现问题的风险。对于大额比特币购买($5,000 或更多),始终直接与交易所交易。对于小额购买,只要你有时间并且愿意学习货币交换的细节,使用交易所也是一个不错的选择。
直接从你所在地区的人那里面对面购买比特币是最有趣的,因为你可以遇到对这种新货币感兴趣的其他人。当然,直接与陌生人交易可能会让一些人感到不舒服。但大多数比特币爱好者相信,面对面交易可能是未来的趋势。有些人希望看到一个更加去中心化的世界,在这个世界中,大型企业变得过时,因为科技使得人们更方便和实用地直接互动。也许有一天,面对面的交易将成为购买比特币最有效、最便宜和最快的方式。
轻松购买比特币

目前,购买比特币最简单的方式是通过一个已建立的比特币中介,更准确地说,是一个比特币交易所中介。交易所中介由已经在一个或多个比特币交易所注册自己账户的公司组成,这些公司会代表你买卖比特币。通常,交易所中介只提供按市场价格出售比特币的服务;你无法设定自己的价格。此外,这些公司可能只进行单向货币转换。例如,在 2013 年比特币价格飙升期间,许多新加入比特币社区的人希望快速购买比特币。毫不奇怪,许多只进行比特币与美元交易,而不是美元与比特币交换的商家迅速出现,满足了这一需求。
然而,使用中介也有明显的好处。所涉及的文书工作很少,许多服务提供在几分钟内让你获得比特币(而不是几天或几周)。费用通常在 1%到 10%之间,但服务和客户支持通常比交易所更好。
注意
比特币中介大致类似于 PayPal,PayPal 充当中介帮助你使用银行账户进行互联网购买。如果你曾使用过 PayPal,你会发现使用交易所中介的体验非常相似。
表 4-1 列出了一些流行的交易中介。你应该尽量选择那些收取最低费用并提供最佳用户体验的公司。务必在线查看这些服务的评价,尽量了解它们在比特币社区中的声誉,再做决定。这些服务中的许多只在有限的地理区域内运营,所以有些可能无法为你提供服务。
表 4-1: 流行的比特币交易所中介
| 公司名称 | 提供的服务 | 地点 | 成立时间 |
|---|---|---|---|
| Bitcoiniacs | 按市场价格买卖比特币;实体比特币商店 | 加拿大基洛纳 | 2013 |
| BTCquick | 使用信用卡购买比特币 | 科罗拉多州丹佛市 | 2013 |
| Circle | 通过银行或信用卡买卖比特币 | 马萨诸塞州波士顿 | 2013 |
| Coinbase | 按市场价格买卖比特币;比特币钱包托管 | 加利福尼亚州旧金山 | 2012 |
- 仅提供服务的部分描述
警告
不幸的是,过去很多时候,诈骗和管理不善的公司参与了比特币的买卖。不可否认,未来我们在本章提到的任何公司也可能会出现这种情况。在信任某家公司处理你的资金之前,审慎评估它们是你自己的责任。
在我们带你走过从这些公司之一购买比特币的具体步骤之前(见 “通过 Coinbase 购买比特币” 第 58 页),我们首先需要讨论几个技术概念。你必须理解的一个概念是双重身份验证,它是一种在线交易方式(以及一种思考此类交易的框架),可以大大减少被黑客攻击和/或被盗的风险。我们需要讨论的另一个概念是可逆与不可逆金融交易之间的区别。理解这个区别有助于解释为什么从服务公司获取比特币时,通常会涉及较长的等待时间。
身份验证因素
自从数字技术的诞生以来,已经提出了多种方法供计算机用户证明自己的身份:密码、虹膜扫描、钥匙扣、面部识别等等。然而,所有这些安全措施都可能被突破。如果你喜欢科幻电影,你一定熟悉这些方法如何被破解。

然而,你可以通过将多种身份验证方法组织成三大类,然后选择两种进行使用,来克服这些弱点。这被称为双重身份验证。这三大类如下:
• 你知道的东西: 你的密码,你第一只宠物的名字,你的签名,等等
• 你拥有的东西: 一只钥匙扣,你的智能手机,等等
• 你是谁: 你的指纹,你的面部,你的眼睛,你的声音,等等
结果发现,这些类别中的大多数弱点是非常不同的。这意味着,如果你选择两个不同类别的认证方法,黑客要攻破你的账户会更加困难。这就是我们所说的两因素认证。我们稍后将讨论一个实际的例子。
将美元(或其他货币)转换成比特币的麻烦
比特币的一个常见批评是,获得比特币可能非常麻烦。通常,你需要等待几天才能通过中介平台用美元购买比特币。人们常常感到困惑的是,他们可以在 10 秒钟内在亚马逊上购买物品,但无论在哪里购买比特币,都需要花费很多天。
可逆交易
令人惊讶的是,原因在于当前世界经济是围绕着合同和可逆交易建立的。无论是信用卡支付、支票存款、银行汇款、股票购买还是抵押贷款,两个当事方之间的金融价值转移通常都涉及非常相似的步骤。任何通常在财务账簿中追踪的金融资产(如今除了纸币,大多数东西都包括在内)都是以这种方式处理的。步骤如下:
-
一方或双方共同起草一份具有法律约束力的合同。 有时这份合同会正式写出(例如当你发起抵押贷款时),有时则是根据事先约定的条款隐性达成的。例如,当你在亚马逊上输入信用卡信息时,你就被绑定在一个你事先与信用卡发卡行签订的合同中,该合同规定你将履行通过这种方式使用信用卡所产生的债务。
-
合同条款会通知所有相关方。 如果你发起银行汇款,你的银行以及接收资金的银行都会收到银行汇款请求的通知。同样,在亚马逊上出售装饰性肥皂的人也会收到通知,知道你使用了 Visa 卡购买了一瓶树莓手工皂。在这一点上,通常仍然有一定的余地让各方在一段时间内选择退出合同,这段时间通常被称为结算期(或持有期、撤销期,具体取决于资产类型和涉及的具体情况)。
-
购买的资产被交付,财务记录被更新。 在一段时间后,一旦银行更新了账簿,银行汇款的余额就会出现在收款人的银行账户中。同样,你的树莓手工皂也会被交给邮局进行配送。
这个过程中的关键一步是,你的银行(或 E-Trade、抵押贷款公司、肥皂销售商)在账本中输入的信息,在确定谁“拥有”某项资产时实际上是毫无意义的——这些账本没有法律效力。唯一知道你是否拥有银行账户中的钱、Paypal 账户中的钱或 E-Trade 上 Google 股票的方式,是查看原始合同。如果有人联系你的银行,说:“实际上,Bob 账户中的所有钱都属于我,因为 Bob 和我签署了这份证明这一点的合同”,并且此人能够通过许多法律程序证明这笔钱确实属于她,那么 Bob 的钱就不再安全。银行内部账本上显示他有权拥有这笔钱并不重要。
最终结论是,由于法律合同几乎总是存在争议的可能,而且银行、抵押贷款公司、E-Trade、亚马逊等机构维护的账本都受到法律体系的约束,因此可以合理地认为我们的传统金融体系是基于可逆的金融交易的。除非有超过原合同的时效限制,这些合同可以在未来多年内被超越,否则我们在第二步中提到的结算期是无限期的。
这在理论上和实践中都是真实的。以下所有类型的交易都可以(而且经常会)被至少一个交易参与者在交易发生几天后(通常也包括几周或几个月后)撤销:
• 银行电汇
• 信用卡交易
• 抵押贷款合同
• 股票购买
• 支票存款
对于这些交易中的一些,唯一能撤销购买的可能是交易中更大、更有权力的参与方。例如,虽然你可能无法改变你一日前购买的 Google 股票,但你不会感到惊讶,得知 E-Trade 会要求你等待 10 个工作日,才允许你将这股股票从 E-Trade 账户中取出,而且如果你用来购买股票的银行电汇在事后被银行撤销,E-Trade 会非常乐意将这股股票从你那里收回。
不可逆交易
然而,也有一些类型的金融交易是完全不可逆的。此类交易中最常见的就是现金的纸币转移。如果某一天 ATM 机出现故障,吐出了你并不拥有的$10,000 现金,而你决定在那天晚上将这笔钱埋在树林里,那么无论是银行、政府的任何行动,或者法律合同,都无法追回这笔现金;如果你决定不告诉他们你埋钱的地方,那么这笔钱就不会被法律体系直接追踪到。^(1)
比特币具备相同的特性,这也是为什么人们有时称其为数字现金。如果你通过标准的比特币交易给某人转账,无论你做什么或说什么,都无法撤销这笔交易。这样的交易是通过纯数学强制执行的,并且本身不涉及任何法律合同。
结合可逆和不可逆资产
现在我们终于明白为什么购买比特币常常是个麻烦。当你用可逆资产购买不可逆资产时,会导致一种叫做阻抗不匹配的现象:虽然可以建立高效的金融系统,涉及可逆交易(我们的现代金融系统)和不可逆交易(当前加密货币世界中所见),但在这两类资产之间交换是困难的。
这就是为什么银行在自动取款机上有如此严格的现金提取限额,为什么购买比特币可能需要几天时间的原因。在这两种情况下,如果发生问题,机构无法撤销不可逆交易,因此需要额外的预防措施,以确保交易的可逆部分在同意交易之前有很高的成功完成概率,尤其是在涉及大量资金的情况下。
注意
如果你通过亚马逊购买邮寄到了覆盆子香皂,这也可以说是一种不可逆交易。然而,如果这些产品是通过欺诈手段获得的,它们很难转售给其他人(与比特币不同)。这也是为什么网上香皂卖家面临的欺诈风险比比特币卖家公司要小的另一个原因。
为什么不可逆交易可能更具优势
很多人在听到比特币交易是不可逆时,可能会有这样的想法:“我挺喜欢如果有人卖给我不合格的产品,我可以撤销信用卡交易的事实。”然而,实际上,用比特币进行可逆交易依然很简单。很多系统可以实现这一点,通常是利用比特币中的多签名交易功能,我们将在后续章节中详细讨论这一点。
目前,确实存在一个问题,使用标准比特币交易时,买家在网上购买商品时的保护措施没有信用卡系统那么强。这是比特币的一大弱点,也是比特币社区需要努力解决的问题。但事实上,根据情况的不同,可逆和不可逆交易都是有用的。例如,如果你要把一辆自行车卖给陌生人,价格是 100 美元,你可能不希望得到一个潜在可逆的资产作为交换,比如个人支票。相反,你会对陌生人说:“只收现金”(或者在你读完这本书后,可能会说“只收比特币或现金”)。
因此,由于比特币允许可逆交易,而你的 Visa 信用卡永远无法进行严格不可逆的交易,可以说不可逆的金融工具更为优越:它们是更基本的构建块,在其基础上可以构建更复杂的交易形式,包括可逆金融交易,并且可以通过传统合同来执行(如果需要的话)。
总结来说,我们认为批评比特币设计上购买难度较大(尤其是通过信用卡或银行转账购买)可能有些不公平。部分原因在于传统金融系统本身的设计。
使用 Coinbase 购买比特币
在美国,目前最受欢迎的比特币交易中介平台无疑是 Coinbase。让我们一起走过使用 Coinbase 购买比特币的步骤。与我们接下来讨论的所有购买比特币的方法一样,开始时最好从少量购买;只买少量比特币,直到你对过程感到熟悉。
注意
如果你决定使用其他中介而不是 Coinbase,步骤大致相同,尽管某些细节可能有所不同。
步骤 1:在 Coinbase 注册
要在 Coinbase 注册,访问coinbase.com/,然后选择注册。接着输入你的电子邮件地址并选择密码(图 4-1)。

图 4-1:Coinbase 的注册界面
点击创建账户。此时,Coinbase 将向你的账户发送一封电子邮件以验证地址。
步骤 2:设置双重认证
设置第二重认证方法最简单的方式是运行一个 iPhone 或 Android 手机上的应用程序,用以证明你拥有一个特定号码的手机。Coinbase 允许你这么做。一旦设置完成,你的 Coinbase 账户二次认证方式将会是:
1. 你知道的事情: 你的 Coinbase 密码
2. 你拥有的东西: 你的智能手机
目前,Coinbase 使用的应用程序叫做 Authy,你可以从 iTunes App Store 或 Google Play Store 安装到你的手机上。安装该应用后,按照指示进行配置,配置过程中你需要输入手机号码并再次验证你的电子邮件地址。
现在你可以使用 Authy 将你的手机与 Coinbase 账户关联。登录 Coinbase 后,进入账户设置并验证你的手机(图 4-2)。

图 4-2:Coinbase 的账户设置界面
点击验证手机并输入你的手机号码。Authy 会检测到你正在尝试链接 Coinbase,并会显示 Coinbase 选项(图 4-3)。
选择Coinbase in Authy来显示一个验证码,Coinbase 会要求你在接下来的步骤中输入这个验证码。输入验证码以验证你的手机。
现在,如果有人试图访问你的 Coinbase 账户,他们不仅需要知道 Coinbase 密码,还需要访问你的智能手机。
步骤 3:将银行账户链接到 Coinbase
要在 Coinbase 购买比特币,你需要将 Coinbase 账户与银行账户关联。登录 Coinbase,选择买/卖,然后选择支付方式。点击添加银行账户并提供你的银行账户信息(图 4-4)。

图 4-3:Authy 应用检测你使用 Coinbase 的情况。
很可能,你需要等待几天才能完成银行账户的完全验证。然后,你就可以继续按照步骤 4 进行操作。

图 4-4:在 Coinbase 上输入银行账户信息的界面
步骤 4:在 Coinbase 上购买比特币
在银行账户确认后,你可以下第一个比特币订单。图 4-5 展示了点击买/卖时你会看到的界面。
这个界面一目了然:你只需输入你想购买的比特币数量,然后点击购买比特币。确认购买后,Coinbase 会从你的银行账户转账等值的美元。再等几天,你应该就能拿到你的第一批比特币!

图 4-5:Coinbase 上的购买比特币界面
步骤 5:保护你闪亮的新比特币
当你的比特币到账时,Coinbase 会通过电子邮件通知你比特币已存入你的 Coinbase 钱包。但是,由于你的 Coinbase 钱包由 Coinbase 管理,如果 Coinbase 发生崩溃、被黑客攻击或破产,你的资金可能会面临风险。因此,你应该采取额外措施来保护你购买的比特币。
尽管 Coinbase 可能是一个值得信赖的公司,并且破产的可能性微乎其微,但为什么要冒任何丢失比特币的风险呢?只需将你的比特币从 Coinbase 钱包转移到你自己管理的钱包中,就可以确保第三方公司带来的风险为零。
注意
请务必阅读第三章以了解个人钱包和安全的比特币存储方式。
过去,由比特币中介和比特币交易所管理的钱包中的比特币曾经丢失。如今,由于金融比特币生态系统的成熟,这种情况发生的风险大大降低。然而,始终明智的做法是仅将比特币存放在这些网站上最短的时间。比特币让你极其容易管理自己的资金。利用这一能力,不要把你的资金管理交给交易所中介。
比特币 ATM:终极比特币中介?
如前所述,目前购买比特币的一个烦恼是,由于传统金融工具(如信用卡和银行电汇)是可逆的,购买比特币可能有点繁琐。但最显而易见的不可逆金融工具就是万能的美元纸币。如果有人递给你一张美元纸币,那个人就无法撤销这笔交易(除非被控以身体攻击罪)。
因此,一台类似 ATM 的比特币购买设备将使得通过纸币直接购买比特币变得极为便捷。这种机器能够让你非常快速地购买比特币,因为涉及的两种货币都是不可逆的。与 Coinbase 相似的手续费 ATM 的便利性,可能使它成为终极的比特币中介。事实上,已经建立了一些比特币 ATM,并且它们证明非常受欢迎。第一个是在加拿大温哥华的一家咖啡馆设立的。
然而,无法知道这种 ATM 是否会普及,或者是否会在美国完全合法。原因在于,美元纸币和比特币不仅仅有不可逆的特点,它们还允许一定程度的匿名性。正因为如此,比特币 ATM 间接成为了一种非常有效的工具,用于洗钱和其他非法目的的资金匿名化。不幸的是,许多国家会毫不犹豫地禁止任何可能帮助犯罪的事物,即使它对守法公民有极大的好处。因此,难以预测比特币 ATM 在未来会有多普及。
高效购买比特币的方法

购买比特币最有效的方式是直接从货币兑换平台购买。这比使用中介稍微需要更多的时间,并且学习曲线更陡峭,但它是一种相对更安全且更具成本效益的购买大量比特币的方式。
注意
使用比特币交易所类似于使用证券经纪账户(如 E-Trade 或 Ameritrade)。如果你曾进行过任何在线股票交易,本节中的大部分内容应该是熟悉的。
在一个货币兑换平台上,你可以存入一种货币并提出按你选择的汇率将其兑换为另一种货币。例如,你可以提出将 1 美元兑换为 100 比特币,但你可能很难找到愿意接受的人。其他已经拥有比特币的用户可能同样慷慨,提出将他们的比特币兑换为 1 亿美元。双方都不太可能达成交易。然而,通过提高你的出价,以及其他用户降低他们的要价,最终你们会在中间达成共识并进行交易。在流行的交易所中,在任何时刻,都有成千上万的出价和要价提交,提供不同的汇率。但是,官方汇率通常是在最高出价和最低要价之间的一个数字。
注意
参与者越多,买卖报价之间的差距通常越小。但理论上,最高出价可能是$200/BTC,而最低卖价是$300/BTC,这种情况下很难确定实际汇率。
有许多比特币货币交易所可供选择,那么你应该注册哪个呢?这些交易所通过对每笔交易收取少量手续费(通常少于 0.5%)来赚钱,因此,基于费用结构来选择交易所是一种可能的选择。然而,比费用结构更重要的是安全性、合规性和交易量。许多比特币交易所已经成功运营多年,但也有一些交易所曾被黑客攻击(即被盗)或因未遵守金融监管而被政府当局迫使关闭。选择交易所时,交易量也是一个重要因素。交易量越大,你买卖比特币时能得到的价格就越公平,而且你每天能买卖的比特币数量也更多。如果一个小型交易所每天平均只交易 10 个比特币,而你又想买 100 个比特币,那么它就无法迅速满足你的买单。大交易量还表明该交易所的信任度和安全性。
在选择交易所时需要考虑的三个因素中,只有交易量信息容易找到。表 4-2 列出了交易量相对较高的交易所。在没有关于交易所的安全措施和合规性信息的情况下,建议初学者只与已经运营多年的交易所进行交易。原因是,任何关于安全性或合规性的问题应该早已解决,否则该交易所就不可能存在。这个说法可能对新兴交易所不公平,因为它们可能在安全性上甚至比老牌交易所做得更好。但在涉及金钱的问题时,谨慎是可以理解的。
表 4-2: 交易量合理的比特币交易所
| 交易所名称 | 提供的货币对 | 所在地 | 成立年份 |
|---|
| ANXBTC | AUD/BTC, CAD/BTC, CHF/BTC, EUR/BTC,
GBP/BTC, HKD/BTC,
JPY/BTC, NZD/BTC,
SGD/BTC, USD/BTC | 中国香港 | 2011 |
| Bitstamp | USD/BTC | 斯洛文尼亚的银行,英国总部 | 2012 |
|---|---|---|---|
| BTC China | CNY/BTC | 中国 | 2011 |
| BTC-E | EUR/BTC, RUR/BTC, USD/BTC | 乌克兰* | 2010 |
| CampBX | USD/BTC | 美国乔治亚州亚特兰大 | 2011 |
| Cavirtex | CAD/BTC | 加拿大 | 2011 |
| Kraken | EUR/BTC | 美国加利福尼亚州旧金山 | 2012 |
BTC-E 所在的国家不完全明确,因为该公司保持一定的匿名性。如果你心里在想,“如果我连这个公司所在的国家都不知道,我为什么要把钱交给它?”那么我们认为你问了一个非常合理的问题。
您所在的国家和您希望兑换比特币的货币也是选择交易所时需要考虑的因素。有些交易所仅支持美元兑换比特币,而其他交易所则提供多种货币对。
您可能会注意到,一些比特币货币兑换平台提供您未听说过的货币对——例如 LTC、FTC、TRC、PPC、XPM 等。这些其他数字货币——被称为替代币或山寨币——是在比特币之后创建的,并且大多受到比特币的启发。欲了解更多关于这些数字货币的信息,请查阅第 181 页的《山寨币的奇异世界》。
许多交易所还提供不同的比特币/美元汇率!这意味着您可以在一个交易所以更高的价格出售比特币,而在另一个交易所以较低的价格购买它们。那么这是不是免费赚钱呢?答案是有条件的。 如果价格差异很大,并且您是第一个注意到它的人,那么您确实有机会赚到一些“免费钱”。然而,您需要记住的是,从交易所中进出非比特币资金需要的工作量;您的时间和精力并非没有代价。但更有可能的是,其他人已经在您之前发现了这个差异,并抓住了这个免费赚钱的机会,这被称为利用套利。如果交易所之间仍然存在价格差异,那么这反映了交易费用、转账费用(以及本书未涉及的其他因素)等成本。如果某个比特币汇率与其他交易所有很大的差距,这可能表明存在潜在问题,可能需要避免使用该交易所。
此外,重要的是要记住,货币兑换平台并不是银行。无论是法定货币还是比特币,都不应将大量资金存放在您的交易所账户中。购买比特币后,应该将其转移到您的个人比特币钱包中保管。
从货币兑换平台购买比特币
目前,在比特币货币兑换平台中,没有明确的领先者。因此,以下步骤是您可以在任何比特币交易所上应用的一般步骤。
步骤 1:设置账户并与您的银行账户连接
在交易所购买比特币的第一步与您在 Coinbase 上使用的步骤相同:访问交易所网站,创建一个账户,然后将其连接到您的银行账户。有些交易所无法直接与您的银行账户连接,而是要求您通过银行电汇或其他方式转账。
步骤 2:将美元转入您的交易所账户
比特币交易所与兑换中介不同,它们不会直接从您的银行账户转移美元等值资金。在这些平台上,您首先需要将美元转入交易所账户,然后才能将其转换为比特币。
步骤 3:下单购买比特币
一旦你向交易所账户充值了比特币,你就可以通过下单参与交易市场。通常,交易平台会让你选择两种订单类型:市场订单和限价订单。让我们来探讨每种订单类型的特点,以帮助你决定哪种更适合你。
市场订单
通过下达市场订单,你指定了希望立即以当前最佳价格购买比特币。市场订单的优势在于它们能够迅速执行,因此你不需要等待比特币的到来。如果你有理由相信价格很快会上涨,迅速关闭订单是非常有价值的。
然而,市场订单也有几个重要的缺点。首先,因为你指定了愿意接受任何价格来快速获取比特币,所以总是存在一个小概率的情况,可能会出现比特币价格的短暂激增,迫使你支付比预期高得多的价格。
其次,如果某种商品(事实上,任何商品)交易量较低,通常会有较大的价差,即当前最佳买入价与最佳卖出价之间的较大差距。交易者通常通过计算买入价和卖出价的平均值来猜测某个商品的公平价值。如果商品的价差很大,你在市场买入时支付的价格会明显高于理论上的真实价格。因此,你应该仅在交易量较大的商品上使用市场订单,这些商品通常会有较小的价差。大多数情况下,比特币在大型交易所的交易量相对较高。所以,你可能会愿意支付这一小部分溢价,以换取即时获得比特币。
另一个关于市场订单的较为模糊的风险是,如果其他人在你订单之前得知你的订单,即使只是提前几毫秒,他们也能操控你的订单。外部人员、交易所内部人员,甚至知晓你订单的公司本身,可能会在你的订单处理前购买一些币,然后以稍微抬高的价格转售给你。
注意
你肯定听说过最近华尔街高频交易的一些戏法,其中有些涉及到类似的市场订单技巧。
限价订单
要通过限价订单购买比特币,你需要指定每个比特币的价格上限(不超过X美元),并且愿意等待直到该价格可用。通常,你会设置一个低于当前市场价格的目标价格,然后等待比特币价格跌至你的目标价位。限价订单的风险在于,如果比特币的价格在你下单后不断上涨,你的订单将永远无法执行。然而,通常比特币市场会出现足够的小幅波动,大多数限价接近最近交易价格的订单最终会成功执行。
尽管获取比特币所需的时间较长,并且你的订单可能永远不会被执行,但限价单相比市价单有更多的优势。因此,如果你能耐心等待获取比特币,最好始终使用限价单。
使用限价单的一个优势是,你不会因购买价格意外过高而感到惊讶,因为你是决定价格上限的人。另一个优势是,即使交易所的交易量较低(且价差较大),你也能获得一个不错的价格。还有一个优势是,其他方很难操控限价单。
最后一个优势是,限价单被交易所的运营商视为做市单。本质上,这意味着限价单通过提出一个新的价格来缩小商品的价差,而市价单则通过取消价格来扩大价差。虽然大多数比特币交易所对市价单和限价单收取相同的费用,但在其他金融市场中,限价单通常会因为它们给交易所运营商带来的好处而享有折扣。因此,未来比特币交易所很可能会为限价单提供特别折扣。
以有趣且富有未来感的方式购买比特币

如前所述,购买比特币的有趣且富有未来感的方式是人与人之间交易。今天,在线上很容易找到居住在你附近的其他比特币爱好者,并与他们见面,用现金购买比特币。与其他有共同兴趣的人见面可能会很有趣。当然,当你与陌生人进行金融交易时,总会有一定的风险,因此人与人之间的交易并不适合所有人。但目前我们正在看到许多领域的人与人交易正经历着重大的复兴。
最近创办的一些企业——比如 Airbnb(一项帮助人们私下出租房间的服务)、RelayRides(一项让你出租自己汽车的服务)和 Moxie Jean(一家二手儿童服装销售网站)——证明了在我们现代社会中,大多数人其实是相当值得信赖的。此外,如果有一个良好的在线评分系统来减少欺诈行为,你就可以相对安全地与陌生人进行金融交易。
这些事实强调了比特币革命的核心教训之一:技术可以帮助社会变得更加去中心化,减少对传统的自上而下公司和政府在执行许多有用任务方面的依赖。因此,人与人之间的比特币交易很可能是未来的趋势,未来这种方式可能比其他任何购买比特币的方法更快速、更安全、更具成本效益。
第一步:找到购买对象
当你寻找比特币卖家时,第一步可能是简单地问问你的朋友和家人是否愿意和你交换比特币。也许你的叔叔、侄女或表亲的好朋友拥有大量比特币。此外,通过搜索当地的比特币列表,比如 LocalBitcoins.com 上维护的列表,你可以找到愿意见面交换比特币的人。其他受欢迎的本地列表网站,如 Craigslist,有时也会列出愿意交换比特币与美元的人。
在和陌生人交易时,最好先了解他们是否曾经成功进行过比特币交易。LocalBitcoins.com 也有一个评分系统,可以帮助你了解这些信息。如果卖家的信息不可用,第一次交易时只购买少量比特币。
步骤 2:决定见面地点
任何公共场所都可以进行比特币交易;最受欢迎的选择通常是咖啡店。记住,你会携带现金,因此如果你开车的话,要确保将车停在公共区域。
如果你进行的是大额交易并希望获得更多安全保障,可能会有一些额外的选择可供你考虑。有些银行非常乐意为商业交易提供会议室,所以务必询问一下。(他们可能会收取这项服务费用。)
注意
对于非常大额的比特币交易,你不能依赖非正式的流程。相反,你应该明智地聘请法律代表,拟定一份正式合同,描述交易内容,并在律师事务所的办公室内进行交易。
步骤 3:交付资金并获得比特币
你现在在咖啡店里,与卖家面对面。接下来会发生什么?这取决于你是否希望在交易中使用比特币托管服务。我们稍后会解释托管服务是如何工作的,但假设你这次交易不使用托管服务(大多数点对点交易都不使用托管服务)。
面对面比特币购买,不使用托管服务
按惯例,发布在线广告的人先收款。由于大多数比特币广告是为了出售比特币,因此你(作为买家)需要先将装有美元(或其他法定货币)的信封交给卖家。(通常,发布广告的人在 LocalBitcoins.com 上有着较长的交易历史,因此他们先收到款项是公平的。)
比特币卖家应该将约定数量的比特币发送到你比特币钱包中的公共比特币地址。务必要求卖家在交易中包含合理的交易费用(目前,0.0001btc 是合理的费用)。几秒钟内,你应该会收到智能手机或笔记本电脑(已连接互联网)的通知,告知款项已发送到你的钱包。
对于小额交易,你现在可以认为交易已完成!然而,对于较大交易,请要求卖家等待区块链中的额外确认。第一次交易确认应大约在 10 分钟内到达,并可靠地保证资金已经正确转账。然而,对于非常大的交易,你可能想要等待最多六个确认,以确保安全。
注意
一些电脑上的钱包应用默认可能不会显示确认数量。在这种情况下,尝试将鼠标悬停在相关交易上。很可能会弹出一个提示,给你提供这些信息。
面对面交易中的问题
大多数交易是直接且成功的,特别是当卖家有着稳定的合法交易历史时。然而,在极少数情况下出现问题时,通常会出现两种类型的复杂情况。
有人正在你去咖啡店的路上抢劫你:这是当卖家故意安排一个会面,实际上是为了方便抢劫。为了避免这种情况,如果卖家要求过多关于你外貌或驾驶的汽车类型的细节,要保持警惕。这些问题应该引起警觉。
另一个危险的场景如下:
• 你:“好的,这是我$500 的信封。”
• 欺诈卖家:“好的,我刚刚把比特币发送到你的地址了。我们完成了!”
• 你:“等一下,我没有收到钱到账的通知。”
• 欺诈卖家:“我已经正确发送了。你是个新手,不知道自己在做什么。现在你得等一个小时,钱才会到账,因为 blah blah blah。我不能在这里等你一整天;这是你搞砸了,得走了。”(欺诈卖家随后试图急匆匆地拿着你的信封离开。)
再次强调,这种情况很少发生,而且显然属于直接盗窃。你可以通过只与有良好声誉的卖家交易来避免这种情况。你也可以通过依赖比特币托管服务来避免这种情况,下面将进一步讨论。
面对面比特币购买与托管
比特币的一个好处是,比特币区块链内置了一个脚本语言,允许你使用一些其他货币无法实现的便捷和安全的技术。其中一个技术是多重签名交易,它在与他人进行比特币交易时提供额外的安全性。多重签名交易需要多个人同意支付才能完成。用金融术语来说,这让你能够设置比特币托管服务。托管服务是一个第三方,负责保管一笔钱,确保交易顺利完成后才释放资金。然而,多重签名交易比传统的托管服务更为优雅。从理论上讲,传统的托管服务可能会挪用资金,但多重签名交易则不可能。因为第三方并不真正拥有资金的完全控制权——它只是一个裁定者,只能做出是否买卖双方有权获得资金的二元决定。而且,由于多重签名交易已经嵌入到比特币系统中,因此使用它们非常便宜,甚至可以说是免费的。
注意
尽管从技术上讲,多重签名交易与托管服务是稍微不同的概念,但在接下来的讨论中,我们仍将使用托管服务这一术语。
当前,设置比特币托管服务最流行的方法是使用 Bitrated(bitrated.com/),目前是免费的(虽然你需要选择一个独立的裁定者,其中一些裁定者会收取费用)。
此外,要注意的是,LocalBitcoins.com 也提供类似的托管服务,尽管它没有使用比特币的多重签名功能。因此,你需要信任 LocalBitcoins.com 网站来保管你的资金。此外,它比使用 Bitrated 更贵。
注意
从技术上讲,也可以在没有裁定者的情况下设置一个类似的托管系统。与要求裁定者站在买方或卖方一方处理交易不同,买方和卖方可以承诺进行多重签名交易,双方必须达成一致。然而,如果在相关方之间发生争议,资金就会陷入死胡同。使用该系统的好处是节省了费用,并避免了与裁定者打交道的复杂性。但这种托管方式由于死胡同问题,使用的人较少。
因为大多数人与人之间的交易是没有使用比特币托管服务完成的,所以如果你打算使用这个服务,你需要确保卖方同意。并不是每个人都熟悉这个概念。如果你和卖方同意使用该服务,你的面对面交易应该按以下步骤进行:
1. 比特币卖方将比特币发送到托管服务。
2. 作为买方,你需要验证比特币是否如承诺那样存入托管账户。
3. 你把装满美元(或其他法定货币)的信封交给卖家。
4. 卖家签署托管协议,你就能收到比特币。
因此,在任何时候,卖家都不能在没有发送比特币的情况下私吞你的美元。
中本聪广场
如果与陌生人一对一会面让你感到不舒服,你可能会对参加中本聪广场活动感兴趣。纽约、旧金山、波士顿、多伦多和温哥华等几个主要城市曾经定期举行现场比特币交易,在这些活动中,许多人会在公共场所聚集,买卖比特币。这些聚会也被称为按钮木交易,这个名字来源于 18 世纪最初的华尔街交易员们据说在一个按钮木树下交易的故事。
仍然找不到适合你的购买选项吗?
如果本章讨论的所有选项都不满足你获取比特币的需求,你还有另一种获取比特币的替代方式,可能比其他任何方式都更好:把东西卖给比特币爱好者,换取比特币!死忠的比特币爱好者梦想着有一天他们能够放弃所有的法定货币。我们可以想象,有一天,你将不再需要用其他货币去购买比特币,因为比特币将成为货币。

















正如你所看到的,中本聪能够使用他自己的私钥签署一条消息,从而证明他(中本聪)拥有某个比特币地址。要理解这是如何可能的,你需要了解数学家们很久以前发现的一个奇特的不对称性:
1. 判断一个大数字是否有因数(即它不是质数)非常容易。
2. 了解这些因素是什么可能非常非常困难。
现在,大多数普通人会认为这两个问题同样难以解决:毕竟,似乎没有办法在没有实际找到因数的情况下知道是否存在因数。但是事实证明,数学家们发明了一些奇特的算法,能够在不需要解决第二个问题的情况下解决第一个问题(其中一个流行的算法叫做米勒-拉宾质数测试)。
那么,为什么这个小小的不对称性如此重要呢?实际上,几乎每一项你能想到的现代技术,都是某个聪明的人发现了一个看似微不足道的不对称性后发明的:
• 抗生素利用细菌与动物细胞代谢之间的微小不对称性。

• 蒸汽机利用蒸汽和水与空气混合之间的小压力差来运作。

• 计算机芯片的工作原理是基于硅的两种不纯变体之间的微小差异,分别被称为 p 型和 n 型硅。

哎,宇宙学家告诉我们,我们的银河系之所以能够存在,完全是因为大爆炸中物质和反物质的微小不对称性,导致了物质的盈余,进而创造了我们所看到的所有事物!
无论如何,1970 年代,一些聪明的家伙注意到这种数字因式分解中的不对称性,并发现如果他们将两个大质数相乘(因为根据#1,质数很容易找到),那么几乎不可能推算出原始的两个数字是什么(因为#2)!
现代大多数加密技术都是基于这个小事实:事实证明,使用这样的质数,你可以创建一个私钥/公钥的加密密钥对(我们将在第七章中详细讨论这种加密技术),这正是比特币的私钥和公钥地址所代表的!
这为什么重要?好吧,事实证明,如果你拥有一对这样的密钥,你可以用它们做一些几乎是魔法般的任务:
1. 如果一个人有公钥,他们可以创建一条只有私钥的拥有者才能读取的消息。(这被称为公钥加密。)
2. 如果一个人拥有私钥,他们可以创建一条无法伪造的消息,因为任何人都可以使用公钥来验证这条消息的真实性。(这被称为数字签名。)
在我们的例子中,中本聪用他的私钥签署了一条消息,承诺将 1 个比特币赠送给 Crowley。
如你所见,这就是中本聪的公钥:
17QGqFshx9NfXh5TrfMkn1m34bWr2hL1AY
这是承诺将比特币转账给 Crowley 的比特币地址的消息:
I, Satoshi, hereby send 1 bitcoin to Crowley’s Bitcoin account at address
1LdZhahiV6vmypkRHFZCeLvAoSgPxe7RPj.
这是通过我们刚才讨论的复杂加密技术创建的签名:
HoiD8JtaV271iZGDP1znkUFxzZRvVXdFFHthGaTg50Or
EpFvy8OW3kqOwHyiUmbOVNiZSeieL8ZyhmXl2/GBR0E=
在这一点上,你应该问一个非常重要的问题:我们能否真正证明这是一条有效的签名信息?当然,答案是可以的,我们可以非常容易地做到!只需按照以下步骤操作:
1. 访问brainwallet.org/#verify(或类似的其他网站)。
2. 输入消息和签名。
3. 点击验证消息。
4. 你现在可以看到,这条信息是由比特币地址17QGqFshx9NfXh5TrfMkn1m34bWr2hL1AY的拥有者——中本聪签名的!

















第六章:6
比特币为何如此重要
毫无疑问,比特币是一项新颖的技术,且无疑,全球无国界的货币这一想法具有大胆的创新性。然而,许多人怀疑比特币能否在世界经济中产生持久的影响。事实上,你可能会问:比特币是改变世界的技术,还是仅仅是一个技术噱头?在本章中,我们将讨论这个问题的两种观点。因为回顾过去通常是理解未来的第一步,让我们从简要探讨比特币和数字货币的历史开始。
传统货币的根本问题在于,它的运作依赖于巨大的信任。人们必须信任中央银行不会贬值货币,但法定货币的历史充满了对这一信任的背离。我们必须信任银行能够保管我们的钱并进行电子转账,但银行却将这些资金以信用泡沫的形式放贷,而储备金几乎微不足道。我们还必须信任银行保护我们的隐私,信任它们不会让身份盗窃者窃取我们的账户。
—中本聪,关于比特币在 P2Pfoundation 论坛上的首次发帖,2009 年 2 月 11 日
我认为,互联网将成为减少政府作用的主要力量之一。唯一缺失的,但很快会被开发出来的,是一种可靠的电子现金。一种可以在互联网上实现 A 到 B 的资金转移的方法,而 A 和 B 彼此互不相识。
—米尔顿·弗里德曼,美国经济学家和诺贝尔奖获得者,1999 年由国家纳税人联盟基金会进行的采访
你开玩笑吧?!未来,当人们回顾比特币的早期历史时,他们会说:“能够将资金几乎零成本、即时地转移到任何地方,这么显而易见的成功,怎么可能不成为巨大的成功呢?”比特币对货币的意义,就如同互联网对通讯的意义。
—亚当·德雷珀,Boost 公司创始人兼首席执行官,Curt Hopkins 的《风险投资家对“比特币革命”进行尝试》,The Daily Dot,2013 年 3 月 19 日
远离它。比特币是海市蜃楼。它只是一种传输资金的方法。[...] 支票也是一种传输资金的方式。支票仅仅因为它能够传输资金就值很多钱吗?汇票呢?[...] 在我看来,认为它具有某种巨大的内在价值的观点简直是个笑话。
—沃伦·巴菲特,伯克希尔·哈撒韦公司董事长兼首席执行官,CNBC《Squawk Box》,2014 年 3 月 14 日
数字货币简史
互联网的诞生使许多人,包括经济学家米尔顿·弗里德曼,认为某种形式的数字货币的发明会很快随之而来。支持数字货币的论点众多。早期显现的一个明显好处是,它或许能够帮助防止伪造:
高质量的彩色复印机的出现威胁到了纸币的安全。保护纸币的需求使得纸币成本高昂。处理纸币的麻烦(如自动售货机)使得纸币不太受欢迎。信用卡和 ATM 卡的使用越来越普及,但这些系统缺乏足够的隐私保护或防止欺诈的安全性,这也导致了对高效电子货币系统的需求,以防止欺诈并保护用户隐私。
—Jörg Kienzle 和 Adrian Perrig 在《数字货币:神赐的礼物还是撒旦的恶意工具?》(1996)中^(1)
然而,创建一个安全的数字货币系统必须克服许多可能并不显而易见的障碍。例如,任何以数字形式存储的东西都可以被无限复制和重复,那么如何防止用户复制他们的钱呢?此外,货币必须以一种安全的形式存储,不能轻易被盗或篡改,同时还要能够在硬件故障时进行备份。
最初,这些障碍以及其他障碍是由像 David Chaum 这样的人来解决的,他是数字货币的早期先驱之一。Chaum 在加利福尼亚大学伯克利分校攻读博士学位时研究了密码学问题,并特别感兴趣如何让人们能够以数字和匿名的方式转移资金。他随后在 1992 年创建了 DigiCash,一家旨在建立一个数字匿名现金系统(称为电子现金)的公司。该系统使用了一种叫做“盲签名”的概念,以保证用户的匿名性,但仍然需要一个中央公司或银行来确保每一单位电子现金不会被重复使用。Chaum 并不是唯一的数字货币公司。到 1990 年代中期,几家私人公司正在开发电子现金系统,主要希望促进当时刚刚兴起的互联网中的在线购物。除了 DigiCash,还有包括 First Virtual Holdings、Cybercash,甚至微软的一个部门在内的其他公司也在大力投资开发数字货币解决方案。当时,通过互联网使用信用卡进行支付仍然很少见,这些努力被视为推动电子商务发展的关键。
但几乎所有创建数字货币的尝试都有相同的致命弱点:需要一个值得信赖的中介来追踪每个人的交易。不幸的是,像 DigiCash 这样的许多公司在获得消费者和银行(它们也需要合作)的信任方面遇到了很大困难。这种不信任是可以理解的:如果一个运营数字货币系统的公司因为灾难性事件而倒闭,货币单位的价值可能一夜之间消失。
显然,整个货币体系如果只有一个脆弱的单点故障,是非常危险的。即使是对这种单点故障的认知也可能毁掉它作为一种有意义的货币的前景。在 1990 年代,数字货币公司的生存威胁在于政府机构可能迫使它们关闭。数字货币是如此新的发明,以至于对它们的监管尚未完善或存在模糊之处。因此,数字货币公司对政府会或不会接受什么也并不清楚。
DigiCash 在尝试满足各种国家的监管要求时面临了许多障碍。特别是,监管机构不允许电子现金保持匿名特性;必须建立机制,以便执法机构能够追踪资金的流动,防止洗钱,这削弱了电子现金的主要优势之一。这些障碍,加上 adoption 缓慢,迫使 DigiCash 在 1998 年宣布破产。其他公司则面临更糟糕的命运。Gold & Silver Reserve Inc.,它运营着一种名为 e-gold 的黄金支持数字货币,也被关闭。其所有者因违反洗钱法规而被美国司法部起诉。
最终,由于监管负担和消费者对数字货币需求的缺乏,许多公司放弃了这一概念。到了 1990 年代末,维萨和万事达卡已经解决了安全在线信用卡支付的技术细节。凭借其已占据的庞大市场份额,信用卡成为消费者进行在线购物的首选方式。因此,许多单独数字货币的假设性好处从未得以实现。
在 DigiCash 倒闭后的十年里,似乎可以清楚地看出,由于需要一个可信的中央方,而该方本身容易失败(无论是由于财务问题还是法律问题),纯数字货币的理念是不可行的。
比特币的黎明
2008 年,终于发布了一种不依赖于集中式第三方脆弱依赖的实用数字货币设计:中本聪发布了比特币的白皮书。
区别比特币与其前身的关键因素在于,比特币不是一家公司(或公司产品),而仅仅是一套规则,一种协议,规定了数字交易如何在计算机网络中处理。任何人都可以阅读这些规则并遵循它们,但没有个人能够“拥有”或改变它们。^(2) 因为比特币没有中央故障点,它不需要政府的许可来存在:没有比特币公司可以关闭,也没有中央组织者可以被监禁。从本质上讲,比特币协议只是巧妙地利用数学将价值在人们之间传递。
在 1990 年代,许多数字现金公司与政府展开了一场法律博弈,试图通过采取措施为其产品开辟合法的市场空间,同时避免触犯反洗钱法。然而,毫无例外地,他们都在这场博弈中失败了。无论好坏,比特币通过简单地颠覆棋盘解决了这个问题:在一个没有中央仲裁者的系统中,不可能将某个人指控为洗钱者。
此外,在比特币的系统中,没有任何单一方能够随意决定关闭系统。只要世界上仍然有一个人继续运行比特币挖矿软件,整个系统就会继续运行。这标志着与过去的数字货币的明确分离,因此,当第一个比特币客户端在 2009 年发布时,围绕这项技术的热议就开始逐渐升温。
鉴于过去数字货币提供商面临的洗钱指控,或许并不令人惊讶中本聪决定保持匿名。尽管根据设计他并不控制比特币网络的运行,但始终存在着有人可能(错误地)指控他“运营比特币”的风险。巧妙地,他通过拒绝透露自己的身份来避免了这一风险。
比特币的前四年
2008 年 10 月,以中本聪(Satoshi Nakamoto)为笔名发布在加密学邮件列表上的论文《比特币:一种点对点的电子现金系统》是比特币首次公开提及。这篇八页的文档概述了比特币的基本设计,但并未深入探讨任何实施细节。在随后的在线讨论中,中本聪声称他自 2007 年起就开始研究比特币的设计。论文发布后不久,中本聪发布了一个实现这一构思的程序版本,命名为 Bitcoin-Qt 0.1,并邀请其他人下载并试着运行它。区块链中的第一个区块,通常称为创世区块,由中本聪在 2009 年 1 月 3 日添加。当他将区块添加到区块链时,他插入了一条短消息,所有矿工都可以这样做。在创世区块中,中本聪写道:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks。” 这是 2009 年 1 月 3 日英国《泰晤士报》头版的标题。通过在创世区块中加入这条信息,中本聪证明他不可能在该日期之前将其添加到区块链中。有些人认为,信息的选择也揭示了中本聪创办比特币的动机。
因为代码是开源的,任何人都可以下载、查看或修改它。不久,一小批志愿者加入了中本聪的团队,贡献新功能并修复漏洞(不过,基本设计没有改变)。许多密码学家和程序员开始参与比特币的开发,包括像 Hal Finney 这样的著名计算机科学家,他们长期以来一直是数字货币研究的贡献者(以及其他领域)。^(4) 虽然中本聪通过论坛帖子和邮件与早期的比特币用户和开发者频繁沟通,但他从未透露过自己的个人信息。主要贡献者之一的 Gavin Andresen 随着时间的推移赢得了中本聪的信任,逐渐接管了比特币项目的非正式首席开发者角色。2010 年 12 月 12 日,中本聪发布了关于比特币软件最新版本(现为 v0.3.19)更新的评论。
对于 DoS(拒绝服务攻击)还有很多工作要做,但我正在快速构建我目前所拥有的内容,以防万一需要使用,然后再深入研究更复杂的想法。
此后再也没有他的消息了。^(5) 到今天为止,没人知道中本聪的真实身份,尽管无数人发布了关于他可能是谁的理论,通常指向一些著名的密码学家或天才的隐士数学家。毫不奇怪,所有被认为是比特币发明者的人都否认了这一点。
在比特币的第一年,任何人都可以通过在普通笔记本电脑上挖矿,生成几百个比特币。那时,然而,没人看出比特币有任何价值。即使是一些早期的热衷者,他们认为比特币是一个重要的知识成就,也不相信他们挖到的比特币值得保留。许多人在玩完软件后删除了他们的钱包。从 2009 年到 2010 年初,说比特币的“价格”并没有什么意义。因为没有人拿有价值的东西与比特币交换过(至少没有公开交换),所以比特币仅仅是一个数学上的花招。
但在 2010 年初,小规模的货币兑换平台开始出现,比特币的交易价格也低于每个一美分。一个重要的时刻发生在 2010 年 5 月 18 日,当时一个论坛用户 laszlo 提出,如果有人为他订购两张大号披萨,他将送出 10,000 个比特币(见图 6-1)。这被认为是首次记录的以比特币交换商品的事件。当时,许多人认为 laszlo 是在做一个吃亏的交易。但当比特币在 2011 年 2 月 9 日与美元达到了等值时,这个笑话却反过来嘲笑了 laszlo;他用价值 10,000 美元的比特币买了些披萨。
比特币的价值持续增长,在 2013 年 4 月 3 日,一辆在德克萨斯州的保时捷以大约每个比特币 130 美元的价格,以 300 个比特币出售。不到一年后,另一辆价值超过 20 万美元的运动跑车——2014 款兰博基尼 Gallardo,以 216 个比特币购买,相当于每个比特币约 925 美元(图 6-1)。
到 2013 年底,超过一亿美元的商品已经进行交换。成千上万的小商户以及十几个主要零售商和在线商家已经开始接受比特币作为支付手段。那一年的比特币汇率曾达到每个 BTC 1,000 美元,这比 2010 年中购买披萨时的价格上涨了 500,000 倍。主要的比特币交易所的交易量达到了每月 5 亿美元。
尽管这些比特币的应用数据本身令人瞩目,但比特币也以一些更难量化的方式影响了整个世界。接下来,让我们探索比特币所产生的影响。

图 6-1:2010 年 5 月,Laszlo 用 10,000 个比特币购买披萨(左图),以及 2013 年 12 月用 216 个比特币购买的 2014 款兰博基尼 Gallardo(右图)
比特币的早期影响
尽管比特币仍然是一项非常新的技术,但我们已经可以指出几个显著的成就,不仅在计算机科学领域,而且在经济学和政治学领域也有所突破。
这是历史上最大的分布式计算项目
在诞生不到三年后,比特币的计算能力已经超过了著名的分布式计算项目,如 SETI@home(6)。两年后,这一计算能力又增长了千倍。到 2014 年 4 月,如果将世界上前 500 名超级计算机的计算能力汇总,结果将是一个比比特币网络还要弱 0.05%的计算机。这种令人难以置信的增长,特别是在近年来,得益于专门为比特币挖矿设计的大规模定制计算机芯片的生产。除了计算能力的巨大提升外,生产数十万单用途比特币挖矿计算机芯片的工厂的存在也令人瞩目。(我们将在本章稍后讨论比特币挖矿可能带来的负面环境影响。)
这是一个庞大的经济实验,已经取得了令人惊讶的成果
在 2009 年之前,大多数人会合理地认为,任何人都可以通过免费的软件生成计算机代币,这些代币永远不会具有任何有意义的价值。然而,这一假设证明是极其错误的。比特币的价值在连续五年中每年增长 1000%(从 2009 年不到一分钱,到 2013 年底超过 1000 美元)。五年之内,流通中的所有比特币总值超过了 100 多个国家法定货币的货币供应量^(7)。与基于信用卡的支付系统相比,比特币的低费用和更高的安全性使得商家有充分理由接受它。到 2014 年 9 月,至少有 40,000 家在线零售商接受比特币^(8),同时超过 5,400 家实体店也接受比特币^(9)。
尽管比特币作为经济工具的长期可行性仍然存在疑问,但它已经获得的价值挑战了许多人对货币本质的认知。毫不奇怪,经济学家们开始关注比特币,并且相关的经济学研究文章不断发表。到 2014 年 9 月,关于比特币经济学的学术文章已经超过 2100 篇^(10)。
它促使政府就数字货币的作用展开了严肃讨论
尽管在比特币出现之前,一些公司曾尝试向其客户发行数字货币(有时甚至是仅存在于电脑游戏中的货币),但这些行为并未引起政府或大型金融机构的关注,除了某些执法行动之外。另一方面,比特币引发了政治家、监管者和银行家之间的激烈辩论。美国国会举行了几次专门讨论这一话题的听证会。世界上几十个国家的中央银行都发布了关于比特币的声明或报告,主要银行和金融机构也有类似举措。例如,在 2013 年 11 月,美国举行了关于比特币的监管与未来的国会听证会,并且广泛受到关注。
比特币使社会关注到在一个日益数字化的世界中,数字货币的潜在承诺与风险。即便比特币消失,它的诞生也已经对未来关于数字货币的立法和政策产生了影响。
比特币的未来潜力
曾被多次归因于包括尼尔斯·玻尔和约吉·贝拉等人的一句名言是:“预测非常困难,尤其是关于未来的预测。”尽管如此,在一本关于比特币的书中,如果不探讨它在未来的潜力,我们将是失职的。
首先,我们将查看比特币的生存风险——那些可能导致比特币变得一文不值的情况。其次,我们将探讨比特币在未来世界中可能扮演的两大角色,作为储值工具或作为交换媒介。第三,我们将考虑围绕比特币建立的成功未来经济的一些量化评估。
比特币面临的生存风险是什么?
为了让比特币长期存活,它必须具有相对于现有货币的优势,否则其采纳率将会停滞不前。而且,由于它是一种软件技术,比特币需要让人们相信其网络不会被计算机故障或黑客攻击摧毁。此外,如果比特币能够被外部实体(例如政府或公司)摧毁,它也无法生存。最后,如果比特币被某种更好形式的货币(可能是另一种加密货币)所取代,它也无法存活。让我们依次看看这些对比特币的生存威胁。
比特币是否比现有货币更具优势?
许多人认为比特币不过是一个潮流,潮流过后人们会意识到比特币并不比纸币有任何优势。正如保罗·克鲁格曼在谈到比特币时所言:“那么我们需要一种新的货币形式吗?...我们面临着巨大的经济问题,但绿色纸币运作得很好——我们应该让它们保持原样。”^(11)
然而,可以强有力地证明,比特币确实相对于传统货币具有显著优势。理想的货币具有某些特性,使其尽可能有用。这些特性包括便携性、可分割性、耐用性、稀缺性和可替代性。让我们依次看看每一项特性:
• 便携性: 在一个理想的世界里,货币应该是轻便的、紧凑的,并且容易运输。从这个角度来看,比特币轻松超越了纸币:比特币没有重量,可以轻松存储,即使是大量的比特币也不成问题,并且可以在几分钟内跨越全球。当然,作为全球金融体系的一部分,也有电子机制可以用来以数字形式存储和运输传统货币,从而提高这些货币的便携性。然而,就便捷性、成本和便携速度而言,目前比特币显然具有优势。
• 可分性: 每个人都知道,想付给别人少量的钱却只有大钞而没有零钱的沮丧感。比特币不存在这个问题,因为比特币可以完全分割成分的零头。由于计算机在处理数字方面非常高效,能够根据需要将比特币的金额划分成任何必要的部分以找零,毫不意外。
• 耐用性: 按照设计,每一个比特币都存储在比特币区块链中,区块链是一个存储在全球数千台计算机上的计算机文件。只要一个人没有丢失保护其资金的私钥,那么这个人的比特币就是不可摧毁的。另一方面,美国联邦储备估计美元纸币的生命周期为 5.9 年。^(12)
当然,耐用性的另一个方面是比特币的价值必须得以保持到未来。尽管比特币的未来价值不可预测,并且每天都有波动,但它的价值一般是逐年增长的。然而,人们可以肯定地说,直到比特币的用户网络大幅增长之前,比特币在保持其价值方面的耐用性还不是一个确定的事情。
• 稀缺性: 比特币的主要创新在于去中心化地为数字资产创造稀缺性,这是比特币保持任何货币价值的必要条件。因此,像纸币一样,比特币可以保持有限的供应。然而,对于纸币来说,你需要信任政府(即印刷机的拥有者)在时间的推移中维持这种稀缺性,从而防止通货膨胀。
• 可替代性: 任何一张美元纸币或任何一个比特币都必须在支付中具有相等的有效性。如果收款人总是需要担心自己收到的是“好钱”还是“坏钱”,那么货币的效用就会受到损害。正如你所知,纸币可以通过追踪纸币上的序列号或通过我们现代电子支付系统中内置的追踪机制进行物理或电子追踪。同样,比特币也可以通过在公共区块链上追踪币的流转来追溯。因此,无论是传统货币还是比特币,在可替代性方面都没有明显优势。
关于决定货币效用的某些属性,比特币在可携带性和稀缺性方面表现得相当有利。因此,不太可能因为比特币在传统货币中没有任何优势,它会单纯地失败。
比特币能通过漏洞或黑客攻击被摧毁吗?
另一个常被提出的比特币可能在某个时刻被淘汰的原因是它可能存在漏洞并可能被黑客攻击。显然,如果黑客能够凭空获取任意数量的比特币,或者找到随意转移他人钱包中比特币的方法,比特币将迅速消失在历史的尘埃中。
然而,目前这种漏洞存在的可能性不大。许多知名的安全研究人员已经研究过比特币,并对其代码的质量印象深刻。例如,著名的安全专家丹·卡明斯基在 2013 年 4 月为《商业内幕》撰写了一篇名为《我尝试黑客攻击比特币,但失败了》的文章。在文章中,他对比特币的安全模型给予了高度评价。
然而,认为比特币系统不太可能存在严重缺陷的最重要原因是基于一个经济学论点:如果有人发现了如何破解核心网络的方法,他们可能会变得异常富有。这样的人可能会在货币价值崩溃之前,从网络中提取数十亿美元。即使存在如此诱人的动机,至今没有人这样做,这一简单事实有力地反驳了比特币存在任何此类缺陷的观点。
比特币会被政府或企业摧毁吗?
在互联网的早期,我们已经习惯于通过网页客户端连接到中央服务器(由 Google、Amazon、Yahoo! 等公司运行)来浏览在线内容。这种使用互联网的模式通常被称为客户端-服务器架构。然而,自那时以来,许多基于互联网的新型应用程序开始使用点对点架构。在这种去中心化的模式中,软件应用程序会在互联网上找到其他“志同道合”的同行应用程序,并与这些同行连接以运行应用程序。早期使用这种方法的应用程序包括 BitTorrent(用于电影下载)和 Gnutella(用于音乐发现/下载)。比特币的设计中也使用了点对点网络。
点对点系统相比传统的客户端-服务器系统有许多优势,包括更强的耐久性和性能。由于这些优势,这些系统很可能会变得越来越普及。
使用点对点系统而非传统架构的一个好处是其不可摧毁性:只要点对点应用程序的用户能够找到其他同伴进行连接,网络就会继续存在,并且无需任何中央故障点就能运行。因此,无论哪个实体多么强大,政府或其他实体几乎不可能完全摧毁比特币网络。
当然,一个国家的政府可以决定宣布比特币使用非法,这种声明可能会对比特币的价值和实用性产生重大影响。然而,除非有人完全关闭互联网,否则比特币将继续存在,不管是否有此类声明。而且,由于比特币本质上是全球性的,单一国家的法律对其价值和实用性的影响是有限的。一些国家对比特币实施的严厉法律,可能只是将其使用和发展(以及相关的就业机会!)转移到其他国家。
比特币会被其他加密货币取代吗?
当谷歌凭借其卓越的搜索引擎技术突然崛起时,我们每个人都亲眼见证了这一切,留下了一长串已经废弃的、现在几乎被遗忘的搜索引擎。还有人记得 Lycos 或 Altavista 这两大搜索引擎巨头吗?是否有可能,随着某种新的、更好的加密货币的出现,比特币也会像这些搜索引擎一样,逐渐淡出人们的视野?
为比特币核心协议做出贡献的开发者们往往非常保守。没有任何开发者愿意为将一个 bug 引入一个数十亿美元的系统而承担责任,即使加入了更为激进的功能,比特币社区也不太可能接受。可以说,如果你是那些依赖于一个正常运行的比特币网络的、总计数十亿美元资产的投资者之一,那么你正想听到这样的消息。对每个人来说,在对比特币核心系统进行任何根本性变动时都极其小心是符合大家利益的。即便如此,这种保守的做法也加大了一个新兴货币崛起的风险,就像谷歌一样,可能会夺走比特币的“午餐”。
当然,我们无法知道一种新货币需要具备哪些令人惊艳的特点,才能取代比特币。然而,仍有三个主要原因让我们相信比特币可能能够在新兴货币的冲击下生存下来:网络效应、加密货币的波动性特点,以及最近发展起来的加密货币挂钩技术。
网络效应是一个简单的概念,即人们只有在其他人也愿意接受某种货币作为支付手段时,才愿意使用它。货币的用户越多,它就越有用。这为新货币的采用创造了自然的障碍(并且无疑在比特币的初期几年中,阻碍了它相对于传统货币的采用)。目前,比特币拥有最大的加密货币用户基础,因此较新的加密货币需要拥有比比特币更容易区分的优势,才能克服比特币的网络优势。但波动性如何影响这一点呢?
从经济学的角度来看,任何新进入开放市场的资产,都需要先经过价格发现过程。这也是 2000 年互联网泡沫产生的部分原因:人们根本不知道 eBay、Yahoo!和其他科技公司股票的价值,因为类似的公司过去并不存在。最终,随着人们对互联网公司越来越熟悉,如何合理地为每家公司股票定价变得更加明确。
比特币正在经历类似的价格发现过程,且仍处于初期阶段:自货币诞生以来,比特币的价格一直在剧烈波动。然而,随着越来越多的用户开始使用比特币,波动性已经有所减小(即,相对而言,价格波动变得不那么剧烈)。如果比特币的波动性持续下降,这一趋势可能为比特币在未来的加密货币中带来显著优势:因为比特币注定将是最古老的加密货币,新的货币可能无法在这场“波动性竞赛”中赶上,比特币将始终保持比新兴货币更低的波动性。
如果比特币在网络效应和波动性方面保持优势,那么新加密货币可能更倾向于采用挂钩方式,将自己与比特币网络连接,而不是试图完全替代比特币网络。最近,两个著名的加密货币开发者和企业家,Adam Back 和 Austin Hill,提出了通过加密技术使新加密货币的价值与比特币的价值一对一直接挂钩,并使用巧妙的算法让币在不同区块链之间“跳跃”的想法。如果这一理念成功实施,可能会创造出带有新技术进步的加密货币,作为比特币的侧链。侧链是具有不同规则的独立区块链,它们共享与比特币相同的币池,从而使新货币可以共享与比特币本身相同的波动性(或可能的缺乏波动性)和网络效益。
如果侧链理念(或类似的基于挂钩的理念)成功,未来的加密货币将受益于比特币的存在,甚至可能增强它,而不是取代它。因此,比特币可能永远不会完全被其他加密货币所取代。话虽如此,如果出现了一种比比特币更好的加密货币,以至于我们所有人都转向它,那也不一定是一个坏结果,对吧?
既然我们讨论了生存风险,那么接下来让我们探讨比特币的未来可能是什么样子。
比特币在未来可能扮演什么角色?
货币的两大主要用途是作为储蓄手段和支付机制。如果我们想要假设比特币未来的影响,我们需要对比和分析货币的这两种角色,并探讨货币能够承担哪种角色——因为比特币所扮演的角色在比特币经济的价值以及单个比特币的价值方面可能产生重大影响。
将比特币用于储蓄
比特币作为储蓄机制可能具有很大的潜力。原因在于它的总供应量是精确已知的。此外,如果使用得当,它也不容易被没收或盗取。你可能会想象,在未来,它可能成为储蓄财富的首选工具,而不是现金、贵金属或房地产。
在这个角色中,比特币的用途可能最类似于黄金,黄金目前是最受欢迎的去中心化储蓄媒介。如果我们能够估算出当前存储在黄金中的财富数量,这将能显示出比特币以类似方式使用的可能范围。
我们能估算出目前存储为黄金的财富有多少吗?在本书出版时,据估计,所有地面上的黄金(与尚未开采的黄金相比)的价值大约为 9 万亿美元。大约一半的黄金用于珠宝,剩余部分则以金条或金币的形式存在,这些黄金只是作为储值手段。我们保守假设,所有拥有黄金珠宝的人仅仅是为了其美丽而拥有,而非作为储蓄手段。这就剩下价值 4.5 万亿美元的黄金,纯粹作为储蓄手段。
因此,如果比特币在储存财富方面被广泛采用,比特币经济将侵占价值 4.5 万亿美元的黄金经济的市场份额。
另一种估算当前储蓄金额的方法是从全球财富总量的角度来考察。今天,一个人的平均净资产(包括所有亿万富翁与贫困人口)大约是 25,000 美元。这个数值包含了以现金和其他类型资产形式持有的财富。因此,全球目前存储在储蓄中的总财富大约是这个数值的 70 亿倍,约为 175 万亿美元。
如果比特币真的成为一种流行的价值存储手段,它将占据 175 万亿美元的一部分。即使全球财富中只有 1%的财富以比特币的形式储存,比特币经济的总价值也将处于万亿级别。由于我们知道最多只有 2100 万个比特币会流通,每个比特币的价值必须达到数十万美元,才能使比特币储存全球 1%的财富。
将比特币作为交换媒介
如果比特币成为主要的交换媒介(即支付机制),人们将仅保持足够数量的比特币以供购买使用,并将大部分储蓄存放在其他地方。目前,大多数人都是以这种方式使用传统货币的。他们用美元(或欧元、日元等)进行购买,但将大部分财富储蓄在债券、股票、共同基金或其他不因通货膨胀而贬值的资产中。
由于比特币交易费用低,支付网络不是专有的,没有不必要的身份信息暴露,而且交易安全基于现代加密技术,比特币在作为交换媒介方面可能优于国家货币。
为了估算如果比特币被广泛用于支付机制可能带来的影响,我们需要估算当前全球范围内用于支付目的的活跃流通货币总额。具体来说,我们需要回答两个关键问题:
1. 一个人需要定期支付多少费用?
2. 一定的比特币在经济中从一个人流转到另一个人后,需要多久才能再次被使用?
要回答问题 1,我们可以利用这样的事实:全球收入最高的 10 亿人中的年收入中位数大约为 $15,000。假设从这些收入中,$3,000 被用于储蓄,而此人每月花费 $1,000。
要回答问题 2,我们可以估计目前一个美元大约需要一个月才能再次被消费。换句话说,如果你今天在餐厅花 $10 买一个汉堡,我们假设这些 $10 会在大约一个月后被餐厅老板再次消费。
基于这些假设,我们可以大致估算出,每人随时需要约 $1,200 在流通中。对于 10 亿人来说,世界经济能够正常运转所需的交换媒介总额大约是 $1.2 万亿美元。
如果比特币成为广泛采用的交换媒介,那么这 $1.2 万亿美元的支付经济中将有一部分交易通过比特币执行。同样,由于比特币的数量上限为 2100 万个,我们知道,如果比特币只用于全球交易的 1%,那么每个比特币的价值将需要在几万美元到几十万美元之间。
显然,比特币在普及方面还有很长的路要走,才能达到这些惊人的数字(即使它最终能做到)。我们将始终使用多种不同的资产作为储蓄形式(例如,无论比特币如何流行,股票都永远不会消失),并且我们将使用许多不同的支付机制。话虽如此,没人能阻止比特币在某种程度上同时作为交换媒介和储蓄工具使用,而且它使用得越广泛,就越能为用户带来便利和实用性。
在本节中,我们讨论了在某些采用情景下比特币的潜在价值,但我们几乎没有任何依据来预测它将被采纳到什么程度。根据我们假设的采用水平,我们几乎可以预测比特币未来的任何价值,从几百美元到几百万美元。不合常理的是,如果我们假设几乎所有世界储蓄都存储在比特币中,那么我们甚至可以想象出现一个价值十亿美元的比特币,因为世界上的储蓄和资产数量实在是巨大!
因此,试图为比特币未来的价值进行精确估算是没有意义的。我们能做的最好的事情是指出,比特币作为一种技术具有潜力,未来可能会成为一项重要的事物——当然前提是它不会在我们已考虑的众多可能性中先行失败。
账户单位
从理论上讲,在遥远的未来,像比特币这样的货币可能会被用作商品价格的国际标准。将比特币作为记账单位无疑是一个引人入胜的想法,且这一目的通常在经济学文本中被提及,作为货币的一个重要作用,但它对未来世界经济的影响几乎可以忽略不计。原因是,单纯将比特币作为定价标准,并不会直接影响到购买或出售多少比特币或其他商品,因为你可以“用”比特币来“衡量”商品,而不需要拥有它们。
去中心化数字货币的危险
在讨论了像比特币这样的货币的许多潜在好处后,如果我们不也考察一下这种技术可能带来的潜在危险,那将是失职的。在这里,我们将考虑如果比特币被广泛采用,它可能对社会造成的伤害。即使技术本身没有问题,也可能存在一些伦理上的原因,反对使用比特币。
比特币与非法活动
由于比特币被非法产品市场(如臭名昭著的丝绸之路网站)早期且积极地采用,该网站允许客户通过邮购购买毒品和其他非法商品,因此有人认为比特币的隐私功能为犯罪分子提供了便利。这个辩论中或许有一定的事实:正如水总是流向最低点一样,犯罪分子总是会寻找能为他们提供最大匿名性和对执法部门最强保护的工具。
然而,在 2013 年,美国政府成功找到了并起诉了涉嫌创建丝绸之路的犯罪嫌疑人,并逮捕了涉嫌在该网站上出售产品的毒品贩子。丝绸之路被迅速拆除的速度似乎成为了其他试图采用丝绸之路商业模式的市场的一种强大威慑力。至少目前,只有有限的证据表明比特币能为犯罪分子提供任何实质性的法律保护。
此外,单纯从道德角度论证促进匿名的技术是可疑的,会创造危险的先例。随着公共摄像头、人脸识别技术、社交网站和 GPS 导航汽车的广泛使用,人们每年都变得越来越难以保持自己的隐私。这种隐私的侵蚀有其自身的负面影响,损害了个人自由。
因此,可以提出反论点,认为鼓励并去污名化使用如比特币等隐私增强技术,实际上可能对社会是积极的。将隐私保护工具的使用视为可以接受和正常的观点被称为默认匿名。如果你同意在许多情况下保持匿名是有正当理由的,并且认为任何这样做的人并不是在“隐瞒什么”,那么你将会欣赏比特币货币所提供的隐私保护。
也有一种更简单的论点认为,比特币仅仅是一个有用的工具,因此它对任何使用它的人都有促进作用,包括犯罪分子。显然,汽车、手机、计算机和互联网都被犯罪分子用来进行非法活动,但我们不会仅仅为了遏制犯罪活动而禁止这些技术。
比特币的能源成本
比特币的另一个伦理争议点是,矿工在挖掘比特币时消耗了大量的能源。这些能源成本非常可观,一些人认为这使得比特币变得浪费且对环境有害。
然而,这一论点并没有考虑到我们现有金融系统在安全方面所花费的巨大成本。每一辆装甲车、每一位保安、每一个银行金库都需要资源来保护传统货币,如果我们转向使用现代密码学技术来保证安全,许多这些传统的安全机制,在理论上可能不再必要。
此外,信用卡发行机构收取高额费用(在美国每笔交易费用高达 2%),其中大部分费用用于防止欺诈。如果我们广泛采用比特币,这将大大减少此类欺诈行为,因此,整个信用卡经济体的 2%的资源消耗将得到减少。
最终的结论是,比特币挖矿的能源成本是比特币货币系统的必要组成部分,它发挥着实际且有用的功能。当然,如果一个人从一开始就假设比特币没有任何用途,那么没有任何论据能说服这个人相信,为保护比特币网络而消耗的能源不是浪费。然而,在本书中,我们已经描述了比特币的许多好处,这些好处为其能源消耗提供了一些合理的依据。
股权证明:一种更节能的加密货币安全机制?
比特币挖矿使用一种叫做工作量证明(proof-of-work)的概念来确保系统安全。在这一系统中,新区块(和比特币)会根据矿工进行的哈希计算数量随机奖励给矿工。然而,一些开发者尝试构建采用另一种叫做股权证明(proof-of-stake)概念的加密货币,这种机制根据矿工持有的货币数量(或类似的度量标准,例如拥有的币数乘以币保持未花费的天数)来奖励新区块。采用这一方法的两种货币是 Peercoin^* 和 NXT。^(**)
权益证明挖矿奖励不需要像工作量证明货币(如比特币)那样大量的能源消耗。然而,是否基于权益证明的货币与基于工作量证明的货币一样安全仍不清楚。正如基于工作量证明的系统容易遭受 51%攻击一样,基于权益证明的系统也有其自身的漏洞(51%攻击在第八章中有详细描述)。虽然我们知道,基于工作量证明的系统要遭受 51%攻击需要巨大的资源投入,并且对攻击者来说经济上不具理性,但对基于权益证明的系统的攻击可能比对基于工作量证明的系统的攻击更容易。Peercoin 通过将权益证明与一些附加的工作量证明结合,来增强安全性。NXT 则通过为共识机制增加细节来决定哪些区块是有效的,可能在这个过程中牺牲一些去中心化。
最终结论是,目前加密货币专家之间尚未就权益证明的实用性达成共识。尽管如此,权益证明仍是一个有趣的概念,具有显著减少加密货币运营能源需求的吸引力。
比特币与通货紧缩的危害
对比特币的另一种常见批评是,由于比特币的总量被限定在 2100 万枚,其价值将不断上升,没人会真正愿意花费它们,这使得货币变得毫无用处(或者更糟,导致危险的通货紧缩)。
这一论点与凯恩斯经济学的经济学概念相关,(13)凯恩斯经济学认为,频繁向经济中注入新货币有助于促进经济增长。关于比特币,凯恩斯主义者会认为,政府无法印制更多货币单位会严重损害经济增长。(14)他们认为,比特币的货币供应量上限所强加的稀缺性会导致名义通货紧缩,即以比特币计价的日常商品价格会随时间下降,导致货币流通冻结,迫使经济陷入萧条。其理由是,个人会推迟购买,期待未来商品价格更低。
比特币支持者以奥地利经济学的哲学思想反驳凯恩斯主义的观点。这一经济学哲学认为,货币单位的价格有能力自行适当调整,从而保证经济中的购买和储蓄保持在理想水平,无论经济中任何时刻存在多少货币单位。
比特币与政府稳定性
一些人认为,成功的比特币系统可能会有害,因为它可能会导致政府不稳定。有人辩称,比特币是一个更大运动的一部分,最近被称为激进去中心化,该运动认为所有去中心化(包括政府职能)都是可取且可能的。这一理念直接延伸自弗里德里希·哈耶克的哲学,他认为地方控制通常比中央控制更好,因为地方居民对当地情况有更多了解,因此在大多数情况下能更高效地行动。然而,确实,政府从控制货币供应中获益。政府在通过直接征税筹集资金时遇到挑战,且为了资助政府项目而印刷货币被称为“通过通货膨胀征税”,这对政府来说较为容易,而对公民来说则更难制止。失去这种为政府项目(包括军事防御)筹集资金的手段,可能会减少一些政府的财政可行性。
然而,比特币并不是唯一设计上去中心化的最近技术:BitTorrent、Gnutella、Tor 和 Freenet 同样免受中央控制。显然,计算机使我们能够以互联网革命之前无法实现的方式探讨去中心化的理念,以及它的优点和潜在的缺陷。许多这些去中心化的系统曾被认为会对政府的稳定构成风险(尤其是在那些有压制言论自由法律的国家的互联网环境中),但我们依然接受了它们,因为它们给社会带来了巨大的好处。政府对互联网的失控,被(甚至更多地)通过经济生产力的增加所弥补。计算机工程师们不断推动去中心化网络的可能性,试图将财务合约(例如像以太坊这样的软件项目^(15))或通信系统(例如 Bitmessage^(16))推向去中心化系统。只有时间会告诉我们这些系统对政府的影响是好是坏。
在下一章,我们将更详细地探讨比特币背后的某些技术,从比特币的加密技术开始。
第七章:7
比特币背后的加密技术
比特币依赖于加密技术来运作,这也是它有时被称为加密货币的原因。^(1) 但是,加密技术在比特币中扮演什么角色,为什么它是必要的呢?我们将首先简要介绍一些必要的加密技术概念(如果你已经熟悉这些概念,可以直接跳到第 137 页的“比特币为何需要加密技术”部分),然后我们将探讨比特币中使用的具体加密方法。
如果你翻到这一章只是因为你想知道比特币使用的加密技术是否安全,那么你可以放心,因为比特币仅使用经过验证的加密技术:比特币使用的所有加密方法,过去已被各国政府和大公司广泛应用于保护金融、医疗和其他敏感信息,以及个人身份数据。
事实上,比特币中的加密技术可以说是无聊的,因为它依赖于非常保守的加密算法。但在一些学科领域,如会计和牙科,无聊其实是好事;对于比特币来说,保守且成熟的加密技术有助于使其更加安全。真正有趣的部分是比特币如何使用加密技术。

幸运的是,正如你所看到的,尽管比特币的加密技术对专家来说可能是陈词滥调,但对于新手来说,它依然非常有趣!
加密技术简述
历史上,加密技术用于在必要时发送秘密信息,以保护信息的安全。信息通过系统地加密,或称为加密,使得只有接收者知道如何解密。一条加密得当的信息可能对接收者来说能理解为战斗计划,但对其他人来说,这就像是乱七八糟的文字拼盘,配上一碗字母汤。历史上,加密和解密是繁琐的任务,只用于安全的秘密通信(通常是军事或非法的浪漫性质)。随着计算机的出现,它们能够在毫秒内完成曾经需要数小时才能手动完成的任务,现在加密技术已被大众日常使用,用于加密/解密非常重要(例如,金融)和不太重要(例如,付费电视)通信。或许令人惊讶的是,计算机的便捷性和速度促使了加密方法的应用不仅仅局限于加密秘密信息。常见的例子包括使用用户名和密码登录网站以及使用注册码安装软件。两者都使用了加密技术,但在这两种情况下都没有涉及信息加密。
除了加密信息外,现代密码学还用于验证信息的有效性(通过加密哈希函数)和证明身份(通过数字签名)。例如,如果没有现代密码学,你将无法区分两个自称是你银行网站的完全相同的网站。其中一个可能是虚假的,由小偷操控来窃取你的钱财。但只有你银行的网站能够提供正确的数字签名。在我们解释数字签名和加密哈希函数如何工作之前,让我们先了解一下单向函数,这是这两者所依赖的特性。
单向函数
单向函数 是一种数学函数,基于输入容易计算出输出,但反向操作却很困难。什么是“容易”或“困难”的精确定义并不存在,而是取决于计算的复杂性和解决问题所需的努力。
一个典型的例子叫做整数因式分解,它要求你将一个整数^(2)写成仅由素数组成的乘积。例如,6 的因子是 2 和 3,这两者都是素数。给定素因子作为输入,乘它们得到输出整数是很容易的,但反过来却不行(至少对于更大的数字来说)。给定一个大整数,找到它的素因子是非常困难的。已知的唯一方法是系统地猜测不同的素因子组合,但找到正确答案所需的时间会随着数字位数的增加而指数级增长。想象一下,在脑海中计算 2 × 7 × 7。计算出答案 98 其实并不困难;然而,如果你得到数字 98,并且要求找出它的素因子,生成 2、2 和 7 将会更为困难。一台典型的笔记本电脑可以在不到一秒的时间内因式分解一个 60–80 位的数字,但所需时间是指数级增长的:因式分解一个 300 位或更大的数字将需要现代超级计算机几十年的时间。
Prime factors (2,7,7,13) → 2x7x7x13 → Output integer 1274 (easy)
Output integer 1274 → ??????????? → Prime factors (2,7,7,13) (hard)
另一个单向函数,虽然稍微复杂一些,但在密码学中常见的函数涉及到离散对数。考虑一个整数集合 {0, 1, 2, 3, ..., n − 1},其中 n 是一个素数,并且我们只使用模 n 的模算术:^(3)
Example: n = 7 3 + 6 (mod 7) = 2 3 x 6 (mod 7) = 4
将一个整数 a 提升到 k 次方来计算整数 b 是很容易的(比如,你可以用一个口袋计算器完成这项操作):
Example: a^k (mod n) = b 3² (mod 5) = 4
然而,离散对数问题,即给定 a, b 和 n,找出 k 是非常困难的。已知的求解 k 的方法是对 0 到 n 之间的每个值进行猜测,以满足前述方程。n 的值越大,计算 k 就越困难(所需时间也越长)。
Example:
a = 4; k = 4781; n = 17627 → 4⁴⁷⁸¹ (mod 17627) = 2685 → b = 2685 (easy)
a = 4; b = 2685; n = 17627 → ????? → k = 4781 (hard)
在计算机的早期,人们开始利用这些单向函数的非对称性来构建各种类别的密码学算法,这也是我们接下来要讨论的内容。
密码学哈希函数验证信息
密码学哈希函数是单向函数,设计用于将任意数据作为输入(例如,数字、简短信息、图片或莎士比亚的全集),并生成固定长度的输出(例如,128 位或 256 位数字)。这个输出被称为哈希或哈希值。哈希值可以像指纹一样,作为文件或文本的唯一标识符。它们的设计方式使得两个不同的输入产生相同哈希值的可能性极小(当这种情况发生时,称为碰撞)。特别是,即使输入数据发生微小变化,例如在莎士比亚全集中改变一个字母,也会导致生成一个与原哈希值完全不同的新哈希值。
一种常用的密码学哈希函数是 MD5(消息摘要算法,第五版),它将任何数据作为输入并输出一个 128 位的哈希值,如下所示:
MD5("hello world") = 5eb63bbbe01eeed093cb22bb8f5acdc3
正如你所看到的,在mysecretpasswordisCATS中仅更改一个字符就会导致完全不同的哈希输出:
MD5("mysecretpasswordisCATS") = 399257907fd42e2ee3fcb39b04192b04
MD5("mysecretpasswordisBATS") = b12d76c8b8c063616dbf7b8b7349aed0
这种特性使得哈希函数可以用于验证某些信息是否正确,或与其他人声称的正确信息进行匹配,而不需要仔细检查实际信息。例如,MD5 用于检查下载的文件是否安全可用,并且在数据传输过程中没有发生错误。如果下载的数据的 MD5 哈希值与可靠来源提供的哈希值匹配,那么你可以确定该数据没有隐藏的病毒,也没有在文件传输过程中损坏。文件的任何轻微改动都会导致哈希值发生明显变化。哈希值就像一个防篡改的封条:如果它被破坏了,千万不要购买该产品。
密码学哈希函数的另一个更令人兴奋的应用是证明你知道一个秘密密码而不将其透露。假设你是一个敌后间谍。经过多天在黑暗中旅行后,你终于到达一个守卫的仓库,与同胞特工见面。前门的守卫要求你提供秘密代码,但你不确定他是否是你方的人员。你需要证明你知道密码,但又不想冒着让密码落入敌人之手的风险!你该怎么办?你给他密码的哈希值。如果他知道密码,他就能计算出哈希值并验证你也知道密码。如果他不知道密码并且不应该知道,你就没有泄露它。
这个极具戏剧性的例子描述了当你为一个网站创建新账户并设置用户名和密码时的标准程序。密码从不存储在网站的服务器上;而是存储密码的哈希值,服务器会检查你输入的哈希值是否与记录中的哈希值匹配。因此,如果服务器被盗或遭到黑客攻击,密码将不会被泄露。
公钥密码学
公钥密码学的发明出现在 1970 年代,是一次重大的突破,推动了我们今天所依赖的许多技术。直到那时,所有的加密方法都需要发送方和接收方知道相同的秘密加密密钥来加密和解密消息(也叫做对称密钥密码学)。然而,这种方法存在一个问题,因为它假设发送方和接收方在某个较早的时间有一种安全的方式来沟通,以便决定加密密钥,而不必担心有人窃听。
在公钥密码学(也叫做非对称密钥密码学)中,创建了两把不同的密钥:一把公钥用于加密消息,另一把私钥用于解密消息(没错,就是用于花费比特币的那把私钥)。使用非对称密钥密码学,通过不安全的渠道(如无线电或互联网)进行安全通信变得简单:你将公钥分享给希望与你通信的人,然后任何人都可以发送加密消息,而只有你能用私钥解密。因为公钥无法用于解密消息,即使它落入错误的手中也没有危险。如果别人希望你发送加密消息给他们,他们会给你他们的公钥,依此类推。
非对称密钥密码学是如何工作的?原始方法被称为RSA 加密,以其开发者 Ron Rivest、Adi Shamir 和 Leonard Adleman 命名,基于整数分解。^(4) 假设 Crowley 想要使用 RSA 方法与其他人通信。Crowley 首先需要创建一把公钥和一把私钥(见表 7-1)。他可以在任何时间创建这些密钥,然后开始通信。
表 7-1: 使用 RSA 方法发送加密消息
| 步骤 | 说明 | 示例 |
|---|---|---|
| 1 | Crowley 选择两个质数,p 和 q,并将它们相乘得到质数乘积 n。回想一下,这是一种单向函数;仅凭 n 是无法轻易获得 p 和 q 的。 | p = 71, q = 149 n = 71 × 149 = 10579 |
| 2 | Crowley 计算 t = (p − 1)(q − 1)。 | t = (71 − 1) × (149 − 1)= 10360 |
| 3 | Crowley 选择一个整数 e,使得 e 和 t 没有共同的约数(当然除了 1)。他有许多可能的 e 值可供选择。这就是 Crowley 的公钥。 | 选择 e = 3453 |
| 4 | 克劳利找到 d,使得 d × e (mod t) = 1。这是克劳利的私钥。 | d × 3453 (mod 10360) = 1,当 d = 10357 时满足 |
一旦公钥和私钥生成,克劳利可以广泛分发公钥(以及质数积 n)。这样任何人都可以使用这个公钥加密只供克劳利查看的消息。
当然,要加密和解密消息,你需要某种方法将文本转换为数学形式,这被称为 编码。将数字转换回文本称为 解码。编码和解码不应与加密或解密混淆,因为你并不是在混淆信息。存在许多不同的编码方案,使用哪种方案并不重要,但所有相关方需要使用相同的方案。
假设字母 a 对应 0,字母 b 对应 1,字母 c 对应 2,以此类推。在表 7-2 中,我们使用这种方法对消息“fade”进行了编码。
表 7-2: 使用简单方案对单词“Fade”进行编码
| 字母 | 从零开始的字母位置 |
|---|---|
| F | 5 |
| A | 0 |
| D | 3 |
| E | 4 |
现在我们已经有了一个编码后的消息,准备发送给克劳利,并且也有了克劳利的公钥,我们可以加密这个消息,使得只有克劳利能够解密,正如表 7-3 所示。
表 7-3: 使用克劳利的公钥加密单词“Fade”
| 步骤 | 指令 | 示例 |
|---|---|---|
| 1 | 要加密消息,使用公钥 e 进行计算:c = m^e (mod n)。c 被称为密文 | c = 5034³⁴⁵³ (mod 10579) = 5272,解码为 fchc |
| 2 | 要解密消息,使用私钥 d 进行计算:m = c^d (mod n)。m 是原始消息 | m = 5272¹⁰³⁵⁷ (mod 10579) = 5034,解码为 fade |
几乎可以使用相同的方案来证明一个人的身份,这种方式被称为 数字签名。
数字签名
在前面描述的公钥加密方案中,任何人都可以向你发送加密消息,而你却不知道他们是谁。假设克劳利在他的岛屿上,试图与另一个岛屿上的佐藤安排转交菠萝。如果克劳利收到两条信息,内容相互矛盾,但都声称来自佐藤(例如:“把菠萝送到北岛。——你的朋友,佐藤”和“把菠萝送到南岛。——你的朋友,佐藤”),克劳利怎么知道哪条信息才是真正来自佐藤呢?
幸运的是,中本聪可以使用一个技巧来证明自己的身份以及信息的真实性:他不仅可以使用自己的公钥加密信息,还可以使用自己的私钥进行加密。这种反向加密方法颠倒了加密数学原理,正如你所预期的那样:尽管加密信息非常困难(只有拥有私钥的人才能完成加密),但解密信息却非常容易(任何拥有公钥的人都可以解密)。
因此,如果中本聪使用这种反向加密方法加密消息:“我的名字是中本聪,我住在南岛,我承诺会支付你一些菠萝的钱,”任何人,包括克劳利,都可以使用中本聪的公钥解密这条消息(假设这个公钥已经被确认是百分之百真实的)。然后克劳利可以说:“我知道中本聪是地球上唯一拥有他私钥的人,而这条消息是由一个必须能够访问该私钥的人写的;因此,这些话是中本聪说的。”
当你使用这种方法来证明你的身份时,公钥和私钥的功能发生了逆转。中本聪可以使用他的私钥加密一条消息,其他人则可以使用他的公钥解密它。因为其他人拥有中本聪的公钥,消息的内容就不再是秘密,但消息被私钥加密这一事实证明了它不可能是由其他任何人发送的。
为什么这叫做数字签名?
术语数字签名的使用源于这样一个事实:发送反向加密的最方便方式是传递两部分信息:消息和消息签名。
想一想:中本聪在发送的消息中没有什么需要隐藏的(事实上,他明确希望每个人都能阅读他的消息);因此,可以说对中本聪来说,直接发送未加密的消息,然后再以加密形式发送一份副本会更为方便。如果克劳利怀疑这条信息是否确实是中本聪写的,他可以轻松地阅读消息,并且只有在有疑虑时,才会使用中本聪的公钥解密副本。
然而,发送两次消息似乎效率不高。显然,中本聪必须发送整个未加密的消息才能让世界看到这条消息。但加密消息能不能缩短呢?事实上是可以的,通过使用加密哈希函数。记住,如果任何人试图篡改一条消息,该消息的哈希值会发生变化。因此,中本聪可以简单地计算出他消息的哈希值,然后仅使用他的私钥加密该哈希值。然后,任何阅读该消息的人都可以使用他的公钥解密中本聪的哈希输出,并计算出未加密消息的哈希值,检查两者是否一致。
记住,消息的哈希值无论原始消息多长,都是一段很短的数据。因此,通过仅加密原始消息的哈希值,你可以创建一个非常短的数字签名来表示一个更长的消息。更重要的是,即使对未加密的消息进行最微小的修改,也会导致加密哈希值完全不同,从而防止任何拦截者篡改已签名的消息。因此,数字签名不仅证明了真正的中本聪签署了消息,而且还证明了他签署了一条非常特定的消息。在这方面,数字签名甚至比模拟的手写签名更好。
使用数字签名
使用 RSA 加密方案,实现数字签名非常简单。假设我们使用与表 7-2 中相同的编码方案,并且我们希望以未加密但已签名的方式发送消息“fade”。表 7-4 展示了如何使用数字签名证明消息的作者身份。
现在我们可以发送消息“fade”,并用ifda进行签名。接收者无需任何额外信息即可读取消息,因为它可以直接读取。但为了验证发送者的身份,接收者需要知道所使用的哈希函数(在本例中是 MD5)、素数积n和发送者的公钥e。接收者随后使用公钥解密签名以获得哈希值,本例中是 8808,并检查它是否与消息“fade”的 MD5 哈希值匹配。如果匹配,接收者就知道消息来自哪里,并且消息在传输过程中没有被篡改。
表 7-4: 使用 RSA 加密签名消息“Fade”
| 步骤 | 说明 | 示例 |
|---|---|---|
| 1 | 使用合适的加密哈希函数(例如 MD5)计算消息的哈希值。哈希输出必须小于素数积n,这可以通过计算输出的模来实现。^**h* = MD5(message) (mod n) | fade 编码为 5034h = MD5(5034) (mod 10579)= 8808 |
| 2 | 使用 RSA 加密方法加密哈希值h,即计算:s = h^d (mod n),其中s是签名(它是一个密文) | s = 8808¹⁰³⁵⁷ (mod 10579)= 8530 解密为 ifda |
- 如果你在跟随本教程,记住哈希函数的输入格式非常重要。整数 5034 的 MD5 哈希值与单词5034(文本格式)的 MD5 哈希值不同。对于数字,还需要指定数字的进制。
这就是数字签名的工作原理。当然,在这个例子中,选择的素数积是一个较小的数字,因此例子比较容易理解。在实际应用中,RSA 加密使用的是 512 位或 1024 位的素数积(甚至更高的位数用于军事通信),它看起来大致是这样的:
Example RSA-1024 key:
570854064335125300374580392844230066956632116097468377067570536794795107733730 255544946767158528487632613554731246509184251330806267264906570307315620158833 679440939508928340421956875991672660426563565615307186600294486104820050904319 1065262154874848937338866257399506142323572694928592907380693479819082939185
其他一些小细节在实际操作中有所不同,进一步增强了程序的安全性。
为什么比特币需要加密技术
那么,为什么比特币必须依赖加密技术才能正常工作,即使比特币并不涉及发送秘密消息?在比特币中,哈希函数和数字签名用于以下几个重要目的:
• 使用数字签名授权交易
• 验证交易历史的有效性
• 比特币挖矿中的工作量证明
• 比特币私钥的额外保护
让我们探索比特币需要加密技术的功能,然后深入了解比特币使用的具体方法。
使用数字签名授权交易
比特币使用数字签名来授权交易,以便只有你,而且仅仅是你,可以花费你拥有的比特币。在信用卡支付和银行转账中,你通过提供个人身份的证明来授权交易(而如今,你需要提供的证明越来越多,负担也越来越重)。而在比特币中,没有任何个人信息与比特币地址相关联;相反,你必须证明你拥有私钥。将私钥展示给别人肯定可以作为证明,但通过知道私钥,那些你展示过私钥的人就可能声称他们拥有该地址上的比特币。因此,你需要证明你拥有私钥,而不必实际共享它。但问题远不止于此。
一笔比特币交易包含相当多的信息:转移的比特币数量、接收地址、交易费用等等。你不希望这些信息在未经你许可的情况下被更改,因此,除了证明你拥有正在发送的比特币外,你还需要确保交易细节完全按照你所写的执行。比特币交易是一条包含指令的信息,通过用数字签名对其进行签名,你可以同时证明你拥有私钥,并确保交易细节正是你所意图的。如果签名缺失或与公钥不匹配,比特币网络中的节点会认为该交易无效,并不会将其加入区块链。
验证交易历史的有效性
比特币依赖于区块链在网络中的节点广泛分发。但是,你怎么能确保网络中的任何单个节点拥有的区块链副本没有被偷偷篡改呢?恶意攻击者可能试图分发一个伪造的区块链,其中仅有一笔交易被篡改以利于攻击者。然而,这种攻击绝对行不通,原因有很多。一个原因是交易历史的最小变化就会完全改变该交易后所有区块的区块哈希。
区块链中的每个区块都包含一个交易列表和上一个区块交易的哈希值。因此,要想单独修改中间区块中的一个交易,必须导致预期区块哈希与下一个区块记录的哈希值不匹配,这几乎是不可能的。
这种验证为单个节点提供了一种高效的方式来检查其区块链副本中的交易是否被篡改。节点无需检查整个交易历史中的每一笔交易,而只需检查每个区块的哈希值是否与后续区块记录的哈希值匹配。
比特币挖矿中的工作量证明
比特币挖矿基于一种抽奖系统,你只能通过反复猜测数字来获胜,但这使得他人容易检查你是否猜对了。如果这听起来像是单向函数,那是因为它确实是。比特币挖矿中使用的单向函数是加密哈希函数。矿工会得到输出标准(输出可以是低于某个阈值的任意数字),但由于加密哈希函数的设计使得逆向计算对应的输入非常困难,因此比特币矿工只能随机选择不同的输入,希望输出能低于阈值。一旦矿工确定了正确的输入值,他或她可以通过与他人共享该值来轻松证明自己的工作,其他人可以轻松重新计算哈希值。
比特币私钥的额外保护
使用数字签名授权交易需要与他人共享你的公钥。虽然从公钥计算私钥在计算上被认为是不可行的,但仅凭输出计算哈希函数的输入同样困难,而且同时做两者则更难。用户共享的是一个比特币地址,这是公钥的加密哈希值。事实上,公钥会被使用两种不同的加密哈希函数进行两次哈希处理,从而生成比特币地址。这一额外保护措施确保了通过对比特币地址的任何分析都无法揭示底层的私钥。
比特币使用加密哈希函数来完成其他多项重要任务。接下来,你将探讨比特币使用的具体加密方法。
比特币使用的加密方法

公钥加密是一个高级框架,可以通过多种不同的方式实现。你已经了解了如何使用将整数分解为大素数的 RSA 方法来实现数字签名。那么比特币中的数字签名是如何实现的呢?存在多种不同的加密哈希函数,尽管之前提到的 MD5 方法被广泛使用,但它对于加密货币来说并不够安全(MD5 中已发现碰撞,导致两个不同的输入得到相同的输出)。
SHA256 和 RIPEMD160 是比特币协议中使用的两种加密哈希函数。
加密哈希函数:SHA256 和 RIPEMD160
安全哈希算法(SHA)由美国国家安全局(NSA)开发。竞赛完整性原语评估信息摘要(RIPEMD)由汉斯·多贝廷(Hans Dobbertin)、安东·博塞尔(Antoon Bosselaers)和巴特·普雷内尔(Bart Preneel)在鲁汶天主教大学(Katholieke Universiteit Leuven)设计。^(5)
前缀SHA和RIPEMD指的是底层算法,而数字后缀 256 和 160 则指示输出的位长。其他 SHA 函数,如 SHA224 和 SHA512,也会输出不同位长的哈希值。
SHA256 和 RIPEMD160 都被广泛使用,但 SHA 方法更为流行,并且得到了密码学家更高程度的审查。在本文撰写时,没有人发现 SHA256 或 RIPEMD160 中存在碰撞,这是衡量加密哈希函数安全性的重要标准。
在比特币协议中,SHA256 和 RIPEMD160 一起用于保护数字签名中使用的公钥。SHA256 方法还用于比特币挖矿中的工作量证明功能,以及作为数字签名算法的一部分。以下是使用 SHA256 和 RIPEMD160 对一个稍微有变化的句子进行加密的示例(以下所有输出均为 16 进制格式):
SHA256("Crowley is trapped on an island")
= 1e8f7e62b42f07766c3c4367e670a328d73b7eb596602198f126324f013f30a5
通过单一字符的变化,产生了完全不同的结果:
SHA256("Crowley is trapped on an Island")
= 91a382b6584261e0e7690da2c43cec9f7ce251b47396b543bddb3ed6ada8c9cc
使用 RIPEMD160 时也会发生相同的情况:
RIPEMD160("Crowley is trapped on an island")
= 64d50d0853d09d97c4567117a616954ca648e46c
这个哈希完全不同:
RIPEMD160("Crowley is trapped on an Island")
= b84aec162a0aa5786541b5e4f3286f8734e3bc3c
正如你所期待并欣赏的那样,一个有效的哈希函数中,文本中的微小变化(例如将Island一词大写)会完全改变两种方法产生的哈希值。
现在你已经了解了比特币使用的哈希函数,让我们讨论比特币数字签名所使用的算法。
克劳利和不幸的果冻填充甜甜圈事件
在本章余下的部分,我们将讨论椭圆曲线加密(ECC)的详细信息。但在深入讨论该算法的细节之前,为了帮助你理解其背后的基本概念,让我们给你讲个故事。

一天,克劳利正在开车穿过加密镇(Cryptoville),悠闲地做着自己的事,突然,砰!他的车被抛向了空中!

他开车经过了一家甜甜圈店,那家店正在尝试打破世界上最大果冻填充甜甜圈的纪录。不幸的是,面包师傅错误地计算了应该注入甜甜圈的果冻压力,导致了爆炸。

在空中翻滚了一会儿后,克劳利安全着陆,并松了口气,意识到自己没有受伤。然而,这次可怕的经历让他有些震惊,车上也满是果冻。由于他在空中翻滚过,已经迷失了方向,不再知道自己在加密镇的哪个地方。现在他该怎么办?

就在这时,佐藤从附近的一栋房子里走了出来。克劳利无意中发现了佐藤神秘住所的所在!

克劳利随后向佐藤解释了发生在他和他车上的事情。听到克劳利迷路了,佐藤既感到担忧,也稍微松了口气,因为这意味着他的住址仍然是个秘密。
克劳利请求佐藤载他回家,或者打电话叫拖车。但佐藤拒绝了,他说:“如果我做了其中一件事,你就能知道自己在加密镇的位置,进而推算出我的秘密住址。幸运的是,我还有一个主意:不如你进我家做客,喝杯咖啡,恢复一下因为今天那场惊魂经历而有些混乱的思绪。我过几个小时就回来,到时候再告诉你如何把你和你的车送回家。”

果然,佐藤过了一会儿后拿着一台 iPod 回到了屋里。“好吧,克劳利,事情是这样。我开着自己的车开到了你家。在这个过程中,我用这台 iPod 记录了我的驾驶过程,每当我做出某个动作时,就在录音中标记出来。比如,当我将方向盘左转 10 度时,我在录音中说了这一点。如果我从 20 英里每小时加速到 40 英里每小时,我也会记录下来。我所做的每一件事,我都会在准确的时间记录下来。”
克劳利这时明白了计划:尽管他的车上覆盖着果冻,无法透过窗户看清楚外面,但他仍然可以根据录音带上的简单指示来操作。毕竟,他的车引擎还正常运转,而且他可以看到车内仪表盘上的速度表。佐藤补充道:“仅凭我在 iPod 上录下的指示,你很难逆向推算出汽车驾驶的精确物理原理。因此,我的家在哪个地方,你永远也不会知道。不过,为了让你更加难以猜出,我还特意绕了一大圈,几乎穿过了整个加密镇,才开到你家!”

但果然,使用佐藤的 iPod,克劳利能够在看不见车窗外任何事物的情况下将车开回家。他仅仅是跟随指示操作,当录音结束时,他就回到家了。他依然完全不知道佐藤住在哪里,但他奇迹般地避免了撞到行人或其他车辆!

为了感谢佐藤的帮助,克劳利给佐藤发了一封电子邮件,邀请他周六晚上到克劳利家吃千层面,并请他提出一个合适的晚餐时间。下面是佐藤的回信:
谢谢克劳利——晚餐听起来不错,我很喜欢千层面!我们晚上 9:25 见面吧。
哦,为了证明这封邮件是合法的,我可以告诉你,我当时正开车在 Main Street 的 300 号街区,朝北行驶,速度恰好为 38.7 英里每小时,而 iPod 显示的是 9 分钟 25 秒。
作为一个严格验证身份的人,克劳利验证了这个事实:他首先让他的车(仍然覆盖着果冻)被拖到电子邮件中提到的位置,然后在 9 分钟 25 秒时启动了 iPod。按照 iPod 上的指示明确操作,直到完成,他再次走出车外,发现自己已经回到家了!
这个愚蠢的寓言旨在给你大致概述一种创建数字签名的方式:假设佐藤的家庭地址是佐藤的私钥,而克劳利的家庭地址是公钥。iPod 上的指示是一个难以逆向的单向函数。使用这些信息,你可以签名任意消息(在本例中为数字925,即会议时间)。只有知道私钥的人(佐藤的家庭地址)才能生成这个签名。
正如你所看到的,使用 ECC 时,我们将“绕着城镇开车”,通过在一个特殊的二维曲线上跳跃,从一个点到另一个点,这使得逆向工程这些指令变得更加困难。然而,整个过程仍然大致类似于这个故事中的情节。
沿直线移动
在我们开始思考驾驶时如何绕过弯道之前,让我们先用一个更简单的情景,假设是在一条直线上驾驶(见图 7-1)。
如果我们有一条通过原点的直线(即,x = 0,y = 0 的点),我们可以通过使用两个点 A 和 B 来创建一个新点 C,只需将 A 和 B 相加即可。下面是加法的显而易见公式:
A(x[1], y[1]) + B(x[2], y[2]) = C(x[3], y[3]) x[3] = x[1] + x[2] y[3] = y[1] + y[2]
我们需要将两个 x 坐标相加,得到一个新的x(简单地说,1 + 3 = 4),并将两个 y 坐标相加(同样是 1 + 3 = 4)。请注意,我们也可以使用一个简单的几何技巧来生成点 C,而不使用算术:只需从点 B 开始,然后按与点 A 从原点的角度和距离相同的方向移动。

图 7-1:将直线上的两点(A 和 B)相加得到点 C
对于直线,这一加法过程非常简单,但对于加密学而言并不有用(同样,对于创建难以逆向工程的“汽车”行驶指令也没有用)。但正如你将看到的,椭圆曲线上的点加法过程是完全不同的。
椭圆曲线数字签名算法(ECDSA)
与基于整数因式分解的方案不同,比特币的数字签名是基于椭圆曲线加密(ECC)。尽管整数因式分解在理论上运作良好,但随着计算机的变得更快,以及用于因式分解整数的算法不断改进,逐渐需要使用更大的质因子来确保合理的安全性。RSA 加密使用的推荐加密密钥大小在 1024 位和 4096 位之间。相比之下,椭圆曲线提供相同的功能,但不受整数因式分解技术进步的影响;因此,可以使用更短的密钥(在 ECC 中,256 位密钥被认为提供与 1024 位 RSA 密钥相当的安全性)。简而言之,ECC 被认为比基于整数因式分解的方法在相同密钥长度下更强。
比特币使用椭圆曲线创建数字签名,具体来说,使用一种称为椭圆曲线数字签名算法(ECDSA)的协议。椭圆曲线是任何满足以下方程的二维曲线:
y² = x³ + ax + b
一些满足此方程的曲线示例显示在图 7-2 中。公钥/私钥对是通过选择位于这些椭圆曲线上的点来生成的,这些点在数学上是相互关联的。

图 7-2:使用我们起始方程中的不同参数可以生成不同的椭圆曲线。
与直线的性质一样,当你将曲线上任何两点的坐标相加时,结果是曲线上的另一个点。
然而,在椭圆曲线中,加法有特殊含义,定义如下:

显然,两个点的加法公式比我们用于直线的加法公式要复杂得多。图 7-3 展示了一个示例椭圆曲线,其中有两个点 A 和 B,通过遵循这些加法规则得到的结果点是 C。

图 7-3:通过我们特殊的加法方法,将椭圆曲线上的两个点(A 和 B)相加得到点 C。
在图 7-3 的例子中,点 A 和 B 没有任何特殊之处。选择不同的 A 和 B 点会导致不同的点 C(见图 7-4),这就是使用这种加法进行加密的全部意义:在之前的果冻甜甜圈事件中,克劳利不得不绕远路返回家中,以保持中本聪的住址不被暴露。通过这种加法方法在椭圆曲线上反复跳跃,可以帮助你在数字签名系统中模糊你的私钥,就像你很快会看到的那样。

图 7-4:当选择不同的点 A 和 B 时,会创建不同的点 C。
类似于直线,你可以使用几何技巧来计算在椭圆曲线上两个点的和(即,无需进行繁琐的算术运算)。只需画一条通过点 A 和 B 的直线,并找到该直线与曲线的另一个交点。然后,从交点处画一条垂直线,看看它还与椭圆曲线相交的其他位置。第二次交点就是点 C(见图 7-5)。

图 7-5:通过简单的几何方法,你可以通过画一条经过点 A 和 B 的直线,再垂直移动来找到点 C。
椭圆曲线的一个基本性质是,任何与至少两个点相交的直线也必须与第三个点相交(除了垂直线和与曲线某点相切的线^(6))。
当然,如果我们想“环绕”我们的椭圆曲线,就像我们在概念性例子中提到的汽车那样,问题就在于我们需要两个点才能生成每个新点:就像汽车一样,理想的情况是从一个点到另一个点,这样我们的“车”就只需在一个地方停留。幸运的是,椭圆曲线也可以通过一种形式的乘法来实现这一点,即将曲线上的一个点与一个整数相乘,这相当于将一个点与自身多次相加。看起来似乎几何技巧在这种情况下不起作用。那么,如果两个点在同一个地方,如何画出一条通过这两个点的直线呢?你可以通过想象当你考虑将两个非常接近的点 A 和 B 相加时发生的情况来猜测:通过 A 和 B 的直线将类似于这些点附近曲线的切线。因此,当我们将 A + A(或者等价地,将 A 乘以 2)时,我们会画出在点 A 处的切线,并找到它与曲线的其他交点。然后,我们像之前一样画一条垂直线,以找到结果点 2A(见图 7-6)。

图 7-6:仅通过一个起始点,我们可以使用通过点 A 的切线将其乘以 2。
要计算 3A,你首先计算 2A,就像我们刚才做的那样,然后再加上一个 A 就像加两个不重叠的点。在椭圆曲线术语中,计算kA,其中k是任意整数,称为点乘法。对于大的k值,计算kA 在没有高效实现的情况下是计算密集型的。
如同我们的概念性例子一样,我们现在将使用点乘法来“驱动”从曲线上的一个点到另一个点。在椭圆曲线加密(ECC)中,点乘法用于从私钥生成公钥。然而,我们的果冻夹心甜甜圈故事与 ECC 实际工作方式之间将有一个重要的区别。在我们的故事中,佐藤的房子代表了私钥,而克劳利的房子代表了公钥,但在 ECC 中,起始点和目标点是公开已知的——只有它们之间的路径是保密的。因此,实际上是路径是私钥;目标点是公钥(就像之前一样),而起始点只是一个大家一致同意使用的标准位置。在 ECC 中,就好像佐藤的家庭住址广为人知,位于一个非常复杂的迷宫的中心——每个人都知道他住在哪里,但没有人知道如何到达那里。给定一个之前约定的曲线上的点 G 和一个私钥d,公钥 Q 通过点乘法计算得出,满足 Q = dG。请注意,公钥是曲线上的一个点,而私钥只是一个整数。
到目前为止,我们一直将椭圆曲线描绘为平滑、连续的函数,延伸到无限远。然而,计算机的内存是有限的,不能使用实数作为曲线上点的坐标而不引入舍入误差(在密码学中这是不可接受的)。对于实际应用,只允许使用整数值的椭圆曲线上的点,并且使用模运算将所有点限制在某些边界内(例如,从 0 到 512)。这种只使用整数值点的技术通过一个例子最为形象。让我们首先选择比特币使用的相同椭圆曲线,这条曲线叫做Koblitz 曲线(图 7-7),使用参数a = 0 和b = 7。

图 7-7:一个 Koblitz 曲线
然后我们选择一个质数模p,使得椭圆曲线满足这个方程:
y² = x² + ax + b(modp)
注意
在这种数学符号中,模运算是在加法之后执行的,所以你首先计算 x² + ax + b,然后对结果执行模 p运算。
比特币使用一个非常大的p值(具体为p = 2²⁵⁶ − 2³² − 2⁹ − 2⁸ − 2^(7) − 2⁶ − 2⁴ − 1),这个值对加密强度非常重要,但我们可以使用一个较小的数字来说明“在 Koblitz 曲线上以整数值的点进行行驶”是如何工作的。让我们选择p = 67。事实上,许多曲线都满足模方程(即每一条曲线都可以通过多次加或减p到b参数;参见图 7-8 中的左图),在这些曲线中,我们可以使用所有具有整数坐标的点(在图 7-8 中作为点显示)。

图 7-8:左边是我们熟悉的椭圆曲线的标准图(粗体曲线),以及通过使用其他倍数的p所绘制的附加曲线(细线曲线)。右边是坐标平面的更大部分,扩展了右上象限。这是使用基于整数的 ECC 变种时最方便的曲线部分。
给定p = 67,只有 79 个具有整数坐标的唯一点存在,其中 78 个可以在右上象限找到,满足 0 < x < 66 和 0 < y < 66(如图 7-8 右图所示;注意左图显示的是整个范围)。唯一点的数量,n,被称为曲线的阶。第 79 个点是零点,它并不在(0,0)处,正如你可能期望的那样,而是位于y = 无穷大处。零点非常重要,因为它是加法或点乘法操作的有效输出,因此需要小心处理(请参见“椭圆点加法与点乘法伪代码”中的示例代码,位于第 158 页)。
在我们生成公钥/私钥对之前的最后一步,我们需要选择 79 个点中的一个作为生成器点,G。生成器需要具备这样的性质:通过将 G 乘以某个整数k,可以计算出其他 78 个点(即,你可以通过计算 G、2G、3G、...、79G 来生成每个点)。如果我们选择点(5,47)作为生成器点,我们可以检查通过依次递增k,是否能够到达集合中的每一个点(参见图 7-9)。

图 7-9:左边,从点 G 开始,我们连续乘以 G 来生成新的点,分别是 2G、3G 和 4G。右边展示了这种乘法操作继续重复时会发生什么。
如果曲线的阶是素数(即有素数个点),则除零点外的任何点都可以作为生成点。如果阶不是素数,则无论k值如何,某些点只会遍历到部分点(这可能会导致加密强度的下降)。在我们的案例中,我们可以安全地使用点(5,47),因为它可以生成其他所有 78 个点(如图 7-9 所示)。
回到我们概念上的汽车示例,图中的点 G 可能是佐藤的家,点 4G 则可能是克劳利的家。两点之间的部分代表了穿越加密城(Cryptoville)的复杂旅程。在执行点乘运算之前,从 G 到 4G 的路径显然并不直观。4G 中的 4 透露了答案,也就是说,连接这两点的路径可以通过从 G 出发走三步来找到。然而,如果 G 和 4G 被标记为 A 和 B,则可能需要很长时间才能猜出如何从一个点到达另一个点。换句话说,如果你只知道起点和终点(即公钥),则很难猜出路径(即私钥)。但是,如果你知道起点和路径,那么计算终点就很容易了。就比特币而言,这意味着即使某人知道包含你资金的比特币地址(这是基于公钥的),他也无法通过该地址推算出你的私钥来花费这些比特币。
使用 ECDSA 签署比特币交易
现在我们已经选择了p、a、b和 G,并确定了阶n,我们拥有了创建公钥/私钥对所需的所有信息,可以按照表 7-5 中的步骤进行操作。⁷
表 7-5: 使用 ECDSA 创建公钥/私钥对,假设p = 67,a = 0,b = 7,G = (5,47),n = 79
| 步骤 | 说明 | 示例 |
|---|---|---|
| 1 | 生成私钥d,它可以是从 1 到(n − 1)之间的任何整数。私钥应该难以猜测。可以使用随机数生成器或其他巧妙的方法来生成。^* | d = 从 1 到 78 的随机数选择d = 13。 |
| 2 | 通过将私钥d与生成点 G 进行点乘,生成公钥 Q。请注意,这是一种单向计算。给定 G 和 Q,很难确定d的值。 | Q = d × G = 13 × (5,47) = (7,22)(见图 7-10) |
- 一种巧妙的生成看似随机但易于记忆的私钥的方法是通过构造一个口令短语(即克劳利和佐藤坐在树上),然后将其输入到加密哈希函数中,输出一个整数。这被称为使用脑钱包(brainwallet)。由于比特币使用的曲线上的点数略少于 2²⁵⁶(因为p值比我们使用的要大得多),脑钱包可以使用 SHA256 哈希函数(因为它的输出是 256 位的)。

图 7-10:以下是我们在进行点乘以创建数字签名时“经过”的 13 个点。
现在让我们来看一下如何使用我们的私钥和公钥(或者比特币交易)来签名消息:接收者需要我们至今为止计算出的所有值,除了私钥,即 p、a、b、G、n 和 Q,以验证签名的有效性。假设我们的消息是:请更新区块链,将 5 个比特币从 Crowley 转给 Satoshi。签名消息的步骤列在表 7-6 中。
表 7-6: 使用 ECDSA 签名消息,假设 p = 67,a = 0,b = 7,G = (5,47),n = 79,d = 13
| 步骤 | 指令 | 示例 |
|---|---|---|
| 1 | 计算消息的哈希值 h。比特币协议使用 SHA256 函数来实现此目的。哈希的输出需要小于 n,因此我们需要计算 h = SHA256(message) (mod n)。 | h = SHA256(“请更新区块链,将 5 个比特币从 Crowley 转给 Satoshi”)(mod 79) = 46 |
| 2 | 选择一个介于 1 和(n − 1)之间的随机整数 k。 | k = 从 1 到 78 的随机整数 选择 k = 6。 |
| 3 | 计算点 (r, *s**) = kG。 | (r, *s**) = k × G = 6 × (5,47) = (46,27) |
| 4 | 找到 s 使得 s × k (mod n) = (h + (r × d)) (mod n)。签名是数字对 (r, s)(除非巧合,否则不是椭圆曲线上的点)。 | 左边:s × k (mod n) = s × 6 (mod 79) 右边:(h + (r × d)) (mod n) = (46 + (46 × 13)) (mod 79) = 12 左边 = 右边,当 s = 2 时 |
当消息被签名时,接收者将需要 p、a、b、n、G、Q 和签名对 (r, s)(当然还有消息)。然而,p、a、b、n 和 G 是比特币协议的标准参数,因此不需要与每个交易共享。唯一需要共享的特定于您消息的信息是 Q、(r, s) 和消息。消息接收者可以使用表 7-7 中的步骤来验证您是否用私钥签署了消息。
表 7-7: 使用 ECDSA 验证签名,假设接收者得到了 Q = (7,22),(r = 46,s = 2) 和消息
| 步骤 | 指令 | 示例 |
|---|---|---|
| 1 | 重复计算消息的哈希值以获得哈希:h = SHA256(message) (mod n) | h = SHA256(“请更新区块链,将 5 个比特币从 Crowley 转给 Satoshi”)(mod 79) = 46 |
| 2 | 找到 w 使得 w × s (mod n) = 1 (w 是 s 的 模逆)。 | w × s (mod n) = 1 w × 2 (mod 79) = 1, w → 40 |
| 3 | 计算 u = h × w (mod n)。 | u = h × w (mod n) = 46 × 40 (mod 79) = 23 |
| 4 | 计算 v = r × w (mod n)(如果 u 和 v 相同,那只是巧合)。 | v = r × w (mod n) = 46 × 40 (mod 79) = 23 |
| 5 | 计算 (tx,ty) = uG + vQ。 | (tx,ty) = u × G + v × Q= 23 × (5,47) + 23 × (7,22)= (11,47) + (2,22) = (46,27) |
| 6 | 如果 tx = r,则签名有效。 | tx = 46, r = 46,签名有效 |
在我们的汽车示例中,我们通过将消息与汽车行驶到目的地途中经过的一个点关联,能够以类似的方式签名消息。然而,这里是这个类比的局限所在:在汽车示例中,提供汽车行驶路径的某些信息会泄露出一些关于汽车行驶路径的线索,从而稍微泄露了中本聪地址的秘密。使用表 7-7 中的数学公式可以证明,签署一份文档并不会提供任何有用的信息,因而不会泄露私钥。我们可以签署任意多的文档,而私钥将继续保持完全隐匿。
所以,这就是比特币是如何被花费的。当你用私钥签署比特币交易时,比特币网络中的其他节点可以检查你的签名是否有效(通过匹配公钥和交易内容),并安全地确认是你授权了该交易。当然,如果你的私钥落入不法分子之手,别人就可以签署交易并窃取你的比特币。
请注意,直到你真正需要花费比特币时,才需要分享公钥。虽然原则上提前分享公钥在签署交易时应该没有问题,但有可能会发现 ECC 中的某个弱点,攻击者只要有足够的时间和计算能力,就能从公钥推算出私钥(即给定方程 Q = dG 中的 G 和 Q,推算出 d)。那么,为什么如果不必要要给攻击者额外的时间呢?如果攻击者不知道你的公钥,那么推算出私钥的能力会大大降低。出于这个原因,比特币用户共享的通常是地址而不是公钥。
本书前面详细描述的比特币地址实际上是公钥的哈希值,使用 SHA256 和 RIPEMD160 哈希函数生成。首先,将公钥输入 SHA256 哈希函数,然后将输出作为输入传递给 RIPEMD160 哈希函数。最终得到的双重哈希值以标准方式生成比特币地址。^(8) 当你从比特币地址花费比特币时,你必须提供你的公钥,其他人可以通过重复相同的双重哈希计算来检查公钥是否与比特币地址对应(当然,签名证明了你拥有私钥)。
在加密学中,双重哈希方案产生了极其强大的安全性。仅凭一个比特币地址,攻击者想要猜测私钥,需要同时在三种不同的加密方法——SHA256、RIPEMD160 和 ECDSA——中发现弱点。如果其中一种方法发现了弱点,而其他方法没有问题,那么在任何人的比特币面临风险之前,会有时间更新比特币使用的加密方法。
比特币加密技术的安全性
对于那些刚接触比特币的人来说,一个常见的焦虑是,是否比特币所使用的加密技术足够安全,能够抵御威胁。一个拥有强大计算资源的大型政府是否能够破解比特币的加密技术?一个非常聪明的黑客是否能摧毁整个系统?未来的超级强大计算机,比如量子计算机,又如何呢?
这些是当一个人在决定比特币是否是一个稳健的协议以及是否值得投资时,应该有的健康担忧。每个比特币私钥都是介于 1 和 2²⁵⁶之间的一个数字,理论上,计算机可以继续生成数十亿次、数万亿次的数字,直到找到一个能够访问你比特币的数字。然而,2²⁵⁶是一个非常大的数字;实际上,它大约是 10⁷⁷,即一个后面跟着 77 个零的数字。换个角度看,地球上的原子大约是 10⁵⁰个。如果你随机选择一个地球上的原子,然后再随机选择第二个原子,那么你选择到同一个原子的概率将会显著高于随机猜测某人的私钥。
一个基于尚未发明的未来技术的超级强大计算机,能否猜出一个私钥?理论物理学家估算出,执行最简单计算(将 0 变成 1 或反之)所需的最少能量是至少 3 × 10^(−21) 焦耳(这被称为兰道限制^(9))。一个每次计算都使用这种能量的计算机,理论上将是热力学定律允许的最有效计算机。如果你能够利用太阳的 100%能量(不仅仅是落在地球上的那小部分,而是整个太阳的能量,假设你建造一个完全包围太阳的完美太阳能面板球体),而且没有任何损耗,你理论上每年能够捕获 10³⁴焦耳的能量。如果你用这笔能量持续 100 年,并将所有能量都输入到这个为单一目的(猜测某人比特币私钥)设计的最高效计算机中,它理论上只能执行 10⁵⁵次计算。当然,计算私钥比翻转 0 为 1 要复杂,但即便我们假设这台计算机可以计算 10⁵⁵个私钥,它也会在甚至没有一万亿分之一的机会正确猜中之前就用完能量。
总之,无论未来技术如何发展,物理上是不可能创造出一台通过随机猜测私钥窃取比特币的计算机。然而,这并不能消除一个担忧,即比特币使用的加密方法中可能存在某种弱点。也许像我们想象的那样,通过比特币地址反向推算出私钥并不那么困难。在这里,重要的是要注意,比特币使用的加密方法是政府和大公司用于确保通信、金融交易和网络安全的标准方法。如果比特币所使用的加密方法存在弱点,那么全世界所使用的方法也就存在弱点。
同样,如果发现加密标准存在弱点,需要使用新的方法,则可以在不影响比特币功能的前提下更新比特币使用的方法。未来可能会使用 SHA256 算法的新版本,或者 ECDSA 可能会被替换为其他数字签名算法。然而,比特币对加密技术的依赖总体上不会改变。
最终结论是,比特币的加密技术具有坚实的技术基础。如果黑客真的窃取了你的比特币,更可能的情况是,黑客是通过发现特定实现中的加密漏洞,或者通过我们讨论过的其他方法(例如通过计算机病毒窃取你的私钥)来实现的。黑客通过发现加密数学原理中的漏洞来窃取你的资金的可能性要小得多。
椭圆曲线点加法和点乘法的伪代码
为了跟随本章早些时候提到的椭圆曲线数字签名示例,你需要能够使用模运算正确地计算椭圆点加法和点乘法操作。以下是这些操作实现的伪代码:
Assumptions: p, a, b, G, and n are defined elsewhere
Elliptic curve point summation (ECPS): A + B = C
ECPS(A,B) returns a point on the elliptic curve, C
Begin
If A is the zero point then return C = B➊
If B is the zero point then return C = A
If Ax != Bx then➋
find inv such that inv*(Bx – Ax) (mod p) == 1
lambda = (By – Ay)*inv (mod p)
Cx = lambda² – Ax – Bx
Cy = -Ay + lambda*(Ax – Cx)
return C = (Cx (mod p), Cy (mod p))
If Ax == Bx and Ay != By then return C = the zero point➌
If Ax == Bx and Ay == By then➍
find inv such that inv*2Ay (mod p) == 1
lambda = (3*Ax² + a)*inv (mod p)
Cx = lambda² – 2Ax
Cy = -Ay + lambda*(Ax – Cx)
return C = (Cx (mod p), Cy (mod p))
End
在这个椭圆曲线点加法(ECPS)伪代码中,它允许你将椭圆曲线上的两个点相加以生成第三个点,我们首先检查 A 或 B 是否是零点 ➊(回想一下,这是椭圆曲线上的唯一特殊点,本质上位于无限远处)。接下来,我们处理两个点具有不同* x *位置的典型情况,并且我们不需要担心点之间的斜率被零除 ➋。然后,我们处理斜率确实为零的情况,这迫使 C 位于零点 ➌。最后,我们处理 A 和 B 相同的情况,在这种情况下,我们需要使用数学导数来计算 C,通过点的切线来计算 ➍。
Elliptic curve point multiplication (ECPM): kA = C
ECPM(k,A) returns a point on the elliptic curve, C
Begin
C = A
Do the following k times:
C = ECPS(C,A)➊
return C
End
对于椭圆曲线乘法,我们只需重复运行 ECPS 函数➊。这是非常低效的!实际上,这种点乘法的方法低效到,已不再是一个“单向”函数。计算公钥(已知私钥)和猜测私钥(已知公钥)同样困难。对于本章使用的少量点,使用我们这种暴力破解的方法是可以的,但在实际应用中,需要采用更高效的点乘法方案。我们将此留作读者的练习。
第八章:8
比特币挖矿
新的比特币是通过比特币挖矿创造的。从某种意义上说,比特币挖矿类似于挖掘黄金:它需要时间和精力——因此才有了“挖矿”这一术语。挖黄金和挖比特币的区别在于,比特币矿工使用电力和计算劳动力,而不是体力劳动。挖矿也是将新的比特币交易添加到区块链或公共账本的过程。通过将一个新的交易区块添加到区块链中,添加该区块的矿工将获得新铸造的比特币(以及作为交易费用的旧比特币)。
每个区块挖掘出的新比特币数量正在逐渐减少,并将继续减少,直到所有 2100 万个比特币被挖掘出来。但与挖掘黄金不同,比特币矿工确切知道剩下多少比特币可以被挖掘。到 2140 年,每一个比特币都会被挖掘出来,并进入流通。
尽管挖掘比特币潜在地可能是有利可图的,但并非每个人都适合。从某种意义上来说,就像黄金一样,大多数人,即使他们非常渴望获得黄金,也不会自己去挖掘。类似地,挖掘比特币以获取利润是具有挑战性和风险的。你应该挖比特币吗?可能不应该。在这一章中,我们将探讨其困难和风险,但简短的答案是,决定是否挖比特币就像决定是否挖黄金一样。要想在经济上有意义地挖掘黄金,需要具备高度的专业知识、获取廉价劳动力和电力、筹集(并承担风险!)大量资本,并且等待数年才能看到投资回报。如果你正在阅读这本书,最好把比特币挖掘交给专业人士来做。然而,如果你并非为了利润,而是仅仅为了娱乐挖掘(少量)比特币,完全可以这么做!
为什么需要比特币挖矿?
每当有人创造一种新货币时,通常会出现一个尴尬的问题:他们需要弄清楚如何分发新铸造的钱。如果是政府创造货币,这个问题很容易解决,因为政府可以直接补偿自己,并用这笔钱支付政府服务。(或者,就像在美国一样,政府可以利用联邦储备和国债承销的复杂方案,最终达到相同的结果,提供联邦政府可以使用的资本,这些资本源自铸币过程。)然而,如果你是在创造像比特币这样的去中心化货币,且没有中央方参与,分发新铸造的钱就变得出奇困难。比特币设计的部分智慧在于,中本聪找到了一个合理的分发比特币的方式。货币将分发给那些愿意进行计算工作来保护网络的人,也就是矿工。
由于保护比特币网络需要付出努力、时间和金钱,任何愿意做这项工作的人都应获得金钱奖励。因此,中本聪使用比特币作为矿工激励的策略,作为一种去中心化的机制来分发新币,并通过挖矿过程创建了一个致力于保护网络的社区。让我给你讲个小故事,帮助你理解挖矿是如何保护比特币网络的。
两位将军的寓言
“胖王死了!”他们在国王死后的那天,在加密城镇公国的大街小巷喊道。卡尔国王在平民中不受欢迎,因为他对农民的残忍,唯一能与他的体型相媲美的就是他的暴虐。不幸的是,他的儿子克劳利同一天被加冕为国王,人们认为他极其像父亲。
基于这些原因,北方将军和南方将军联手策划推翻君主制。他们迅速征服了城堡墙外的大部分领土。要解放这个土地免于暴政的唯一任务就是攻占加密城堡!

两位将军的军队聚集在城堡的南北两侧。城堡的东西两侧是克拉格利山脉,这是一片险峻的山脉,悬崖陡峭,历代许多加密城镇的居民都葬身其中。

在城堡的南边,南方的将军惊呼道:“是时候进攻了!我将向北方发送进攻的消息!”然而,接着将军想到,他的信使必须穿越克拉格利山脉。如果途中出了什么差错,导致消息未能传达怎么办?如果发生这种情况,他——南方的将军——就会单独进攻城堡,可能会被敌人击败。于是,南方的将军修改了计划:“我将向北方发送进攻的消息,并要求北方将军回复确认,表示他收到了我的消息!”
当北方的将军收到消息时,他宣称:“太棒了!我们肯定会胜利!我将把确认消息发送到南方。哦,不过,为了确保万无一失,我会让南方的将军回个消息,以确认他收到了我的确认。我当然不想单独进攻城堡。”
收到确认消息后,南方将军断言:“太好了,我们差不多准备好了。现在我只需要等北方发送确认,确认将军收到了我的确认确认。胜利就属于我们——或许是明天!”
那天晚上,克劳利国王的手下悄悄潜入南北营地,在将军们睡觉时将他们暗杀。
将寓言应用于比特币
在两位将军的故事中,两方需要就一个计划达成共识。然而,他们的沟通方式依赖于不可靠的媒介——必须穿越险峻山脉的信使。因此,他们天真的尝试达成共识,导致了一个关于确认的无限循环,最终导致了他们的灭亡。那么,将军们是否能采用其他策略来协调他们的攻击呢?
这个寓言基于一个古老的数学难题,在比特币存在之前就已经被研究过。这个问题的简短回答是,将军们永远无法百分之百确定另一位将军已经同意参与攻击,这一点可以通过数学证明。^(1)
这个问题的更广泛版本,称为拜占庭将军问题,与前面的寓言相同,只不过涉及的不仅仅是两位将军。在这个更广泛的版本中,涉及的不止两支军队,我们不仅可以假设消息是不可靠的,还可以假设其中一位或两位将军可能与克劳利国王暗中合作,向其他将军发送误导性的消息。
这正是一个去中心化的加密货币需要解决的问题:即如何确定通过网络发送的哪些比特币交易是有效的?换句话说,如果两笔冲突的交易通过网络发送,并且涉及相同的比特币,那么应该优先处理哪一笔交易?事实上,比特币为拜占庭将军问题提供了一种概率性解决方案。

本质上,将军们需要挖掘区块,这需要大量的计算资源来解决。在这些区块中,他们会指出攻击应发生的确切时间。此外,一旦某位将军发现另一位将军已完成一个区块,这位将军应停止自己创建新的独立区块的努力。相反,每位将军应创建一个包含“我确认同意 ABC 将军区块中的时间”这一信息的区块。然后其他将军应创建自己的区块以链接到这个新区块,并包含“我确认同意 XYZ 将军对 ABC 将军区块中时间的确认。”通过不断重复这个过程,这些区块将形成一个区块链,并增强最初区块中建议的时间(即创世区块)的权重。这个确切的区块链策略是中本聪在创建比特币后不久描述的。^(2)
然而,关于该算法的描述仍然有一些未解之谜:我们是不是又回到了原点,不断堆积确认,直到无穷无尽?令人惊讶的是,答案是不。由于创建区块需要计算工作,每生成一个新块作为对先前区块的确认,就提供了关于整个将军群体拥有的总计算能力的统计信息。因此,当某个创世区块比其他创世区块多积累大约六个确认时,几乎(但不完全)可以确定大多数将军已经达成一致,支持建议的攻击时间。(然而,由于这是一个概率性解决方案,确定性始终略低于 100%,这也是为什么原始的“两将军问题”在纯理论意义上仍被认为没有解决。但是通过中本聪的方法,确定性可以非常接近 100%。)
然而,使用工作量证明和区块链来协调将军们的攻击这一方法仍然存在一个微妙的缺陷:一个懒惰的将军可以通过不使用她的计算机进行挖矿来欺骗网络。由于区块是通过解答挖矿难题随机分配的,任何一个将军都可以在整个过程中保持计算机关闭——节省电力——但仍然从共识中获益。没有人会发现她逃避了责任,因为无论如何,并不是每个参与者都会成功挖到区块。但在比特币的情况下,中本聪有一个天才之处,他加入了一个额外的细节来解决这个“搭便车”问题:系统会用比特币作为奖励支付给矿工!通过支付丰厚的奖励,比特币网络始终保持着足够数量的矿工,这在没有内建货币的拜占庭将军问题的简单解法中是无法实现的。
现在你已经对比特币挖矿及其重要性有了很好的概念理解,接下来我们将深入探讨比特币挖矿是如何帮助防止网络攻击以及如何促进新货币的分发。
通过挖矿防止攻击
挖矿是如何防止攻击的?在设计一个点对点支付网络时,创建者必须假设网络中的一些节点会试图欺骗其他节点,而且网络中的所有节点都会按自己的利益行事。那么,比特币网络可能出现什么问题呢?一个明显的问题是有人可能会创建一个交易,将自己分配一百万个比特币。然而,由于所有比特币账户的公共记录存在于区块链中,任何人都可以轻易识别出某人在试图把自己没有的钱转给自己;除非一个人能提供一个有效的签名,证明交易中使用的比特币地址包含一百万个比特币,否则比特币网络中的其他节点将不会接受这个交易。
然而,更难以发现的问题是,当一个节点创建一个账本,其中包含一笔消费自己比特币的交易(她可以为此创建数字签名),然后产生第二个账本,在这个账本中这些比特币没有被消费(或者被发送到其他人)。一个恶意节点可以先在区块链中添加一笔交易,将比特币发送给你,然后在你给她一些有价值的东西(例如,一块蛋糕)后,她可能会创建一个新的账本,其中这笔交易根本不存在。第二个账本将与第一个账本发生冲突,因此这种滥用行为肯定不会被忽视,但也无法明确知道哪个账本是正确的。可以推测,第一个账本是正确的,任何随后创建的与之冲突的账本都是无效的(毕竟,你已经把蛋糕给了她)。但是网络中的节点可能会对哪个账本先出现产生分歧(尤其是那些具有恶意意图的节点),而且没有中央权威,谁来判断哪些节点是正确的呢?比特币挖矿解决了交易排序的问题,让每个人都能达成共识,知道哪些交易先发生。
每个比特币用户不断从网络中的其他用户那里接收区块。这些区块可能属于比特币区块链中不同的、相互竞争的分支,因此代表着真实账本的冲突版本。因此,运行在每个用户计算机上的软件会不断评估网络上出现的区块,并决定哪个区块最可信,最有可能成为未来被接受的区块链的一部分。它是如何做出决策的呢?
它简单地选择包含最多区块的那个(即,最长的区块链)。这被认为是最旧的,因此最先出现。一个包含 12 个区块的区块链比包含 7 个区块的区块链存在得更久。然而,这种决定信任哪个链的方法只有在恶意节点不能创建第二个账本、立刻向其添加 10 个(或更多)区块并使其看起来像第二个账本早于第一个的情况下才能奏效。
因此,比特币软件会检查在竞争分支中添加每个区块所需要的计算工作量。用来添加区块的工作量是容易验证的(他们称之为工作量证明算法,因为你可以证明你做了这项工作)。具有“最多工作量”的分支通常是最长的那个(即,包含最多区块的那个),但是如果有人通过创建一个包含大量“简单”区块的长分支来作弊,那么它不会被算作有效。为了让恶意节点创建第二个账本、删除他旧的交易并说服其他人他的账本是第一个,他必须比网络的其余部分更快地添加区块。实现这种欺诈的唯一方式是私下控制比整个比特币网络还多的计算能力。这种滥用被称为51%攻击,而且有充分的理由解释为什么它从未发生过。
执行 51%攻击的唯一方式是比网络中其他所有人加起来更大规模地投资比特币挖矿,而获得的唯一优势是能够双重消费自己的比特币。但这样做的奖励是有限的:这种攻击将削弱人们对比特币系统的信任,攻击者的比特币也会贬值。
假设有一个恶意攻击者决定进行这样的投资。那么,什么更具利润:滥用账本还是收集挖矿奖励?比特币挖矿的经济激励强烈支持后者。因此,如果有人确实积累了滥用系统的能力,唯一的经济优势将是诚实地使用这种能力,并且简单地比其他人更好地挖矿比特币。
通过挖矿分发新货币
正如本章开始时提到的,除了正确地排序交易外,比特币挖矿还作为一种分发新数字货币的机制。创造一种新货币并广泛分发并不是一件容易的事。中本聪本可以最初将 2100 万个比特币分配给自己,然后随意发放。但那样的话会显得有些随机,最有可能的是无法创造出一种有意义、有价值的货币。
由于比特币的设计目标是有限供应的货币,矿工不能无限期地生成新的比特币。这意味着中本聪需要以某种方式选择一个时间点,到那时所有比特币将被生成。如果所有比特币都在比特币的第一年就被生成出来,这种货币将过于偏向早期采用者。相反,如果比特币生成得太慢,新的参与者可能没有足够的动力去冒险并将他们的计算能力投入到这个名为比特币的新奇项目中。而且,如果比特币生成得如此缓慢,以至于需要数千年才能挖完所有比特币,那么比特币可能不会被视为有限的商品,而是作为一种供应不断膨胀的资产。无论是好是坏,中本聪选择了一种方案,根据该方案,比特币将在一个世纪的时间里分发,每四年大约减半一次,直到总量最终达到 2100 万(见图 8-1)。

图 8-1:比特币随时间的奖励变化:左侧图表显示了比特币奖励的计划,直到 2031 年。右侧图表将时间范围延伸至 2169 年。
左侧图表显示了直到 2031 年,比特币的总流通量。正如你所看到的,流通中的比特币数量持续增加,但增速随着时间的推移变慢,因为区块奖励会在固定的时间间隔内减半。因此,矿工每隔几分钟获得的比特币数量(她在挖矿竞赛中获胜时)在未来几年将会大幅减少。
到 2031 年,约 2100 万个比特币将几乎全部分发完毕。然而,少量的比特币将会在那之后继续分发。右侧的图表展示了直到 2169 年的分发计划。比特币在前五年内的成功表明,中本聪在估算比特币分发速度时至少是对的。
当所有比特币都被挖掘完后,比特币挖矿将不再具有分发的目的;而仅仅成为一个安全处理交易的机制。
那时人们还会继续挖比特币吗?公共账本会发生什么?在比特币全部挖完后,作为比特币矿工的奖励将不再是新生成的比特币,而仅仅是用户支付的交易费用(这些费用未来几年可能会相当可观)。
比特币挖矿是如何工作的?
比特币涉及一个遍布全球的计算机网络,这些计算机不断地相互广播和转发新的交易。该网络中的每台计算机都是一个节点。由于比特币的去中心化性质,一些节点可能会在随机的时间出现或消失,而不会影响整个网络。不存在特别的中央节点。
节点可以分为三类:仅广播交易的节点;广播并转发交易的节点;以及广播、转发并创建带有交易的新区块的节点。每种类型的节点都需要比上一类节点更多的计算资源。三者中的最后一种包括比特币矿工节点,需要最强大的计算机。
当一个比特币节点启动时(即当你在计算机上启动比特币软件时),它通过互联网连接到其他节点,形成一个有些杂乱无章(但也很强健)的网状网络。网状网络没有中央节点来管理流量。相反,所有节点平等地共享跨网络传播信息的责任。
图 8-2 展示了比特币网状网络的一个小片段可能的样子。

图 8-2:比特币网络的概念图。圆圈代表节点,所有节点通过网络连接(用线条表示)与其他节点随机连接。交易和新挖出的区块持续通过这个网络进行广播。
在这张图中,你可以看到例如当你用比特币购买一杯咖啡时会发生什么。你很可能会通过手机进行操作,并且运行的是最基本类型的节点——仅广播节点(图中顶部标记为B的圆圈)。交易步骤如下:
1. 启动节点(你的手机)创建一个交易,将你的比特币转移到咖啡店拥有的比特币地址。然后,这个节点会立即将该交易发送到网状网络中的同伴节点,这些节点很可能是转发节点。
-
中继节点只是将这个交易传播到其他中继节点,允许交易迅速传播到网络的每个角落并被每个人接收。实际上,这并不像看起来那么简单,因为中继节点需要提防恶意或垃圾交易:如果一个中继节点只是转发任何消息,比特币网络将迅速在大量垃圾交易中崩溃。因此,所有中继节点会检查交易的格式是否正确,确保其具有有效的签名,并查阅最新版本的区块链,以确保交易所花费的资金确实在源账户中可用。
-
如果交易通过验证,它将在几秒钟内到达网络上的所有矿工节点。这些矿工节点将此交易加入一个初步的区块中,并会尝试进行挖矿(我们稍后会更详细地描述这个过程)。
-
如果挖矿成功,新挖出的区块将会被广播到整个网络,确认该区块的交易并给予矿工矿工奖励。虽然通常需要几分钟的时间来挖掘一个区块,但一旦区块被发现,它将在几秒钟内遍布整个网络。
最终,每一笔交易必须被记录在区块链上。因此,只有广播的节点必须直接与矿工节点连接,或者通过中继节点间接连接。矿工节点还可能对交易应用特定的任意标准,例如偏好那些交易手续费较高的交易。如果手续费过低,某些矿工(或中继节点)可能会忽略该交易。然而,仅仅因为一些节点忽略了交易,并不意味着其他节点也会忽略:只要交易找到了接受它的矿工节点,这笔交易最终会被加入到区块链中。通常,矿工节点会尽量收集尽可能多的交易(以收取更多的手续费)。虽然每笔交易附带的手续费很小,但一个区块中可以包含成千上万笔交易,这些手续费的总和,支付给矿工的金额可能是可观的。但由于内存限制,^(4)每个区块可以包含的交易数量有一个最大限制。因此,一些矿工会排除那些手续费过低(或为零)的交易。
尽管所有矿工节点都收集交易并将其整理成区块,但只有一个节点(幸运的那个)将其区块添加到区块链中。^(5) 幸运的矿工随后会收集到矿工奖励,这个奖励包括区块奖励(每个区块中新铸造的比特币)和所有新增区块的交易手续费。中继交易的节点和没有添加区块的矿工不会从交易手续费或其他途径获得任何比特币。
一旦幸运的矿工被选中,新区块就会广播到网络的其余部分,所有其他矿工节点将停止处理他们的旧区块,开始处理一个新的区块。那么,幸运的节点是如何决定的呢?它是通过找到 SHA256 哈希函数的一个特殊输入来解决区块的节点。
矿工如何解决区块
比特币挖矿需要大量的计算能力,但矿工们到底计算什么?他们反复计算某些信息(称为区块头)的双重 SHA256 哈希(6),这些信息在他们的新区块中会有所变化。当创建一个交易区块时,区块头包含了有关该区块的信息摘要,包括创建时间、区块内交易的哈希值和其他数据,我们稍后将详细探讨。重要的是,区块头中有一个字段用于存储一个任意数字,称为*随机数*(7),由矿工选择。事实上,这个数字是区块中唯一完全由矿工控制的部分。那么矿工是如何选择这个随机数值的呢?
一个已解决的区块(即一个将被其他节点接受为区块链一部分,并且矿工会因此获得报酬的区块)出现在区块头的双重 SHA256 哈希结果小于某个预定阈值时,这个阈值被称为难度目标。如果结果大于目标,区块就保持未解决状态。此时,矿工必须尝试不同的随机数,这个随机数包含在区块头中,因此影响哈希值。因为加密哈希函数在输入变化即使是最微小的情况下也会产生完全不同的输出,所以更改随机数值会导致整个区块头的哈希发生彻底变化。通过不断更改随机数值,最终会找到一个小于目标值的哈希输出。通常,矿工会在这个过程中将随机数递增 1,直到找到一个成功的随机数值。当找到有效的随机数时,区块就解决了。^(8)
区块的结构
让我们更详细地看看区块的结构,以便你能理解矿工的操作如何融入整个过程。从顶层来看,一个比特币区块基本上有四个部分:
Anatomy of a Block
➊ blocksize (e.g., 868 KB)
➋ block header (see below)
➌ transaction count (e.g., 1,278)
➍ list of transactions
区块大小是区块顶部的一个数字,表示整个区块的大小➊。紧随其后的是区块头➋,我们稍后会详细讨论。区块的其余部分存储了交易数量➌,然后是所有交易的列表➍。其中之一是区块奖励,矿工将其添加到区块中以自己分配一些新的比特币。这些比特币是凭空创造的。所有现存的比特币最初都起源于这样的区块奖励。
包括随机数➏在内,区块头由六个数据部分组成:
Block header structure
➊ bitcoin version number
➋ double SHA256 hash of the previous block header
➌ double SHA256 hash of all of the transactions in the block
➍ current timestamp
➎ the difficulty target
➏ the nonce
在顶部是一个版本号 ➊。它的存在是为了便于在未来比特币区块链结构发生重大变化时区分旧版和新版区块,因为比特币在不断完善。接下来,区块头包含前一个区块头的哈希值 ➋。这是一个非常重要的字段,因为这个值将区块串联成链:当矿工挖掘一个区块时,他们不仅在确保自己区块中的交易,还在确保构成当前链版本的所有先前区块中的交易。通过创建这个区块,矿工实际上是在投下一个票,声明:“我相信这是所有比特币交易的真实历史,我的区块是在其他矿工的工作基础上建立的,正如前一个矿工区块的哈希所示。”
接下来,头部包含当前区块中所有交易的哈希值 ➌。当比特币网络中的一个节点从其他节点接收到一个区块时,这个哈希值使它们能够验证区块中的交易是否被篡改;交易的哈希值必须与该字段中的值完全匹配。
随后,一个时间戳 ➍ 表示区块的创建时间。大多数情况下,比特币忽略现实世界的时间。事实上,在区块链中挖矿区块可以被看作是一个原始的顺序时钟,这个时钟通过新挖掘的区块的滴答声来表示,比特币唯一考虑的时间概念就是这个时钟的滴答。
然而,设置区块难度是比特币需要识别现实世界时间的一个特定实例。区块难度 ➎ 是通过前一个区块的时间戳定期计算的,也是区块头的一部分。因为比特币的设计是大约每 10 分钟解决一个新区块,所以它需要一种方法来衡量区块之间在最近过去的间隔时间,这就是时间戳字段存在的原因。如果比特币的难度不基于现实世界的时间定期调整,其区块速率将取决于该货币的流行度。因此,如果比特币变得过于流行或不够流行,网络可能会变得不稳定。在这两种情况下,区块速率将变得不合理,比特币网络将不再正常运行。
那么,难度目标值是如何决定的呢?当比特币创建时,目标被设置为这个特定的简单数字:
26959535291011309493156476344723991336010898738574164086137773096960
≈ 2.7 × 10⁶⁷ 或 2²²⁴
为了更好地理解这个值,SHA256 哈希函数输出的值介于 0 和 2²⁵⁶ 之间(约 1.16 × 10⁷⁷),而这个目标要求输出必须小于 2²²⁴(大约是最大输出的十亿分之一)。这类似于要求一个生成 0 到 1 之间值的随机数生成器必须输出小于 0.000000001 的数字,才能解决一个区块。这个目标值是比特币使用过的最容易的值。在 2009 年,大多数普通个人计算机每秒可以计算大约 100 万次哈希,也就是 1 兆哈希每秒(MH/s)。因为哈希小于这个目标值的几率是十亿分之一,1 MH/s 的计算机大约需要 1,000 秒(约 17 分钟)才能有较大的机会^(9)解决一个区块。
如果一台更快的计算机开始以 2 MH/s 的速度进行挖矿,目标值会自动降低,以减少找到区块的几率(从而使得时间变得更长)。区块链头部存储的难度表示为比特币(最初启动时使用的)初始目标与当前目标之间的比率。最初,难度等于 1(因为最初的目标就是当前的目标),此后它大部分时间在增加。如果哈希率下降(例如,由于计算机退出网络),以致于区块的发现速度比十分钟平均速度更慢,难度会下降(在比特币的前五年里,这种情况发生得非常少)。
正如你所看到的,目标数值非常大且不易操作。因此,在讨论比特币挖矿时,通常会计算一个难度,即当前目标数值与中本聪创世区块上的目标数值之间的比率:

难度并不会立即根据哈希率的增加或减少而调整。相反,难度每当区块链增长 2,016 个区块时才会调整,这大约每两周发生一次(2,016 × 10 分钟 = 14 天)。如果挖出 2,016 个区块的时间少于两周,难度会增加;但如果超过两周,难度会减少。
在最初的五年里,比特币的挖矿难度从 1 增加到了超过 500 亿。在这个难度下,一台普通的个人计算机(如平板电脑、笔记本电脑等)要解决一个区块可能需要每 350 万年才有一次机会!这个难度对应的网络哈希率约为 360,000,000,000 MH/s,或 360 拍哈希每秒(PH/s)。全球所有传统超级计算机的哈希率加起来都不到 1 PH/s。
用于比特币挖矿的计算能力的惊人增长来源于更广泛的应用和越来越专业化的硬件的使用。在第一年,大多数矿工使用他们笔记本电脑上的 CPU 来挖掘比特币。后来,人们意识到他们可以重新利用原本为要求较高的电脑游戏设计的显卡来挖掘比特币。这些显卡,特别是其中的图形处理单元(GPU),比 CPU 快了数千倍且更加节能。不久之后,硬件开发者发现,他们可以使用现场可编程门阵列(FPGA),这是一种用于计算机芯片原型开发的专业设备,来比 GPU 更快地挖掘比特币。直到这一点,没人专门制造用于挖掘比特币的硬件。GPU 和 FPGA 是现成的硬件,只是被重新用于比特币挖矿。然而,当比特币经济变得庞大时,计算机芯片开发者开始觉得制造专用集成电路(ASIC)来挖掘比特币是值得的,就像图 8-3 中的那种。

图 8-3:Avalon 公司的一台早期 ASIC 比特币挖矿机。排列成网格的小芯片是每个定制的 ASIC 芯片,旨在执行比特币哈希操作。
这些单一用途的计算机芯片是专门为以最快、最节能的方式挖掘比特币而制造的。比特币 ASIC 被优化用于计算 SHA256 哈希。如今,几乎所有比特币挖矿都是使用基于 ASIC 的硬件完成的。通过设计具有越来越小特征(从 130 纳米到 65 纳米,再到 28 纳米等)的芯片,速度和效率不断提升。因此,每单位面积上可以进行更多的计算。硬件性能的每一次突破都会导致网络哈希率按数量级增加(见图 8-4),尤其是在比特币价格上涨的同时(进一步证明了对挖矿硬件的资本投资是合理的)。

图 8-4:比特币网络上随着时间推移执行的计算量(以太哈希为单位,或每秒万亿次哈希)。左侧的图表使用传统的线性坐标系,2013 年 ASIC 矿工的巨大计算能力使得所有先前的挖矿方法相形见绌。右侧图表则使用对数坐标系来显示网络的哈希率,这使得我们可以更清晰地看到网络计算能力的进展,从 CPU,到 GPU,再到 FPGA,最后到 ASIC 挖矿。
在 50 亿的难度下,一台能够达到 10 TH/s 的比特币矿机大约每 8 个月才能找到一个区块,这是平均时间,且波动性可能非常大。对于那些希望获得更稳定收入的比特币矿工来说,最好的做法是与其他矿工联合挖矿,这种方式被称为联合挖矿。
联合挖矿
尽管网络每大约 10 分钟就会解决一个区块,但个体矿工可能几个月才会解决一个区块。面对如此不可预测的收入流,规划和运营比特币挖矿可能会非常困难。为了让奖励更加规律和可预测,大多数没有控制巨大计算能力(即,占网络哈希率超过 1%)的矿工都会加入矿池。
矿池是指矿工们将计算资源集中起来,共同挖掘并分配区块奖励。从网络的角度来看,矿池是一个单一的矿工节点,但实际上,成百上千的个体矿工正在该节点内计算哈希。矿池的解决区块频率高于单个矿工;因此,矿工的收入更为频繁。当区块奖励在矿工之间分配时,通常会根据每个矿工贡献的哈希数量按比例分配。由于很难准确知道每个矿工贡献了多少哈希,通常会用计算出的股份来衡量贡献。虽然每个矿池的具体细节不同,但当矿工计算出一个小于真实目标、容易达到的哈希时,就会获得一份股份。因此,个体矿工可能需要多年才能找到一个小于真实目标的哈希,而只需几分钟就能找到一个小于矿池股份目标的哈希。矿工累积的股份数量代表了他为矿池贡献了多少算力。
通过使用矿池,一位普通的比特币用户可以尝试挖矿,并通过中等功率的计算设备(例如,可以插入 USB 接口的廉价比特币 ASIC 矿机)收集少量比特币。尽管考虑到电力成本,这可能不会带来盈利,但通过为网络贡献计算能力,积累一些微比特币还是很有趣的。
比特币挖矿盈利
你应该挖比特币吗?简而言之,可能不应该。比特币挖矿需要大量的计算能力,这需要电力、昂贵的硬件和空间。你的投资回报将严重依赖于其他矿工的数量以及他们提供的计算能力。因为网络分发的比特币数量不受矿工数量的影响,矿工越多,奖励就会越稀释。^(10) 比特币挖矿只对那些拥有最有效硬件(无论是能源还是资本效率)的矿工有利,且电力成本最低。由于硬件制造商每台挖矿设备的资本成本最低,许多盈利的比特币挖矿公司自己制造硬件。这些制造商还可能雇佣自己的研发工程师设计更新、更高效的计算芯片(即 ASICs)用于比特币挖矿。总而言之,比特币挖矿是一个极具竞争力的行业,并且随着比特币的普及,可能会变得更加竞争。
或许如果你拥有自己的风力发电场或太阳能电池板阵列,并且有更多的电力,不知道如何使用,你可能能够通过比特币挖矿获利。但这仍然需要仔细考虑资本成本和与直接购买比特币相比的机会成本。评估比特币挖矿项目可行性的常见错误是过于看重汇率(无论你使用的是哪种货币)。你应该始终将比特币挖矿的回报与你为相同的初始投资可以购买的比特币数量进行比较。未来的汇率对你的投资决策几乎不应有任何影响。如果今天在比特币价格为每个$200 时,挖矿没有盈利,那么明天即使价格涨到每个$1,000,也无所谓;你应该直接购买比特币,而不是挖矿。
合理预测未来的哈希率也很重要。虽然不可能准确预测未来,但比特币网络的哈希率在比特币的前 10 年里很可能会迅速增加。^(11) 请看下面的示例计算,记住即使挖矿比直接购买比特币更有利可图,挖矿仍然需要付出更多的努力!
Example calculation: To mine or to buy?
Equipment: One super-duper-hashing-miner made by Miners-R-Us
Hash rate: 1 TH/s
Power consumption: 0.4 kW
Price: 5 BTC (includes shipping)
Local electricity cost: 0.001 BTC/kWh → monthly power costs: 0.30 BTC
Current difficulty: 4 billion
Time to solve a block = difficulty * 2³² / (hash rate)
= 4 billion * 2³² / 1 TH/s = 6.5 months per block
(0.153 blocks per month)
New bitcoins per block = 25 BTC
Avg. transaction fees per block = 0.5 BTC
Total mining reward per block = 25.5 BTC
Revenue per month = Total mining reward per block * blocks per month
= 25.5 BTC * 0.153 = 3.92 BTC
Scenario #1 – Difficulty increases by 100% per month
Month 1: Rev. = 3.92 BTC, Power costs = 0.30 BTC, Monthly profit = 3.62 BTC
Month 2: Rev. = 1.96 BTC, Power costs = 0.30 BTC, Monthly profit = 1.66 BTC
Month 3: Rev. = 0.98 BTC, Power costs = 0.30 BTC, Monthly profit = 0.68 BTC
Month 4: Rev. = 0.49 BTC, Power costs = 0.30 BTC, Monthly profit = 0.19 BTC
Month 5: (Power costs exceed revenue → turn off mining device!)
Total profits: 3.62 + 1.66 + 0.68 + 0.19 – 5 = 1.15 BTC (mining is profitable)
Scenario #2 – Difficulty increases by 200% per month
Month 1: Rev. = 3.92 BTC, Power costs = 0.30 BTC, Monthly profit = 3.62 BTC
Month 2: Rev. = 1.31 BTC, Power costs = 0.30 BTC, Monthly profit = 1.01 BTC
Month 3: Rev. = 0.44 BTC, Power costs = 0.30 BTC, Monthly profit = 0.14 BTC
Month 4: (Power costs exceed revenue → turn off mining device!)
Total profits: 3.62 + 1.01 + 0.14 – 5 = -0.24 BTC (better to just buy bitcoins)
如果你决定购买比特币挖矿硬件,要小心。任何出售比特币挖矿硬件的人都已经计算出,卖给你比自己使用硬件挖矿更有利可图。仔细研究供应商、硬件细节和运输时间。比预期晚几个月收到挖矿设备,可能意味着你的投资回报是正向还是负向的差别(因为网络哈希率将更高)。
理论哈希率极限
随着计算机性能变得更强大且能效更高,尤其是如果比特币的采纳继续呈指数增长,预计网络的哈希率将显著增长。它能增长到多高?如果越来越多的计算机开始挖矿,并且比特币的价格保持不变,^(12)最终每个矿工获得的比特币将无法覆盖电力成本。最终,可以认为网络哈希率的上限取决于挖矿硬件的能效(参见表 8-1)。
表 8-1: 不同类型比特币挖矿硬件的能效(计算为哈希率与功耗的比值)^*
| 挖矿设备 | 哈希率(GH/s) | 功率(W) | 每哈希能量(J/GH) |
|---|---|---|---|
| 单核 CPU 的笔记本 | 0.0005 | 100 | 200,000 |
| 高效四核 CPU 的笔记本 | 0.02 | 50 | 2,500 |
| 中端 GPU(400 核心) | 0.1 | 200 | 2,000 |
| 高端 GPU(2000+核心) | 0.5 | 300 | 600 |
| 高端 FPGA | 0.8 | 40 | 50 |
| 130 纳米 ASIC 设备 | 10.0 | 80 | 8 |
| 65 纳米 ASIC 设备 | 60 | 240 | 4 |
| 28 纳米 ASIC 设备 | 1,000 | 800 | 0.8 |
数值代表典型挖矿设备;具体设计可能会有显著差异。
要确定使用某种类型的硬件进行比特币挖矿是否盈利,我们必须结合三个因素:硬件的能效、电力成本和网络的总体哈希率。图 8-5 中的图表展示了这三个因素之间的关系。
图表中的曲线显示了考虑电力成本后硬件需要多先进。右侧的线条表示电力成本较高的情况。显然,如果电力成本更高,你需要更先进的硬件配置才能在挖矿中盈利。在这种情况下,更先进的硬件是指每消耗一焦耳能量所需的电力较少的硬件。

图 8-5:用于比较硬件效率、电力成本和比特币网络哈希率的盈利性阈值曲线。根据你当前的电力成本,可以绘制出一条曲线,表明你的挖矿硬件(以 J/GH 为单位)在某一网络哈希率下需要达到的效率,以实现盈利。如果你能绘制出一条低于你电力成本曲线的点,那么你就能够在比特币网络上盈利性地进行挖矿。*
如果比特币的价值增加,电力的相对成本降低,那么网络哈希率的盈亏平衡点将增加。如果一台挖矿设备的能效为 0.8 J/GH,电力成本仅为每千瓦时 0.01 mBTC,那么挖矿不再可行的网络哈希率将为 18,000 PH/s,相应的难度为 2.5 万亿。那么,哈希率是否可能超越目前的水平呢?
表 8-1 中的 ASIC 设计显示,随着特征尺寸的减小,每个哈希的能耗会降低。如果我们假设未来存在高效能的 14 纳米 ASIC,仅消耗 0.1 J/GH,那么在 0.01 mBTC/kWh 的情况下,盈亏平衡的哈希率将超过 100,000 PH/s。虽然目前还没有小于 14 纳米尺寸的计算机芯片,但摩尔定律^(13)一直在挑战怀疑论者的预测,即计算机芯片已经达到了最小的特征尺寸。显然,网络的哈希率有可能远远超过今天的水平。
比特币挖矿中的去中心化
比特币的成功依赖于它作为一个去中心化网络的特性。在比特币的初期,任何人都可以作为挖矿节点加入比特币网络;然而,现在挖矿主要由那些拥有资源、专业知识和资本的专业人士进行,这些资源和能力是普通人无法企及的。这一趋势是否在重新中心化比特币?这是比特币用户、矿工和开发者之间的一个辩论话题。
另一个我们尚未详细讨论的相关话题是每个区块可以包含的交易数量的限制。显然,存在一个真实的物理限制,即一个区块中不可能包含无限多的交易。然而,比特币协议中规定了一个较小的规则性限制(即,尽管物理限制可能在每个区块数百万笔交易的范围内,但规则性限制则在数千笔交易的范围内)。这一自我设限的最初目的是^(14)防止区块链被无意义的交易(即垃圾邮件)膨胀,但也有人认为这一限制有更大的作用,那就是保持去中心化。
除了拥有能够快速执行 SHA256 哈希计算的计算设备外,挖矿节点和中继节点还必须具备足够的存储空间来存储区块链的完整副本。如果构成区块链的区块变得比现在大得多,不仅矿工们需要更快的计算机,他们的系统也需要具备存储大量数据的能力(可能以大型数据中心的形式)。这将进一步增加矿工的资本需求,并不可避免地导致一些人放弃这一职业。更少的挖矿节点将使得网络逐步变得更加中心化。正因如此,一些矿工提倡将每个区块的交易数量限制在一个较小的范围内(尽管这最终会推高交易费用)。这种愿望是否有其合理性?
尽管这是一个复杂的问题,但我们可以通过黄金开采的类比来解释。黄金是一种集中控制的商品吗?只有极少数人拥有开采黄金所需的资源、时间和专业知识。然而,黄金开采并没有垄断,任何资金充足的企业都可以寻找黄金并尝试开采。类似地,尽管比特币挖矿可能不再适合普通用户,而是成为由公司和组织进行的商业活动,但单一机构永远无法获得比特币挖矿的独占控制权。不过,最好密切关注未来比特币矿工的数量变化。




第九章:9
理解不同类型的比特币钱包
在第二章中,我们推荐使用比特币钱包程序 Electrum,它是免费的开源软件,支持大多数设备,并且非常适合初学者。然而,市面上有数百种其他比特币钱包程序,从简单到复杂不等,而且随着开发者竞争推出新功能和更精致的界面,新钱包程序不断发布。但在这些更精致的界面和偶尔显得有些花哨的功能背后,一些比特币钱包程序之间仍然存在着根本的差异。本章的目的是帮助你了解这些差异,以便你可以做出一个明智的选择,选择最适合你需求的比特币钱包。
在本章中,我们偶尔会使用比特币钱包或简称钱包来指代比特币钱包程序,尽管比特币钱包通常仅指一个地址和私钥的列表。
钱包软件设计基础
至少,一个比特币钱包程序需要允许用户发送和接收比特币,并且跟踪有多少比特币可以使用。换句话说,比特币钱包程序必须能够(1)创建并广播交易到比特币网络,(2)生成新的比特币地址,和(3)扫描区块链以检测你是否在这些地址上收到了比特币。不同钱包设计之间的主要差异主要涉及这三项功能及其实现方式。支持这些差异的设计选择如下:
-
离线与在线交易签名
-
随机与确定性密钥生成(与单一密钥生成相比)
-
完整支付验证与简化支付验证
这些设计选择对所需的计算资源、存储的比特币安全性,甚至备份的性质和有效性有着重大影响。没有绝对正确的选择。有些用户更适合使用只需要一个设备和最少计算能力的钱包,而大型企业可能更倾向于选择强调安全性的程序。在接下来的章节中,我们将详细解释每个设计选择,以便你可以做出明智的选择。
离线与在线交易签名
比特币钱包程序需要私钥来签署交易,然后才能将交易广播到比特币网络。在最简单的设计中,这些私钥存储在用户的比特币钱包中,该钱包存储在用户设备上的wallet.dat文件中。这是第一个比特币钱包程序 Bitcoin-Qt 的工作方式。然而,这种设计容易受到攻击者的攻击,攻击者可能试图通过互联网远程访问设备,复制钱包文件,并尝试提取私钥。更安全的设计涉及将比特币钱包及其管理软件分为两个组件:一个包含私钥,另一个不包含私钥。包含私钥的组件通常存储在高度安全的位置,并用于交易签名。没有私钥的组件可以存储在任何地方,可能同时存储在多个位置,并称为仅观察钱包。
顾名思义,你无法直接花费存储在仅观察钱包中的资金。相反,如果你想进行购买,你需要额外的步骤,用私钥签署交易。这个第二步通常通过第二台未连接互联网的计算机完成(以防止黑客攻击),该计算机仅用于存储私钥并在需要时用它们签署交易。这种安全技术称为离线交易签名,在第三章中已在一定程度上讨论过,作为安全存储大量比特币的策略,但它也提供了其他好处。
仅观察钱包特别适用于销售点终端(例如收银机),在这种情况下,收银员需要接收顾客的比特币,但不需要(且可能没有授权)花费这些比特币。重要的是,因为仅观察钱包不存储任何私钥,如果销售点终端被盗,其包含的比特币仍将保持安全。此外,仅观察钱包可以安全地安装在手机上或从低安全性的网络服务器上运行(只需要简单的用户名和登录即可访问),以允许用户监控他们的资金,而不必担心错误的人获取到这些资金。
许多比特币钱包程序可以以两种模式之一运行:完整模式(在这种模式下,使用单一钱包程序和计算机进行所有步骤)或仅观察模式。如果一个钱包程序宣传有仅观察模式,通常意味着该软件也可以用于离线交易签名。还可以使用混合钱包,其中某些比特币地址是仅观察的,而其他地址的私钥则存储在在线设备上。因此,同一设备可以用于从低安全性的支票账户中花费资金,也可以用于监控更安全的储蓄账户。
根据新比特币地址的生成方式,观察钱包是否需要与离线组件同步有所不同。通常,一个新的比特币地址必须在离线计算机上生成,然后导入到观察钱包中(而不导入相应的私钥)。然而,使用确定性密钥生成(在下一节中描述)时,观察钱包可以独立生成新的比特币地址,而无需知道与之对应的私钥。
注意
确定性密钥生成对于销售终端非常有用,因为在涉及大量顾客的情况下,它们不会耗尽存款地址。
随机密钥生成与确定性密钥生成(与单一密钥生成)
所有比特币钱包程序都会为新用户提供至少一个随机生成的比特币地址和私钥。是否生成额外的地址以及如何生成,这是一种设计选择,可能会引发比特币开发者之间非常激烈的意见。原始的比特币钱包程序假设用户在使用完比特币后永远不会重复使用一个地址。每次用户想要花费比特币时,一定金额会发送给目标接收方,其余的比特币则会转移到一个新的、随机生成的比特币地址,这个地址被称为找零地址。这种做法有助于保护用户的隐私,因为如果一个人不断更换地址,外部观察者更难追踪该个人的比特币。无法区分比特币转移到找零地址和从一个人转移到另一个人的比特币。尽管如此,并不是每个人都喜欢这种行为;有些人认为只使用一个比特币地址更方便(就像只有一个电子邮件地址一样),并且不太关心隐私。因此,一些比特币钱包程序只提供一个单一地址,并不断重复使用这些地址。这些单一密钥生成钱包程序允许你手动生成额外的地址,但默认行为是重复使用现有地址。
在不断生成新地址的比特币钱包程序中,存在实现上的差异。回顾一下,私钥是一个 256 位的整数,通常由某种随机过程生成。从私钥出发,比特币钱包程序可以计算出相应的公钥(公钥是椭圆曲线上的一个点;有关密码学细节,请参见第七章),该公钥进一步可以通过应用 RIPEMD160 和 SHA256 哈希函数转换成比特币地址。为了生成一组私钥/比特币地址对,许多程序使用相应数量的随机数。这种方法称为随机密钥生成。每当用户需要一个新的比特币地址时,都会使用一个新的随机数作为私钥。这种方法的缺点是备份需要定期更新——本质上,每次创建新地址时都需要更新备份。在涉及找零地址的情况下尤其需要注意这一点。如果你把一些比特币发送给朋友,而余额的其余部分被发送到一个新生成的找零地址,那么很可能你的大部分资金就不再有备份了!在比特币的历史上,曾发生过一些不幸的事件,即基于随机密钥生成的钱包用户在资金被发送到新找零地址后不久删除或丢失了钱包,但在更新备份之前就发生了这一情况。
另一种方法是确定性密钥生成。在这种方法中,只有第一个私钥是随机选择的 256 位整数,称为主私钥,它对应一个主公钥。每当用户需要一个新的比特币地址时,都会选择一个与主私钥通过简单的数学关系相关的新私钥(不涉及随机性)。在最简单的实现中,主私钥仅通过加 1 来生成新密钥(例如,如果主私钥是数字 47,那么后续的私钥将是 48、49、50 等)。这种方法的优点是,当用户首次创建新的比特币钱包时,只需要创建一个备份,并且该备份永远无需更新。^(1) 事实上,这就是 Electrum 的工作方式。回想一下,在第二章中,Electrum 提示你写下一个 12 个单词的助记词用于备份。那个助记词实际上就是一个主私钥。^(2) 你在 Electrum 钱包中的所有比特币地址都可以从这个主私钥派生出来。
将确定性密钥生成与仅观察钱包结合
想象以下场景:
• 丽莎经营一家接受比特币支付的餐厅。
• 餐厅里的所有服务员都在手机上安装了比特币钱包,以便接受支付。
• 丽莎希望成为唯一能够花费发送到这些钱包中的资金的人。
很明显,如果丽莎能设置这个系统,那将是非常方便的,但这似乎是一个技术上的挑战:每个服务员都需要能够在他们的钱包中按需创建大量新的比特币地址,但丽莎仍然需要是唯一能够访问每个钱包背后私钥的人。
然而,当你将确定性密钥生成与只读钱包结合时,这种系统实际上是直接的:令人惊讶的是,竟然可以让一个只读钱包(在每个服务员的手机上运行)无需了解与之关联的私钥,就能随意生成许多新的公钥!
这就是丽莎需要做的所有事情:
1. 使用确定性密钥生成在她的电脑上创建公钥和私钥。
2. 给每个服务员一个公钥,以及一个支持只读功能和确定性密钥的程序。
3. 服务员们随后可以随意使用他们的钱包接受任意数量的支付。
4. 只有丽莎能够使用她电脑的钱包花费这些钱包中的资金。她的电脑是唯一能够为餐厅中所有比特币交易生成相应私钥的电脑。
无论你是经营餐厅、银行还是其他任何企业,拥有一种支付机制,可以让员工随意接受顾客支付,但只有你,作为企业所有者,能够解锁这些资金,这是一个强大的功能。
确定性密钥生成与只读钱包背后的数学原理
那么,如何仅使用公钥信息就能数学上生成新的密钥呢?为了解释这个问题,我们将参考有关私钥和公钥如何在数学上相互关联的密码学知识。在第七章中,我们解释了,给定一个秘密私钥,d(我们称之为主私钥),相应的(主)公钥,Q,是通过点乘运算确定的:
dG = Q
请记住,G 和 Q 都是椭圆曲线上的点,但 G 是公知的,并且是比特币协议中的硬编码常量(而 Q 是唯一属于你的)。主比特币地址是通过多个哈希函数和其他格式化操作从 Q 中派生出来的。
确定性生成一个新的比特币地址的显而易见方法是,首先选择一个新的私钥,d[new]= d + 1,然后计算相应的新公钥,Q[new]:
d[new]G = Q[new]
然而,这种生成新公钥的方法要求你知道主私钥。那么,如果你不知道主私钥呢?是否可以仅凭借主公钥的信息生成一个新的比特币地址?可以!
我们可以将 Q[new]的方程式重新写为:
d[new]G = (d + 1)G = dG + G = Q[new]
注意,dG 这个术语可以重写为主公钥 Q:
Q + G = Q[new]
结果是,我们可以仅通过知道主公钥和公共常量 G 来计算新的公钥。可以通过添加任意数量的 G 点来生成额外的公钥:
| Q + 2G = Q[two] |
|---|
| Q + 3G = Q[three] |
| ... |
当然,确定性密钥生成方法的一个危险是,如果你的主私钥落入不法之手,所有派生的比特币地址都会被泄露。此外,从隐私角度来看,如果有人看到你的主公钥(这在你将比特币发送到对应地址后会变成公开信息),此人可以推导出你后续的公钥,从而试图追踪你的支出。
虽然我们不会深入探讨数学细节,但确定性密钥生成允许实现另一个更加先进的比特币钱包功能,分层确定性钱包,这对于大型组织尤其有吸引力。主私钥可以分支成子主密钥,子主密钥可以进一步分支成子子主密钥,依此类推。每个密钥具有一个特性,使得在某一层级的任何密钥都可以访问所有下一级以下的比特币。例如,银行经理可能持有二级私钥(一级密钥由 CEO 持有),他的员工可能每人持有三级密钥。每个人共享同一个分层钱包,但经理可以访问他自己和员工的资金,而员工只能访问自己的账户。分层确定性钱包对于那些希望将比特币赠送给孩子但又想保持访问权限的家庭也可能非常有用。
完整与简化支付验证
比特币的核心特性是你不需要信任任何个人、第三方或中央机构。然而,比特币钱包程序必须能够验证它们接收到的交易是否合法。在这种情况下,区分区块链(正确列出每个有效比特币交易的不可篡改的公共文档)和某人的区块链副本是非常重要的,后者是你所访问的内容。前者是一个抽象概念,而后者是实际的现实。当你将钱包程序连接到比特币网络时,它会连接到多个节点,这些节点会向你的程序发送交易数据,但你不能假设这些数据是有效的。如果你在互联网上让一个陌生人支付你 2 BTC 来购买你出售的昂贵手表,而你连接的一个节点显示你在不久后收到了 2 BTC,那么邮寄手表是否安全?一个有效的交易需要 (1) 拥有正确的数字签名,(2) 使用源自矿工区块奖励且尚未被花费的比特币。所有比特币钱包程序都可以完全确定地验证第一个需求,但第二个问题的解决方案则取决于程序的设计,其可靠性程度有所不同。
比特币钱包程序可以通过保持自己完整的区块链副本来验证交易,这种方式称为完全支付验证,或者使用简化版的区块链副本,这种方式称为简化支付验证(SPV)。
完全支付验证钱包,也称为厚重或重量级钱包,需要完整的区块链副本。它们可以通过在区块链中逐个交易地回溯,直到找到交易发源地,从而验证用于交易的比特币是否来自一个已挖掘的区块(并且这些钱包可以检查这些比特币是否曾经被双重支付)。这些钱包程序通常是比特币网络的活跃参与者,因为它们不仅处理用户的交易,还验证并转发其他人的交易(在这些情况下,运行此类程序的计算机被称为完全节点)。所有比特币矿工也是完全节点(即,他们需要完整的区块链副本才能进行挖矿)。
完全支付验证钱包的一个问题是,它们非常占用资源并且初始化需要很长时间。区块链在第五年时的大小超过了 15GB,并包含 3500 万个交易(到十周年时,它可能会大约大 100 倍)。全新的完全支付验证比特币钱包程序可能需要几天时间(取决于带宽)来下载整个区块链。获取区块链需要连接到其他完全节点,并检查以确定哪个区块链具有最大的工作量证明总和(根据定义,这通常被视为共识区块链)。对于笔记本电脑和其他家用设备,运行完全支付验证钱包可能只是麻烦,但对于某些手机来说,这是根本不可能的。幸运的是,有一种方法可以在信任上做出微小妥协,但作为回报,可以实现更高效的交易验证。
SPV 钱包,也称为薄钱包或轻量级钱包,无法检查交易是否有效;它们只能检查全节点,特别是矿工,是否已验证这些交易。薄钱包的目标是检查交易是否已被矿工验证并包含在区块链的某个区块中。这类似于让会计师帮你平衡支票簿,而不是自己做。这种方法在矿工诚实行事并只允许有效交易被包括在内的前提下可靠有效(只要没有单一矿工控制超过 51% 网络算力,这是一个安全的假设)。但没有区块链副本,薄钱包如何知道收到的交易是否被包含在一个区块中呢?比如,交易可能声称它已经被包含在区块链的 #24371 区块中,但你如何知道这个声明是真是假呢?一种策略是让你的钱包程序连接多个全节点,并请求下载 #24371 区块以及它的所有其他交易。然后你的钱包可以仔细查看该区块中的所有交易,确认是否存在待查的交易。然而,如果你的 SPV 钱包程序每天需要检查数百个交易,而且每次都需要下载整个区块(包含所有交易),从效率的角度来看,这种策略几乎不比直接下载整个区块链更好。
SPV 的巧妙之处在于,它通过哈希函数的魔力验证交易是否包含在区块中,而无需查看任何区块中的交易。为此,SPV 钱包需要下载区块链中每个区块的头部。回想一下在第八章中提到的,每个区块包含两个部分:一个长长的交易列表和一个简短的区块内容总结(即头部)。重要的是,区块头包含了该区块中所有交易的哈希值,结构设计使得任何比特币钱包程序都能轻松地通过考虑交易的哈希值来判断该交易是否属于某个特定的区块。这个哈希结构被称为Merkle 树。^(3) 使用这种 Merkle 树设计,薄钱包可以安全地确认它们接收到的交易已被包含在区块链中,而无需下载完整的区块链。只下载区块头部所需的内存远小于下载整个区块链;因此,SPV 钱包可以轻松运行在智能手机和其他低成本移动设备上。
使用 SPV 的比特币钱包应用程序也可以提供与全钱包相同的许多安全保证,但并非所有保证。
能够在智能手机上运行一个资源密集型的比特币钱包,是一项令人印象深刻的工程成就。SPV 钱包采用了先进的计算机科学技术,但在灵活性上做了一些妥协。表 9-1 总结了我们如何通过各种因素对 SPV 钱包进行评分,并将其与完整钱包进行比较。
表 9-1: SPV 钱包与完整钱包的评分对比
| 因素 | 简化支付验证钱包 | 完整支付验证钱包 |
|---|---|---|
| 初始安装和网络同步的速度 | ![]() |
![]() |
| 新支付的速度(零确认交易) | ![]() |
![]() |
| 新支付的安全性 | ![]() |
![]() |
| 已确认支付的安全性 | ![]() |
![]() |
| 整体安全性 | ![]() |
![]() |
| 存储使用效率 | ![]() |
![]() |
| 检查任意比特币地址的能力 | ![]() |
![]() |
| 导入私钥的能力 | ![]() |
![]() |
| 对比特币网络整体健康的影响 | ![]() |
![]() |
让我们更深入地分析表格中的每一项功能:
初始安装和网络同步的速度
在初次安装后,SPV 钱包和完整钱包都需要从比特币网络中的其他节点下载区块链数据。然而,SPV 钱包只需要下载区块头和一些与它所负责维护的比特币地址相关的数据。因此,SPV 钱包能够在不到一个小时的时间内同步并准备好使用,而完整钱包可能需要数小时才能初始化完成。
新支付的速度
对于 SPV 钱包和完整钱包,网络上新(但尚未确认)的交易会迅速广播到所有对等节点。如果有人向你钱包管理的地址发送比特币,你会在几秒钟内收到通知,无论你的钱包类型如何。
新支付的安全性
一个可以访问完整区块链的完整钱包,可以迅速验证新交易,确保其发送的资金来自一个有效且资金充足的源地址。而 SPV 钱包则无法做到这一点,它依赖于网络中的其他节点来确保交易的合法性。理论上,如果有人向你发送支付,并且与 SPV 钱包所互动的(假设是随机的)节点中的某一个节点勾结,这个发送者可能会向你发送欺诈性的支付。完整钱包免疫于这种类型的攻击。
已确认支付的安全性
即使一笔交易是百分之百有效的,仅仅因为交易已被广播,并不意味着它会被纳入区块链,特别是如果花费方创建了另一笔交易,试图将资金双重支付给另一个地址。出于这个原因,最好对较大金额的购买等待三到六个区块确认。SPV 钱包和完整钱包都可以通过跟踪这些确认来验证交易。虽然完整钱包可以直接证明已挖掘到新区块的交易是真正有效的(即,来自一个完全资金充足的地址),但 SPV 钱包无法做到这一点。因此,如果矿工将一个无效的交易包含进新区块,SPV 钱包仍然可能被欺骗。但矿工这么做的可能性非常小:挖矿区块成本极高,并且根据设计,包含无效交易的区块会立即被网络中任何其他完整节点放弃,这些节点会花时间对区块进行验证。因此,矿工永远不会因为挖掘包含无效交易的区块而获得奖励。因此,发送到 SPV 钱包的已确认付款相当安全,尽管完整钱包的安全性仍然是黄金标准。
整体安全性
总的来说,一个正确编程的 SPV 比特币钱包能够提供相当好的安全性,保护你的比特币和比特币支付,尽管它永远无法与完整钱包的安全保障相匹配。如果你在智能手机上运行 SPV 钱包并收到一笔付款,你可以放心,一旦这笔付款经过几个区块确认,SPV 钱包报告的余额和其他信息可以信赖其准确性。
存储使用效率
如前所述,完整钱包存储区块链需要占用多个 GB 的磁盘空间。然而,SPV 钱包所需的存储空间不到一个 GB,并且可以在现代智能手机上高效运行。
检查任意比特币地址的能力
由于完整区块链包含所有比特币地址的余额,完整钱包可以轻松查看任何地址的余额和其他细节,甚至是你没有拥有的地址(如果完整钱包的程序员选择在他们的应用中包含此功能)。SPV 钱包完全不了解除了其直接负责的地址以外的所有比特币地址,因此无法提供此类信息。
导入私钥的能力
如果你想将一个现有的比特币地址(及其关联的私钥)导入完整钱包,完整钱包能够在几秒钟内将该地址和与之相关的资金纳入其中。SPV 钱包则没有简单的方法导入这样的密钥,因为它没有关于涉及该地址的任何历史交易的信息。因此,如果你将私钥导入 SPV 钱包(假设有此选项),你可能需要等待几分钟,因为钱包需要向其同行查询涉及新地址的历史数据。
比特币网络对整体健康的影响
为了保持比特币网络的健康,所有参与节点需要共同合作验证新的交易和区块。如前所述,SPV 钱包在验证能力方面有限。此外,SPV 钱包通常不接受传入的 TCP 连接,并且可能不会参与广播第三方交易/区块给其他节点。因此,比特币网络中如果存在大量的 SPV 节点,可能会对网络的整体健康产生影响。目前,几乎没有证据表明会有负面效应。但随着区块链年复一年的增长,不能进行完全验证的节点比例可能会增加,问题也可能随之出现。尽管如此,存储容量的提升和网络速度的加快,可能会继续帮助人们应对不断增长的区块链,并且通过运行完整节点将获得明显的好处。希望这能激励许多人在未来继续运行完整节点,以维持网络的长期健康。
简而言之,SPV 钱包有一些局限性,但只要你理解这些局限性,这些钱包就适合用来存储你的资金。然而,如果你存储的是大量比特币,考虑到额外的安全保障,使用完整钱包可能更明智。但如果只是存储一些零花钱在智能手机上,SPV 钱包则是一个理想的解决方案。
其他常见(以及不那么常见的)比特币钱包功能
除了由不同钱包架构的底层设计决定的特性外,一些比特币钱包还具备多种其他基本和高级功能。你应该期待看到的一些基本功能包括密码保护、备份私钥的能力、二维码扫描和生成,以及生成和导入纸钱包的能力。^(4) 一个相对高级的功能,是许多比特币钱包常见的,即能够使用你的私钥签名消息。回想一下,第七章讨论了如何使用你的私钥对比特币交易进行数字签名。相同的数字签名也可以用来签署任意消息,许多比特币钱包将这一功能设计得易于使用,因为它在你需要证明自己是某个比特币地址的所有者时非常有用(例如,如果你试图从银行获得预批准的贷款,而银行要求你证明自己有比特币作为抵押)。^(5)
你可能会在某些比特币钱包程序中看到其他高级功能,包括多签名交易,其中需要多个私钥才能从一个比特币地址支出比特币,以及一种名为币控制的功能,它可以精细控制你用于特定购买的比特币(见下文“高级比特币钱包功能:币控制”)。可用的高级功能种类繁多,无法在这里一一列举(而且这些功能的数量还在不断增加),但现在你应该明白为什么有这么多比特币钱包程序存在了!
高级比特币钱包功能:币控制
想象一下,你口袋里有三枚五分镍币,你走进了“超便宜糖果店”去买一块价值五分的巧克力。你的五分镍币是可替代的,意味着你口袋里的三枚五分镍币每一枚都具有同等的价值,并且都能用于支付巧克力。嗯,至少你是这么认为的。但或许你没有注意到,每一枚镍币的反面都刻有不同的图案,其中一枚是 1913 年的自由头 V 型镍币(全世界仅有五枚,估值约为 400 万美元每枚)。当你用它支付巧克力时,你使用了那枚稀有图案的镍币,而店主认出了它!令你惊恐的是,他报警了,因为你给他的那枚镍币曾经属于他的朋友(沃伦·巴菲特?理查德·布兰森?),而且它被盗了。经过几小时的审问,你终于说服警察相信你并不知道自己带着一枚被盗的镍币,并解释说你从这件事中学到了一课——在支付时,要小心选择你的硬币。这个小故事就是某些比特币钱包提供的币控制功能的基础。
如果你从多个来源收到了比特币到同一个比特币地址,那么每笔交易中的比特币是可以相互区分的(每一组比特币被称为未花费的输出)。使用支持币控制的比特币钱包时,当你从钱包发送支付时,你可以选择只使用你从雇主那里收到的比特币,而不是你朋友给你的那些,即使所有比特币都在同一个地址上。
在大多数情况下,你用什么硬币支付并不重要。然而,在某些情况下,你有法律义务为某项开支选择特定的资金来源。例如,在美国的大多数地方,房东被要求将租户的押金存入单独的银行账户,以确保这些钱不会被错误处理,并且只能用于适当的用途。当管理他人的比特币资金时,某人可能会有类似的义务。
此外,由于所有比特币区块链信息都是公开的,如果你从构成钱包的相同比特币地址池接收和发送支付,那么你的收入来源和购买行为理论上可以被偷偷地关联。通过使用币控制功能,你可以选择支付地址以防止这种关联,从而为你提供更多的隐私。
未来的钱包
未来的比特币钱包程序可能会提供自动支付账单、现金流量表、税务报告以及与传统财务会计软件更紧密的集成等功能。此外,持续的技术创新可能使钱包能够执行更复杂的交易,例如托管交易,或将比特币发送到在满足某些外部条件(例如年份大于 2020 年)之前无法使用的账户。毫无疑问,我们将在未来几年内看到比特币钱包中出现许多令人兴奋的功能。
哪个钱包最适合你?
考虑到前面的讨论,你应该使用哪种比特币钱包?嗯,请记住,你可以使用多个钱包。事实上,如果两个不同的比特币钱包使用相同的私钥,它们可以同时花费相同的比特币。你可以在手机上使用轻量级的无区块链钱包,在家庭服务器上使用更复杂的比特币钱包,两者共同管理一个比特币池。
然而,在实际操作中,许多用户将比特币保存在不同的比特币钱包中(即每个钱包都有自己的一组私钥),因为在它们之间移动比特币非常容易。
一种适用于个人使用的常见设置是将少量比特币存储在手机或笔记本上的轻量级比特币钱包中,它会和你一起出行,同时将储蓄存放在一个更安全的比特币钱包中(例如具有冷存储和离线交易签名等功能)。简而言之,保持少量比特币在热钱包中,其余的存储在冷钱包中,这类似于将一些现金放在口袋里的钱包中,而将你的积蓄保存在银行账户中(只不过比特币让你成为自己的安全银行)。
附加钱包考虑事项
到目前为止,我们已经讨论了比特币钱包的功能、特性和基础设计,但还应考虑其他因素:比特币钱包是否是开源的?它是否经过了安全审计?它是否有大量用户?因为比特币钱包涉及资金管理,所以在选择钱包时,你应该比选择其他应用(如游戏或办公软件)时更加小心。在将大量资金存储到某个钱包中之前,务必先研究一下你计划使用的比特币钱包程序。向朋友或同事询问,看看他们是否有过好的使用体验。
此外,考虑商户集成。如果你想在某些商店或餐厅使用比特币进行交易,检查一下你的比特币钱包软件是否与他们的销售点系统兼容。任何拥有大量用户基础的钱包应用或程序可能都能很好地工作,但如果你想尝试最新、最棒的比特币钱包,那么在尝试进行购买时,可能会遇到一些小问题。
幸运的是,尝试许多不同的钱包并用几分钱的比特币进行充值,以确定它们的工作方式和提供的功能是非常简单的。在决定你最喜欢的钱包之前,我们建议你先进行一些实验。
第十章:10
2030 年比特币
那么,假设比特币取得了巨大成功。2030 年,世界会是什么样子?
到 2030 年,2000 万个比特币正在流通,除去 2100 万个比特币的最大供应量中剩余的 100 万个比特币,其他都已经被开采出来。
不幸的是,未来对克劳利来说并不如意:他没有仔细阅读第三章,并在 2019 年那次臭名昭著的 WhatsMyInstaSnapAppBook.com 黑客事件中失去了所有比特币。因此,他现在过着做房地产经纪人的生活,周末开半挂车横跨国家。
那么,2000 万个比特币究竟会是什么样子呢?好吧,克劳利并不知道,如果这 2000 万个比特币每一个都像便士一样大,并且被尽可能紧密地堆叠在一起,它们几乎正好能填满克劳利那辆美国标准尺寸、53 英尺长的半挂车的内部!

2030 年,比特币将值多少钱?
很可能,在 2030 年,比特币的价值将是零:尽管这种货币早期取得了非凡的成功,但 2030 年实在太遥远了,期间可能发生的很多事件都能导致它的灭亡。然而,如果比特币成功实现主流采用,我们仍可以预测比特币的价值。
在本章接下来的部分,我们假设有 10 亿人定期使用比特币。这个数字不包括所有人,因为传统货币仍然会被使用。那么,在这个未来的世界里,一个典型的比特币用户可能拥有多少比特币呢?
假设到 2030 年将有 2000 万个比特币在流通,平均每个人将拥有 0.02 个比特币。当然,财富从来不会平均分配,极有可能前 1%的人拥有超过 50%的比特币(不幸的是,比特币可能无法单独解决这一问题)。因此,普通人将大约拥有 0.01 个比特币,在那时,这个数量可能被称为 10,000 微比特币。
回到那个关于半挂车中充满了便士大小比特币的例子,普通人的储蓄将只包含一个便士的碎片,差不多是一个立方毫米大小的沙粒。

正如在第六章中讨论的那样,比特币能够实现的最高价值是作为一种价值储藏工具,在这种情况下,普通人可能会将其 1,250 美元的储蓄存入比特币。如果这个极端的情景成立,那么计算单个比特币的价值将是 1,250 美元除以 0.01,结果是荒谬的 125,000 美元每个比特币。
2030 年的比特币挖矿
使用比特币购买早晨的咖啡、午餐、汽车燃料和一些在线产品,一个普通用户每天可能会进行 10 笔交易。^(1) 如果有 10 亿人每天进行 10 笔交易,这将是一个巨大的交易量!事实上,这个数字将超过每秒 100,000 笔交易,是今天 VISA 处理交易量的 25 到 50 倍。如果交易费用保持低廉(这是大多数人采用这种货币的前提)——假设每笔交易费用为一分钱——那么每天的交易费用将高达 1 亿美元!
尽管到 2030 年每个区块的矿工奖励将少于两枚比特币(基于当前的计划),如果在此期间比特币的价值显著上涨,矿工奖励仍然可能是可观的。
但大多数交易可能是链下交易。(链下交易是指那些不是通过区块链处理的比特币交易,而是由比特币钱包供应商管理的账本处理的交易,目的是节省小额支付的交易费用。) 因此,那些每天 10 亿笔交易可能只有 100 万笔交易会被记录在区块链上。然而,无论它们如何处理和对账,任何一个有 10 亿用户的支付系统每天都会生成数十亿笔交易。
挖矿将变得非常具有竞争性,利润率将非常低。只有那些拥有最具能效的矿机和最低电费的人才能继续维持运营。假设最有效的挖矿技术需要 0.1 J/GH,电费为每千瓦时 0.10 美元,并且每天产生 1 亿美元的交易费用,那么盈亏平衡的算力将超过 500 EH/s(500,000 PH/s)!即便假设挖矿技术的计算密度比目前高出 100 倍,实现这种挖矿能力所需要的 ASIC 硬件将填满大约 5000 座小型公寓楼。

在超过 500 EH/s 的算力和 0.1 J/GH 的能效下,需要投入到挖矿的电力将大大增加。比特币挖矿将消耗超过 50GW 的电力,约占美国当前电力生产的 5%,以及全球电力输出的 0.3%。当然,如果电力成本上升,网络算力将下降。比特币挖矿不需要特定的算力才能正常运行;然而,电力越便宜,运行比特币挖矿的人就越多。
到这时,我们已经乐于推测在这个由比特币主导的世界中,比特币的价格以及可能围绕它演变的基础设施。但是,2030 年对于一个普通的比特币用户来说,生活会是怎样的呢?
2030 年比特币用户的日常生活
让我们跟随 Crowley 的一天展开。事情从 Crowley 早晨醒来开始。Crowley 晚上佩戴着优化睡眠的手链,手链会匿名上传他的睡眠前生命体征到互联网。利用这些信息,全球的机器学习系统使用比特币竞标 Crowley 的闹钟何时响起,考虑到他的身体状况和睡眠/觉醒周期。最高出价者是让 Crowley 睡得最久的那个。

因为 Crowley 喜欢在早晨长时间洗热水澡,他以前常常洗完澡后热水用完。但最近,他所在公寓楼的一位住户安装了一台工业级热水器,现在通过向其他租户出售热水来帮助分担费用。Crowley 的热水龙头上安装了一块芯片,可以自动将比特币支付到热水器的芯片中。当 Crowley 顺时针转动淋浴阀时,更多的比特币被支付,热水也从淋浴喷头中流出。

当 Crowley 离开家时,他从手表上向正在修剪草坪的机器人割草机发送了几个 satoshi。街上的一家割草机维修店制造这些割草机并免费提供给顾客。每台割草机都自己收集收入,并用这些比特币支付网络上的程序员,以改进其 AI 算法,从而赚取更多的钱。此外,这些割草机会到割草机维修店进行升级,并用它们的比特币收入支付升级费用。

今天,Crowley 在上班途中错过了公交车。显然,今天早晨成功竞标的闹钟没有检测到 Crowley 的宿醉,导致时间设定过于紧张。通常情况下,他的手链会向获胜的竞标者发放 20 个 satoshi 作为奖励;然而,由于手链计算出 Crowley 错过了公交车,它从一个由获胜闹钟竞标者设立的托管账户中提取了 100 个 satoshi 的保险金。结果,今天的竞标者亏损了(程序员有一些算法调试需要做)。

利用托管账户中的 satoshi,手链开始了一个临时的比特币拍卖,邀请所有附近停放的自动驾驶汽车看看是否愿意租给 Crowley。进入获胜的汽车后,Crowley 出发去上班。

今天,Crowley 的房地产客户正在购买一套房子。自从 2023 年《数字房地产改革法案》通过以来,所有的房产都通过简单地追踪分配给每个房产的一个特定 satoshi 来进行管理。这个 satoshi 类似于有色币,就像 2014 年的产权搜索一样。实际上,如果这个 satoshi 被转交给另一个人,新的拥有者将被赋予该房产的法律所有权。
到 2030 年,克劳利只需让他的比特币钱包通过追踪与房子相关的 satoshi 在区块链上的所有权进行产权搜索。这不仅相当于一项详尽的产权搜索,且保证 100%准确,而且他的钱包软件可以瞬间完成这一搜索,并且是免费的。

什么是彩色币?
货币的一个定义特征是它是可替代的:如果你想用五分钱买一颗糖,而你口袋里有几枚五分钱,你不需要考虑用哪一枚——任何一枚都适合。不过,由于比特币区块链是公开的,因此我们可以追踪每一枚硬币随时间的历史,实际上可以创建一种不同类型的货币,这种货币不可替代——一种不同的货币,其中不同的硬币可能会被标记上不同类型的“颜色”。
举个例子,假设你在一个只能容纳 400 人的剧院里举办音乐会。确保当天不会超过 400 人到场的一个方法是,将 400 毫比特币分发给你最亲密的 400 个朋友,然后简单地告诉他们:“请来参加我的演出!不过,如果你那天不能来,随时可以将这些毫比特币交易或转卖给任何人。它们是你可以根据需要自由使用的!”
然后,在音乐会当天,你会要求任何到场的人将其中一枚这些 400 毫比特币发还给你。通过分析区块链,你理论上可以追踪每一枚毫比特币的历史,验证它们是否都是你最初分发的 400 枚。这 400 枚毫比特币本身没有什么特殊之处,唯一特别的是你决定任意赋予这 400 枚比特币一个额外的特殊价值(即进入音乐会的资格)。这被称为对这些硬币进行着色。这个过程的好处是:(1)不会超过 400 人能拿着有效票到达你的音乐会;(2)你的朋友们可以完全自由地做任何他们想做的事。这个相同的系统也可以用来追踪更重要资产的所有权;例如,确定谁拥有某栋房子的产权。
当然,在实际操作中,亲自追踪区块链中的每一枚比特币会非常痛苦。然而,已经有软件可以自动化地以这种方式对比特币进行标记和追踪。最为成熟的协议和工具共享一个名字——“彩色币”(Colored Coins),并且可以在coloredcoins.org/上找到。
为了完成房屋的出售,买方和卖方只需输入一个多重签名交易:在一次交易中,买方将 150 微比特币(房屋费用)发送到卖方地址,而卖方将单色的 satoshi 发送给买方。通过使用单一交易,直到双方都用各自的私钥签署交易后,交易才会生效。该交易还包含 1%的佣金,发送到房地产代理的地址。

由于区块链用于跟踪财产所有权,因此这座房子的所有权保险和交易完成费用(不包括代理佣金)只是交易费用,可能只需要不到一分钱。
一天工作结束后,克劳利给他的妈妈(她是一只尼罗鳄)汇了一些钱。她所在的村庄,和 2030 年布隆迪的每个村庄一样,都有一个比特币摊位,可以以 0.5%的佣金将比特币兑换为布隆迪法郎。当然,现如今世界各地几乎所有地方都可以直接用比特币购买大多数物品,所以这笔佣金并不是必须的开支。
克劳利决定不搭公交,而是趁着这美好的一天走路回家并在途中吃晚餐。克劳利并不知道,正好走在他路上的索非亚刚为她的家人做了一大份沙拉,并意识到做得有点多,会有剩菜。

出于这个原因,她拍下剩余的沙拉照片,并将其上传到一个食物共享网站。在该网站上,评论员通过比特币支付,提供沙拉口味的评分。在几秒钟内,克劳利的手机响了,因为他之前请求过一份口味评分至少为 8 分的餐食,且不超过 15 个 satoshi,这正是他回家的路上能得到的,而索非亚的沙拉正好符合他的要求!

当克劳利按下索非亚门铃时,门铃中的 NFC 芯片与克劳利的手表通信,建立了一个关于晚餐沙拉的合同:门铃会自动向克劳利的手表发送一张账单,要求支付 15 个 satoshi 作为进入索非亚临时餐馆的费用。
索非亚怎么知道可以信任克劳利进入她的家呢?克劳利订阅了一个匿名评分服务,该服务以 1 个 satoshi 的费用保证索非亚,克劳利的可信度评分为 9.5 分(满分 10)。这个评分服务以脚本的形式内嵌在比特币区块链中。用户支付小额费用参与评分服务,评分服务(一个计算机程序)利用这些费用支付其在线广告费用。实际上,它是一个没有所有者的金融实体,存在于网络空间并为自己的资源付费。这种实体被称为分布式自治公司,得益于区块链技术,它才得以实现。
一整天忙碌工作后,终于回到家,克劳利在电视前的躺椅上放松。他最喜欢的电影(《哈利·波特与分叉区块链》)正在播放时,突然出现了一则披萨广告。“该死!”他喊道,“我今天晚餐吃的是一份健康沙拉,但现在真想来一片披萨。”

这则广告突然打断克劳利电影的原因并非偶然。就在此时,一辆经过他家门前的披萨车进入了克劳利电视的自动比特币广告拍卖,成功赢得了展示披萨广告的权利!

克劳利只需张开嘴巴:响应中,克劳利电视的手势识别系统会自动向披萨车发送 8 个聪(satoshi)。

很快,这辆披萨车把一片披萨放到了从克劳利家中延伸出来的传送带上。

几秒钟内,一只机器人手臂从克劳利躺椅的底部伸出,抓起传送带上的一片披萨,把它送进了克劳利的嘴里。

你可能认为一个完全依赖去中心化比特币交易的世界会是一个可怕的反乌托邦。然而,在阅读了 2030 年典型比特币使用者的一天生活的精彩描述后,那里的一切都通过比特币运作,我们相信你的担忧已经彻底消除了。
比特币终极游戏
1687 年,艾萨克·牛顿出版了他的《自然哲学的数学原理》,这本书无疑是人类历史上最伟大的智力作品之一。它让牛顿成名,因为它首次揭示了能够精确描述行星及其他物体在引力作用下运动的简单数学公式。
尽管这一成就非常伟大,但《原理》其中隐藏着另一个更具意义的思想:即微积分的思想。^(2) 现代社会依赖的大多数技术——电脑、手机,甚至原子弹——如果没有引力理论也能存在;然而,如果没有微积分,这些技术几乎不可能出现。
在 17 世纪的欧洲,并不是每个人都能理解微积分的价值。牛顿几乎是单纯为了能第一次解释行星运动这一更具浪漫与诗意的问题,而创造了这一非常抽象的创新。
当然,现在评估中本聪的比特币白皮书是否会出现在重要科学出版物的历史中为时尚早。但有一点是明确的:就像牛顿必须首先发现微积分来解释星体的运动一样,中本聪也必须首先发现分布式匿名账本的理念,即区块链,才能发明出完全分布式数字货币的理想化概念。
然而,与微积分和引力定律不同的是,区块链和数字货币的概念是紧密相连的;它们是阴阳相依的。没有区块链所提供的安全性,分布式货币根本无法存在。同样,区块链也无法创造出来,除非给予人们创造它的激励,而唯一可能有效的激励就是分布式货币!

于是,这正是中本聪的天才所在:一个能够设想出两项独立技术的人,这两项技术单独来看显然是不可能且不实际的。在 2000 年代中期,当中本聪制定出他的原始白皮书时,世界上第一次有一个人清晰地意识到,尽管这两项技术单独存在时是不可能的,但如果将这两个理念结合成一个紧密交织的系统,它们不仅变得可能,而且实际上是可行的!
比特币的真正未来已经显现:分布式资产账本技术与激励性货币的结合,注定会永远存在于我们的生活中。^(3) 这是一个机制,可以在许多需要将信任委托给中央仲裁者的情境中大幅提升效率。尽管毫无疑问政府和中央权威将继续存在,并在世界未来中扮演重要角色,但当前这些政府和其他权威机构所执行的许多工作也是不必要的重复性和琐碎事务。
就像机器人帮助世界减少了繁重的体力劳动一样,数字货币技术现在为我们提供了自动化官僚主义琐事的工具。乐观地说,整个全人类都将因此受益。
第十一章:A
HELLO MONEY! 一个简单的 JavaScript 程序
使比特币如此令人兴奋的一个因素是任何人都可以编写计算机程序,直接链接到比特币网络并执行金融交易。本附录将解释如何编写一个简单的 JavaScript 程序,监控一个钱包并指示何时比特币已被发送到该钱包。在附录 B 中,我们将用 Java 创建一些更高级的程序,扩展这一思想。
“简单” 的含义
编写操控比特币资金的程序是简单的。然而,当我们走过这个过程时,你可能会发现它并不那么简单。
但试想一下,如果我们使用传统的电子商务系统来构建我们的应用程序或服务。大致上,这些步骤将是这样的:
1. 注册你的企业以获取 DUNS^(1) 编号。
2. 在你的银行开设一个企业账户。
3. 让你的账户通过商户服务供应商(如 Intuit、PayPal、Stripe、Apple 等)进行验证。
4. 通过供应商使用你的 DUNS 编号注册账户以获取访问密钥。
5. 从供应商处获取专有库软件(你可能需要定期更新此库以维护你的软件)。
6. 将你的客户重定向到一个特殊的供应商授权支付。
7. 编写你的代码。
8. 让支付提供商审核你的完成的应用程序。
这里是使基于比特币的电子商务系统启动并运行所需的主要步骤:
1. 编写你的代码。
只需要完成这一项任务,这就是我们在用比特币编程时所说的简单。
编写比特币软件的三种方法
要编写启用比特币的软件,你可以使用三种不同的方法:
1. 使用商户服务。
2. 连接到本地比特币钱包程序(通常是基于中本聪初始代码的原始比特币钱包应用程序,名为 bitcoind)。
3. 创建一个程序,将其直接插入比特币网络。
使用方法 #1,你将通过互联网连接到一个 Web API。这个 API 将由一个第三方公司提供,用于管理你的比特币。提供这些 API 用于发送和接收比特币的公司通常被称为商户服务。
例如,如果你的网站销售小工具,并且你希望人们用比特币购买你的商品,使用商户服务可能是一个简单、快速让你的网站开始工作的方式。商户服务的另一个好处是,它可能还提供自动将比特币与其他货币之间进行转换的服务,作为交易的一部分。许多公司提供这些 API,BitPay 是一个常见的选择。你也可以在比特币基金会官方网站上找到更多公司的详细列表。^(2)
然而,这种方法也有一些缺点。首先,这些供应商的 API 可以说违背了比特币的精神,因为使用 API 中介意味着你要依赖外部方;认真对待比特币的人更愿意保持对自己资金的百分之百控制。其次,这些 API 大多仅为常见用例设计,因此不允许我们想要在本书中推广的灵活性和创新型应用开发。第三,这些 API 的设计经常变动,这使得提供最新信息变得困难。由于这些原因,本书不会花太多时间讨论供应商 API。
方法 #2 涉及连接到本地比特币钱包,并基本上让钱包在自动驾驶模式下运行。两款基于中本聪原始代码的比特币钱包程序——Bitcoin Core 和 bitcoind——可以通过一种名为 JSON-RPC 的特殊协议进行远程控制,正如我们稍后将讨论的那样。由于这两款程序是比特币钱包的黄金标准,因此将它们用于自定义程序非常具有吸引力。为自动化 Bitcoin Core 和 bitcoind 编写的程序易于理解,并且在所有流行的编程语言中都有相应的库,简化了它们的使用。你可以在 JavaScript、Ruby、PHP、Python 等多种语言中使用这种方法。不幸的是,使用本地比特币钱包程序并从自己的代码中控制它的主要缺点是,这一过程往往笨重且低效,正如你将在第一个编程示例中看到的那样。
注意
Bitcoin Core 和 bitcoind 共享相同的代码。这个公共代码被称为 比特币参考客户端, 或简称 比特币。 它是比特币协议的首次实现,最终被分为两个变种:Bitcoin Core 提供友好的图形界面 (UI),而 bitcoind 是一个更加简化的版本,采用文本界面。
方法 #3 涉及直接进入比特币网络,将你的比特币启用程序直接嵌入到比特币网络中。你可以使用 Java、C++、Go 等语言,或者任何提供完整比特币客户端库的语言来实现这一点。与方法 #2 相比,这种方法更加稳健且资源消耗较少,但它在技术上更加复杂。
然而,如果你是一个相信比特币精神的程序员,能够编写一个真正的比特币网络第一公民应用——一个真正参与比特币系统的比特币节点——是一个令人鼓舞的动力。原因在于,绝对没有任何限制会束缚你的应用(只要你的应用遵守网络规则)。在附录 B 中,我们将编写一些使用这种方法的程序。
比特币编程的一般安全注意事项
我们需要在这里提到的一个重要免责声明是,在本附录中,我们将编写仅发送和接收少量硬币的程序。所讨论的技术和示例对于学习比特币编程的基本概念非常有用,但绝不适合编写操作大量资金的程序。如果你计划编写严肃的比特币应用程序,你需要做以下几点:
1. 从本章中的示例程序学习基本概念。
2. 利用这些知识学习和理解本章中使用的比特币库的底层源代码。
3. 关注开发者和其他库用户使用的论坛,及时了解使用这些库时涉及的安全风险。
最重要的是,要意识到我们在示例中使用的是社区维护的源代码;如果一个聪明的黑帽黑客(3)设法将恶意代码插入到官方库的存储库中,*他或她可以窃取你所有的钱*。即使你完全理解库的代码,你也面临着危及资金安全的风险。例如,当你从互联网上下载这个库代码时,黑帽黑客有很多机会执行中间人攻击(4),并将恶意代码插入到被篡改的库版本中,这个版本会被整合到你的程序中。结果,黑客可以窃取你所有的钱。
此外,正如前几章所提到的,黑客可以通过许多与比特币编程无关的方式窃取你的比特币。如果比特币的当前流行程度持续下去,我们怀疑几年后大多数计算机病毒都会包含立即清空任何找到的比特币钱包的代码。
关键是你需要了解如果计划创建更高级的比特币程序,你的钱可能面临的严重风险;只有在全面且深入理解比特币技术的基础上,你才能安全地保护你的资金,这种理解应该超越本章所给出的介绍。请谨慎行事!
关于比特币安全的积极提醒
现在,在你经历了防止资金损失的一些警示之后,我们将指出一些事实,让你对比特币安全有信心:
• 核心比特币网络迄今为止保持了几乎完美的安全记录。使用比特币时大多数安全风险来自用户在自己电脑上执行的不小心操作,这些风险本可以避免。
• 尽管我们在本章讨论了这些风险,但有成熟的编程实践可以缓解所有这些风险。如果你学习本书,遵循安全软件开发的一般准则,并保持更新关于比特币开发论坛上讨论的最新安全问题,你将能够编写安全的比特币软件。
• 在你学习编写使用比特币的程序时,确保使用一台不包含大量比特币的比特币钱包的计算机。通过这样做,你可以在学习编写比特币软件时避免任何危险:如果你把比特币存放在其他地方,你就不可能在开发机器上不小心丢失比特币(或被盗)。
用 JavaScript 编写你的第一个比特币程序
按照惯例,程序员学习新技术时编写的第一个程序是Hello World 程序:这是最简单的程序,它只是在屏幕上打印出消息Hello World!。本质上,它向初学者表明,初始代码似乎正常工作。
然而,我们需要编写的比特币程序必须执行两个主要任务:接收资金和发送资金。在本章中,我们将专注于接收资金,并编写一个名为Hello Money!的程序。在附录 B 中,我们将编写一个Bye-Bye Money程序来发送资金。
为什么使用 JavaScript?
JavaScript 可以说是当今最著名的编程语言,因为大多数为 Web 构建软件的开发者迟早都必须学习它(它是唯一能在标准网页浏览器中原生运行的语言)。然而,我们创建的 JavaScript 代码并不能在网页浏览器中运行:这是因为网页浏览器有强大的保护机制,称为跨域限制,它们防止与外部程序和网站的通信。这些限制限制了在网页浏览器中使用 JavaScript 的功能,使得与任何外部钱包进行交互变得困难(这也不足为奇,因为你肯定不希望通过访问恶意网站而让钱包被清空)。
然而,目前你也可以在服务器上运行 JavaScript,就像常见的使用 Node.js 库一样。在服务器上运行时,不受这些限制的影响,我们可以编写在控制台中运行并与 Bitcoin Core 和 bitcoind 交互的简单程序。
比特币核心与 Bitcoind
如前所述,本章描述的编程技术将适用于任何比特币钱包应用,无论是 Bitcoin Core 还是 bitcoind。两者之间唯一实质性的区别是 Bitcoin Core 有一个图形用户界面;基本上,它就是附加了前端的 bitcoind。由于图形界面的友好性,我们将在本章的示例中使用 Bitcoin Core。然而,bitcoind 稍微消耗的资源较少,更容易通过终端控制台在计算机服务器上运行。因此,如果你实际部署一个使用本章概念的已完成程序,最好使用 bitcoind。
为 JavaScript 比特币编程准备你的机器
在开始编程之前,你需要一些工具来准备你的机器,所以让我们现在就安装它们。本教程提供的说明假定你使用的是 Windows 开发环境;如果你使用的是 Mac 或 Linux 平台,请跳到 第 219 页的 “For Mac Hackers” 或 “For Linux Folks” 部分。
安装 Node.js
你首先需要从 nodejs.org/ 网站下载 Node.js 的安装程序。当你运行 Node.js 安装程序时,它还会安装我们接下来将依赖的 Node 包管理器(npm)。
安装 node-bitcoin
现在你需要一个 JavaScript 库,它可以连接到 Bitcoin Core 和 bitcoind。我们将使用 node-bitcoin 库。要安装 node-bitcoin,请打开命令提示符并输入 **npm install bitcoin**。这个命令将调用(先前安装的)Node 包管理器,它会在一个简单的步骤中下载库中的所有内容。
启动 Bitcoin Core
如果你还没有下载 Bitcoin Core,可以从其官方网站 bitcoin.org/en/download 下载。
接下来,你需要以服务器模式启动 Bitcoin Core。钱包应用程序将打开一个额外的套接字,我们将使用这个套接字从 JavaScript 程序连接到钱包。要在 Mac 和 Linux 机器上执行此操作,请从控制台进入 Bitcoin Core 安装目录并运行 **./Bitcoin-Qt -server**。在 Windows 机器上,打开命令提示符,进入 C:\Program Files (x86)\Bitcoin 目录,并输入 **bitcoin-qt.exe -server**。
第一次以服务器模式运行 Bitcoin Core 时,它会要求你在特定位置创建一个名为 bitcoin.conf 的文件,并在该文件中添加一个用户 ID 和密码。按照提示操作,因为稍后我们将使用这个用户 ID 和密码。然后,重新启动 Bitcoin Core。
如果你已经安装了 Bitcoin Core(之前叫 Bitcoin-Qt),但这是你第一次跟随本教程,那么你需要找到之前创建的 bitcoin.conf 文件。对于 Windows 用户,你可以尝试查找 C:\Users<username>\AppData\Roaming\Bitcoin\bitcoin.conf。对于 Mac 用户,尝试 * /Users/
注意
Windows 用户注意:如果你尝试使用 Windows 记事本创建 bitcoin.conf 文件,请注意,记事本(非常“贴心”地)会在文件名后添加一个 .txt 扩展名,而 Windows(同样“贴心”地)会完全隐藏这个扩展名以保护你(这是为什么如今大多数黑客都尽量避免使用 Windows 的一个典型例子)。为了解决这个问题,在保存对话框中输入文件名时,把 bitcoin.conf 放在引号中。
此时,像往常一样,对于一个比特币钱包,比特币核心会花费几个小时下载区块链,直到它准备好进行下一步操作——这是一个适合进行长时间午休的完美时机!
针对 Mac 黑客
如果你使用的是 Mac 并且熟悉使用终端,你可以运行特定命令自动搜索、下载并安装所需的程序。
在 Mac 上,下载 homebrew,一个命令行工具,将为你处理整个过程:
# Get homebrew and if you haven't already
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
brew tap phinze/homebrew-cask
brew install brew-cask
# Get node.js and bitcoin stuff
brew cask install bitcoin
brew install nodejs npm
npm install bitcoin
# Run bitcoin-qt in server mode
~/Applications/Bitcoin-Qt.app/Contents/MacOS/./Bitcoin-Qt -server
针对 Linux 用户
如果你使用的是像 Ubuntu 这样的 Debian Linux 版本,你只需使用 PPA 功能来安装库:
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install nodejs npm bitcoin-qt
npm install bitcoin
bitcoin-qt -server
在一个工作正常的比特币核心服务器上,我们现在可以开始编程了。
你好,钱!
好的,让我们写第一个比特币应用程序。只需将以下完整程序输入到名为hellomoney.js的文件中:
var bitcoin = require("bitcoin");
var client = new bitcoin.Client({
host: 'localhost',
port: 8332,
user: 'myUsername',
pass: 'myPassword'
});
var previousBalance = 0;
function mainLoop() {
client.getBalance('*', 0, function (err, balance) {
if (err) {
console.log(err);
} else if (balance > previousBalance) {
console.log("Hello Money! New balance: " + balance);
previousBalance = balance;
} else {
console.log("Nothing's changed.");
}
});
}
setInterval(mainLoop(), 5000);
在开始运行应用程序之前,让我们逐行分析代码的作用。
第一部分:初始化与比特币核心的连接
var bitcoin = require("bitcoin");➊
var client = new bitcoin.Client(➋
{
host: 'localhost',
port: 8332,
user: 'myUsername',➌
pass: 'myPassword'➍
});
var previousBalance = 0;➎
第一行表示我们正在使用 node-bitcoin 库 ➊。接下来,我们建立了与我们设置的比特币核心服务器的连接 ➋。因为我们将在安装了比特币核心的同一台机器上运行应用程序,所以我们的主机设置为'localhost'。默认情况下,比特币服务器将在端口 8332 上运行。
重要: 在接下来的两行 ➌➍ 中,输入你在bitcoin.conf文件中输入的用户 ID 和密码。将这里显示的占位符替换为你自己的。 然后,我们创建一个变量来跟踪程序中的前一个余额 ➎,初始值为零。
第二部分:主循环
现在,我们将编写一个循环,检查我们钱包中的余额,并在余额发生变化时向我们报告。基本步骤如下:
-
向比特币核心请求当前余额。
-
如果余额高于之前的余额,打印一条消息,并将前一个余额更新为当前余额。
-
设置一个定时器,每五秒钟重新执行整个过程一次。
以下mainLoop函数执行了之前的步骤:
function mainLoop() {
client.getBalance('*', 0, function (err, balance) {➊
if (err) {
console.log(err);➋
} else if (balance > previousBalance) {➌
console.log("Hello Money! New balance: " + balance);➍
previousBalance = balance;➎
} else {
console.log("Nothing's changed.");
}
});
}
setInterval(mainLoop, 5000);➏
首先,函数向比特币核心请求余额 ➊。在此过程中,我们创建一个回调函数,其内容为function(err,balance) {}。回调函数会在未来某个时间被调用。在这种情况下,当我们从比特币核心收到结果余额时,它会被调用。
注意
如果你以前从未使用过 Node.js,可能需要一些时间来学习如何理解这种编程惯用法。Node.js 的哲学是,当程序需要等待外部进程(在此情况下是比特币核心程序)时,它要求你创建回调函数,而不是在等待结果的过程中让程序完全停止。这叫做异步编程,它使得程序在等待数据到达时可以做其他任务。
当余额可用时,我们首先检查是否发生了错误,并在发生错误时显示出来 ➋。接着,我们检查新余额是否大于之前的余额 ➌。如果是,我们打印一条消息 ➍ 并更新之前的余额 ➎。最后,我们创建一个定时器,每隔 5000 毫秒通过 setInterval 函数反复调用 mainLoop ➏。
比特币核心 JSON-RPC API
mainLoop 函数通过与 Bitcoin Core 交互 来运作。这个交互协议采用 JSON-RPC 格式,即 JavaScript 对象表示法 – 远程过程调用。简单来说,JSON-RPC 描述了一种结构,允许两台计算机(或单台计算机上的两个程序)以便于计算机程序员集成到代码中的方式相互发送消息。
在我们的小型应用中,我们仅使用一个命令与 Bitcoin Core 进行通信——client.getBalance 函数。但实际上有更多的命令可以让你操作比特币地址、修改钱包、分析交易,并完成你希望在比特币程序中进行的大多数其他任务。要了解 JSON-RPC 接口中可用的函数,可以访问官方 API 函数列表,链接为 en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list。
运行 Hello Money! 程序
为了试用我们全新的 Hello Money! 程序,在包含 hellomoney.js 的目录中打开终端并运行以下命令:
> node hellomoney.js
接下来,只需从另一个钱包向由 Bitcoin Core 管理的钱包发送 0.001 比特币。为此,你需要使用一个公共地址,你可以通过点击 Bitcoin Core 中的“接收”来找到该地址。根据我们编写应用的方式,只有在比特币区块链上收到确认后,应用才会统计到你钱包中的资金。(在下一节中,我们将编写一个 Hello Money! 程序,它能够在资金到达时立即检测到,而不需要确认。)
由于确认通常需要约 10 分钟,因此你需要稍等片刻才能看到以下内容:
> node hellomoney.js
Hello Money! New balance: 0.001
恭喜!你已经编写了一个可以监控比特币钱包并检测到资金被发送到其中的程序。如果你接着发送更多的资金,应用将会创建消息来报告这些新存款。
使用 JSON-RPC 编写比特币程序的限制
通过使用 JSON-RPC,我们能迅速编写一个 JavaScript 程序,能够报告比特币钱包中收到的资金。然而,如果你是经验丰富的程序员(或对比特币协议有深入理解),你会发现我们示例应用存在许多问题。
一个问题是,应用程序使用轮询来检测钱是否到达。轮询不断地通过每五秒钟询问一次比特币核心的状态。这一过程就像是不断问:“你有钱了吗?现在有钱了吗?现在呢?”正如你想象的那样,反复问同样的问题效率极低。
如果你正在编写生产级的应用程序,那么最好使用推送方式。推送的方式是指定我们的应用程序在等待资金,并希望在资金到达时得到通知。但由于我们与比特币核心的连接方式,启用推送是相当困难的。毕竟,比特币核心主要是作为一个钱包应用程序,通常不需要推送到外部程序。通过 JSON-RPC 自动化比特币核心有点像是一个黑客手段,因此我们可能会遇到一些限制,例如需要使用低效的轮询。
注意
在比特币核心和 bitcoind 的更新版本中,一个叫做 walletNotify 的功能支持推送,但它的工作方式相当复杂——复杂到我们建议你避免使用它。相反,我们建议你使用 BitcoinJ 来代替比特币核心进行推送,正如我们在附录 B 中将要讨论的那样。
我们的应用程序的另一个问题是,我们只是检查一个粗略的余额数值来判断什么时候钱被发送到了我们的钱包。然而,比特币区块链有时会触发一些情况,导致钱包的余额出现意外的剧烈波动,从而可能使我们的应用程序产生不正确的结果。
例如,假设我们的钱包收到了带有一个确认的款项,但区块链突然分叉,取消了与这笔钱相关联的交易,导致钱包突然失去大部分已确认的款项。然后,在同一个五秒钟的窗口内,有人又向我们发送了更多的钱。在这种情况下,钱包中的余额实际上可能会减少,即使我们收到了新钱,而且Hello Money!消息也永远不会被触发。
这是一个非常罕见的场景,但如果你正在编写一个操作大量资金的应用程序,那么这种错误行为是不可容忍的。解决这个问题的方法是使用client.listTransactions(而不是client.getBalance)。然后查看这些交易,判断在过去五秒内是否有新的交易涉及将钱发送到钱包,这正是我们的应用程序要寻找的内容。然而,这对于我们简单的Hello Money!程序来说太复杂了。
另一个问题是,比特币核心(和 bitcoind)需要大量的区块链数据和计算资源来运行,尽管我们的简单应用程序并不需要这些大部分的计算能力。有没有办法减少这些资源需求?正如你将在附录 B 中看到的那样,我们可以通过编写一个直接运行在比特币网络上的程序来实现这一点。
第十二章:B
使用 BITCOINJ 进行比特币编程
在附录 A 中,我们尝试了 JavaScript 代码,通过自动化现有的钱包来执行一些基本的比特币钱包操作。在本附录中,我们将编写更强大的程序,直接将自己插入到比特币网络中。正如之前所讨论的那样,以这种方式编写的比特币程序——也就是说,那些不依赖于外部公司 API、避免依赖独立钱包程序的程序——通常是进行严肃比特币开发项目的最佳解决方案。
连接到比特币网络的最佳编程语言
如果你是一个经验丰富的程序员,很可能你有一个偏爱的编程语言来编写比特币程序。然而,目前只有少数成熟的库可以直接连接到比特币网络。其中一个是 C++ 参考实现,所有比特币系统的第一个完整客户端都是用它编写的。^(1) 有意支持比特币的大型企业公司应使用此库。然而,C++ 对初学者来说相对较难。
另一个成熟的库是用 Java 编写的,名为 bitcoinJ。^(2) 由于 Java 比 C++ 更易于使用,因此我们将使用这个库。(bitcoinJ 库也可以很容易地通过构建在 Java 虚拟机上的其他语言(如 Scala 或 Clojure)使用。)
目前,其他语言的选项相当有限。通过搜索互联网,你会找到适用于其他语言的比特币库,如 Ruby、C# 和 Python。然而,这些库大多数都处于极其早期的开发阶段,或者仅仅使用更为有限的 JSON-RPC 接口,这在附录 A 中有讨论。
注意
目前正在进行一些严肃的尝试,旨在为 Go 编程语言提供完整的比特币客户端支持。然而,在撰写本文时,这些库要么仍处于早期开发阶段(例如 gocoin^(3)),要么缺少主要功能(例如 btcd ^(4))。
无论你选择哪个库,请记住,必须保持警惕以确保安全。实际上,当你使用这些库时,你相当于将比特币王国的钥匙交给了库的作者。正如我们之前所警告的,技术上来说,将恶意代码引入这些库以窃取所有资金是相对容易的!
安装 Java、Maven 和 BitcoinJ 库
让我们为你的计算机准备好进行 Java 和 bitcoinJ 编程。以下步骤应适用于任何主要操作系统:Windows、Mac 或 Linux。
步骤 1:安装 Java
Java 编程语言由 Oracle 公司维护。你的电脑可能已经安装了 Java,但如果你从未进行过 Java 开发,电脑上可能只包含 Java JRE(Java 运行时环境),它能够运行 Java 程序,但不足以进行开发。你需要的是 Java JDK(Java 开发工具包)。要下载 JDK,可以在 Google 上搜索 Java JDK。第一个链接(应该是 Oracle 官方网站的链接)会把你引导到正确的下载页面。
注意
Linux 开发者:某些版本的 Linux 可能默认安装 OpenJDK 版本的 Java。在撰写本文时,这种非官方的 Java 变体缺少一些本教程所依赖的组件。因此,请在线查找有关在你的 Linux 版本上安装 Oracle JDK 的信息,并将其设置为系统默认的 Java 版本。
步骤 2:安装 Maven
Maven 是一个用于 Java 的打包工具。基本上,你指定程序需要哪些库,Maven 会自动从互联网上下载它们并使其可供你的程序使用。这类似于在附录 A 中使用的 Node 包管理器。
你可以在 maven.apache.org/ 下载 Maven 并找到各操作系统的安装说明。只需按照 Maven 官方网站上的说明进行安装,或者在 Google 上搜索教程。由于已有超过一百万人遇到并解决了安装 Maven 的问题,如果你遇到安装问题,只需将问题输入 Google,极有可能会找到有用的解决方案。
注意
Windows 用户:在撰写本文时,关于 Windows 安装 Maven 的详细说明巧妙地隐藏在 maven.apache.org/download.cgi的最底部。 Mac/Linux 用户:你可以在此使用你的包管理器:Mac 使用 brew install maven,Debian Linux 使用 sudo apt-get install maven。
为确保 Maven 正确安装,在控制台中输入 mvn --version 时应该会显示版本信息。
对于典型的 Java 编程,我们可以到此为止,因为任何额外需要的库都可以通过 Maven 包系统下载。然而,由于我们正在编写与金钱相关的程序,bitcoinJ 的维护者要求所有开发者采取一些额外的预防措施,并安装几个直接与安全问题相关的工具。
步骤 3:安装 Git
出于安全原因,我们将安装 Git,这是一款流行的源代码管理工具。它还提供了从在线代码库安全下载源代码的功能,我们将依赖这些功能。可以从 git-scm.com/ 下载 Git。
注意
再一次,Mac 和 Linux 用户可以使用他们的包管理器:分别使用 brew install git 和 apt-get install git。你看到了一个规律吗?
步骤 4:安装 BitcoinJ
BitcoinJ 是一个比特币库,能够“理解比特币”,并且可以直接连接到比特币网络。通过调用该库中的函数,我们可以实时发送和接收比特币。
我们将直接从其权威源构建 bitcoinJ。通过控制台导航到你希望安装 bitcoinJ 库的目录(你的Home目录是一个不错的选择)。
注意
将会创建一个新的子目录,因此该目录中的其他现有文件不会受到此安装的影响。
在控制台中输入以下内容(在 Windows 上,你可能需要使用安装 Git 时提供的特殊 Git Bash 控制台):
> git clone https://github.com/bitcoinj/bitcoinj.git ➊
> cd bitcoinj
> git checkout cbbb1a2 ➋
> mvn install ➌
第一行从权威网站 ➊ 下载 bitcoinJ 代码。然后,我们使用 git 切换到该库的一个旧版本,使用git checkout命令 ➋。在本教程中,该命令将帮助我们避免因库的更新版本而可能出现的任何问题。然而,当你完成教程后,你可以切换到 bitcoinJ 的最新版本(git checkout master)来尝试其新特性。最后一行将该包安装到本地 Maven 包仓库 ➌。当我们从程序中引用 bitcoinJ 时,Maven 将从该仓库中获取,而不是从互联网上获取,这样我们可以确保使用的是未被篡改的库版本。
现在我们终于可以开始编程了!
为 hello-money 创建一个启动项目
在附录 A 中,我们创建了一个名为Hello Money!的 JavaScript 程序,用于检测何时向比特币地址发送资金。现在,我们将使用 Java 和 bitcoinJ 编写一个更复杂的程序,完成相同的任务。从控制台中,导航到你希望新程序所在的目录,比如你的计算机的Home或Documents文件夹。该目录下将会创建一个子目录。
现在输入以下命令让 Maven 创建一个空的启动项目:
mvn archetype:generate -DgroupId=hellomoney -DartifactId=hello-money
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
这些命令将在当前位置创建一个名为hello-money的目录,并放置hello-money启动项目。
注意
如果 Maven 在此过程中提示你输入答案,只需不断按 ENTER 键以使用默认设置。
接下来,我们需要告诉 Maven 这个程序将使用一些外部库。我们通过编辑pom.xml文件来实现这一点,该文件现在应该已经存在于新目录中。在这个文件中,还应该有一个名为<dependencies>的部分,我们将在其中添加 bitcoinJ 作为新的依赖项。在之前的依赖项之后(即在</dependency>这一行之后),添加以下内容:
<dependency>
<groupId>com.google</groupId>
<artifactId>bitcoinj</artifactId>
<version>0.8</version>
<scope>compile</scope>
</dependency>
现在我们将向程序中添加一个名为exec-maven-plugin的插件。插件是一种特殊类型的库。exec-maven-plugin将使我们能够更轻松地从命令行运行已完成的程序。
在pom.xml文件的最底部(即在</dependencies>这一行之后),添加以下内容:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<arguments>
</arguments>
<mainClass>hellomoney.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
现在我们准备好第一次运行这个空的程序作为测试了。要做到这一点,请在程序的目录中从控制台执行以下几行:
> mvn install ➊
> mvn exec:java ➋
Hello World!
第一行 ➊ 将所有必要的库加载到项目中,并将程序构建成 Java 字节码文件。第二行 ➋ 实际上运行程序。
如果程序成功运行,屏幕上应该会显示Hello World!。这意味着 Maven 已经成功创建了一个功能正常的 Java 程序,我们现在可以开始编写核心的比特币代码。
编写 hello-money 代码
我们的hello-money程序的完整代码如下。要将其添加到项目中,请打开文件src/main/java/hellomoney/App.java并将其内容替换为该程序:
package hellomoney;
import com.google.bitcoin.core.*;
import com.google.bitcoin.store.*;
import com.google.bitcoin.discovery.DnsDiscovery;
import java.io.File;
import java.math.BigInteger;
public class App
{
public static void main( String[] args ) throws BlockStoreException
{
NetworkParameters params = NetworkParameters.prodNet();
Wallet wallet = new Wallet(params);
ECKey key = new ECKey();
System.out.println("Public address: " +
key.toAddress(params).toString());
System.out.println("Private key: " +
key.getPrivateKeyEncoded(params).toString());
wallet.addKey(key);
File file = new File("my-blockchain");
SPVBlockStore store=new SPVBlockStore(params, file);
BlockChain chain = new BlockChain(params, wallet, store);
PeerGroup peerGroup = new PeerGroup(params, chain);
peerGroup.addPeerDiscovery(new DnsDiscovery(params));
peerGroup.addWallet(wallet);
peerGroup.start();
peerGroup.downloadBlockChain();
wallet.addEventListener(new AbstractWalletEventListener()
{
public void onCoinsReceived(Wallet wallet,
Transaction tx, BigInteger prevBalance,
BigInteger newBalance)
{
System.out.println("Hello Money! Balance: "
+ newBalance + " satoshis");
}
});
while(true){}
}
}
接下来,运行命令mvn install,该命令会检查新程序代码的语法并将其构建成程序文件。如果构建成功,应该会显示BUILD SUCCESS的消息(以及大量其他复杂的消息)。
在运行程序之前,让我们一步一步地了解它是如何工作的。
程序顶部的声明
程序的第一行声明了包的名称:
package hellomoney;
接下来,我们声明程序将引用的所有库:
import com.google.bitcoin.core.*;
import com.google.bitcoin.store.*;
import com.google.bitcoin.discovery.DnsDiscovery;
import java.io.File;
import java.math.BigInteger;
其中三项引用是比特币相关的类:首先,我们将使用核心库来访问基本的比特币类(例如钱包和密钥的类)。其次,我们需要用于存储区块链的类(在 BitcoinJ 术语中称为区块存储)。第三,我们需要使用DnsDiscovery类,它帮助我们找到参与比特币网络的其他节点。我们导入java.io.File类,因为我们将把区块存储写入文件,并且导入java.math.BigInteger类来处理大整数。
现在让我们定义一个 Java 类来保存这个程序:
public class App
{
public static void main( String[] args ) throws BlockStoreException
{
程序代码存储在一个名为App的新类中,该类包含一个名为main的成员函数。我们在pom.xml文件中提到过这个hellomoney.App类,将其声明为程序的主类。
让我们逐行看看主函数中的代码。
初始化我们的 Java 对象
这是从 bitcoinJ 库中初始化我们需要的 Java 对象的代码。
NetworkParameters params = NetworkParameters.prodNet();➊
Wallet wallet = new Wallet(params);➋
ECKey key = new ECKey();➌
System.out.println("Public address: " +➍
key.toAddress(params).toString());
System.out.println("Private key: " +➎
key.getPrivateKeyEncoded(params).toString());
wallet.addKey(key);➏
我们首先获取主生产比特币网络的网络参数➊。虽然实际用于交易的只有一个真正的比特币网络,但使用真实货币彻底测试比特币系统是困难的;因此,比特币开发者还维护了一个名为TestNet的第二个比特币网络,仅供测试使用。NetworkParameters结构包含有关创世区块(区块链中的第一个区块)以及最大硬币数量等多个其他细节的信息,这些信息在主比特币网络和 TestNet 之间可能有所不同。通过将所有这些信息打包在NetworkParameters数据结构中,我们可以轻松地将程序连接到除主比特币网络之外的其他网络,如 TestNet。
接下来,我们创建一个新的空钱包,并将其设置为接收我们的比特币➋。如前所述,比特币钱包包含一个或多个比特币地址,每个比特币地址由公钥和私钥组成。这里➌,bitcoinJ 库为我们创建了一对新的密钥对。然后,我们打印出生成的公钥地址和私钥 ➍➎。最后,我们将新的密钥对添加到钱包中 ➏。
警告
通常,在使用 bitcoinJ 时,你应该每次运行程序时重用相同的钱包,并在每次程序启动/停止时加载/保存它,否则程序可能会丢失资金。这对简单的 hello-money 程序不是问题。但是,在构建更复杂的 bitcoinJ 程序之前,请阅读“使用比特币钱包时的陷阱”第 239 页。
比特币应用不仅需要一个钱包,还需要一个区块链。以下几行代码为我们初始化一个新的区块链:
File file = new File("my-blockchain");➊
SPVBlockStore store = new SPVBlockStore(params, file);➋
BlockChain chain = new BlockChain(params, wallet, store);➌
由于区块链消耗大量空间,我们将其写入一个名为my-blockchain的文件➊。接下来,我们创建一个区块存储,它是一个管理我们庞大区块链数据的对象➋。BitcoinJ 提供了几种不同类型的区块存储,每种类型在特性和性能上都有不同的权衡。在这个示例中,我们将使用一个SPVBlockStore对象,它通常是大多数应用的最佳选择。
那么,你需要了解哪些权衡呢?最大的性能挑战是,任何与比特币相关的应用都必须处理官方比特币区块链的大小,这个区块链的体积已经超过 10GB。大多数比特币应用真的需要这 10GB 的区块链数据吗?
为了回答这个问题,让我们考虑区块链存在的原因。从简化的角度来看,比特币区块链负责两项主要工作:
1. 确定网络中每个人拥有多少比特币
2. 确定通过网络广播的新交易是否有效
对于第一个任务,区块链允许我们检查所有历史区块并汇总关于每个比特币地址的综合数据,了解每个地址中包含了多少资金。对于第二个任务,它允许我们检查由网络创建的新交易区块,然后验证这些区块是否包含适当的哈希信息,以证明它们是根据最新难度要求正确挖掘的区块。
但考虑一下区块链的第一个任务:大多数应用程序需要辨别每个钱包中的资金数量吗?不,大多数应用程序只需要确定一个或少数几个钱包中的资金数量。因此,并不需要全部的 10GB 数据。先知般的中本聪在他原始的比特币白皮书中能够预见到,在这种情况下,可能会有一种名为 简化支付验证(SPV) 的优化方法。
注意
我们在第九章中也简要介绍了 SPV,讨论了不同类型的比特币钱包时。
下面是关于 SPV 工作原理的简要回顾:如果你提前知道自己对一个单一钱包感兴趣,你可以在从比特币网络拉取整个历史区块链时,直接统计该钱包中的金额。到那时,你只需要存储区块的头部信息,并且在大多数情况下可以完全忽略旧区块中的信息,这正是 SPVBlockStore 所做的事情。通过这样做,SPVBlockStore(截至 2014 年)的大小不到 1GB,只有官方区块链的十分之一,这就是为什么我们使用 SPVBlockChain 来存储我们的数据。
一旦我们创建了区块存储,我们就可以用它来创建一个 BlockChain 对象 ➌。请注意,当我们创建这个 BlockChain 对象时,我们必须传入我们创建的钱包。因为我们不需要下载全部的 10GB 数据,区块链对象需要提前知道哪些钱包(及其地址)对我们来说很重要,以便它可以选择正确的区块链数据进行下载。
注意
尽管 SPVBlockStore 的大小远小于完整的区块链,但仍然可能需要很长时间才能从网络下载所有需要的数据——通常大约需要 20 分钟。然而,它会将这些数据写入文件,并且 SPVBlockStore 对象足够智能,可以检查提供的文件,看看自上次运行程序以来是否有数据已经下载。如果有,它只会下载自程序上次运行以来到达的新数据。
连接到比特币网络
拥有一个钱包和存储区块链数据的位置后,我们现在可以连接到实际的比特币网络。比特币节点通过连接到几个半随机的对等节点来连接到比特币网络。以下是启动与多个对等节点连接的代码:
PeerGroup peerGroup = new PeerGroup(params, chain);➊
peerGroup.addPeerDiscovery(new DnsDiscovery(params));➋
peerGroup.addWallet(wallet);➌
peerGroup.start();➍
peerGroup.downloadBlockChain();➎
首先,我们创建一个PeerGroup对象 ➊ 来管理这些连接。接下来,我们选择一些随机的节点进行连接。我们通过向PeerGroup添加一个节点发现算法来实现这一点 ➋。DnsDiscovery类基本上使用一些经过验证的、可信的节点的 URL 作为起点,来发现愿意接受新连接的节点。然后,我们将钱包添加到PeerGroup对象中 ➌。
现在,我们终于准备好将应用程序注入到比特币网络中了!我们通过调用PeerGroup.start ➍来实现,这将找到并连接到一些节点,并通过网络套接字执行适当的握手操作。而且,就像任何比特币节点一样,我们要求对等节点向我们发送区块链数据,以便我们能够成为一个完全功能的节点 ➎。正如之前所提到的,这一步骤需要一些时间来运行,但仅在我们第一次运行程序时需要。
监听新资金
我们需要向hello-money程序添加的最后一个功能是一个钩子,用于检测资金何时到达:
wallet.addEventListener(new AbstractWalletEventListener()➊
{
public void onCoinsReceived(Wallet wallet, Transaction tx,➋
BigInteger prevBalance, BigInteger newBalance)
{
System.out.println("Hello Money! Balance: "
+ newBalance + " satoshis");
}
});
bitcoinJ 钱包对象具有一个addEventListener成员函数,我们可以创建一个匿名的EventListener类,来拦截并监听可能发生在钱包上的不同事件 ➊。在我们的应用程序中,我们关心的是onCoinsReceived函数 ➋,它将在每次收到资金时被调用。让我们更详细地探讨一下这究竟意味着什么。
由于该程序直接运行在比特币网络中,它可以监听比特币火流,这是一个包含全球任何地方发生的每一笔比特币交易的实时数据流。每一笔交易都会被检查,以确定它是否涉及到向我们钱包中的任何比特币地址接收资金。在我们的应用程序中,钱包只包含一个地址。只要这笔交易到达(即使它还没有被纳入挖矿区块),我们的函数onCoinsReceved就会被调用。
注意
在 hello-money 程序中,我们不需要担心捕获已接收资金的确认事件;我们只会监听新交易(未确认交易)的传输。然而,如果我们对确认感兴趣,我们可以通过 onTransactionConfidenceChanged 函数捕获它们。因为我们运行的是完整的比特币客户端,我们可以做任何事情,而在附录 A 中,我们被迫仅查看已确认的交易,这是由于 JSON-RPC 接口的限制。
onCoinsReceived 函数有四个传入参数 ➋:钱包对象、交易对象、钱包中的之前余额和新的余额。bitcoinJ 库使用 Java 的 BigInteger 类来编码比特币余额,因为这种数值类型能够精确处理非常大的整数。如果你之前写过金融软件,你就知道为什么使用 BigInteger 类(或者你可能还记得电影 Office Space 中如何策划银行抢劫)。事实上,由于四舍五入错误,金融交易很容易搞砸,而使用大且精确的整数可以防止这个问题。因此,bitcoinJ 在进行所有比特币数学运算时,都会使用 satoshi——比特币的最小单位,价值为比特币的亿分之一。
注意
因为我们在 下载初始区块链后添加了事件监听器,所以 onCoinsReceived 函数只有在程序运行时出现新交易时才会被调用。如果我们在下载初始区块链之前声明它,bitcoinJ 的设计会导致 onCoinsReceived 也会在相关历史交易中被调用。
最后,我们将程序置于一个无限循环中,这样程序会持续运行,直到我们等待钱款到账:
while(true){}
运行和测试 hello-money Java 程序
我们准备好运行并测试程序了!和之前一样,我们首先编译程序,然后运行:
> mvn install
> mvn exec:java
当程序连接到比特币网络并下载区块链时,一些信息应该会显示出来。第一次运行程序时,这可能需要一些时间:
Public address: 16YavT6SmJCuJpZgzRa6XG9WefPEu2M45
Private key: L3eoA1rXiD8kWFUzdxw744NWjoZNB5BGsxhzVas6y5KJgVteZ4uD
Downloading block chain of size 265184\. This may take a while.
Chain download 1% done with 262532 blocks to go, block date Feb 1, 2009 5:09:55 PM
Chain download 2% done with 259880 blocks to go, block date Feb 22, 2009 11:32:14 PM
Chain download 3% done with 257228 blocks to go, block date Mar 18, 2009 9:59:38 PM
Chain download 4% done with 254576 blocks to go, block date Apr 11, 2009 4:27:52 PM
Chain download 5% done with 251924 blocks to go, block date May 4, 2009 9:23:54 AM
...
Done downloading block chain
区块链下载完成后,你可以测试 hello-money 程序,并从你喜欢的钱包应用发送少量资金。只需将 0.0002 BTC 发送到公开地址,并记录下私钥(我们将在后续的示例程序中使用这些资金)。程序应该能够检测到资金到账并显示类似以下信息:
Hello Money! Balance: 20000 satoshis
钱包中的新余额应该以 satoshis 显示(除以 100,000,000 即可看到该数值确实为 0.0002 BTC)。
你已经成功编写了一个 bitcoinJ 程序,它创建了一个比特币钱包,并报告任何收到的资金。现在,让我们编写第二个程序,使用新存储的资金!
拜拜,钱
现在,让我们编写一个全新的程序,可以从任意比特币地址发送资金。要创建一个新的 bye-bye-money 程序,请在顶层程序目录中运行以下命令:
mvn archetype:generate -DgroupId=byebyemoney -DartifactId=bye-bye-money
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
然后,按照我们在hello-money示例中所做的,准确地对 pom.xml 文件进行相同的添加,只是将 <mainClass>hellomoney.App</mainClass> 这一行改为 <mainClass>byebyemoney.App</mainClass>。(这些步骤类似于我们在 “为 hello-money 创建一个启动项目” 中的操作,见第 228 页)
就像以前一样,打开文件src/main/java/byebyemoney/App.java,并将其内容替换为以下程序:
package byebyemoney;
import com.google.bitcoin.core.*;
import com.google.bitcoin.store.*;
import com.google.bitcoin.discovery.DnsDiscovery;
import java.util.concurrent.ExecutionException;
import java.io.File;
import java.math.BigInteger;
public class App
{
public static void main( String[] args )
throws BlockStoreException, AddressFormatException,
InterruptedException, ExecutionException
{
NetworkParameters params = NetworkParameters.prodNet();
Wallet wallet = new Wallet(params);
DumpedPrivateKey key = new DumpedPrivateKey(params,
"L1vJHdDqQ5kcY5q4QoY124zD21UVgFe6NL2835mp8UgG2FNU94Sy");
wallet.addKey(key.getKey());
BlockChain chain = new BlockChain(params, wallet,
new MemoryBlockStore(params));
PeerGroup peerGroup = new PeerGroup(params, chain);
peerGroup.addPeerDiscovery(new DnsDiscovery(params));
peerGroup.addWallet(wallet);
peerGroup.start();
peerGroup.downloadBlockChain();
BigInteger balance = wallet.getBalance();
System.out.println("Wallet balance: " + balance);
Address destinationAddress = new Address(params,
"1BTCorgHwCg6u2YSAWKgS17qUad6kHmtQW");
BigInteger fee=BigInteger.valueOf(10000);
Wallet.SendRequest req = Wallet.SendRequest.to(
destinationAddress,balance.subtract(fee));
req.fee = fee;
Wallet.SendResult result = wallet.sendCoins(peerGroup, req);
if(result != null)
{
result.broadcastComplete.get();
System.out.println("The money was sent!");
}
else
{
System.out.println("Something went wrong sending the money.");
}
}
}
新程序中的许多行与我们之前的hello-money程序共享,但让我们仔细看一下新的部分。
导入私钥
要从我们的程序发送资金,我们需要导入前一个示例中的比特币地址的私钥。下面是执行此操作的代码:
DumpedPrivateKey key = new DumpedPrivateKey(params,➊
"L1vJHdDqQ5kcY5q4QoY124zD21UVgFe6NL2835mp8UgG2FNU94Sy");
wallet.addKey(key.getKey());➋
BlockChain chain = new BlockChain(params, wallet,➌
new MemoryBlockStore(params));
在前几行中,我们显式地将一个新的、已有的私钥添加到我们的钱包中 ➊➋。这是与在hello-money程序中接收资金的比特币地址相关的私钥。你需要将这一行中显示的私钥替换为你在运行之前示例时写下的私钥。此外,在这个新程序中,我们不使用SPVBlockStore功能;相反,我们使用 bitcoinJ 的MemoryBlockStore ➌功能作为变体。这个块存储不会创建文件,但通过使用它,我们的程序每次运行时都需要重新下载区块链。(这也保证了 bitcoinJ 会将正确的余额分配给钱包。我们将在《使用 BitcoinJ 钱包时的陷阱》一节中讨论原因,见第 239 页。)
发送资金
现在让我们看看实际上发送资金的代码:
BigInteger balance = wallet.getBalance();➊
System.out.println("Wallet balance: " + balance);➋
Address destinationAddress = new Address(params,➌
"1BTCorgHwCg6u2YSAWKgS17qUad6kHmtQW");
BigInteger fee = BigInteger.valueOf(10000);➍
Wallet.SendRequest req = Wallet.SendRequest.to(➎
destinationAddress,balance.subtract(fee));
req.fee = fee;➏
Wallet.SendResult result = wallet.sendCoins(peerGroup, req);➐
首先,我们获取钱包中包含的余额 ➊ 并显示它 ➋。接下来,我们声明资金应该发送到的目标地址 ➌。在此示例中,我们输入比特币基金会的主要捐赠地址;你可以自由替换为你自己钱包的公开地址。
现在,发送比特币时最好包含交易费用,我们声明费用为 10,000 聪 ➍。接下来,我们创建一个SendRequest对象 ➎,这是一个结构体,用于保存我们正在发送的基本信息,包括目标地址和要发送的金额(即余额减去费用)。然后,我们在这个对象上设置费用 ➏,并发送我们的资金 ➐!
确保资金传输
如果我们尝试发送比我们拥有的更多资金,如果费用不足,或者如果在错误的时刻互联网连接中断,资金可能永远不会被网络接受。因此,我们需要编写代码,等待并确保我们发送的资金传输到网络。以下是我们为此添加的代码:
result.broadcastComplete.get();➊
System.out.println("The money was sent!");➋
代码的第一行 ➊ 获取一个 Java future对象,这表明发送的交易已经正确地广播到网络。(Java 中的标准,future 用于获取关于单独执行线程的信息——在此情况下,是监控与比特币网络通信的线程。)如果这一行没有抛出异常,则我们会显示一条消息,表示资金已发送 ➋。
运行 bye-bye-money
我们可以像往常一样运行bye-bye-money(记得输入你自己的私钥):
> mvn install
> mvn exec:java
比特币 J 中的异常类型
在这个示例中,我们省略了一个功能:错误处理。主函数简单地重新抛出了一些不同的异常,处理在发送资金时可能出现的错误。这些包括以下异常:
• BlockStoreException:当无法创建区块存储时,会抛出此异常(最常见的情况是,使用写入文件的区块存储类型时,文件损坏导致无法创建)。
• AddressFormatException:当地址格式不正确时,会抛出此异常。
• InterruptedException:当发生网络连接问题时,会抛出此异常。
• ExecutionException:当我们使用 future 对象并且在其他线程中发生异常时,会抛出此异常(例如,当我们检查交易广播是否完成时)。
在更复杂的比特币应用中,你应该单独捕获所有这些异常类型,并为应用用户添加更具描述性的错误信息。
由于该程序在内存中处理区块链,因此你需要等待几分钟或更长时间才能完成(即使你重新运行它)。如果程序成功,你将看到消息资金已发送!,资金应该到达目标钱包。你还可以访问区块链信息网站(如 blockchain.info/),输入源地址或目标地址,查看交易的详细信息是否已成为公共记录的一部分。
恭喜!你现在已经了解了编写比特币应用的基础知识!
使用 Wallets 在 BitcoinJ 中的注意事项
对于新手来说,钱包和 BlockChain 对象在 bitcoinJ 中的工作方式可能非常令人困惑。如果你没有完全理解 bitcoinJ 的行为,bitcoinJ 可能会报告不正确的钱包余额。
这发生的原因是 bitcoinJ 针对 SPV 区块链的概念进行了优化。我们之前讨论过 SPV 区块链的性能优势,但由于它们只包含有限的区块链数据,你需要遵循一些基本规则,以确保它们在 bitcoinJ 中正常工作:
1. 如果你的应用钱包中已经有余额,bitcoinJ 需要在从网络下载区块链之前,了解余额的数量*。
2. 区块链加载完成后,bitcoinJ 将执行必要的任务,以确保钱包在网络上出现新交易时的准确性。
3. 如果你使用的是支持保存到磁盘文件的区块存储类型,那么你的应用也需要负责将钱包保存到文件(同样,它还需要负责加载区块存储和钱包数据)。
正如我们在构造 BlockChain 对象时所看到的,bitcoinJ 期望应用程序传递一个钱包对象。这使得当下载的区块中发现相关的历史交易时,可以更新钱包,并确保规则 #1 被执行:确保在事后不向钱包中添加额外的密钥,并期望钱包在不重新下载区块链的情况下正常工作。
类似地,当我们初始化PeerGroup对象时,我们调用了addWallet()将我们的钱包添加到对等组中。通过这样做,bitcoinJ 保持钱包余额与比特币网络中出现的任何新交易同步,同时遵循规则#2。
为了确保遵循规则#3,你可以使用Wallet.loadFromFile()和Wallet.saveToFile()函数。同时,还有一个Wallet.autoSaveToFile()函数,它可以帮助加载和保存区块存储和钱包数据。要了解如何正确使用这些函数,请查看 bitcoinJ 库中的示例程序。
如果你记住之前列出的三个基本原则,你将避免大多数掌握 bitcoinJ 过程中可能遇到的陷阱。
结论
我们希望你享受了这次关于 bitcoinJ 编程的旅程,我们期待看到你所开发的任何精彩新应用。毕竟,你构建的应用可能会彻底改变人们在互联网时代与金钱互动的方式!




















浙公网安备 33010602011771号