hyperchain v1 - app. · pdf file趣链科技hyperchain运维手册 ... 第3章...
TRANSCRIPT
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 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的具体配置
趣链科技 Hyperchain运维手册
2017 趣链科技 版权所有 第 74 页
1223 两个网域内的四台服务器各部署一个节点
局域网内内网连接否则外网连接
示意图如下具体四节点的配置可参考 peerconfig-examples4-nodes-in-1-
domain的具体配置