之所以看得更远,是因为站在了巨人的肩膀上。
作为区块链思想诞生的源头,比特币项目值得区块链技术爱好者们仔细研究。
比特币网络是首个得到大规模部署的区块链技术应用,并且是首个得到实践检验的数字货币实现,无论在信息技术历史还是在金融学历史上都具有十分重要的意义。比特币项目在诞生和发展过程中,借鉴了来自数字货币、密码学、博弈论、分布式系统、控制论等多个领域的技术成果,可谓博采众家之长于一身。
虽然后来的区块链技术应用已经远超越了数字货币的范畴,但探索比特币项目的发展历程和设计思路,对于深刻理解区块链技术的来龙去脉有着重要的价值。
本章将介绍比特币项目的来源、核心原理设计、相关的工具,以及关键的技术话题。
图 1.9.1.1 - 比特币项目
比特币(BitCoin,BTC)是基于区块链技术的一种数字货币实现;比特币网络是历史上首个经过大规模长时间检验的数字货币系统。
自 2009 年正式上线以来,比特币价格经历了数次的震荡,目前每枚比特币市场价格超过 2500 美金。比特币网络中总区块数接近 48 万个。
比特币网络在功能上具有如下特点:
下图来自 blockchain.info 网站,可以看到比特币字诞生以来的汇率(以美元为单位)变化历史。
图 1.9.1.2 - 比特币汇率历史
2008 年 11 月 1 日 19:16:33,中本聪在 metzdowd 的加密技术邮件列表发布比特币白皮书:《Bitcoin: A Peer-to-Peer Electronic Cash System》(《比特币:一种点对点的电子现金系统》)。
2009 年 1 月 3 日 18:15:05,中本聪在位于芬兰赫尔辛基(Helsinki)的一个小型服务器上挖出了第一批 50 个比特币,并记录下当天泰晤士报的头版标题:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks(财政大臣考虑再次紧急援助银行危机)”。第一个区块被称为创世区块或初始区块(Genesis Block),可以通过 https://blockchain.info/block-index/14849 查看其详细内容。
2010 年 5 月 21 日,第一次比特币交易:佛罗里达程序员 Laszlo Hanyecz 用 1 万 BTC 购买了价值 25 美元的披萨优惠券。这是比特币的首个兑换汇率:1: 0.0025 美金。这些比特币在今日价值超过 8000 万美金。
2010 年 7 月 17 日,第一个比特币交易平台成立。
2011 年 4 月,首个有官方正式记载的版本 0.3.21 发布,支持普通用户参与到 P2P 网络中,并开始支持最小单位 “聪”。
2011 年,开始出现基于显卡的挖矿设备。2011 年年底,比特币价格约为 2 美元。
2012 年 6 月,Coinbase 成立,支持比特币相关交易。公司目前已经发展为全球数字资产交易平台,同时支持包括比特币、以太币等数字货币。
2012 年 9 月 27 日,比特币基金创立,此时比特币价格为 12.46 美元。
2012 年 11 月 28 日,比特币产量第一次减半。
2013 年 3 月,1/3 的专业矿工已经采用专用 ASIC 矿机进行挖矿。
2013 年 3 月 12 日,比特币发布 0.8.0 版本,大量完善了节点内部管理和网络通信,使得比特币有能力支持后来大规模的 P2P 网络。该版本包含一个严重的 bug,虽然后来被紧急修复,仍造成比特币价格大幅下跌。
2013年 4 月 10 日,BTC 创下历史新高,266 美元。
2013 年 6 月 27 日,德国会议作出决定:持有比特币一年以上将予以免税,被业内认为此举变相认可了比特币的法律地位,此时比特币价格为 102.24 美元。
2013 年 10 月,世界第一台可以兑换比特币的 ATM 在加拿大上线。
2013 年 11 月 29 日,比特币的交易价格创下 1242 美元的历史新高,而同时黄金价格为一盎司 1241.98 美元,比特币价格首度超过黄金。
2014 年 2 月,全球最大比特币交易平台 Mt.Gox 宣告因 85 万个比特币被盗而破产并关闭,造成大量投资者的损失,比特币价格一度暴跌。
2014 年 3 月,中国第一台可以兑换比特币的 ATM 在香港上线。
2014 年 6 月,美国加州通过 AB-129 法案,允许比特币等数字货币在加州进行流通。
2015 年 6 月,纽约成为美国第一个正式进行数字货币监管的州。
2015 年 10 月,欧盟法院裁定比特币交易免征增值税。
2015 年 10月,《经济学人》杂志发表封面文章《信任机器》,开始关注比特币网络背后的区块链技术。
2016 年 1 月,中国人民银行在京召开了数字货币研讨会,会后发布公告宣称或推出数字货币。
2016 年 7 月 9 日,比特币产量第二次减半。
2016 年 8 月 3 日,知名比特币交易所 Bitfinex 遭遇安全攻击,按照当时市值计算,损失超过 6000 万美金。
2017 年 1 月 24 日,中国三大交易所(Okcoin、火币、BTCC)开始收取比特币交易手续费,为成交金额的 0.2%。
2017 年 7 月,比特币网络全网算力首次突破 6 exahash/s(即每秒10的18次方哈希),创下历史新高。
时至今日,单个比特币价格一度接近 20000 美元,总市值超过 2000 亿美金。
比特币区块链目前生成了约 47 万个区块,完整存储需要约 110 GB 的空间,每天普遍完成 20~30 万笔交易。主流的交易所包括 Bitstamp、BTC-e、Bitfinex 等。多家投资机构(包括红杉、IDG、软银、红点等)都投资了比特币相关的创业团队。
比特币的“成功”,刺激了相关的生态和社区发展,大量类似数字货币(超过 700 种)纷纷出现,比较出名的包括以太币和瑞波(Ripple)币等。
这些数字货币,要么建立在自己独立的区块链网络上,要么复用已有的区块链(例如比特币网络)系统。全球活跃的数字货币用户据称在 290 万 ~ 580 万之间(参考剑桥大学 Judge 商学院 2017 年 4 月发表的《GLOBAL CRYPTOCURRENCY BENCHMARKING STUDY(全球加密货币基准研究)》报告)。
注:通过 blockchain.info 网站可以实时查询到比特币网络的状态信息,包括区块、交易在内的详细数据。
区块链最初的思想,诞生于无数先哲对于用加密数字货币替代实体货币的探讨和设计中。
众所周知,货币是人类文明发展过程中的一大发明。其最重要的职能包括价值尺度、流通手段、贮藏手段等。很难想象离开了货币,现代社会庞大而复杂的经济和金融体系如何保持运转。也正是因为它如此重要,货币的设计和发行机制是关系到国计民生的大事。
历史上,在自然和人为因素的干预下,货币的形态经历了多个阶段的演化,包括实物货币、金属货币、代用货币、信用货币、电子货币、数字货币等。近代以前相当长的一段时间里,货币的形态一直是以实体的形式存在,可统称为“实体货币”。计算机诞生后,为货币的虚拟化提供了可能性。
同时,货币自身的价值依托也不断发生演化,从最早的实物价值、发行方信用价值,直到今天的对科学技术和信息系统(包括算法、数学、密码学、软件等)的信任价值。
注:中国最早关于货币的确切记载“夏后以玄币”,出现在恒宽《盐铁论·错币》。
理论上,一般等价物都可以作为货币使用。当今世界最常见的货币制度是纸币本位制,因为纸质货币既方便携带、不易仿制,又相对容易辩伪。
或许有人会认为信用卡等电子方式,相对于纸币等货币形式使用起来更为方便。确实,信用卡在某些场景下会更为便捷,但它依赖背后的集中式支付体系,一旦碰到支付系统故障、断网、缺乏支付终端等情况,信用卡就无法使用;另外,信用卡形式往往还需要额外的终端设备支持。
目前,无论是货币形式,还是信用卡形式,都需要额外的支持机构(例如银行)来完成生产、分发、管理等操作。“中心化”的结构带来了管理和监管上的便利,但系统安全性方面存在很大挑战。诸如伪造、信用卡诈骗、盗刷、转账等安全事件屡见不鲜。
很显然,如果能实现一种数字化的货币,保持既有货币方便易用的特性,同时消除纸质货币的缺陷,无疑将极大提高社会整体经济活动的运作效率。
让我们来对比现有的数字货币(以比特币为例)和现实生活中的纸币,两者的优劣如下表所示。
属性 | 分析 | 优势方 |
---|---|---|
便携 | 大部分场景(特别较大数额支付时)下数字货币将具备更好的便携性。 | 数字货币 |
防伪 | 两者各有千秋,但数字货币整体上会略胜一筹。纸币依靠的是各种设计(纸张、油墨、暗纹、夹层等)上的精巧,数字货币依靠的则是密码学上的保障。事实上,纸币的伪造时有发生,但数字货币的伪造目前还无法实现。 | 数字货币 |
辩伪 | 纸币即使依托验钞机等专用设备仍会有误判情况,数字货币依靠密码学易于校验。数字货币胜出。 | 数字货币 |
匿名 | 通常情况下,两者都能提供很好的匿名性。但都无法防御有意的追踪。 | 持平 |
交易 | 对纸币来说,谁物理持有纸币谁就是合法拥有者,交易通过纸币自身的转移即可完成,无法复制。对数字货币来说则复杂得多,因为任何数字物品都是可以被复制的,但数字形式也意味着转移成本会更低。总体看,两者适用不同的情景。 | 持平 |
资源 | 通常情况下,纸币的生产成本要远低于面额。数字货币消耗资源的计算则复杂的多。以比特币为例,最坏情况下可能需要消耗接近甚至超过其面值的电能。 | 纸币 |
发行 | 纸币的发行需要第三方机构的参与;数字货币则通过分布式算法来完成发行。在人类历史上,通胀和通缩往往是不合理地发行货币造成的;数字货币尚缺乏大规模验证,还有待观察。 | 持平 |
管理 | 纸币发行和回收往往通过统一机构,易于监管和审计;而目前数字货币在这方面还缺乏足够支持和验证。 | 纸币 |
可见,数字货币并非在所有领域都优于已有的货币形式。要比较两者的优劣应该针对具体情况具体分析。不带前提地鼓吹数字货币并不是一种科学和严谨的态度。实际上,仔细观察数字货币的应用情况就会发现,虽然以比特币为代表的数字货币已在众多领域得到应用,但目前还没有任何一种数字货币能完全替代已有货币。
另外,虽然当前的数字货币“实验”已经取得了不小影响,但可见的局限也很明显:其依赖的区块链和分布式账本技术还缺乏大规模场景的考验;系统的性能和安全性还有待提升;资源的消耗过高;对监管和审计支持不足等。这些问题的解决,都有待金融科技的进一步发展。
注:严格来讲,货币(money)不等于现金或通货(cash/currency),货币的含义范围更广。
虽然数字货币带来的预期优势可能很美好,但要设计和实现一套能经得住实用考验的数字货币并非易事。
现实生活中常用的纸币具备良好的可转移性,可以相对容易地完成价值的交割。但是对于数字货币来说,因为数字化内容容易被复制,数字货币持有人可以试图将同一份货币发给多个接收者,这种攻击被称为“双重支付攻击(Double-spend Attack)”。
也许有人会想到,银行中的货币实际上也是数字化的,因为通过电子账号里面的数字记录了客户的资产。说的没错,这种电子货币模式有人称为“数字货币 1.0”,它实际上依赖了一个前提:假定存在一个安全可靠的第三方记账机构负责记账,这个机构负责所有的担保所有的环节,最终完成交易。
中心化控制下,数字货币的实现相对容易。但是,有些时候很难找到一个安全可靠的第三方机构,来充当这个记账者角色。
例如,发生贸易的两国可能缺乏足够的外汇储备用以支付;汇率的变化等导致双方对合同有不同意见;网络上的匿名双方进行直接买卖而不通过电子商务平台;交易的两个机构彼此互不信任,找不到双方都认可的第三方担保;使用第三方担保系统,但某些时候可能无法连接;第三方的系统可能会出现故障或被篡改攻击……
这个时候,就只有实现去中心化(De-centralized)或多中心化(Multi-centralized)的数字货币系统。在“去中心化”的场景下,实现数字货币存在如下几个难题:
可见,在不存在第三方记账机构的情况下,实现一个数字货币系统的挑战着实不小。能否通过技术创新来解决这个难题呢?
比特币融合了数十年在金融、密码学和分布式系统领域的科技成果,首次实现了可以在全球范围内运行的大规模加密货币系统。
比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。
区块链网络提供一个公共可见的记账本,该记账本并非记录每个账户的余额,而是用来记录发生过的交易的历史信息。该设计可以避免重放攻击,即某个合法交易被多次重新发送造成攻击。
比特币中没有账户的概念。因此,每次发生交易,用户需要将交易记录写到比特币网络账本中,等网络确认后即可认为交易完成。
除了挖矿获得奖励的 coinbase 交易只有输出,正常情况下每个交易需要包括若干输入和输出,未经使用(引用)的交易的输出(Unspent Transaction Outputs,UTXO)可以被新的交易引用作为其合法的输入。被使用过的交易的输出(Spent Transaction Outputs,STXO),则无法被引用作为合法输入。
因此,比特币网络中一笔合法的交易,必须是引用某些已存在交易的 UTXO(必须是属于付款方才能合法引用)作为新交易的输入,并生成新的 UTXO(将属于收款方)。
那么,在交易过程中,付款方如何证明自己所引用的 UTXO 合法?比特币中通过“签名脚本”来实现,并且指定“输出脚本”来限制将来能使用新 UTXO 者只能为指定收款方。对每笔交易,付款方需要进行签名确认。并且,对每一笔交易来说,总输入不能小于总输出。总输入相比总输出多余的部分称为交易费用(Transaction Fee),为生成包含该交易区块的矿工所获得。目前规定每笔交易的交易费用不能小于 0.0001 BTC,交易费用越高,越多矿工愿意包含该交易,也就越早被放到网络中。交易费用在奖励矿工的同时,也避免了网络受到大量攻击。
交易中金额的最小单位是“聪”,即一亿分之一(10^-8)比特币。
下图展示了一些简单的示例交易。更一般情况下,交易的输入、输出可以为多方。
交易 | 目的 | 输入 | 输出 | 签名 | 差额 |
---|---|---|---|---|---|
T0 | A 转给 B | 他人向 A 交易的输出 | B 账户可以使用该交易 | A 签名确认 | 输入减输出,为交易服务费 |
T1 | B 转给 C | T0 的输出 | C 账户可以使用该交易 | B 签名确认 | 输入减输出,为交易服务费 |
... | X 转给 Y | 他人向 X 交易的输出 | Y 账户可以使用该交易 | X 签名确认 | 输入减输出,为交易服务费 |
需要注意,刚放进网络中的交易(深度为 0)并非是实时得到确认的。进入网络中的交易存在被推翻的可能性,一般要再生成几个新的区块后(深度大于 0)才认为该交易被确认。
下面分别介绍比特币网络中的重要概念和主要设计思路。
账户/地址
比特币采用了非对称的加密算法,用户自己保留私钥,对自己发出的交易进行签名确认,并公开公钥。
比特币的账户地址其实就是用户公钥经过一系列 Hash(HASH160,或先进行 SHA256,然后进行 RIPEMD160)及编码运算后生成的 160 位(20 字节)的字符串。
一般地,也常常对账户地址串进行 Base58Check 编码,并添加前导字节(表明支持哪种脚本)和 4 字节校验字节,以提高可读性和准确性。
注:账户并非直接是公钥内容,而是 Hash 后的值,避免公钥过早公开后导致被破解出私钥。
交易
交易是完成比特币功能的核心概念,一条交易可能包括如下信息:
网络中节点收到交易信息后,将进行如下检查:
检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播。
用户可以从 blockchain.info 网站查看实时的交易信息,一个示例交易的内容如下图所示。
图 1.9.3.1 - 比特币交易的例子
交易脚本
脚本(Script) 是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。比特币脚本语言是一种非图灵完备的语言,类似 Forth 语言。
一般每个交易都会包括两个脚本:负责输入的解锁脚本(scriptSig)和负责输出的锁定脚本(scriptPubKey)。
输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易的输出(例如,要花费该交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。
认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。
输出脚本目前支持两种类型:
以 P2PKH 为例,输出脚本的格式为
scriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
其中,OP_DUP 是复制栈顶元素;OP_HASH160 是计算 hash 值;OP_EQUALVERIFY 判断栈顶两元素是否相等;OP_CHECKSIG 判断签名是否合法。这条指令实际上保证了只有 pubKey 的拥有者才能合法引用这个输出。
另外一个交易如果要花费这个输出,在引用这个输出的时候,需要提供认领脚本格式为
scriptSig:
其中, 是拿 pubKey 对应的私钥对交易(全部交易的输出、输入和脚本)Hash 值进行签名,pubKey 的 Hash 值需要等于 pubKeyHash。
进行交易验证时,会按照先 scriptSig 后 scriptPubKey 的顺序进行依次入栈处理,即完整指令为:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
读者可以按照栈的过程来进行推算,理解整个脚本的验证过程。
引入脚本机制带来了灵活性,但也引入了更多的安全风险。比特币脚本支持的指令集十分简单,基于栈的处理方式,并且非图灵完备,此外还添加了额外的一些限制(大小限制等)。
区块
比特币区块链的一个区块不能超过 1 MB,将主要包括如下内容:
其中,区块头信息十分重要,包括:
可见,要对区块链的完整性进行检查,只需要检验各个区块头部信息即可,无需获取到具体的交易内容,这也是简单交易验证(Simple Payment Verification,SPV)的基本原理。另外,通过头部的链接,提供时序关系的同时加大了对区块中数据进行篡改的难度。
一个示例区块如下图所示。
图 1.9.3.2 - 比特币区块的例子
比特币在设计上提出了很多创新点,主要考虑了避免作恶、采用负反馈调节和基于概率的共识机制等三个方面。
如何避免作恶
基于经济博弈原理。在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。
实际上,博弈论早已被广泛应用到众多领域。
一个经典的例子是两个人来分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么制定规则才公平?
最简单的一个方案是任意一个人负责分配蛋糕,并且这个人后挑选。
注:如果推广到 N 个人呢?
比特币网络中所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。
负反馈调节
比特币网络在设计上,很好的体现了负反馈的控制论基本原理。
比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。
反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。
因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。
从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140 年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。
注:比特币最小单位是“聪”,即 10^(-8) 比特币,总“聪”数为 2.1E15。对于 64 位处理器来说,高精度浮点计数的限制导致单个数值不能超过 2^53 约等于 9E15。
共识机制
传统共识问题往往是考虑在一个相对封闭的分布式系统中,允许同时存在正常节点、故障节点,如何快速达成一致。
对于比特币网络来说,它是完全开放的,可能面向各种攻击情况,同时基于 Internet 的网络质量只能保证“尽力而为”,导致问题更加复杂,传统的一致性算法在这种场景下难以实用。
因此,比特币网络不得不对共识的目标和过程都进行了一系列限制,提出了基于 Proof of Work(PoW)的共识机制。
首先是不实现面向最终确认的共识,而是基于概率、随时间逐步增强确认的共识。现有达成的结果在理论上都可能被推翻,只是攻击者要付出的代价随时间而指数级上升,被推翻的可能性随之指数级的下降。
此外,考虑到 Internet 的尺度,达成共识的时间相对比较长。按照区块(一组交易)来进行阶段性的确认(快照),提高网络整体的可用性。
最后,限制网络中共识的噪音。通过进行大量的 Hash 计算和少数的合法结果来限制合法提案的个数,进一步提高网络中共识的稳定性。
了解比特币,最应该知道的一个概念就是“挖矿”。挖矿是参与维护比特币网络的节点,通过协助生成新区块来获取一定量新增的比特币的过程。
当用户向比特币网络中发布交易后,需要有人将交易进行确认,形成新的区块,串联到区块链中。在一个互相不信任的分布式系统中,该由谁来完成这件事情呢?比特币网络采用了“挖矿”的方式来解决这个问题。
目前,每 10 分钟左右生成一个不超过 1 MB 大小的区块(记录了这 10 分钟内发生的验证过的交易内容),串联到最长的链尾部,每个区块的成功提交者可以得到系统 12.5 个比特币的奖励(该奖励作为区块内的第一个交易,一定区块数后才能使用),以及用户附加到交易上的支付服务费用。即便没有任何用户交易,矿工也可以自行产生合法的区块并获得奖励。
每个区块的奖励最初是 50 个比特币,每隔 21 万个区块自动减半,即 4 年时间,最终比特币总量稳定在 2100 万个。因此,比特币是一种通缩的货币。
挖矿的具体过程为:参与者综合上一个区块的 Hash 值,上一个区块生成之后的新的验证过的交易内容,再加上自己猜测的一个随机数 X,一起打包到一个候选新区块,让新区块的 Hash 值小于比特币网络中给定的一个数。这是一道面向全体矿工的“计算题”,这个数越小,计算出来就越难。
系统每隔两周(即经过 2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),来调节生成区块的时间稳定在 10 分钟左右。为了避免震荡,每次调整的最大幅度为 4 倍。历史上最快的出块时间小于 10s,最慢的出块时间超过 1 个小时。
为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和计算力。算力一般以每秒进行多少次 Hash 计算为单位,记为 h/s。目前,比特币网络算力峰值已经达到了每秒数百亿亿次。
汇丰银行分析师 Anton Tonev 和 Davy Jose 曾表示,比特币区块链(通过挖矿)提供了一个局部的、迄今为止最优的解决方案:如何在分散的系统中验证信任。这就意味着,区块链本质上解决了传统依赖于第三方的问题,因为这个协议不只满足了中心化机构追踪交易的需求,还使得陌生人之间产生信任。区块链的技术和安全的过程使得陌生人之间在没有被信任的第三方时产生信任。
2010 年以前,挖矿还是一个非常热门的盈利行业。
但是随着相关技术和设备的发展,现在个人进行挖矿的收益已经降得很低。从概率上说,由于当前参与挖矿的计算力实在过于庞大(已经超出了大部分的超算中心),一般的算力已经不可能挖到比特币。特别那些想着利用虚拟机来挖矿的想法,意义确实不大了。
从普通的 CPU(2009 年)、到后来的 GPU(2010 年) 和 FPGA(2011 年末)、到后来的 ASIC 矿机(2013 年年初,目前单片算力已达每秒数百亿次 Hash 计算)、再到现在众多矿机联合组成矿池(知名矿池包括 F2Pool、BitFury、BTCC 等)。短短数年间,比特币矿机的技术走完了过去几十年的集成电路技术进化历程,并且还颇有创新之处。确实是哪里有利益,哪里的技术就飞速发展!目前,矿机主要集中在中国大陆(超过一半的算力)和欧美,大家比拼的是一定计算性能情况下低电压和低功耗的电路设计。全网的算力已超过每秒 10^18 次 Hash 计算。
很自然地,读者可能会想到,如果有人掌握了强大的计算力,计算出所有的新区块,并且拒不承认他人的交易内容,那是不是就能破坏掉比特币网络。确实如此,基本上个体达到 1/3 的计算力,比特币网络就存在被破坏的风险了;达到 1/2 的算力,从概率上就掌控整个网络了。但是要实现这么大的算力,将需要付出巨大的经济成本。
那么有没有办法防护呢?除了尽量避免计算力放到同一个组织手里,没太好的办法,这是目前 PoW 机制自身造成的。
也有人认为为了共识区块的生成,大部分计算力(特别是最终未能算出区块的算力)其实都浪费了。有人提出用 PoS(Proof of Stake)和 DPoS 等协议,利用权益证明(例如持有货币的币龄)作为衡量指标进行投票,相对 PoW 可以节约大量的能耗。PoS 可能会带来囤积货币的问题。除此之外,还有活跃度证明(Proof of Activity,PoA)、消耗证明(Proof of Burn,PoB)、能力证明(Proof of Capacity, PoC)、消逝时间证明(Proof of Elapsed Time)、股权速率证明(Proof of Stake Velocity,PoSV)等,采用了不同的衡量指标。
当然,无论哪种机制,都无法解决所有问题。一种可能的优化思路是引入随机代理人制度,通过算法在某段时间内确保只让部分节点参加共识的提案,并且要发放一部分“奖励”给所有在线贡献的节点。
比特币网络是完全公开的,任何人都可以匿名接入,因此共识协议的稳定性和防攻击性十分关键。
比特币区块链采用了 Proof of Work(PoW)的机制来实现共识,该机制最早于 1998 年在 B-money 设计中提出。
目前,Proof of X 系列中比较出名的一致性协议包括 PoW、PoS 和 DPoS 等,都是通过经济惩罚来限制恶意参与。
工作量证明,通过计算来猜测一个数值(nonce),使得拼凑上交易数据后内容的 Hash 值满足规定的上限(来源于 hashcash)。由于 Hash 难题在目前计算模型下需要大量的计算,这就保证在一段时间内,系统中只能出现少数合法提案。反过来,能够提出合法提案,也证明提案者确实已经付出了一定的工作量。
同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后,会基于用户认为的最长链基础上继续难题的计算。因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为最长的链。
Hash 问题具有不可逆的特点,因此,目前除了暴力计算外,还没有有效的算法进行解决。反之,如果获得符合要求的 nonce,则说明在概率上是付出了对应的算力。谁的算力多,谁最先解决问题的概率就越大。当掌握超过全网一半算力时,从概率上就能控制网络中链的走向。这也是所谓 51%
攻击的由来。
参与 PoW 计算比赛的人,将付出不小的经济成本(硬件、电力、维护等)。当没有最终成为首个算出合法 nonce 值的“幸运儿”时,这些成本都将被沉没掉。这也保障了,如果有人尝试恶意破坏,需要付出大量的经济成本。也有设计试图将后算出结果者的算力按照一定比例折合进下一轮比赛考虑。
有一个很直观的超市付款的例子,可以说明为何这种经济博弈模式会确保系统中最长链的唯一性。
图 1.9.5.1 - Pow 保证一致性
假定超市只有一个出口,付款时需要排成一队,可能有人不守规矩要插队。超市管理员会检查队伍,认为最长的一条队伍是合法的,并让不合法的分叉队伍重新排队。新到来的人只要足够理智,就会自觉选择最长的队伍进行排队。这是因为,看到多条链的参与者往往认为目前越长的链具备越大的胜出可能性,从而更倾向于选择长的链。
权益证明(Proof of Stake,PoS),最早在 2013 年被提出,最早在 Peercoin 系统中被实现,类似现实生活中的股东机制,拥有股份越多的人越容易获取记账权(同时越倾向于维护网络的正常工作)。
典型的过程是通过保证金(代币、资产、名声等具备价值属性的物品即可)来对赌一个合法的块成为新的区块,收益为抵押资本的利息和交易服务费。提供证明的保证金(例如通过转账货币记录)越多,则获得记账权的概率就越大。合法记账者可以获得收益。
PoS 试图解决在 PoW 中大量资源被浪费的缺点,受到了广泛关注。恶意参与者将存在保证金被罚没的风险,即损失经济利益。
一般的,对于 PoS 来说,需要掌握超过全网 1/3 的资源,才有可能左右最终的结果。这个也很容易理解,三个人投票,前两人分别支持一方,这时候,第三方的投票将决定最终结果。
PoS 也有一些改进的算法,包括授权股权证明机制(DPoS),即股东们投票选出一个董事会,董事会中成员才有权进行代理记账。这些算法在实践中得到了不错的验证,但是并没有理论上的证明。
2017 年 8 月,来自爱丁堡大学和康涅狄格大学的 Aggelos Kiayias 等学者在论文《Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol》中提出了 Ouroboros 区块链共识协议,该协议可以达到诚实行为的近似纳什均衡,认为是首个可证实安全的 PoS 协议。
比特币的交易网络最为人诟病的一点便是交易性能:全网每秒 7 笔左右的交易速度,远低于传统的金融交易系统;同时,等待 6 个块的可信确认将导致约 1 个小时的最终确认时间。
为了提升性能,社区提出了闪电网络等创新的设计。
闪电网络的主要思路十分简单——将大量交易放到比特币区块链之外进行,只把关键环节放到链上进行确认。该设计最早于 2015 年 2 月在论文《The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments》中提出。
比特币的区块链机制自身已经提供了很好的可信保障,但是相对较慢;另一方面考虑,对于大量的小额交易来说,是否真需要这么高的可信性?
闪电网络主要通过引入智能合约的思想来完善链下的交易渠道。核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和 HTLC(Hashed Timelock Contract)。前者解决了链下交易的确认问题,后者解决了支付通道的问题。
Recoverable Sequence Maturity Contract,即“可撤销的顺序成熟度合同”。这个词很绕,其实主要原理很简单,类似资金池机制。
首先假定交易双方之间存在一个“微支付通道”(资金池)。交易双方先预存一部分资金到“微支付通道”里,初始情况下双方的分配方案等于预存的金额。每次发生交易,需要对交易后产生资金分配结果共同进行确认,同时签字把旧版本的分配方案作废掉。任何一方需要提现时,可以将他手里双方签署过的交易结果写到区块链网络中,从而被确认。从这个过程中可以可以看到,只有在提现时候才需要通过区块链。
任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现时需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果,被双方确认过,但未必是最新的结果)。在一定时间内,如果另外一方拿出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑方;否则按照提出方的结果进行分配。罚没机制可以确保了没人会故意拿一个旧的交易结果来提现。
另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间要晚于对方,这就鼓励大家尽量都在链外完成交易。通过 RSMC,可以实现大量中间交易发生在链外。
微支付通道是通过 Hashed Timelock Contract 来实现的,中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。理解起来也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。
不太恰当的例子,约定一定时间内,有人知道了某个暗语(可以生成匹配的哈希值),就可以拿到这个指定的资金。
推广一步,甲想转账给丙,丙先发给甲一个哈希值。甲可以先跟乙签订一个合同,如果你在一定时间内能告诉我一个暗语,我就给你多少钱。乙于是跑去跟丙签订一个合同,如果你告诉我那个暗语,我就给你多少钱。丙于是告诉乙暗语,拿到乙的钱,乙又从甲拿到钱。最终达到结果是甲转账给丙。这样甲和丙之间似乎构成了一条完整的虚拟的“支付通道”。
HTLC 机制可以扩展到多个人的场景。
RSMC 保障了两个人之间的直接交易可以在链下完成,HTLC 保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。闪电网络整合这两种机制,就可以实现任意两个人之间的交易都在链下完成了。
在整个交易中,智能合约起到了中介的重要角色,而区块链网络则确保最终的交易结果被确认。
侧链(Sidechain)协议允许资产在比特币区块链和其他区块链之间互转。这一项目也来自比特币社区,最早是在 2013 年 12 月提出,2014 年 4 月立项,由 Blockstream 公司(由比特币核心开发者 Adam Back、Matt Corallo 等共同发起成立)主导研发。侧链协议于 2014 年 10 月在白皮书《Enabling Blockchain Innovations with Pegged Sidechains》中公开。
侧链诞生前,众多“山寨币”的出现正在碎片化整个数字货币市场,再加上以太坊等项目的竞争,一些比特币开发者希望能借助侧链的形式扩展比特币的底层协议。
简单来讲,以比特币区块链作为主链(Parent chain),其他区块链作为侧链,二者通过双向挂钩(Two-way peg),可实现比特币从主链转移到侧链进行流通。
图 1.9.7.1 - 比特币侧链
侧链可以是一个独立的区块链,有自己按需定制的账本、共识机制、交易类型、脚本和合约的支持等。侧链不能发行比特币,但可以通过支持与比特币区块链挂钩来引入和流通一定数量的比特币。当比特币在侧链流通时,主链上对应的比特币会被锁定,直到比特币从侧链回到主链。可以看到,侧链机制可将一些定制化或高频的交易放到比特币主链之外进行,实现了比特币区块链的扩展。侧链的核心原理在于能够冻结一条链上的资产,然后在另一条链上产生,可以通过多种方式来实现。这里讲解 Blockstream 提出的基于简单支付验证(Simplified Payment Verification,SPV)证明的方法。
如前面章节所述,在比特币系统中验证交易时,涉及到交易合法性检查、双重花费检查、脚本检查等。由于验证过程需要完整的 UTXO 记录,通常要由运行着完整功能节点的矿工来完成。
而很多时候,用户只关心与自己相关的那些交易,比如当用户收到其他人号称发来的比特币时,只希望能够知道交易是否合法、是否已在区块链中存在了足够的时间(即获得足够的确认),而不需要自己成为完整节点做出完整验证。
中本聪设计的简单支付验证(Simplified Payment Verification,SPV)可以实现这一点。SPV 能够以较小的代价判断某个支付交易是否已经被验证过(存在于区块链中),以及得到了多少算力保护(定位包含该交易的区块在区块链中的位置)。SPV 客户端只需要下载所有区块的区块头(Block Header),并进行简单的定位和计算工作就可以给出验证结论。
侧链协议中,用 SPV 来证明一个交易确实已经在区块链中发生过,称为 SPV 证明(SPV Proof)。一个 SPV 证明包括两部分内容:一组区块头的列表,表示工作量证明;一个特定输出(output)确实存在于某个区块中的密码学证明。
侧链协议的设计难点在于如何让资产在主链和侧链之间安全流转。简而言之,接受资产的链必须确保发送资产的链上的币被可靠锁定。
图 1.9.7.2 - 侧链双向挂钩的过程
具体,协议采用双向挂钩机制实现比特币向侧链转移和返回。主链和侧链需要对对方的特定交易做 SPV 验证。完整过程如下:
侧链技术最早由 Blockstream 公司进行探索,于 2015 年 10 月联合合作伙伴发布了基于侧链的商业化应用 Liquid。
基于一年多的探索,Blockstream 于 2017 年 1 月发表文章《Strong Federations: An Interoperable Blockchain Solution to Centralized Third Party Risks》,被称为对侧链早期白皮书的补充和改良。白皮书中着重描述了联合挂钩(Federated Pegs)的相关概念和应用。
此外,还有一些其他公司或组织也在探索如何合理地应用侧链技术,包括 ConsenSys、Rootstock、Lisk 等。
比特币的设计目标在于支持一套安全、开放、分布式的数字货币系统。围绕这一目标,比特币协议的设计中很多地方都体现了权衡(trade-off)的思想。
比特币协议不会一成不变。当需要修复漏洞、扩展功能或调整结构时,比特币需要在全网的配合下进行升级。升级通常涉及更改交易的数据结构或区块的数据结构。
由于分布在全球的节点不可能同时完成升级来遵循新的协议,因此比特币区块链在升级时可能发生分叉(Fork)。对于一次升级,如果把网络中升级了的节点称为新节点,未升级的节点称为旧节点,根据新旧节点相互兼容性上的区别,可分为软分叉(Soft Fork)和硬分叉(Hard Fork)。
尽管通过硬分叉升级区块链协议的难度大于软分叉,但软分叉能做的事情毕竟有限,一些大胆的改动只能通过硬分叉完成。
交易延展性(Transaction Malleablility)是比特币的一个设计缺陷。简单来讲,是指当交易发起者对交易签名(sign)之后,交易 ID 仍然可能被改变。
下面是一个比特币交易的例子。
{
"txid": "f200c37aa171e9687452a2c78f2537f134c307087001745edacb58304053db20",
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "21f10dbfb0ff49e2853629517fa176dc00d943f203aae3511288a7dd89280ac2",
"vout": 0,
"scriptSig": {
"asm": "304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a33e712870503438d8be2d66a0102204782a2714215dc0d581e1d435b41bc6eced2c213c9ba0f993e7fcf468bb5d311[ALL] 025840d511c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a26299",
"hex": "47304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a33e712870503438d8be2d66a0102204782a2714215dc0d581e1d435b41bc6eced2c213c9ba0f993e7fcf468bb5d3110121025840d511c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a26299"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.00167995,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 7c4338dea7964947b3f0954f61ef40502fe8f791 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9147c4338dea7964947b3f0954f61ef40502fe8f79188ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1CL3KTtkN8KgHAeWMMWfG9CPL3o5FSMU4P"
]
}
}
]
}
发起者对交易的签名(scriptSig)位于交易的输入(vin)当中,属于交易内容的一部分。交易 ID(txid)是整个交易内容的 Hash 值。这就造成了一个问题:攻击者(尤其是签名方)可以通过改变 scriptSig 来改变 txid,而交易仍旧保持合法。例如,反转 ECDSA 签名过程中的 S 值,签名仍然合法,交易仍然能够被传播。
这种延展性攻击能改变交易 ID,但交易的输入和输出不会被改变,所以攻击者不会直接盗取比特币。这也是为什么这一问题能在比特币网络中存在如此之久,而仍未被根治。
然而,延展性攻击仍然会带来一些问题。比如,在原始交易未被确认之前广播 ID 改变了的交易可能误导相关方对交易状态的判断,甚至发动拒绝服务攻击;多重签名场景下,一个签名者有能力改变交易 ID,给其他签名者的资产带来潜在风险。同时,延展性问题也会阻碍闪电网络等比特币扩展方案的实施。
比特币当前将区块容量限制在 1MB 以下。如图所示,随着用户和交易量的增加,这一限制已逐渐不能满足比特币的交易需求,使得交易日益拥堵、交易手续费不断上涨。
图 1.9.8.1 - 日益增加的区块容量
关于比特币扩容的持续争论从 2015 年便已开始,期间有一系列方案被摆上台面,包括各种链上扩容提议、用侧链或闪电网络扩展比特币等。考虑到比特币复杂的社区环境,其扩容方案早已不是一方能说了算;而任何一个方案想让要达成广泛共识都比较困难,不同的方案之间也很难调和。
当前,扩容之争主要集中在两派:代表核心开发者的 Bitcoin Core 团队主推的隔离见证方案,和 Bitcoin Unlimited 团队推出的方案。
隔离见证方案
隔离见证(Segregated Witness,简称 SegWit)是指将交易中的签名部分从交易的输入中隔离出来,放到交易末尾的被称为见证(Witness)的字段当中。
对交易 ID 的计算将不再包含这一签名部分,所以这也是延展性问题的一种解法,给引入闪电网络等第二层协议增强了安全性。
同时,隔离见证会将区块容量上限理论上提高到 4MB。对隔离见证的描述可详见五个比特币改进协议(Bitcoin Improvement Proposal):BIP 141 ~ BIP 145。
Bitcoin Unlimited 方案
Bitcoin Unlimited 方案(简称 BU)是指扩展比特币客户端,使矿工可以自由配置他们想要生成和验证的区块的容量。
根据方案的设想,区块容量的上限会根据众多节点和矿工的配置进行自然收敛。Bitcoin Unlimited Improvement Proposal(BUIP) 001 中表述了这一对比特币客户端的拓展提议,该方案已获得一些大型矿池的支持和部署。
比特币的匿名特性,使得其上交易的监管变得十分困难。
不少非法分子利用这一点,通过比特币转移资金。例如 WannaCry 网络病毒向受害者勒索比特币,短短三天时间里传播并影响到全球 150 多个国家。尽管这些不恰当的行为与比特币项目自身并无直接关系,但都或多或少给比特币社区带来了负面影响。
实际上,认为通过比特币就可以实现完全匿名化并不现实。虽然交易账户自身是匿名的 Hash 地址,但一些研究成果(如《An analysis of anonymity in the bitcoin system》)表明,通过分析大量公开可得的交易记录,有很大概率可以追踪到比特币的实际转移路线,甚至可以追踪到真实用户。
比特币相关工具包括客户端、钱包和矿机等。
比特币客户端用于和比特币网络进行交互,同时可以参与到网络的维护。
客户端分为三种:完整客户端、轻量级客户端和在线客户端。
比特币客户端可以从 https://bitcoin.org/en/download 下载到。
基于比特币客户端,可以很容易实现用户钱包功能。
比特币钱包存储和保护用户的私钥,并提供查询比特币余额、收发比特币等功能。根据私钥存储方式不同,钱包主要分为以下几种:
比特币钱包可以从 https://bitcoin.org/en/choose-your-wallet 获取到。
比特币矿机是专门为“挖矿”设计的硬件设备,目前主要包括基于 GPU 和 ASIC 芯片的专用矿机。这些矿机往往采用特殊的设计来加速挖矿过程中的计算处理。
矿机最重要的属性是可提供的算力(通常以每秒可进行 Hash 计算的次数来表示)和所需要的功耗。当算力足够大,可以在概率意义上挖到足够多的新的区块,来弥补电力费用时,该矿机是可以盈利的;当单位电力产生的算力不足以支付电力费用时,该矿机无法盈利,意味着只能被淘汰。
目前,比特币网络中的全网算力仍然在快速增长中,矿工需要综合考虑算力变化、比特币价格、功耗带来的电费等许多问题,需要算好“经济账”。
本章介绍了比特币项目的相关知识,包括核心技术、工具、设计,以及最新的闪电网络、侧链和扩容讨论等进展。
比特币自身作为数字货币领域的重大突破,对分布式记账领域有着很深远的影响。尤其是其底层的区块链技术,已经受到金融和信息行业的重视,在许多场景下都得到应用。
通过本章的剖析,可以看出,比特币网络系统中并没有完全从头进行创新的技术,而是有机地组合了密码学、博弈论、记账技术、分布式系统和网络、控制论等领域的已有成果。有人认为,比特币发明人对于对这些技术的应用也并没有达到十分专业的地步。但正是如此巧妙的组合,让比特币项目能完成这样一件了不起的创举,也体现出了发明者堪比大师的境界。