bitshares程序结构

第1章 【绪言】
1.1 编写目的
本文档主要讲述bitshare总体程序结构,包括用户界面及后台服务,然后再对bitshares核心部分进行再一步讲解。关于bitshares的主要功能的具体实现会在其它文档进行深入讲解。

1.2 术语定义
graphene:石墨烯网络,是Cryptonomex公司开发的新型区块链,包括底层P2P网络连接机制以及维护的区块链数据结构,拥有比传统比特币以太坊更快的确认速度,最高可达到每秒上百万TPS,区别于比特币以太坊的POW共识机制,这种区块链采用DPOS共识机制。
DPOS共识机制:由所有该链的token的持有者,选举出一定数量的节点,然后由这些节点协作,轮流进行记账。以bitshares为例,bitshares网络投票选出21个区块生产者(见证人节点)。然后由这21个区块生产者,相互协作,按照一定的顺序,轮流进行记账。出块间隔为3秒一个大区块。此外,这21个区块生产者,不仅记账,还需要提供bitshares全链所需要的计算和网络资源(包括CPU、内存、存储容量等等)。
见证人节点:bitshares网络中通过投票选出来一系列节点,其中同一时刻只有21个节点拥有打包区块的权利,同时有一系列的后备见证人节点,当这21个节点出现违规操作或因故障无法产生区块时,可以通过投票将其撤换,后备见证人节点将依次提升加入到这21个节点队列中。

第2章 【技术原理】
首先看bitshares简单部署示意图:

node1到node4是区块链的见证人节点,此图只是示例,bitshares下的见证人节点目前是21个,这些结点互相连接成为一个P2P网络,cli_wallet是命令行客户端,通过websocket + JSON API与任意见证人节点相连,web_wallet是网页客户端,通过同一套API与任意见证节点相连。客户端调用相应的接口产生各种交易数据,交易数据在各个见证人节点中进行广播。

第3章 【代码结构】
3.1 整体结构
bitshares所有代码都在https://github.com/bitshares下,可以看到这里面有多个工程,每个工程代码及功能如下:
bitshares-core:见证人节点和命令行钱包,C代码,基于graphene区块链,这个工程是bitshares的核心部分。
bitshares-fc:bitshares-core依赖的一个C
工具库,封装了p2p网络相关实现,webserive相关实现,以及一些文件读写、序列化、哈希操作等一系列工具类。
bitshares-ui: 网页钱包,Javascript代码,基于React和Webpack,即大多数用户使用的UI界面。
bitshares-js: bitshares-ui依赖的js库,包括两大底层功能,读取区块链数据,使用账号签署交易。
bitsharesjs-ws: bitshares-js依赖的js库,封装了与见证节点进行通信的细节,为bitshares-js提供API。
核心代码依赖关系图如下:

3.2 bitshares-core结构
下面再讲解一下bitshares-core相关一些代码,当下载下来bitshares-core代码后,可以看到程序最重要的是以下两个目录:libraries/ 和 progams/。
programs/ 目录组织比较简单, 一目了然. 不仅如此, 代码量也少, 基本上每个程序就一个 main.cpp 源文件,其中最重要的是如下两个:
witness_node:见证人结点程序,bitshares网络上的见证人结点就是编译此代码。
cli_wallet:命令行钱包,当使用命令行方式操作用户账户时,使用此程序。
libraries/ 是bitshares-core所有代码的核心部分,代码结构如下:

可以看到bitshares核心代码是分模块进行组织,结构清晰,下面讲一个各模块功能:
app:提供核心功能,主要是所有的rpc 服务,包括操作数据库,p2p网络连接,主要实现最上层的调度功能。
chain:区块链的核心代码,包括了一系列关键数据结构的定义及相关实现,比如block、transaction、operation、asset、account、witness…除此之外,还包括这样核心数据的操作代码,比如block_database 和 database。 block_database 负责操作区块数据, database 实际上是继承了 db::object_database 类, 同时负责操作数据索引以及调用 block_database 操作区块数据。
db:数据库的基础定义,包括数据库的基类和索引的基类。
egenesis:生成链相关的配置文件。
net:graphene网络所有实现,包括各结点之间的发现、连接、消息通讯等。
plugins:将bitshares基础功能进行分类,组织成一个个plugin,由program下面的程序进行加载调用,比如见证人结点(witness_node)所有相关功能实现,将其封装为一个plugin,而program下的witness只加载witness这个plugin并启动即可实现见证人结点功能。
wallet:bitshares所有具体业务逻辑的所有实现,包括创建账户、转账、订单相关、签名相关业务逻辑,作为app和数据库的中间层,app层提供rpc服务,并将接收到的请求解析调用wallet层进行具体业务处理,然后wallet层调用database层进行数据入库上链等相关操作。

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now