上一节课我们明白了什么是区块链,了解了区块链的关键特性和技术等内容,这节课我们将深入了解区块链的技术架构,系统学习区块链平台的6个层次:数据层、网络层、共识层、合约层、应用层、接口层,另外通常还有客户端为用户提供访问界面。
让区块链不再是遥不可及的技术概念,每周三和周五我们都会免费推出《迅雷链精品课:从入门到实践》的区块链实战课程,深入浅出地讲解区块链的各方面技术内容,包括区块链主流框架、区块数据存储技术、迅雷链多链架构、共识算法和智能合约、密码学应用等。
在学习课程的时候,你也可以免费领取BaaS平台为期一个月的试用机会,免费使用高性能区块链服务(点击文末的原文链接即可免费领取)。课程学习结合实践操作,让你迅速成为区块链大牛! *以下为第二课的内容~
第二课 区块链核心技术框架 1. 区块链作为一种架构
区块链技术是整合了P2P网络、共识算法、密码学、存储技术等一系列技术构造的一个分布式系统。其中所使用的每一项技术都并不是新技术, 数字货币的概念在80年代就出现了,而第一代PoW(Proof of Work)算法是在90年代发明出来主要用于做反垃圾邮件的,甚至“带时间戳的区块构成的链条”这个核心数据结构,也并不是原创的,而是基于Scott Stornetta和Stuart Haber在90年代提出的“加密数字时间戳”的发明。
只是在比特币出现之前,没有人能提出一个软件架构,将所有这些技术元素整合起来,构造一个完整的去中心化的系统,而这才是比特币及其衍生的区块链技术能成功的原因。现在人们所说的区块链,并不是指某种数据结构或存储技术,而是指一种能提供机器信任的技术架构。 2. 区块链技术架构图
目前区块链技术架构均源自比特币的底层技术,从最早在区块链技术引入图灵完备的智能合约的以太坊,到广泛用于联盟链的Hyperledger Fabric,从多线程架构的EOS,再到同构多链架构的迅雷链,尽管它们在具体实现上各有不同,但在整体架构上却存在很多共同的特点。如下图所示,区块链平台整体上可划分为6个层次:数据层、网络层、共识层、合约层、应用层、接口层,另外通常还有客户端为用户提供访问界面。

