大螃嗨

好记性不如烂笔头

用户工具

站点工具


blockchainguide

目录

说明:这个wiki仅作为个人学习使用,如果侵权请联系— 螃蟹 2017/09/05 15:48
这篇文章来自于这里→区块链技术指南

前言

区块链思想的诞生与概念

任何事物的发展,从来不是一蹴而就的。

商贸合作中签订的合同,怎么确保对方能遵守和执行?

餐厅宣称刚从海里打捞上来的三文鱼,怎么证明捕捞时间和运输中的卫生?

数字世界里,怎么证明你对资产的所有?

囚徒困境中的两个人,怎样能达成利益的最大化?

宇宙不同文明之间的猜疑链,有没有可能打破?

这些看似很难解决的问题,在区块链的世界里已经有了初步的答案。

本章将简要介绍区块链相关的背景知识,包括其起源、定位、涉及到的关键技术点以及潜在的商业价值。并对区块链的发展进行展望。

从数字货币说起

货币是人类文明发展过程中的一大发明,最重要的职能包括价值尺度、流通手段、贮藏手段。很难想象离开了货币,现代社会庞大而复杂的经济和金融体系还能否持续运转。

历史上,货币的形态经历了多个阶段的演化,包括实物货币、金属货币、代用货币、信用货币、电子货币、数字货币等。货币自身的价值依托也从实物价值、发行方信用价值,到今天出现的对信息系统(包括算法、数学、密码学、软件等)的信任价值。

注:中国最早的关于货币的确切记载“夏后以玄币”出现在恒宽《盐铁论·错币》。

需求

一般等价物都可以作为货币使用。然而平时最常见的还是纸币本位制,既方便携带、不易仿制、又相对容易辩伪。

注意,严格来讲,货币(money)不等于现金或通货(cash,currency),货币的范围更广。

或许有人认为信用卡相对纸币形式更方便。相对于信用卡这样的集中式支付体系来说,货币提供了更好的匿名性。另外,一旦碰到系统故障、断网、没有刷卡机器等情况,信用卡就不可用了。

无论是货币,还是信用卡模式,都需要额外的系统(例如银行)来完成生产、分发、管理等操作,带来很大的额外成本和使用风险。诸如伪造、信用卡诈骗、盗刷、转账等安全事件屡见不鲜。

很自然的,如果能实现一种数字货币,保持既有货币的这些特性,消除纸质货币的缺陷,无疑将带来巨大的社会变革,极大提高经济活动的运作效率。

比较

让我们来对比现在的数字货币和现实生活中的纸币:

属性分析胜出方
便携这点上应该没有争议,显然数字形式的货币胜出。数字货币
防伪这点上应该说两者各有千秋,但数字货币可能略胜一筹。纸币依靠的是各种设计(纸张、油墨、暗纹、夹层等)上的精巧,数字货币依靠的则是密码学上的保障。事实上,纸币的伪造时有发生,但数字货币的伪造明面上还没能实现。数字货币
辩伪纸币即使依托验钞机仍会有误判情况,数字货币依靠密码学基本不可能出错。数字货币胜出。数字货币
匿名通常情况下,两者都能提供很好的匿名性。但都无法防御有意的追踪。平局
交易对纸币来说,谁持有纸币就是合法拥有者,交易通过纸币自身的转移即可完成。对数字货币来说则复杂的多,因为任何数字物品都是可以被复制的,因此需要额外的机制。为此,比特币发明了区块链技术来确保可靠不可篡改的交易。纸币
资源100 美元钞票的生产成本是 0.1 美元左右。100 面额人民币的生产成本说法众多,但估计应该在几毛到几块范围内。数字货币消耗的资源则复杂的多,以最坏情况估计,算出来多少就要消耗多少电(往往要更多)。纸币
发行纸币的发行需要第三方机构的参与,数字货币则通过分布式算法来完成发行。在人类历史上,通胀和通缩往往是不合理地发行货币造成的;数字货币尚无机会被验证,在这方面的表现还有待观察。平局

可见,数字货币并非在所有领域都优于已有的货币形式。不带前提的在所有领域都鼓吹数字货币并不是一种严谨的态度,应该针对具体情况具体分析。实际上,仔细观察目前支持数字货币的交易机构就会发现端倪,当前还没有一种数字货币能完整起到货币的职能。

最后,虽然当前的数字货币“实验”已经取得了巨大成功,但可见的局限也很明显:其依赖的分布式账本技术还缺乏大规模场景下考验;性能和安全性还有待提升;资源的消耗还过高等等。这些问题还有待于相关技术的进一步发展。

实现挑战

设计和实现一个数字货币并非易事。

在现实生活中,因为纸币具备可转移性,相对容易地完成价值的交割。但是因为电子内容天然具备零复制成本,无法通过发送电子内容来完成价值的转移。持有人可以试图将同一份电子货币发给多个人,这种被称为“双重支付攻击(Double-Spent)”。

也许有人会讲,当前银行中的货币都是电子化的,因为通过账号里面的数字记录了资产。说的没错,这种电子货币模式有人称为“数字货币 1.0”,它实际上是假定存在一个安全可靠的第三方记账机构来实现,这个机构利用信用作为抵押,来完成交易。

这种中心化控制下的数字货币实现相对简单,但需要一个中心管控系统。但是,很多时候并不存在一个安全可靠的第三方记账机构来充当这个中心管控的角色。

例如,贸易两国可能缺乏足够的外汇储备;网络上的匿名双方进行直接买卖;交易的两个机构彼此互不信任,找不到双方都认可的第三方担保;汇率的变化;可能无法连接到第三方的系统;第三方的系统可能会出现故障……

总结一下,在去中心化的场景下,存在几个难题:

  • 货币的防伪:谁来负责验证货币;
  • 货币交易:如何确定货币从一方转移到另外一方;
  • 避免双重支付:如何避免出现双重支付。

好吧,这事其实不太容易。

比特币出现

在不存在一个第三方记账机构的情况下,如何实现一个数字货币系统呢?

近三十年来,数字货币技术朝着这个方向努力,经历了几代演进,包括 e-Cash、HashCash、B-money 等。

1983 年,David Chaum 最早提出ecash,并于 1989 年创建了 Digicash 公司。ecash 系统是首个匿名化的数字加密货币(anonymous cryptographic electronic money, or electronic cashsystem),基于 David Chaum 发明的盲签名技术,曾被应用于银行小额支付中。ecash 依赖于一个中心化的中介机构,导致它最终失败。

1997 年,Adam Back 发明了 Hashcash,来解决邮件系统中 DoS 攻击问题。Hashcash 首次提出用工作量证明(Proof of Work,PoW)机制来获取额度,该机制后来被后续数字货币技术所采用。

1998 年,Wei Dai 提出了 B-money,将 PoW 引入数字货币生成过程中。B-money 同时是首个面向去中心化设计的数字货币。从概念上看已经比较完善,但是很遗憾的是,其未能提出具体的设计实现。

上面这些数字货币都或多或少的依赖于一个第三方系统的信用担保。直到比特币的出现,将PoW 与共识机制结合在一起,首次从实践意义上实现了一套去中心化的数字货币系统。

比特币网络无需任何管理机构,自身通过数学和密码学原理来确保了所有交易的成功进行,比特币自身的价值是通过背后的计算力为背书。这也促使人们开始思考在未来的数字世界中,该如何衡量价值,如何发行货币。

比特币:前所未有的社会学实验

什么是比特币

2008 年 10 月 31 日,化名 Satoshi Nakamoto (中本聪)的人提出了比特币的设计白皮书(最早见于 metzdowd 邮件列表),并在 2009 年公开了最初的实现代码,第一个比特币是2009 年 1 月 3 日 18:15:05 生成。但真正流行起来还是在 2010 年后的事情。其官方网站是bitcoin。

发明人(传言代号为中本聪的澳大利亚人)到目前为止尚无法确认身份,据推测,背后也可能是一个团队。

尽管充满了争议,但从技术角度看,比特币仍然是数字货币历史上一次了不起的创新。比特币网络在 2009 年上线以来已经在全球范围内 7*24 小时运行接近 8 年时间,支持过单笔 1.5亿美金的交易。比特币网络由数千个核心节点参与构成,没有任何中心的运维参与,支持了稳定上升的交易量。

比特币之所以受到无数金融从业者的热捧,在于它首次真正意义上实现了足够安全可靠的去中心化数字货币机制。

作为一种概念金融货币,比特币主要是希望解决已有金融货币系统的几个问题:

  • 被掌控在发行机构手中;
  • 自身的价值无法保证;
  • 无法匿名化交易。

搞金融的人都能想到,实际上,要设计这么一套系统,最关键的还是一套强大的交易记录系统和中立的货币发行机制。

首先,这个系统要能中立、公正、无法被篡改地记录发生过的每一笔交易。对比已有的银行系统,可以看出,现在的银行机制作为第三方,是有代价的提供了这样的服务,即如果交易双方都相信银行的数据库,那么就没问题了。可是如果是世界范围内流通的货币呢?有哪个银行能让大家完全信任它?于是,需要有一套分布式的数据库,在世界范围内都可以访问,而且都无法去控制。这也就是区块链设计的目的。

货币的发行则是通过比特币的协议来规定的,总量必须控制,发行速度会自动调整。既然总量一定,那么单个比特币的价值肯定会随着承认比特币的实体经济的加入而水涨船高。发行速度的调整则避免了通胀或者滞涨的出现。

比特币到区块链

2014年开始,比特币背后的区块链(Blockchain)技术受到大家关注,并正式引发了分布式记账本(Distributed Ledger)技术的革新浪潮。

人们开始意识到,记账本相关的技术,对于资产(包括有形资产和无形资产)的管理(包括所有权和流通)十分关键;而去中心化的分布式记账本技术,对于当前开放多维化的商业网络意义重大。区块链,正是实现去中心化记账本系统的一种极具潜力的可行技术。

目前,区块链技术已经脱离开比特币,在包括金融、贸易、征信、物联网、共享经济等诸多领域崭露头角。现在当人们提到“区块链”时,往往已经与比特币网络没有直接联系了,除非特别指出是承载比特币交易系统的“比特币区块链”。

区块链核心概念

什么是区块链

区块链(Blockchain)技术自身仍然在飞速发展中,目前还缺乏统一的规范和标准。

wikipedia 给出的定义为:

A blockchain —originally, block chain —is a distributed database that maintains a continuously-growing list of data records hardened against tampering and revision. It consists of data structure blocks—which hold exclusively data in initial blockchain implementations, and both data and programs in some of the more recent implementations—with each block holding batches of individual transactions and the results of any blockchain executables. Each block contains a timestamp and information linking it to a previous block.

最早区块链技术雏形出现在比特币项目中。作为比特币背后的分布式记账平台,在无集中式管理的情况下,比特币网络稳定运行了近八年时间,支持了海量的交易记录,并未出现严重的漏洞。

注:比特币历史上唯一已知的漏洞事件曾导致比特币的恶意增发,但问题很快被发现并修正,相关非法交易被撤销。

公认的最早关于区块链的描述性文献是中本聪所撰写的 比特币:一种点对点的电子现金系统,但该文献重点在于讨论比特币系统,实际上并没有明确提出区块链的定义和概念。在其中,区块链被描述为用于记录比特币交易的账目历史。


图 1.2.3.1 - 古老的账本

记账技术历史悠久,现代复式记账系统(Double Entry Bookkeeping)是由意大利数学家卢卡·帕西奥利,1494 年在《Summa de arithmetica, geometrica, proportioni et proportionalità》一书中最早制定。复式记账法对每一笔账目同时记录来源和去向,首次将对账验证功能引入记账过程,提升了记账的可靠性。从这个角度来看,区块链是首个自带对账功能的数字记账技术实现。

更广泛意义地看,区块链属于一种去中心化的记录技术。参与到系统上的节点,可能不属于同一组织、彼此无需信任;区块链数据由所有节点共同维护,每个参与维护节点都能复制获得一份完整记录的拷贝。

跟传统的记账技术相比,其特点应该包括:

  • 维护一条不断增长的链,只可能添加记录,而发生过的记录都不可篡改;
  • 去中心化,或者说多中心化,无需集中的控制而能达成共识,实现上尽量分布式;
  • 通过密码学的机制来确保交易无法抵赖和破坏,并尽量保护用户信息和记录的隐私性。

更进一步的,还可以将智能合约跟区块链结合到一起,让其提供除了交易(比特币区块链已经支持简单的脚本计算)功能外更灵活的合约功能,执行更为复杂的操作。这样扩展之后的区块链,已经超越了单纯数据记录的功能了,实际上带有点“普适计算”的意味了。

从技术特点上,可以看到现在区块链技术的三种典型应用场景:

定位功能智能合约一致性权限类型性能代表
公信的数字货币记账不带或较弱PoW公有链较低比特币
公信的交易处理智能合约图灵完备PoW、PoS公有链受限以太坊
带权限的交易处理商业处理多种语言、图灵完备多种,可插拔支持联盟链可扩展Hyperledger

基本原理

区块链的基本原理理解起来并不难。基本概念包括:

  • 交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录;
  • 区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识;
  • 链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。

如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。


图 1.2.3.2 - 区块链示例

基本原理

区块链的基本原理理解起来并不难。基本概念包括:

  • 交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录;
  • 区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识;
  • 链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。

如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。

在实现上,首先假设存在一个分布式的数据记录本(这方面的技术相对成熟),这个记录本只允许添加、不允许删除。其结构是一个线性的链表,由一个个“区块”串联组成,这也是其名字“区块链”的来源。新的数据要加入,必须放到一个新的区块中。而这个块(以及块里的交易)是否合法,可以通过一些手段快速检验出来。维护节点都可以提议一个新的区块,然而必须经过一定的共识机制来对最终选择的区块达成一致。

具体以比特币为例来看如何使用了区块链技术?客户端发起一项交易后,会广播到网络中并等待确认。网络中的节点会将一些等待确认的交易记录打包在一起(此外还要包括此前区块的哈希值等信息),组成一个候选区块。然后,试图找到一个 nonce 串放到区块里,使得候选区块的 hash 结果满足一定条件(比如小于某个值)。一旦算出来这个区块在格式上合法了,就可以进行全网广播。大家拿到提案区块,进行验证,发现确实符合约定条件了,就承认这个区块是一个合法的新区块,被添加到链上。当然,在实现上还会有很多的细节。

比特币的这种基于算力的共识机制被称为 Proof of Work(PoW)。目前,要让 hash 结果满足一定条件并无已知的启发式算法,只能进行暴力尝试。尝试的次数越多,算出来的概率越大。通过调节对 hash 结果的限制,比特币网络控制约 10 分钟平均算出来一个合法区块。算出来的节点将得到区块中所有交易的管理费和协议固定发放的奖励费(目前是 12.5 比特币,每四年减半)。也即俗称的挖矿。

很自然会有人问,能否进行恶意操作来破坏整个区块链系统或者获取非法利益。比如不承认别人的结果,拒绝别人的交易等。实际上,因为系统中存在大量的用户,而且用户默认都只承认他看到的最长的链。只要不超过一半(概率意义上越少肯定越难)的用户协商,最终最长的链将很大概率上是合法的链,而且随着时间增加,这个概率会越大。例如,经过 6 个块后,即便有一半的节点联合起来想颠覆被确认的结果,其概率将为XXX ,即低于XXX的可能性。

