3. 六域链底层

3.1 底层核心功能

P2P 通信

P2P 是区块链的核心基础,具有分散化(Decentralization)、扩展性、健壮性、隐私性、高性能等特点。P2P 网络通信的效率对区块链整体性能的影响非常重要,尤其是影响了整个区块链网络的速度。针对物联网中接入六域链的物联网设备和用户,从会话维护、地址确定、通信机制、存储方案等方面进行了深度的优化。通过指定用户端与共识节点的关联物理配置和规模数量,并采用分片处理(sharding)机制和高速网络连接,减轻共识节点的通信、计算和存储负担,改善区块链交易性能,达到针对物联网设备区块化,为日后物联网设备的登记、数字化、认证和安全提供基础保证。

六域链加密算法

信息的加解密是区块链的关键环节,主要是哈希函数和非对称加密两部分算法。

1)哈希函数。目前有 SHA、MD5 等多种算法,还包括算法的串联和并联使用。由于商业应用一般更注重性能问题,所以六域链基础算法以 SHA256 算法为主。

2)非对称加密。包括 RSA、DSA、椭圆曲线算法等,区块链一般使用椭圆曲线算法,包括 ECDSA 和Schnorr,考虑到 Schnorr 签名的验证速度比 ECDSA 签名更快,而且这种签名体积可以更小,并且原生地支持多重签名,这正符合物联网小体积的特性。六域链基于 Schnorr开发了自有的SDSchnorr 算法。其模块化的设计,可替换多种加密算法。由于物联网用户接入的帐户和形式多样性,安全性要求并不一致,所以六域链集合了国密安全算法(SM2椭圆曲线公钥密码算法、SM3密码杂凑算法、SM4分组密码算法)。对底层加密算法库进行了抽象并添加算法的可替换通道,以满足不同物联网应用的安全需求。其中,钱包和地址两个名称在本文档中可互换。

六域链共识算法

共识机制是分布式账本为了保障存储信息的准确性与一致性而设计的一套机制。物联网是一个复杂的综合异构系统,物联网设备涉及的行业广、业务密,通讯协议多种多样,对底层区块链的安全和性能要求高。六域链针对上述特点,开创性地提出了 SDFT 算法,借鉴融合了高一致性的 RAFT 以及高并发的 PBFT,同时解决了安全性、高性能以及信任问题,SDFT 具有以下特点:

  • 从全网验证节点(Validate node)中以 SD-RAFT选举出一个或若干个主节点(Master node)平衡客户端访问的计算负载。主节点在固定时间周期内(10 秒)负责全网新的交易记账请求收集和交易列表的生成。

  • 每个验证节点把客户端发来的交易记账请求向全网广播,主节点将从网络收集到需放在新区块内的交易记账请求排序后存入交易列表,并将该列表向全网广播。

  • 每个验证节点接收到交易列表后,根据排序模拟执行这些列表中的交易请求。所有交易请求执行完后,基于交易结果计算新区块的哈希摘要,并向全网广播。

  • 如果一个验证节点收到3f(f为可容忍出错的SAFT节点数)个其他验证节点发来的哈希摘要都和自己相等,就向全网广播一条 commit 消息,该验证节点就成功确认为该笔交易共识记账节点。

  • 如果一个验证节点收到 3f+1 条 commit 消息后,即可提交新区块及其交易到本地的区块链和状态数据库。

六域链与其他区块链平台的性能比照如下:

区块链平台 共识算法 交易确认时间
比特币 POW 60 分钟
以太坊 POS 17 秒
六域链 SDFT 3~5 秒

底层架构图

六域链底层架构图

3.2 第三方库

加密安全算法库

  • secp256k1 椭圆曲线加密法

椭圆曲线密码是一种公钥密码算法,公钥密码算法最根本的原理是利用信息的不对称性:即掌握私钥的人在整个通信过程中掌握最多的信息,一切的运算对他而言都是没有秘密的。为了让别人能给自己发送加密的信息,私钥拥有者把信息的一部分公开披露,披露的信息记为公钥。

详细见:https://en.bitcoin.it/wiki/Secp256k1

实现及测试程序可参考:https://github.com/bitcoin-core/secp256k1

  • ed25519-donna 数字签名算法

是一个签名和验证的性能都极高的数字签名算法。 一个4核2.4GHz 的 Westmere cpu每秒可以验证 71000 个签名,等价于RSA约3000-bit。签名过程不依赖随机数生成器,不依赖hash函数的防碰撞性,没有时间通道攻击的问题,并且签名很小,只有64字节,公钥也很小,只有32字节,实现及测试程序可参考:https://github.com/floodyberry/ed25519-donna

  • OpenSSL

