点击查看第 2 章
点击查看第 3 章
使用GO语言进行公链开发实践
郑东旭、杨明珠、潘英玉、翟猛 编
第 1 章
公链设计架构
1.1 概述
区块链技术起源于中本聪2008年的论文《比特币:一种点对点的电子现金系统》,区块链从中本聪的比特币诞生。
区块链是一种分布式账本,是一种以去中心化和无需信任的方式集体维护的可靠数据库。分布式账本是一种在网络成员之间共享、复制和同步的数据库,用于记录网络参与者之间的交易,例如资产或数据的交换。
区块链分类如下。
本书以国内优秀项目比原链(Bytom)为蓝本,为读者讲解公链技术的完整实现。如果说比特币代表区块链1.0时代,以太坊以其图灵完备性代表区块链2.0时代,那么比原链则基于UTXO模型支持更丰富的功能(图灵完备的智能合约、多资产管理、新型PoW共识算法等),代表区块链2.5时代。比原链是一个开源项目,整个项目基于GO语言开发,代码托管于()。
本书基于比原链1.0.5版本源码编写,读者无需担心本书为何不采用比特币或以太坊作为例子。俗话说“有道而无术,则道可求术,有术而无道,则道可求术”。作者认为,大部分区块链技术实现大同小异,目前主要区别在于共识算法(PoW、PoS)和模型(UTXO或模型)。比原链作为国内优秀的公链,代码量不多,清晰的源码结构让程序员和区块链爱好者的学习成本并不高,从中我们可以学到很多东西,比如GO语言编程与应用、公链设计架构、公链运行原理等。
本章的主要内容包括:
1.2 公链整体架构
Bytom是一个具有智能合约功能的开源公有区块链平台,Bytom公链设计架构如图1-1所示。
1.3 比原链模块功能
我们将从图1-1所示的比原链整体架构中抽取出各个模块,进行逐一分析和解释。
1.3.1 用户交互层
Bytom的用户交互层如图1-2所示。
1. 客户端
它是一个在命令行下建立用户与进程通信的RPC客户端,在已经部署了Bytom的机器上,用户可以使用可执行文件向Bytom发起多个管理请求。
相应的请求被发送,请求被进程接收并处理,进程完整的生命周期结束。
2.bytom-
bytom-类似功能,都是发送请求与进程建立通信。用户可以通过网页以更友好的方式与进程进行交互。
在已经部署了bytom的机器上,bytom-功能会默认开启,无需手动部署bytom-。其实用户可以通过传入的参数来决定是否开启或者关闭bytom-功能,比如传入--web.即可关闭该功能。项目源码地址: 。
1.3.2 接口层
Bytom链路的接口层架构如图1-3所示。
API是比原链非常重要的一个功能,是比原链架构中专门用来服务的,它的作用是接收、处理和响应用户、矿池相关的请求,默认开启9888端口,API主要功能如下:
API服务过程中,API在监听的地址上接收或者bytom请求,对于每个请求,API都会新建一个路由项来处理该请求,首先API读取请求内容,解析请求;其次匹配对应的路由项;第三调用路由项的回调函数进行处理;最后处理完请求后对请求进行响应。
1.3.3 内核层
1. 区块和交易管理
内核层包括区块和交易管理、智能合约、虚拟机。
Bytom核心层架构如图1-4所示。
内核层是比原链中最重要的功能,代码量约占总量的54%。
区块链的基本结构是链表,链表由区块串联而成,一个区块链包含成千上万个区块,一个区块包含一个或多个交易,比原链内核层的一个重要功能就是对区块和交易进行管理。
当网络中的节点接收到新的有效区块时,该节点会对新区块进行验证。当新区块在现有的主链中找不到其父区块时,新区块会进入孤块管理,等待父区块。如果从现有的主链中找到父区块,则会将其加入到主链中。
当网络中的节点收到一笔交易时,会验证该交易的合法性,验证成功后,该交易被放入交易池中,等待矿工打包。一笔交易从发送到完成的整个生命周期需要经过以下过程:
1)A通过钱包向B发送一笔交易,交易金额为100 BTM。
2)该交易被广播到P2P网络。
3)矿工收到交易信息,并验证交易的合法性。
4)打包交易,将多笔交易组合成一个新的区块。
5)新区块被添加到现有的区块链中。
6)交易完成,成为区块链的一部分。
2.智能合约
传统意义上的合约就是现实生活中的契约,区块链中的智能合约是为了以数字化的方式方便验证合约谈判或合约规则履行而设计的计算机协议,本质上是一段运行在虚拟机上的“程序代码”,无需第三方可信机构即可执行可信交易。
智能合约有两个特点:可追溯、不可逆。
智能合约是比原链最核心也是最重要的部分,在接下来的章节中,我们会详细介绍智能合约模型(主流模型:UTXO模型、账户模型)、运行原理、BVM虚拟机工作机制,并深入到代码中去理解区块链上的智能合约如何在没有第三方信任机构的情况下进行可信交易。
3.虚拟机
比原链虚拟机(BVM)是构建在区块链上的代码运行环境,主要功能是处理比原链系统中的智能合约。BVM是比原链中非常重要的一部分,在智能合约的存储、执行和验证等方面发挥着重要作用。
BVM使用语言编写智能合约。Bytom是一个点对点网络,每个节点都运行BVM并执行相同的指令。BVM在沙盒中运行,与主区块链完全分离。
1.3.4 钱包层
Bytom钱包层架构如图1-5所示。
钱包可以比喻为我们日常生活中的保险箱,我们关心的是如何打开保险箱(钥匙)以及里面存放的资产(UTXO)。比原链钱包层主要负责存储钥匙、管理地址、维护UTXO信息以及处理交易的生成和签名,并提供钱包和交易相关的接口。
比原链的交易发送分为三个步骤:
1)构建:根据交易的输入和输出构建交易数据。
2)签名:使用私钥对每一笔交易输入进行签名。
3): 将交易提交到网络广播,等待打包。
1.3.5 共识层
Bytom共识层架构如图1-6所示。
共识层用于实现全网数据的一致性。区块链是一种去中心化的账本,需要全网对账本达成共识。共识层对区块和交易进行验证,确保新区块在所有节点上以相同的方式生成。简单来说,共识机制就是通过某种方式竞争“记账权”,获得记账权的节点可以把自己生成的区块追加到现有区块链的末尾,其他节点可以按照同样的规则对这些区块进行验证和接受,丢弃那些无法通过验证的区块。
常见的共识机制包括工作量证明(PoW)、权益证明(PoS)等。
PoW共识机制以复杂的数学问题作为共识机制,目前普遍的共识机制是“哈希函数的结果小于某个特定值”,由于哈希函数的特性,无法通过函数值反向计算出自变量,因此必须通过枚举的方式进行计算,直到找到符合要求的哈希值。这个过程需要进行大量的计算。PoW的复杂性决定了任何人都需要付出大量的计算才能生成新的区块,如果想篡改一个现有的区块,需要付出比网络上所有其他节点加起来还要多的算力。PoW的优缺点如表1-1所示。
PoS 是另一种共识机制,要求节点锁定一定比例的加密货币,并根据锁定金额、时长等因素分配记账权。PoS 通常不需要大量计算,因此比 PoW 更快、更高效。PoS 的优缺点如表 1-2 所示。
目前仍有少数加密数字货币采用其他共识机制,但 PoW 和 PoS 是主流共识机制。由于比原链的特性,结合比原链倡导的“算力就是权力”(一种确定的利益分配方式,只要算力高或者拥有较多算力的,就拥有一定的控制权),需要多个节点达成强共识,对全局一致性和去中心化要求较高,需要在一定程度上牺牲效率。因此比原链选择了 PoW 作为公链的共识机制。
1.3.6 数据存储层
Bytom数据存储层架构如图1-7所示。
Bytom将所有的链上地址、资产交易等信息都存储在数据存储层。数据存储层分为两部分:第一部分是缓存,大部分查询都会先从缓存中读取,以减少磁盘的IO压力;第二部分是持久化存储,当在缓存中找不到数据时,会从持久化存储中读取,并将副本添加到缓存中。
Bytom默认使用数据库作为持久化存储,是一套高效的链值数据库,为单进程服务,多个进程无法同时读写一个数据库,同一时刻只能有一个进程或者一个进程以多并发的方式读写。
默认情况下,数据存放在--home参数下的数据目录中,以(即MacOS)平台为例,默认数据存放在$HOME//Bytom/data中。
该数据库包括:
1.3.7 P2P分布式网络
Bytom分布式网络层架构如图1-8所示。
比原链作为一个去中心化的分布式系统,底层个体之间的通信机制对于整个系统的稳定运行至关重要。个体之间的数据同步、状态更新依赖于整个网络各个个体之间的通信机制。比原链的网络通信基于P2P通信协议,并根据自身业务的特殊性进行了专门设计。比原链的P2P分布式网络主要分为节点发现、区块同步、交易同步和快速广播四个部分。
1. 节点发现
P2P节点发现主要解决新加入的节点如何接入区块链网络。新加入的节点能够被网络中其他节点快速感知;同时节点本身也能获取其他节点的信息,并与其进行通信、数据交换。比原链中的节点发现采用算法实现的节点发现机制。算法实现是一个结构化的P2P覆盖网络,每个节点都有一个全网唯一标识,称为Node ID。Node ID以去中心化的方式存储在每个节点中。被发现的节点存储在k个桶(k-)中,每个节点只与距离自己最近的n个节点进行连接。这样形成的网络拓扑如下图1-9所示。
2. 区块同步
区块链是一种去中心化的分布式记账系统,所有节点都需要保存完整的区块信息。当一个节点加入网络时,它首先要做的就是同步区块,构建完整的区块链。新加入的节点需要与网络中的其他节点进行同步,从高度为1的区块开始,一直同步到当前整个网络的最高高度,这样才能构建出完整的区块链。
当节点开启快速功能时,同步节点每次最多可以同步 1 到 128 个区块(从当前高度到下一个高度的区块)。除了快速同步算法,还有普通同步算法。节点主要使用普通同步算法来同步网络中较新的区块信息。普通同步算法主要是为了保证节点中的区块信息不过时,能够及时同步新挖出的区块。
普通同步与快速同步的区别在于,快速同步使用get-来批量获取区块,并使用验证来避免PoW工作量验证,可以大大提高速度;普通同步每次只能获取一个区块。
快速同步和普通同步可以解决不同场景的需求。快速同步使得节点能够快速重建区块链信息并快速加入网络,这是通过广播新区块来实现的。当不满足快速同步条件时,则使用普通同步,每次同步时都请求一个区块。
3. 交易同步
为了保证交易的安全性,比原网络要求在每一笔交易完成后,节点需要将交易信息同步给网络中的其他节点,这个过程就叫做交易同步。交易同步验证的目的是为了保证安全性,当交易同步到网络中其他节点时,节点会验证交易是否合法,只有交易合法,节点才会将交易写入自己的交易池中。另一方面,同步交易可以将交易同步到更多的节点,交易也可以更快地被打包成区块。
4. 快速广播
为了保证交易信息能够及时得到确认并提交到主链,比原链提供了快速广播功能,对于收到的新区块和新的交易信息,网络中的节点会快速将其广播给当前节点所认识的其他节点。
1.4 编译、部署和应用
Bytom的安装方式有多种,本书将从源码分析的角度引导读者了解其架构,因此安装过程将以源码编译的方式进行介绍。
1. 源码编译与部署
1)下载源代码:
$ git clone $/src//bytom
2)切换到1.0.5版本:
$ cd $/src//bytom
$ git fetch v1.0.5
$ git v1.0.5
3)编译源代码:
$ make
$ make
4)初始化:
$ cd ./cmd/
$./ 初始化——
目前,Bytom支持三种网络,其区别在于:
5)启动流程:
$./节点
$ ps -ef | grep
501 52318 449 0 2:00PM 0:00.85 ./节点
$./net-info
"": 36714,
"": 36714,
““: 真的,
““: 错误的,
"": "",
“”:10,
““: 错误的,
“”:“1.0.5+”
当我们执行ps -ef命令看到该进程的时候,说明该进程已经处于运行状态了。使用Get Node 可以看到我们已经成功运行了该进程。
首次启动时,默认不开启挖矿功能,此时获取P2P网络中与种子节点相邻的对等节点,建立握手连接,同步区块。我们将在第10章深入分析P2P网络底层工作原理。
2.源代码目录结构
Bytom源码目录如下:
$ 树 -L 1
═── 代币管理
│ │ 账户管理
═── api API接口管理
═── 资产管理
═── 交易打包、签名、查询等。
═── cmd主入口文件
═── 公共图书馆
═── 节点配置文件
═── 共识相关模块
═── 密码库
═── 页面管理
═── 数据库管理
│ │ 文档
═── 协议相关编解码库
═── env 环境变量管理
═── 智能合约语言编译器
═── 错误和异常管理
═── math 数学计算相关库
═── 库,用于收集 API 请求相关的指标
═── 挖矿模块
═── net API使用的HTTP基础库
═── 网络同步管理
═──node当前节点管理模块,环境初始化等。
═── p2p分布式网络管理模块
═── 核心数据结构,包括区块、交易、bvm虚拟机等。
│ │ 测试单元测试
═── 单元测试工具包
│ │ 工具工具包
─ 第三方库
│ 版本
└── 钱包管理
3.启动挖矿模式
启动挖矿模式命令如下:
$./set-true
Bytom默认是关闭挖矿模式的,开启挖矿模式有两种方式,第一种是使用命令行交互,设置参数为true,此时会通过RPC协议与进程交互,开启挖矿模式。若要关闭挖矿模式,则指定set-为false即可。第二种方式是使用页面开启挖矿参数,请自行了解。
4. 其他语言SDK介绍
比原链技术社区提供了不同语言的SDK,如下图所示:
PHP SDK:
Java SDK:
Java SDK:
SDK:
节点 SDK:
1.5 本章总结
本章对比原链的整体架构进行了分层分析,比原链的整体架构图展示了一条完整公链的技术架构,然后通过安装部署的方式介绍了比原链的基础知识。
通过研究公链架构,我们可以从顶层宏观的角度全面了解公链的设计、功能、价值等诸多方面。