如今,人们很难屏蔽有关区块链的信息。区块链将成为基于智能合约的新商业世界的基础。它允许每个人追踪食物来源,追踪购买的物品,追踪传播的思想。它将改变我们的工作方式、经济运行方式以及我们的生活方式。
尽管区块链显示出巨大潜力,但仍很难找到对其真正含义的准确描述。在谷歌中搜索“区块链技术论文”,前三屏全是白皮书,没有技术论文。并且很多白皮书是没有经过同行评议的。对这项技术本身最好的讨论之一来自美国国家标准与技术研究所( National Institute of Standards and technology ),但这本50多页的论文读起来有点吃力。
Yaga, D., Mell, P., Roby, N., Scarfone, K. 2018. Blockchain technology overview. NISTIR 8202 (October). National Institute of Standards and Technology; https://nvlpubs.nist.gov/nistpubs/ir/2018/NIST.IR.8202.pdf. Search done on terms "blockchain technical papers" on 10/31/18.
本文的目的是研究区块链的基础知识:区块链的各个独立组件、以及这些组件如何组合在一起,并且如何演进以解决区块链技术的一些问题。区块链技术并不是单块的,可以选择去掉一些组件,而使用另外一些组件。
因为没有统一的技术规范,所以一些自称区块链的系统将与本文描述的系统不同。本文描述的内容大部分参考中本聪最初的经典论文,虽然细节可能不同,但主旨是一致的。
Nakamoto, S. 2008. Bitcoin, a peer-to-peer electronic cash system; https://bitcoin.org/bitcoin.pdf.
区块链的目标
区块链系统最初的目标是支持”基于加密证明而不是基于信任的数字支付系统”。虽然区块链使用范围大幅扩大,但基本目标和需求没有变化。
第一个目标是确保区块链用户的匿名性。这是通过使用公钥/私钥的密钥对来实现的。这种方式是众所周知的,区块链技术并没有重新发明这种方式。简单说来就是:每个参与者的身份由公钥标识,身份验证通过私钥签名来完成。由于公钥/私钥技术不是特定于区块链的,因此本文不再赘述。
第二个目标是提供交易集合的公共记录或账本,一旦被验证和接受,这些记录或账本就不能再更改。这个设计是为了防止数字货币的双花和对所有交易进行公开审计。账本是对已发生的交易和交易顺序的记录。目前区块链技术的主要扩展是使用账本核查数字货币交易以外的其他交易。
最后一个目标,也是区块链的核心目标,即是使系统独立于任何中心化或受信任的权威机构。这意味着这是一个个体或参与者驱动的系统,在这个系统中,没有任何实体比其他实体拥有更多或更少的权威或信任。这个设计是为了确保其他目标,前提是系统的参与者中有一半以上是诚实的。
区块链的架构组件
虽然实现区块链的方法有很多,但都包含三个主要组件。第一个是账本,它是公开记录交易和交易顺序的一系列区块。第二个是共识协议,它允许系统的所有成员对存储在账本中的值达成一致。第三个是数字货币,作为对那些愿意推进记账工作的参与者的奖励。这三个组件协同工作以形成一个系统,使得这个系统具有以下目标:稳定性、不可抵赖性和信任分散化。
账本
账本是区块的顺序序列,其中每个区块又是交易的顺序序列(尽管交易大小是商定的,而实际大小因系统而异)。区块的第一个条目是前一个区块的加密哈希(例如,安全哈希算法SHA-256)。这可以防止前一区块内容的更改,因为任何更改都会改变该区块的加密哈希,因此可以由系统检测到。区块哈希很容易计算,但不可能从哈希得到区块内容(至少就我们目前的知识而言)。因此,一旦发布了区块哈希,系统中的任何成员都可以很容易地检查哈希是否正确。
然而,由区块构成账本并不是什么新鲜事。它只是一个链式的Merkle tree,而Merkle tree已经使用多年。区块链的创新是每一个出块资格的哈希计算:向哈希操作添加一个nonce(随机值),直到得到的哈希有一定数量(通常是6个或8个)的前导零为止。因为没有办法预测哈希结果会有多少个前导零,所以这是一个蛮力计算,这个难度是前导零数量的指数级。这使得哈希计算变得非常困难,这意味着系统中的任何成员都有机会获得正确哈希,其概率与该成员投入该问题的算力成正比。提出正确哈希和nonce就是工作量证明(也许是运气),系统的任何成员都可以很容易地验证这一点。那些试图计算一个区块正确哈希值的成员就是区块链世界的矿工,他们用算力获得报酬。
一旦矿工提出正确的nonce,该nonce可以生成正确哈希值,他们将结果广播给系统的其他成员,所有矿工都将继续寻找下一个区块的哈希值。新区块中的第一个条目将是前一个区块的哈希,而第二个条目将是矿工费,支付给找到前一个区块哈希的矿工。
区块链的运行要求必须有一个初始区块,即创世区块。所有区块链系统的启动方式都是相同的:创造并声明一个区块为创世区块(Genesis block)。
当然,有可能两个不同的矿工同时(或者几乎同时)发现一个正确的nonce以及正确数量前导零的候选哈希值;也有可能一个矿工看到一个正确nonce,然后声称这是他自己的发现。甚至可能有两个不同的区块作为链的下一个区块。处理这些问题需要系统的另一个架构组件:共识协议。
共识协议
共识协议是分布式系统研究最多的领域之一。虽然很早以前(1985年) FLP Impossibility 已经证明,在“任意故障”的前提下,没有任何算法可以保证达成共识。一些著名的协议已经在使用,比如Paxos,为分布式协定提供了可靠基础。然而,在诸如Paxos的共识协议中,都假设需要达成协定的节点数量是已知的。
Fischer, M., Lynch, N. A., Paterson, M. 1985. Impossibility of distributed consensus with one faulty process. Journal of the Association for Computing Machinery 32(2), 374-382. Lamport, L. 1998. The part-time parliament. ACM Transactions on Computer Systems 16(2), 133-169.
根据不同的故障模型,达成共识所需要的节点数量也是不同的。在非拜占庭故障的系统中,只要大多数节点同意,共识即达成。如果是拜占庭故障的系统,那么共识需要三分之二的节点(加一个)达成一致。虽然共识投票也可以在P2P系统中完成,但真正在生产环境中使用的共识算法一般都依赖于领导者来启动投票并计算结果。
然而,在区块链世界,存在一个免信任的系统,这意味着无需领导者节点。此外,参与打包交易的矿工数量也是未知的。当51%比例的矿工同意一个区块是有效时,即宣称一个区块被接受。但参与共识的矿工数量并不是已知的。
相反,谁是多数是通过竞争计算下一个区块哈希来确定的。由于一个区块的哈希是从前一个区块的哈希开始(使用前一个区块的哈希作为种子),并且挖出下一个区块的可能性与计算其哈希的算力总量成比例。占多数算力的矿工挖得一个区块,那么该区块极有可能被选为整个链的下一个区块。这是共识与最长链相关联的原因,因为该链是由最大数量的算力产生的。
这种机制依赖于生成具有正确前导零的哈希是真正随机的。随机也意味着有时会有人走运,即少数算力的矿工在多数算力矿工之前找到正确的哈希值。
然而,在更重要意义上,这并不重要。区块链世界的”多数“只是定义为适当的随机数(nonce)和哈希的合成。有时是超过一半算力的矿工解决这个难题,有时是算力较少的一个矿工非常幸运的得到了答案。未被验证的区块中的交易需要回滚,但这也正是交易事务性的本质。
区块链世界中的所有矿工都需要移动到新挖出来的区块,并以新区块为基础来挖下一个区块。这需要一种激励机制,即区块链世界的第三个组成部分:数字货币。
数字货币
矿工贡献算力计算区块的nonce和哈希的原因是,第一个这样做的矿工将获得一个数字货币,并且这个事情会作为一个交易记录在下一个区块中。这还鼓励其他矿工尽可能快地接受一个区块,这样他们就可以开始计算下一个区块的哈希。在计算前一个哈希区块所花费的时间内,这个区块可能已经被交易填满了。比特币是最早的区块链货币和激励系统,在2017年9月,计算一个区块哈希的奖励是12.5比特币,当时比特币对美元的汇率为:1比特币= 4500美元。比特币的价格波动相当大。比特币区块的奖励设计为:每21万个比特币奖励减半。下一次减半时间预计在2020年5月25日左右。
Trubetskoy, G. 2017. Electricity cost of 1 bitcoin (September); https://grisha.org/blog/2017/09/28/electricity-cost-of-1-bitcoin/. Bitcoinblockhalf.com. Bitcoin block reward halving countdown.
其他数字货币也以类似的方式运行。要使用数字货币,需要在当前的区块中写入交易。该区块充当所有特定账本或数字货币组合的货币交换的总账本。
区块链的问题
虽然区块链最初被提议作为免信任的数字货币机制,但现在的用途已经远远超出了货币的特定用例。实际上,区块链似乎已经分解成为两个用途:第一是强调货币属性的公司,因此有了各种发币(initial coin)产品的爆发;第二是使用区块链账本作为记录和整理交易的一般机制。对于第一个用途,声称区块链可以取代过时的货币概念,并允许新的,私人的,无摩擦的经济。对于第二个用途,声称区块链可用于跟踪供应链,创建自我执行合约,并消除任何交易的中介。
这两种用途都存在一些严重的问题。这些问题是新技术取代根深蒂固的既得利益过程中都会遇到的,但其中一些问题本质上是技术问题,这些技术问题就是本文讨论的。
对区块链的批评集中在创建区块哈希的共识机制上。为了确保任何人都能验证区块哈希,该机制需要计算很难但验证很容易。为了确保已经验证的区块无法更改,哈希计算必须是不可逆的。使用诸如SHA-256之类的函数来计算区块哈希并且添加一个nonce值,直到哈希结果中出现一定数量的前导零,这样的区块哈希符合上面介绍的特性。然而,这一系列要求也意味着共识机制具有内在局限性。
扩展性
对于区块链使用的基于哈希的共识机制,一个明显的担忧是,该技术能否扩展到更大范围使用所需的级别。根据blockchain.com的数据,平均每天确认的交易数量约为275,000笔,去年达到峰值约为380,000.2笔。这是一个令人印象深刻的数字,但与比较大的信用卡系统在高峰时期每分钟40万笔的交易数量相比,简直微不足道。当前区块链可以以每秒4到6个区块的速度验证,这是限制交易数量的因素。
Blockchain.com. 2018. Confirmed transactions per day; https://www.blockchain.com/charts/n-transactions?daysAverageString=7.
虽然有许多关于扩展区块链的建议,但是尚不清楚这些建议如何与系统的基本设计相适应。区块链基本设计的一个重要方面是挖矿的难度和随机化,工作量证明也是免信任共识算法的核心。如果挖矿变得更容易,那么矿工能够发现正确哈希的概率保证就会降低,而具有大量算力的矿工接管链的可能性就会增加。挖矿意味着是有难度的,这也是系统避免必须信任任何特定成员或一组成员的方法。
一种用于扩展性的机制是将区块链分割成许多不同的链,这样交易就可以在不同的链中并行执行。这种场景发生在多币种交易所,每个币种系统可以看作是一个单独的分片。为了支持跨这些分片的交易,就必须引入自身的复杂性。因为确保一致性的概念要求所有的账本都是自包含的,以便在每个账本中进行一致性检查。可以创建一个新的区块链用于跨区块链交易,并且引入一种新的数字货币作为激励,这个新货币只留在这个新的区块链生态系统中。让相互作用的区块链信任一个中介区块链是一个尚未解决的开放问题。
也有人试图使用工作量证明以外的其他机制作为共识协议。其中最著名的可能是权益证明方法(PoS),在这种方法中,区块哈希可以以更简单的方式计算,当拥有大多数货币的节点同意一个区块哈希时,就可以达成共识。由于货币的总量和它的所有者是已知的,这就不存在不知道向谁投票的问题。但这确实重新定义了系统中信任的概念:那些拥有更多财富的人比那些拥有较少财富的人更值得信任。这相当于数字货币的寡头政治,在过去并不是特别有效,但在这种背景下可能会更加稳定。
电力消耗
作为共识机制的副产物,区块链技术受到的第二个批评是,发现一个区块的正确哈希所消耗的电量。计算一定数量前导零的哈希需要进行许多哈希计算,而这些计算又会消耗大量电能。有人说比特币和相关的加密货币是一种将电力转换成货币的机制。对用电量的估计范围不一而足,低的相当于加州圣何塞市的用电量,高的相当于丹麦国家的用电量。无论使用哪种模型进行估计,答案都很大。
将用于哈希计算的硬件替换为更高效的硬件,比如专用ASIC,可以减少这种能量消耗。然而,提高哈希过程的效率,却违背了区块链免信任的基础机制。区块链的关键是,挖矿必须是困难和随机的,这样任何一个矿工找到哈希的可能性都是一样的。
如果消耗所有这些能量的算力都是有用的,那么能源消耗可能就不那么令人担忧了。例如,SETI@home通过将宇宙背景辐射的数据分析分发到互联网的计算机上,使用了相当大的能量。这项计划由加州大学伯克利分校的SETI(搜寻地外文明)研究中心发起,旨在寻找宇宙中其他智慧生命的迹象,参与者认为这是值得做的,并愿意为额外的电力支付费用。
也许用于区块链挖矿的计算可以替换为比挖矿更有意义的计算。只要这样的计算满足这样的特性:即所有矿工都可以计算(算力公平)、难以计算(难度和代价)和易于验证。目前还不清楚这种计算可能是什么。
信任
也许区块链的最大问题在于它的核心概念:免信任。技术上的复杂性在很大程度上是由这个需求造成的。然而,对于人们所谈论的区块链的核心用途:一个系统是免信任的——这是否有必要还不清楚。
由于不需要信任任何一个实体,区块链系统要求对区块的挖矿具有计算上的难度、计算上的单向性和易于验证。如果放弃这种免信任的需求,那么就可以很容易地生成一个不易更改且易于验证的公共账本。例如,假设这样的账本用于银行间转账,用户决定信任一个由大银行组成的财团、联邦储备委员会(Federal Reserve Board)或者一些消费者监管机构或组织。这个联盟可以选择一个成员节点(也可能是轮流的)负责记账,即是一个leader节点。交易被写到账本中,当账本区块达到一定大小时,leader对账本进行哈希,并使用该哈希值来启动一个新块,并继续下一个区块。除了没有一个免信任的系统,其他和区块链的操作一模一样。
而结果却大不相同。leader节点不需要不断向区块添加随机数,不断尝试计算一个满足正确数量前导零的哈希值。没有这个要求,就可以非常快速地完成哈希,而只需很少的能源消耗。区块仍然不能更改,因为哈希仍然是单向函数,并且联盟的任何成员节点,或者任何可以访问账本的其他人,都可以快速检查哈希。用这种方法可以生成一个公开的、可验证的、不可更改的账本,但是在时间和能量上的成本要低得多。
这确实需要信任该联盟的所有成员,但是验证该联盟在计算区块哈希时没有作弊是很容易的。这不是对单个实体的完全集中信任,而是对一个群组的信任。群组越大、种类越多,就越不可能串通一气。还要注意的是,这样的系统不需要数字货币作为激励机制来运行。
你该信任谁?
也许你真的不想相信任何人。校准妄想症是困难的,也许你真的想要一个经济体系,在这个体系中,没有特定一组实体有能力串通和控制这个体系。这是区块链的真实含义。
正如肯•汤普森(Ken Thompson)在1984年指出的那样,信任必须存在于某些环节(trust has to happen somewhere)。即使你不相信任何群组来计算这些区块哈希,你也需要相信管理这些区块、账本和其他部分的软件开发人员。从软件的漏洞到设计的改变,比特币生态系统的方方面面都出现了分叉,并在生态系统中造成了相当大的混乱。如果你信任代码的安全性和可靠性,那么这就是你的选择。但这不是一个免信任的体系。
Morris, D. Z. 2017. Bitcoin is in wild upheaval after the cancellation of the Segwit2x fork. Fortune (November 12); http://fortune.com/2017/11/12/bitcoin-upheavel-segwit2x-fork/. Thompson, K. 1984. Reflections on trusting trust. Communications of the ACM 27(8), 761-763; https://dl.acm.org/citation.cfm?id=358210.
对于许多应用程序来说,一个公开的、不可抵赖的、不可更改的交易账本可能是有用的工具。在已知加密协议的基础上构建这样一个系统(公开的、不可抵赖、不可更改)可以有多种方法。如果要增加系统免信任的需求,则需要在区块链这样的系统上构建应用程序。这样一个免信任的系统是有代价的。
免信任:除了信任软件之外,无需信任其他个人和实体。
代价是否值得,这需要了解系统各个部分及其交互方式,然后做出决策。没有加密货币可以构建公开的、不可抵赖的、不可更改的账本。基于难以计算且易于验证的单向函数的共识算法也可以构建这样的账本。加密货币也可以在不使用公共账本或免信任共识算法的情况下创建。共识算法的构建也无需经济激励系统或公共账本。
本文作者:
Jim Waldo是哈佛大学计算机科学实践教授,也是工程学院的首席技术官,他曾在Sun Microsystems实验室工作。
静默时间
“Silence is the language of God,
all else is poor translation.
静默是上帝的语言,
其他的一切都是蹩脚的诠释。
—— 鲁米(Rumi)”
引诱**的是金钱和奢望,吸引**的是知识和理智。