1.1 区块链诞生之前 我们通常把比特币的发明看成是区块链诞生的标志性事件。但区块链就像很多技术一样,并不是凭空出现的,通常都会有一些渊源。 1991年,比特币发明出来的17年前,斯图尔特·哈伯(Stuart Haber)和W.斯科特·斯托内塔(W. Scott Stornetta)就提出了区块链的前身。他们创造性地把一系列区块链接起来,最终保证了电子文档的时间戳不可篡改。一年之后,他们升级了这套系统,往其中加入Merkle哈希树。得益于此,他们系统的效率大大提升,可以在一个区块中放入一组文档。 链接在一起的区块、防篡改特性、Merkle哈希树,这些最终都成为区块链的重要组成部分。 1.2 区块链的诞生标志—比特币 2008年10月31日,一名叫中本聪(Satoshi Nakamoto)的用户在密码学的邮件组中发了一个链接,链接指向一篇叫作《比特币:点对点的电子现金系统》(Bitcoin: A Peer-to-Peer Electronic Cash 第1章 区块链概要 区块链应用开发指南:业务场景剖析与实战 2 System)的论文。 论文中指出,比特币使用一组链接在一起的数据块存储转账信息。而这个存储技术 就是我们熟知的区块链。之后的区块链系统都是在此基础上根据需要进一步改善而来。 从这个角度出发,我们可以说比特币是区块链诞生的标志。 有意思的是,在比特币诞生之后的一段时间内,比特币是区块链的唯一应用,以至 于很长一段时间内,人们把比特币和区块链视为等同,甚至到现在也有很多人误把比特 币的一些属性加在区块链上。 1.3 比特币之后的区块链 1.3.1 比特币与区块链的分离 比特币诞生的几年后,人们开始意识到区块链本身的潜力,于是形成一股力量,开 始把区块链从比特币中分离出来。最终区块链被定义为一种去中心化的分布式账本技术, 主要用来记录交易信息,其交易记录具备不可篡改性,并且不需要额外的第三方机构来 证明记录的正确性。所以,在很多交易场合,区块链都有着巨大的前景。 需要注意的是,这里所说的交易可以理解为一种广义的交易,并不仅仅是简单的货 币交换。正是基于这种认识,整个业界都对区块链报以极大的热情,大量的投资和研发 工作因此展开。在健康、保险、供应链、投票等领域都开始出现区块链的身影。到 2017 年, 全世界有 15% 的银行都开始或多或少地使用区块链。 1.3.2 智能合约 2014 年,一名叫维塔利克·布特林(Vitalik Buterin)的年轻人发明了以太坊,并在 其中创造性地发明了智能合约,智能合约被认为是比特币之后的又一重大发明。 在以太坊被发明出来前,区块链上可进行交易的一般都是像比特币这样的加密货币, 然后在交易的附言阶段附带上一些信息。而以太坊扩大了交易的边界,它让交易发生的 同时可以执行一段代码。这也就意味着交易本身具备了逻辑,毕竟现实中的很多交易都 3  第 1章 区块链概要 会伴随着逻辑,比如分期付款或者多方参与的借贷。像保险合同的执行也是有事前约定 的条件,这些合约条件都没办法单纯地依靠比特币这样的转账记录达成。而当交易可以 附带一份代码的时候,情况就完全不同了,我们可以通过代码写出这些合约的执行条件, 在条件满足的时候才执行真正的加密货币转账。甚至,交易可以完全不产生货币转账, 而是用代码来描述一份数字资产。总之,当区块链中可以存储代码,它的想象空间就是 无限的。 智能合约是区块链的又一里程碑事件,在智能合约发明出来之后,区块链已经完全 从比特币中分离出来。时至今日,智能合约之后发明出来的新技术,像闪电网络、侧链 这些都是根据具体应用场景所作出的一些优化。 在未来可能发生更大的变化之前,区块链的主要历史就到此结束。分布式、防篡改、 交易、智能合约成为现今所有区块链的基础特点。 1.4 分布式系统 在讲区块链之前,我们先看一下区块链的产生背景。在计算机领域,有一类非常经 典的问题是关于多台计算机如何同时运行同一个任务。我们通常把解决这类问题的系统 称为“分布式系统”。分布式系统如今已经越来越重要,根本原因是我们要处理的问题 越来越复杂,如果单纯只靠一台计算机,哪怕这台计算机有最顶尖的配置通常也不够。 另外一个原因就是我们要处理的问题所覆盖的地域越来越广,现在服务全世界已经不是 什么特别远大的理想,而是比较常见的一个需求。而不同的地域有不同的网络环境,如 果只把服务放在单一某个地方,那么在某些地区就很容易遇到服务质量下降的问题,这 时我们就需要把服务放在不同的地域来满足需求。 在这些情况下,最终都是多台计算机同时做一个任务的问题。而如何很好地同步多 台计算机之间的状态是一个非常棘手的问题。 CAP 理论 分布式系统的状态同步是一个很有难度的问题,其中诞生了非常重要的 CAP 理论。 CAP 理论指出,在分布式存储系统中,有三个主要的指标,而这三个指标在某一时刻不 可能同时满足,它们分别是一致性、可用性和分区容忍性。 区块链应用开发指南:业务场景剖析与实战 4 (1)一致性(Consistency):当你向系统发出读取数据的请求时,你一定只会读取 到最后写入的结果。 (2)可用性(Availability):当你向系统发出读写请求时,你一定能得到结果。 (注意这个结果不一定需要满足一致性,也就是你发起读请求的时候,可能会读到过期 的数据。) (3)分区容忍性(Partition tolerance):分布式系统中的多台计算机通过网络相连, 如果某些计算机之间丢失消息或者消息的发送发生延迟,整个系统需要能够继续正常 运行。 考虑到我们解决的是分布式系统问题,所以分区容忍性是一个需要满足的特性,那 么当分布式系统中的消息传递出现问题的时候,我们有两个选择: (1)暂停接下来的操作,等待各计算机节点间的数据同步完成。这样就削弱了可用性, 保证了一致性。 (2)继续正常提供服务,这时候访问不同的节点就可能得到不同的数据。这样就削 弱了一致性,但保持了可用性。 接下来,我们用大家常用的自动提款机来举一个例子。每台自动提款机可以看成分 布式系统中的一个节点。我们假设,某一时刻,某台自动提款机和银行总部的网络连接 断开,这就是发生了分区错误。对于自动提款机的设计者来说,有两种选择:一种选择 是让自动提款机继续工作,因为毕竟自动提款机中是有现金的,所以理论上能够继续取 钱。这时候就是满足了可用性,代价就是用户的账户无法及时同步,可能会出现超额取 钱的情况,也就是牺牲了一致性。另一种选择就是让自动提款机暂停工作,直到网络恢复。 这就是牺牲了可用性,而保证了一致性。 日常生活中,我们通常都会认为第二种方案更加可取,但其实第一种方案在某些国 家也是存在的。不过为了预防太恶劣的情况,实际的设计是如果自动提款机掉线,那么 取款就只能是小额取款。这种设计方案就是满足部分可用性,同时也牺牲一致性。 值得提出的是,CAP 理论容易会被误读为一致性、可用性、分区容忍性只能是单纯 的满足和不满足两种状态,实际上应该是指满足的程度如何。就好比自动提款机的例子, 我们可以把它设计成同时牺牲一部分可用性以及一部分一致性。 另外需要注意的是,我们说不满足一致性,并不是说永远不一致。当出现故障的节 点恢复之后,仍然可以继续同步到最新的数据。所以最终所有节点还是能保持一致,这 5  第 1章 区块链概要 就是最终一致性。 区块链从技术的角度看其实就是一种分布式系统的解决方案。通常的设计都是以满 足分区容忍性为前提,然后满足极高的可用性,牺牲数据的一致性。 1.5 什么是区块链 区块链最常见的定义是:去中心化、分布式、公开的数字账本,主要用于记录交易 信息。与传统方案不同的是,区块链的交易记录存储在很多不同的计算机上。而任意一 个参与记录的计算机都很难修改交易记录,如果想要修改某一条交易信息,那就需要修 改之后的所有交易信息。正所谓“牵一发而动全身”,任何微小的修改都会扩散到区块 链的所有后续记录上,而这在实际操作中几乎不可能实现。这样的结果就是,所有参与 的计算机都可以独立地验证交易或者发起交易,同时这样做的成本还很低。因此,区块 链不需要任何独立机构单独维护,却具备不可篡改的特性。正是这种特性,让区块链具 备了巨大的潜力。 我们通常把区块链存储交易记录的部分称为“区块链数据库”。区块链数据库和传 统数据库也有着巨大的差别,它是存储于点对点的分布式网络之中,和 BT 下载等分布式 下载技术有相似之处。这也意味着没有任何一家机构拥有区块链数据库,相反,是参与 到网络中的所有计算机共同拥有数据。 区块链中存储的信息非常简单,主要就是表示从一个地址到另一个地址的转账信息。 而转账的内容被标注为不可重复,这也就意味着,和传统银行账户一样,当你发起转账 之后,转账物的拥有权就发生了永久性的转移。但由于区块链本质上是一堆二进制数据, 所以转账的数据并不局限在金钱的范畴。比如你完全可以把对某个网站的操作权限进行 转移,当转移过后,操作权限就和新的交易地址唯一绑定,而旧的交易地址也就失去了 权限。从这个角度出发,我们可以认为区块链其实是一个价值交换网络。任何有价值的 东西都可以通过区块链来完成拥有权的转移。 区块链应用开发指南:业务场景剖析与实战 6 1.6 代币是什么 需要注意的是,由于区块链记录的是转账信息,自然就会出现转账物的概念。如果任 意定义这个转账物,那么区块链和传统的存储技术也就没什么太大的区别。因此,大部分 区块链都会定义通用转账物,而其他的数字资产可以通过某种规则映射到这个通用转账物 上。随着时间的推移,大家就开始使用代币(token)来表示这个通用转账物。 代币是区块链里的一个关键概念,但是考虑到一些特殊的情况,也有可能出现无币 区块链,所以代币并不是区块链的必要属性。 1.7 什么是区块 区块是区块链中的数据存储单元。每一个区块中存储了一组交易信息以及这些交易 信息的哈希数据。这些交易信息的哈希数据编码为默克尔树(Merkle 哈希树)存储。 每一个区块还会存储前一个区块的哈希信息,因此区块就能够通过哈希信息链接 起来,形成区块链。通过前一个区块的哈希信息去定位,我们就可以不断地往前追溯, 直到找到创世区块(区块链启动的时候产生的第一个区块)。由于对区块中交易数据 的微小修改都会导致区块自己的哈希信息改变,所以如果篡改了任何一笔记录,就意 味着此区块的内容发生了改变,那么此区块的哈希信息也就改变了。由于下一个区块 的内容会保存当前区块的哈希信息,那就是说篡改者需要同时修改下一个区块的内容, 这同样会导致再下一个区块的哈希信息改变,依此类推,篡改者需要修改后续的所有 区块。 1.7.1 区块是怎么产生的 每个区块由参与其中的计算机节点独立生成。由于是分布式网络,所以就会有不同 7  第 1章 区块链概要 的区块在同一时间被生产出来。区块链数据库中的区块通过哈希信息相连构成了一条基 于哈希信息的历史链。不同的区块在同一时间产生,系统中就出现了多条历史链。区块 链会提供一套算法来对每一条历史链进行打分,以此来留下分数更高的链,同时淘汰分 数低的链。 随着时间的推移,区块链的每一个独立节点都在生产自己的区块,同时接收其他节 点传递过来的区块。所以节点本地总是会有多条历史链。这时候,节点就需要在本地生 产的区块和接收到的区块中进行选择,如果接收到的区块构成的历史链优于自己本地的, 那么就会销毁自己刚刚生成的区块,然后以更优的历史链为基础,再生成新的区块并广 播给网络中其他的节点。 由于区块生成一直在各个节点中不停地发生,所以从任何一个节点上得到的历史链 都无法保证是最优的。但是由于区块链总是把新的区块不停地加到旧的历史链上,每一 次添加都会增加这条链的分数。这也就意味着,随着时间的推移,某一个区块后边总是 会跟上很多新的区块,当它被广播出去之后,该区块也更可能被更多的机器所识别,并 以此为基础构建本地的新链,所以虽然这个区块后边跟随的新区块在不同的历史链上可 能不一样,但是就这个区块来说,这个区块被所有节点都认为是有效的可能性会越来越高。 到一定的程度之后,我们就可以认为这是一个不可修改的区块。这也是我们经常听到当 区块达到一定高度,我们就信任这笔交易的原因。 1.7.2 区块生成时间 区块生成时间是指区块链系统中生成一个新的区块所需的平均时间。当一个区块 生成时间走完,最新的区块进入可验证的状态。区块生成时间越短,交易完成的速度也 会越快。但是由于区块的生成涉及数据打包以及处理软分叉的打分系统,这都需要一 定的时间开销。而不同的打分系统会有不同的时间开销,同时如果对安全性、稳定性各 方面的要求越高,那么生成一个区块的时间自然也会越慢。所以区块生成时间在不同的 区块链中的差别会非常大。比如以太坊的区块生成时间在 10 ~ 15 秒,而比特币是 10 分钟。 区块链应用开发指南:业务场景剖析与实战 8 1.8 区块链的硬分叉 区块链就和传统的程序一样,随着时间的推移,软件的设计本身也会发生改变,甚 至是在软件中出现严重的漏洞,如果在传统软件中就会产生升级的操作。而升级后是否 向下兼容就会对整个软件造成完全不同的影响。区块链也是一样,区块的数据格式、生 成区块的算法以及对区块链进行打分的算法都可能会升级。如果这种升级向下不兼容, 就会出现两套算法在同时运行的情况。运行旧软件的计算机节点会继续用旧的协议来继 续构建区块,而运行新软件的节点就会用新的协议去构建新的区块。通常升级会从某一 个固定的区块开始,所以从这个固定的区块开始,就会分叉出两条完全不同的链。两者 再也没有互相融合的可能。这就是区块链的硬分叉。 和传统软件升级不一样的是,硬分叉的代价很大,因为节点是否升级所牵扯的面很广, 其中除了技术的原因,还有很多利益纠葛,比如有的节点的硬件就是专门为旧的协议设 计,无法很好地适配新的协议,那么这些节点升级新协议的可能性就很小,甚至这种升 级根本就不可能实现。更进一步,不同的人对区块链的想法不一样,不同的工作组有可 能给出完全不同的升级协议,而这些协议都可能被一定数量的节点所接受,结果就是同 一个区块链随着时间的推移,可能会发生很多次硬分叉。例如,比特币就被分叉过很多次, 在交易市场上,很多和比特币的名字很类似的币,其实就是硬分叉导致的。以太坊也在 某一次 DAO 黑客事件后进行回滚,有的节点不接受这次回滚,结果就是分叉出以太坊和 经典以太坊两条链。 要解决硬分叉问题,在技术上并没有什么好的办法。不过随着时间的推移,不同的 链在进行公平的竞争,最终总会有一些更好的被留下来,其他一些则被慢慢淘汰。所以, 硬分叉到底是不是一个严重的问题,更多的就要看观察角度了。 1.9 区块链的去中心化 区块链数据库本质上存储在区块链所有的计算机节点上,这是一种经典的点对点网 9  第 1章 区块链概要 络系统,也就是去中心化的由来。通过去中心化,区块链避免了很多中心化系统的风险。 传统的中心化系统中,如果由于人为的攻击或者其他不可抗力的原因,导致服务器 发生了故障,那么整个系统也就彻底瘫痪。在去中心化的区块链系统中,我们可以认为 每一个节点都是一个功能完备的系统,除非整个区块链网络中的大部分节点都发生故障, 不然区块链始终能正常运行,从这个角度看,去中心化的区块链系统很好地避免了单点 故障。 由于每一个区块链节点都存储有一份区块链数据的备份,没有一个所谓权威的数据 备份,这也就意味着从数据的角度来看,每一个节点的地位都是对等的,大家不用特别 信任某一个节点。每个节点做的事情都一样,接受别的节点的数据,比较本地数据,生 成新的数据,然后广播出去。区块链的各种算法会协调这些步骤,最终不断地记录合法 的数据,如果系统中有恶意节点,随着时间的推移,由于它们的数据在评分系统中会越 来越低,所以它们产生的恶意数据会自动被清除出去。 但是现实通常会更微妙,随着区块链系统的发展,很可能会伴随着去中心化的削弱。 因为区块链系统的运行需要一定的计算资源,而这个资源有可能会越来越大,以至于普 通的节点无法负担,那么大型资源节点最终就会占据越来越大的优势,最终区块链系统 可能会被有限的大型资源节点接管。在比特币的发展中,我们就能看到大型矿池的出现。 1.10 区块链的主要种类 1.10.1 公链(public blockchain) 公链是一种公开透明的区块链。作为用户,任何人都能够在公链上发起转账操作, 也可以无条件地查询整条链上的交易信息。同时,只要有对应的硬件,任何人都可以根 据协议接入区块链,然后成为区块链中的一个节点。公链通常都开放源代码,作为开发者, 可以浏览整个公链的实现方式,也可以对公链的实现提出自己的建议,甚至可以给公链 提交代码,当然,代码是否被接受需要通过公链开发团队的审核。 公链是完全去中心化的,也就是说没有单一的人或者组织拥有公链。在“交易”和“查 询”这两个最基础的区块链操作上,所有人都是平等的,不会说谁有优先权。 区块链应用开发指南:业务场景剖析与实战 10 这种人人平等的特性使公链具有全球性,既然所有人都拥有公链,那意味着也就没 有机构能够关闭一条公链。 为了奖励参与整个区块链运作的工作节点,公链都会有一定的经济刺激机制,一般 通过代币(token)来实现。参与工作的节点如果完成了一个区块的创建,通常会收到一 定的代币奖励。 公链中的工作节点通常都是匿名的,因此参与公链运作本身会受到匿名性的保护。 做得常见并且成功的公链包括比特币、以太坊等。 1.10.2 私链(private blockchain) 私链,有时候也称为许可链(permissioned blockchain)。和公链相比,私链有以下 不同点: (1)作为用户,必须得到私链拥有者的许可才能够发起转账和查询操作; (2)作为节点,也需要许可才能加入私链网络; (3)更为中心化。 需要注意的是,私链的代码也可能是开源的。不同的组织用同样的代码搭建自己的 私链,彼此虽然共享代码,但链中的节点以及链上的记录互相独立。 私链对很多企业来说是首选。因为对于企业来说,企业内部的各种信息并不能公开, 这和公链天生的透明性正好互相冲突。 私链的拥有者对私链有最高的权限,其权限远远高于其他参与方。比如,拥有者能 随时关停私链,也可以在需要的时候进行分叉以此实现记录回滚等操作。 最后,在私链中,由于控制方唯一,所以完全可以做到只用区块链来记录数据而不 对参与的节点进行代币奖励。因此,代币在私链中并不是必需项。当区块链中没有代币 也就成了无币区块链。无币区块链通常会在私链中出现。 1.10.3 联盟链(consortium blockchain) 联盟链是从私链中分出来的一个概念,联盟链由多个组织共同拥有,而不是像私链 一样,只是由唯一的一个组织拥有。但是从其他属性来看,联盟链和私链几乎一样,所 11  第 1章 区块链概要 以也可以认为联盟链是一种特殊的私链。 从价值上看,联盟链可以让不同的组织之间共享数据,能很好地提升商业行为的效率。 同时,因为有多个参与方,各参与方之间互相博弈,让私链那种可以任意修改的情况好 了很多,所以又具备了一定的公链优势。 但是从另一个角度来说,也可以说联盟链没有私链那么可控,也没有公链那么开放, 所以反而有自己的困境。最大的困境来源是传统的中心化系统,各商业组织之间有很多 既有的方法来交换数据,这些都是联盟链最大的竞争对手。而由于联盟链的折中特性, 与已有技术相比,很多时候并没有特别大的优势。 1.11 加密货币 加密货币应该算是区块链最为人所熟知的应用,也是目前最为成熟的应用。除了少 数的例外,大部分的加密货币底层都是使用区块链技术,更准确地说是使用区块链技术 来存储交易数据。其中以比特币网络和以太坊网络最为有名。 早期的加密货币正如其名,主要是突出了加密的特点。一般来说都会使用公、私钥 这类的加密技术来加密交易数据,其中包括支付双方的身份、支付的内容等。最终以此 来保证交易的安全性以及匿名性。但这些早期货币都没有摆脱中心化的问题。使用者还 是需要在某个服务商那里统一注册自己的账户,理论上只要通过服务商的注册系统,那 么就有可能破坏加密货币的安全性。 随着比特币的发布,加密货币终于迎来了技术性的突破。比特币底层所使用的区块 链技术,让加密货币首次摆脱了中心化的问题。自此以后,加密货币不再依赖于任何机构, 自己就可以在全世界的网络中运行。很快,成千上万的加密货币出现,而使用区块链技 术的加密货币则成为主流的选择。 随着加密货币的发展,现在大家对加密货币已经形成一定的共识,不再只要是 网络上的金钱系统就能称其为加密货币系统。加密货币的研究人员扬·兰斯基(Jan Lansky) 在 自 己 的 论 文《加密货币的可能实现方法》(Possible State Approaches to Cryptocurrencies)中认为加密货币系统需要满足以下 6 个条件。 (1)系统的运行不需要任何的中心化机构,分布式共识负责维护系统的状态。 区块链应用开发指南:业务场景剖析与实战 12 (2)从系统中可以查询到任何一枚加密货币以及对应的拥有者。 (3)新的加密货币的生成由系统决定,当加密货币生成以后,系统负责定义新加密 货币的初始状态,同时系统定义了以何种方式确定新加密货币的拥有权。 (4)只需要通过密码学算法就可以验证加密货币的拥有权。 (5)只有在加密货币的拥有权发生转移的时候才能产生交易。只有在某人证明了对 加密货币的拥有权的时候才能进行交易。 (6)如果两个不同的拥有权转移指令同时发生,系统最多只能接受其中一个指令。 可以看出,区块链能够很好地满足这 6 点要求,所以在加密货币的实现上,区块链 成为一种主流的选择。 1.12 智能合约(smart contract) 1.12.1 什么是智能合约 智能合约是一种电子化的合约,表现为计算机协议的形式。从功能上看,智能合约 可以在没有第三方干预的情况下执行合约,并可以随时追踪合约的执行情况。此外,合 约本身可以做到绝对无法撤销。智能合约的目标是提供比传统合约更好的安全性。另一 方面,在传统的合约执行过程中,需要律师、法院等各种各样的第三方介入,本身的成 本非常高。而智能合约着眼于自动执行,以此来减少执行合约的成本。 随着大部分的加密货币都实现了智能合约,现在智能合约的主流实现方式都是基于 区块链技术。所以很多时候我们说智能合约,都是特指通过区块链实现的智能合约。 需要注意的是,虽然智能合约中的“合约”二字取材自现实中的合约,但并不是说 所有的智能合约必须与现实中存在的合约一一对应。由于智能合约本质上是一组计算机 协议,所以智能合约完全可以实现一种现实世界中不存在的协议。 1.12.2 智能合约的实现方式 通过区块链实现的智能合约中,智能合约的去中心化属性通过区块链中的分布式一 13  第 1章 区块链概要 致性算法来保证。分布式一致性算法就成了智能合约的主要组成部分。除此之外,为了 描述智能合约,就需要一种特定的描述语言来支持,这种描述语言一般就是一种特别设 计的编程语言。 比特币提供了一种图灵不完备 a 的脚本语言。通过这种脚本语言可以实现有限的智能 合约,主要包括支持多重签名的账户、第三方托管服务、跨链交易等。主流语境中人们 通常不认为比特币实现了智能合约,但是从这门脚本语言的成果来看,我们可以认为比 特币支持了一定程度上的智能合约。 智能合约最有名的实现成果应该是以太坊。以太坊提供了一门几乎图灵完备的编程 语言。结果就是理论上开发者可以在以太坊的智能合约上编写任意复杂的逻辑,甚至可 以实现自己能想到的任何程序。得益于此,以太坊上出现了形形色色的应用,甚至因此 出现 DApp 这种新的程序类别。 1.13 区块链应用 1.13.1 金融服务 不可否认,目前区块链最大、最成功的应用是加密货币。而由于加密货币天生接近 金融的特性,所以区块链在金融服务中也开始逐渐扮演越来越重要的角色。 具体到行业中,首先是银行业。由于银行对记账有着天生的需求,而区块链的分布 式账本技术是一种全新的技术,所以有不少银行都在研究区块链技术。区块链技术在某 些方面能很好地提高银行业的效率。 例如,在跨境支付中,区块链对现有技术是一种很好的补充。跨境支付业务由于涉 及不同的国家,不同的国家有不同的政策法规,结果就是跨境支付的环境十分复杂多样, 而为了满足这些多样化的环境,就需要各种各样的系统来配合运行。其中一些问题已经 解决得很好,还有一些问题则没有很好的方案。在某些环境下,区块链是一个非常好的 解决方案。 a 图灵完备是一个计算机学概念,具备图灵完备的语言理论上可以完成一切可计算问题的编程。图灵不完 备则表示这门编程语言缺乏一定的基础结构,不能完成所有的编程任务。 区块链应用开发指南:业务场景剖析与实战 14 举例来说,在网络连接是一种奢侈服务的地区,使用传统的银行记账业务是非常困 难的,大多时候会退化到传统的纸笔记账。而在这种环境下,区块链可以有很好的用途, 毕竟区块链的分区容忍性非常高,理论上完全可以在没有联网的情况下正常工作,然后 在固定的时间连上主网,接着同步数据即可。虽然传统的解决方案也完全可以做到这一点, 但是区块链从设计之初就决定了它可以完美适配这种环境,所以在这种情况下,区块链 是一个非常好的技术选择。 2019 年,Facebook(脸书)宣布了自己的区块链支付方案 Libra(现更名为 Diem)。 这是一个非常有创意的计划。虽然我们很难断言其最终是否成功,毕竟在金融领域,除 了技术,还有政治、社会等各方面的因素需要考量。但是只从技术的角度看的话,它确 实是把区块链用在了一个非常合适的地方。 1.13.2 游戏 2017 年 11 月,以太猫(CryptoKitties)在以太坊上线。以太猫是一个十分简单的游戏, 用户可以通过以太币购买虚拟的以太猫,然后繁育下一代,同时也可以出售自己拥有的 以太猫。 以太猫和传统游戏不同的是,以太猫的拥有权完全在用户手里。每一个以太猫就是 一个以太坊上的数字,而这个数字和一个以太坊的地址绑定。拥有这个地址的用户就完 全拥有这只以太猫,没有任何人、任何机构能够改变这个拥有权。这和传统的游戏非常 不一样,传统的游戏数据是存储在游戏公司的服务器上,游戏公司能够任意修改这些数据。 从这个角度说,传统游戏中的角色、装备等其实都是由游戏公司所有。 另一个特点,由于以太猫是运行在以太坊上的智能合约,那么即便是开发公司也无 法撤销这个合约,也就是说,哪怕以太猫的开发公司倒闭了,用户所拥有的以太猫仍然 可以很好地保留在用户手里。这和传统游戏也完全不一样,传统游戏公司如果倒闭了, 玩家通常都会永远地失去游戏中的角色和装备。 更进一步,由于用户完全拥有以太猫,所以另一个公司可以根据用户拥有的以太猫 来开发新的游戏。这就等同于可以把一个游戏中的资产转移到另一个游戏中。这在传统 游戏中也是极为少见。 从这个角度来看,区块链在管理游戏资产方面有非常大的意义。它让玩家真的拥有 15  第 1章 区块链概要 了自己的游戏资产。 1.13.3 数字资产 我们可以看到区块链在管理游戏资产时的优势,而这种优势完全可以扩展到数字资 产的范畴。比如积分、会员等常见的数字资产,完全可以通过区块链来进行管理。 还有就是我们经常听说的“发币”。这种发币和区块链本身自带的代币有着本质区别。 它和以太猫类似,是通过智能合约的方式生成的一组数字资产。通过智能合约编写代码, 我们可以规定某个币的总量以及币的转账、收取甚至销毁等操作,进而实现更复杂的金 融手段。具体可以查看本书 ERC20 相关的章节。 1.13.4 供应链管理 供应链是一个非常复杂的话题。一家企业在运行的过程中,供应链的管理必然是占 据了极大的部分。由于有多方的参与,其中产品的移交、数据的记录甚至上下游的金融 往来都变成了复杂的问题。 供应链有三个方面非常重要,区块链在其中可以扮演很好的角色。 (1)资金的往来,区块链天然适合记账。 (2)产品各种单据的记录,可以通过区块链来进行数字化记录。 (3)物流,可以通过与物联网设备的结合来实现追踪管理。 当然,所有的部分都可以用其他的技术来实现,但是区块链的优势在于,这个系统 不属于任何一方,并且能够自动运行。就好像大家拥有了一个共有数据库,参与其中的 各方可以根据自己的需要开发自己的应用。而数据的不可篡改等特性也可以给各方的相 互信任提供一层技术保证。 1.13.5 其他 区块链还能用于某些合约的自动签署,比如租房合约这种制式合约就可以直接通过 区块链技术存储,然后自动执行一系列的签署、支付等服务。 区块链应用开发指南:业务场景剖析与实战 16 保险领域也可以使用区块链来实现一些新的业务。比如小额保险、个人对个人的保 险等。 之后是共享经济,由于共享经济参与的个体众多,而很多的交易的额度都很小,这 时候通过一个中心化的公司来维护,维护成本很可能高于利润,导致商业模式无法正常 运行。但是使用区块链就可以极大地减少成本,各方可以直接通过区块链来完成交易。 总之,区块链的去中心化、防篡改等特性,让很多以前很难实现或者实现起来成本 过高的商业模式成为可能。 1.14 比特币的历史 1.14.1 比特币前传 1983 年,戴维·查姆(David Chaum)和史蒂芬·布兰德斯(Stefan Brands)开发 了 ecash 协议,基于 ecash 协议,不少人发明了电子现金系统。 1997 年,亚当·巴克(Adam Back)开发了 hashcash 协议,主要是为了解决垃圾邮件 泛滥的问题,其中用到的技术就是后来被比特币使用的工作量证明算法(proof-of-work)。 1998 年,戴伟(Wei Dai)发明了 b-money,尼克·萨博(Nick Szabo)发明了 bit gold。两者被认为是最早的分布式加密货币。 这一切可以被认为是比特币的前身,它们都或多或少地影响了比特币的设计。 1.14.2 比特币面世 2008 年 8 月 18 日,有人注册了 bitcoin.org 的域名地址。2008 年 10 月 31 日,密码 学(cryptography)邮件列表中收到了一个叫中本聪的人发出的链接,链接指向了一篇论 文(图 1-1 为这篇论文的部分截图),标题为《比特币:点对点的电子现金系统》(Bitcoin: A Peer-to-Peer Electronic Cash System)。 论文中详细介绍了如何使用点对点技术创建一种电子交易系统,以及如何使这种交 易系统可以在不依赖第三方背书的环境下工作。 17  第 1章 区块链概要 图 1-1 比特币论文截图 2009 年 1 月 3 日,中本聪挖出了比特币的创世区块,标志着比特币网络正式上线。 中本聪在挖出创世区块的过程中获得了 50 个比特币的矿工奖励,同时他在创世区块中留 下了这句话: The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.(2009 年 1 月 3 日,财政大臣正处于实施第二轮银行紧急援助的边缘) 这句话是英国《泰晤士报》当天的头版文章标题。通过对头版头条的引用证明了比 特币的实际上线时间。 2009 年 1 月 9 日,知名代码托管网站 SourceForge 上发布了第一个开源版本的比特 币客户端。 2009 年 1 月 9 日,作为比特币的早期支持者和贡献者的程序员哈尔·芬尼(Hal Finney)下载了比特币客户端,2009 年 1 月 12 日,哈尔·芬尼(Hal Finney)收到了中 本聪的 10 枚比特币的转账,这是比特币历史上的第一次转账。 2010 年 5 月 22 日,程序员拉斯洛·汉耶兹(Laszlo Hanyecz)用 10 000 枚比特币购 买了 Papa John’s 的两份披萨。这是有记录的第一次在现实中发生的比特币交易行为。 据估计,中本聪在比特币早期一共挖出 100 万枚比特币。2010 年之后,中本聪销声 匿迹,时至今日也没有人知道他的真正身份。在消失前,他把比特币的开发权交给了加 文·安德烈森(Gavin Andresen)。后来加文·安德烈森成为比特币基金会的首席开发者。 2010 年 8 月 6 日,比特币协议中的一个重大缺陷被发现。8 月 15 日,缺陷爆发,超 过 1840 亿枚比特币被创造出来,并发送到两个地址。几小时内,问题被修复,比特币主 网进行了硬分叉,消除了这笔交易。这是时至今日,比特币历史上唯一的一次重大安全 隐患事故。 区块链应用开发指南:业务场景剖析与实战 18 1.14.3 比特币发展中的主要事件 2011 年,大量基于比特币源代码的替代币出现。 2011 年 1 月,电子前沿基金会(Electronic Frontier Foundation)开始接受比特币, 但由于缺乏有法律依据的先例,同年 6 月,它又停止接受比特币。 2011 年 6 月,维基解密(WikiLeaks)开始接受比特币。 2012 年 9 月,比特币基金会成立,旨在通过开源的协议来加速比特币在全球范围内 的增长。 2012 年 10 月,总部位于美国的比特币支付公司 BitPay 发布报告称已经有超过 1 000 个商业组织接受比特币作为支付服务。 2013 年 6 月 23 日,M-Pesa 和比特币链接的项目在肯尼亚启动。M-Pesa 是非洲知名 的移动支付项目。 2013 年 10 月 29 日,加拿大的两家公司(Robocoin 和 Bitcoiniacs)发布了世界上的 第一个比特币 ATM,允许用户在咖啡馆里直接购买和出售比特币。 2014 年 1 月,比特币主网速率超过 10 petahash/ 秒,6 月,主网速率超过 100 petahash/ 秒。 2014 年尼古拉斯·姆罗斯(Nicholas Mross)执导的纪录片《比特币的崛起》(The Rise and Rise of Bitcoin)上映,纪录片采访了在比特币增长过程中扮演重要角色的公司 和个人。纪录片获得了同年苏黎世电影节的最佳纪录片提名。 2015 年 2 月,接受比特币的商业组织超过十万家。 2015 年 10 月,Unicode 组织收到一份提议,建议把比特币的标志( )加入 Unicode 字符集。 2016 年 1 月,主网速率超过 1 exahash/ 秒。 2016 年 3 月,日本内阁认为像比特币这样的虚拟现金具备跟真实世界货币一样的功能。 2016 年 9 月,世界范围内的比特币 ATM 数量比 18 个月前翻了一倍,达到 771 台。 2016 年,比特币激起了学术界更大的兴趣,当年一共有 3 580 篇学术文章被收录。 作为对比,2009 年有 83 篇,2012 年有 424 篇。 2017 年,比特币得到了更多的法律上的支持,日本通过立法,接受比特币为合法的 支付工具。 19  第 1章 区块链概要 2017 年 6 月,比特币标志( )正式加入 Unicode 字符集。 2019 年 9 月,纽约证交所的拥有者洲际交易所开始交易比特币期货。 1.15 比特币的设计取舍 1.15.1 区块链 比特币使用的是区块链中的公链技术,其中存储了每一笔比特币的转账记录,可以 理解为一个公开的账本。要参与到比特币网络中的每一个节点,需要运行专门的比特币 客户端,从而成为比特币区块链中的一个节点。每个节点都可以存储比特币账本的一份 独立拷贝。 当比特币网络中发生了转账(用户 1 转账 n 枚比特币给用户 2),每个网络节点收到 转账记录,都可以验证这一笔转账,然后加入到自己本地备份的账本记录中,之后再把 账本广播给网络中的其他节点,最终实现转账记录被广播给网络中的所有节点。在比特 币中,转账记录并不是每条转账记录都立即同步,而是每隔十分钟,一组记录被打包在 一起广播。一组打包的记录正好就是区块链中的一个区块。 1.15.2 共识算法 正如前面所说,比特币网络中的所有节点都会接收到一组转账记录(一个区块), 然后把这个区块更新到本地的账本记录中。这里就有一个问题,由于各节点处于分布式 网络中,有可能不同的节点收到不同的记录,如果节点都随意增加记录,那么整个比特 币网络中的记录就无法保持一致。为了保持记录的一致,那么必须确认哪个区块被优先 写入,也就是需要以某一个节点的操作为准。但如果人为规定以某个节点为准,就意味 着这个节点比其他节点更权威,相当于变成了一个中心节点,那么去中心化的优势就荡 然无存。区块链的分布式共识算法就是设计用来解决这个问题。共识算法能够让区块链 中的节点认同某一个节点的记录,同时这个认同并不是固定某一个节点,而是区块链中 的所有节点都有可能获得这个权利。 区块链应用开发指南:业务场景剖析与实战 20 比特币使用的共识算法叫作 PoW 共识机制,全称是 Proof of Word,中文翻译为“工 作量证明”。PoW 机制是 1997 年由亚当·巴克(Adam Back)发明的,主要是为了解决 垃圾邮件泛滥的问题。主要思路是邮件接收者不是任意接受别人的邮件,在一次有效的 邮件发送接收过程中,发送者需要计算一个难题,然后把这个难题的答案同时发送给接 收者,接受者先验证这个答案是否有效,有效的话才接收邮件。 可以看出,PoW 中最重要的就是计算一个难题。这个难题需要具有一个特点,那就 是计算出这个难题的答案比较困难,而验证这个难题却比较简单。因为如果验证和计算 一样复杂的话,那发送方和接收方的成本就是一致的。从经济上来说,成本一致也就很 难实现防止恶意攻击的目的。 关于计算困难但验证容易的问题,我们可以举一个现实中的例子。比如 323 由哪两 个数(要求每个数都大于 1)相乘得到?这个问题的计算就比较复杂,必须一个数字一个 数字地去试,相反,验证这个问题很简单,直接把对方给的两个数字相乘,然后看结果 是不是 323 就可以,一次乘法就出结果。(注:答案是 19 和 17,并且答案唯一。) 比特币就使用了这种机制,所有节点要记录一个新的区块,需要计算一个非常复杂 的问题,先算出答案的节点就获得了记录新区块的权力,其他节点都会使用这个节点的 记录。虽然理论上也有可能其他的节点在同一时间计算出答案,但在实际运行中,这个 概率可以小到忽略不计,事实上比特币运行这么多年,证明了这个机制是非常稳定安全的。 1.15.3 比特币中的交易 我们每个人的银行账户都有一个账户余额的概念,可以直接知道账户中有多少钱。 发生转账的时候,转出则导致账户余额变少,转入则导致账户余额变多。比特币网络和 传统的银行记账不太一样,比特币的每一笔交易记录的是转账数量,具体来说,是从一 个或多个账户转账到一个或多个账户。比特币的区块链数据库中存储的就是这样的一笔 一笔的转账记录。如果需要知道一个账户的余额,那么就把所有转入这个账户的比特币 数量减去所有转出的比特币数量即可。 在比特币转账的时候,有一个传统的银行账户余额系统没有出现过的问题。由于一 个账户里没有余额,所以一个账户发起转账的时候,区块链数据中只记录有这个账户的 转入记录。我们没办法像传统银行一样,直接基于一个余额扣掉转出数量即可。这时候 21  第 1章 区块链概要 我们只能说要把这个账户中的某几条转入记录一起转出去。这就遇到一个问题,几个转 入记录的数量不会正好等于转出数量,通常都是多于转出数量。比特币解决这个问题的 办法非常巧妙,由于比特币支持一笔转账中转给多个账户,所以可以在转出账户中加上 自己的这个地址,把多余的部分再转回来。等于自己给自己发起了一笔转账。 举个例子,A 账户历史上一共收到过三笔转账,分别是 2 枚、2 枚、3 枚比特币。这 时候账户 A 需要转账给 B 账户 6 枚比特币。处理方法就是以这三笔转账记录为依据,生 成一个新的转账记录,这个转账记录中有两条信息,一条是给 B 账户 6 枚比特币,一条 是给 A 账户也就是是自己 1 枚比特币。 由于转账记录不是简单的一对一,所以比特币的转账记录使用了一个类似 Foth 编程 语言的脚本语言,可以写简单的逻辑。Foth 语言是查尔斯·H. 摩尔(Charles H. Moore) 在 1970 年发明的,比特币在这里借用了这种语言的语法。 1.15.4 比特币的供应模式 到现在为止,我们讲的都是比特币网络如何处理转账等操作。但我们还需要知道比 特币最初从哪里来。传统的金融体系是由各国的中央银行发币。如果比特币也是由一个 机构来发出的话,那么就和它去中心化的思路相悖。答案非常巧妙,比特币其实是凭空 产生的。 前面已提到,比特币网络中每一个节点都可以把新的区块加到比特币的区块链数据 库中,然后通过共识算法来决定以谁为主。这就可以理解为一种争夺记账权的概念。在 某个节点打包区块加入到区块链数据库中的时候,它可以额外生成一个转账记录,就是 给自己的账户凭空转一定数量的比特币作为奖励,比特币就这样凭空产生出来。 解决了比特币产生的问题,我们又面临比特币数量膨胀的问题,如果节点可以给自 己转任意数量的比特币,那比特币岂不是可以源源不断地产生?这里的解决方案是通过 程序验证的思路。前面我们提到,网络中的节点会收到其他节点的区块记录,在收到记 录之后都会做一次合法性验证,只有通过验证才会加到本地的记录中,如果记录不合法, 节点就会拒绝接收。而这个合法性验证已经被写到了比特币的客户端中,所以也就等于 固化了比特币的生成协议。 具体来说,最初的时候,在生成区块的时候,可以给自己转账 50 个比特币。之后每 区块链应用开发指南:业务场景剖析与实战 22 大约 4 年减半(具体说,是每隔 210 000 个区块减半,由于每个区块的生成时间大概是 10 分钟,所以大致是 4 年的时间)。最终,奖励会变为 0,到时候比特币的总量非常接 近 2100 万枚。这就是大家一直说的比特币总量是确定的由来。 1.15.5 去中心化与中心化 从比特币的特点上来看,比特币是去中心化的,主要特点如下: 比特币不需要任何权威机构的背书。 比特币是点对点网络,没有中心化的服务器存在。 比特币的账本数据存储在区块链中,而区块链本身存储在千千万万的节点中,没 有一个中心化的存储设备。 比特币账本数据面向所有人公开,任何人都可以把它存储到自己的机器中。 比特币网络没有管理员,比特币网络中的所有节点共同管理比特币网络,维持比 特币网络的运行。 任何人都可以成为比特币网络的一个节点,从而具备和别人同等的管理权。 比特币网络中任何节点都是同等地位,它们都可能获得下一个区块的记账权。 由于比特币可能由任意节点凭空产生,所以比特币的供应也是去中心化的。 和传统银行不同,任何人都可以生成任意数量的比特币账户,不需要任何中心化 机构的审批。 任何人都可以在比特币网络中发起转账,不需要任何中心化机构的审批。 但是,在现实中,比特币也有一些中心化的倾向,由于奖励机制是凭空生成的比特 币,所以比特币网络中的节点争夺记账权的欲望通常比较强大,结果造成了大量的节点 联合起来,共同去争夺记账权。当联盟中的任意节点获得记账权,就会把得到的比特币 和联盟中的其他节点分享。因此,这种联盟造成了比特币网络节点某种程度上的中心化。 这种联盟就是我们经常听说的比特币矿场。 1.15.6 可替换性 可替换性是指同单位的物品是否能被同等对待。比如一块钱和另一个一块钱是一模 23  第 1章 区块链概要 一样的,都可以用在同样的地方,从使用上看,就是这两个一块钱可以任意替换而不影 响结果。我们大致可以认为比特币具有可替换性,因为在大部分的使用场景下,不同的 比特币可以被同等对待。 但是也有研究指出,比特币并没有和传统货币一样的可替换性,原因在于交易历史。 由于比特币的区块链数据库中存储着所有比特币的交易历史,所以我们可以追踪任意一 枚比特币的交易历史。这也就意味着每枚比特币都被赋予了独一无二的交易历史数据。 这时候就会出现一些特殊的场景,比如某个收藏家只收藏没有发生过交易的比特币,并 且愿意为此付出更高的价格,这就让比特币不具备可替换性。 当然,大部分时候我们并不关心交易历史,所以总的来说比特币还是具备基本的可 替换性,但是我们也需要知道,在一些特殊环境下,不同的比特币会有完全不同的表现。