注:熟悉 Git 的人,应该会赞叹两者在设计上的异曲同工之妙。

分类

根据参与者的不同,可以分为:

  • 公开(Public)链;
  • 联盟(Consortium)链;
  • 私有(Private)链。

公开链:顾名思义,任何人都可以参与使用和维护,典型的如比特币区块链,信息是完全公开的。

如果引入许可机制,包括私有链和联盟链两种。

私有链:则是集中管理者进行限制,只能得到内部少数人可以使用,信息不公开。

联盟链:介于两者之间,由若干组织一起合作维护一条区块链,该区块链的使用必须是有权限的管理,相关信息会得到保护,典型如银联组织。

目前来看,公开链将会更多的吸引社区和媒体的眼球,但更多的商业价值应该在联盟链和私有链上。

根据使用目的和场景的不同,又可以分为以数字货币为目的的货币链,以记录产权为目的的产权链,以众筹为目的的众筹链等。

误区

目前,对区块链的认识还存在不少误区。

首先,区块链不是数据库。虽然区块链也可以用来存储数据,但它要解决的问题是多方的互信问题。单纯从存储数据角度,它的效率可能不高,笔者也不推荐把大量的原始数据放到区块链上。

其次,区块链不是要颠覆现有技术。作为基于多项已有技术而出现的新事物,区块链跟现有技术的关系是一脉相承的,在解决多方合作和可信处理上多走了一步,但并不意味着它将彻底颠覆已有的商业模式。很长一段时间里,区块链的适用场景仍需摸索,跟已有系统必然是合作共存的关系。

小结

区块链是第一个试图自带信任化和防止篡改的分布式记录系统。它的出现,让大家意识到,除了互联网这样的尽力而为的基础设施外,我们还能打造一个彼此信任的基础设施。

类似比特币这样的大规模长时间自治运行的系统,也为区块链技术的应用开启了更多遐想的空间。如果人与人之间的交易无法伪造,合同都能确保可靠执行,世界是不是更美好一些了呢?这是技术进步再次给人类发展带来福利。

不提这种去中心化的金融系统是否能在现实中普及,在跨国交易、跨组织合作日益频繁的今天,已经有了不少有意义的尝试和参考。

更进一步,比特币只是基于区块链技术的一种金融应用(而且是直接嵌入区块链中),区块链技术还能带来更通用的计算能力。Hyperledger 和 Ethereum 就试图做类似的事情,基于区块链再做一层平台层,让别人基于平台开发应用变得更简单。

另外,区块链本身可以作为分布式存储,也自然可以作为分布式计算引擎。可以想象,整个加入集群的设备都是计算引擎,大家通过付费来使用计算力,是不是就有点普适计算的意味了?

有理由相信,随着更多商业应用场景的出现,区块链技术将在未来金融和信息技术领域占据一席之地。

区块链技术的价值、挑战与展望

任何事物的发展,从来不是一蹴而就的。
商贸合作中签订的合同,怎么确保对方能遵守和执行?
餐厅宣称刚从海里打捞上来的三文鱼,怎么证明捕捞时间和运输中的卫生?
数字世界里,怎么证明你对资产的所有?
囚徒困境中的两个人,怎样能达成利益的最大化?
宇宙不同文明之间的猜疑链,有没有可能打破?
这些看似很难解决的问题,在区块链的世界里已经有了初步的答案。
本章将简要介绍区块链相关的背景知识,包括其起源、定位、涉及到的关键技术点以及潜在的商业价值。并对区块链的发展进行展望。

商业价值

现代商业的典型模式为,交易方通过协商和执行合约,完成交易过程。区块链擅长的正是如何管理合约,确保合约的顺利执行。

根据类别和应用场景不同,区块链所体现的特点和价值也不同。

从技术特点上,区块链一般被认为具有:

  • 分布式容错性:网络极其鲁棒,容错 1/3 左右节点的异常状态。
  • 不可篡改性:一致提交后的数据会一直存在,不可被销毁或修改。
  • 隐私保护性:密码学保证了未经授权者能访问到数据,但无法解析。

随之带来的业务特性将可能包括:

  • 可信任性:区块链技术可以提供天然可信的分布式账本平台,不需要额外第三方中介机构。
  • 降低成本:跟传统技术相比,区块链技术可能带来更短的时间、更少的人力和维护成本。
  • 增强安全:区块链技术将有利于安全可靠的审计管理和账目清算,减少犯罪可能性,和各种风险。

区块链并非凭空诞生的新技术,更像是技术演化到一定程度突破应用阈值后的产物,因此,其商业应用场景也跟促生其出现的环境息息相关。基于区块链技术,任何基于数字交易的活动成本和追踪成本都会降低,并且能提高安全性。笔者认为,能否最终带来成本的降低,将是一项技术能否被深入应用的关键。

笔者认为,所有跟信息、价值(包括货币、证券、专利、版权、数字商品、实际物品等)、信用等相关的交换过程,都将可能从区块链技术中得到启发或直接受益。但这个过程绝不是一蹴而就的,可能经过较长时间的探索和论证。


图 1.3.1.1 - 区块链影响的交换过程

目前,区块链技术已经得到了众多金融机构和商业公司的关注。

已经对区块链技术进行投入或应用的金融机构(排名不分先后)目前有:

  • Visa
  • 美国纳斯达克证券交易所(Nasdaq)
  • 高盛投资银行(Goldman Sachs)
  • 花旗银行(citibank)
  • 美国富国银行(Wells Fargo)
  • 中国央行
  • 中国浦发银行
  • 日本三菱日联金融集团
  • 瑞士联合银行
  • 德意志银行
  • DTCC
  • 全球同业银行金融电讯协会(SWIFT)

部分商业、技术公司包括:

  • IBM
  • 微软
  • Intel
  • 思科(Cisco)
  • 埃森哲

关键技术和挑战

从技术角度讲,区块链涉及到的领域比较杂,包括分布式、存储、密码学、心理学、经济学、博弈论、网络协议等,下面列出了目前认为有待解决或改进的关键技术点。

密码学技术

怎么防止交易记录被篡改?

怎么证明交易方的身份?

怎么保护交易双方的隐私?

密码学正是要提供解决这些问题的有效手段。传统方案包括 hash 算法,加解密算法,数字证书和签名(盲签名、环签名)等。区块链技术的应用将可能刺激密码学的进一步发展,包括随机数的产生、安全强度、加解密处理的性能等。量子计算等新技术的出现,让 RSA 算法等已经无法提供足够的安全性。

这将依赖于数学科学的进一步发展和新一代计算技术的突破。

注:SONY PS3 私钥被破解事件 再次证明,即便足够安全的算法,如果没有被恰当的使用,都只是纸上谈兵。

分布式共识

这是个古老的话题,已有大量的研究成果(Paxos、拜占庭等)。

核心在于如何解决某个变更在网络中是一致的,是被大家都承认的,同时这个信息是被确定的,不可推翻的。该问题在公开匿名场景下和带权限管理的场景下需求差异较大。

比特币区块链考虑的是公开匿名场景下的最坏保证。引入了“工作量证明”(Proof of Work)策略来规避少数人恶意破坏数据,并通过概率模型保证最后大家看到的就是合法的最长链。此外,还有以权益为抵押的 PoS、DPoS 和 Casper 等。这些算法在思想上都是基于经济利益的博弈,让恶意破坏的参与者损失经济利益,从而保证大部分人的合作。同时,确认必须经过多个区块的生成之后从概率学上进行保证。

更广泛的区块链技术支持更多的共识机制,包括经典的拜占庭算法等,可以解决确定性的问题。

共识问题在很长一段时间内都将是极具学术价值的研究热点,核心的指标将包括容错的节点比例和收敛速度。PoW 等系列算法理论上允许少于一半的不合作节点,PBFT 等算法理论上允许不超过XXX的不合作节点。

处理性能

如何提高交易的吞吐量,同时降低交易的确认延迟。

目前,公开的比特币区块链只能支持平均每秒约 7 笔的吞吐量,一般认为对于大额交易来说,安全的交易确认时间为一个小时。小额交易只要确认被广播到网络中并带有交易服务费用,即有较大概率被最终打包到区块中。

区块链系统跟传统分布式系统不同,其处理性能无法通过单纯增加节点数来进行扩展,实际上,很大程度上取决于单个节点的处理能力。高性能、安全、稳定性、硬件辅助加解密能力,都将是考察节点性能的核心要素。

一方面可以将单个节点采用高性能的处理硬件,同时设计优化的策略和算法,提高性能;另外一方面将大量高频的交易放到链外来,只用区块链记录最终交易信息,如 闪电网络 等。类似的,侧链(side chain)、影子链(shadow chain)等的思路在当前阶段也有一定的借鉴意义。类似设计可以很容易的将交易性能提升 1-2 个数量级。此外,如果采用联盟链的方式,在一定的信任前提和利益约束下优化设计,也可以换来性能的提升。

目前,开源区块链自身在平台层面已经实现普通配置,单客户端每秒数百次的交易吞吐量(参考后面的 性能评测数据),乐观预测将很快突破每秒数千次的基准线,但离现有证券交易系统的每秒数万笔的峰值还是有较大差距。

另外,从工程设计和平台部署上,都存在一些可以优化的地方。

注:VISA 系统的处理均值为 2000 tps,号称的峰值为 56,000 tps;某支付系统的处理峰值超 过了 85,000 tps;某证券交易所号称的处理均(峰)值在 80,000 tps 左右。

扩展性

常见的分布式系统,可以通过增加节点来扩展整个系统的处理能力。

对于区块链网络系统来说,这个问题并非那么简单。

网络中每个参与维护的核心节点都要保持一份完整的存储,并且进行智能合约的处理。因此,整个网络的总存储和计算能力,取决于单个节点。甚至当网络中节点数过多时,可能会因为一致性的达成过程延迟降低整个网络的性能。尤其在公有网络中,由于大量低质量处理节点的存在问题将更明显。

比较直接的一些思路,是放松对每个节点都必须参与完整处理的限制(但至少部分节点要能合作完成完整的处理),这个思路已经在超级账本中启用;同时尽量减少核心层的处理工作。

在联盟链模式下,还可以专门采用高性能的节点作为核心节点,用相对较弱的节点作为代理访问节点。

系统安全

区块链目前最热门的应用前景是金融相关的服务,安全自然是讨论最多、挑战最大的话题。

区块链在设计上基于现有的成熟的密码学算法。但这是否就能确保其安全呢?
世界上并没有绝对安全的系统。

系统是由人设计的,系统也是由人来运营的,只要有人参与的系统,就容易出现漏洞。

可以参考,著名黑客米特尼克所著的《反欺骗的艺术——世界传奇黑客的经历分享》,介绍 了大量的实际社交工程欺骗场景。

有如下几个方面是很难逃避的。

首先是立法。对区块链系统如何进行监管?攻击区块链系统是否属于犯罪?攻击银行系统是要承担后果的。但是目前还没有任何法律保护区块链以及基于它的实现。

其次是软件实现的潜在漏洞是无法避免的。考虑到使用了几十年的 openssl 还带着那么低级的漏洞(heart bleeding),而且是源代码就在大家眼皮底下。这背后曾经发生过啥,让人遐想连篇。对于金融系统来说,无论客户端还是平台侧,即便是很小的漏洞都可能造成难以估计的损失。

另外,公有区块链所有交易记录都是公开可见的。搞大数据的人听了是不是开始激动起来了,确实,这里面能分析的东西还真不少,而且规模够大、影响力够大……实际上,已有文献证明,比特币区块链的交易记录最终是能追踪到用户的。

还有就是作为一套完全的分布式系统,公有的区块链缺乏有效的调整机制,一旦运行起来,出现问题也难以修正。即使是让它变得更公平、更完善的修改,只要有部分既得利益者合起来反对,那就无法加入进去。这让比特币本身的价值也蒙上了一层阴影。

此外,运行在区块链上的智能合约应用可能是五花八门的,必须要有办法进行安全管控,在注册和运行前需要有机制进行探测,以规避恶意代码的破坏。

2016 年 6 月 17 日,发生 DAO 系统漏洞被利用 事件,直接导致价值 6000 万美元的数字货币被利用者获取。尽管对于这件事情的反思还在进行中,但事实再次证明,目前基于区块链技术进行生产应用时,务必要细心谨慎地进行设计和验证。

数据库和存储系统

区块链网络中的块信息需要写到数据库中进行存储。

观察区块链的应用,大量的写操作、hash 计算和验证操作,跟传统数据库的行为十分不同。

当年,人们观察到互联网应用大量非事务性的查询操作,而设计了非关系型(NoSql)数据库。那么,针对区块链应用的这些特点,是否可以设计出一些特殊的针对性的数据库呢?levelDB、RocksDB 等键值数据库,具备很高的随机写和顺序读\/写性能,以及相对较差随机读的性能,被广泛应用到了区块链信息存储中。但目前来看,面向区块链的数据库技术仍然是需要突破的技术难点之一。

笔者认为,未来将可能出现更具针对性的“块数据库(BlockDB)”,专门服务类似区块链这样的新型数据业务,其中每条记录将包括一个完整的区块信息,并天然地跟历史信息进行关联,一旦写入确认无法修改。所有操作的最小单位将是一个块。

可集成性

在相当长的一段时间内,基于区块链的新业务系统将与已有的中心化系统共存。

两种系统如何共存,如何分工,彼此的业务交易如何进行传递?

这些都是很迫切的问题。这个问题解决不好,将是区块链技术落地的很大阻碍。

其它

区块链提供的新应用和新的业务场景,也带来了对很多具体的运营问题。
例如:

  • 智能合约的合法性、安全性和可执行性;
  • 如何将现实中的合约和条约对应为电子合约;
  • 分布式系统的伸缩可靠性和数据迁移;
  • 对存储系统新的挑战,特别是性能。

趋势与展望

关于区块链的探讨和争论,自其诞生之日起就从未停息。

或许从计算技术的演变历史中能得到一些启发。


图 1.3.3.1 - 计算的历史,笔者于某次技术交流会中提出

以云计算为代表的现代计算技术,其发展历史上有若干重要的时间点和事件:

  • 1969 - ARPANet(Advanced Research Projects Agency Network):现代互联网的前身,被美国高级研究计划署(Advanced Research Project Agency)提出,其使用 NCP协议,核心缺陷之一是无法做到和个别计算机网络交流;
  • 1973 - TCP/IP:Vinton.Cerf(文特•瑟夫)与Bob Karn(鲍勃•卡恩)共同开发出 TCP 模型,解决了 NCP 的缺陷;
  • 1982 - Internet:TCP/IP 正式成为规范,并被大规模应用,现代互联网诞生;
  • 1989 - WWW:早期互联网的应用主要包括 telnet、ftp、email 等,蒂姆·伯纳斯-李(TimBerners-Lee)设计的 WWW 协议成为互联网的杀手级应用,引爆了现代互联网,从那开始,互联网业务快速扩张;
  • 1999 - salesforce:互联网出现后,一度只能进行通信应用,但 salesforce 开始以云的理念提供基于互联网的企业级服务;
  • 2006 - aws ec2:AWS EC2 奠定了云计算的业界标杆,直到今天,竞争者们仍然在试图追赶 AWS 的脚步;
  • 2013 - cognitive:以 IBM Watson 为代表的认知计算开始进入商业领域,计算开始变得智能,进入“后云计算时代”。

