2.1 区块链体系结构
狭义的区块链技术一般说的是具体产品应用中的数据存储思想和方式,类似区块链在比特币中的作用。但随着区块链技术和不同场景的深入结合,单独再说到区块链,更多指的是一种数据公开透明、可追溯、不可篡改的产品架构设计。区块链网络通过结合点对点网络设计、加密技术、数据存储技术、分布式算法等多种技术和协议为数据部署和存储赋予了新的定义。基于区块链的不用应用或许采用了不同的机制,但从根本上的框架结构是大同小异的。实际上,现在并没有一个统一的分层体系。下面介绍主流的三种体系结构。
2.1.1 区块链六层体系结构
类比OSI(open system interconnection,开放式系统互联)七层协议的标准,可将区块链系统分为六层,分别是应用层、合约层、激励层、共识层、网络层、数据层,如图2-1所示。
图2-1 区块链六层体系结构
1. 数据层
数据层封装了区块链的底层数据存储和加密技术。每个节点存储的本地区块链副本可以被看成三个级别的分层数据结构,即交易、区块和链。每个级别都需要不同的加密功能来保证数据的完整性和真实性。
交易是区块链的原子数据结构。通常,交易由一组用户或类似智能合约的自主对象创建,完成代币从发送者到指定接收者的转移。为了保证交易记录的完整性,数据层中包含了哈希函数和非对称加密的功能。
哈希函数又称为加密散列函数,能够实现将任意长度的二进制输入映射到唯一固定长度的二进制输出。哈希函数的计算具有不可逆性,根据输出恢复输入是不可行的,同时,两个不同的输入生成相同的输出的概率可以忽略不计。
非对称加密功能主要指的是在交易过程中使用的公钥和私钥,网络中的每个节点都会生成一对公钥和私钥。私钥与数字签名的功能相关联,数字签名通过一串他人无法伪造的字符串证明交易发送方的身份。公钥与数字签名的验证相关,只有通过对应私钥生成的数字签名经过验证后才会返回true。另外,网络中的节点还会通过公钥生成的字符串作为区块链上的永久地址识别自身。
区块是交易记录的任意子集的聚合,只有参与建立网络共识过程的节点才能进行创建,例如在比特币网络中,只有具有矿工功能节点才有资格进行新区块的创建。为了保证交易记录的完整性,同时在共识节点的本地存储中按照指定顺序进行区块间的排序,使用了哈希指针的数据字段保存在区块的数据结构中。为了减少单个交易的存储占比,增大容量,同时防止交易记录被篡改,采用了Merkle树的结构。
区块中的哈希指针字段,又被称作父哈希。将上一区块的哈希码存储为当前区块的指针,区块通过哈希指针实现链状结构。哈希指针不仅可以指向数据存储位置,还可以明晰某个时间戳下该数据的哈希值。一旦数据被篡改,哈希指针能即时反映出来。
Merkle树通过二叉树的形式存储交易数据,每个叶子节点均为交易的哈希编码,非叶子节点是用相连的两个子节点的哈希码的连接标记。所有交易信息最终以Merkle根的形式存储在区块头中,其中,仅存储Merkle根的区块为轻量级形式的,以便于进行快速验证和数据同步。
除了哈希指针、Merkle树和区块头以外,区块中还包含一些辅助数据字段,其定义根据所采用的不同的共识方案的区块生成协议而变化。实际上,区块间呈现的结构主要取决于单个区块保留的前驱哈希指针的数量,区块网络可以为线性链表,也可以是有向无环图。在没有其他说明的情况下,本书的大部分对于区块链的说明均限制在线性链表的情况,这样区块的排列顺序能够得到保障。
2. 网络层
网络层涉及区块链网络中的分布式点对点网络和网络节点连接与网络运转所需要传播和验证机制。
在拜占庭环境中,身份管理机制在确认区块链网络中的节点组织模式上起着关键作用。在无权限限制的公开区块链网络中,节点可以选择自由加入网络并激活网络中的任何可用功能。在没有任何身份鉴别方案的情况下,区块链网络被组织为覆盖P2P网络。但是不同应用场景对于区块链去中心化和开放程度有不同的要求,据此可以将区块链大致分为公有链(public blockchain)、私有链(private blockchain)和联盟链(consortium blockchain)三大类。
公有链去中心化程度最高,各种数字货币如比特币、以太坊均为公有区块链的代表。这种区块链完全不存在把控的中心化机构或者组织,任何人都能够读取链上的数据、参与交易和算力竞争。
私有链的门槛最高,权限完全由某个组织或者机构控制,数据读取和写入受到组织制定规则的严格限定,多适用于特定机构的内部使用。私有链不同于公有链,中心化程度较高,可以理解为一个弱中心化或多中心化的系统。同时由于加入门槛最高,私有链的节点数量被严格控制,较少的节点数量也就代表着更短的交易时间、更高的交易效率和更低的算力竞争成本。
联盟链介于公有链和私有链之间,是一种实现了部分去中心化的系统。从某种意义上来说,联盟链是开放程度更高的私有链,节点的参与和维护对象是线下因为某种利益关系组成的联盟,这些对象共同加入一个相同的网络并维护其运行。
相较之下,联盟链仅允许授权节点启用核心功能,例如参与共识机制或数据传播。根据网络采用的共识协议不同,授权节点被组织在不同的拓扑结构中,可以是全连接的网络,也可以是P2P网络。本书主要关注全开放的公有链。
网络层的主要目标是在节点间引入随机拓扑结构,同时实现区块链更新信息的有效传播和本地同步。大多数现有的区块链网络采用的均为即用型P2P协议,只对拓扑结构和数据通信略加修改。在对等节点发现和拓扑结构维护上,不同的区块链网络采用的方式不同。比特币网络中有一个“种子节点”列表,种子节点指的是长期稳定运行的节点,新节点可以通过与种子节点建立连接来快速发现网络中的其他节点,而这些种子节点可以由比特币客户端维持,也由比特币社区成员维护。在以太坊区块链网络中,采用了基于哈希表的Kademlia协议,通过UDP连接进行对等节点或路由发现。
通常,区块链网络的P2P链路建立在通过握手通信过程建立持久TCP连接的基础上,节点间通过握手协议交换存储区块状态和使用协议、软件版本等信息。在比特币网络中,当建立一个或多个连接之后,新节点将包含自身IP地址的addr信息发送给相邻节点,相邻节点再将该信息转发给它们各自的相邻节点,从而完成新节点的信息被多个节点接收,同时新节点通过getaddr消息要求相邻节点发送已知对等节点的IP信息列表。节点也是通过握手协议与其邻居节点完成交易、新区块信息的交换。区块链中的数据传输通常是基于HTTP的RPC(remote procedure call,远程过程调用)协议实现,其中消息按照JSON协议进行序列化。
3. 共识层
共识层主要指的是不同区块链网络中使用的共识算法,如工作量证明(proof of work,PoW)、权益证明(proof of stake,PoS)、拜占庭容错算法(Byzantine fault tolerance,BFT)。
在分布式系统中,维护基于P2P网络的区块链的规范状态可映射为容错状态机的复制问题。换句话说,区块链的独特的共识协议是由拜占庭将军条件下的网络共识节点实现。在区块链网络中,拜占庭将军问题导致故障节点可能出现的任意行为,拜占庭节点的任意行为除了可能会产生误导其他副本节点,还会产生更大的危害,而不仅仅是宕机失去响应,如恶意攻击(如女巫攻击或双重攻击)、节点错误(如由于软件版本不同导致意外的区块链分叉)和连接错误。如果简单将区块的序列表示区块链的状态,交易得到确认时区块状态发生变化,在拜占庭环境中,只有满足共识协议中的条例内容,才能认为网络达成共识,包括:在公共区块链网络中,被纳入区块的所有交易都需经过诚实节点的最终确认验证;新区块只有被所有诚实节点验证通过才能被纳入区块链中,被全网采纳;被采纳的新区块实现了对网络中现有链条的顺序延长;诚实节点认同验证通过区块中的交易顺序。
共识协议因不同的区块链网络而存在差异。对于公有链,即完全开放的区块链网络,需要对参与共识的节点间进行更为严格的信息同步控制。因此多采用传统拜占庭容错协议提供的所需要的共识属性,瑞波(Ripple)就属于这种协议的实现典型,通过一组节点间的投票机制执行区块链的扩展。此外,PBFT(practical Byzantine fault tolerance,实用拜占庭容错算法)将算法复杂度由指数级降低到多项式级,在保证活性和安全性的前提下提供了(n-1)/3的容错性。
去中心化的区块链网络接纳无身份验证或者显示同步的方案。因此,区块链网络中的共识协议需要拥有更加优异的可扩展性,同时容许虚拟身份和非即时的信息同步。由于去中心化的区块链网络允许任何节点进行新区块的挖掘,更新区块链状态信息,共识层主要目标是确保每个节点都能够遵守“最长链原则”,在任何时间内,只有最长的链条可以被节点接纳为区块链的标准状态。基于投票的BFT协议缺乏身份验证,在对权限有限制的区块链网络中不再适用。与此相反的是,基于激励的共识方案更为合适。
4. 激励层
激励层为刺激区块链网络向平稳运行和发展加入的激励措施,包括发行机制和分配机制。
以比特币为例,为了解决匿名性、延展性等问题,中本聪提出了一种新区块挖掘的算力竞赛模式的去中心化共识协议,称为工作量证明。算力,指的是节点每秒能够进行哈希碰撞的能力。从单个节点的角度来看,共识协议主要定义了三个过程:链的验证和确认过程、链间的比较和扩展过程以及PoW的破解过程。
验证和确认过程会检查区块链中的每个区块是否提供有效的工作量证明解,同时交易之间不存在冲突。当网络中存在两条链时,不同的区块链可以是从对等节点接收的或本地自提的,链间的比较和扩展过程保证了诚实节点仅采用候选区块链中最长链条的提议。PoW解决方案是共识协议的“最主力”部分,通过计算密集的方式定义了新区块的挖掘方式。
破解工作量证明解的方式是节点按照规范构造区块,通过将区块和不同随机数的组合进行区块数据的哈希计算,直至找到满足预条件的随机值。
节点如果想要赢得算力竞赛,就需要尽可能地提高散列查询率,需要更高的经济投入(主要是电力消耗)。但是节点自愿参与共识过程,承担经济损耗是不切实际的。为了网络的正常运行,比特币的共识协议中加入了激励机制:创建新区块的奖励和交易费。
一旦挖掘出新区块,系统就会产生相应数额的比特币以激励节点,比特币也以该种方式实现了去中心化发行。每一个区块中的第一笔交易就记录了系统将比特币交易给成功挖掘出该区块的矿工,称为创币交易或coinbase交易。不同于其他比特币交易需要完备的输入/输出,创币交易没有输入,只包含一个被称作coinbase的输入,用来创建新的比特币。创币交易的输出就是矿工的比特币地址,创币交易将奖励发送到矿工的地址中。这就意味着coinbase的产生就伴随着新的比特币发行。
在中本聪的设定中,比特币实行衰减发行、总量固定,每生成21万个区块产量减半。按照平均每10分钟生成一个新区块,那么每两周大约生成2016个区块,21万个区块的生成时间约为4年。那么,第一个4年每个区块的coinbase奖励50比特币,随后为25比特币,按规律递减。于2140年挖矿奖励为0,此时全网比特币的总量为2100万个。
实际上,随着挖矿奖励的减少,矿工们的主要收益并不再来源于coinbase奖励,而是来源于验证待广播到全网的交易中的手续费。随着比特币的火爆,比特币网络中的挖矿设备从最初的CPU、GPU到FPGA、ASIC,发展到目前的专业矿机、矿池,算力逐渐被少数矿池掌握,单个矿工独自挖矿的情况几乎不复存在。现在,大多数矿工选择贡献部分算力给矿池,矿池再根据实际贡献情况分配酬劳。
5. 合约层与应用层
合约层是区块链技术的可编程实现,通过各类脚本、算法和智能合约,完成对区块链技术的个人独特改造;应用层指的是建立在底层技术上的区块链的不同应用场景和案例实现。
一般而言,对于区块链相关应用的研究可大致分为两类:在现有区块链协议的框架下对共识协议的研究,以及在区块链共识层之上提供服务。前者通常关注网络的P2P结构,后者的研究主要集中在如何利用区块链网络的特殊性质,即分布式容错性、不可篡改性和隐私保护性,并采用区块链网络来保证各自服务中的特定功能。
比特币作为区块链1.0的典型代表,区块加载账本信息的方式较为单一化,功能集中在货币交易,没有其他更多的功能。以太坊是区块链2.0的代表,增强了脚本功能,创建了一种基于区块链的操作系统式的生态,核心工具就是智能合约,以太坊中的数字货币——以太币更多的是充当支付智能合约的相关运算的结算方式,用户利用以太坊能够实现更多样化的价值创造。
智能合约的概念出现在比特币之前,由尼克·萨博在1996年首次提出,是将条款用计算机语言的形式记录的智能合同,当达到预先设定的条件时,就能自动执行相应的合同条款。以太坊通过将智能合约和区块链的结合,为用户提供了新的去中心化的平台,区块链的结构保证了智能合约的内容可追踪且无法被篡改,智能合约将区块链的特性用更平易近人的方式展示给需求用户。
数十年时间,区块链从1.0进阶到3.0。如果说比特币代表了区块链1.0的可编程货币,区块链将比特币构造成为一种全新的数字支付系统,去中心化、不可篡改等特性让人们可以无障碍地在全网进行数字货币交易,同时保证了交易的安全性和匿名性,这是区块链的起点。智能合约将区块链的应用范围从货币范围扩大到具有合约的其他领域,如权属和征信管理、金融服务、投资管理等,区块链成为可编程分布式信用的核心基础,用以支撑智能合约的实现。随着区块链技术的进一步发展,区块链的应用不再局限于金融领域,扩展到审计、仲裁等社会领域,还包括工业、文化、科学和艺术等多个领域,实现区块链3.0——可编程社会的目标。
2.1.2 区块链四层体系结构
从系统设计的角度来看,区块链网络从下至上可以抽象为四个实现层面,分别是数据与网络组织协议、分布式共识协议、基于分布式虚拟机的自组织框架(如智能合约)和人机交互层面。类比OSI,将区块链网络中层级和相关技术划分为如图2-2所示。
图2-2 区块链四层体系结构
数据组织协议为形成区块链网络中各种独立并维持高安全性的节点提供了多种加密功能,协议同时还定义了节点为防止篡改而对账本信息进行本地存储时,在如交易记录和账户余额等记录间建立关联性加密的方法。从数据表示的角度来看,术语“区块链”的命名多取决于历史原因。在区块链1.0中,以比特币为代表,辅以数字签名的交易记录被随机打包存储为一种防篡改的加密数据结构中,这种结构被称为“区块”。这些区块按照时间顺序组装为区块链,更确切地说,区块间通过哈希指针形成了难以被篡改的线性结构。然而,为了提高网络的处理效率、延展性和安全性,线性的数据结构在不同的应用和场景中被扩展为非线性形式,如树或图,甚至无实际区块。尽管区块的组织形式不同,加密形式的数据为区块链提供了隐私和数据完整性的基础保护功能。对比传统的数据库,它提供了更为高效的链式存储,而不会损害数据的完整性。
另外,网络协议确定了区块链网络的P2P形式,进行路由发现、维持和加密数据的传输/同步。除了建立在P2P连接上进行的可靠数据传输外,共识层为维护区块链网络中数据的排序与其本身的一致性和原创性提供了核心功能。从分布式系统设计的角度上看,共识层也为网络提供了拜占庭容错协议。在点对点网络中,节点间希望就网络区块链的状态信息达成同步和一致,尤其是可能存在与原始数据相冲突的新输入和某些节点的拜占庭行为的情况下,节点各自更新的本地数据仍为相同的。在选择经许可的访问控制方案时,区块链网络通常会采用经过充分研究的拜占庭容错协议,如PBFT(实用拜占庭容错算法),以在经过验证的小组节点之间达成共识。与此相反的是,在开放访问/许可的区块链网络中,概率拜占庭协议是基于包括零知识证明和激励机制设计在内的技术组合实现的一种协议。共识协议依赖于半集中式共识框架和更高的信息传递开销以提供网络的即时共识确认并提高交易处理的吞吐量。然而,无权限的共识机制更适合于对节点的同步和行为进行松散控制的区块链网络。在有限延迟和多数节点为诚实节点的情况下,无权限的共识协议以较低的处理效率为代价明显为网络的可伸缩性提供了更好的支持。
如果能够保证共识协议的健壮性,智能合约能够在分布式VM层上进行顺利部署。简单来说,分布式VM层对区块链网络中的数据组织、信息传播和公式形成的细节进行了抽象。作为较低层协议和应用程序之间的互操作层,VM层将必要的API公开给应用层,就像分布式计算在单个计算机的本地虚拟运行的环境中执行。当启用虚拟机的功能时,网络允许节点以自主运行的程序的形式部署到智能合约的区块链上。另外,通过控制开放的API数量和虚拟机的状态大小,区块链上的智能合约能够调整其图灵完备的水平,从只支持脚本语言的比特币,到图灵完备的以太坊和超级账本。通过图灵完备性,区块链网络能够以分散的方式执行通用计算。也因为如此,区块链网络不仅能够提供分布式、可信数据记录和时间戳服务,还能够提供促进通用的自组织功能。
区块链网络通过其独特的框架和技术体系,适合作为自组织系统的底层支撑,用于管理分布式网络节点之间数据或交易驱动的交互行为。
2.1.3 区块链Web 3.0体系结构
区块链技术是下一代互联网、去中心化网络或Web 3.0的推动力。Web 3.0是一个更加以用户为中心的网络,保留用户对数据、身份和数字资产的完全所有权。Web 3.0也给出了一种区块链体系结构。
1. 从Web 1.0到Web 3.0
Web即万维网,它开创了互联网新时代。Web 1.0用户只能读取数据,浏览的内容取决于网站的编辑人员,就像在图书馆看书一样,用户没有太多的权力,只是消费者。Web 2.0从信息分享发展为信息共建,话语权被下放给普通用户,用户可以编写并读取数据,网站的模式开始强调多样生动,社交媒体和电子商务出现并活跃于人们的日常生活中。Web 2.0彻底改变了社会互动,使信息、商品、服务的生产者和消费者的关系更加紧密。
现行的构建互联网协议多为HTTP和SMTP,这些协议的简单性使得节点无法保存历史或状态信息。对于用户而言,无论使用任何设备连接到互联网,都是全新的第一次使用,没有浏览历史、收藏、保存的设置,则需要重新下载习惯适用的程序。Cookie技术的提出弥补了协议无法存储状态的不足,然而Cookie的问题是,它们是由服务供应商提供的,而非用户创建和控制,用户无法控制哪个供应商为其提供状态信息以及访问状态信息。为了解决这个问题,互联网采用服务器—客户端的集中式服务,用户的所有个人数据基本都存储在具有大量存储空间的计算机中,归属于私人公司。如今,像Google、Facebook、Apple等互联网巨头拥有着其数十亿用户创造的状态数据,而近年来频发的隐私数据泄露表明企业可以用多种方式不动声色地控制用户的生活。
区块链技术的分布式容错性、不可篡改性和隐私保护性为互联网的发展提供了一种新的可能,成为Web 3.0分布式网络的推动力,没有亚马逊、淘宝的线上购物,没有微信、微博、Facebook的社交媒体,区块链将带来真正的数据民主。
Web 3.0将更改集中式系统为分散式网络,没有任何集中服务器,所有数据将分布在整个互联网中,同时对现有互联网的数据基础设施进行重新设置。Web 3.0注重于区块链中的点对点结构,但区块链并不是支撑Web 3.0的唯一技术,它将能够执行Berners-Lee文件,具有语义搜索、个性化数字助理等特征。同时,基于智能应用程序的Web 3.0具有更好的功能体验,是技术和知识的完美结合。表2-1对比了Web 1.0、Web 2.0和Web 3.0之间的变化。
表2-1 Web 1.0、Web 2.0、Web 3.0对比
2. Web 3.0体系结构
对于Web 3.0体系暂时没有一个统一的标准,加密货币对冲基金Multicoin Capital的资本合伙人凯尔·萨马尼对当前Web 3.0的区块链体系结构做了一个全面详细的总结,如图2-3所示。
Web 3.0区块链应用程序体系结构中基础是DApp浏览器,也是大多数Web 3.0体系的顶部。用户通过DApp浏览器访问去中心化应用程序,现在较为流行的DApp浏览器包括用于以太坊的Metamask和Toshi、用于EOS的Scatter。
核心栈需要为DApp的开发人员提供唯一、权威的账本,账本中需要包含所有有效交易的顺序记录,也就是区块链的分布式数据库。P2P层、共识层和状态机层共同作用实现该功能,以太坊的核心协议还将扩展到“分片”。
图2-3 区块链Web 3.0体系结构
凯尔·萨马尼同时标注出了一些非基础链的组件,这些虽然尚未被认为是DApp开发中必不可少的部分,但他坚信这些将成为扩展后核心堆栈的一部分。例如现在很多区块链团队都在进行开发的侧链:比特币中的drivechain和Liquid,以太坊Plasma框架中的Skale;支付和状态信道侧重实现交易的可扩展性,ILP协议用于实现跨链操作的互操作性。然而这些可能会成为未来核心栈功能组件的部分现在的并不成熟,并未形成规模化应用,所以暂时不能被DApp的开发人员使用。
可选组件是指大量“去中心化库”以可选的去中心化组件的形式存在,每组实现一种特定的功能,供DApp的开发人员选择和采用。到目前为止只有少部分已经上线,如Livepeer、0x、Kyber、Storj、Sia、Oraclize和Civic,大多数团队尚未发布能用于生产的工具。库的不成熟从一方面也导致DApp开发的难度增加。
除了凯尔·萨马尼的体系结构总结,Web 3.0还有更为模式化的框架分层。将Web 3.0体系分为五层,从上至下依次为应用层、服务与可选组件层、协议层、网络与传输层以及基础层,如图2-4所示。
图2-4 Web 3.0五层框架
1)应用层
应用层位于架构顶端,包括专有应用和基于通用服务平台的应用,实现了与用户的交互。DApp为用户访问去中心化应用提供了访问入口,应用托管支撑去中心化应用程序的运行,应用将托管在使用SaaS(software as a service,软件即服务)的分布式网络上,应用托管服务通过云存储使得程序可用。
2)服务与可选组件层
服务与可选组件层涵盖了创建和运行DApp层的所有重要工具。例如,数据传输是Web 3.0中的一个重要方面,说明了节点如何通过可靠信息源进行信息的更新,在分布式网络中,数据流显然也是分散的。具体的计算过程集中在线下完成,与链上计算相比,线下计算成本相对更加低廉,更加省时,同时保证了计算值的可信度并确保值不会被恶意篡改。而DAO实现了对不同去中心化应用和服务的管理。状态通道、支付通道都用于解决区块链中的可扩展性问题,这些可扩展性解决方案需要与底层协议相互兼容,才能真正支持分布网络需要的强大的拓扑结构。
3)协议层
协议层包括了不同的共识算法、权限要求、虚拟机等,决定了共识机制和网络的参与方式。区块链通过共识算法确保节点的一致性;侧链是可扩展问题的解决方案之一,但作用并不仅限于此,开发人员还可以在侧链内开发去中心化应用程序,并不会对主链产生影响,但应用程序的有效性却是得到保证的;权限管理是针对开放程度不同的区块链网络设计的,满足公有链、联盟链、私有链的区分要求;虚拟机在以太坊应用程序开发中十分流行。
4)网络与传输层
网络与传输层充当了传输媒介、P2P网络的接口,并决定数据的打包、处理、传输、搜索和接收的方式。RLPx协议是以太坊中的通信协议,主要功能是在节点之间建立并维持通信,并对用户信息间的传输进行了加密;自定义协议满足了用户创建更适应自身需求的协议的要求,创建自定义协议的选项使得整个Web 3.0结构更富创造性;TEE是远离主网络或系统的隔离区域或者服务器,为解决区块链可扩展性问题而增加的系统;区块交付网络可将页面或其他Web内容传送给请求它的用户。
5)基础层
基础层是Web 3.0的生态基础,位于最下层,通过内部基础设施建设或BaaS(blockchain as a service)来控制网络节点,是区块链技术的基本组成单位。