hyperchain v1 - app. · pdf file趣链科技hyperchain运维手册 ... 第3章...

81
趣链科技 Hyperchain 运维手册 趣链科技 Hyperchain 运维手册(V1.22017 趣链科技 版权所有

Upload: tranlien

Post on 06-Feb-2018

298 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

趣链科技 Hyperchain运维手册(V12)

2017 趣链科技 版权所有

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

版本历史

(每次更新填写一个表单)

版本编号 10 编写人 戎佳磊 修改日期 2017年 4月 25日 变更内容 1 创建初始版本 版本编号 11 编写人 黄方蕾 修改日期 2017年 6月 20日 变更内容 1 修改部署步骤 版本编号 12 编写人 黄方蕾 修改日期 2017年 7月 6日 变更内容 1 增加单机部署四个节点脚本

2 增加 peerconfig配置示例 3 增加日志归档详解

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

目录

第 1章 前言 1

11版本申明1

12服务申明1

第 2章 平台部署 2

21上传2

211创建使用用户及文件权限2

212上传部署安装包2

22服务器单节点部署3

221一键部署3

222设置服务器出口流量限制4

223设置 Hyperchain平台及其重启或宕机恢复后自动启动4

224启动4

225重新启动5

226停止5

23单服务器单节点简化部署(测试推荐)5

231国密依赖库配置5

232启动6

233停止6

24单服务器四节点部署(测试推荐)6

241国密依赖库配置6

242部署四节点7

243启动7

244停止8

第 3章 Hyperchain配置文件维护 9

31修改配置9

311peerconfigjson9

312pbftyaml12

313caconfigyaml13

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

314globalyaml14

32节点出口流控配置(投产推荐)17

321网络中心统一调控17

322TC(TrafficControl)服务器端限流配置17

323Nginx转发限流配置18

33版本升级20

34基本功能使用20

341启动20

342重新启动20

343停止21

35版本升级21

第 4章 日志分级及归档方案 22

41日志文件限制22

42日志文件分级23

43日志文件归档23

第 5章 CA证书管理及使用方案 25

51CA证书体系25

511概念25

512CA证书权限体系层次图26

313各 CA证书用途26

52certgen使用说明27

521certgen安装27

321 生成证书 27

322检查证书28

53CA证书签发管理方案29

531CA生成及保管29

532节点 cert签发29

533VP节点 cert文件配置29

534NVP节点 cert文件配置30

第 6章 VP和 NVP节点管理及使用方案 31

61VP节点管理31

611新增 VP节点31

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

612删除 VP节点35

62NVP节点管理35

621新增 NVP节点36

622删除 NVP节点38

63VP与 NVP节点的相互转换38

631NVP转 VP38

632NVP转 VP38

第 7章 合约升级规范 39

71变量定义39

711新增变量定义39

712删除变量定义40

713修改变量定义41

714更改变量定义顺序41

72变量声明42

721新增变量声明42

722删除变量声明43

723修改变量声明44

724更改变量声明顺序44

73函数定义45

731新增函数定义45

732删除函数定义46

733修改函数定义47

734更改函数定义顺序48

74编译合约49

741调用 SDK编译49

742使用 Solc编译器编译49

743合约升级49

第 8章 SDK功能使用 50

81初始化50

811初始化 Hyperchain对象 HyperchainAPI50

812初始化 Hyperchain对象(带路径)51

813初始化 Hyperchain对象(带 APIProperties)51

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

814自动切换节点52

82Transaction相关接口52

821实例化交易52

822交易签名53

823通过交易 hash查询交易54

824查询指定交易中的收据信息54

825查询区块交易数量54

83Contract相关接口55

831部署合约55

Systemoutprintln(handlerresult) 56

832调用合约56

833合约管理57

84Block相关接口57

841取得 新区块信息57

842取得指定区块列表58

843取得指定区块 byhash58

844取得指定区块 bynumber58

85节点相关接口59

851取得节点信息59

852获取当前节点的哈希值59

853根据哈希值删除节点59

854NVP根据 ID值断开与 VP节点的连接60

86返回值解析60

861通用返回值解析(推荐)60

862复杂返回值解析(不推荐)60

87账户相关接口61

871创建账户(加密)61

872创建账户(未加密)61

873创建账户(返回值为 ECPriv)61

874加密明文私钥62

875解密私钥文件返回明文 Json字符串62

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

第 9章 异常处理 63

91网络异常63

911单节点网络异常63

92数据异常63

921重新启动报错 invalidroot63

93共识异常63

931重启后相同区块高度的节点数不超过规定数目63

932Viewchange异常64

933Ignoreduplicatoe异常64

第 10章 产品激活续期 65

101激活65

102续期65

第 11章 联系与反馈 66

111联系方式66

112注意事项66

第 12章 附录 67

121配置文件67

1211caconfigtoml67

1212dbyaml67

1213genesisjson68

1214globalyaml68

1215pbftyaml71

1216peerconfigjson72

1217static_peerjson72

122常见部署需求 peerconfig配置示例73

1221单机部署四个节点73

1222同一网域内的四台服务器各部署一个节点73

1223两个网域内的四台服务器各部署一个节点74

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 2: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

版本历史

(每次更新填写一个表单)

版本编号 10 编写人 戎佳磊 修改日期 2017年 4月 25日 变更内容 1 创建初始版本 版本编号 11 编写人 黄方蕾 修改日期 2017年 6月 20日 变更内容 1 修改部署步骤 版本编号 12 编写人 黄方蕾 修改日期 2017年 7月 6日 变更内容 1 增加单机部署四个节点脚本

2 增加 peerconfig配置示例 3 增加日志归档详解

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

目录

第 1章 前言 1

11版本申明1

12服务申明1

第 2章 平台部署 2

21上传2

211创建使用用户及文件权限2

212上传部署安装包2

22服务器单节点部署3

221一键部署3

222设置服务器出口流量限制4

223设置 Hyperchain平台及其重启或宕机恢复后自动启动4

224启动4

225重新启动5

226停止5

23单服务器单节点简化部署(测试推荐)5

231国密依赖库配置5

232启动6

233停止6

24单服务器四节点部署(测试推荐)6

241国密依赖库配置6

242部署四节点7

243启动7

244停止8

第 3章 Hyperchain配置文件维护 9

31修改配置9

311peerconfigjson9

312pbftyaml12

313caconfigyaml13

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

314globalyaml14

32节点出口流控配置(投产推荐)17

321网络中心统一调控17

322TC(TrafficControl)服务器端限流配置17

323Nginx转发限流配置18

33版本升级20

34基本功能使用20

341启动20

342重新启动20

343停止21

35版本升级21

第 4章 日志分级及归档方案 22

41日志文件限制22

42日志文件分级23

43日志文件归档23

第 5章 CA证书管理及使用方案 25

51CA证书体系25

511概念25

512CA证书权限体系层次图26

313各 CA证书用途26

52certgen使用说明27

521certgen安装27

321 生成证书 27

322检查证书28

53CA证书签发管理方案29

531CA生成及保管29

532节点 cert签发29

533VP节点 cert文件配置29

534NVP节点 cert文件配置30

第 6章 VP和 NVP节点管理及使用方案 31

61VP节点管理31

611新增 VP节点31

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

612删除 VP节点35

62NVP节点管理35

621新增 NVP节点36

622删除 NVP节点38

63VP与 NVP节点的相互转换38

631NVP转 VP38

632NVP转 VP38

第 7章 合约升级规范 39

71变量定义39

711新增变量定义39

712删除变量定义40

713修改变量定义41

714更改变量定义顺序41

72变量声明42

721新增变量声明42

722删除变量声明43

723修改变量声明44

724更改变量声明顺序44

73函数定义45

731新增函数定义45

732删除函数定义46

733修改函数定义47

734更改函数定义顺序48

74编译合约49

741调用 SDK编译49

742使用 Solc编译器编译49

743合约升级49

第 8章 SDK功能使用 50

81初始化50

811初始化 Hyperchain对象 HyperchainAPI50

812初始化 Hyperchain对象(带路径)51

813初始化 Hyperchain对象(带 APIProperties)51

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

814自动切换节点52

82Transaction相关接口52

821实例化交易52

822交易签名53

823通过交易 hash查询交易54

824查询指定交易中的收据信息54

825查询区块交易数量54

83Contract相关接口55

831部署合约55

Systemoutprintln(handlerresult) 56

832调用合约56

833合约管理57

84Block相关接口57

841取得 新区块信息57

842取得指定区块列表58

843取得指定区块 byhash58

844取得指定区块 bynumber58

85节点相关接口59

851取得节点信息59

852获取当前节点的哈希值59

853根据哈希值删除节点59

854NVP根据 ID值断开与 VP节点的连接60

86返回值解析60

861通用返回值解析(推荐)60

862复杂返回值解析(不推荐)60

87账户相关接口61

871创建账户(加密)61

872创建账户(未加密)61

873创建账户(返回值为 ECPriv)61

874加密明文私钥62

875解密私钥文件返回明文 Json字符串62

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

第 9章 异常处理 63

91网络异常63

911单节点网络异常63

92数据异常63

921重新启动报错 invalidroot63

93共识异常63

931重启后相同区块高度的节点数不超过规定数目63

932Viewchange异常64

933Ignoreduplicatoe异常64

第 10章 产品激活续期 65

101激活65

102续期65

第 11章 联系与反馈 66

111联系方式66

112注意事项66

第 12章 附录 67

121配置文件67

1211caconfigtoml67

1212dbyaml67

1213genesisjson68

1214globalyaml68

1215pbftyaml71

1216peerconfigjson72

1217static_peerjson72

122常见部署需求 peerconfig配置示例73

1221单机部署四个节点73

1222同一网域内的四台服务器各部署一个节点73

1223两个网域内的四台服务器各部署一个节点74

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 3: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

目录

第 1章 前言 1

11版本申明1

12服务申明1

第 2章 平台部署 2

21上传2

211创建使用用户及文件权限2

212上传部署安装包2

22服务器单节点部署3

221一键部署3

222设置服务器出口流量限制4

223设置 Hyperchain平台及其重启或宕机恢复后自动启动4

224启动4

225重新启动5

226停止5

23单服务器单节点简化部署(测试推荐)5

231国密依赖库配置5

232启动6

233停止6

24单服务器四节点部署(测试推荐)6

241国密依赖库配置6

242部署四节点7

243启动7

244停止8

第 3章 Hyperchain配置文件维护 9

31修改配置9

311peerconfigjson9

312pbftyaml12

313caconfigyaml13

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

314globalyaml14

32节点出口流控配置(投产推荐)17

321网络中心统一调控17

322TC(TrafficControl)服务器端限流配置17

323Nginx转发限流配置18

33版本升级20

34基本功能使用20

341启动20

342重新启动20

343停止21

35版本升级21

第 4章 日志分级及归档方案 22

41日志文件限制22

42日志文件分级23

43日志文件归档23

第 5章 CA证书管理及使用方案 25

51CA证书体系25

511概念25

512CA证书权限体系层次图26

313各 CA证书用途26

52certgen使用说明27

521certgen安装27

321 生成证书 27

322检查证书28

53CA证书签发管理方案29

531CA生成及保管29

532节点 cert签发29

533VP节点 cert文件配置29

534NVP节点 cert文件配置30

第 6章 VP和 NVP节点管理及使用方案 31

61VP节点管理31

611新增 VP节点31

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

612删除 VP节点35

62NVP节点管理35

621新增 NVP节点36

622删除 NVP节点38

63VP与 NVP节点的相互转换38

631NVP转 VP38

632NVP转 VP38

第 7章 合约升级规范 39

71变量定义39

711新增变量定义39

712删除变量定义40

713修改变量定义41

714更改变量定义顺序41

72变量声明42

721新增变量声明42

722删除变量声明43

723修改变量声明44

724更改变量声明顺序44

73函数定义45

731新增函数定义45

732删除函数定义46

733修改函数定义47

734更改函数定义顺序48

74编译合约49

741调用 SDK编译49

742使用 Solc编译器编译49

743合约升级49

第 8章 SDK功能使用 50

81初始化50

811初始化 Hyperchain对象 HyperchainAPI50

812初始化 Hyperchain对象(带路径)51

813初始化 Hyperchain对象(带 APIProperties)51

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

814自动切换节点52

82Transaction相关接口52

821实例化交易52

822交易签名53

823通过交易 hash查询交易54

824查询指定交易中的收据信息54

825查询区块交易数量54

83Contract相关接口55

831部署合约55

Systemoutprintln(handlerresult) 56

832调用合约56

833合约管理57

84Block相关接口57

841取得 新区块信息57

842取得指定区块列表58

843取得指定区块 byhash58

844取得指定区块 bynumber58

85节点相关接口59

851取得节点信息59

852获取当前节点的哈希值59

853根据哈希值删除节点59

854NVP根据 ID值断开与 VP节点的连接60

86返回值解析60

861通用返回值解析(推荐)60

862复杂返回值解析(不推荐)60

87账户相关接口61

871创建账户(加密)61

872创建账户(未加密)61

873创建账户(返回值为 ECPriv)61

874加密明文私钥62

875解密私钥文件返回明文 Json字符串62

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

第 9章 异常处理 63

91网络异常63

911单节点网络异常63

92数据异常63

921重新启动报错 invalidroot63

93共识异常63

931重启后相同区块高度的节点数不超过规定数目63

932Viewchange异常64

933Ignoreduplicatoe异常64

第 10章 产品激活续期 65

101激活65

102续期65

第 11章 联系与反馈 66

111联系方式66

112注意事项66

第 12章 附录 67

121配置文件67

1211caconfigtoml67

1212dbyaml67

1213genesisjson68

1214globalyaml68

1215pbftyaml71

1216peerconfigjson72

1217static_peerjson72

122常见部署需求 peerconfig配置示例73

1221单机部署四个节点73

1222同一网域内的四台服务器各部署一个节点73

1223两个网域内的四台服务器各部署一个节点74

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 4: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

314globalyaml14

32节点出口流控配置(投产推荐)17

321网络中心统一调控17

322TC(TrafficControl)服务器端限流配置17

323Nginx转发限流配置18

33版本升级20

34基本功能使用20

341启动20

342重新启动20

343停止21

35版本升级21

第 4章 日志分级及归档方案 22

41日志文件限制22

42日志文件分级23

43日志文件归档23

第 5章 CA证书管理及使用方案 25

51CA证书体系25

511概念25

512CA证书权限体系层次图26

313各 CA证书用途26

52certgen使用说明27

521certgen安装27

321 生成证书 27

322检查证书28

53CA证书签发管理方案29

531CA生成及保管29

532节点 cert签发29

533VP节点 cert文件配置29

534NVP节点 cert文件配置30

第 6章 VP和 NVP节点管理及使用方案 31

61VP节点管理31

611新增 VP节点31

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

612删除 VP节点35

62NVP节点管理35

621新增 NVP节点36

622删除 NVP节点38

63VP与 NVP节点的相互转换38

631NVP转 VP38

632NVP转 VP38

第 7章 合约升级规范 39

71变量定义39

711新增变量定义39

712删除变量定义40

713修改变量定义41

714更改变量定义顺序41

72变量声明42

721新增变量声明42

722删除变量声明43

723修改变量声明44

724更改变量声明顺序44

73函数定义45

731新增函数定义45

732删除函数定义46

733修改函数定义47

734更改函数定义顺序48

74编译合约49

741调用 SDK编译49

742使用 Solc编译器编译49

743合约升级49

第 8章 SDK功能使用 50

81初始化50

811初始化 Hyperchain对象 HyperchainAPI50

812初始化 Hyperchain对象(带路径)51

813初始化 Hyperchain对象(带 APIProperties)51

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

814自动切换节点52

82Transaction相关接口52

821实例化交易52

822交易签名53

823通过交易 hash查询交易54

824查询指定交易中的收据信息54

825查询区块交易数量54

83Contract相关接口55

831部署合约55

Systemoutprintln(handlerresult) 56

832调用合约56

833合约管理57

84Block相关接口57

841取得 新区块信息57

842取得指定区块列表58

843取得指定区块 byhash58

844取得指定区块 bynumber58

85节点相关接口59

851取得节点信息59

852获取当前节点的哈希值59

853根据哈希值删除节点59

854NVP根据 ID值断开与 VP节点的连接60

86返回值解析60

861通用返回值解析(推荐)60

862复杂返回值解析(不推荐)60

87账户相关接口61

871创建账户(加密)61

872创建账户(未加密)61

873创建账户(返回值为 ECPriv)61

874加密明文私钥62

875解密私钥文件返回明文 Json字符串62

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

第 9章 异常处理 63

91网络异常63

911单节点网络异常63

92数据异常63

921重新启动报错 invalidroot63

93共识异常63

931重启后相同区块高度的节点数不超过规定数目63

932Viewchange异常64

933Ignoreduplicatoe异常64

第 10章 产品激活续期 65

101激活65

102续期65

第 11章 联系与反馈 66

111联系方式66

112注意事项66

第 12章 附录 67

121配置文件67

1211caconfigtoml67

1212dbyaml67

1213genesisjson68

1214globalyaml68

1215pbftyaml71

1216peerconfigjson72

1217static_peerjson72

122常见部署需求 peerconfig配置示例73

1221单机部署四个节点73

1222同一网域内的四台服务器各部署一个节点73

1223两个网域内的四台服务器各部署一个节点74

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 5: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

612删除 VP节点35

62NVP节点管理35

621新增 NVP节点36

622删除 NVP节点38

63VP与 NVP节点的相互转换38

631NVP转 VP38

632NVP转 VP38

第 7章 合约升级规范 39

71变量定义39

711新增变量定义39

712删除变量定义40

713修改变量定义41

714更改变量定义顺序41

72变量声明42

721新增变量声明42

722删除变量声明43

723修改变量声明44

724更改变量声明顺序44

73函数定义45

731新增函数定义45

732删除函数定义46

733修改函数定义47

734更改函数定义顺序48

74编译合约49

741调用 SDK编译49

742使用 Solc编译器编译49

743合约升级49

第 8章 SDK功能使用 50

81初始化50

811初始化 Hyperchain对象 HyperchainAPI50

812初始化 Hyperchain对象(带路径)51

813初始化 Hyperchain对象(带 APIProperties)51

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

814自动切换节点52

82Transaction相关接口52

821实例化交易52

822交易签名53

823通过交易 hash查询交易54

824查询指定交易中的收据信息54

825查询区块交易数量54

83Contract相关接口55

831部署合约55

Systemoutprintln(handlerresult) 56

832调用合约56

833合约管理57

84Block相关接口57

841取得 新区块信息57

842取得指定区块列表58

843取得指定区块 byhash58

844取得指定区块 bynumber58

85节点相关接口59

851取得节点信息59

852获取当前节点的哈希值59

853根据哈希值删除节点59

854NVP根据 ID值断开与 VP节点的连接60

86返回值解析60

861通用返回值解析(推荐)60

862复杂返回值解析(不推荐)60

87账户相关接口61

871创建账户(加密)61

872创建账户(未加密)61

873创建账户(返回值为 ECPriv)61

874加密明文私钥62

875解密私钥文件返回明文 Json字符串62

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

第 9章 异常处理 63

91网络异常63

911单节点网络异常63

92数据异常63

921重新启动报错 invalidroot63

93共识异常63

931重启后相同区块高度的节点数不超过规定数目63

932Viewchange异常64

933Ignoreduplicatoe异常64

第 10章 产品激活续期 65

101激活65

102续期65

第 11章 联系与反馈 66

111联系方式66

112注意事项66

第 12章 附录 67

121配置文件67

1211caconfigtoml67

1212dbyaml67

1213genesisjson68

1214globalyaml68

1215pbftyaml71

1216peerconfigjson72

1217static_peerjson72

122常见部署需求 peerconfig配置示例73

1221单机部署四个节点73

1222同一网域内的四台服务器各部署一个节点73

1223两个网域内的四台服务器各部署一个节点74

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 6: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

814自动切换节点52

82Transaction相关接口52

821实例化交易52

822交易签名53

823通过交易 hash查询交易54

824查询指定交易中的收据信息54

825查询区块交易数量54

83Contract相关接口55

831部署合约55

Systemoutprintln(handlerresult) 56

832调用合约56

833合约管理57

84Block相关接口57

841取得 新区块信息57

842取得指定区块列表58

843取得指定区块 byhash58

844取得指定区块 bynumber58

85节点相关接口59

851取得节点信息59

852获取当前节点的哈希值59

853根据哈希值删除节点59

854NVP根据 ID值断开与 VP节点的连接60

86返回值解析60

861通用返回值解析(推荐)60

862复杂返回值解析(不推荐)60

87账户相关接口61

871创建账户(加密)61

872创建账户(未加密)61

873创建账户(返回值为 ECPriv)61

874加密明文私钥62

875解密私钥文件返回明文 Json字符串62

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

第 9章 异常处理 63

91网络异常63

911单节点网络异常63

92数据异常63

921重新启动报错 invalidroot63

93共识异常63

931重启后相同区块高度的节点数不超过规定数目63

932Viewchange异常64

933Ignoreduplicatoe异常64

第 10章 产品激活续期 65

101激活65

102续期65

第 11章 联系与反馈 66

111联系方式66

112注意事项66

第 12章 附录 67

121配置文件67

1211caconfigtoml67

1212dbyaml67

1213genesisjson68

1214globalyaml68

1215pbftyaml71

1216peerconfigjson72

1217static_peerjson72

122常见部署需求 peerconfig配置示例73

1221单机部署四个节点73

1222同一网域内的四台服务器各部署一个节点73

1223两个网域内的四台服务器各部署一个节点74

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 7: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有

第 9章 异常处理 63

91网络异常63

911单节点网络异常63

92数据异常63

921重新启动报错 invalidroot63

93共识异常63

931重启后相同区块高度的节点数不超过规定数目63

932Viewchange异常64

933Ignoreduplicatoe异常64

第 10章 产品激活续期 65

101激活65

102续期65

第 11章 联系与反馈 66

111联系方式66

112注意事项66

第 12章 附录 67

121配置文件67

1211caconfigtoml67

1212dbyaml67

1213genesisjson68

1214globalyaml68

1215pbftyaml71

1216peerconfigjson72

1217static_peerjson72

122常见部署需求 peerconfig配置示例73

1221单机部署四个节点73

1222同一网域内的四台服务器各部署一个节点73

1223两个网域内的四台服务器各部署一个节点74

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 8: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 1 页

第1章前言

11 版本申明

本文档著作权归趣链科技单独所有未经趣链科技事先书面许可任何主体

不得以任何形式复制修改抄袭传播全部或部分本文档内容

12 服务申明

本文档意在向客户介绍趣链科技区块链底层平台(国密版)的功能使用说明

您所购买的趣链科技的产品服务的种类服务标准等应由您与趣链科技之间的

商业合同约定除非双方另有约定否则趣链科技对本文档内容不做任何明示

或模式的承诺或保证

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 9: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 2 页

第2章平台部署

21 上传

211 创建使用用户及文件权限

创建平台部署所需的用户例如创建如下用户

用户名hyperchain

密码hyperchain

可用如下命令创建新用户

sudo useradd -m -d homehyperchain -s binbash -k etcskel hyperchain

sudo passwd hyperchain

修改部署路径及数据存放路径的目录权限例如 opthyperchain 及

datahyperchain

sudo chown -R hyperchain opthyperchain

sudo chown -R hyperchain datahyperchain

212 上传部署安装包

将我们向您提供的 Hyperchain 文件包上传至服务器并解压至相应的用户目

录下

scp hyperchaintar hyperchainhyperchain服务器地址~

ssh hyperchainhyperchain服务器地址

cd ~

tar xvf hyperchaintar

cd hyperchain

一个完整的 hyperchain文件包包含以下文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 10: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 3 页

22 服务器单节点部署

221 一键部署

部署前请先确定各配置参数已经配置正确然后进行如下操作

cd ~hyperchain

deploy-localsh

source ~bashrc

Hyperchain 平台默认会安装到opthyperchain 目录下如需更改目录请使

用 -d 目录名 选项如

cd ~hyperchain

deploy-localsh -d opthyperchain

source ~bashrc

部署完成可看到如下信息

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 11: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 4 页

222 设置服务器出口流量限制

root用户运行如下命令可对服务器出口流量进行限制

cd ~hyperchain

toolsscriptstcsh

223 设置 Hyperchain 平台及其重启或宕机恢复后自动启动

可通过如下步骤设置 Hyperchain平台自动启动

bull Suse11系列的服务器

sudo vim etcinitdafterlocal

bull Suse12系列Centos系列Redhat系列的服务器

sudo vim etcrclocal

在文件 后添加如下内容即可开机自动启动 Hyperchain服务

su hyperchain -c opthyperchainscriptsstartsh

如需开机自动加载流控可以在上面的基础上增加如下命令

su - -c opthyperchainscriptstcsh

224 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 12: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 5 页

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

225 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

226 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

23 单服务器单节点简化部署(测试推荐)

某个节点如果不想通过用户系统服务的方式启动 hyperchain而是想手动启

动 hyperchain进程可以进入 hyperchain目录按照以下描述执行启动

231 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 13: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 6 页

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-simpleenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

232 启动

启动可用文件里提供的脚本也可直接输入命令行

cd ~

cd hyperchain

local-simplestartsh 或者 hyperchain gtamp devnull amp

233 停止

如果想停止该 hyperchain进程可以执行以下命令

local-simplestopsh 或者 pkill -9 hyperchain

24 单服务器四节点部署(测试推荐)

当利用 Hyperchain 平台做一些简单测试时如果服务器资源不足可以选择

在一台机器上部署四个节点用户可以按照以下描述执行启动

241 国密依赖库配置

hyperchain的国密特性需要系统体统如下两个依赖库

我们将之放到 hyperchainconfiglib目录下

目前我们可以通过运行以下脚本保证 hyperchain正常运行

local-4-nodesenvsh -d homehyperchainhyperchainconfiglib

source ~bashrc

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 14: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 7 页

242 部署四节点

部署四个节点可以执行以下命令-d选项为设置部署目录示例如下

cd ~

cd hyperchain

local-4-nodesdeploysh -d homehyperchainapp

部署完成之后可看到如下则表示部署成功

而指定部署目录则生成如下目录结构

243 启动

启动可用文件里提供的脚本

cd ~

cd app

startsh

如看到类似如下日志则表示四个节点都启动成功用户可以对平台开始测试

及使用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 15: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 8 页

244 停止

如果想停止该 hyperchain进程可以执行以下命令

stopsh 或者 pkill -9 hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 16: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 9 页

第3章Hyperchain 配置文件维护

Hyperchain安装包的 config目录如下所示

31 修改配置

Hyperchain共有 7个配置文件您需要在使用 hyperchain服务之前根据您的

需求及环境修改部分配置文件在本节中将着重向您介绍较为重要的几个可修改

的配置项剩余配置项的含义及配置方法详情可见附录

311 peerconfigjson

peerconfigjson是 Hyperchain节点的网络配置文件其中记录了当前节点的

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 17: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 10 页

启动方式启动身份区块链网络节点数目以及每个节点的网络配置信息您在

使用之前必须确保所有的网络配置正确且每个配置的端口是对外开放的

以机构 A和机构 B的部署各部署两个节点为例机构 A局域网(hyperchain-

1)内的两个节点通过内网相连机构 B局域网(hyperchain-2)内的两个节点通

过内网相连它们的内外网 ip如下 机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

则机构 A的 node1的网络配置示例如下所示 self is_reconnectfalse is_origintrue is_vptrue node_id1 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] introducer id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 18: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 11 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