从这个历史中能看出哪些端倪呢?

一个是 技术领域也存在着周期律。 这个周期目前看是 7-8 年左右。或许正如人有“七年之痒”,技术也存在着七年这道坎,到了这道坎,要么自身突破迈过去,要么往往就被新的技术所取代。如果从比特币网络上线(2009 年 1 月)算起,到今年正是在坎上。因此,现在正是相关技术进行突破的好时机。

为何恰好是 7 年?7 年按照产品周期来看基本是 2~3 个产品周期,所谓事不过三,经过 2~3个产品周期也差不多该有个结论了。

另外,最早出现的未必是先驱,也可能是先烈。 创新固然很好,但过早播撒的种子,没有合适的土壤,往往也难长大。技术创新与科研创新很不同的一点便是,技术创新必须立足于需求,过早过晚都会错失良机。科研创新则要越早越好,最好像二十世纪那批物理巨匠们一样,让后人吃了一百多年的老本。

最后,事物的发展往往是延续的、长期的。 新生事物大都不是凭空蹦出来的,往往是解决了前辈未能解决的问题,或是出现了之前未曾出现过的场景。而且很多时候,新生事物会在历史的舞台下面进行长期的演化,只要是往提高生产力的正确方向,迟早会出现在舞台上的一天。


图 1.3.3.2 - 坚持还是放弃?

目前,区块链在数字货币领域(以比特币为代表)的应用已经相对成熟,而在智能合约方向尚处于初步实践阶段。区块链技术的应用已经在许多领域都带来了生产力提升,笔者相信,随着技术进一步的发展,区块链将会促进金融和信息科技走向新的阶段。

小结

区块链是第一个试图自带信任化和防止篡改的分布式记录系统。它的出现,让大家意识到,除了互联网这样的尽力而为的基础设施外,我们还能打造一个彼此信任的基础设施。

类似比特币这样的大规模长时间自治运行的系统,也为区块链技术的应用开启了更多遐想的空间。如果人与人之间的交易无法伪造,合同都能确保可靠执行,世界是不是更美好一些了呢?这是技术进步再次给人类发展带来福利。

不提这种去中心化的金融系统是否能在现实中普及,在跨国交易、跨组织合作日益频繁的今天,已经有了不少有意的尝试和参考。

更进一步,比特币只是基于区块链技术的一种金融应用(而且是直接嵌入区块链中),区块链技术还能带来更通用的计算能力。Hyperledger 和 Ethereum 就试图做类似的事情,基于区块链再做一层平台层,让别人基于平台开发应用变得更简单。

另外,区块链本身可以作为分布式存储,也自然可以作为分布式计算引擎。可以想象,整个加入集群的设备都是计算引擎,大家通过付费来使用计算力,是不是就有点普适计算的意味了?

有理由相信,随着更多商业应用场景的出现,区块链技术将在未来金融和信息技术领域占据一席之地。

典型应用场景

应用为王。

一项技术能否最终存活下来,有很多决定因素,但其中十分关键的便是是否能找到合适的应用场景。

区块链最近几年炒得很热,国内已有大量与之相关的企业,有些企业已经结合已有业务摸索出了自己的应用场景,但仍有不少企业处于不断试探和反复迷惑状态。

实际上,要找到合适的应用场景,还是要从区块链自身的特性出发进行分析。区块链在不引入第三方中介机构的前提下,可以提供去中心化、不可篡改、安全可靠等特性保证。因此,所有直接或间接依赖于第三方担保信任机构的活动,均可能从区块链技术中获益。

笔者认为,未来几年内,可能深入应用区块链的场景将包括:

  • 金融服务:主要是降低交易成本,减少跨组织交易风险等。该领域的区块链应用将最快成熟起来,银行和金融交易机构将是主力推动者。
  • 征信和权属管理:这是大型社交平台和保险公司都梦寐以求的,目前还缺乏足够的数据来源、可靠的平台支持和有效的数据分析和管理。该领域创业的门槛极高,需要自上而下的推动。
  • 资源共享:airbnb 为代表的公司将欢迎这类应用,极大降低管理成本。这个领域创业门槛低,主题集中,会受到投资热捧。
  • 投资管理:无论公募还是私募基金,都可以应用区块链技术降低管理成本和管控风险。虽然有 DAO 这样的试水,谨慎认为该领域的需求还未成熟。
  • 物联网与供应链:物联网是很适合的一个领域,短期内会有大量应用出现,特别是租赁、物流等特定场景。但物联网自身的发展局限将导致短期内较难出现规模应用。

当然,短期内部分场景可能还难以实现,但区块链技术的正确应用会促进这些行业的进一步发展。

金融服务

自有人类社会以来,金融交易就是必不可少的经济活动。交易角色和内容的不同,反映出来就是不同的生产关系。通过交易,可以优化社会的效率,实现价值的最大化。人类社会的发展,离不开交易形式的演变。可见,交易在人类社会中的地位有多重要。

交易本质上交换的是价值的所属权。现在为了完成交易(例如房屋、车辆的所属权),往往需要一些中间环节,特别是中介担保角色。这是因为,交易双方往往存在着不充分信任的情况,要证实价值所属权并不容易,而且往往彼此的价值不能直接进行交换。合理的中介担保,确保了交易的正常运行,提高了经济活动的效率,但已有的第三方中介机制往往存在成本高、时间周期长、流程复杂、容易出错等缺点。正是因为这些,金融服务成为区块链最为火热的应用领域之一。

区块链技术可以为金融服务提供有效可靠的所属权证明和相当强的中介担保机制。

金融服务涉及的领域包括货币、证券、保险、捐赠等。

银行金融管理

银行分为中央银行和普通银行。

中央银行的两大职能是“促进宏观经济稳定”和“维护金融稳定”(《金融的本质》,伯克南),主要手段就是管理各种证券和利率。央行的存在,为整个社会的金融体系提供了最终的信用担保。

普通银行业则往往基于央行的信用,实际作为中介担保,来协助完成多方的金融交易。银行的活动包括发行货币,完成存款、贷款等大量的交易内容。银行必须能够确保交易的确定性,必须通过诸多手段确立自身的信用地位。

传统的金融系统为了完成上述功能,开发了极为复杂的软件和硬件方案,不仅消耗了昂贵的成本,还需要大量的维护成本。即便如此,这些系统仍然存在诸多缺陷,例如很多交易都不能在短时间内完成,每年发生大量的利用银行相关金融漏洞进行的犯罪。

此外,在目前金融系统流程情况下,大量商家为了完成交易,还常常需要额外的组织(如支付宝)进行处理,这些实际上都增加了目前金融交易的成本。

区块链技术被认为是有可能促使这一行业发生革命性变化的“奇点”。除了众所周知的比特币等数字货币之外,还有诸多金融机构进行了有意义的尝试。

欧洲央行评估区块链在证券交易后结算的应用

目前,全球交易后的对账和处理费用超过 200 亿美金。

央行的报告显示,区块链作为分布式账本技术,可以节约对账的成本,同时让证券所有权的变更可能变得近乎实时。

中国中央银行投入区块链研究

央行行长周小川曾表示央行数字货币可能将采用区块链模式,彻底改变传统货币流通模式。据悉,已有专门的团队在进行评估和实践。

2016 年 1 月 20 日,专门组织了“数字货币研讨会”,邀请了花旗、德勤等公司的区块链专家就数字货币发行的总体框架、演进、国家加密货币等话题进行了研讨。

会后,发布对我国银行业数字货币的战略性发展思路,提出要早日发行数字货币,并利用数字货币相关技术来打击金融犯罪活动。

加拿大银行提出新的数字货币

加拿大央行正在开发基于区块链技术的数字版加拿大元(名称为 CAD 币),以允许用户可以使用加元来兑换该数字货币。经过验证的对手方将会处理交易,如果需要,银行将保留销毁CAD币的权利。

发行 CAD 币是更大的一个探索型科技项目 Jasper 的一部分。除了加拿大央行外,据悉,蒙特利尔银行、加拿大帝国商业银行、加拿大皇家银行、加拿大丰业银行、多伦多道明银行等多家机构也都参与了该项目。
来源:金融时报- Canada experiments with digital dollar on blockchain,2016-06-16。

英国银行实现 RSCoin

英国银行在数字化货币方面进展十分突出,已经实现了基于分布式账本平台的数字化货币系统,RSCoin。

RSCoin 目标是提供一个由中央银行控制的数字货币,采用了双层链架构、改进版的 2PC 提交,以及多链条之间的交叉验证机制。因为主要是央行和下属银行之间使用,通过提前建立一定的信任基础,可以提供较好的处理性能。

中国邮储银行将区块链技术应用到核心业务系统

2016年10月,中国邮储银行宣布携手 IBM 推出基于区块链技术的资产托管系统,为中国银行业首次将区块链技术应成功用于核心业务系统。

新的业务系统免去了重复的信用校验过程,将原有业务环节缩短了约60-80%,提高了信用交易的效率。

各种新型支付业务

基于区块链技术,出现了大量的创新支付企业。

  • Abra:区块链数字钱包,无需银行账户和手续费。
  • Bitwage:基于比特币区块链的跨境工资支付平台。
  • BitPOS:低成本的快捷线上支付。
  • Circle:由区块链充当支付网络,允许用户快速进行跨币种的快速汇款。
  • Ripple:实现跨境的多币种低成本实时交易,引入了网关概念(类似银行)。

证券交易

证券交易包括交易执行和确认环节。

交易本身相对简单,主要是由交易系统(极为复杂的软硬件系统)完成电子数据库中内容的变更。中心的验证系统极为复杂和昂贵;交易指令执行后的结算和清算环节也十分复杂,往往需要较多人力成本和大量的时间,并且容易出错。

目前来看,基于区块链的处理系统还难以实现海量交易系统所需要的性能(每秒一万笔以上成交,日处理能力超过五千万笔委托、三千万笔成交)。但在交易的审核和清算环节,区块链技术存在诸多的优势,可以避免人工的参与。

咨询公司 Oliver Wyman 给 SWIFT(环球同业银行金融电讯协会)提供的研究报告预计全球清算行为成本约 50~100 亿美元,结算成本、托管成本和担保物管理成本 400~450 亿美元(390 亿美元为托管链的市场主体成本),而交易后流程数据及分析花费 200~250 亿美元。

2015 年 10 月,美国纳斯达克(Nasdaq)证券交易所推出区块链平台 Nasdaq Linq,实现主要面向一级市场的股票交易流程。通过该平台进行股票发行的的发行者将享有“数字化”的所有权。

其它相关企业还包括:

  • BitShare 推出基于区块链的证券发行平台,号称每秒达到 10 万笔交易。
  • DAH 为金融市场交易提供基于区块链的交易系统。获得澳洲证交所项目。
  • Symbiont 帮助金融企业创建存储于区块链的智能债券,当条件符合时,清算立即执行。
  • Overstock.com 推出基于区块链的私有和公开股权交易“T0”平台,提出“交易即结算”(Thetrade is the settlement)的理念,主要目标是建立证券交易实时清算结算的全新系统。高盛为一种叫做“SETLcoin”的新虚拟货币申请专利,用于为股票和债券等资产交易提供“近乎立即执行和结算”的服务。

征信和权属管理

征信管理

征信管理是一个巨大的潜在市场,据称超过千亿规模(平安证券报告,美国富国银行报告),也是目前大数据应用最有前途的方向之一。

目前的征信相关的大量有效数据主要集中在少数机构手中。由于这些数据太过敏感,并且是商业命脉,往往会被严密保护起来,进而形成很高的行业门槛。

虽然现在大量的互联网企业(最成功的应该属 facebook)尝试从各种维度都获取了海量的用户信息,但从征信角度看,这些数据仍然存在若干问题。

  • 数据量不足:数据量越大,能获得的价值自然越高,而数据产生有效价值存在一个下限。低于下限的数据量无法产生有效价值;
  • 相关度较差:最核心的数据也往往是最敏感的,在隐私高度敏感的今天,用户都不希望暴露过多数据给第三方,因此企业获取到数据中有效成分其实很少;
  • 时效性不足:企业可以从明面上获取到的用户数据往往是过时的,甚至存在虚假信息,对相关分析的可信度造成严重干扰。

而区块链存在着天然无法篡改、不可抵赖的特性。同时,区块链将可能提供前所未有规模的相关性极高的数据,这些数据可以在时空中准确定位,并严格关联到用户。因此,基于区块链提供数据进行征信管理,将让信用评估的准确率大大提高,并且降低进行评估的成本。

另外,跟传统依靠人工的审核不同,区块链技术完全依靠数学成果,基于区块链的信用机制将天然具备稳定性和中立性。

包括 IDG、腾讯、安永、普华永道等都纷纷投资或进入基于区块链的征信管理领域,特别是跟保险和互助经济相关的应用场景。

权属管理

用于产权、版权等所有权管理和追踪。包括汽车、房屋、艺术品等各种贵重物品的交易等。也包括数字出版物,以及可以标记实体物品的数字标记。

目前最大的几个难题是:

  • 物品所有权的确认和管理;
  • 交易的安全可靠;
  • 一定的隐私保护。

比如,目前要交易房屋,如果买卖双方互相不认识的话,往往需要依托中介机构来确保交易的进行,通过纸质的材料证明房屋所有权。但实际上,很多时候中介机构也无法确保交易的正常进行。

而利用区块链技术,物品的所有权是写在数字链上的,谁都无法修改,并且一旦出现合同中约定情况,区块链技术将确保合同能得到准确执行。

公正通(Factom)尝试使用区块链技术来革新商业社会和政府部门的数据管理和数据记录方式。包括审计系统、医疗信息记录、供应链管理、投票系统、财产契据、法律应用、金融系统等。它将待确权数据的指纹存放到基于区块链的分布式账本中,可以提供资产所有权的追踪服务。

其它项目

在教育领域,MIT 研究员朱莉安娜·纳扎雷(Juliana Nazaré)和学术创新部主管菲利普·施密特(Philipp Schmidt)发表了文章,介绍基于区块链的学历认证系统。基于该系统,用人单位可以确认求职者的学历信息是真实可靠的。

此外,还包括:

  • BitShare:自由贸易的资产交易所。
  • Everledger:基于区块链的贵重资产检测系统,将钻石或者艺术品加上哈希值记录在区块链上。
  • Mycelia:区块链产权保护项目,为音乐人实现音乐的自由交易。
  • Monegraph:通过区块链保障图片版权的透明交易。
  • Mediachain:通过 metadata 协议,将内容创造者与作品唯一对应。

资源共享

资源共享目前面临的问题主要包括:

  • 共享过程成本过高;
  • 用户身份评分难;
  • 共享服务管理难。

短租共享

大量提供短租服务的公司已经开始尝试用区块链来解决共享中的难题。