区块链架构图
2.1. 数据层
常见的区块链存储方式有:文件存储、关系型数据库(如MySQL)和非关系型数据库(如LevelDB)。需要保存的数据包括公共数据(例如:交易数据、事务数据、状态数据等)和本地的私有数据等。区块链的带时间戳的哈希链式结构借鉴了Scott Stornetta和Stuart Haber在90年代提出的“加密数字时间戳”的发明,他们设计了基于文档时间戳的数字公证服务以证明各类电子文档的创建时间,基本方案是使用时间戳服务对新建文档的时间及之前的文档的哈希指针进行签名,形成一个基于时间戳的签名链,链中的时间戳无法篡改;此外他们还提出用Merkle树组织文档等方案。他们最初的设计需要一个第三方信任机构的存在,要求信任一个外部渠道,但这样的第三方信任机构仍然可以篡改记录。他们无法解决这个问题,因此他们决定去证明人们无法解决这个问题。Stornetta在访谈中说到:“有趣的是,最终在证明我们无法解决这个问题的过程中,我们找到了如何去解决问题的方法。最根本的解决办法是——既然我们始终要去信任某个人或者机构来确保数字文档的准确性,那就去信任每一个人,也就是说,让世界上的每一个人都是数字文档记录的见证者。……我们设想去构建一个网络,能够让所有的数字记录在被创造的时候就传输到每一个用户那里,这样就没有人可以篡改这个记录。这就是最早区块链概念的诞生。”区块链中,每个区块包含区块头和区块体两部分,区块体存放交易数据,区块头存放Merkle根、前块哈希、时间戳等数据。基于块内交易数据哈希生成的Merkle根实现了块内交易数据的不可篡改性与简单支付验证; 基于前一区块内容生成的前块哈希将孤立的区块链接在一起,形成了区块链;时间戳表明了该区块的生成时间。在数据模型的设计上,比特币首创了基于交易的数据模型,简称UTXO(Unspent Transaction Output,未花费交易输出),每笔交易由表明交易来源的输入和表明交易去向的输出组成,所有交易通过输入与输出链接在一起,使得每一笔交易都可追溯;以太坊与Hyperledger Fabric需要支持功能丰富的通用应用,因此采用了基于账户的模型,可基于账户快速查询到当前余额或状态。
网络层负责节点间通信,包括网络节点发现、数据收发等功能。区块链系统由众多节点通过网络连接构成, 特别是在公有链系统中,节点数量往往很大。因此,区块链平台通常选择完全分布式且可容忍单点故障的P2P协议作为网络传输协议,任何时刻每个节点也可自由加入或退出网络,每个节点需要通过网络发现协议发现邻居节点,并与邻居节点建立链路,网络节点具有平等、自治、分布等特性,所有节点以扁平拓扑结构相互连通,不存在任何中心化的权威节点和层级结构,每个节点均拥有路由发现、广播交易、广播区块、发现新节点等功能。比特币的P2P网络基于TCP协议实现,节点发现使用DNS种子节点(DNS-seed),比特币社区维护着一些域名用于节点发现,此外还硬编码一些seed-node,当所有的种子节点全失效时,全节点会尝试连接这些种子节点。以太坊的P2P网络采用了 Kademlia(简称 Kad) 算法实现,所以以太坊节点的节点发现是基于 UDP 的,找到节点以后会切换到 TCP 协议上进行数据传输。Hyperledger Fabric是用gRPC来做P2P通信的,而gRPC又基于HTTP/2,因此也可以说Hyperledger Fabric是基于HTTP/2协议的。比特币和以太坊均使用了 UPnP (Universal Plug and Play)协议做NAT穿透,而Hyperledger Fabric是主要面向联盟链和私有链场景,不支持NAT穿透。共识层运行某种共识算法,负责协调保证全网节点数据记录的一致性。在中心化的分布式系统中,所有节点都由单一机构管理维护,可以认为所有节点都是可信的,共识算法只需支持崩溃容错(Crash Fault-Tolerant, CFT)的情况。CFT已有一些经典的解决算法,包括Paxos、Raft及其变种等。对于去中心化的区块链系统,其网络节点可由任何一方提供 ,部分节点可能是恶意节点,因此需要支持拜占庭容错(Byzantine Fault Tolerance, BFT)。区块链常用的BFT容错的共识算法有工作量证明算法(Proof of Work, PoW)、权益证明算法(Proof of Stake, PoS)和委托权益证明算法(Delegated Proof of Stake, DPoS)、实用拜占庭容错(Practical Byzantine Fault Tolerance , PBFT)等。根据算法采取的策略,BFT类算法可以被分为两大类,即概率一致性算法和绝对一致性算法。其中PoW、PoS、DPoS是概率一致性算法,PBFT是绝对一致性算法。比特币和以太坊采用PoW机制,Hyperledger Fabric采用PBFT算法。 合约层负责智能合约的执行。智能合约(Smart Contract)是一段在区块链上存储、验证和执行的代码。智能合约的概念早在1994由密码学家Nick Szabo年提出,但由于缺少可信的执行环境,智能合约并没有被应用到实际产业中。比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境。将合约以数字化的形式写入区块链中,因区块链的特性,数据将无法删除、修改,只能新增,整个过程透明可跟踪,保证了历史的可追溯性; 因行为将被永久记录,可极大程度避免恶意行为对合约正常执行的干扰;区块链的去中心化特性,避免了中心化因素的影响,提高智能合约在成本效率方面的优势;当满足合约内容时,将自动启动智能合约的代码,既避免了手动过程,同时又保障了发行者无法违约;由区块链自带的共识算法构建出一套状态机系统,使得智能合约能够安全、高效地运行,并保证结果可信任。比特币脚本是非图灵完备的,指令类型简单、实现功能有限;以太坊首先提供了图灵完备的智能合约编程语言Solidity与执行环境EVM(Ethereum Virtual Machine);Hyperledger Fabric的智能合约称为chaincode,其运行在docker容器中,可以用go与java等通用编程语言编写智能合约。应用层负责适配区块链的各类应用场景,为用户提供各种服务和应用。比特币平台上的应用主要是基于比特币的数据货币的发行和流通。以太坊以图灵完备的智能合约为基础,除了数字货币交易外,还支持去中心化应用(Decentralized Application, Dapp), Dapp是由javascript构建的Web前端应用,通过Json-RPC与运行在以太坊节点上的智能合约进行通信。Hyperledger Fabric主要面向联盟链和私有链应用,并没有提供数字货币,基于其docker的智能合约可实现包括数字货币在内的各种业务应用。接口层用于完成功能模块的封装,为客户端应用提供简洁的访问接口。比特币节点提供了基于JSON RPC接口,可供应用开发者使用各种开发语言例如JavaScript、Java、Python等访问比特币系统,包括访问区块和交易信息、节点控制、网络相关、交易发起等功能。以太坊为客户端提供JSON RPC接口,客户端可以使用go、python、javascript等编程语言与区块链服务的RPC端口进行通信。其中,go语言可以直接使用go-ethereum项目的rpc库与以太坊通信、python语言有web3.py库、javascript语言下有web3.js库。web3库是以太坊提供的一个对JSON RPC接口的封装库,提供了一系列与区块链交互的对象和函数,包括查看网络状态,查看本地账户、查看交易和区块、发送交易、编译/部署智能合约、调用智能合约等,其中最重要的就是与智能合约交互的API。Hyperledger Fabric提供gRPC或REST接口,客户端可基于Go、Java、Python等语言构建,并与Hyperledger Fabric节点上的智能合约通信客户端为用户提供友好易操作的访问界面。比特币和以太坊都存在多平台、多样化的客户端,第三方客户端的开发非常活跃。
3. 3层划分模型
以太坊社区在可扩展性问题的讨论中,将扩展方案分类为“Layer 1层改进”和“Layer 2层改进”。Layer 1层改进是指通过对区块链本身的改进来提升它的可扩展性,即On-Chain链上改进,Layer 1层包括区块链的数据层、网络层、共识层和合约层;Layer 2层改进是指不影响区块链本身,通过其他方式来实现可扩展性的提升,即Off-Chain(链下)的改进, Layer 2层包括区块链的应用层、接口层等。为了架构的完整性,我们将基础设施也纳入考虑,添加一个Layer 0层,最后划分如下图所示:
区块链的3层模型图

进一步划分为3层模型的好处是可以让我们讨论方案时可以使用Layer 1这样的术语来表示相互关联的那几个分层。Layer 0层是基础设施层,包括网络基础设施、存储基础设施和计算基础设施,与IaaS |