创世节点节点初次启动时前三项一次为 falsetruetrueintroduce可不用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 19: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 12 页

改动是新增节点的配置项nodes配置的是全网的连接项domain为节点在跟

不同域的节点的连接时使用的不同 ip(default为必配域一般填写所有节点都可

链接的 ip)domain指明选取 address中那个 ip进行链接port为节点间的 grpc

连接端口rpc_port为节点对外提供的 jsonrpc端口

更详细的信息可以查询附录进行更多的配置修改

312 pbftyaml

pbftyaml 中记录了所有 PBFT 算法涉及的配置项包括参与共识的节点个

数异常情况超时时长设置区块容量区块产生时间等等默认的 pbft配置信

息如下所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts timeout How long to wait for N-f responses after send negotiate view negoview 6s How long to wait before recovery finished(This is for release12) recovery 15s How long to wait before first request should come firstrequest 30s Primary send a pre-prepare if there are pending requests although batchsize isnt reached yet batch 500ms How long may a request(transaction batch) take between reception and execution must be greater than the batch timeout

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 20: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 13 页

request 3s How long may a validate (transaction batch) process will take by local Validation validate 2s Primary send it to inform aliveness must be greater than request timeout nullrequest 4s How long may a view change take viewchange 4s How long to wait for a view change quorum before resending (the same) view change resendviewchange 8s How long to clean out-of-data view change message cleanviewchange 30s How long may a update-n take update 4s