一份来着高盛的报告中宣称:
Airbnb 等 P2P 住宿平台已经开始通过利用私人住所打造公开市场来变革住宿行业,但是这种服务的接受程度可能会因人们对人身安全以及财产损失的担忧而受到限制。而如果通过引入安全且无法篡改的数字化资质和信用管理系统,我们认为区块链就能有助于提升P2P住宿的接受度。

该报告还指出,可能采用区块链技术的企业 Airbnb、HomeAway 以及 OneFineStay 等,市场规模为 30-90 亿美元。

社区能源共享

案例主要包括家庭太阳能发电后通过社区的电力网络进行买卖,例如纽约的 微型电网。

ConsenSys 和微电网开发商 LO3 共建光伏发电交易网络,实现点对点的能源交易。

主要难题包括:

  • 太阳能电池
  • 社区电网构建
  • 电力储备系统
  • 交易系统

现在已经有大量创业团队在解决这些问题,硬件部分已经有了很多很好的案例。而通过区块链技术打造的平台主要解决最后一个问题,可以很容易实现社区内低成本的可靠交易系统。

电商平台

OpenBazaar 试图在无中介的情形下,实现安全电商交易。

传统情况下,电商平台起到了中介的作用,一旦发生纠纷,会作为第三方机构进行审判。这种模式存在着周期长、缺乏公证、成本高等缺点。

OpenBazaar 通过多方签名机制和信誉评分机制,让众多参与者合作进行评估,零成本解决纠纷问题。

大数据共享

大数据时代里,价值来自于对数据的挖掘,数据维度越多,体积越大,潜在价值也就越高。

一直以来,比较让人头疼的问题是如何评估数据的价值,如何利用数据进行交换和交易,以及如何避免宝贵的数据在未经许可的情况下泄露出去。

区块链技术为解决这些问题提供了潜在的可能。

利用区块链构成的统一账本,数据在多方之间的流动将得到实时地追踪和管理,并且通过对访问权限的管控,可以有效减低对数据共享过程的管理成本。

投资管理

跨境贸易

在国际贸易活动,买卖双方可能互不信任。因此需要两家银行作为买卖双方的保证人,代为收款交单,并以银行信用代替商业信用。

区块链可以为信用证交易参与方提供共同账本,允许银行和其它参与方拥有经过确认的共同交易记录并据此履约,从而降低风险和成本。

一带一路

一带一路中对区块链技术的探索应用,能让原先无法交易的双方(例如,不存在都认可的国际货币情况下)完成交易,并且降低贸易风险、减少成本。

众筹投资

以 DAO(Decentralized Autonomous Organization)为代表的众筹管理,DAO 曾创下历史最高的融资记录,超过 1.6 亿美金。

物联网与供应链

曾经有人认为,物联网为大数据时代的基础。

笔者认为,区块链技术是物联网时代的基础。

应用场景分析

一种可能的应用场景为:通过 Transaction 产生对应的行为,为每一个设备分配地址Address ,给该地址注入一定的费用,可以执行相关动作,从而达到物联网的应用。类似于: PM2.5监测点 数据获取, 服务器 租赁, 网络摄像头 数据调用, DNS服务器 等。

另外,随着物联网设备的增多,Edge 计算需求的增强,大量设备之间需要通过分布式自组织的管理模式,并且对容错性要求很高。区块链自身分布式和抗攻击的特点可以很好地试用到这一场景中。

IBM

IBM 在物联网领域已经持续投入了几十年的研发,目前正在探索使用区块链技术来降低物联网应用的成本。

2015 年初,IBM 与三星宣布合作研发 ADEPT 系统。

物流供应链

供应链行业往往涉及到诸多实体,包括物流、资金流、信息流等,这些实体之间存在大量复杂的协作和沟通。传统模式下,不同实体各自保存各自的供应链信息,严重缺乏透明度,造成了较高的时间成本和金钱成本,而且一旦出现问题(冒领、货物假冒等)难以追查和处理。

通过区块链各方可以获得一个透明可靠的统一信息平台,可以实时查看状态,降低物流成本,追溯物品的生产和运送整个过程,从而提高供应链管理的效率。当发生纠纷时,举证和追查也变得更加清晰和容易。

该领域被认为是区块链一个很有前景的应用方向。

例如运送方通过扫描二维码来证明货物到达指定区域,并自动收取提前约定的费用,可以参考 区块链如何变革供应链金融 和 区块链给供应链带来透明。

Skuchain 创建基于区块链的新型供应链解决方案,实现商品流与资金流的同步,同时缓解假货问题。

公共网络服务

现有的互联网能正常运行,离不开很多近乎免费的网络服务,例如域名服务(DNS)。任何人都可以免费查询到域名,没有 DNS,现在的各种网站基本就无法访问了。因此,对于网络系统来说,类似的基础服务必须要能做到安全可靠,并且低成本。区块链技术恰好具备这些特点,基于区块链打造的 DNS 系统,将不再会出现各种错误的查询结果,并且可以稳定可靠的提供服务。

其它场景

还有一些很有趣的应用场景。主要包括:

  • BitMessage:基于区块链的安全可靠的通信系统。
  • GemHealth:医疗数据的安全管理,已与医疗行业多家公司签订了合作协议。
  • Twister:去中心化的“微博”系统。
  • Tierion:确保数据安全记录。
  • Storj:基于比特币区块链的安全的数据分布式存储服务。

小结

本章介绍了大量的区块链技术应用案例和未来场景,证明了区块链作为一项基础技术,所具有的市场潜力。

当然,任何事物的发展都不是一帆风顺的。

目前来看,制约区块链技术进一步应用的因素有很多。首先就是谁来为区块链上的合同担保?特别在金融、法律等领域,实际执行的生活往往还得是由人来做;另外就是物品的数字化。非数字化的物品很难放到数字世界中进行管理。

这些问题都不是很容易就得到解决的,但笔者相信,看一个东西成不成,根子上还是看它有没有提高生产力。随着众多行业对区块链技术的试水和探索,一定会有更多的应用场景出现。

分布式系统核心问题

万法皆空,因果不空。

随着摩尔定律碰到瓶颈,越来越多的系统要依靠分布式集群架构来实现海量数据处理和可扩展计算能力。

区块链首先是一个分布式系统。

中央式结构改成分布式系统,碰到的第一个问题就是一致性的保障。

很显然,如果一个分布式集群无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。

本章将介绍分布式系统中一些核心问题的来源以及相关的工作。

一致性问题

在分布式系统中,一致性(Consistency,早期也叫 Agreement)是指对于系统中的多个服务节点,给定一系列操作,在协议(往往通过某种共识算法)保障下,试图使得它们对处理结果达成某种程度的一致。

如果分布式系统能实现“一致”,对外就可以呈现是一个功能正常的,但性能和稳定性都要好很多的“虚处理节点”。

举个例子,某影视公司旗下有西单和中关村的两个电影院,都出售某电影票,票一共就一万张。那么,顾客到达某个电影院买票的时候,售票员该怎么决策是否该卖这张票,才能避免超售呢?当电影院个数更多的时候呢?

这个问题在人类世界中,看起来似乎没那么难,你看,英国人不是刚靠 投票 达成了“某种一致”吗?

注意:一致性并不代表结果正确与否,而是系统对外呈现的状态一致与否,例如,所有节点都达成失败状态也是一种一致。

挑战

在实际的计算机集群系统(看似强大的计算机系统,很多地方都比人类世界要脆弱的多)中,存在如下的问题:

  • 节点之间的网络通讯是不可靠的,包括任意延迟和内容故障;
  • 节点的处理可能是错误的,甚至节点自身随时可能宕机;
  • 同步调用会让系统变得不具备可扩展性。

要解决这些挑战,愿意动脑筋的读者可能会很快想出一些不错的思路。

为了简化理解,仍然以两个电影院一起卖票的例子。可能有如下的解决思路:

  • 每次要卖一张票前打电话给另外一家电影院,确认下当前票数并没超售;
  • 两家电影院提前约好,奇数小时内一家可以卖票,偶数小时内另外一家可以卖;
  • 成立一个第三方的存票机构,票都放到他那里,每次卖票找他询问;
  • 更多……

这些思路大致都是可行的。实际上,这些方法背后的思想,将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题的基础思路和唯一秘诀。只是因为计算机系统比较傻,需要考虑得更全面一些;而人们又希望计算机系统能工作的更快更稳定,所以算法需要设计得再精巧一些。

要求

规范的说,理想的分布式系统一致性应该满足:

  • 可终止性(Termination):一致的结果在有限时间内能完成;
  • 共识性(Consensus):不同节点最终完成决策的结果应该相同;
  • 合法性(Validity):决策的结果必须是其它进程提出的提案。

第一点很容易理解,这是计算机系统可以被使用的前提。需要注意,在现实生活中这点并不是总能得到保障的,例如取款机有时候会是“服务中断”状态,电话有时候是“无法连通”的。

第二点看似容易,但是隐藏了一些潜在信息。算法考虑的是任意的情形,凡事一旦推广到任意情形,就往往有一些惊人的结果。例如现在就剩一张票了,中关村和西单的电影院也分别刚确认过这张票的存在,然后两个电影院同时来了一个顾客要买票,从各自“观察”看来,自己的顾客都是第一个到的……怎么能达成结果的共识呢?记住我们的唯一秘诀:核心在于需要把两件事情进行排序,而且这个顺序还得是大家都认可的。

第三点看似绕口,但是其实比较容易理解,即达成的结果必须是节点执行操作的结果。仍以卖票为例,如果两个影院各自卖出去一千张,那么达成的结果就是还剩八千张,决不能认为票售光了。

带约束的一致性

做过分布式系统的读者应该能意识到,绝对理想的强一致性(Strong Consistency)代价很大。除非不发生任何故障,所有节点之间的通信无需任何时间,这个时候其实就等价于一台机器了。实际上,越强的一致性要求往往意味着越弱的性能。

一般的,强一致性(Strong Consistency)主要包括下面两类:

  • 顺序一致性(Sequential Consistency):Leslie Lamport 1979 年经典论文《How toMake a Multiprocessor Computer That Correctly Executes Multiprocess Programs》中提出,是一种比较强的约束,保证所有进程看到的 全局执行顺序(total order)一致,并且每个进程看自身的执行(local order)跟实际发生顺序一致。例如,某进程先执行 A,后执行 B,则实际得到的全局结果中就应该为 A 在 B 前面,而不能反过来。同时所有其它进程在全局上也应该看到这个顺序。顺序一致性实际上限制了各进程内指令的偏序关系,但不在进程间按照物理时间进行全局排序。
  • 线性一致性(Linearizability Consistency):Maurice P. Herlihy 与 Jeannette M. Wing在 1990 年经典论文《Linearizability: A Correctness Condition for Concurrent Objects》中共同提出,在顺序一致性前提下加强了进程间的操作排序,形成唯一的全局顺序(系统等价于是顺序执行,所有进程看到的所有操作的序列顺序都一致,并且跟实际发生顺序一致),是很强的原子性保证。但是比较难实现,目前基本上要么依赖于全局的时钟或锁,要么通过一些复杂算法实现,性能往往不高。

目前,高精度的石英钟的漂移率为 ,人类目前最准确的原子震荡时钟的漂移率为。Google 曾在其分布式数据库 Spanner 中采用基于原子时钟和 GPS 的“TrueTime”方案,能够将不同数据中心的时间偏差控制在 10ms 以内。方案简单粗暴而有效,但存在成本较高的问题。

强一致的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性(EventualConsistency),即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性(WeakConsistency)。

莫非分布式领域也有一个测不准原理?这个世界为何会有这么多的约束呢?

共识算法

实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。

共识算法解决的是对某个提案(Proposal),大家达成一致意见的过程。提案的含义在分布式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是领导……等等,可以认为任何需要达成一致的信息都是一个提案。

注:实践中,一致性的结果往往还需要客户端的特殊支持,典型地通过访问足够多个服务节点来验证确保获取共识后结果。

问题挑战

实际上,如果分布式系统中各个节点都能保证以十分强大的性能(瞬间响应、高吞吐)无故障的运行,则实现共识过程并不复杂,简单通过多播过程投票即可。

很可惜的是,现实中这样“完美”的系统并不存在,如响应请求往往存在时延、网络会发生中断、节点会发生故障、甚至存在恶意节点故意要破坏系统。

一般地,把故障(不响应)的情况称为“非拜占庭错误”,恶意响应的情况称为“拜占庭错误”(对应节点为拜占庭节点)。

常见算法

针对非拜占庭错误的情况,一般包括 Paxos、Raft 及其变种。

对于要能容忍拜占庭错误的情况,一般包括 PBFT 系列、PoW 系列算法等。从概率角度,PBFT 系列算法是确定的,一旦达成共识就不可逆转;而 PoW 系列算法则是不确定的,随着时间推移,被推翻的概率越来越小。

理论界限

搞学术的人都喜欢对问题先确定一个界限,那么,这个问题的最坏界限在哪里呢?很不幸,一般情况下,分布式系统的共识问题无解。

当节点之间的通信网络自身不可靠情况下,很显然,无法确保实现共识。但好在,一个设计得当的网络可以在大概率上实现可靠的通信。

然而,即便在网络通信可靠情况下,一个可扩展的分布式系统的共识问题的下限是无解。这个结论,被称为 FLP 不可能性 原理,可以看做分布式领域的“测不准原理”。

FLP 不可能性原理

FLP 不可能原理:在网络可靠,存在节点失效(即便只有一个)的最小化异步模型系统 中,不存在一个可以解决一致性问题的确定性算法。

提出该定理的论文是由 Fischer, Lynch 和 Patterson 三位作者于 1985 年发表,该论文后来获得了 Dijkstra(就是发明最短路径算法的那位)奖。

FLP 不可能原理实际上告诉人们,不要浪费时间去为异步分布式系统设计在任意场景下都能 实现共识的算法。

理解这一原理的一个不严谨的例子是:

三个人在不同房间,进行投票(投票结果是 0 或者 1)。三个人彼此可以通过电话进行沟 通,但经常会有人时不时地睡着。比如某个时候,A 投票 0,B 投票 1,C 收到了两人的投 票,然后 C 睡着了。A 和 B 则永远无法在有限时间内获知最终的结果。如果可以重新投票, 则类似情形每次在取得结果前发生:(

FLP 原理实际上说明对于允许节点失效情况下,纯粹异步系统无法确保一致性在有限时间内 完成。

这岂不是意味着研究一致性问题压根没有意义吗?

先别这么悲观,学术界做研究,考虑的是数学和物理意义上最极端的情形,很多时候现实生活要美好的多(感谢这个世界如此鲁棒!)。例如,上面例子中描述的最坏情形,总会发生的概率并没有那么大。工程实现上多试几次,很大可能就成功了。

科学告诉你什么是不可能的;工程则告诉你,付出一些代价,我可以把它变成可能。

这就是工程的魅力。

那么,退一步讲,在付出一些代价的情况下,我们能做到多少?

回答这一问题的是另一个很出名的原理:CAP 原理。

科学上告诉你去赌场赌博从概率上总会是输钱的;工程则告诉你,如果你愿意接受最终输钱的结果,中间说不定偶尔能小赢几笔呢!?

CAP 原理

CAP 原理最早由 Eric Brewer 在 2000 年,ACM 组织的一个研讨会上提出猜想,后来 Lynch等人进行了证明。该原理被认为是分布式系统领域的重要原理。

定义

分布式计算系统不可能同时确保一致性(Consistency)、可用性(Availablity)和分区容忍性(Partition),设计中往往需要弱化对某个特性的保证。

  • 一致性(Consistency):任何操作应该都是原子的,发生在后面的事件能看到前面事件发生导致的结果,注意这里指的是强一致性;
  • 可用性(Availablity):在有限时间内,任何非失败节点都能应答请求;
  • 分区容忍性(Partition):网络可能发生分区,即节点之间的通信不可保障。

比较直观地理解,当网络可能出现分区时候,系统是无法同时保证一致性和可用性的。要么,节点收到请求后因为没有得到其他人的确认就不应答,要么节点只能应答非一致的结果。

好在大部分时候网络被认为是可靠的,因此系统可以提供一致可靠的服务;当网络不可靠时,系统要么牺牲掉一致性(大部分时候都是如此),要么牺牲掉可用性。

应用场景

既然 CAP 不可同时满足,则设计系统时候必然要弱化对某个特性的支持。

弱化一致性

对结果一致性不敏感的应用,可以允许在新版本上线后过一段时间才更新成功,期间不保证一致性。

例如网站静态页面内容、实时性较弱的查询类数据库等,CouchDB、Cassandra 等为此设计。

弱化可用性

对结果一致性很敏感的应用,例如银行取款机,当系统故障时候会拒绝服务。MongoDB、Redis 等为此设计。

Paxos、Raft 等算法,主要处理这种情况。

弱化分区容忍性

现实中,网络分区出现概率减小,但较难避免。某些关系型数据库、ZooKeeper 即为此设计。

实践中,网络通过双通道等机制增强可靠性,达到高稳定的网络通信。

ACID 原则

即 Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)。

ACID 原则描述了对分布式数据库的一致性需求,同时付出了可用性的代价。

  • Atomicity:每次操作是原子的,要么成功,要么不执行;
  • Consistency:数据库的状态是一致的,无中间状态;
  • Isolation:各种操作彼此互相不影响;
  • Durability:状态的改变是持久的,不会失效。

一个与之相对的原则是 BASE(Basic Availiability,Soft state,Eventually Consistency),牺牲掉对一致性的约束(最终一致性),来换取一定的可用性。

Paxos 与 Raft

Paxos 问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点场景(即可能消息丢失或重复,但无错误消息)下的共识达成(Consensus)问题。因为最早是 LeslieLamport 用 Paxon 岛的故事模型来进行描述而命名。

Paxos

1990 年由 Leslie Lamport 提出的 Paxos 共识算法,在工程角度实现了一种最大化保障分布式系统一致性(存在极小的概率无法实现一致)的机制。Paxos 被广泛应用在 Chubby、ZooKeeper 这样的系统中,Leslie Lamport 因此获得了 2013 年度图灵奖。

故事背景是古希腊 Paxon 岛上的多个法官在一个大厅内对一个议案进行表决,如何达成统一的结果。他们之间通过服务人员来传递纸条,但法官可能离开或进入大厅,服务人员可能偷懒去睡觉。

Paxos 是第一个被证明的共识算法,其原理基于 两阶段提交 并进行扩展。

作为现在共识算法设计的鼻祖,以最初论文的难懂(算法本身并不复杂)出名。算法中将节点分为三种类型:

  • proposer:提出一个提案,等待大家批准为结案。往往是客户端担任该角色;
  • acceptor:负责对提案进行投票。往往是服务端担任该角色;
  • learner:被告知结案结果,并与之统一,不参与投票过程。可能为客户端或服务端。

并且,算法需要满足 safety 和 liveness 两方面的约束要求(实际上这两个基础属性是大部分分布式算法都该考虑的):

  • safety:保证决议结果是对的,无歧义的,不会出现错误情况。
    • 决议(value)只有在被 proposers 提出的 proposal 才能被最终批准;
    • 在一次执行实例中,只批准(chosen)一个最终决议,意味着多数接受(accept)的结果能成为决议;
  • liveness:保证决议过程能在有限时间内完成。
    • 决议总会产生,并且 learners 能获得被批准(chosen)的决议。

基本过程包括 proposer 提出提案,先争取大多数 acceptor 的支持,超过一半支持时,则发送结案结果给所有人进行确认。一个潜在的问题是 proposer 在此过程中出现故障,可以通过超时机制来解决。极为凑巧的情况下,每次新的一轮提案的 proposer 都恰好故障,系统则永远无法达成一致(概率很小)。

Paxos 能保证在超过 1/2 的正常节点存在时,系统能达成共识。

读者可以试着自己设计一套能达成共识的方案,会发现在满足各种约束情况下,算法自然就会那样设计。

单个提案者+多接收者

如果系统中限定只有某个特定节点是提案者,那么一致性肯定能达成(只有一个方案,要么达成,要么失败)。提案者只要收到了来自多数接收者的投票,即可认为通过,因为系统中不存在其他的提案。

但一旦提案者故障,则系统无法工作。

多个提案者+单个接收者

限定某个节点作为接收者。这种情况下,共识也很容易达成,接收者收到多个提案,选第一个提案作为决议,拒绝掉后续的提案即可。

缺陷也是容易发生单点故障,包括接收者故障或首个提案者节点故障。

以上两种情形其实类似主从模式,虽然不那么可靠,但因为原理简单而被广泛采用。

当提案者和接收者都推广到多个的情形,会出现一些挑战。

多个提案者+多个接收者

既然限定单提案者或单接收者都会出现故障,那么就得允许出现多个提案者和多个接收者。问题一下子变得复杂了。

一种情况是同一时间片段(如一个提案周期)内只有一个提案者,这时可以退化到单提案者的情形。需要设计一种机制来保障提案者的正确产生,例如按照时间、序列、或者大家猜拳(出一个数字来比较)之类。考虑到分布式系统要处理的工作量很大,这个过程要尽量高效,满足这一条件的机制非常难设计。

另一种情况是允许同一时间片段内可以出现多个提案者。那同一个节点可能收到多份提案,怎么对他们进行区分呢?这个时候采用只接受第一个提案而拒绝后续提案的方法也不适用。很自然的,提案需要带上不同的序号。节点需要根据提案序号来判断接受哪个。比如接受其中序号较大(往往意味着是接受新提出的,因为旧提案者故障概率更大)的提案。

如何为提案分配序号呢?一种可能方案是每个节点的提案数字区间彼此隔离开,互相不冲突。为了满足递增的需求可以配合用时间戳作为前缀字段。

此外,提案者即便收到了多数接收者的投票,也不敢说就一定通过。因为在此过程中系统中其它提案者

两阶段的提交

提案者发出提案之后,收到一些反馈。这个时候得知的一种结果是自己的提案被大多数接受了,一种结果是没被接受。没被接受的话好说,过会再试试。

即便受到来自大多数的接受反馈,也不能认为就最终确认了。因为这些接收者自己并不知道自己刚反馈的提案就恰好是全局的绝大多数。

很自然的,引入了新的一个阶段,即提案者在前一阶段拿到所有的反馈后,判断这个提案是可能被大多数接受的提案,需要对其进行最终确认。

Paxos 里面对这两个阶段分别命名为准备(prepare)和提交(commit)。准备阶段解决大家对哪个提案进行投票的问题,提交阶段解决确认最终值的问题。

准备阶段:

  • 提案者发送自己计划提交的提案的编号到多个接受者,试探是否可以锁定多数接受者的支持。
  • 接受者时刻保留收到过提案的最大编号和接受的最大提案。如果收到提案号比目前保留的最大提案号还大,则返回自己已接受的提案值(如果还未接受过任何提案,则为空)给提案者,更新当前最大提案号,并说明不再接受小于最大提案号的提案。

提交阶段:

  • 提案者如果收到大多数的回复(表示大部分人听到它的请求),则可准备发出带有刚才提案号的接受消息。如果收到的回复中不带有新的提案,说明锁定成功。则使用自己的提案内容;如果返回中有提案内容,则替换提案值为返回中编号最大的提案值。如果没收到足够多的回复,则需要再次发出请求。
  • 接受者收到接受消息后,如果发现提案号不小于已接受的最大提案号,则接受该提案,并更新接受的最大提案。

一旦多数接受了共同的提案值,则形成决议,成为最终确认。

Raft

Raft 是对 Paxos 的重新设计和实现。

Raft 算法是Paxos 算法的一种简化实现。

包括三种角色:leader、candiate 和 follower,其基本过程为:

  • Leader 选举:每个 candidate 随机经过一定时间都会提出选举方案,最近阶段中得票最多者被选为 leader;
  • 同步 log:leader 会找到系统中 log 最新的记录,并强制所有的 follower 来刷新到这个记录;

注:此处 log 并非是指日志消息,而是各种事件的发生记录。

拜占庭问题与算法

拜占庭问题更为广泛,讨论的是允许存在少数节点作恶(消息可能被伪造)场景下的一致性达成问题。拜占庭算法讨论的是最坏情况下的保障。

中国将军问题

拜占庭将军问题之前,就已经存在中国将军问题:两个将军要通过信使来达成进攻还是撤退的约定,但信使可能迷路或被敌军阻拦(消息丢失或伪造),如何达成一致。根据 FLP 不可能原理,这个问题无解。

拜占庭问题

又叫拜占庭将军(Byzantine Generals Problem)问题,是 Leslie Lamport 1982 年提出用来解释一致性问题的一个虚构模型。拜占庭是古代东罗马帝国的首都,由于地域宽广,守卫边境的多个将军(系统中的多个节点)需要通过信使来传递消息,达成某些一致的决定。但由于将军中可能存在叛徒(系统中节点出错),这些叛徒将努力向不同的将军发送不同的消息,试图会干扰一致性的达成。

拜占庭问题即为在此情况下,如何让忠诚的将军们能达成行动的一致。

对于拜占庭问题来说,假如节点总数为 N,叛变将军数为 F,则当 XXX时,问题才有解,即Byzantine Fault Tolerant (BFT) 算法。

例如, XXX时。

提案人不是叛变者,提案人发送一个提案出来,叛变者可以宣称收到的是相反的命令。则对于第三个人(忠诚者)收到两个相反的消息,无法判断谁是叛变者,则系统无法达到一致。

提案人是叛变者,发送两个相反的提案分别给另外两人,另外两人都收到两个相反的消息,无法判断究竟谁是叛变者,则系统无法达到一致。

更一般的,当提案人不是叛变者,提案人提出提案信息 ,则对于合作者来看,系统中会有N-F份确定的信息1 ,和F份不确定的信息(可能为0或1,假设叛变者会尽量干扰一致的达成),N-F>F ,即N>2F 情况下才能达成一致。

当提案人是叛变者,会尽量发送相反的提案给N-F个合作者,从收到1的合作者看来,系统中会存在 个信息1 ,以及 个信息0 ;从收到0 的合作者看来,系统中会存在 XXX个信息0 ,以及XXX个信息1;

另外存在F-1个不确定的信息。合作者要想达成一致,必须进一步的对所获得的消息进行判定,询问其他人某个被怀疑对象的消息值,并通过取多数来作为被怀疑者的信息值。这个过程可以进一步递归下去。

Leslie Lamport 证明,当叛变者不超过XXX时,存在有效的算法,不论叛变者如何折腾,忠诚的将军们总能达成一致的结果。如果叛变者过多,则无法保证一定能达到一致性。

多于XXX的叛变者时有没有可能有解决方案呢?设想f个叛变者和g个忠诚者,叛变者故意使坏,可以给出错误的结果,也可以不响应。某个时候f个叛变者都不响应,则g个忠诚者取多数既能得到正确结果。当f个叛变者都给出一个恶意的提案,并且g个忠诚者中有f个离线时,剩下的g-f个忠诚者此时无法分别是否混入了叛变者,仍然要确保取多数能得到正确结果,因此,g-f>f ,即 g>2f,所以系统整体规模要大于 3f。

能确保达成一致的拜占庭系统节点数至少为 4,允许出现 1 个坏的节点。

Byzantine Fault Tolerant 算法

面向拜占庭问题的容错算法,解决的是网络通信可靠,但节点可能故障情况下的一致性达成。

最早由 Castro 和 Liskov 在 1999 年提出的 Practical Byzantine Fault Tolerant(PBFT)是第一个得到广泛应用的 BFT 算法。只要系统中有2f+1的节点是正常工作的,则可以保证一致性。

PBFT 算法包括三个阶段来达成共识:Pre-Prepare、Prepare 和 Commit。

新的解决思路

拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),并且要完成最终的一致性确认过程十分困难,容易受干扰。但是一旦确认,即为最终确认。

比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work) 算法思路。一个是限制一段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算力)。

后来的各种 PoX 系列算法,也都是沿着这个思路进行改进,采用经济上的惩罚来制约破坏者。

可靠性指标

很多领域一般都喜欢谈服务可靠性,用几个 9 来说事。这几个 9 其实是粗略代表了概率意义上系统能提供服务的可靠性指标,最初是电信领域提出的概念。

下表给出不同指标下,每年允许服务出现不可用时间的参考值。

指标概率可靠性每年允许不可用时间典型场景
一个九90% 1.2 个月不可用
二个九99% 3.6 天普通单点
三个九99.9% 8.6 小时普通企业
四个九99.99% 51.6 分钟高可用
五个九99.999% 5 分钟电信级
六个九99.9999% 31 秒极高要求
七个九99.99999% 3 秒N/A
八个九99.999999% 0.3 秒N/A
九个九99.9999999% 30 毫秒N/A

一般来说,单点的服务器系统至少应能满足两个九;普通企业信息系统三个九就肯定足够了(大家可以统计下自己企业内因系统维护每年要停多少时间),系统能达到四个九已经是业界领先水平了(参考 AWS)。电信级的应用一般号称能达到五个九,这已经很厉害了,一年里面最多允许五分钟的服务停用。六个九和以上的系统,就更加少见了,要实现往往意味着极高的代价。

那么,该如何提升可靠性呢?有两个思路:一是让系统中的单点变得更可靠;二是消灭单点。

IT 从业人员大都有类似的经验,运行某软系统的机器,基本上是过几天就要重启下的;而运行 Linux 系统的服务器,则可能几年时间都不出问题。另外,普通的家用计算机,跟专用服务器相比,长时间运行更容易出现故障。这些都是单点可靠性不同的例子。可以通过替换单点的软硬件来改善可靠性。

然而,依靠单点实现的可靠性毕竟是有限的,要想进一步的提升,那就只好消灭单点,通过主从、多活等模式让多个节点集体完成原先单点的工作。这可以从概率意义上改善服务的可靠性,也是分布式系统的一个重要用途。

小结

分布式系统领域是计算机科学中十分重要的一个技术领域。

常见的分布式一致性是个古老而重要的问题,无论在学术上还是工程上都存在很高的价值。理想化(各项指标均最优)的解决方案是不存在的。

在现实各种约束条件下,往往需要通过牺牲掉某些需求,来设计出满足特定场景的协议。

其实,工程领域中很多问题的解决思路,都在于如何合理地进行取舍(trade-off)。

密码学与安全技术

工程领域从来没有黑科技;密码学不是工程。

