《迅雷链精品课》第二课:区块链核心技术框架
上一节课我们明白了什么是区块链,了解了区块链的关键特性和技术等内容,这节课我们将深入了解区块链的技术架构,系统学习区块链平台的 6 个层次:数据层、网络层、共识层、合约层、应用层、接口层,另外通常还有客户端为用户提供访问界面。
在学习课程的时候,你也可以免费领取 BaaS 平台为期一个月的试用机会,免费使用高性能区块链服务(点击链接即可免费领取https://blockchain.xunlei.com/baas/try.html)。课程学习结合实践操作,让你迅速成为区块链大牛!
*以下为第二课的内容~
第二课 区块链核心技术框架
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 根实现了块内交易数据的不可篡改性与简单支付验证; 基于前一区块内容生成的前块哈希将孤立的区块链接在一起,形成了区块链;时间戳表明了该区块的生成时间。
2.2. 网络层
网络层负责节点间通信,包括网络节点发现、数据收发等功能。区块链系统由众多节点通过网络连接构成, 特别是在公有链系统中,节点数量往往很大。因此,区块链平台通常选择完全分布式且可容忍单点故障的 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 穿透。
2.3. 共识层
共识层运行某种共识算法,负责协调保证全网节点数据记录的一致性。
在中心化的分布式系统中,所有节点都由单一机构管理维护,可以认为所有节点都是可信的,共识算法只需支持崩溃容错(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 算法。
2.4. 合约层
合约层负责智能合约的执行。智能合约(Smart Contract)是一段在区块链上存储、验证和执行的代码。
智能合约的概念早在 1994 由密码学家 Nick Szabo 年提出,但由于缺少可信的执行环境,智能合约并没有被应用到实际产业中。比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境。
将合约以数字化的形式写入区块链中,因区块链的特性,数据将无法删除、修改,只能新增,整个过程透明可跟踪,保证了历史的可追溯性; 因行为将被永久记录,可极大程度避免恶意行为对合约正常执行的干扰;区块链的去中心化特性,避免了中心化因素的影响,提高智能合约在成本效率方面的优势;当满足合约内容时,将自动启动智能合约的代码,既避免了手动过程,同时又保障了发行者无法违约;由区块链自带的共识算法构建出一套状态机系统,使得智能合约能够安全、高效地运行,并保证结果可信任。
比特币脚本是非图灵完备的,指令类型简单、实现功能有限;以太坊首先提供了图灵完备的智能合约编程语言 Solidity 与执行环境 EVM(Ethereum Virtual Machine);Hyperledger Fabric 的智能合约称为 chaincode,其运行在 docker 容器中,可以用 go 与 java 等通用编程语言编写智能合约。
2.5. 应用层
应用层负责适配区块链的各类应用场景,为用户提供各种服务和应用。
比特币平台上的应用主要是基于比特币的数据货币的发行和流通。以太坊以图灵完备的智能合约为基础,除了数字货币交易外,还支持去中心化应用(Decentralized Application, Dapp), Dapp 是由 javascript 构建的 Web 前端应用,通过 Json-RPC 与运行在以太坊节点上的智能合约进行通信。Hyperledger Fabric 主要面向联盟链和私有链应用,并没有提供数字货币,基于其 docker 的智能合约可实现包括数字货币在内的各种业务应用。
2.6. 接口层
接口层用于完成功能模块的封装,为客户端应用提供简洁的访问接口。
比特币节点提供了基于 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 节点上的智能合约通信
2.7. 客户端
客户端为用户提供友好易操作的访问界面。比特币和以太坊都存在多平台、多样化的客户端,第三方客户端的开发非常活跃。
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(Infrastructure as a Service,基础设施即服务)的” 基础设施”的概念一致。在以太坊这样的公链社区通常对 Layer 0 层的改进很少讨论,因为公链的基础设施是去中心化的,无法控制的。而企业构建区块链平台时,则需要自己提供基础设施服务,是可控制的,讨论改进方案时也应该要考虑 Layer 0 层的改进,例如网络拓扑结构改进、网络节点选择、高速网络建设、存储硬件选型、分布式存储方案改进、计算节点的调度等等。
Layer 1 层包括区块链的数据层、网络层、共识层和合约层,这层改进的出发点是账本数据的存储、交易的广播和验证、共识算法的改进、合约性能的改进等。例如以太坊的 sharding 方案,Casper 共识算法、EOS 的 DPoS+aBFT 共识算法、迅雷链的同构多链架构和 DPoA+PBFT 共识算法等,都是 Layer 1 层的改进方案。
Layer 2 层包括区块链的应用层、接口层等,这层的扩展性改进方案有闪电网络、侧链、状态通道、Plasma 等,不影响区块链本身,在公链社区是比较容易实施的方案,但这些链下改进的方案需要引入为人所诟病的中心化的模块。
4. 小结
区块链与其说是一种新技术,不如说是一种新的分布式系统架构,其整合了 P2P 网络、共识算法、密码学、存储技术等一系列已有技术,带来的是大量的新概念、新思维。
以整体架构为脉络,我们可以有针对性的掌握区块链技术的基本知识,也可以此为框架来分析新出现的区块链项目,对其加以研究,识别其关键技术点,考察其是否存在技术创新。
*恭喜完成第二课的学习,第三课我们将分析一些具体的区块链项目的技术架构,从区块链 1.0 的比特币网络,到区块链 2.0 的以太坊、EOS,到区块链 3.0 的 Hyperledger Fabric 和迅雷链。
版权声明: 本文为 InfoQ 作者【迅雷链】的原创文章。
原文链接:【http://xie.infoq.cn/article/da5264c2a738a3e3a2ef5a0cb】。文章转载请联系作者。
评论