我们推荐您将 batchsize设置为 100batchtime设置为 500ms使得系统拥有

较高的交易处理能力较低的交易处理时延当然您也可以根据本身的需求修改

系统区块链节点数 小的合理值为 4您可以根据自身的需求进行修改只

有创世节点需要对之进行准确配置新增节点只需要填写 4即可(新增节点会通

过共识得到系统的节点数量)

由于一些异常情况超时时长(timeout)与共识算法的正确性密切相关因此

我们不建议您对这部分内容进行修改

313 caconfigyaml

caconfigyaml中记录了 CA权限验证相关的配置信息一份默认的配置信息

如下所示 CA amp CERT configs this config prepare for ca amp cert module toml config file is batter than yaml this config will never change by hyperchain please ensure the file not end with the `` (slash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 21: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 14 页

[ecert] ca = configcertecaca cert = configcertecertcert priv = configcertecertpriv [rcert] if you do not have rcert leave this item blank ca = configcertrcaca cert = configcertrcertcert priv = configcertrcertpriv the tls cert supply the transport layer security [tlscert] ca = configcerttlscerttlscaca cert = configcerttlscerttls_peer1cert priv = configcerttlscerttls_peer1priv serverhostoverride = hyperchaincn [check] check the ecert and rcert signature during the connect progress certsign = true check the tcert during the request process tcert = true check the ercert and rcert ercert = true [gm] use sm4 or not sm4 = true

可以根据系统的所需的安全性建议选择开启或关闭 CA权限控制开启方

式为将 certsigntcertercert值全部设置为 true

314 globalyaml

在该配置文件中记录了剩余的一些配置项包括输出日志等级输出日志文

件的路径是否开启流量控制等 Data storage path config Note please DONOT add a slash `` in the end of directory path this relative path is relative to the hyperchain binary execute file path global

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 22: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 15 页

data storage config account keystoredir buildkeystore keynodesdir buildkeynodes dbConfig configdbyaml structure state hyperstate two available options rawstate or hyperstate version blockversion 12 transactionversion 12 configs configs caconfig configcaconfigtoml peers configlocal_peerconfigjson genesis configgenesisjson static_peers configstatic_peersjson pbft configpbftyaml license configLICENSE replicainfo interval 500s enable false ratelimit enable true txRatePeak 100 txFillRate 05ms contractRatePeak 100 contractFillRate 05ms buckettree global globalDataNodeCacheSize 10000 globalDataNodeCacheLength 20 state size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 23: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 16 页

storage size 1000003 levelGroup 5 bucketCacheSize 100000 dataNodeCacheSize 10000 hmpublickey N 14315727801779002117 Nsquare 204940062494628260128356353732290481689 G 90976693534933209671098397317966944738726332459523400324197777885595356310417 sync_chain batch 50 interval 1m exitflag false security enabletls false enablesymmetrical false connection retryTimeLimit 6 retryTimeout 10s recoveryTimeLimit 5 recoveryTimeout 5s keepAliveTimeLimit 3 keepAliveInterval 3s config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 24: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 17 页

loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

其中 logs 表示日志相关的配置选项您可以通过修改 logsdumpfile 来控制

是否将输出日志重定向至日志文件中我们推荐您开启日志重定向在

logsmodule 中您可以按照模块分别配置各个模块的日志等级我们推荐您所有

模块的日志等级设置为 NOTICE

您可以修改 globalconfigsratelimitenable的值来控制是否开启流量控制建

议根据测试的 tps进行流控设置控制参数详见附录

32 节点出口流控配置(投产推荐)

一般来说由于 hyperchain 平台的 tps 比较稳定流量根据 tps 也处于稳定

状态但是例如节点宕机落后和增节点等特殊情况下的 recovery行为会向其他节

点区块为了避免公网共享带宽环境下不影响其他应用程序的带宽占用情况可

根据需要对限制节点带宽推荐以下三种流控方法

321 网络中心统一调控

可由各机构的网络中心进行调控配置由于各家机构策略不一不做详述

可咨询各家机构的网络运维工作人员

322 TC(Traffic Control)服务器端限流配置

对于应用服务器来说报文分组从输入网卡(入口)接收进来经过路由的

查找以确定是发给本机的还是需要转发的如果是转发的则会从输出网卡

(出口)发出网络流量的控制通常发生在输出网卡处一般说来由于我们无

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 25: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 18 页

法控制自己网络之外的设备入口处的流量控制相对较难因此我们这里处理的

流量控制一般指出口处的流量控制

tcsh配置文件详解 tc qdisc del dev eth0 root 2gt devnull gt devnull 删除原有的 tc规则 tc qdisc add dev eth0 root handle 1 htb 为网卡 eth0创建 htb根队列 tc class add dev eth0 parent 1 classid 11 htb rate 100mbit ceil 100mbit 为根队列创建子队列 11分配带宽 100M tc class add dev eth0 parent 11 classid 110 htb rate 10mbit ceil 10mbit 为 11队列创建子队列 110分配带宽 10M tc qdisc add dev eth0 parent 110 sfq perturb 10 防止一个段内的 ip占用整个宽带 tc filter add dev eth0 protocol ip parent 1 prio 1 u32 match ip dst 102000016 flowid 11 为跟队列添加优先级为 1的过滤器使得发往 10200xxxxxx的包转到 11队列 tc filter add dev eth0 protocol ip parent 1 prio 2 u32 match ip dst 00000 flowid 110 为跟队列添加优先级为 2过滤器使得发往所有 ip的包都转到 110队列

tcsh 的具体使用步骤和配置服务器重启自动生效等内容请参见本文档的

222及 223小节需要注意的是tcsh的相关命令都需要 root权限

323 Nginx 转发限流配置

由于各家机构对节点服务器带宽要求不尽相同可能需要 nginx做统一的转

发限流我们目前提供 nginx安装包及三个脚本startshstopshreloadsh可

通过这三个脚本满足基本 nginx配置需求

我们继续以在 311提到的两家机构为例假设 A机构需要使用 nginx做限

流转发的话则为如下情况 机构 A(hyperchain-1) node11721601(内)port6665 node21721602(内)port6666 nginx1721603(内)115200101(外) 机构 B(hyperchain-2) node310200101(内)118180101(外)port8001 node410200102(内)118180102(外)port8001

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 26: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 19 页

则可编辑 nginxconfnginxconf如下 stream server node1 listen 6665 proxy_pass 17216016665 server node1-node3 listen 8003 proxy_pass 1181801018001 proxy_upload_rate 500k server node1-node2 listen 8004 proxy_pass 1181801028001 proxy_upload_rate 500k server node2 listen 6666 proxy_pass 17216036665 server node2-node3 listen 8013 proxy_pass 1181801018001 proxy_upload_rate 500k server node2-node4 listen 8014 proxy_pass 1181801028001 proxy_upload_rate 500k

需要注意的是如果通过 nginx 节点间已经建立好长连接这时如果修改

poxy_upload_rate将不能通过 reloadsh生效所以务必配置好 nginx启动后

再启动 hyperchain平台

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 27: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 20 页

33 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

34 基本功能使用

341 启动

启动某个节点的 hyperchain执行步骤如下

hyperchain start

查看 hyperchain的日志日志路径默认为

~hyperchainbuildlogs

若日志显示如下信息即表示节点都连上hyperchain 平台部署启动完成

342 重新启动

重启某个节点的 hyperchain执行步骤如下

hyperchain restart

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 28: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 21 页

343 停止

停止某个节点的 hyperchain执行步骤如下

hyperchain stop

35 版本升级

若您需要进行 hyperchain的版本升级只需要通过以下步骤即可

停止 hyperchain服务

hyperchain stop

替换可执行文件及需要修改的配置文件

重新启动 hyperchain服务

hyperchain start

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 29: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 22 页

第4章日志分级及归档方案

globalyaml的 后一部分为关于日志的配置

config logs level by module CRITICAL ERROR WARNING NOTICE INFO DEBUG high lt------------- log level -------gt low logs dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB logsdir buildlogs default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

41 日志文件限制

dump the log file or not dumpfile true newLogFileInterval 24h Valid time units are ns us (or micros) ms s m h such as 300ms 2h45m max_log_size 200mb mb kb split_start_stop_log false debug and normal mode now true only for CEB

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 30: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 23 页

bull dumpfile参数选择是否要生成日志文件

bull newLogFileInterval 可配置日志生成间隔一般选择 24h可根据具体需求

更改

bull max_log_size可配置日志文件大小上限和 newLogFileInterval配合任意目

标达成即会切分日志

bull split_start_stop_log 则可选择是否将每次启动的日志文件进行启动日志和运

行日志的区分

42 日志文件分级

default loglevel for all modules which can be override by module level log setting loglevel NOTICE file_format [level5s] time150405000 shortfile message console_format color[level5s] time150405000 shortfile message colorreset module set log level by module p2p INFO consensus NOTICE core NOTICE hyperdb NOTICE

bull loglevel设定了 hyperchain运行的默认日志级别

bull file_format可配置日志文件的输出格式

bull console_format可配置屏幕输出的日志格式

bull module则可配置任意模块的日志级别可以根据具体情况进行修改

43 日志文件归档

logsdir buildlogs

logdir可以配置日志文件的生成位置一般推荐datahyperchain目录

我们另外提供了对日志文件进行归档整理的脚本如下所示

cd ~hyperchain

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 31: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 24 页

toolsscriptsclean-logsh

-t设置需要清理的时间线

-s设置清理路径

-d设置归档路径

-c 设置是否日志归档脚本的日志生成位置

运行该脚本可以将日志目录下在设定时间线之前的日志统一转移到归档目

录中

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 32: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 25 页

第5章CA 证书管理及使用方案

51 CA 证书体系

在 Hyperchain 系统中共有一下四种不同类型的证书首先先简要地介绍一

下各种证书

511 概念

l ECert amp ECA

ECert (Enrollment Certcate)准入证书

ECA (Enrollment Certiticate Authority)准入证书认证机构

l RCert amp CA

RCert (Role Certcate)角色证书

RCA (Role Certiticate Authority)角色证书认证机构

l TCert amp CA

TCert (Transaction Cert)交易证书

TCA (Transaction Certiticate Authority)交易证书认证机构

l TlsCert amp CA

TlsCert(Transport Layer Security) 安全传输层协议证书

TlsCA (Transaction Certiticate Authority) 安全传输层协议证书认证机构

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 33: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 26 页

512 CA 证书权限体系层次图

313 各 CA 证书用途

l ECert 用于控制区块链节点(包括 VPNVP)进入 Hyperchain持有

Ecert的节点以及 SDK才能够访问区块链网络

l RCert 用于区分 VP和 NVP节点持有 RCert的节点才能被承认为 VP节

点反之均被视为 NVP

l TCert 用于实现伪匿名交易在发起 SendTransaction 的时候需要使用

TCert相匹配的私钥对 Transaction进行加密TCert可以实现线上申请

由各个节点签发每一条 Transaction 可以用一个新的 TCert 进行签名

可以实现每条交易的相对匿名但是可以由签发方审查

l TlsCert 用于传输层安全协议证书即在传输网络传输过程中需要验证

传输层安全协议证书的安全性验证通过即可以进行正常网络通信反

之则无法进行网络通信

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 34: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 27 页

52 certgen 使用说明

521 certgen 安装

将相应的 certgen发行版本解压到操作系统 Path目录下即可

以 centos 65为例

管理员 tar zxf certgen-centos-65targz ndashC usrlocalbin

普通用户 tar zxf certgen-centos-65targz ndashC ~

注意普通用户使用的时候如果无法放到 path 搜索目录则下面的命令

用certgen运行

321 生成证书

Certgen启动界面如下

签发根证书(自签证书)命令如下 certgen selfgen rootca rootpriv

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 35: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 28 页

运行上述命令会在指定路径生成 rootcarootpriv两个文件即根证书文

签发子证书 certgen gc rootca rootpriv subcertcert subcertpriv

另外需要注意的是

在签发子证书时默认生成的子证书不可以签发子证书若需要具有子证

书签发功能则需要在签发该证书时加入-c参数

在 hyperchain平台中ECert以及 RCert均为根证书 rootca的字证书签发

命令如下 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECAcertgen gc rootca rootpriv ecaca ecapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c

特别说明

为 SDK签发的 ECERT应该不允许其签发子证书故应当用如下命令签发

证书 签发 SDK ECert certgen gc ecaca ecapriv ecertcert ecertpriv

用于 grpc网络传输安全的 TlsCert签发命令如下 签发 TlsCAcertgen selfgen tlscaca tlscapriv 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

322 检查证书

检查子证书是否由该 CA证书签发 certgen cc rootca subcertcert

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 36: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 29 页

检查证书签名是否有效 certgen ccs rootca

53 CA 证书签发管理方案

531 CA 生成及保管

举例来说机构 A 和机构 B 各有两个节点作为联盟链的初创成员同时管理

RootCARCAECATlsCA可由其中一个机构通过 certgen 工具使用如下命

令生成双方同时保管 签发 RootCAcertgen selfgen rootca rootpriv 签发 RCAcertgen gc rootca rootpriv rcaca rcapriv -c 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv -c 签发 TlsCAcertgen selfgen tlscaca tlscapriv

532 节点 cert 签发

创世的四个 VP 节点需要使用以上 CA 通过 certgen 的如下命令生成各自节

点的一套证书 签发 RCert certgen gc rcaca rcapriv rcertcert rcertpriv 签发 ECert certgen gc ecaca ecapriv ecertcert ecertpriv ndashc 签发 TlsCertcertgen gc tlscaca tlscapriv tls_peercert tls_peerpriv

533 VP 节点 cert 文件配置

一个同时拥有共识投票和记账功能并且开启了 tls的 VP节点它的 config

目录下的 cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 37: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 30 页

534 NVP 节点 cert 文件配置

一个只拥有记账功能并且开启了 tls 的 NVP 节点它的 config 目录下的

cert文件配置如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 38: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 31 页

第6章VP 和 NVP 节点管理及使用方案

VP节点指在联盟链中参与共识投票和记账的节点NVP节点指在联盟链中

只参与记账的节点可供外部查询或为 VP节点做热备份本章所描述的节点管

理及使用方案皆基于以下案例mdashmdash

仍以在上一章中已经提到的机构 A 和机构 B 为例两家机构同时保管

RootCAECARCATlsCA两家机构各有两个节点作为创世节点启动它们

的 ip配置如下

机构 A(hyperchain-1) node11721601(内)115201001(外) node21721602(内)115201002(外) 机构 B(hyperchain-2) node310200101(内)118180101(外) node410200102(内)118180102(外)

61 VP 节点管理

611 新增 VP 节点

在上述提到的案例中在已有两家机构共四个节点的基础上若您需要新增

一家机构 C(网域ldquohyperchain-3rdquo)的 VP节点如下 机构 C(hyperchain-3) node519210101(内)123210101(外)

6111 新增 VP 节点方案

目前我们仅支持一次动态增加一个 VP节点新增方案如下

申请端口和 IP 的白名单访问机构 C 需要向机构 A 和机构 B 申请节点间

通讯的 IP和 GRPC端口的访问并且自己也开放反向访问同时机构 C内部开

通 JSONRPC和 RESTFUL服务端口用于内部调用

申请证书机构 C 需要向 CA 托管方申请 CA 证书在本案例中机构 C 需

要同时获得 AB两家机构认证后得到由其中一家机构生成的 RCert和 ECert(具

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 39: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 32 页

签发功能)保证 VP 节点权限TlsCert 保证节点间通信安全所需ECert(不具

签发功能)保证机构内 SDK调用节点接口

部署启动VP节点将所需节点 cert按照上一章描述的结构配置后置于 config

目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考部署手

需要注意的是目前新增节点操作需要全网 VP节点都在线才可进行

6112 VP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 和

pbftyaml文件即可机构 C的 node5的 peerconfigjson文件需要的修改如下图所

示 self is_reconnectfalse is_originfalse is_vptrue node_id5 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-3 address[

ip192101018001domainhyperchain-3 ip1232101018001domainhyperchain-1 ip1232101018001domainhyperchain-2

ip1232101018001domaindefault ]

introducer id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 maxpeernode4

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 40: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 33 页

nodes[ id1 domainhyperchain-1 address[ ip1152010018001domainhyperchain-1 ip1152010018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip1152010028001domainhyperchain-1 ip1152010028001domaindefault ] port8001 rpc_port8081 id3 domainhyperchain-2 address[ ip1181801018001domainhyperchain-2 ip1181801018001domaindefault ] port8001 rpc_port8081 id4 domainhyperchain-2 address[ ip1181801028001domainhyperchain-2 ip1181801028001domaindefault ] port8001 rpc_port8081 ]

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 41: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 34 页

需要注意的是

l 节点 id序列号依次增加

l introducer为介绍人节点的相关信息一般选择创世节点为介绍人

l maxpeernodes填新节点未加入前区块链网络的节点数

l nodes只需要填创世节点的信息即可

pbftyaml需要的修改如下图所示 pbft Number of replicas nodes 4 How many transactions should the primary pack before sending pre-prepare batchsize 100 How many times of same vc from self before a replica start recovery vcresendlimit 10 Timeouts hellip hellip

需要注意的是nodes为新节点加入前的联盟节点数量

6113 VP 节点成功加入

VP节点成功加入的日志显示如下

VP节点加入共识其实需要两个步骤

确认所有 VP反连后进入 recovery

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 42: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 35 页

recovery结束后全网更新共识参数

这样做的目的就是为了新的 VP节点时以一个 recovery完成(即与其他节点

区块高度同步)的ldquo好节点rdquo身份加入时才能更新系统参数而不影响整个系统共

识负荷

612 删除 VP 节点

VP 节点的删除需要全网节点在线并且平台目前仅支持在 VP 节点总数大

于等于 5的情况下一次删除一个 VP节点本节将在上一节描述的增加了机构 C

的 node5的情况下现在要删除机构 B的 node4

6121 删除 VP 节点方案

节点提出申请为了保障 VP节点的权益删除一个 VP节点需要由该节点

自己提出申请该节点管理员通过调用 SDK的得到节点哈希ltNodeHashgt还需

要将ltNodeHashgt发送给所有其他 VP节点的管理员

所有 VP节点同意删除所有 VP节点(包括该节点自己)管理员需要在拿

到该节点的ltNodeHashgt后调用 SDK的删除节点命令删除该节点

成功删除其他 VP节点将会断开与该节点的连接同时更新共识参数而

该节点则会自动退出程序但还需要管理员终止服务运行(hyperchain stop参

考部署手册)

6122 VP 节点成功删除

VP节点成功删除后5号节点的日志如下

需要注意的是5号节点已经更新为 4号节点VP节点的序号会从 1递增

不存在空缺

62 NVP 节点管理

NVP节点作为不参与共识的节点可以选择一到多个 VP节点连接一般来

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 43: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 36 页

说一家机构内会选择机构内部的 VP节点作为 NVP节点的连接对象

621 新增 NVP 节点

继续本章的案例现在机构 A想要在机构内部增加一个 NVP节点该 NVP

节点与原有的 node1和 node2相连该节点信息如下 机构 A(hyperchain-1) NVP1721603(内)

6211 新增 NVP 节点方案

申请 IP和端口机构 A需要为 NVP节点申请内网的 IP和各类端口的访问

权限由于该节点仅选择与 node1和 node2相连不需要做外网申请

申请证书NVP 节点需要申请联盟链准入的 ECert 和用于节点间安全通信

的 TlsCert可由机构 A内部签发

部署启动 NVP 节点将所需节点 cert 按照上一章描述的结构配置后置于

config 目录下VP 节点即可启动部署安装流程同创世节点一致具体可参考

部署手册

6212 NVP 节点的配置

保持 config 配置与其他节点一致修改网络配置文件 peerconfigjson 即可

该 NVP节点需要的修改如下图所示 self is_reconnectfalse is_originfalse is_vpfalse node_id0 grpc_port8001 jsonrpc_port8081 restful_port9001 domainhyperchain-1 address[ ip17216038001domain hyperchain-1 ip17216038001domaindefault ] introducer

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 44: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 37 页

id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 maxpeernode4 nodes[ id1 domainhyperchain-1 address[ ip17216018001domainhyperchain-1 ip17216018001domaindefault ] port8001 rpc_port8081 id2 domainhyperchain-1 address[ ip17216028001domainhyperchain-1 ip17216028001domaindefault ] port8001 rpc_port8081 ]

需要将is_origin字段设置为 falseis_vp字段设置为 falsenode_id字段

设置为 0maxpeernode字段设置为与该节点相连接的 VP节点数量在nodes

字段中配置连接的 VP详情其余字段与 VP配置类似

6213 NVP 节点成功加入

NVP成功加入后的日志如下图所示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 45: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 38 页

即表示该 NVP 节点已经和所有配置的 VP 节点建立连接可作为查询节点

热备份

622 删除 NVP 节点

NVP节点的删除需要所连的 VP节点都在线本节将在上一节描述的机构 A

新增了一个 NVP节 N点的基础上删除它

NVP节点删除方案如下

节点提出申请为了保障被连接的 VP 节点的权益删除一个 NVP 节点需

要经其连接的所有 VP 节点同意与之相连的 VP 节点管理员通过调用 SDK 的

得到节点哈希ltNodeHashgt返回给该 NVP节点表示同意删除

NVP 节点与所有 VP 节点断开连接NVP 节点拿到所有 VP 节点的

ltNodeHashgt后调用 SDK断开与所连 VP节点的连接

成功删除NVP节点将会断开所有相连的 VP节点的连接后退出程序但还

需要管理员终止服务运行(hyperchain stop参考部署手册)VP 节点也会反向

断开与该 NVP节点的连接

63 VP 与 NVP 节点的相互转换

631 NVP 转 VP

NVP节点转为 VP节点首先遵循 422节的方案删除该 NVP节点删除成

功后根据 411的方案增加 VP节点

632 NVP 转 VP

VP节点转为 NVP节点需要先按照 412的方案删除 VP节点删除成功

后再按照 421的方案增加 NVP节点

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 46: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 39 页

第7章合约升级规范

对于已部署到区块链上的智能合约做版本升级需要用到合约升级的功能合

约编码者要注意一个正确的新版合约需要满足以下所有的升级规范若不符合以

下规范而进行合约代码升级的话在之后的合约调用过程中会出现变量内容读

取失败变量内容读取异常虚拟机执行失败等情况造成合约中存储的数据与

变量名无法对应的情况出现这种情况可能会造成合约中某些数据永久无法恢

复因此合约编码者若需要做合约升级请务必阅读以下升级规范

注意不规范的新版合约在升级过程中是不会报错的即使在造成了数据混

乱的情况下在之后的调用过程中虚拟机也有可能是不会报错的即调用者感

知错误比较困难

71 变量定义

711 新增变量定义

新版合约若需要新增变量定义注意一定要在旧版合约变量定义的基础上

在尾部追加新定义

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合约想要新增类型为 bytes32类型的变量 var3 正确的定义方式为 正确的新版合约 pragma solidity ^044 contract Demo uint var1

string var2 byte32 var3 将新增的变量定义追加在旧合约变量定义的尾部

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 47: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 40 页

而以下这种新增变量定义的行为均是错误的 错误的新版合约 pragma solidity ^044 contract Demo

uint var1 byte32 var3 将新增的变量定义插入在旧合约变量定义的中间 string var2

712 删除变量定义

新版合约若需要删除部分在旧合约中定义的变量需要注意的是只能删除在

尾部定义的变量

示例 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

若旧版合约源码如上所示在合约中定义了两个类型为 uint 和 string 的变

量若新版合版合约试图删除变量 var2的定义这种行为是容许的正确示例 正确的新版合约 pragma solidity ^044 contract Demo uint var1 string var2 删除了定义在ldquo尾部rdquo的变量

若新版合约试图删除变量 var1的定义这种行为是错误的错误示例 错误的新版合约 pragma solidity ^044 contract Demo uint var1 删除了定义在ldquo非尾部rdquo的变量 string var2

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 48: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 41 页

即合约编码者想要在新版合约中删除部分旧变量的定义当且仅当删除的这

些旧变量全部是定义在尾部的才是合法的

713 修改变量定义

更改变量定义的变量名是允许的更改变量的类型是不被允许的 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

修改变量名的示例如下这种行为是合法的 正确的新版合约 pragma solidity ^044 contract Demo uint var3 将变量名由 var1改为了 var3 合法 string var4 将变量名由 var2改为了 var4 合法

修改变量的类型的示例如下这种行为是错误的 错误的新版合约 pragma solidity ^044 contract Demo uint8 var1 将变量 var1的类型改为 uint8不合法 bytes32 var2 将变量 var2的类型改为 bytes32 不合法

714 更改变量定义顺序

修改变量定义的顺序是不被允许的

以下有个错误示例合约编码者在新版合约中将旧版合约定义的 var1var2

调换了定义顺序 旧版合约 pragma solidity ^044 contract Demo uint var1

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 49: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 42 页

string var2 错误的新版合约 pragma solidity ^044 contract Demo string var2

uint var1

72 变量声明

721 新增变量声明

变量声明包括例如结构体的声明枚举类型的声明等新增变量声明是允许

的且允许声明在合约的任意位置

示例如下 旧版合约 pragma solidity ^044 contract Demo uint var1 string var2

以下几种新增定义方式都是合法的 正确的新版合约 pragma solidity ^044 contract Demo 将结构体 User声明在合约首部合法

struct User bytes32 ID uint balance

uint var1 string var2 将枚举类型 UserType声明在合约尾部合法 enum UserType STUDENT TEACHER STUFF

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 50: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 43 页

722 删除变量声明

若在新版合约中删除旧版合约中未使用的变量声明这种行为是合法的若

在新版合约中删除旧版合约正在使用的变量声明这种行为是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

若在新版合约中删除未使用的变量声明 ClassType 这种行为是合法的 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE 删除未使用的 enum类型声明合法 struct User string id UserType t User[] users

若在新版合约中删除正在使用的变量声明 UserType 这种行为是错误的 错误的新版合约 contract Demo

enum UserType STUDENT TEACHER STUFF 删除正在使用的 enum类型声明

非法 enum ClassType MATH ENGLISH CHINESE struct User string id

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 51: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 44 页

UserType t User[] users

723 修改变量声明

修改已有的变量声明是错误的 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

错误示例 错误的新版合约 contract Demo enum UserType STUDENT TEACHER 删除了 UserType中的 STUFF枚举项非法 enum ClassType MATH ENGLISH CHINESE struct User string id 删除了 User结构体中的 id字段非法 UserType t ClassType c 新增了类型为 ClassType的 c字段非法 User[] users

724 更改变量声明顺序

更改变量声明的顺序是合法的

示例如下

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 52: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 45 页

旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t User[] users

正确的新版合约 contract Demo 调换了 User结构体ClassTypeUserTyep枚举类型的声明位置合法 struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users

73 函数定义

731 新增函数定义

所有新增函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 53: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 46 页

function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

新增 AddTeacher函数定义合法 function AddTeacher (string id) userspush(User(id UserTypeTEACHER))

732 删除函数定义

所有删除函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 54: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 47 页

在新版合约中删除了 AddStudent函数合法 正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users 删除了函数 AddStudent合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

733 修改函数定义

所有修改函数定义的行为都是合法的

示例 旧版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

修改了 AddStudent函数的定义合法

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 55: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 48 页

正确的新版合约 contract Demo enum UserType STUDENT TEACHER STUFF enum ClassType MATH ENGLISH CHINESE struct User string id UserType t

User[] users uint userCnt 在变量定义尾巴追加定义 uint类型的变量 userCnt合法 function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) userCnt += 1 更改函数逻辑合法