密码学在信息技术领域的重要地位无需多言。如果没有现代密码学的研究成果,人类社会根本无法进入信息时代。

密码学领域十分繁杂,本章将介绍密码学领域中跟区块链相关的一些基础知识,包括 hash 算法与摘要、加密算法、数字签名和证书、PKI 体系、Merkle 树、同态加密等,以及如何使用这些技术实现信息的机密性、完整性、认证性和不可抵赖性。

Hash 算法与摘要

定义

Hash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。

例如计算一段话“hello blockchain world, this is yeasy@github”的 MD5 hash 值为89242549883a2ef85dc81b90fb606046

$ echo “hello blockchain world, this is yeasy@github”|md5
89242549883a2ef85dc81b90fb606046

这意味着我们只要对某文件进行 MD5 Hash 计算,得到结果为89242549883a2ef85dc81b90fb606046 ,这就说明文件内容极大概率上就是 “hello blockchainworld, this is yeasy@github”。可见,Hash 的核心思想十分类似于基于内容的编址或命名。

注:hash 值在应用中又被称为指纹(fingerprint)、摘要(digest)。

注:MD5 是一个经典的 hash 算法,其和 SHA-1 算法都已被 证明 安全性不足应用于商业场景。

一个优秀的 hash 算法,将能实现:

  • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
  • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
  • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
  • 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。

冲突避免有时候又被称为“抗碰撞性”。如果给定一个明文前提下,无法找到碰撞的另一个明文,称为“弱抗碰撞性”;如果无法找到任意两个明文,发生碰撞,则称算法具有“强抗碰撞性”。

很多场景下,也要求对于任意长的输入内容,输出定长的 hash 结果。

流行的算法

目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。

MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest的缩写。其输出为 128 位。MD4 已证明不够安全。

MD5(RFC 1321)是 Rivest 于1991年对 MD4 的改进版本。它对输入仍以 512 位分组,其输出是 128 位。MD5 比 MD4 复杂,并且计算速度要慢一点,更安全一些。MD5 已被证明不具备“强抗碰撞性”。

SHA (Secure Hash Algorithm)是一个 Hash 函数族,由 NIST(National Institute ofStandards and Technology)于 1993 年发布第一个算法。目前知名的 SHA-1 在 1995 年面世,它的输出为长度 160 位的 hash 值,因此抗穷举性更好。SHA-1 设计时基于和 MD4 相同原理,并且模仿了该算法。SHA-1 已被证明不具备“强抗碰撞性”。

为了提高安全性,NIST 还设计出了 SHA-224、SHA-256、SHA-384,和 SHA-512 算法(统称为 SHA-2),跟 SHA-1 算法原理类似。SHA-3 相关算法也已被提出。

目前,一般认为 MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。

性能

一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash的速度也越快。

也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。

数字摘要

顾名思义,数字摘要是对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始数字内容。

数字摘要是解决确保内容没被篡改过的问题(利用 Hash 函数的抗碰撞性特点)。

数字摘要是 Hash 算法最重要的一个用途。在网络上下载软件或文件时,往往同时会提供一个数字摘要值,用户下载下来原始文件可以自行进行计算,并同提供的摘要值进行比对,以确保内容没有被修改过。

加解密算法

算法类型特点优势缺陷代表算法
对称加密加解密密钥相同或可推算计算效率高,加密强度高需提前共享密钥;易泄露DES、3DES、AES、IDEA
非对称加密加解密密钥不相关无需提前共享密钥计算效率低,仍存在中间人攻击可能RSA、ElGamal、椭圆曲线系列算法

算法体系

现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。。

加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。

解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。

根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。

并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。

对称加密

顾名思义,加解密的密钥是相同的。

优点是加解密效率高(速度快,空间占用小),加密强度高。

缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全通道下分发密钥也是个问题。

对称密码从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为加密单位,应用最为广泛。后者则只对一个字节进行加密,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。

代表算法包括 DES、3DES、AES、IDEA 等。

  • DES(Data Encryption Standard):经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56位 + 8 位校验。现在已经很容易被暴力破解。
  • 3DES:三重 DES 操作:加密 –> 解密 –> 加密,处理过程和加密强度优于 DES,但现在也被认为不够安全。
  • AES(Advanced Encryption Standard):美国国家标准研究所(NIST)采用取代 DES成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。

适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。

注:分组加密每次只能处理固定长度的明文,因此过长的内容需要采用一定模式进行加密,《实用密码学》中推荐使用 密文分组链接(Cipher Block Chain,CBC)、计数器(Counter,CTR)模式。

非对称加密

非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。

顾名思义,加密密钥和解密密钥是不同的,分别称为公钥和私钥。

公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。

优点是公私钥分开,不安全通道也可使用。

缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。

非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。

代表算法包括:RSA、ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ECC)系列算法。

  • RSA:经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。
  • Diffie-Hellman 密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。
  • ElGamal:由 Taher ElGamal 设计,利用了模运算下求离散对数困难的特性。被应用在PGP 等安全工具中。
  • 椭圆曲线算法(Elliptic curve cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。

一般适用于签名场景或密钥协商,不适于大量数据的加解密。

RSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。

混合加密机制

即先用计算复杂度高的非对称加密协商一个临时的对称加密密钥(会话密钥,一般相对内容来说要短的多),然后双方再通过对称加密对传递的大量数据进行加解密处理。

典型的场景是现在大家常用的 HTTPS 机制。HTTPS 实际上是利用了 Transport Layer Security/Secure Socket Layer(TLS/SSL)来实现可靠的传输。TLS 为 SSL 的升级版本,目前广泛应用的为 TLS 1.0,对应到 SSL 3.1 版本。

建立安全连接的具体步骤如下:

  • 客户端浏览器发送信息到服务器,包括随机数 R1,支持的加密算法类型、协议版本、压缩算法等。注意该过程为明文。
  • 服务端返回信息,包括随机数 R2、选定加密算法类型、协议版本,以及服务器证书。注意该过程为明文。
  • 浏览器检查带有该网站公钥的证书。该证书需要由第三方 CA 来签发,浏览器和操作系统会预置权威 CA 的根证书。如果证书被篡改作假(中间人攻击),很容易通过 CA 的证书验证出来。
  • 如果证书没问题,则用证书中公钥加密随机数 R3,发送给服务器。此时,只有客户端和服务器都拥有 R1、R2 和 R3 信息,基于 R1、R2 和 R3,生成对称的会话密钥(如 AES算法)。后续通信都通过对称加密进行保护。

数字签名

类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。

一个典型的场景是,A 要发给 B 一个文件(一份信息),B 如何获知所得到的文件即为 A 发出的原始版本?A 先对文件进行摘要,然后用自己的私钥进行加密,将文件和加密串都发给B。B 收到后文件和加密串,用 A 的公钥来解密加密串,得到原始的数字摘要,跟对文件进行摘要后的结果进行比对。如果一致,说明该文件确实是 A 发过来的,并且文件内容没有被修改过。

HMAC

全称是 Hash-based Message Authentication Code,即“基于 Hash 的消息认证码”。基本过程为对某个消息,利用提前共享的对称密钥和 Hash 算法进行加密处理,得到 HMAC 值。该HMAC 值提供方可以证明自己拥有共享的对称密钥,并且消息自身可以利用 HMAC 确保未经篡改。

HMAC(K, H, Message)
其中,K 为提前共享的对称密钥,H 为提前商定的 Hash 算法(一般为公认的经典算法),Message 为要处理的消息内容。如果不知道 K 和 H,则无法根据 Message 得到准确的HMAC 值。

HMAC 一般用于证明身份的场景,如 A、B 提前共享密钥,A 发送随机串给 B,B 对称加密处理后把 HMAC 值发给 A,A 收到了自己再重新算一遍,只要相同说明对方确实是 B。

HMAC 主要问题是需要共享密钥。当密钥可能被多方拥有的场景下,无法证明消息确实来自某人(Non-repudiation)。反之,如果采用非对称加密方式,则可以证明。

盲签名

1983 年由 David Chaum 提出。签名者在无法看到原始内容的前提下对信息进行签名。

盲签名主要是为了实现防止追踪(unlinkability),签名者无法将签名内容和结果进行对应。典型的实现包括 RSA 盲签名)。

多重签名

n 个持有人中,收集到至少 m 个( )的签名,即认为合法,这种签名被称为多重签名。其中,n 是提供的公钥个数,m 是需要匹配公钥的最少的签名个数。

群签名

环签名

环签名由 Rivest,shamir 和 Tauman 三位密码学家在 2001 年首次提出。环签名属于一种简化的群签名。

签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的其他成员可能并不知道自己被包含在其中。

数字证书

数字证书用来证明某个公钥是谁的,并且内容是正确的。

对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。一旦公钥被人替换(典型的如中间人攻击),则整个安全体系将被破坏掉。

怎么确保一个公钥确实是某个人的原始公钥?

这就需要数字证书机制。

顾名思义,数字证书就是像一个证书一样,证明信息和合法性。由证书认证机构(Certification Authority,CA)来签发,权威的 CA 包括 verisign 等。

数字证书内容可能包括版本、序列号、签名算法类型、签发者信息、有效期、被签发人、签发的公开密钥、CA 数字签名、其它信息等等,一般使用最广泛的标准为 ITU 和 ISO 联合制定的 X.509 规范。

其中,最重要的包括签发的公开密钥CA 数字签名两个信息。因此,只要通过这个证书就能证明某个公钥是合法的,因为带有 CA 的数字签名。

更进一步地,怎么证明 CA 的签名合法不合法呢?

类似的,CA 的数字签名合法不合法也是通过 CA 的证书来证明的。主流操作系统和浏览器里面会提前预置一些 CA 的证书(承认这些是合法的证书),然后所有基于他们认证的签名都会自然被认为合法。

后面章节将介绍的 PKI 体系提供了一套完整的证书管理的框架。

PKI体系

在非对称加密中,公钥则可以通过证书机制来进行保护,如何管理和分发证书则可以通过PKI(Public Key Infrastructure)来保障。

顾名思义,PKI 体系在现代密码学应用领域处于十分基础的地位,解决了十分核心的证书管理问题。

PKI 并不代表某个特定的密码学技术和流程,PKI 是建立在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架。实现了 PKI 的平台可以安全可靠地管理网络中用户的密钥和证书,包括多个实现和变种,知名的有 RSA 公司的 PKCS(Public Key CryptographyStandards)标准和 X.509 规范等。

一般情况下,PKI 至少包括如下组件:

  • CA(Certification Authority):负责证书的颁发和作废,接收来自 RA 的请求,是最核心的部分;
  • RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA;
  • 证书数据库:存放证书,一般采用 LDAP 目录服务,标准格式采用 X.500 系列。

CA 是最核心的组件,主要完成对证书的管理。

常见的流程为,用户通过 RA 登记申请证书,CA 完成证书的制造,颁发给用户。用户需要撤销证书则向 CA 发出申请。

之前章节内容介绍过,密钥有两种类型:用于签名和用于加解密,对应称为 签名密钥对加密密钥对

用户证书可以有两种方式。一般可以由 CA 来生成证书和私钥;也可以自己生成公钥和私钥,

然后由 CA 来对公钥进行签发。后者情况下,当用户私钥丢失后,CA 无法完成恢复。

Merkle 树


图 1.6.6.1 - Merkle 树示例

默克尔树(又叫哈希树)是一}}种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。

进一步的,默克尔树可以推广到多叉树的情形。

默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。

默克尔树的典型应用场景包括:

  • 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
  • 快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因此,沿着 Root –> N4 –> N1,可以快速定位到发生改变的 D1;
  • 零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知道其它内容。

同态加密

定义

