《精通比特币》作者:Andreas M.Antonopoulos。
本书下载地址:http://zhibimo.com/books/wang-miao/mastering-bitcoin
翻译:薄荷凉幼;陈萌琦;陈姝吉;程鹏;程西园;达文西;吉鸿帆;李丹;李润熙;李凌豪;李昕阳;刘畅;吕新浩;马峰;牛东晓;秦彤;邱頔;邱蒙;戎如香;史磊;汪海波;王宏钢;辛颖;杨兵;尹文东;余龙;张林;张琦张大嫂;张亚超;张泽铭;赵冬帅;赵
余;YANG YANG。
第 8 章 挖矿与共识
8.1 简介
挖矿是增加比特币货币供应的一个过程。挖矿同时还保护着比特币系统的安全,防止欺诈交易,避免“双重支付”,“双重支付”是指多次花费同一笔比特币。矿工们通过为比特币网络提供算力来换取获得比特币奖励的机会。
矿工们验证每笔新的交易并把它们记录在总帐簿上。每 10 分钟就会有一个新的区块被“挖掘”出来,每个区块里包含着从上一个区块产生到目前这段时间内发生的所有交易,这些交易被依次添加到区块链中。我们把包含在区块内且被添加到区块链上的交易称为“确认”交易,交易经过“确认”之后,新的拥有者才能够花费他在交易中得到的比特币。
矿工们在挖矿过程中会得到两种类型的奖励:创建新区块的新币奖励,以及区块中所含交易的交易费。为了得到这些奖励,矿工们争相完成一种基于加密哈希算法的数学难题,这些难题的答案包括在新区块中,作为矿工的计算工作量的证明,被称为”“工作量证明”。该算法的竞争的机制以及获胜者有权在区块链上进行交易记录的机制,这二者比特币安全的基石。
新比特币的生成过程被称为挖矿是因为它的奖励机制被设计为速度递减模式,类似于贵重金属的挖矿过程。比特币的货币是通过挖矿发行的,类似于中央银行通过印刷银行纸币来发行货币。矿工通过创造一个新区块得到的比特币数量大约每四年(或准确说是每隔 210,000 个块)减少一半。开始时为 2009 年 1月每个区块奖励 50 个比特币,然后到 2012 年 11 月减半为每个区块奖励 25个比特币。之后将在 2016 年的某个时刻再次减半为每个新区块奖励 12.5 个比特币。基于这个公式,比特币挖矿奖励以指数方式递减,直到 2140 年。届时所有的比特币(20,999,999,980)全部发行完毕。换句话说在 2140 年之后,不会再有新的比特币产生。
矿工们同时也会获取交易费。每笔交易都可能包含一笔交易费,交易费是每笔交易记录的输入和输出的差额。在挖矿过程中“挖出”新区块的矿工获胜者可以得到该区块中包含的所有交易“小费”。目前,这笔费用占矿工收入的 0.5%或更少,大部分收益仍来自挖矿所得的比特币奖励。然而随着挖矿奖励的递减,以及每个区块中包含的交易数量增加,交易费在矿工收益中所占的比重将会逐渐增加。在 2140 年之后,所有的矿工收益都将由交易费构成。
“挖矿”这个词有一定的误导性。它容易引起对贵重金属采矿的的联想,从而使我们的注意力都集中在每个新区块产生的奖励上。尽管挖矿带来的奖励是一种激励,但它最主要的目的并不是奖励本身或者新币的产生。如果只把挖矿看作生产新币的过程,那你是把手段(激励措施)当成了目的。挖矿是一种将结算所去中心化的过程,每个结算所对处理的交易进行验证和结算。挖矿保护了比特币系统的安全,并且实现了在没有中心机构的情况下,也能使整个比特币网络达成共识。
挖矿这个发明使比特币变得很特别,这种去中心化的安全机制是点对点的电子货币的基础。铸造新币的奖励和交易费是一种激励机制,它可以调节矿工行为和网络安全,同时又完成了比特币的货币发行。
在本章中,我们先来审视比特币的货币发行机制,然后再来了解挖矿的最重要的功能:支撑比特币安全的去中心化的自发共识机制。
8.1.1 比特币经济学和货币创造
通过创造出新区块,比特币以一个确定的但不断减慢的速率被铸造出来。大约每十分钟产生一个新区块, 每一个新区块都伴随着一定数量从无到有的全新比特币。每开采 210,000 个块,大约耗时 4 年,货币发行速率降低 50%。在比特币运行的第一个四年中,每个区块创造出 50 个新比特币。
2012 年 11 月,比特币的新发行速度降低到每区块 25 个比特币,并且预计会在 2016 年的某个时刻, 在第 420,000 个区块被 “挖掘” 出来之后 降低到 12.5比特币/区块。在第 13,230,000 个区块(大概在 2137 年被挖出)之前,新币的发行速度会以指数形式进行 64 次“二等分”。到那时 每区块发行比特币数量变为比特币的最小货币单位——1 聪。最终,在经过 1,344 万个区块之后,所有的共 2,099,999,997,690,000 聪比 特币将全部发行完毕。换句话说,到 2140年左右,会存在接近 2,100 万比特币。在那之后, 新的区块不再包含比特币奖励,矿工的收益全部来自交易费。
总量有限并且发行速度递减创造了一种抗通胀的货币供应模式。法币可被中央银行无限制地印刷出来,而比特币永远不会因超额印发而出现通胀。
通货紧缩货币
最重要并且最有争议的一个结论是一种事先确定的发行速率递减的货币发行模式会导致货币通货紧缩(简称通缩)。通缩是一种由于货币的供应和需求不匹配导致的货币增值的现象。它与通胀相反,价格通缩意味着货币随着时间有越来越强的购买力。
8.2 去中心化共识
在上一章中我们了解了区块链。可以将区块链看作一本记录所有交易的公开总帐簿(列表),比特币网络中的每个参与者都把它看作一本所有权的权威记录。但在不考虑相信任何人的情况下, 比特币网络中的所有参与者如何达成对任意一个所有权的共识呢?所有的传统支付系统都依赖于一个中心认证机构,依靠中心机构提供的结算服务来验证并处理所有的交易。比特币没有中心机构,几乎所有的完整节点都有一份公共总帐的备份,这份总帐可以被视为认证过的记录。区块链并不是由一个中心机构创造的,它是由比特币网络中的所有节点各自独立竞争完成的。换句话说比特币网络中的所有节点,依靠着节点间的不稳定的网络连接所传输的信息,最终得出同样的结果并维护了同一个公共总帐。这一章将介绍比特币网络不依靠中心机构而达成共识的机制。
中本聪的主要发明就是这种去中心化的自发共识机制。这种自发,是指没有经过明确选举或者没有固定达成的共识的时间。换句话说,共识是数以千计的独立节点遵守了简单的规则通过异步交互自发形成的产物。所有的比特币属性,包括货币、交易、支付以及不依靠中心机构和信任的安全模型等都是这个机制的衍生物。比特币的去中心化共识由所有网络节点的 4 种独立过程相互作用而产生:
▷ 每个全节点依据综合标准对每个交易进行独立验证
▷ 通过完成工作量证明算法的验算,挖矿节点将交易记录独立打包进新区块,
▷ 每个节点独立的对新区块进行校验并组装进区块链
▷ 每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链
在接下来的几节中,我们将审视这些过程,了解它们之间如何相互作用并达成全网的自发共识,从而使任意节点组合出它自己的权威、可信、公开的总帐。
8.3 交易的独立校验
在第 5 章中,我们知道了钱包软件通过收集 UTXO、提供正确的解锁脚本、构造支付给接收者的输出这一系列的方式来创建交易。 产生的交易随后将被发送到比特币网络临近的节点,从而使得该交易能够在整个比特币网络中传播。然而,在交易传递到临近的节点前,每一个收到交易的比特币节点将会首先验证该交易,这将确保只有有效的交易才会在网络中传播,而无效的交易将会在第一个节点处被废弃。
每一个节点在校验每一笔交易时,都需要对照一个长长的标准列表:
▷交易的语法和数据结构必须正确。
▷输入与输出列表都不能为空。
▷交易的字节大小是小于 MAX_BLOCK_SIZE 的。
▷每一个输出值,以及总量,必须在规定值的范围内 (小于 2,100 万个币,大于 0)。
▷没有哈希等于 0,N 等于-1 的输入(coinbase 交易不应当被中继)。
▷nLockTime 是小于或等于 INT_MAX 的。
▷交易的字节大小是大于或等于 100 的。
238
▷交易中的签名数量应小于签名操作数量上限。
▷解锁脚本(scriptSig)只能够将数字压入栈中,并且锁定脚本(scriptPubkey)
必须要符合 isStandard 的格式 (该格式将会拒绝非标准交易)。
▷池中或位于主分支区块中的一个匹配交易必须是存在的。
▷对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝。
▷对于每一个输入,在主分支和交易池中寻找引用的输出交易。如果输出交易缺
少任何一个输入,该交易将成为一个孤立的交易。如果与其匹配的交易还没有出
现在池中,那么将被加入到孤立交易池中。
▷对于每一个输入,如果引用的输出交易是一个 coinbase 输出,该输入必须至
少获得 COINBASE_MATURITY (100)个确认。
▷对于每一个输入,引用的输出是必须存在的,并且没有被花费。
▷使用引用的输出交易获得输入值, 并检查每一个输入值和总值是否在规定值的范围内 (小于 2100 万个币,大于 0)。
▷如果输入值的总和小于输出值的总和,交易将被中止。
▷如果交易费用太低以至于无法进入一个空的区块,交易将被拒绝。
▷每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证。
这些条件能够在比特币标准客户端下的 AcceptToMemoryPool、CheckTransaction 和 CheckInputs 函数中获得更详细的阐述。请注意,这些条件会随着时间发生变化,为了处理新型拒绝服务攻击,有时候也为交易类型多样
化而放宽规则。
在收到交易后,,每一个节点都会在全网广播前对这些交易进行校验,并以接收时的相应顺序,为有效的新交易建立一个池(交易池)。
8.4 挖矿节点
在比特币网络中,一些节点被称为专业节点矿工。
新区块并不仅仅是象征着竞赛结束的方格旗;它也是下一个区块竞赛的发令枪。
8.5 整合交易至区块
验证交易后,比特币节点会将这些交易添加到自己的内存池中。内存池也称作交易池,用来暂存尚未被加入到区块的交易记录。与其他节点一样,Jing 的节点会收集、验证并中继新的交易。而与其他节点不同的是,Jing 的节点会把这些交易整合到一个候选区块中。
8.5.1 交易块龄, 矿工费和优先级
Jing 的比特币节点需要为内存池中的每笔交易分配一个优先级,并选择较高优先级的交易记录来构建候选区块。交易的优先级是由交易输入所花费的UTXO 的“块龄”决定,交易输入值高、“块龄”大的交易比那些新的、输入值
小的交易拥有更高的优先级。如果区块中有足够的空间,高优先级的交易行为将不需要矿工费。
交易的优先级是通过输入值和输入的“块龄”乘积之和除以交易的总长度得到的:
UTXO 的“块龄”是自该 UTXO 被记录到区块链为止所经历过的区块数,即这个 UTXO 在区块链中的深度。交易记录的大小由字节来表示。一个交易想要成为“较高优先级”,需满足的条件:优先值大于 57,600,000,相当于一个比特币(即 100 万聪),年龄为一天(144 个区块),交易的大小为 250 个字节。
8.5.2 创币交易
区块中的第一笔交易是笔特殊交易,称为创币交易或者 coinbase 交易。
与
常规交易不同,创币交易没有输入,不消耗 UTXO。它只包含一个被称作coinbase 的输入,仅仅用来创建新的比特 币。创币交易有一个输出,支付到这个矿工的比特币地址。
8.5.3 Coinbase 奖励与矿工费
8.5.4 创币交易的结构
8.5.5 Coinbase 数据
创币交易不包含“解锁脚本“(又称作 scriptSig)字段,这个字段被 coinbase数据替代,长度最小 2 字节,最大 100 字节。除了开始的几个字节外,矿工可以任意使用 coinbase 的其他部分,随意填充任何数据。
8.6 构造区块头
为了构造区块头,挖矿节点需要填充六个字段,如表 8-3 中所示。
区块头完成全部的字段填充后,挖矿就可以开始进行了。挖矿的目标是找到一个使区块头哈希值小于难度目标的 nonce。挖矿节点通常需要尝试数十亿甚至数万亿个不同的 nonce 取值,直到找到一个满足条件的 nonce 值。
8.7 构建区块
用最简单的术语来说,挖矿就是重复计算区块头的哈希值,不断修改该参数,直到与哈希值匹配的一个过程。 哈希函数的结果无法提前得知, 也没有能得到一 个特定哈希值的模式。哈希函数的这个特性意味着:得到哈希值的唯一方法是不断的尝试,每次随机修改输入,直到出现适当的哈希值。
8.7.1 工作量证明算法
哈希函数的输入数据的长度是任意的,将产生一个长度固定且绝不雷同的值,可将其视为输入的数字指纹。对于特定输入,哈希的结果每次都一样,任何实现 相同哈希函数的人都可以计算和验证。一个加密哈希函数的主要特征就是不同的输入几乎不可能出现相同的数字指纹。因此,相对于随机选择输入,有意地选择输入去生成一个想要的哈希值几乎是不可能的。
无论输入的大小是多少,SHA256 函数的输出的长度总是 256bit。
8.7.2 难度表示
8.7.3 难度目标与难度调整
如前所述,目标决定了难度,进而影响求解工作量证明算法所需要的时间。那么问题来了:为什么这个难度值是可调整的?由谁来调整?如何调整?
比特币的区块平均每 10 分钟生成一个。这就是比特币的心跳,是货币发行速率和交易达成速度的基础。不仅是在短期内,而是在几十年内它都必须要保持恒定。在此期间,计算机性能将飞速提升。此外,参与挖矿的人和计算机也会不断变化。为了能让新区块的保持 10 分钟一个的产生速率,挖矿的难度必须根据这些变化进行调整。事实上,难度是一个动态的参数,会定期调整以达到每 10分钟一个新区块的目标。简单地说,难度被设定在,无论挖矿能力如何,新区块产生速率都 保持在 10 分钟一个
那么,在一个完全去中心化的网络中,这样的调整是如何做到的呢?难度的调整是在每个完整节点中独立自动发生的。每 2,016 个区块中的所有节点都会调整难度。 难度的调整公式是由最新 2,016 个区块的花费时长与 20,160 分钟 (两周,即这些区块以 10 分钟一个速率所期望花费的时长)比较得出的。难度是根据实际时长与期望时长的比值进行相应调整的(或变难或变易)。简单来说,如果网络发现区块产生速率比 10 分钟要快时会增加难度。如果发现比 10 分钟慢时则降低难度。
寻找一个比特币区块需要整个网络花费 10 分钟来处理, 每发现 2,016个区块时会根据前 2,016 个区块完成的时间对难度进行调整。
值得注意的是目标难度与交易的数量和金额无关。这意味着哈希算力的强弱,即让比特币更安全的电力投入量,与交易的数量完全无关。换句话说,当比特币的规模变得更大,使用它的人数更多时,即使哈希算力保持当前的水平,比特币的安全性也不会受到影响。 哈希算力的增加表明更多的人为得到比特币回报而加入了挖矿队伍。只要为了回报,公平正当地从事挖矿的矿工群体保持足够的哈希算力,"接管"攻击就不会得逞,让比特币的安全无虞。
目标难度和挖矿电力消耗与将比特币兑换成现金以支付这些电力之间的关系密切相关。高性能挖矿系统就是要用当前硅芯片以最高效的方式将电力转化为哈希算力。挖矿市场的关键因素就是每度电转换为比特币后的价格。因为这决定着挖矿活动的营利性,也因此刺激着人们选择进入或退出挖矿市场。
8.8 成功构建区块
8.9 校验新区块
比特币共识机制的第三步是通过网络中的每个节点独立校验每个新区块。当新区块在网络中传播时,每一个节点在将它转发到其节点之前,会进行一系列的测试去验证它。这确保了只有有效的区块会在网络中传播。独立校验还确保了诚实的矿工生成的区块可以被纳入到区块链中,从而获得奖励。行为不诚实的矿工所产生的区块将被拒绝,这不但使他们失去了奖励,而且也浪费了本来可以去寻找工作量证明解的机会,因而导致其电费亏损。
当一个节点接收到一个新的区块,它将对照一个长长的标准清单对该区块进行验证,若没有通过验证,这个区块将被拒绝。这些标准可以在比特币核心客户端的 CheckBlock 函数和 CheckBlockHead 函数中获得,它包括:
▷ 区块的数据结构语法上有效
▷ 区块头的哈希值小于目标难度(确认包含足够的工作量证明)
▷ 区块时间戳早于验证时刻未来两个小时(允许时间错误)
▷ 区块大小在长度限制之内
▷ 第一个交易(且只有第一个)是 coinbase 交易
▷ 使用检查清单验证区块内的交易并确保它们的有效性,本书 177 页
▷ “交易的独立校验”一节已经讨论过这个清单。
每一个节点对每一个新区块的独立校验,确保了矿工无法欺诈。在前面的章节中,我们看到了矿工们如何去记录一笔交易,以获得在此区块中创造的新比特币和交易费。为什么矿工不为他们自己记录一笔交易去获得数以千计的比特币?这是因为每一个节点根据相同的规则对区块进行校验。一个无效的coinbase 交 易将使整个区块无效,这将导致该区块被拒绝,因此,该交易就不会成为总账的一部分。矿工们必须构建一个完美的区块,基于所有节点共享的规则,并且根据正确 工作量证明的解决方案进行挖矿,他们要花费大量的电力挖矿才能做到这一点。如果他们作弊,所有的电力和努力都会浪费。这就是为什么独立校验是去中心化共识 的重要组成部分。
8.10 区块链的组装与选择
比特币去中心化的共识机制的最后一步是将区块集合至有最大工作量证明的链中。一旦一个节点验证了一个新的区块,它将尝试将新的区块连接到到现存的区块链,将它们组装起来。
节点维护三种区块:第一种是连接到主链上的,第二种是从主链上产生分支的(备用链),最后一种是在已知链中没有找到已知父区块的。在验证过程中,一旦发现有不符合标准的地方,验证就会失败,这样区块会被节点拒绝,所以也不会加入到任何一条链中。
8.10.1 区块链分叉
比特币将区块间隔设计为 10 分钟,是在更快速的交易确认和更低的分叉概率间作出的妥协。更短的区块产生间隔会让交易清算更快地完成,也会导致更加频繁地区块链分叉。与之相对地,更长的间隔会减少分叉数量,却会导致更长的清算时间。
8.11 挖矿和算力竞赛
比特币挖矿是一个极富竞争性的行业。自从比特币存在开始,每年比特币算力都成指数增长。一些年份的增长还体现出技术的变革, 比如在 2010 年和 2011年,很多矿工开始从使用 CPU 升级到使用 GPU,进而使用 FGPA(现场可编程门阵列)挖矿。在 2013 年,ASIC 挖矿的引入,把 SHA256 算法直接固化在挖矿专用的硅芯片上,引起了算力的另一次巨大飞跃。一台采用这种芯片的矿机可以提供的算力,比 2010 年比特币网络的整体算力还要大。
摩尔定律指出计算能力每 18 个月增加一倍。尽管如此,随着更高密度的芯片和数据中心的部署竞赛,网络算力继续保持同步的指数增长。现在的竞争已经不再是比较单一芯片的能力,而是一个矿场能塞进多少芯片,并处理好散热和供电问题。
8.11.1 随机值升位方案
2012 年以来,比特币挖矿发展出一个解决区块头基本结构限制的方案。
8.11.2 矿池
在这个激烈竞争的环境中,个体矿工独立工作(也就是 solo 挖矿)没有一点机会。他们找到一个区块以抵消电力和硬件成本的可能性非常小,以至于可以称得上是赌博,就像是买彩票。就算是最快的消费型 ASIC 也不能和那些在巨大机房里拥有数万芯片并靠近水电站的商业矿场竞争。现在矿工们合作组成矿池,汇集数以千计参与者们的算力并分享奖励。通过参加矿池,矿工们得到整体回报的一小部分,但通常每天都能得到,因而减少了不确定性。
矿池通过专用挖矿协议协调成百上千的矿工。个人矿工在建立矿池账号后,设置他们的矿机连接到矿池服务器。 他们的挖矿设备在挖矿时保持和矿池服务器的连接,和其他矿工同步各自的工作。这样,矿池中的矿工分享挖矿任务,之后分享奖励。
8.11.2.1 托管矿池
大部分矿池是“托管的”,意思是有一个公司或者个人经营一个矿池服务器。矿池服务器的所有者叫矿池管理员, 同时他从矿工的收入中收取一个百分比的费用。
8.11.2.2 P2P 矿池
托管矿池存在管理人作弊的可能,管理人可以利用矿池进行双重支付或使区块无效。此外,中心化的矿池服务器代表着单点故障。如果因为拒绝服务攻击服务器挂了或者被减慢,池中矿工就不能采矿。在2011 年,为了解决由中心化造成的这些问题,提出和实施了一个新的矿池挖矿方法。P2Pool 是一个点对点的矿池,没有中心管理人。
P2Pool 通过将矿池服务器的功能去中心化,实现一个并行的类似区块链的系统,名叫份额链。一个份额链是一个难度低于比特币区块链的区块链系统。
8.12 共识攻击
比特币的共识机制指的是,被矿工(或矿池)试图使用自己的算力实行欺骗或破坏的难度很大,至少理论上是这样。就像我们前面讲的,比特币的共识机制依赖于这样一个前提,那就是绝大多数的矿工,出于自己利益最大化的考虑,都会通过诚实地挖矿来维持整个比特币系统。然而,当一个或者一群拥有了整个系统中大量算力的矿工出现之后, 他们就可以通过攻击比特币的共识机制来达到破坏比特币网络的安全性和可靠性的目的。
第 9 章 竞争币、 竞争块链和应用程序
比特币是 20 多年的分布式系统和货币研究的结果,是一项具有革命性的新技术:一种基于工作量证明的去中心化的一致性机制。这项比特币的核心发明引领了一场包括货币体系、金融服务、经济学、分布式系统、投票系统、联合监管和合同体系在内的创新浪潮。
本章将探讨比特币和区块链的发明的衍生物:2009 年比特币诞生以来所涌现出来的竞争币、竞争块链和应用程序。大部分篇幅将要探讨竞争币(alt coin) ,这些电子货币有着与比特币相似的的构建模式出来的, 但它们完全独立地运行在自己的网络和块链系统之上。
9.1 竞争币和竞争块链的分类
比特币是一个开源项目,其源代码也作为其他的一些软件项目的基础。由比特币衍生出来的最常见的形式,就是替代性去中心化货币,简称“竞争币”,这类货币使用跟比特币同样的创建块链的方式来实现自己的电子货币系统。在比特币的块链上层,可以实现一系列的协议层。元币、元块链或者块链应用程序以块链为平台,或通过增加协议层的方式扩展比特币协议。如彩色币,万事达币以及合约币。
9.2 元币平台
元币和元块链是在比特币之上实现的软件层,也可以认为是覆盖在比特币系统之上的平台/协议,或者是在一个币中币的实现。这些功能层拓展了核心比特币 协议,使得在比特币交易和比特币地址中编码附加信息成为可能。元币的第一个实现利用了大量的 hack 技巧把元数据添加到比特币块链中,比如使用比特币地址编码数据,或者利用空白的交易字段存放新协议层增加的这些元数据。自从交易脚本操作码问世之后,元币 得以直接将信息存放在块链之中。
9.2.1 染色币
染色币是一种在少量比特币上存储信息的一种元协议。一个“被染色的”币,是一定数额的重新用于表达另一种资产的比特币。
9
.2.2 万事达币
万事达币是另一个建立在比特币之上的协议,该协议支持多个平台对比特币系统的扩展。万事达币使用名为 MST 的代币来指导交易,但它并不是一种通货。相反的,它服务于其他应用平台,比如用户货币,智能财产代币,去中心化的财产交易和合约系统等等。就像 HTTP 协议是 TCP 协议的应用层一 样,Mastercoin 是比特币协议的应用层协议。
9.2.3 合约币
合约币是另一个建立在比特币系统之上的协议层。合约币拥有用户货币、可交易代币、金融手段、去中心化财产交易和其他一些功能。合约币利用比特币脚本语言中的 OP_RETURE 操作符记录元信息来增加比特币交易的额外信息。合约币使用名为 XCP 的代币维持整个系统的运行。
9.3 竞争币/山寨币
绝大多数的山寨币都来自比特币源代码的克隆,少数则没有使用比特币的任何源码,仅仅是借鉴了块链的模型后自己实现。竞争币或竞争块链(下一节会讲到)都是运行在自己块链上的独立的块链实现。之所以以命名区分,主要是因为竞争币主要用做货币,而竞争块链则不是。
严格意义上讲,比特币的第一个克隆并不是一个竞争币而是一个名为Namecoin 的竞争块链,我们将在下一节讨论。
莱特币 8,400 万的货币总量和相对更快的确认速度,很多莱特币的拥趸相信与比特币相 比,莱特币更适合零售业的交易。
下面所列出的就是这些竞争币区别
于比特币的三点主要不同:
▷ 货币策略不同
▷ 基于工作量证明的一致性机制不同
▷ 一些特殊的功能,比如更强的匿名性等等
9.3.1 评估竞争币的价值
以下是关于竞争币和比特币的不同之处的几个问题:
▷ 这款竞争币有没有引入重大的创新?
▷ 如果有,那么这项创新是不是足够吸引使用比特币的用户转移过来?
▷ 这款竞争币是不是致力于某一细分领域或应用?
▷这款竞争币可以吸引到足够多的矿工来抵御一致性攻击吗?
还有一些有关关键财务和市场指标的问题:
▷ 这款竞争币的市场总值是多少?
▷ 整个系统的用户/钱包规模大概是多少?
▷ 接受其支付的商家有多少?
▷ 整个系统每日的交易数是多少?
▷ 交易总量是多少?
9.3.2 货币属性不同于比特币的竞争币: 莱特币、 狗狗币和 Freicoin
比特币本身所具有的一些货币属性令其成为总额固定并且不通货膨胀的货币。比如,比特币的总量为固定的 2,100 万枚,新币的生成速度随时间递减,块生成速度为十分钟一块, 这个频率也控制了整个比特币系统交易的确认速度和新币的生成。很多竞争币通过对这些货币属性的微调,来达到实现不同的货币政策的目的。在这类竞争币中,值得一提的有以下几种。
莱特币
莱特币是最早的一批竞争币中的一员,自 2011 年发布至今,已经成为继比特币之后的第二成功的电子货币。它的主要创新在于两点,一是使用了 scrypt 作为工作量证明算法(继承自前文提到的 Tenebrix),二是更快的货币参数。
▷ 出块速度:2 分半
▷ 货币总量:到 2140 年达到 8,400 万
▷ 一致性算法:scrypt
▷ 市场总值:1 亿 6,000 万美金(截至 2014 年年中)
狗狗币
狗狗币是基于莱特币的一款竞争币,于 2013 年 12 月发布。狗狗币之所以值得一提,主要是因为其飞快的出块速度和惊人的货币总量,其目的也是为了励用户交易和给小费等。狗狗币始于一个玩笑,在其 2014 年快速衰退之前,经发布就风行于巨大而活跃的用户社区。下面是 狗狗币的一些特性:
▷ 出块速度:60 秒
▷ 货币总量:到 2015 年达到 100,000,000,000(1,000 亿)
▷ 一致性算法:scrypt
▷ 市场总值:1,200 万美金(截至 2014 年年中)
Freicoin
Freicoin 于 2012 年 7 月发布。它是一种滞留性通货,可以理解为存在钱中的货币的利率为负数。为了鼓励用户消费和减少储 蓄,Freicoin 拟定了一个4.5%的 APR fee。Freicoin 值得一提的原因是它的货币策略跟比特币的通货紧缩策略恰恰相反。作为货币,Freicoin 并不是非常成功,但它是竞争币所能表的多样性货币策略的生动体现。
▷ 出块速度:10 分钟
▷ 货币总量:到 2140 年达到 1 亿
▷ 一致性算法:SHA256
▷ 市场总值:13 万美金(截至 2014 年年中)
9.3.3 一致性机制创新
peercoin,Myriad,Blackcoin,vericoin 和 NXT 比特币的一致性机制建立在基于 SHA256 算法的工作量证明之上。第一款引入 scrypt 算法作为一致性机制的竞争币是为了便于 CPU 挖矿,避免 ASIC 矿机可能导致的算力集中化的问题。在那之后,对于一致性机制的创新一直很活跃。诸多竞争币陆续引进了包括 scrypt,scrypt-N, Skein, Groestl, SHA3, X11, Blake 在内的算法来实现工作量证明的一致性机制。而在 2013 年,作为工作量证明的一种替代机制——权益证明的出现,成为现代竞争币的基础。
9.3.4 多目的挖矿创新
Primecoin, Curecoin, Gridcoin 比特币的工作量证明机制只有一个目的:维护比特币系统的安全。跟维护一个传统货币系统比起来,挖矿的成本并不高。然而,某些批评者认为某些批评者认 为挖矿这一行为是一种浪费。新一代的加密货币试图解决这个争议。多目的挖矿算法就是为了解决工作量证明导致的“浪费”问题而出现的。多目的挖矿在为货币系 统的安全加入额外需求的同时,也为该系统的供需关系加入了额外的变量。
9.3.5 致力于匿名性的竞争币
CryptoNote, Bytecoin, Monero, Zerocash/Zerocoin, Darkcoin 比特币一直被误解为匿名货币。事实上,将个人和比特币地址关联起来,是一件相对容易的事情。利用大数据分析可以很容易地得到某一比特币地址的消费习 惯。一些竞争币试图通过增强匿名性来解决这个问题。最初尝试的是 Zerocoin,它是一种建立在比特币协议之上的元币协议, 最早发布于 2013 IEEE 安全隐私讨论会上。截至本书完稿时,基于这个协议的 Zerocash 的竞争币系统还在开发当中。匿名性的另一种实现名为 CryptoNote,初 见于 2013 年 10 月的一篇论文。CryptoNote 是一种由多个竞争币一起实现的基础技术,稍后将重点讨论。除了上述两种实现之外,还有一些其他的独 立的匿名币,比如利用影子地址和交易混淆来达到匿名性目的的 Darkcoin。
Zerocoin/Zerocash
Zerocoin 是 2013 年由 Johns Hopkins 发表的电子货币匿名性的一种理论实现。截至本书完稿时,基于这一理论的 Zerocash 的竞争币系统还在开发当中。
9.4 非货币型竞争区块链
非货币型竞争币区块链是区块链设计模式的另类实现,并不主要作为货币使用。当然不少这种区块链的确含有货币,只不过它们的货币仅是一种象征,用于分配其他东西,比如一种资源或者一份合约。换句话说,货币并不是非货币型竞争币区块链的要点,仅仅是一种次要特征。
9.4.1 域名币
域名币是比特币源代码的首个克隆产物,它是一种使用区块链的去中心化平台,用来注册和转让键-值对。域名币支持全球的域-名注册,类似因特网上的域 -名注册系统。目前域名币作为根域名.bit 的替代性域名服务(DNS)使用。域名币也可以用来注册其他命名空间下的名称和键-值对,例如存储邮件地址、密钥、SSL 证书、文件签名、投票系统和股票凭证之类,以及许多其他应用。
9.4.2 Bitmessage
Bitmessage 是一个实现了去中心化安全消息服务的比特币竞争币区块链,其本质上是一个无服务器的加密电子邮件系统。
9.4.3 以太坊
以太坊是一种图灵完备的平台,基于区块链账簿,用于合约的处理和执行。它不是比特币的一个克隆,而是完完全全独立的一种设计和实现。以太坊内置一种叫做 ether 的货币,该货币是付合约执行之费用所必须的。以太坊区块链记录的东西叫做合约,所谓合约,就是一种低级二进制码,也是一种图灵完备语言。本质上,合约其实是运行在以太坊系统中各个节点上的程序。这些程序可以存储数据、支付及收取、存储 ether 以及执行无穷范围(因此才叫图灵完备)的计算行为,在系统中充当去中心化的自治软件代理。
以太坊能够实现一些颇为复杂的系统, 这些系统甚至还能自我实现为其他的竞争币区块链。举例来说,下面就是一个类域名币的域名注册合约,使用以太坊代码编写(或者更准确地说,使用一种可编译为以太坊代码的高级代码编写):
9.5 加密货币的未来
总体来看,加密货币的未来甚至比特币还要光明。这是因为,比特币引入了这样一种全新的形式,那就是去中心化的组织和共识,而且这种形式已经催生了大量不可思议的创新。这些创新很有可能影响到社会中相当广泛的行业,从分布式系统科学到金融、经济、货币、中央银行以及企业管理,不一而足。在以前,很多人类活动都需要一个中心化的机构或组织来实现权威或可信控制点的功能,现在,这些都可以去中心化了。区块链和共识系统的发明,还会显著降低大型系统在组织及协调上的花销,同时也将消除权力攫取、腐败及管制俘获的可趁之机。
第 10 章 比特币安全
保护比特币是很具有挑战性的事,因为比特币不像银行账户余额那样体现抽象价值。比特币其实更像数字现金或黄金。你可能听过这样的说法,“现实持有,败一胜九。”好吧,在比特币的世界里,这样的持有只能让你有一成胜率。而只有拥有解锁比特币的密钥才相当于持有现金或一块贵重金属。 你可能会将密钥丢失,会放错地方,会被盗或者不小心错支了数额。无论是哪种场景,用户都没有办法撤回,因为这就像是将现金丢在了车水马龙的大街上。不过,与现金、黄金或者银行账户相比,比特币有着一个独一无二的优势。你不能“备份”你的现金、黄金或者银行账户,但你可以像备份其他文件一样,备 份含有密钥的比特币钱包。它可以被复制成很多份,放到不同的地方保存起来,甚至能打印到纸上进行实体备份。比特币与至今为止的其他货币是如此不同,以致于 我们需要以一种全新的思维方式来衡量比特币的安全性。
10.1 安全准则
比特币的核心准则是去中心化,这一点对安全性具有重要意义。在中心化的模式下,例如传统的银行或支付网络,需要依赖于访问控制和审查制度将不良行为者拒之门外。相比之下,比特币这样的去中心化系统则将责任和控制权都移交给了用户。由于网络的安全性是基于工作量证明而非访问控制,比特币网络可以对所有 人开放,也无需对比特币流量进行加密。
比特币则截然不同,一笔比特币交易只授权向指定接收方发送一个指定数额,并且不能被修改或伪造。它不会透露任何个人信息,例如当事人的身份,也不能用于权限外的支付。因此,比特币的支付网络并不需要加密或防窃听保护。事实上,你可以在任何公开的网络上广播比特币交易的数据,例如在不安全的WiFi 或蓝牙网络上公开传播比特币交易的数据,这对安全性没有任何影响。
比特币的去中心化安全模型很大程度上将权力移交到用户手上,随之而来的是用户们保管好密钥的责任。 这对于大多数用户来说并非一件易事,特别是在像智能手机或笔记本电脑这种能能时刻联网的通用设备上。虽然比特币的去中心化模型避免了常见的信用卡盗用等情况,但很多用户由于无法保管好密钥从而被黑客攻击。
10.1.1 比特币系统安全开发
对于比特币开发者而言最重要的是去中心化原则。大多数开发者对中心化的安全模型很熟悉,并可能试图将中心化的模型运用到借鉴比特币的应用中去,这将给比特币带来灭顶之灾。
比特币的安全性依赖于密钥的分散性控制,并且需要矿工们各自独立地进行交易验证。如果你想利用好比特币的安全性,你需要确保自己处于比特币的安全模型里。简而言之,不要将用户的密钥控制权拿走,不要接受非区块链交易信息。
例如,许多早期的比特币交易所将所有用户的资金集中在一个包含着私钥的“热钱包”里,并存放在服务器上。这样的设计夺取了用户的掌控权,并将密钥集中到单个系统里。很多这样的系统都被黑客攻破了,并给客户带来灾难性后果。
另一个常见的错误是接受区块链离线交易,妄图减少交易费或加速交易处理速度。一个“区块链离线交易”系统将交易数据记录在一个内部的中心化账本上,然后偶尔将它们同步到比特币区块链中。这种做法,再一次,用专制和集中的方式取代比特币的去中心化安全模型。当数据处于离线的区块链上的时候,保护不当的 中心化账本里的资金可能会不知不觉被伪造、被挪用、被消耗。
除非你是准备大力投资运营安全,叠加多层访问控制,或(像传统的银行那样)加强审计,否则在将资金从比特币的去中心化安全场景中抽离出来之前,你应该慎重考虑一番。即使你有足够的资金和纪律去实现一个可靠的安全模型,这样的设计也仅仅是复制了一个脆弱不堪,深受账户盗窃威胁、贪污和挪用公款困扰的传 统金融网络而已。要想充分利用比特币特有的去中心化安全模型,你必须避免中心化架构的常见诱惑,因它最终将摧毁比特币的安全性。
10.1.2 信任根源
比特币的安全体系与这不同。在比特币里,共识系统创建了一个可信的完全去中心化的公开账本,一个正确验证过的区块使用创世块作为信任的根源,建立一条直至当前区块的可信任链。比特币系统可以并应该使用区块链作为它们的信任根源。在设计一个多系统服务机制的比特币应用时,你应该仔细确认安全体系,以确保对它的信任能有据可依。最终,唯一可确信无疑的是一条完全有效的区块链。如果你的应用程序或明或暗地信赖于区块链以外的东西,就该引起重视,因为它可能会引入漏洞。一个不错的方法评估你应用程序的安全体系:单独考量每个组件,设想该组件被完全攻破并被坏人掌控的场景。依次取出应用程序的每个组件,并评估 它被攻破时对整体安全的影响。如果你的应用程序的安全性在该组件沦陷后大打折扣,那就说明你已经对这些组件过度信任了。一个没有漏洞的比特币应用程序应该 只受限于比特币的共识机制,这意味着其安全体系的信任源于比特币最坚固的部分。
10.2 用户最佳安全实践
人类使用物理的安全控制已经有数千年之久。相比之下,我们的数字化安全经验的年纪还不满 50 岁。现代通用的操作系统并不是十分安全,亦不特别适合用来存储数字货币。我们的电脑通过一直连接的互联网长时间暴露在外,它们运行着成千上万第三方软件组件,这些软件往往可以不受约束地访问用户的文件。你电脑 上安装的众多软件只要有一个恶意软件,就会威胁到你的文件,可窃取你钱包里的所有比特币。想要杜绝病毒和木马对电脑的威胁,用户要达到一定的计算机维护水平,只有小部分人能做到。
比特币创造了具有内在价值的数字资产,它可以被窃取,并立即转移给他人而无法撤回。这让黑客有了强烈的作案动机。
幸运的是,比特币也有着激励机制,以提高计算机的安全性。如前所述,计算机受威胁的风险是模糊的,间接的,而比特币让这些风险变得明确清晰。在电脑上保存比特币让用户时刻注意他们需要提高计算机的安全性,结果便是这使得比特币和其它数字货币得以传播和扩散,我们已经看到在黑客技术和安全解决方案双方的提升。简单来说,黑客现在有着一个非常诱人的目标,而用户也有明确的激励性去保卫自己。
在过去的三年里,随着比特币不断被接纳,一个直接的结果是,我们已经看到信息安全领域取得了巨大创新,例如硬件加密,密钥存储和硬件钱包,多重签名技术和数字托管。在下面的章节中,我们将研究各种实际用户安全中的实践经验。
10.2.1 比特币物理存储
相比数字信息的安全,大多数用户对物理安全更加熟悉,一个非常有效保护比特币的方法是,将它们转换为物理形式。比特币密钥不过是串长数字而已。这意味着它们可以以物理形式存储起来,如印在纸上或蚀刻成金属硬币上。这样保护密钥就变成了简单地保护印着比特币密钥的物理实体。一组打印在纸上的比特币密钥被称为“纸钱包”,有许多可以用来创建它们的免费工具。我个人将大部分(99%以上)的比特币存储在纸钱包上,并用 BIP0038 加密,复制了多份并锁在保险箱里。将比特币离线保存被称为冷存储,它是最有效的安全技术
之一。冷存储系统是在一个离线系统(一个从来没有连接过互联网的系统)上生成密钥,并离线存储到纸上或者 U 盘等电子媒介。
10.2.2 硬件钱包
从长远来看,比特币安全将越来越多地以硬件防篡改钱包的形式出现。与智能手机或台式电脑不同,一个比特币硬件钱包只有一个目的, 安全地存储比特币。不像容易受害的常用软件那样,硬件钱包只提供了有限的接口,从而可以给非专业用户提供近乎万无一失的安全等级。我预期将看到硬件钱包成为比特币储存的主要方式。要想看硬件钱包的实例,请查阅 Trezor。
10.2.3 平衡风险
虽然大多数用户都非常关注比特币防盗,其实还有一个更大的风险存在。数据文件丢失的情况时有发生。如果比特币的数据也在其中,损失将会让人痛苦不堪。为了保护好比特币钱包,用户必须非常注意不要剑走偏锋,这样不至于会搞丢比特币。 在 2011 年 7 月,一个著名的比特币认知教育项目损失了近 7,000 枚比特币。为了防止被盗窃,其主人曾之前采取了一系列复杂的操作去加密备份。结果他们不慎丢失了加密的密钥,使得备份变得毫无价值,白白失去了一大笔财富。如果你保护比特币的方式太过了,这好比于把钱藏在沙漠里,你可能不能再把它找回来了。
10.2.4 分散风险
你会将你的全部家当换成现金放在钱包里随身携带么?大多数人会认为这非常不明智,但比特币用户经常会将所有的比特币放在一个钱包里。用户应该将风险分散到不同类型的比特币钱包。审慎的用户应该只留一小部分(或许低于5%)的比特币在一个在线的或手机钱包,就像零用钱一样,其余的部分应该采用不同存储机制分散开来,诸如电脑钱包和离线(冷存储)钱包。
10.2.5 多重签名管理
当一个公司或个人持有大量比特币时,他们应该考虑采用多重签名的比特币地址。多重签名比特币地址需要多个签名才能支付,从而保证资金的安全。多重签名的密钥应存储在多个不同的地方,并由不同的人掌控。打个比方,在企业环境中,密钥应该分别生成并由若干公司管理人员持有,以确保没有任何一个人可以独自占有资金。多重签名的地址也可以提供冗余,例如一个人持有多个密钥,并将它们分别存储在不同的地方。
10.2.6 存活能力
一个非常重要却又常常被忽视的安全性考虑是可用性,尤其是在密钥持有者丧失工作能力或死亡的情况下。比特币的用户被告知应该使用复杂的密码,并保证他们的密钥安全且不为他人所知。不幸的是,这种做法使得在用户无法解锁时,用户的家人几乎无法将该财产恢复。事实上,比特币用户的家人可能完全不知道这笔比特币资金的存在。如果你有很多的比特币, 你应该考虑与一个值得信赖的亲属或律师分享解密的细节。一个更复杂的比特币生还计划,可以通过设置多重签名,做好遗产规划,并通过专门的“数字资产执行者”律师处理后事。
10.3 总结