734 更改函数定义顺序

所有更改函数定义顺序的行为都是合法的

示例 旧版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users function AddStudent(string id) userspush(User(id UserTypeSTUDENT)) function AddTeacher(string id) userspush(User(id UserTypeTEACHER))

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 56: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 49 页

新版合约 contract Demo struct User string id UserType t enum ClassType MATH ENGLISH CHINESE enum UserType STUDENT TEACHER STUFF User[] users 更改 AddTeacher与 AddStudent两个函数的定义顺序合法 function AddTeacher(string id) userspush(User(id UserTypeTEACHER)) function AddStudent(string id) userspush(User(id UserTypeSTUDENT))

74 编译合约

741 调用 SDK 编译

使用 SDK 的编译合约接口进行新版合约的编译获取编译后的二进制字节

码(详细使用说明见用户 SDK手册)

742 使用 Solc 编译器编译

使用官方的 solidity 编译器对新版合约进行编译获取新版合约编译后的二

进制字节码

注意solidity 编译器有很多版本不同版本的 solc 对同一份源码编译出来

的二进制会有差异因此 好使用与编译旧合约统一版本的 solc编译器

743 合约升级

调用 SDK 的合约升级接口进行合约升级的动作注意升级合约交易的发起

者必须是合约的部署者

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 57: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 50 页