OpenSSL 是一个安全 套接字层密码库,囊括主要的 密码算法、常用的 密钥和证书封装管理功能及 SSL协议,并提供丰富的应用程序供测试或其它目的使用。

压缩算法库

  • LZ4

最快的压缩和解压速度,单核压缩速度能达到400m/s,单核解压速度能达到1G/s。

项目:http://code.google.com/p/lz4

  • Snappy

是一个用来压缩和解压缩的 C++ 开发包。其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率。Snappy 比 zlib 更快,但文件相对要大 20% 到 100%。

snappy 的前身是Zippy。虽然只是一个数据压缩库,它却被Google用于许多内部项目工程,其中就包括BigTable,MapReduce和RPC。Google宣称这个库本身及其算法做了数据处理速度上的优化,作为代价,并没有考虑输出大小以及和其他类似工具兼容性问题。Snappy特地为64位x86处理器做了优化,在单个Intel Core i7处理器内核上能够达到至少每秒250MB的压缩速率和每秒500MB的解压速率。

如果允许损失一些压缩率的话,那么可以达到更高的压缩速度,虽然生成的压缩文件可能会比其他库的要大上20%至100%,但是,相比其他的压缩库,Snappy却能够在特定的压缩率下拥有惊人的压缩速度,"压缩普通文本文件的速度是其他库的1.5-1.7倍,HTML能达到2-4倍,但是对于JPEG、PNG以及其他的已压缩的数据,压缩速度不会有明显改善"。

Google极力赞扬Snappy的各种优点,Snappy从一开始就被"设计为即便遇到损坏或者恶意的输入文件都不会崩溃",而且被Google在生产环境中用于压缩PB级的数据。其健壮性和稳定程度可见一斑。 Snappy也可以用于和其他压缩库-zlib、LZO、LZF、FastLZ和QuickLZ-做对比测试,前提是你在机器上安装了这些压缩库。Snappy是一个C++的库,你可以在产品中使用,也有一些其他语言的版本,如Haskell、Java、Perl、Python和Ruby。

3. 数据库

  • RocksDB

项目起源于Facebook的一个实验项目,该项目旨在开发一个与快速存储器(尤其是闪存)存储数据性能相当的数据库软件,以应对高负载服务。这是一个c++库,可用于存储键值,可以是任意大小的字节流。它支持原子读和写。 RocksDB具有高度灵活的配置功能,可以通过配置使其运行在各种各样的生产环境,包括纯内存,Flash,硬盘或HDFS。它支持各种压缩算法,并提供了便捷的生产环境维护和调试工具。 RocksDB借鉴了开源项目LevelDB的重要代码和Apache HBase项目的重要思想。最初的代码来源于开源项目leveldb 1.5分叉。它借鉴了了Facebook的代码和思想。

  • NuDB

是只能插入不能删除的Key-Value数据库, 专门针对SSD或同等高IOPS设备的随机读取性能进行了优化,可用在各个平台上。NuDB最常见的应用程序是内容可寻址存储,其中数据的加密摘要被用作密钥。读取性能和内存使用情况与数据库的大小无关。

参考:https://github.com/vinniefalco/NuDB

  • Sqlite

是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,目前已经在很多嵌入式产品中使用了。它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

  • soci

是一个用C++封装的数据库访问库,目前通过"前端(应用程序)/核心/后端(数据库适配)"模式支持firebird,mysql,sqlite3,oracle,postgresql,odbc多种数据库;作为扩展,您也可以自己针对具体不同库或应用编写自定义后端代码。

参考soci:https://github.com/SOCI/soci

4. 基础 C++ 库

  • Boost

Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。

  • Protobuf

Protobuf (Google Protocol Buffer)是一种轻便高效的结构化数据存储格式,与平台、语言无关、可扩展,解析速度快,比对应的XML快约20-100倍。序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10,可用于通讯协议和数据存储等领域。

3.3 源码编译

3.3.1 环境要求

操作系统:Ubuntu 14.04_64、 Ubuntu 16.04_64
CPU:3GHz+ processor with 4 cores 
内存:2G+
硬盘:40G+
编译环境:gcc version 5.4.1
资源限制:
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31449
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31449
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

3.3.2 下载源码

从github上sdchain项目库下载sdchain-core源码

3.3.3 编译源码

(1) 安装依赖包

在sdchaind/Builds/Ubuntu目录下,输入命令:

chmod +x install_boost.sh
chmod +x install_sdchaind_depends_ubuntu.sh