同态加密(Homomorphic Encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理再加密,得到的结果相同。从代数的角度讲,即同态性。

如果定义一个运算符XXX ,对加密算法 E 和 解密算法 D ,满足XXX:则意味着对于该运算满足同态性。

同态性在代数上包括:加法同态、乘法同态、减法同态和除法同态。同时满足加法同态和乘法同态,则意味着是 代数同态 ,即 全同态 。同时满足四种同态性,则被称为 算数同态

历史

同态加密的问题最早是由 Ron Rivest、Leonard Adleman 和 Michael L. Dertouzos 在 1978年提出,但 第一个“全同态”的算法 到 2009 年才被克雷格·金特里(Craig Gentry)证明。

仅满足加法同态的算法包括 Paillier 和 Benaloh 算法;仅满足乘法同态的算法包括 RSA 和ElGamal 算法。

同态加密在云时代的意义十分重大。目前,从安全角度讲,用户还不敢将敏感信息直接放到第三方云上进行处理。如果有了比较实用的同态加密技术,则大家就可以放心的使用各种云服务了。

遗憾的是,目前已知的同态加密技术需要消耗大量的计算时间,还远达不到实用的水平。

函数加密

与同态加密相关的一个问题是函数加密。

同态加密保护的是数据本身,而函数加密顾名思义保护的是处理函数本身,即让第三方看不到处理过程的前提下,对数据进行处理。

该问题已被证明是不存在对多个通用函数的任意多 key 的方案,目前仅能做到对某个特定函数的一个 key 的方案。

其它问题

零知识证明(zero knowledge validation)

证明者在不向验证者提供任何有用的信息的前提下,使验证者相信某个论断是正确的。

例如,A 向 B 证明自己有一个物品,但 B 无法拿到这个物品,无法用 A 的证明去向别人证明自己也拥有这个物品。

小结

比特币项目 -- 思想诞生的摇篮

做设计,很多时候都是在权衡 trade-off。

比特币项目是区块链技术首个大规模的成功应用,并且是首个得到实践检验的数字货币实现,在金融学和信息技术历史上都具有十分重要的意义。

本章将介绍其来源、原理设计和相关的工具和技术点等。

简介

比特币是基于密码学和经济博弈的一种数字货币,也是历史上首个经过大规模长时间运作检验的数字货币系统。

blockchain.info 网站可以从查询到比特币的汇率(以美元为单位)变化历史。


图 1.7.1.1 - 比特币汇率历史

历史

  • 2008 年 10 月 31 日,中本聪发布比特币唯一的白皮书:《Bitcoin:A Peer-to-PeerElectronic Cash System/比特币:一种点对点的电子现金系统》。
  • 2009 年 1 月 3 日,中本聪在位于芬兰赫尔辛基的一个小型服务器上挖出了第一批 50 个比特币,并记录下当天泰晤士报的头版标题:“ The Times 03/Jan/2009 Chancellor on brink of second bailout for banks ”。
  • 2010 年 5 月 21 日,第一次比特币交易:佛罗里达程序员 Laszlo Hanyecz 用 1 万 BTC 购买了价值 25 美元的披萨优惠券。这是比特币的首个兑换汇率:1: 0.0025 美金。这些比特币在今日价值约 700 万美金。
  • 2010 年 7 月 17 日,第一个比特币平台成立。
  • 2011 年,开始出现基于显卡的挖矿设备。2011 年底,汇率约为 2 美元。
  • 2012 年 9 月 27 日,比特币基金创立,此时比特币价格为 12.46 美元。
  • 2012 年 11 月 28 日,比特币产量第一次减半。
  • 2013 年 3 月,1/3 的专业矿工已经采用专用 ASIC 矿机进行挖矿。
  • 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 月,欧盟法院裁定比特币交易免征增值税。
  • 2016 年 1 月,中国人民银行在京召开了数字货币研讨会,会后发布公告宣称或推出数字货币。
  • 2016 年 7 月 9 日,比特币产量第二次减半。时至今日,比特币汇率约为 600 美元,总市值在 100 亿 美金。八成的交易量在中国。比特币区块链目前生成了约 42 万个区块,完整存储需要约 75 GB 的空间。主流的交易所包括 Bitstamp、BTC-e、Bitfinex 等。多家投资机构(包括红杉、IDG、软银、红点等)都有布局。

注:通过 blockchain.info 可以实时查询到更多详细数据。

山寨币

比特币的“成功”,刺激了相关的生态和社区发展,大量类似数字货币(超过 700 种)纷纷出现,被称为“山寨币”,比较出名的包括以太币和瑞波(Ripple)币。

这些山寨币,要么建立在独立的区块链上,要么复用已有的区块链(例如比特币)。

原理和设计

比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。

比特币通过区块链网络提供一个公共可见的记账本,用来记录发生过的交易的历史信息。每次发生交易,用户需要将新交易记录写到比特币区块链网络中,等网络确认后即可认为交易完成。每个交易包括一些输入和一些输出,未经使用的交易的输出( Unspent TransactionOutputs,UTXO)可以被新的交易引用作为合法的输入。

一笔合法的交易,即引用某些已存在交易的 UTXO,作为交易的输入,并生成新的输出的过程。

在交易过程中,转账方需要通过签名脚本来证明自己是 UTXO 的合法使用者,并且指定输出脚本来限制未来对本交易的使用者(为收款方)。对每笔交易,转账方需要进行签名确认。并且,对每一笔交易来说,总输入不能小于总输出。

交易的最小单位是“聪”,即 比特币。

下图展示了一些简单的示例交易。更一般情况下,交易的输入输出可以为多方。

交易目的输入输出签名差额
T0A转给B别人给A的交易的输出B账户可使用该交易A签名确认输入减输出,为交易服务费
T1B转给CT0的输出C账户可使用该交易B签名确认输入减输出,为交易服务费
X转给Y别人给X的交易的输出Y账户可使用该交易X签名确认输入减输出,为交易服务费

下面分别介绍比特币网络中的重要概念和设计思路。

概念

账户/地址

比特币账户采用了非对称的加密算法,用户自己保留私钥,对他发出的交易进行签名确认,并公开公钥。

比特币的账户地址其实就是用户公钥经过一系列 hash(HASH160,或先进行 SHA256,然后进行 RIPEMD160)及编码运算后生成的 160 位(20 字节)的字符串。

一般,也常常对账户地址串进行 Base58Check 编码,并添加前导字节(表明支持哪种脚本)和 4 字节校验字节,以提高可读性和准确性。

注:这里账户并非直接是公钥,而是 hash 后的值,避免公钥过早暴露导致被破解出私钥。

交易

交易是完成比特币功能的核心概念,一条交易将可能包括如下信息:

  • 付款人地址:合法的地址,公钥经过 SHA256 和 RIPEMD160 两次 hash,得到 160 位hash 串;
  • 付款人对交易的签字确认:确保交易内容不被篡改;
  • 付款人资金的来源交易 ID:从哪个交易的输出作为本次交易的输入;
  • 交易的金额:多少钱,跟输入的差额为交易的服务费;
  • 收款人地址:合法的地址;
  • 收款人的公钥:收款人的公钥;
  • 时间戳:交易何时能生效。

网络中节点收到交易信息后,将进行如下检查:

  • 交易是否已经处理过;
  • 交易是否合法。包括地址是否合法、发起交易者是输入地址的合法拥有者、是否是UTXO;
  • 交易的输入之和是否大于输出之和。

检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播。

可以从 blockchain.info 网站 网站查看实时的交易信息。例如一次较新的交易

0beca08914de596217f098d744e3fb8da68aa5e00dd8f63a3364b451f3f4a70f。

脚本

脚本(Script) 是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。比特币脚本语言是一种非图灵完备的语言,类似 Forth 语言。

一般每个交易都会包括两个脚本:输出脚本(scriptPubKey)和认领脚本(scriptSig)。输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易输出(例如,要花费交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。

认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。

输出脚本目前支持两种类型:

  • P2PKH:Pay-To-Public-Key-Hash,允许用户将比特币发送到一个或多个典型的比特币地址上(证明拥有该公钥),前导字节一般为 0x00;
  • P2SH:Pay-To-Script-Hash,支付者创建一个输出脚本,里边包含另一个脚本(认领脚本)的哈希,一般用于需要多人签名的场景,前导字节一般为 0x05;

以 P2PKH 为例,输出脚本的格式为
scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

其中,OP_DUP 是复制栈顶元素;OP_HASH160 是计算 hash 值;OP_EQUALVERIFY 判断栈顶两元素是否相等;OP_CHECKSIG 判断签名是否合法。这条指令实际上保证了只有pubKey 的拥有者才能合法引用这个输出。

另外一个交易如果要花费这个输出,在引用这个输出的时候,需要提供认领脚本格式为
scriptSig: <sig> <pubKey>

其中, 是拿 pubKey 对应的私钥对交易(全部交易的输出、输入和脚本)hash 值进行签名,pubKey 的 hash 值需要等于 pubKeyHash。

进行交易验证时,会按照先 scriptSig 后 scriptPubKey 的顺序进行依次入栈处理,即完整指令为:
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

读者可以按照栈的过程来进行计算,体会脚本的验证过程。

引入脚本机制带来了灵活性,但也引入了更多的安全风险。比特币脚本支持的指令集十分简单,基于栈的处理方式,并且非图灵完备,此外还添加了额外的一些限制(大小限制等)。

区块

一个区块将主要包括如下内容:

4 字节的区块大小信息;

80 字节的区块头信息:

  • 版本号:4 字节;
  • 上一个区块头的 SHA256 hash 值:链接到一个合法的块上,32 字节;
  • 包含的所有验证过的交易的 Merkle 树根的哈希值,32 字节;
  • 时间戳:4 字节;
  • 难度指标:4 字节;
  • Nonce:4 字节,PoW 问题的答案;

交易个数计数器:1~9 字节;

所有交易的具体内容,可变长。

设计理念

如何避免作恶

基于经济博弈原理。在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。

实际上,博弈论早已被广泛应用到众多领域。

一个经典的例子是两个人来分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么指定规则才公平?

最简单的一个方案是负责切蛋糕的人后选。

注:如果推广到 N 个人呢?

比特币网络需要所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。

负反馈调节

比特币网络在设计上,很好的体现了负反馈的控制论基本原理。

比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。

反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。

因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。

从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。

注:比特币最小单位是“聪”,即10E8 ,总“聪”数为2.1E15 。对于 64 位处理器来说,高精度浮点计数的限制导致单个数值不能超过 。

共识机制

传统的共识问题是考虑在一个相对封闭的体系中,存在好节点、坏节点,然后如何达成一致。

对于比特币网络来说,因为它是开放的,网络质量也是完全无法保证的,导致问题更加复杂,难以依靠传统的一致性算法来实现。

比特币网络对共识进行了一系列的放宽,同时对参与共识进行了一系列的限制。

首先是不实现最终共识,理论上现有达成的任何结果都可能被推翻,只是被推翻的可能性随着时间而指数级的下降,要付出的代价迅速上升。

此外,达成共识的时间比较长,而且是按照块来进行阶段性的确认(快照),提高网络可用性。

此外,通过进行 PoW 限制合法提案的个数,提高网络的稳定性。

挖矿

原理与过程

了解比特币,最应该知道的一个概念就是“挖矿”,挖矿是参与维护比特币网络的节点,通过协助生成新区块来获取一定量新增的比特币。

当用户发布交易后,需要有人将交易进行确认,写到区块链中,形成新的区块。在一个互相不信任的系统中,该由谁来完成这件事情呢?比特币网络采用了“挖矿”的方式来解决这个问题。

目前,每 10 分钟左右生成一个不超过 1 MB 大小的区块(记录了这 10 分钟内发生的验证过的交易内容),串联到最长的链尾部,每个区块的成功提交者可以得到系统 12.5 个比特币的奖励(一定区块数后才能使用),以及用户附加到交易上的支付服务费用。

注:每个区块的奖励一开始是 50 个比特币,每隔 21 万个区块自动减半,即 4 年时间,最终比特币总量稳定在 2100 万个。因此,比特币是一种通缩的货币。

挖矿的具体过程为:参与者根据上一个区块的 hash 值,10 分钟内的验证过的交易内容,再加上自己猜测的一个随机数 X,让新区块的 hash 值小于比特币网络中给定的一个数。这个数越小,计算出来就越难。系统每隔两周(即经过 2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),来调节生成区块的时间稳定在 10 分钟左右。为了避免震荡,每次调整的最大幅度为 4 倍。

为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和计算力。算力一般以每秒进行多少次 hash 计算为单位,记为 h/s。

汇丰银行分析师 Anton Tonev 和 Davy Jose 表示,比特币区块链(通过挖矿)提供了一个局部的、迄今为止最优的解决方案:如何在分散的系统中验证信任。这就意味着,区块链本质上解决了传统依赖于第三方的问题,因为这个协议不止满足了中心化机构追踪交易的需求,还使得陌生人之间产生信任。区块链的技术和安全的过程使得陌生人之间在没有被信任的第三方时产生信任。

如何看待挖矿

2010 年左右,挖矿还是一个很有前途的行业。但是现在,建议还是不要考虑了,因为从概率上说,由于当前参与挖矿的计算力实在过于庞大(已经超出了大部分的超算中心),获得比特币的收益已经眼看要 cover 不住电费了。特别那些想着用云计算虚机来挖矿的想法,意义确实不大了。

从普通的 CPU(2009 年)、到后来的 GPU(2010 年) 和 FPGA(2011 年末)、到后来的ASIC矿机(2013 年初,目前单片算力已达每秒数百亿次 Hash 计算)、再到现在众多矿机联合组成矿池。短短数年间,比特币矿机的技术走完了过去几十年的集成电路技术进化历程,并且还颇有创新之处。确实是哪里有利益,哪里的技术就飞速发展!目前,矿机主要集中在中国大陆(超过一半的算力)和欧美,大家比拼的是一定计算性能情况下低电压和低功耗的电路设计。全网的算力已超过每秒10E18 次 Hash 计算。

很自然的,有人会想到,如果我有很强大的计算力,所有的块都是我算出来了,拒不承认别人的交易内容,那是不是就能破坏比特币网络。确实如此,基本上拿到 1/3 的计算力,比特币网络就存在被破坏的风险了;拿到 1/2,概率上就掌控整个网络了。但是这个将需要付出巨大的计算成本。

那么有没有办法防护呢?除了尽量避免计算力放到同一个组织手里,没太好的办法,这是目前 PoW(Proof of Work)的协议规定的。

也有人觉得为了算出一个块,大部分计算力(特别是没算出来的算力)其实都浪费了。有人提出用所谓的 PoS(Proof of Stake)和 DPoS,即大节点作为多个节点代理人的模式来节约计算力。那怎么选大节点?又容易导致“富则越富”问题。这其实就是完全民主 vs 选举人制度嘛。

个人认为,无论 PoW 还是 PoS,都无法解决所有问题。要从根本上解决,得引入随机代理人制度,通过算法在某段时间内只让部分节点参加计算,并且要发放一部分“普世奖励”给所有在线节点。

工具

客户端

客户端分为三种:完整客户端、轻量级客户端和在线客户端。

  • 完整客户端:存储所有的交易历史记录,功能完备;
  • 轻量级客户端:不保存交易副本,交易需要向别人查询;
  • 在线客户端:通过网页模式来浏览第三方服务器提供的服务。

钱包

矿机

专门为“挖矿”设计的硬件,包括基于 GPU 和 ASIC 的芯片。

脚本

比特币交易支持一种比较简单的脚本语言(类 Forth 的栈脚本语言),可以写入 UTXO。交易发生时,输入的解锁脚本和输出的锁定脚本进行执行,检验交易合法性。

比特币脚本并不支持循环等复杂的流控制,因此它是非图灵完备的。

共识机制

比特币网络是公开的,因此共识协议的稳定性和防攻击性十分关键。

比特币区块链采用了 Proof of Work(PoW)的机制来实现共识,该机制于 1998 年在 Bmoney设计中提出。

目前,Proof of 系列中比较出名的一致性协议包括 PoW 和 PoS,都是通过经济惩罚来限制恶意参与。

PoW

工作量证明,Proof of Work,通过计算来猜测一个数值(nonce),得以解决规定的 hash 问题(来源于 hashcash)。保证在一段时间内,系统中只能出现少数合法提案。

同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后会基于它认为的最长链上继续难题的计算。因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为最长的链。

hash 问题具有不可逆的特点,因此,目前除了暴力计算外,还没有有效的算法进行解决。反之,如果获得符合要求的 nonce,则说明在概率上是付出了对应的算力。谁的算力多,谁最先解决问题的概率就越大。当掌握超过全网一半算力时,从概率上就能控制网络中链的走向。这也是所谓 51% 攻击 的由来。

参与 PoW 计算比赛的人,将付出不小的经济成本(硬件、电力、维护等)。当没有成为首个算出的“幸运儿”时,这些成本都将被沉没掉。这也保障了,如果有人恶意破坏,需要付出大量的经济成本。也有设计试图将后算出结果者的算力按照一定比例折合进下一轮比赛考虑。

有一个很直观的例子可以说明为何这种经济博弈模式会确保系统中最长链的唯一。 共识机制
图 1.7.5.1 - Pow 保证一致性

超市付款需要排成一队,可能有人不守规矩要插队。超市管理员会检查队伍,认为最长的一条队伍是合法的,并让不合法的分叉队伍重新排队。只要大部分人不傻,就会自觉在最长的队伍上排队。

PoS

权益证明,Proof of Stake,2013 年被提出,最早在 Peercoin 系统中被实现,类似现实生活中的股东机制,拥有股份越多的人越容易获取记账权。

典型的过程是通过保证金(代币、资产、名声等具备价值属性的物品即可)来对赌一个合法的块成为新的区块,收益为抵押资本的利息和交易服务费。提供证明的保证金(例如通过转账货币记录)越多,则获得记账权的概率就越大。合法记账者可以获得收益。

PoS 是试图解决在 PoW 中大量资源被浪费的缺点。恶意参与者将存在保证金被罚没的风险,即损失经济利益。

一般的,对于 PoS 来说,需要掌握超过全网xxx的资源,才有可能左右最终的结果。这个也很容易理解,三个人投票,前两人分别支持一方,这时候,第三方的投票将决定最终结果。

PoS 也有一些改进的算法,包括授权股权证明机制(DPOS),即股东们投票选出一个董事会,董事会中成员才有权进行代理记账。

闪电网络

比特币的交易网络最为人诟病的一点便是交易性能:全网每秒 7 笔的交易速度,远低于传统的金融交易系统;同时,等待 6 个块的可信确认导致约 1 个小时的最终确认时间。

闪电网络的主要思路十分简单 – 将大量交易放到比特币区块链之外进行。该设计最早是 2015年 2 月在论文《The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments》中提出。

比特币的区块链机制自身提供了很好的可信保障,但是很慢;另一方面考虑,对于大量的小额交易来说,是否真实需要这么高的可信性?闪电网络通过智能合约来完善链下的交易渠道。

核心的概念主要有两个:

  • RSMC(Recoverable Sequence Maturity Contract)
  • HTLC(Hashed Timelock Contract)

前者解决了链下交易的确认问题,后者解决了支付通道的问题。

RSMC

Recoverable Sequence Maturity Contract,中文可以翻译为“可撤销的顺序成熟度合同”。这个词很绕,其实主要原理很简单,就是类似准备金机制。

我们先假定交易双方之间存在一个“微支付通道”(资金池)。双方都预存一部分资金到“微支付通道”里,之后每次交易,就对交易后的资金分配方案共同进行确认,同时签字作废旧的版本。当需要提现时,将最终交易结果写到区块链网络中,被最终确认。可以看到,只有在提现时候才需要通过区块链。

任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果)。在一定时间内,如果另外一方提出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑成功方。这就确保了没人会拿一个旧的交易结果来提现。

另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间要晚于对方,这就鼓励大家尽量都在链外完成交易。

HTLC

微支付通道是通过 Hashed Timelock Contract 来实现的,中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。理解起来其实也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。

不太恰当的例子,约定一定时间内,有人知道了某个暗语(可以生成匹配的哈希值),就可以拿到这个指定的资金。

推广一步,甲想转账给丙,丙先发给甲一个哈希值。甲可以先跟乙签订一个合同,如果你在一定时间内能告诉我一个暗语,我就给你多少钱。乙于是跑去跟丙签订一个合同,如果你告诉我那个暗语,我就给你多少钱。丙于是告诉乙暗语,拿到乙的钱,乙又从甲拿到钱。最终达到结果是甲转账给丙。这样甲和丙之间似乎构成了一条完整的虚拟的“支付通道”。

HTLC 的机制可以扩展到多个人,大家可以想象一下,想象出来了就理解了闪电网络。

闪电网络

RSMC 保障了两个人之间的直接交易可以在链下完成,HTLC 保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。整合这两种机制,就可以实现任意两个人之间的交易都可以在链下完成了。

在整个交易中,智能合约起到了中介的重要角色,而区块链则确保最终的交易结果被确认。

侧链

允许资产在比特币区块链和其它链之间互转。降低核心的区块链上发生交易的次数。

也来自比特币社区, 2013 年 12 月提出,2014 年 4 月成立项目。

通过简单地复用现有比特币的方式,实现比特币和其他帐簿资产在多个区块链间的转移。

Blockstream 基于侧链技术探索更多功能,已发布商业化应用 Liquid,并与普华永道进行相关合作。

小结

本章介绍了比特币的相关知识。比特币作为数字货币领域的重大突破,对分布式记账领域有着很深远的影响。

虽然在隐私保护等方面,比特币仍然为人诟病,但其底层的区块链技术已经受到重视,在许多方面都具有技术优势。

细分来看,比特币网络系统中并没有特殊创新的技术,它有机的组合了如下领域的已有成果:

  • 密码学
  • 博弈论
  • 记账技术
  • 分布式系统
  • 控制论

甚至可以说,对这些技术的应用并没有达到十分专业的地步。

但正是如此巧妙地组合,让它能完成这样一件了不起的创举。

这或许就是“大师”与“专家”境界的些许差异。

Ethereum(以太坊)-- 技术落地的实验

君子和而不同。

以太坊项目进一步扩展了区块链网络的能力,从交易延伸为智能合约(Smart Contract)。

其官网首页为 ethereum.org

简介

根据以太坊官方的宣称,以太坊(Ethereum)目标是打造成一个运行智能合约的去中心化平台(Platform for Smart Contract),平台上的应用按程序设定运行,不存在停机、审查、欺诈、第三方人为干预的可能。以太坊平台由 Golang、C++、Python 等多种编程语言实现。

当然,为了打造这个平台,以太坊提供了一条公开的区块链,并制定了面向智能合约的一套编程语言。智能合约开发者可以在其上使用官方提供的工具来开发支持以太坊区块链协议的应用(即所谓的 DAPP)。

历史与规划

  • 2014 年,以太坊项目开始众筹计划。
  • 2015 年 7 月,众筹完成,筹到价值 1800 万美金的比特币,第一阶段 Frontier 发布,以太坊区块链网络正式上线。
  • 2016 年 3 月,第二阶段 Homestead 开始运行(区块数 1150000),主要改善了安全性。
  • 2016 年 3Q,发布 Metropolis;
  • 2017 年 1Q,发布 Serenity,发布区块链的 PoS 股权证明(Casper)版本。

特点

以太坊区块链的特点主要包括:

  • 单独为智能合约指定编程语言 Solidity;
  • 使用了内存需求较高的哈希函数:避免出现算力矿机;
  • uncle 块激励机制:降低矿池的优势,减少区块产生间隔为 15 秒;
  • 难度调整算法:一定的自动反馈机制;
  • gas 限制调整算法:限制代码执行指令数,避免循环攻击;
  • 记录当前状态的哈希树的根哈希值到区块:某些情形下实现轻量级客户端;
  • 为执行智能合约而设计的简化的虚拟机 EVM。

组织

以太坊基金会:2014 年 6 月在瑞士注册的非营利性机构,管理以太坊获得的资金分配。

安装

如果你是首次接触 ethereum,推荐使用下面的步骤安装部署。

安装 Go 环境

curl -O https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.5.1.linux-amd64.tar.gz
mkdir -p ~/go; echo “export GOPATH=$HOME/go” » ~/.bashrc
echo “export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin” » ~/.bashrc
source ~/.bashrc

安装 ethereum

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum

安装 solc 编译器

sudo add-apt-repository ppa:ethereum/ethereum-qt
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install cpp-ethereum

安装后可以使用 geth 命令创建 ethereum 账户

geth account new

Solidity 语言支持

browser-solidity 提供了在线的 Solidity 语言测试。

用户也可以从 这里 下载到包括 Solidity 运行环境的安装包。

相关工具

客户端

官方提供钱包客户端 Mist,支持进行交易,同时支持直接编写和部署智能合约。

所编写的代码编译发布后,可以部署到区块链上。使用者可通过发送调用相应合约方法的交易,由矿工的以太坊虚拟机(EVM)在区块链上执行。

以太坊现在有多种语言实现的客户端,包括:

IDE

网站资源

已有一些网站提供对以太坊网络的数据查看,包括 EthStats.net、EtherNodes.com 等。

协议设计

核心概念

  • EVM:以太坊虚拟机,轻量级虚拟机环境,是以太坊中智能合约的运行环境。
  • Account:账户,分两类:合约账户存储执行的合约代码;外部账户为以太币拥有者账户,对应到某公钥。
  • Transaction:交易,从一个账户到另一个账户的消息,包括以太币或者合约执行参数。
  • Gas:燃料,每执行一条合约指令会消耗一定的燃料,当某个交易还未执行结束,而燃料消耗完时,合约执行终止并回滚状态。

一致性

目前采用了 PoW 作为一致达成保证,未来可能迁移到 PoS 上。

降低攻击

设计核心思想是通过经济激励机制防止少数人作恶:

  • 所有交易都要提供交易费用,避免 DDoS 攻击;
  • 程序运行指令数通过 gas 来限制,所消耗的费用超过设定上限时会被取消,避免恶意合约。

提高扩展性

以太坊未来希望通过分片机制可以提高整个网络的扩展性。分片之前整个网络的处理取决于单个节点的处理。

分片后,只有同一片内的处理是同步的、一致的,不同分片之间则可以是异步的。

Hyperledger(超级账本)-- 商用分布式账本

Uneasy lies the head that wears a crown.

Hyperledger 项目是首个面向企业的开放区块链技术的重要探索。在 Linux 基金会的支持下,吸引了包括 IBM、Intel、摩根等在内的众多科技和金融巨头的参与。

本章将介绍 Hyperledger 项目的历史,并以核心的 fabric 项目为例,讲解如何快速安装部署和应用区块链系统。

诞生与发展

历史

区块链已经成为当下最受人关注的开源技术,有人说它将颠覆金融行业的未来。然而对很多人来说,区块链技术难以理解和实现,而且缺乏统一的规范。

2015 年 12 月,开源世界的旗舰——Linux 基金 会牵头,联合 30 家初始企业成员(包括IBM、Accenture、Intel、J.P.Morgan、R3、DAH、DTCC、FUJITSU、HITACHI、SWIFT、Cisco 等),共同 宣告 了 Hyperledger 项目的成立。该项目试图打造一个透明、公开、去中心化的分布式账本项目,作为区块链技术的开源规范和标准,让更多的应用能更容易的建立在区块链技术之上。项目官方信息网站在 hyperledger.org
图 1.9.1.1 - Hyperledger 项目快速成长

目前已经有超过 120 家全球知名企业和机构(大部分均为各自行业的领导者)宣布加入Hyperledger 项目,其中包括 30 家来自中国本土的企业,包括:

  • 艾亿新融旗下的艾亿数融科技公司(2016.05.19)
  • Onchain(2016.06.22)
  • 比邻共赢(Belink)信息技术有限公司(2016.06.22)
  • BitSE(2016.06.22)
  • 布比(2016.07.27)
  • 三一重工(2016.08.30)
  • 万达金融(2016.09.08)
  • 华为(2016.10.24)等。

如果说以比特币为代表的货币区块链技术为 1.0,以以太坊为代表的合同区块链技术为 2.0,那么实现了完备的权限控制和安全保障的 Hyperledger 项目毫无疑问代表着 3.0 时代的到来。

IBM 贡献了数万行已有的 Open Blockchain 代码,Digital Asset 则贡献了企业和开发者相关资源,R3 贡献了新的金融交易架构,Intel 也刚贡献了跟分布式账本相关的代码。

Hyperledger 社区由技术委员会(Technical Steering Committee,TSC)指导,首任主席由来自 IBM 开源技术部 CTO 的 Chris Ferris 担任,管理组主席则由来自 Digital Asset Holdings的 CEO Blythe Masters 担任。

另外,自 2016 年 5 月起,Apache 基金会创始人 BrianBehlendorf 担任超级账本项目的首位执行董事。2016 年 12 月,中国技术工作组 正式成立,负责本土社区组织和技术引导工作。官方网站也提供了十分详细的 组织结构信息。

该项目的出现,实际上宣布区块链技术已经不再是仅面向“社会实验”性质的应用场景,它已经正式被主流机构和企业市场认可;同时,Hyperledger 首次提出和实现的完备权限管理、创新的一致性算法和可拔插、可扩展的框架,对于区块链相关技术和产业的发展都将产生深远的影响。

主要项目

代码托管在 Gerrit 和 Github(自动从 gerrit 上同步)上。
图 1.9.1.2 - Hyperledger

目前主要包括三大账本平台项目和若干其它项目。

账本平台项目:

  • Fabric:包括 Fabric、Fabric CA、Fabric SDK(包括 Node.Js、Python 和 Java 等语言)和 fabric-api、fabric-sdk-node、fabric-sdk-py 等,目标是区块链的基础核心平台,支持 pbft 等新的 consensus 机制,支持权限管理,最早由 IBM 和 DAH 发起;
  • SawToothLake:包括 arcade、core、dev-tools、validator、mktplace 等。是 Intel 主要发起和贡献的区块链平台,支持全新的基于硬件芯片的共识机制 Proof of ElapsedTime(PoET)。
  • Iroha:账本平台项目,基于 C++ 实现,带有不少面向 Web 和 Mobile 的特性,主要由Soramitsu 发起和贡献。

其它项目:

  • Blockchain Explorer:提供 Web 操作界面,通过界面快速查看查询绑定区块链的状态(区块个数、交易历史)信息等。
  • Cello:提供“Blockchain as a Service” 功能,使用 Cello,管理员可以轻松获取和管理多条区块链;应用开发者可以无需关心如何搭建和维护区块链。

目前,所有项目均处于孵化(Incubation)状态。

项目原则

项目约定共同遵守的 基本原则 为:

  • 重视模块化设计,包括交易、合同、一致性、身份、存储等技术场景;
  • 代码可读性,保障新功能和模块都可以很容易添加和扩展;
  • 演化路线,随着需求的深入和更多的应用场景,不断增加和演化新的项目。

如果你对 Hyperledger 的源码实现感兴趣,可以参考 Hyperledger 源码分析之 Fabric

社区组织

任何一个成功的开源项目,都离不开一个健康繁荣的社区。
图 1.9.2.1 - Hyperledger 社区组织结构

社区目前主要是三驾马车领导的结构:

  • Technical Steering Committee (技术委员会):负责技术相关的工作,下设多个工作组,具体带动各个项目的发展;
  • Governing Board (管理董事会):负责社区组织的整体决策,由 Hyperledger 会员中推选出代表;
  • Linux Foundation(Linux 基金会):协助 Hyperledger 社区在 Linux 基金会的支持下发展。

中国技术工作组

随着开源精神和开源文化在中国的普及,越来越多的企业和组织开始意识到共同构建一个健康的生态系统的重要性,也愿意为开源事业做出一定贡献。

Linux 基金会和 Hyperledger 社区十分重视项目在大中华区的应用和落地情况,并希望能为中国技术人员贡献开源社区提供方便。在此背景下,Hyperledger 执行董事 Brian Behlendorf 于2016 年 12 月 1 日 提议 成立 中国技术工作组,即 TWG-China,并得到了 TSC 的一致支持通过。

工作组的 主要职责 包括:

  • 带领和引导大中华区的技术相关活动,包括贡献代码、指南文档、项目提案等。
  • 推动技术相关的交流、会员之间的合作和实践案例的落地;
  • 通过邮件列表、rocketchat、论坛等方式提供会员的技术交流;
  • 协助举办社区活动,包括 meetup、黑客松、hackfest、技术分享、培训等。

目前,工作组由来自 IBM、万达、华为等 Hyperledger 成员企业的技术专家领导,并得到了来自社区的众多志愿者的支持。

五大顶级项目

开发和提交代码

小结

Hyperledger 是 Linux 基金会支持的分布式账本平台,这是开源界试图构建一套标准化分布式账本平台的重要尝试。

类似的项目还包括 以太坊平台、R3 CEV 牵头的 Corda 项目、微软的 bletchley 项目 等。

Fabric 部署与管理

简介

使用 Fabric 1.0 版本

Fabric v0.6

安装部署

使用 chaincode

权限管理

Python 客户端

小结

区块链应用开发

简介

链上代码工作原理

示例一:信息公证

示例二:交易资产

示例三:数字货币发行与管理

示例四:学历认证

示例五:社区能源共享

小结

Fabric 架构与设计

简介

架构设计

消息协议

小结

区块链即服务

Bluemix BaaS

超能 BaaS

使用 Hyperledger Cello 搭建区块链服务

小结

性能与评测

简介

Hyperledger Fabric v0.6

小结

附录

术语

常见问题

相关组织

ProtoBuf 与 gRPC

资源链接

blockchainguide.txt · 最后更改: 2017/09/05 07:49 由 螃蟹