第8章SDK 功能使用

更多 SDK接口使用请参考《Hyperchain Java SDK文档 v224》

81 初始化

811 初始化 Hyperchain 对象 HyperchainAPI

配置文件hpcproperties 初始化HyperchainAPI的 Hyperchain Nodes IP Ports node=nodes[1270018081127001808212700180831270018084] 重发次数 resendTime = 10 第一次轮训时间间隔 unit ms firstPollingInterval = 1000 发送一次第一次轮训的次数 firstPollingTimes = 10 第二次轮训时间间隔 unit ms secondPollingInterval = 1000 发送一次第二次轮训的次数 secondPollingTimes = 10 Send Tcert during the request or not SendTcert = false if sendTcert is true you should add follow path ecertPath = srctestresourcescertsecertcert ecertPriPath = srctestresourcescertsecertpriv uniquePrivPath = srctestresourcescertsuniquepriv uniquePubPath = srctestresourcescertsuniquepub

HyperchainAPI hyperchain = new HyperchainAPI()

该对象用于提供各类接口方法

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 58: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 51 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书

812 初始化 Hyperchain 对象(带路径)

new HyperchainAPI(path)

注意传入的路径即为 hpcproperties文件的路径

hpcproperties的文件格式如 411所示相同 HyperchainAPI hyperchain = new HyperchainAPI(ldquohpcpropertiesrdquo)