在sdchaind目录下,输入命令:

sudo Builds/Ubuntu/install_sdchaind_depends_ubuntu.sh
sudo Builds/Ubuntu/install_boost.sh

(2) 更改系统配置文件

/etc/profile文件中,添加以下两行:

BOOST_ROOT=/path/to/sdchaind/boost_1_63_0
export BOOST_ROOT

更新配置,输入命令:

source /etc/profile

(3) 编译

在sdchaind目录下,输入命令:

scons

等待10分钟左右,当显示"scons:done building targets"时,编译完成。

(4) 创建配置文件

在/etc/opt目录下创建sdchain文件夹。复制配置文件

cp /sdchaind/doc/sdchaind-example.cfg /etc/opt/sdchain/sdchaind.cfg
cp /sdchaind/doc/validators-example.txt /etc/opt/sdchain/validators.txt

(5) 优化系统配置

vim /etc/security/limits.conf

在文件尾部增加下面两行

* soft nofile 65535
* hard nofile 65535

(6) 测试查看是否编译完成

在sdchaind目录下,输入命令:

./build/sdchaind

(7) 运行sdchaind

在sdchaind目录下,输入命令:

./build/sdchaind -a --start

3.4 节点搭建

3.4.1 环境要求

操作系统:Ubuntu 14.04_64、 Ubuntu 16.04_64
CPU:3GHz+ processor with 4 cores 
内存:2G+
硬盘:40G+
编译环境:gcc version 5.4.1
资源限制:
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31449
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31449
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

3.4.2 软件下载

下载 sdchaind-v0.3.7.tar.gz文件
解压后包含如下文件:

libprotobuf.so.8
libprotobuf.so.8.0.0
libstdc++.so.6
sdchaind
SDChain-Core.cfg 
validators.txt

并下载启动脚本start.sh 3.4.3 安装部署

(1) 部署可执行程序目录

mkdir /usr/local/sdchaind
mv sdchaind /usr/local/sdchaind

(2) 拷贝测试网配置文件到当前目录 (测试网配置文件请在3.4.5 附录获取。)

mv SDChain-Core.cfg /usr/local/sdchaind
mv validators.txt /usr/local/sdchaind

(3) 部署依赖库文件目录

mv libprotobuf.so.8 /usr/lib/x86_64-linux-gnu/libprotobuf.so.8 
mv libstdc++.so.6 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

(4) 告知节点IP
告知 SDChain 服务商节点IP,准许加入 SDChain 测试链。

3.4.4 启动运行

(1) 启动

./start.sh

首次启动会从六域链 SDChain-Core 区块链的其他网络上节点同步初始化历史账本信息。

(2) 验证是否启动成功 执行如下命令:

./sdchaind peers

返回信息中有其它的 SDChain-Core 节点服务器的信息数据,说明已经成功连接上区块链公共服务网络。

3.4.5 附录

(1) 测试网配置文件SDChain-Core.cfg

#服务名称,启动配置文件时sdchaind会从这里查看确认。
[server]
port_rpc
port_rpc_admin_local
port_peer
port_ws_admin_local
port_ws_public
#port_ws_public
#ssl_key = /etc/ssl/private/server.key
#ssl_cert = /etc/ssl/certs/server.crt
#rpc服务 端口号53234 协议http 对网络中所有ip开放访问。
[port_rpc]
port = 53234
ip = 0.0.0.0
admin = 0.0.0.0
protocol = http
#rpc服务 端口号5065 协议http 只对网络中本机开放访问。
[port_rpc_admin_local]
port = 5065
ip = 127.0.0.1
admin = 127.0.0.1
protocol = http
#peer服务 端口号51265 协议peer 对网络中所有ip开放对等节点访问。
[port_peer]
port = 51265
ip = 0.0.0.0
protocol = peer
#ws服务 端口号6066 协议ws 拥有sdchaind的admin权限 对网络中所有ip开放访问。
[port_ws_admin_local]
port = 6066
ip = 0.0.0.0
admin = 0.0.0.0
protocol = ws

#wss服务 端口号5005 协议wss 对网络中所有ip开放访问。
[port_ws_public]
port = 5005
ip = 0.0.0.0
admin = 0.0.0.0
protocol = wss

#-------------------------------------------------------------------------------
#同步全量数据
[ledger_history]
full

#节点大小 "tiny"、"medium"、"large"、"huge"可选。
[node_size]
medium


#节点db配置
[node_db]
type=RocksDB
path=./db/rocksdb
open_files=2000
filter_bits=12
cache_mb=256
file_size_mb=8
file_size_mult=2
#online_delete=2000
advisory_delete=0