813 初始化 Hyperchain 对象(带 APIProperties)

new HyperchainAPI(apiProperities)

apiProperities初始化方法 1 apiProperities() 带部分默认值默认值与 211所示的 hpcproperties一致 2 apiProperities(String properitiesPath) 路径为 hpcproperties路径

另外对于 apiProperties可以利用 set方法进行赋值可赋值变量有 String node int resendTimes int firstPollingInterval int firstPollingTimes int secondPollingInterval int secondPollingTimes boolean sendTcert String ecertPath String ecertPriPath String uniquePrivPath String uniqurPubPath

说明node表示平台各节点的 IP以及端口resendTime参数表示重发次数

firstPollingInterval 表示第一阶段轮训去获取交易的时间间隔单位为毫秒

firstPollingTimes 表示发送一次交易的轮训次数secondPollingInterval 表示第一

阶段轮训去获取交易的时间间隔单位为毫秒secondPollingTimes 表示发送一

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 59: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 52 页

次交易的轮训次数SendTcert表示是否打开 TCA认证开关ecertPath表示 Ecert

的路劲EcertPriPath表示 Ecert私钥的路径uniquePrivPath表示 SDK私钥路径

uniquePubPath表示 SDK公钥路径用于向平台申请 TCert证书 apiProperities apiProperities = new apiProperities() Hyperchain hyperchain = new HyperchainAPI(apiProperities)

814 自动切换节点

在实例化HyperchainAPI对象的时候将会先读取配置文件所有节点的信息

如果向 Hyperchain某个节点请求失败SDK可以自动切换链上相应节点请配合

新版本的 hyperchain使用

82 Transaction 相关接口

821 实例化交易

8211 实例化普通交易

普通交易主要是用于普通转账 param from from账户地址 param to to账户地址 param value 转账金额 param simulate 是否共识 public Transaction(String fromString tolong valueboolean simulate) 以 address1 向 address2 转账 53单位值为例 Transaction mytransaction = new Transaction(address1address253Ltrue)

8212 实例化合约部署交易(无构造参数)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 60: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 53 页

部署智能合约(构造函数无参) param from from账户地址 param payload 智能合约 bin param simulate 是否共识 public Transaction(String fromString payloadboolean simulate) 例子 若已经编译得到智能合约的二进制代码 bin Transaction mytransaction = new Transaction(address1bintrue)

8213 实例化合部署约交易(有构造参数) 部署智能合约构造函数无参 param from from账户地址 param payload 智能合约 bin param simulate 是否共识 param params 智能合约构造函数参数 throws FunctionParamException 参数非法异常 public Transaction(String from String payload boolean simulate FuncParamReal params) throws FunctionParamException 例子 以构造函数参数为 int32类型值为 8为例 构造参数对象 FuncParamReal funcparam = new FuncParamReal(ldquoint32rdquo8) Transaction mytransaction = new Transaction(fromAddressbintrue funcparam)

822 交易签名

构造完成之后的交易需要进行签名可以用如下方法进行签名

8221 利用加密之后私钥字符串和加密密钥进行签名 param accountJSON 加密后的密钥对JSON字符串 param passwd 加密密钥对密码 初始化一笔普通交易 Transaction transaction = new Transaction(TEST_FROM TEST_TO 53L false) transaction sign (TEST_PRIJSON TEST_PASSWD)

8222 利用未加密私钥进行签名

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 61: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 54 页

param accountJSON 密钥对字符串 Transaction transaction = new Transaction(addressbinfalse) transaction sign (privstring)

823 通过交易 hash 查询交易

SingleValueReturn getTxByHash(String txHash int id)

查询交易 by TxHash param txHash 交易Hash param id 查询批次 return 单值返回值 返回交易信息json字符串 hyperchaingetTxByHash(txHashid) resultgetResult() 取得交易 hash

824 查询指定交易中的收据信息

ReceiptReturn getTransactionReceipt(String TxHash) 查询指定交易中的收据信息 param TxHash 交易hash return ReceiptReturn Receipt返回 String txHash =0x25cc67f7cb5c5393f419c2ea2be8ac8736826a64fcda5b1afef2694f8712032e ReceiptReturn result = hyperchaingetTransactionReceipt(txHash) resultgetContractAddress() 合约地址 resultgetRet() 调用合约返回值 如果是合约部署交易的回执将会有合约地址否则合约地址字段为全零值

825 查询区块交易数量

SingleValueReturn getBlkTxCountByHash(String blkHash) 查询区块交易数量 param blkHash 区块hash param id 查询批次 return 交易数目 16进制表示

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 62: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 55 页

hyperchain getBlkTxCountByHash(blkHash) resultgetResult()

83 Contract 相关接口

831 部署合约

8311 同步

说明无参数的构造函数将会自动调用 部署该类合约请用本方法

SingleValueReturn deployContract(Transaction transaction) throws Exception 部署合约 param from 部署账户地址 return 部署交易Hash SingleValueReturn throws Exception StdReturn result = hyperchaindeployContract(transaction) resultgetResult() 合约部署交易返回hash

8312 异步

deployAysncContract(Transaction transactionfinal AsyncHandler callBack) 32 部署合约(构造函数) param Transaction 交易结构体 param AsyncHandler 异步回调需要实现此接口 throws Exception 首先实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) Override public void onFailed(StdReturn ret) result = failed 再进行异步调用

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 63: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 56 页

AsyncHandlerTest handler = new AsyncHandlerTest() 构造交易 Transaction transaction = new Transaction(yourfromtargetBinfalse) 签名交易 transactionsignWithSM2(accountJsonsecretKey) 异步部署 hyperchaindeployAysncContract(transactionhandler) while(handlerresult==) Threadsleep(100) Systemoutprintln(handlerresult)

832 调用合约

8321 同步

SingleValueReturn invokeContract(Transaction transaction) throws InterruptedException

调用智能合约 param transaction 智能合约交易 return 返回单个string返回值 交易hash SingleValueReturn result = hyperchaininvokeContract(transaction) 取得交易hash resultgetResult() 需要利用该hash去查询交易回执

8322 异步 invokeContractAysnc(Transaction transactionfinal AsyncHandler callBack) throws Exception

调用智能合约 param transaction 智能合约交易 param callback 回调函数实现接口AsyncHandler 需要实现AsyncHandler接口 public class AsyncHandlerTest implements AsyncHandler public String result = Override public void onSuccess(StdReturn ret) result = retgetResult() Systemoutprintln(result) JSONObject jsonObject = JSONObjectfromObject(handlerresult)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 64: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 57 页

Override public void onFailed(StdReturn ret) result = failed Transaction transaction = new Transaction(yourfrombinfalse) AsyncHandlerTest handler = new AsyncHandlerTest() hyperchaininvokeContractAysnc(transactionhandler)

833 合约管理 SingleValueReturn maintainContract(Transaction transaction) throws InterruptedException

智能合约管理 param transaction 智能合约交易 return 返回单个string返回值 upgrade contract opcode 1 升级合约 Transaction transaction = new Transaction(yourfrom contractAddress UpgradeBin 1) transactionsignWithSM2(account_jsonpasswd) StdReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult()) 取得交易hash 利用交易hash取得回执如果交易回执执行能够取得则升级成功 upgrade contract opcode 2 冻结合约 Transaction transaction = new Transaction(yourfrom contractAddress2) transactionsignWithSM2(account_jsonpasswd) SinglevalueReturn invokeResult = hyperchainmaintainContract(transaction) Systemoutprintln(invokeResultgetResult())冻结交易hash如果冻结成功则能够查询到回执 upgrade contract opcode 3 解冻合约 Transaction unfreezeTransaction = new Transaction(accountgetAddress() contractAddress 3) unfreezeTransactionsignWithSM2(account_jsonpasswd) SinglevalueReturn unfreezeInvokeResult = hyperchainmaintainContract(unfreezeTransaction) Systemoutprintln(unfreezeInvokeResultgetResult())取得解冻hash如果成功则能查询到回执

84 Block 相关接口

841 取得最新区块信息

BlockReturn getLatestBlock()

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 65: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 58 页

取得 新的区块信息 return 区块信息 BlockReturn blockReturn = hyperchaingetLatestBlock() Systemoutprintln(blockReturngetResult())返回的是一个json字符串

842 取得指定区块列表

ArrayListltBlockReturngt getBlocks(BigInteger from BigInteger to) 取得指定开始与结束的区块 param from 开始区块号 param to 结束区块号 return 返回区块信息 ArrayListltBlockReturngt blockReturns = hyperchaingetBlocks( new BigInteger( 13)new BigInteger( 14))

843 取得指定区块 by hash

BlockReturn getBlkByHash(String blockHash) 查询区块信息 by blk Hash block_getBlocksByHash param blockHash blk hash return 区块信息 BlockReturn blockReturn = hyperchain getBlkByHash ( 0xec86d97fb08dd10c4a238c7ba2993ee62d3f33df70b7b25595328a8f36da08ab )

844 取得指定区块 by number

BlockReturn getBlkByNumber(BigInteger blkNumber) 查询区块信息 by blk Number param blkNumber 区块 Number return 区块信息 BlockReturn blockReturn = hyperchaingetBlkByNumber( new BigInteger(1e16)) Systemoutprintln(blockReturngetResult()) Systemoutprintln(blockReturngetAvgTime()toString())

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 66: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 59 页

Systemoutprintln(blockReturngetMerkleRoot())

85 节点相关接口

851 取得节点信息

ArrayListltNodeInfoReturngt getNodes() 取得所有的节点信息 return 返回节点信息列表 ArrayListltNodeInfoReturngt nodeInfoReturns= hyperchaingetNodes() for (NodeInfoReturn nodeInfoReturn nodeInfoReturns) Systemoutprintln(nodeInfoReturngetIp()) Systemoutprintln(nodeInfoReturngetId()) Systemoutprintln(nodeInfoReturngetPrimary()) Systemoutprintln(nodeInfoReturngetDelay())

852 获取当前节点的哈希值

String getNodeHash() 获取当前节点哈希值 return 返回节点信息 String nodeHash = hyperchaingetNodesHash()

853 根据哈希值删除节点

说明删除节点需要在所有的节点上调用该接口参数 nodehash 为需要删

除的节点的 hash

boolean deleteNode(String nodeHash) 根据节点哈希值删除节点 param nodeHash 节点哈希值 return 删除操作结果 String nodeHash = hyperchaingetNodesHash() boolean issuccess = hyperchaindeleteNode(nodeHash)

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 67: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 60 页

854 NVP 根据 ID 值断开与 VP 节点的连接

说明如果同所有 VP 节点断开连接则该 NVP 节点会自动关闭该 API

请求应当发往 NVP节点

boolean disconnectVP(String vpNodeHash) 根据节点id值同VP节点断开连接 param nodeid 节点id值 return 删除操作结果 boolean issuccess = hyperchaindisconnectVP(nodehash)

86 返回值解析

861 通用返回值解析(推荐) String resultDecode(String methodNameString abi String encoded ) throws UnsupportedEncodingException

本方法将会利用 abi将返回值直接解析为 json字符串拥有 value(返回值)

mayvalue(推测返回值)字段更加便捷

ReceiptReturn result4 = 取得交易回执 hyperchaingetTransactionReceipt(result3getResult()) Systemoutprintln(result4getResult()) Systemoutprintln(FunctionDecoderesultDecode(addTEST_ABIresult4getRet())) 样例输出 result[typejavalangBooleanvaluetruemayvaluetrue]statusSUCCESStxhash0x533a013a82c831fb7986d240bfca3b2257760c0658f12a871257337e9f77f4c4code0infoinvoke Success

862 复杂返回值解析(不推荐)

ArrayListltObjectgt complexDecode(String methodName String abi String data) String ret = 0x0000000000000000000000000000000000000000000000000000000000000007

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 68: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 61 页

String abi = [constantfalseinputs[nameatypeuint256]namemultiplyoutputs[namedtype uint256]payablefalsetypefunction] FunctionDecodecomplexDecode( multiply abi ret)

87 账户相关接口

主要是提供了明文私钥相关接口所有涵盖 accountJson 相关的接口都有相

应的明文私钥重载实现

871 创建账户(加密)

String newAccount(String passphrase) throws GeneralSecurityException 生成账户keystore 文件 json字符串形式返回 param passphrase 设置账户密码 return json格式私钥存储文件 throws GeneralSecurityException String account = hyperchainnewAccount( 123) Systemoutprintln(account)

872 创建账户(未加密)

String newAccountRaw() throws GeneralSecurityException 生成私钥存储(未加密)文件json字符串返回 return json格式私钥存储(未加密)文件 throws GeneralSecurityException 加密算法异常 String account = hyperchainnewAccountRaw() Systemoutprintln(account)

873 创建账户(返回值为 ECPriv)

ECPriv newAccount() throws GeneralSecurityException

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 69: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 62 页

返回ECPriv类包括ECKey return ECPriv 包括用户私钥以及账户地址 throws GeneralSecurityException 加密算法异常 ECPriv ecPriv = new newAccount()

874 加密明文私钥

String encryptAccount(String plainAccountJson String password) throws

GeneralSecurityException

加密明文私钥并返回一个 AccountJson

875 解密私钥文件返回明文 Json 字符串

StringdecryptAccount(String encrypetedAccountJson String pwd) throws

Exception

解密私钥文件并返回明文私钥文件

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 70: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 63 页

第9章异常处理

91 网络异常

911 单节点网络异常

当系统中出现如下报错即 IP 为 127001Port 为 8002 的节点连接失败

表明本节点与该节点之间的网络连接断裂有较大概率是该节点发生了异常导致

宕机

处理方式重启该节点

注意出现该情况有可能是该节点未开放相应端口请务必确认四个节点之

间通讯顺利防止因为防火墙等问题导致节点间不能通讯

92 数据异常

921 重新启动报错 invalid root

该节点的账本数据已损坏

处理方式

1) 删除该节点的数据(build文件夹)重新启动通过区块同步恢复

2) 删除该节点的数据(build 文件夹)将正常节点的数据拷贝至本节点

(build文件夹拷贝)重新启动

当数据规模不大时推荐采用第一种处理方式当数据规模较大时推荐采

用第二种处理方式

93 共识异常

931 重启后相同区块高度的节点数不超过规定数目

所有节点重新启动后拥有相同区块高度的节点数不超过算法规定的数值

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 71: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 64 页

当 N为 4F为 1时该值为 3 int(mathCeil(float64(sconfigN+sconfigF+1) float64(2)))

出现这种情况即区块链网络中拜占庭节点的数量已经超过了算法容错的数

处理方式以区块高度 高的节点数据为准将该节点的数据(build 文件

夹)拷贝给其他节点数据拷贝完成之后重启区块链网络

932 Viewchange 异常

报错信息 Replica 1 already has a view change message for view 3 from replica 2

当在所有节点上看到这条消息且消息都是来自相同的节点例如 2 时 说

明节点 2发生了异常情况触发了 ViewChange无需理会节点 2的错误行为当

节点 2发送 10次 ViewChange都不成功时会自动触发 recovery 终达成一致

处理方式自动恢复

当在所有节点都看到类似消息而且不断出现时

处理方式重启所有节点

933 Ignore duplicatoe 异常

报错信息 Replica 2 ignoring prepare for view=2seqNo=10 not in-wv in view 1 low water mark 20