#数据存放路径
[database_path]
./db


# debug日志文件存放路径
[debug_logfile]
./debug.log

[sntp_servers]
time.windows.com
time.apple.com
time.nist.gov
pool.ntp.org

# sdchaind网络中其他节点,将和这些节点连接。
[ips]
IP Port
IP Port
IP Port
IP Port
IP Port

# 验证码配置文件路径
[validators_file]
validators.txt

# 日志启动登记配置
# 可选 trace, debug, info, warning, error, fatal。
[rpc_startup]
{ "command": "log_level", "severity": "warn" }

# 配置为1,将验证ssl证书。配置为0,不验证。
[ssl_verify]
0

(2) 测试网配置文件validator.txt

# Public keys of the validators that this sdchaind instance trusts.
[validators]
n9Lr29gUBGiVQ7tBtYF5z5Wf8EdsHTGuzRpHmDU8KQPmsqQUoW3C
n9J81LG8gZBh5heiWahhd5qNM2avBHiznWhdkvk8oZ43b3PFqQq1
n9MuZEPUjiSEQBhSSHFWBMKpFPmFVBRhwx7bscdarsWobb5wxdsZ
n9MJhxuxu2V3zbFH42c3nL9kX7aZa5jU7xoZKu6pCdBVrQKqx4zd
n9KHMR8DyZAL6piTXfiU85a7G9UFGii4TamUWwyVpESLHczph9Ws

3.5 基本命令

命令行选项

General Options:
  -h [ --help ]         Display this message.
  --conf arg            Specify the configuration file.
  --rpc                 Perform rpc command (default).
  --rpc_ip arg          Specify the IP address for RPC command. Format: 
                        <ip-address>[':'<port-number>]
  --rpc_port arg        Specify the port number for RPC command.
  -a [ --standalone ]   Run with no peers.
  -u [ --unittest ] arg Perform unit tests.
  --unittest-arg arg    Supplies argument to unit tests.
  --unittest-log arg    Force unit test log output, even in quiet mode.
  --parameters arg      Specify comma separated parameters.
  -q [ --quiet ]        Reduce diagnotics.
  --quorum arg          Override the minimum validation quorum.
  --silent              No output to the console after startup.
  -v [ --verbose ]      Verbose logging.
  --load                Load the current ledger from the local DB.
  --valid               Consider the initial ledger a valid network ledger.
  --replay              Replay a ledger close.
  --ledger arg          Load the specified ledger and start from .
  --ledgerfile arg      Load the specified ledger file.
  --start               Start from a fresh Ledger.
  --net                 Get the initial ledger from the network.
  --debug               Enable normally suppressed debug logging
  --fg                  Run in the foreground.
  --import              Import an existing node database (specified in the 
                        [import_db] configuration file section) into the 
                        current node database (specified in the [node_db] 
                        configuration file section).
  --version             Display the build version.

基本命令


Commands: 
     获取账号拥有的资产列表
     account_currencies <account> [<ledger>] [strict] 

     获取账号信息
     account_info <account>|<seed>|<pass_phrase>|<key> [<ledger>] [strict]

     获取账号的信任线
     account_lines <account> <account>|"" [<ledger>]

     获取账号的交易历史
     account_tx accountID [ledger_min [ledger_max [limit [offset]]]] [binary] [count] [descending]

     连接其他节点
     connect <ip> [<port>]

     获取共识信息
     consensus_info

     获取节点服务器统计信息
     get_counts

     获取账本信息
     ledger [<id>|current|closed|validated] [full]

     获取最新关闭账本信息
     ledger_closed

     获取当前账本信息
     ledger_current

     在线链上请求账本信息
     ledger_request <ledger>

     查看和设置节点服务器日志级别
     log_level [[<partition>] <severity>]

     获取和其他节点的连接信息
     peers

     获取节点在线状态
     ping

     生成随机种子
     random

     查询节点版本
     version

     获取节点服务器信息
     server_info

     签名
     sign <private_key> <tx_json> [offline]

     多签
     sign_for <signer_address> <signer_private_key> <tx_json> [offline]

     停止节点服务器
     stop

     提交交易请求
     submit <tx_blob>|[<private_key> <tx_json>]

     提交多签交易请求
     submit_multisigned <tx_json>

     查询交易详情
     tx <id>

     创建验证器公私钥
     validation_create [<seed>|<pass_phrase>|<key>]

     创建六域链钱包账户公私钥
     wallet_propose [<passphrase>]

results matching ""

    No results matching ""