如果偶尔出现以上信息是正常情况可能是某一个节点的 cpu负荷过高或

网络通讯不畅造成该节点处理速度落后于区块链网络的处理速度该条消息对于

其他节点来说已经失效了

如果一直出现可能是一个节点 out-of-date落后了可以等节点自动发现后

恢复(需要等待一段时间落后 50 个块会触发恢复)也可以将落后的节点重

处理方式自动恢复

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 72: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 65 页

第10章产品激活续期

101 激活

使用 Hyperchain 需要拥有本产品的激活码本产品的激活码为名为

LICENSE 的文件激活本产品只需将 LICENSE 文件放置在产品根目录下的

config文件夹下即可

102 续期

当您购买的 Hyperchain 产品即将到期时您可以重新向本公司购买新的激

活码在不停止 hyperchain服务的情况下动态替换旧 LICENSE文件即可

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 73: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 66 页

第11章联系与反馈

111 联系方式

您可以通过以下联系方式联系我们

联系电话 0571-81180102 0571-81180103

Email supporthyperchaincn

我们的工作时间是900 AM to 500 PM PST (Monday-Friday except Holidays)

112 注意事项

请您在联系我们之前将以下信息附上

您的姓名问题的主要内容您的公司电话以及电子邮箱

操作系统以及版本号

产品版本号

问题描述

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 74: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 67 页

第12章附录

121 配置文件

1211 caconfigtoml

文件描述CA权限控制相关配置文件根据实际情况填写配置 字段 含义 [ecert]ca Enrollment Certiticate Authority准入认证机

构证书 [ecert]cert Enrollment Certcate准入证书用于控制 VP

和 NVP节点进入 Hyperchain中 [ecert]priv 准入证书的私钥 [rcert]ca Role Certiticate Authority角色认证机构证

书 [rcert]cert Role Certcate角色证书用于区分 VP 和

NVP节点持有 RCert的节点才能被承认为VP节点

[rcert]priv 角色证书的私钥 [tlscert]ca tls认证机构证书 [tlscert]cert tls证书用于 grpc连接 [tlscert]priv tls证书的私钥 [tlscert]serverhostoverride 签发 tls证书的组织 [check]certsign 用于在连接过程中是否开启 ecert 和 rcert

的签名验证建议设置为 true [check] tcert 用于在请求过程中是否开启 tcert验证建

议设置为 true [check] ercert 用于在连接过程中是否开启 ecert 和 rcert

的验证建议设置为 true [gm]sm4 用于对称加密的算法是否选用 sm4false为

AES算法true为 sm4 建议选择 false

1212 dbyaml

文件描述数据库相关配置文件后两项建议修改 字段 含义 dbConfigdbType 用于指定使用哪一个数据库LEVEL_DB为

0001SUPER_LEVEL_DB为 0010一般推荐使用 0001

dbConfigsldbdbpath SUPER_LEVEL_DB的数据存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 75: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 68 页

dbConfigsldbindexdir SUPER_LEVEL_DB的索引存储路径 dbConfigsldbindexbloombit SUPER_LEVEL_DB的布隆过滤器的位数 dbConfigsldbindexhashnum SUPER_LEVEL_DB 的布隆过滤器所使用

的哈希函数个数 dbConfigsldbindexdumpinterval SUPER_LEVEL_DB 的索引持久化间隔时

间根据需求配置 dbConfigleveldbPath leveldb的数据存储路径根据需求配置

1213 genesisjson

文件描述本文件包含了启动 hyperchain区块链的创世块的信息里面的信

息包括创世账户地址和账户余额您可以随意修改里面的地址和值信息但是要

求地址长度为 40个 16进制字符长度账户余额为 10进制值

注意务必保证所有节点的本文件的一致性 字段 含义 genesisalloc 用于新建创世区块其中 key为用户帐号地

址要求地址长度为 20 个 16 进制字符长度value为用户所拥有的余额要求为 10进制值

1214 globalyaml

文件描述节点的整体配置选项一般全部保值默认值 字段 含义 globalaccountkeystoredir 加密私钥存储路径 globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 76: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 69 页

globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间 globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别 字段 含义globalaccountkeystoredir 加密私钥存储路径

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 77: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 70 页

globalaccountkeynodesdir 临时解密密钥存储路径 globaldbConfig 数据库的配置文件路径 globalstructurestate 账本类型包括 rawstate和 hyperstate globalversionblockversion 区块的版本号 globalversiontransactionversion 交易的版本号 globalconfigscaconfig 证书的配置文件路径 globalconfigspeers 节点的配置文件路径 globalconfigsgenesis 创世区块的配置文件路径 globalconfigsstatic_peers StateUpdate相关配置文件路径 globalconfigspbft 共识算法的配置文件路径 globalconfigslicense Hyperchain对客户的授权文件路径 globalconfigsreplicainfointerval 节点间状态同步间隔 globalconfigsreplicainfoenable 节点相互开启状态同步 globalconfigsratelimitenable 流量控制是否开启一般开启 globalconfigsratelimittxRatePeak 普通交易流量控制 globalconfigsratelimittxFillRate 普通交易流量阈值恢复间隔 globalconfigsratelimitcontractRatePeak 合约交易流量控制 globalconfigsratelimitcontractFillRate 合约交易流量阈值恢复间隔 globalconfigsbuckettreeglobalglobalData NodeCacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreeglobalglobalData NodeCacheLength

用于 bucketTree一般默认值

globalconfigsbuckettreestatesize 用于 bucketTree一般默认值 globalconfigsbuckettreestatelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestatecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestatedataNode CacheSize

用于 bucketTree一般默认值

globalconfigsbuckettreestoragesize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragelevelGroup 用于 bucketTree一般默认值 globalconfigsbuckettreestoragecacheSize 用于 bucketTree一般默认值 globalconfigsbuckettreestoragedataNode CacheSize

用于 bucketTree一般默认值

globalconfigshmpublickeyN 用于同态加密一般默认值 globalconfigshmpublickeyNsquare 用于同态加密一般默认值 globalconfigshmpublickeyG 用于同态加密一般默认值 globalconfigssync_chainbatch 节点恢复数据时一次请求 大的块数 globalconfigssync_chaininterval 节点恢复数据时重复请求的时间间隔 globalconfigssync_chainexitflag 当发生本地账本与收到的区块不一致情况

时NVP节点是否宕机 globalsecurityenabletls 是否使用 tls一般默认值 globalsecurityenablesymmetrical 是否使用对称加密一般默认值 globalconnectionretryTimeLimit 测试连接是否可用 大次数 globalconnectionretryTimeout 单次测试连接是否可用 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 78: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 71 页

globalconnectionrecoveryTimeLimit 尝试重新连接 大次数 globalconnectionrecoveryTimeout 单次尝试重新连接 长时间 globalconnectionkeepAliveTimeLimit 保活消息发送 大次数 globalconnectionkeepAliveInterval 保活消息发送间隔 globallogsdumpfile 是否输出日志文件 globallogsnewLogFileInterval 产生新的日志文件的时间间隔 globallogsmax_log_size 配置日志文件的大小上限 globallogssplit_start_stop_log 选择是否对平台启动及平台运行的日志进

行区分生成 globallogslogsdir 输出日志文件路径 globallogsloglevel 全局的日志级别可被 module 下的模块设

置覆盖 globallogsfile_format 日志输出到文件的格式 globallogsconsole_format 日志输出到控制台的格式 globallogsmodulep2p p2p模块的日志级别

1215 pbftyaml

文件描述pbft算法相关配置一般全部保值默认值 字段 含义 pbftnodes 节点个数 pbftbatchsize 在 pre-prepare前可以被主节点打包成一个

区块的 大交易数量 pbftvcresendlimit 在节点进行 recovery 前进行同一个 view

change的 大次数 timeoutnegoview 在发送协商请求后等待 N-f个响应的 长

时间 timeoutrecovery 等待 recovery过程结束的 长等待时间 timeoutfirstrequest 节点启动后的 长准备时间 timeoutbatch 主节点发送 pre-prapare请求的时间间隔即

使 区 块 所 拥 有 的 交 易 数 量 未 达 到

pbftbatchsize大小 timeoutrequest 节点接收执行区块的 长时间其值必须

大于 timeoutbatch timeoutvalidate 节点进行 validate 长的时间 timeoutnullrequest 主节点发送给其它节点的心跳消息 timeoutviewchange 进行 viewchange的 长时间

timeoutresendviewchange 重新发送 view change的间隔

timeoutcleanviewchange view change消息的过期时间并清除 timeoutupdate 增删节点时更新共识参数的 长时间

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 79: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 72 页

1216 peerconfigjson

文件描述节点网络配置全部按照实际情况填写 字段 含义 selfis_reconnect 用于标识本节点是否启动过 selfis_origin 本节点是否是创世节点 selfis_vp 本节点是否是 VP节点 selfnode_id 本节点的 id selfgrpc_port 本节点使用的 grpc端口 selflocal_ip 本节点的本地 ip地址 selfjsonrpc_port 本节点使用的 jsonrpc端口 selfrestful_port 本节点使用的 restful端口 selfdomain 本节点所在的域名 selfaddress 本节点在不同域中用于连接的 ip地址 selfintroducer_ip 用于新增节点时充当介绍人的节点 ip地址 selfintroducer_port 用于新增节点时充当介绍人的节点通讯端

口 selfintroducer_id 用于新增节点时充当介绍人的节点 id maxpeernode 本节点所连接的节点数量 nodesid 本节点连接的其它节点 id nodesdomain 本节点连接的其他节点所在域 nodesaddress 本节点连接的其它节点在各域的 ip地址 nodesport 本节点连接的其它节点通讯端口 nodesrpc_port 本节点连接的其它节点 rpc端口

1217 static_peerjson

文件描述静态节点配置发生区块同步时优先向配置的静态节点发起区

块请求

该配置文件可以不存在也可以为空视为没有静态节点 字段 含义 port 区块同步时优先请求的节点通讯端口 local_address 区块同步时优先请求的节点内网 ip id 区块同步时优先请求的节点 id remote_address 区块同步时优先请求的节点外网 ip

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 80: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 73 页

122 常见部署需求 peerconfig 配置示例

1221 单机部署四个节点

示意图如下具体四节点的配置可参考 peerconfig-exampleslocal-4-nodes的

具体配置

1222 同一网域内的四台服务器各部署一个节点

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置

Page 81: Hyperchain V1 - app.  · PDF file趣链科技Hyperchain运维手册 ... 第3章 Hyperchain配置文件维护 ... 3.2.3 Nginx转发限流配置

趣链科技 Hyperchain运维手册

2017 趣链科技 版权所有 第 74 页

1223 两个网域内的四台服务器各部署一个节点

局域网内内网连接否则外网连接

示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-

domain的具体配置