WeBASE 技术文档¶

WeBASE(WeBank Blockchain Application Software Extension) 是在区块链应用和FISCO BCOS节点之间搭建的一套通用组件。
什么是WeBASE¶
WeBASE(WeBank Blockchain Application Software Extension) 是在区块链应用和FISCO-BCOS节点之间搭建的一套通用组件。围绕交易、合约、密钥管理,数据,可视化管理来设计各个模块,开发者可以根据业务所需,选择子系统进行部署。WeBASE屏蔽了区块链底层的复杂度,降低开发者的门槛,大幅提高区块链应用的开发效率,包含节点前置、节点管理、交易链路,数据导出,Web管理平台等子系统。
建立区块链应用开发标准¶
WeBASE将区块链应用开发标准化,按照部署、配置、开发智能合约、开发应用层、在线运维管理五个步骤即可完成一个区块链应用的开发,详细开发流程请参阅 使用WeBASE开发区块链应用
设计原则¶
按需部署 WeBASE抽象应用开发的诸多共性模块,形成各类服务组件,开发者根据需要部署所需组件。
微服务 WeBASE采用微服务架构,基于Spring Boot框架,提供RESTful风格接口。
零耦合 WeBASE所有子系统独立存在,均可独立部署,独立提供服务。
可定制 前端页面往往带有自身的业务属性,因此WeBASE采用前后端分离的技术,便于开发者基于后端接口定制自己的前端页面。
整体架构¶
完整的部署架构如下,其中WeBASE-Front需要和区块链节点同机部署。
功能介绍¶
从可视化,智能合约,交易,数据四个维度设计各个中间件,各模块主要功能如下
各子系统简介¶
节点前置服务
集成web3sdk,提供RESTful风格的接口,客户端可以使用http的形式和节点进行交互,内置内存数据库,采集节点健康度数据。内置web控制台,实现节点的可视化操作。
节点管理服务
处理前端页面所有web请求,管理各个节点的状态,管理链上所有智能合约,对区块链的数据进行统计、分析,对异常交易的审计,私钥管理等。
WeBASE管理平台 可视化操作平台,可基于此平台查看节点信息,开发智能合约等。
交易服务
接收交易请求,缓存交易到数据库中,异步上链,可大幅提升吞吐量,解决区块链的tps瓶颈。
私钥托管和签名服务 托管用户私钥,提供云端签名。
链管理服务子系统 支持管理多条链和动态群组管理功能,支持国密链、非国密链。
数据统计服务子系统 以前置为基础,拉取CPU、内存、IO、群组大小、群组gas、群组网络流量的数据,记录数据库。
数据监管服务 以前置为基础,导出区块链数据并解析,提供一个可视化的监管视图。可以查询交易属于哪条链,哪个用户,哪个合约,保证链上数据可查可管。
各子系统的技术文档可到WeBASE子系统文档中查看
版本及兼容¶
支持FISCO-BCOS 2.X.X系列版本¶
WeBASE v1.5.0¶
WeBASE v1.5.0 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.2版本。
WeBASE v1.4.3¶
WeBASE v1.4.3 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.1版本。
WeBASE v1.4.2¶
WeBASE v1.4.2 版本支持 FISCO-BCOS 2.4.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.0版本。
WeBASE v1.4.1¶
WeBASE v1.4.1 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.6.0版本。
WeBASE v1.4.0¶
WeBASE v1.4.0 版本支持 FISCO-BCOS 2.4.x, 2.5.x版本,推荐使用2.4.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.4.1+版本。
WeBASE v1.3.2¶
WeBASE v1.3.2版本支持FISCO-BCOS 2.4.x版本,暂未支持2.5.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.4.1+版本。
WeBASE v1.3.1¶
WeBASE v1.3.1版本支持FISCO-BCOS 2.4.x版本,暂未支持2.5.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.4.0+版本。
WeBASE v1.3.0¶
WeBASE v1.3.0版本支持FISCO-BCOS 2.0.0 - 2.4.x版本,暂未支持2.5.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.3.0+版本。
WeBASE v1.2.4¶
WeBASE v1.2.4版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.3.0版本。
WeBASE v1.2.3¶
WeBASE v1.2.3版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.2.0版本。
WeBASE v1.2.2¶
WeBASE v1.2.2版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.2.0版本。
WeBASE v1.2.1¶
WeBASE v1.2.1版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0,FISCO-BCOS v2.1.0。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.1.0版本。
WeBASE v1.2.0¶
WeBASE v1.2.0版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0,FISCO-BCOS v2.1.0。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.1.0版本。
WeBASE V1.1.0¶
WeBASE V1.1.0版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0,FISCO-BCOS v2.1.0。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.1.0版本。
WeBASE V1.0.0¶
支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.0.0-rc3版本。
支持FISCO-BCOS 1.3.X系列版本¶
WeBASE V0.5.X版本支持FISCO-BCOS 1.3.X系列版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS推荐使用FISCO BCOS 1.3.8 Release。
服务搭建详见Release tag代码里的README.md
快速入门搭建¶
在区块链应用开发阶段建议用户使用快速入门搭建。在快速入门搭建模式,开发者只需要搭建节点和节点前置服务(WeBASE-Front),就可通过WeBASE-Front的合约编辑器进行合约的编辑,编译,部署,调试。
节点搭建¶
节点搭建的方法建议使用build_chain。
节点前置服务搭建¶
前提条件
依赖软件 | 支持版本 |
---|---|
Java | JDK 8 至JDK 14 |
备注:部署出现问题请查看问题记录。
下载安装包
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/webase-front.zip
解压
unzip webase-front.zip cd webase-front
拷贝sdk证书文件(build_chain的时候生成的)
将节点所在目录
nodes/${ip}/sdk
下的所有文件拷贝到当前conf
目录,供SDK与节点建立连接时使用(SDK会自动判断是否为国密,且是否使用国密SSL)- 链的
sdk
目录包含了ca.crt, sdk.crt, sdk.key
和gm
文件夹,gm
文件夹包含了国密SSL所需的证书 - 拷贝命令可使用
cp -r nodes/${ip}/sdk/* ./conf/
- 注,只有在建链时手动指定了
-G
(大写)时节点才会使用国密SSL
- 链的
服务启停
服务启停命令:
启动: bash start.sh 停止: bash stop.sh 检查: bash status.sh
启动成功将出现如下日志:
...
Application() - main run success...
状态检查¶
成功部署后,可以根据以下步骤确认各个子服务是否启动成功
1. 检查各子系统进程¶
通过ps
命令,检查节点与节点前置的进程是否存在
- 包含:节点进程
nodeXX
,节点前置进程webase.front
检查方法如下,若无输出,则代表进程未启动,需要到webase-front/log
中查看日志的错误信息,并根据错误提示或根据WeBASE-Front常见问题进行错误排查
检查节点进程
$ ps -ef | grep node
输出如下,此处部署了两个节点node0, node1
root 29977 1 1 17:24 pts/2 00:02:20 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
root 29979 1 1 17:24 pts/2 00:02:23 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini
检查节点前置webase-front的进程
$ ps -ef | grep webase.front
输出如下
root 31805 1 0 17:24 pts/2 00:01:30 /usr/local/jdk/bin/java -Djdk.tls.namedGroups=secp256k1 ... conf/:apps/*:lib/* com.webank.webase.front.Application
2. 检查进程端口¶
通过netstat
命令,检查节点与节点前置的端口监听情况
检查方法如下,若无输出,则代表进程端口监听异常,需要到webase-front/log
中查看日志的错误信息,并根据错误提示或根据WeBASE-Front常见问题进行错误排查
检查节点channel端口(默认为20200)是否已监听
$ netstat -anlp | grep 20200
输出如下
tcp 0 0 0.0.0.0:20200 0.0.0.0:* LISTEN 29069/fisco-bcos
检查webase-front端口(默认为5002)是否已监听
$ netstat -anlp | grep 5002
输出如下
tcp6 0 0 :::5002 :::* LISTEN 2909/java
3. 检查服务日志¶
日志中若出现报错信息,可根据信息提示判断服务是否异常,也可以参考并根据错误提示或根据WeBASE-Front常见问题进行错误排查
- 如果节点进程已启用且端口已监听,可跳过本章节
- 如果节点前置异常,如检查不到进程或端口监听,则需要
webase-front/log
中查看日志的错误信息 - 如果检查步骤出现检查不到进程或端口监听等异常,或者前置服务无法访问,可以按以下顺序逐步检查日志:
- 检查
webase-front/log
中查看节点前置日志的错误信息,如果无错误,且日志最后出现application run success
字样则代表运行成功 - 检查
nodes/127.0.0.1/nodeXXX/log
中的节点日志
- 检查
查看运行成功日志:webase-front运行成功后会打印日志main run success
,可以通过搜索此关键字来确认服务正常运行。
如,检查webase-front日志,其他webase服务可进行类似操作
$ cd webase-front
$ grep -B 3 "main run success" log/WeBASE-Front.log
输出如下:
2020-12-09 15:47:25.355 [main] INFO ScheduledAnnotationBeanPostProcessor() - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
2020-12-09 15:47:25.378 [main] INFO TomcatEmbeddedServletContainer() - Tomcat started on port(s): 5002 (http)
2020-12-09 15:47:25.383 [main] INFO Application() - Started Application in 6.983 seconds (JVM running for 7.768)
2020-12-09 15:47:25.383 [main] INFO Application() - main run success...
启动失败或无法使用时,欢迎到WeBASE-Front提交Issue或到技术社区共同探讨
- 提交Issue或讨论问题时,可以在issue中配上自己的环境配置,操作步骤,错误现象,错误日志等信息,方便社区用户快速定位问题
访问¶
访问 http://{deployIP}:{frontPort}/WeBASE-Front,示例:
```
http://localhost:5002/WeBASE-Front
```
注:若服务启动后无异常,但仍然无法访问,可以检查服务器的网络安全策略:
- 开放节点前置端口:如果希望通过浏览器(Chrome Safari或Firefox)直接访问webase-front节点前置的页面,则需要开放节点前置端口
frontPort
(默认5002)
Docker镜像快速搭建¶
WeBASE提供结合FISCO BCOS节点与WeBASE-Front的Docker镜像,通过镜像快速部署需要的步骤如下:
- 通过build_chain建链脚本(指定
-d
docker模式)生成节点所需证书、配置文件等- 如生成4节点
bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -o nodes -d
- 如生成4节点
- 拉取镜像:
docker pull fiscoorg/fisco-webase:v2.7.2
- 启动容器:需要将生成的
nodes
目录的node0的配置、SDK证书挂载到容器中,并将容器内的日志挂载到/nodes/127.0.0.1/node0/front-log
中- 启动命令:
docker run -d -v /nodes/127.0.0.1/node0:/data -v /nodes/127.0.0.1/sdk:/data/sdk -v /nodes/127.0.0.1/node0/front-log:/front/log --network=host -w=/data fiscoorg/fisco-webase:v2.7.2
- 启动命令:
WeBASE的Docker镜像的使用详情可以参考front镜像模式使用说明
一键部署¶
一键部署可以在 同机 快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。
一键部署会搭建:节点(FISCO-BCOS 2.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。其中,节点的搭建是可选的,可以通过配置来选择使用已有链或者搭建新链。一键部署架构如下:
架构图
前提条件¶
环境 | 版本 |
---|---|
Java | JDK 8 至JDK 14 |
MySQL | MySQL-5.6及以上 |
Python | Python3.6及以上 |
PyMySQL |
检查环境¶
平台要求¶
推荐使用CentOS 7.2+, Ubuntu 16.04及以上版本, 一键部署脚本将自动安装openssl, curl, wget, git, nginx, dos2unix
相关依赖项。
其余系统可能导致安装依赖失败,可自行安装openssl, curl, wget, git, nginx, dos2unix
依赖项后重试
检查Python¶
使用Python3.6或以上版本:
python --version
# python3时
python3 --version
如已安装python3,也可通过python3 --version
查看,在运行脚本时,使用python3
命令即可
- Python3安装部署可参考Python部署
PyMySQL部署(Python3.6+)¶
Python3.6及以上版本,需安装PyMySQL
依赖包
CentOS
sudo yum -y install python36-pip sudo pip3 install PyMySQL
Ubuntu
sudo apt-get install -y python3-pip sudo pip3 install PyMySQL
CentOS或Ubuntu不支持pip命令的话,可以使用以下方式:
git clone https://github.com/PyMySQL/PyMySQL
cd PyMySQL/
python3 setup.py install
检查服务器网络策略¶
网络策略检查:
- 开放WeBASE管理平台端口:检查webase-web管理平台页面的端口
webPort
(默认为5000)在服务器的网络安全组中是否设置为开放。如,云服务厂商如腾讯云,查看安全组设置,为webase-web开放5000端口。若端口未开放,将导致浏览器无法访问WeBASE服务页面 - 开放节点前置端口:如果希望通过浏览器直接访问webase-front节点前置的页面,则需要开放节点前置端口
frontPort
(默认5002);由于节点前置直连节点,不建议对公网开放节点前置端口,建议按需开放
拉取部署脚本¶
获取部署安装包:
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/webase-deploy.zip
解压安装包:
unzip webase-deploy.zip
进入目录:
cd webase-deploy
修改配置¶
① mysql数据库需提前安装,已安装直接配置即可,还未安装请参看数据库部署;
② 修改配置文件(vi common.properties
),没有变化的可以不修改;
- 若使用可视化部署,则忽略下文,将修改
visual-deploy.properties
,并进行可视化部署依赖服务的一键安装,具体请参考可视化部署-一键安装依赖服务
③ 一键部署支持使用已有链或者搭建新链。通过参数”if.exist.fisco”配置是否使用已有链,以下配置二选一即可:
- 当配置”yes”时,需配置已有链的路径
fisco.dir
。路径下要存在sdk目录,sdk目录中包含ca.crt, sdk.crt, sdk.key及gm目录,gm目录中包含国密SSL所需证书,包含gmca.crt、gmsdk.crt、gmsdk.key、gmensdk.crt和gmensdk.key - 当配置”no”时,需配置节点fisco版本和节点安装个数,搭建的新链默认两个群组
如果不使用一键部署搭建新链,可以参考FISCO BCOS官方文档搭建 FISCO BCOS部署流程;
注:使用国密版需要修改设置配置项encrypt.type=1
。前置SDK与节点默认使用非国密SSL,如果需要使用国密SSL,需要修改设置配置项encrypt.sslType=1
。
④ 服务端口不能小于1024
⑤ 部署时,修改 common.properties
配置文件
# WeBASE子系统的最新版本(v1.1.0或以上版本)
webase.web.version=v1.5.0
webase.mgr.version=v1.5.0
webase.sign.version=v1.5.0
webase.front.version=v1.5.0
# 节点管理子系统mysql数据库配置
mysql.ip=127.0.0.1
mysql.port=3306
mysql.user=dbUsername
mysql.password=dbPassword
mysql.database=webasenodemanager
# 签名服务子系统mysql数据库配置
sign.mysql.ip=localhost
sign.mysql.port=3306
sign.mysql.user=dbUsername
sign.mysql.password=dbPassword
sign.mysql.database=webasesign
# 节点前置子系统h2数据库名和所属机构
front.h2.name=webasefront
front.org=fisco
# WeBASE管理平台服务端口
web.port=5000
# 启用移动端管理平台 (0: disable, 1: enable)
web.h5.enable=1
# 节点管理子系统服务端口
mgr.port=5001
# 节点前置子系统端口
front.port=5002
# 签名服务子系统端口
sign.port=5004
# 节点监听Ip
node.listenIp=127.0.0.1
# 节点p2p端口
node.p2pPort=30300
# 节点链上链下端口
node.channelPort=20200
# 节点rpc端口
node.rpcPort=8545
# 加密类型 (0: ECDSA算法, 1: 国密算法)
encrypt.type=0
# SSL连接加密类型 (0: ECDSA SSL, 1: 国密SSL)
# 只有国密链才能使用国密SSL
encrypt.sslType=0
# 是否使用已有的链(yes/no)
if.exist.fisco=no
# 使用已有链时需配置
# 已有链的路径,start_all.sh脚本所在路径
# 路径下要存在sdk目录(sdk目录中包含了SSL所需的证书,即ca.crt、sdk.crt、sdk.key和gm目录(包含国密SSL证书,gmca.crt、gmsdk.crt、gmsdk.key、gmensdk.crt和gmensdk.key)
fisco.dir=/data/app/nodes/127.0.0.1
# 前置所连接节点的绝对路径
# 节点路径下要存在conf文件夹,conf里存放节点证书(ca.crt、node.crt和node.key)
node.dir=/data/app/nodes/127.0.0.1/node0
# 搭建新链时需配置
# FISCO-BCOS版本
fisco.version=2.7.2
# 搭建节点个数(默认两个)
node.counts=nodeCounts
部署¶
- 执行installAll命令,部署服务将自动部署FISCO BCOS节点,并部署 WeBASE 中间件服务,包括签名服务(sign)、节点前置(front)、节点管理服务(node-mgr)、节点管理前端(web)
备注:
- 部署脚本会拉取相关安装包进行部署,需保持网络畅通
- 首次部署需要下载编译包和初始化数据库,重复部署时可以根据提示不重复操作
- 部署过程中出现报错时,可根据错误提示进行操作,或根据本文档中的常见问题进行排查
- 不要用sudo执行脚本,例如
sudo python3 deploy.py installAll
(sudo会导致无法获取当前用户的环境变量如JAVA_HOME)
# 部署并启动所有服务
python3 deploy.py installAll
部署完成后可以看到deploy has completed
的日志:
$ python3 deploy.py installAll
...
============================================================
_ _ ______ ___ _____ _____
| | | | | ___ \/ _ \/ ___| ___|
| | | | ___| |_/ / /_\ \ `--.| |__
| |/\| |/ _ | ___ | _ |`--. | __|
\ /\ | __| |_/ | | | /\__/ | |___
\/ \/ \___\____/\_| |_\____/\____/
...
...
============================================================
============== deploy has completed ==============
============================================================
============== webase-web version v1.5.0 ========
============== webase-node-mgr version v1.5.0 ========
============== webase-sign version v1.5.0 ========
============== webase-front version v1.5.0 ========
============================================================
- 服务部署后,需要对各服务进行启停操作,可以使用以下命令:
# 一键部署
部署并启动所有服务 python3 deploy.py installAll
停止一键部署的所有服务 python3 deploy.py stopAll
启动一键部署的所有服务 python3 deploy.py startAll
# 各子服务启停
启动FISCO-BCOS节点: python3 deploy.py startNode
停止FISCO-BCOS节点: python3 deploy.py stopNode
启动WeBASE-Web: python3 deploy.py startWeb
停止WeBASE-Web: python3 deploy.py stopWeb
启动WeBASE-Node-Manager: python3 deploy.py startManager
停止WeBASE-Node-Manager: python3 deploy.py stopManager
启动WeBASE-Sign: python3 deploy.py startSign
停止WeBASE-Sign: python3 deploy.py stopSign
启动WeBASE-Front: python3 deploy.py startFront
停止WeBASE-Front: python3 deploy.py stopFront
# 可视化部署
部署并启动可视化部署的所有服务 python3 deploy.py installWeBASE
停止可视化部署的所有服务 python3 deploy.py stopWeBASE
启动可视化部署的所有服务 python3 deploy.py startWeBASE
状态检查¶
成功部署后,可以根据以下步骤确认各个子服务是否启动成功
检查各子系统进程¶
通过ps
命令,检查各子系统的进程是否存在
- 包含:节点进程
nodeXX
,节点前置进程webase.front
,节点管理服务进程webase.node.mgr
,节点管理平台webase-web
的nginx
进程,以及签名服务进程webase.sign
检查方法如下,若无输出,则代表进程未启动,需要到该子系统的日志中检查日志错误信息,并根据错误提示或本文档的常见问题进行排查
- 检查节点进程,此处部署了两个节点node0, node1
$ ps -ef | grep node
输出如下
root 29977 1 1 17:24 pts/2 00:02:20 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
root 29979 1 1 17:24 pts/2 00:02:23 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini
- 检查节点前置webase-front的进程
$ ps -ef | grep webase.front
输出如下
root 31805 1 0 17:24 pts/2 00:01:30 /usr/local/jdk/bin/java -Djdk.tls.namedGroups=secp256k1 ... conf/:apps/*:lib/* com.webank.webase.front.Application
- 检查节点管理服务webase-node-manager的进程
$ ps -ef | grep webase.node.mgr
输出如下
root 4696 1 0 17:26 pts/2 00:00:40 /usr/local/jdk/bin/java -Djdk.tls.namedGroups=secp256k1 ... conf/:apps/*:lib/* com.webank.webase.node.mgr.Application
- 检查webase-web的nginx进程
$ ps -ef | grep webase |grep nginx
输出如下
root 5141 1 0 Dec08 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /root/fisco/webase/webase-deploy/comm/nginx.conf
- 检查签名服务webase-sign的进程
$ ps -ef | grep webase.sign
输出如下
root 30718 1 0 17:24 pts/2 00:00:19 /usr/local/jdk/bin/java ... conf/:apps/*:lib/* com.webank.webase.sign.Application
检查进程端口¶
通过netstat
命令,检查各子系统进程的端口监听情况。
检查方法如下,若无输出,则代表进程端口监听异常,需要到该子系统的日志中检查日志错误信息,并根据错误提示或本文档的常见问题进行排查
- 检查节点channel端口(默认为20200)是否已监听
$ netstat -anlp | grep 20200
输出如下
tcp 0 0 0.0.0.0:20200 0.0.0.0:* LISTEN 29069/fisco-bcos
- 检查webase-front端口(默认为5002)是否已监听
$ netstat -anlp | grep 5002
输出如下
tcp6 0 0 :::5002 :::* LISTEN 2909/java
- 检查webase-node-mgr端口(默认为5001)是否已监听
$ netstat -anlp | grep 5001
输出如下
tcp6 0 0 :::5001 :::* LISTEN 14049/java
- 检查webase-web端口(默认为5000)在nginx是否已监听
$ netstat -anlp | grep 5000
输出如下
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 3498/nginx: master
- 检查webase-sign端口(默认为5004)是否已监听
$ netstat -anlp | grep 5004
输出如下
tcp6 0 0 :::5004 :::* LISTEN 25271/java
检查服务日志¶
各子服务的日志路径如下:¶
|-- webase-deploy # 一键部署目录
|--|-- log # 部署日志目录
|--|-- webase-web # 管理平台目录
|--|--|-- log # 管理平台日志目录
|--|-- webase-node-mgr # 节点管理服务目录
|--|--|-- log # 节点管理服务日志目录
|--|-- webase-sign # 签名服务目录
|--|--|-- log # 签名服务日志目录
|--|-- webase-front # 节点前置服务目录
|--|--|-- log # 节点前置服务日志目录
|--|-- nodes # 一件部署搭链节点目录
|--|--|-- 127.0.0.1
|--|--|--|-- node0 # 具体节点目录
|--|--|--|--|-- log # 节点日志目录
备注:当前节点日志路径为一键部署搭链的路径,使用已有链请在相关路径查看日志
日志目录中包含{XXX}.log
全量日志文件和{XXX}-error.log
错误日志文件
- 通过日志定位错误问题时,可以结合
.log
全量日志和-error.log
错误日志两种日志信息进行排查。,如查询WeBASE-Front日志,则打开WeBASE-Front-error.log
可以快速找到错误信息,根据错误查看WeBASE-Front.log
的相关内容,可以看到错误日志前后的普通日志信息
检查服务日志有无错误信息¶
- 如果各个子服务的进程已启用且端口已监听,可直接访问下一章节访问WeBASE
- 如果上述检查步骤出现异常,如检查不到进程或端口监听,则需要按日志路径进入异常子服务的日志目录,检查该服务的日志
- 如果检查步骤均无异常,但服务仍无法访问,可以分别检查部署日志
deployLog
,节点前置日志frontLog
, 节点管理服务日志nodeMgrLog
进行排查:- 检查webase-deploy/log中的部署日志,是否在部署时出现错误
- 检查webase-deploy/webase-front/log中的节点前置日志,如果最后出现
application run success
字样则代表运行成功 - 检查webase-deploy/webase-node-mgr/log或webase-deploy/webase-sign/log中的日志
- 检查webase-deploy/nodes/127.0.0.1/nodeXXX/log中的节点日志
搜索日志¶
通过查看日志可以检查服务的运行状态,我们可以进入各子服务的日志路径,通过grep
检查日志文件,以此判断服务是否正常运行
- 查看运行成功日志:WeBASE子服务运行成功后均会打印日志
main run success
,可以通过搜索此关键字来确认服务正常运行。
如,检查webase-front日志,其他WeBASE服务可进行类似操作
$ cd webase-front
$ grep -B 3 "main run success" log/WeBASE-Front.log
输出如下:
2020-12-09 15:47:25.355 [main] INFO ScheduledAnnotationBeanPostProcessor() - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
2020-12-09 15:47:25.378 [main] INFO TomcatEmbeddedServletContainer() - Tomcat started on port(s): 5002 (http)
2020-12-09 15:47:25.383 [main] INFO Application() - Started Application in 6.983 seconds (JVM running for 7.768)
2020-12-09 15:47:25.383 [main] INFO Application() - main run success...
- 查看报错日志:出现异常时,可以搜索关键字
ERROR
进行检查
如,检查webase-front错误日志,其他WeBASE服务可进行类似操作
$ cd webase-front
$ grep "ERROR" log/WeBASE-Front.log
输出如下
2020-12-09 09:10:42.138 [http-nio-5002-exec-1] ERROR ExceptionsHandler() - catch frontException: no active connection available network exception requset send failed! please check the log file content for reasons.
2020-12-09 09:10:42.145 [http-nio-5002-exec-4] ERROR Web3ApiService() - getBlockNumber fail.
如果出现错误日志,根据错误提示或本文档的常见问题进行排查
启动失败或无法使用时,欢迎到WeBASE提交Issue或到技术社区共同探讨。
- 提交Issue或讨论问题时,可以在issue中配上自己的环境配置,操作步骤,错误现象,错误日志等信息,方便社区用户快速定位问题
访问¶
WeBASE管理平台:
- 一键部署完成后,打开浏览器(Chrome Safari或Firefox)访问
http://{deployIP}:{webPort}
示例:http://localhost:5000
备注:
- 部署服务器IP和管理平台服务端口需对应修改,网络策略需开通
- 使用云服务厂商的服务器时,需要开通网络安全组的对应端口。如开放webase使用的5000端口
- WeBASE管理平台使用说明请查看使用手册(获取WeBASE管理平台默认账号和密码,并初始化系统配置)
- 默认账号为
admin
,默认密码为Abcd1234
。首次登陆要求重置密码 - 添加节点前置WeBASE-Front到WeBASE管理平台;一键部署时,节点前置与节点管理服务默认是同机部署,添加前置则填写IP为
127.0.0.1
,默认端口为5002
。参考上文中common.properties
的配置项front.port={frontPort}
- 默认账号为
- 检查节点前置是否启动,可以通过访问
http://{frontIp}:{frontPort}/WeBASE-Front
(默认端口5002);访问前,确保服务端已对本地机器开放端口,如开放front的5002端口。(不建议节点前置的端口对公网开放访问权限,应对部分机器IP按需开放)
附录¶
1. Java环境部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,推荐JDK8-JDK13版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
2. 数据库部署¶
此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网。
① 安装MariaDB¶
- 安装命令
sudo yum install -y mariadb*
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasenodemanager;
3. Python部署¶
python版本要求使用python3.x, 推荐使用python3.6及以上版本
CentOS
sudo yum install -y python36 sudo yum install -y python36-pip
Ubuntu
// 添加仓库,回车继续 sudo add-apt-repository ppa:deadsnakes/ppa // 安装python 3.6 sudo apt-get install -y python3.6 sudo apt-get install -y python3-pip
常见问题¶
1. Python命令出错¶
- SyntaxError报错
File "deploy.py", line 62
print helpMsg
^
SyntaxError: Missing parentheses in call to "print". Did you mean print(helpMsg)?
- 找不到fallback关键字
File "/home/ubuntu/webase-deploy/comm/utils.py", line 127, in getCommProperties
value = cf.get('common', paramsKey,fallback=None)
TypeError: get() got an unexpected keyword argument 'fallback'
答:检查Python版本,推荐使用python3.6及以上版本
2. 使用Python3时找不到pymysql¶
Traceback (most recent call last):
...
ImportError: No module named 'pymysql'
答:需要安装PyMySQL,安装请参看 pymysql
3. 部署时某个组件失败,重新部署提示端口被占用问题¶
答:因为有个别组件是启动成功的,需先执行“python deploy.py stopAll”将其停止,再执行“python deploy.py installAll”部署全部。
4. 管理平台启动时Nginx报错¶
...
============== WeBASE-Web start... ==============
Traceback (most recent call last):
...
Exception: execute cmd error ,cmd : sudo /usr/local/nginx/sbin/nginx -c /data/app/webase-deploy/comm/nginx.conf, status is 256 ,output is nginx: [emerg] open() "/etc/nginx/mime.types" failed (2: No such file or directory) in /data/app/webase-deploy/comm/nginx.conf:13
答:缺少/etc/nginx/mime.types文件,建议重装nginx。
5. 部署时数据库访问报错¶
...
checking database connection
Traceback (most recent call last):
File "/data/temp/webase-deploy/comm/mysql.py", line 21, in dbConnect
conn = mdb.connect(host=mysql_ip, port=mysql_port, user=mysql_user, passwd=mysql_password, charset='utf8')
File "/usr/lib64/python2.7/site-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 193, in __init__
super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
答:确认数据库用户名和密码
6. 节点sdk目录不存在¶
...
======= FISCO-BCOS sdk dir:/data/app/nodes/127.0.0.1/sdk is not exist. please check! =======
答:确认节点安装目录下有没有sdk目录(企业部署工具搭建的链可能没有),如果没有,需手动创建”mkdir sdk”,并将节点证书(ca.crt、sdk.key、sdk.crt、node.crt、node.key)复制到该sdk目录,再重新部署。如果是国密链,并且sdk和节点使用国密ssl连接时,需在sdk目录里创建gm目录,gm目录存放国密sdk证书(gmca.crt、gmsdk.crt、gmsdk.key、gmensdk.crt和gmensdk.key)。
7. 前置启动报错“nested exception is javax.net.ssl.SSLException”¶
...
nested exception is javax.net.ssl.SSLException: Failed to initialize the client-side SSLContext: Input stream not contain valid certificates.
答:CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK无法正常连接区块链节点,因此在使用CentOS操作系统时,推荐使用OracleJDK。
8.前置启动报错“Processing bcos message timeout”¶
...
[main] ERROR SpringApplication() - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractController': Unsatisfied dependency expressed through field 'contractService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractService': Unsatisfied dependency expressed through field 'web3jMap'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'web3j' defined in class path resource [com/webank/webase/front/config/Web3Config.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.HashMap]: Factory method 'web3j' threw exception; nested exception is java.io.IOException: Processing bcos message timeout
...
答:一些OpenJDK版本缺少相关包,导致节点连接异常。推荐使用OracleJDK。
9. 服务进程起来了,服务不正常¶
...
======= WeBASE-Node-Manager starting . Please check through the log file (default path:./webase-node-mgr/log/). =======
答:查看日志,确认问题原因。确认后修改重启,如果重启提示服务进程在运行,先执行“python deploy.py stopAll”将其停止,再执行“python deploy.py startAll”重启。
10. WeBASE-Web登录页面的验证码加载不出来¶
答:检查WeBASE-Node-Manager后台服务是否已启动成功。若启动成功,检查后台日志:
进入
webase-node-mgr
目录下,执行bash status.sh
检查服务是否启动,如果服务没有启动,运行bash start.sh
启动服务;如果服务已经启动,按照如下修改日志级别
webase-node-mgr/conf/application.yml
#log config logging: level: com.webank.webase.node.mgr: debug
webase-node-mgr/conf/log/log4j2.xml
<Loggers> <Root level="debug"> <AppenderRef ref="asyncInfo"/> <AppenderRef ref="asyncErrorLog"/> </Root> </Loggers>
修改日志level后,重启服务
bash stop.sh && bash start.sh
重启服务后,检查日志文件
log/WeBASE-Node-Manager.log
。- 检查是否有异常信息。如果有异常信息,根据具体的异常信息检查环境配置,或者通过搜索引擎进行排查。
11. WeBASE 国内镜像与CDN加速服务¶
答:WeBASE CDN 加速服务提供 WeBASE 各子系统安装包的下载服务,可参考国内镜像和CDN加速攻略
企业部署¶
可视化部署¶
可视化部署是指通过 WeBASE 管理平台(WeBASE-Web + WeBASE-Node-Manager),在 多台 主机上快速部署 FISCO-BCOS 底层节点和 WeBASE-Front 前置 以及 对底层节点的扩容操作。
可视化部署,需要先部署依赖服务,包括管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、签名服务(WeBASE-Sign)。
然后通过 WeBASE 管理平台(WeBASE-Web)的界面在填入的主机中部署节点(FISCO-BCOS 2.5.0+)和节点前置子系统(WeBASE-Front 1.4.0+)。
系统环境¶
硬件配置¶
使用可视化部署搭建一个 至少2 节点 的区块链服务,WeBASE(WeBASE-Node-Manager + WeBASE-Sign)至少配置 1G 空闲内存(用于节点管理服务与签名服务)、每个节点+前置的镜像配置至少2G空闲内存(CPU内核数与节点数正相关,如4核可配置4节点),在进行可视化部署时会进行主机的可用内存检测。
注意:
- 在企业级部署时,为了安全,推荐将签名服务(WeBASE-Sign)放在内网中,与管理平台、管理子系统分开部署。此处为了方便演示,因此将签名服务(WeBASE-Sign)部署在同一台主机。
具体配置
名称 | 最低配置 | 推荐配置 |
---|---|---|
CPU | 2 核 | 4 核 |
内存 | 4 G | 8 G |
磁盘 | 100G + | 500G + |
端口开放¶
主机防火墙需要开放以下端口。如果是云服务器,需要配置云服务器安全组策略中的端口开放规则。
端口 | 描述 |
---|---|
22 | 默认SSH登录端口 |
5000 | WeBASE-Web 节点管理平台的访问端口 |
默认使用22作为SSH登录端口,若需要修改,在Ansible hosts配置中可指定SSH端口
注,需要确保链节点的端口对彼此开放,如P2P端口(默认30300)、节点前置的端口(默认5002)。
系统依赖¶
配置系统依赖分成宿主机(Node-Manager所在主机)与节点主机(节点所在主机)两种:
- 宿主机:安装WeBASE-Node-Manager的主机,配置Ansible、配置Ansible免密登录节点机
- 节点主机:用于安装节点的主机,配置docker及docker用户组、配置Ansible用户的sudo权限、安装FISCO BOCS节点依赖
注:宿主机也需要安装节点时,则需要同时配置
配置Ansible¶
Ansible配置包括以下三步:
- 宿主机安装Ansible
- 仅在宿主机安装节点时,则仅需安装Ansible,无需完成下面两步host与免密配置
- 配置Ansible host列表
- 配置Ansible免密登录到节点主机
安装Ansible¶
注:Ansible只需要安装在宿主机上,节点主机无需安装Ansible,只需配置宿主机到节点主机的免密登录
CentOS
yum install epel-release -y
yum install ansible –y
Ubuntu
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible
安装完成后,可以通过--version
检查是否安装成功
$ ansible --version
ansible 2.9.15
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.17 (default, Sep 30 2020, 13:38:04) [GCC 7.5.0]
仅在宿主机安装节点时,无需操作下文的Ansible host配置和免密配置,直接进入配置Docker章节,并在部署节点时,添加主机的IP为127.0.0.1
配置Ansible host_key_checking¶
配置Ansible的Host key checking,将自动确认连接到远程主机
vi /etc/ansible/ansible.cfg
# 找到host_key_checking选项
···
host_key_checking = False
免密登录配置¶
在节点管理台进行可视化部署时,节点管理(WeBASE-Node-Manager)服务会为每个节点生成相应的配置文件,然后通过Ansible的免密登录远程操作,在远程的节点主机中执行系统命令来操作节点。
下面介绍配置免密登录的各个步骤
重要
- 配置 WeBASE-Node-Manager 主机到其它节点主机的 SSH 免密登录;
- 配置Ansible的hosts列表并配置免密登录私钥路径
- 注意免密登录的账号sudo权限,否则会造成Docker服务启动、检测端口占用失败;
- 如果免密账号为非 root 账号,保证账号有 sudo 免密 权限,即使用 sudo 执行命令时,不需要输入密码;参考本章节的[sudo账号配置]
免密登录配置方法
重要
- 如果 WeBASE-Node-Manager 所在主机已经生成过秘钥对,建议使用命令 ssh-keygen -t rsa -m PEM 重新生成;
登录 WeBASE-Node-Manager 所在主机:
ssh root@[IP]
检查
~/.ssh/
目录是否已经存在id_rsa
私钥文件和对应的id_rsa.pub
公钥文件。如果存在,备份现有私钥对mv ~/.ssh/id_rsa ~/.ssh/id_rsa.bak mv ~/.ssh/id_rsa.pub ~/.ssh/id_rsa.pub.bak
执行命令
ssh-keygen -t rsa -m PEM
,然后直接两次回车即可生成(提示输入密码时,直接回车)ssh-keygen -t rsa -m PEM
将公钥文件上传到需要免密登录的主机(替换 [IP] 为节点主机的 IP 地址),然后输入远程主机的登录密码
ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub root@[IP]
输出结果出现
Number of key(s) added: 1
结果,表示免密登录配置成功检查从部署 WeBASE-Node-Manager 服务的主机是否能成功免密登录部署节点的主机(替换 [IP] 为主机的 IP 地址)
ssh -o StrictHostKeyChecking=no root@[IP]
切记妥善保管免密登录的私钥,否则当前主机与ssh免密登录的主机均会被控制
此处配置宿主机免密登录到节点主机完成后,记住宿主机中id_rsa
私钥的路径,下一步进行Ansible中hosts的免密配置
配置Ansible Hosts与免密登录
在/etc/ansible/hosts
文件中添加IP组webase
,并配置节点主机的IP、免密登录账号和私钥路径、SSH端口。
注:若后续需要添加新的主机,需要将新主机的IP添加到此处
添加以下内容:此处假设节点机IP为127.0.0.1,免密登录账户为root,且id_rsa
免密私钥的路径为/root/.ssh/id_rsa
,ssh端口使用22端口,添加名为webase
的IP组
vi /etc/ansible/hosts
···
[webase]
127.0.0.1 ansible_ssh_private_key_file=/root/.ssh/id_rsa ansible_ssh_user=root ansible_ssh_port=22
{your_host_ip} ansible_ssh_private_key_file={ssh_private_key} ansible_ssh_user={ssh_user} ansible_ssh_port={ssh_port}
测试Ansible¶
执行Ansible的--list-hosts
命令查看是否已添加成功
ansible webase --list-hosts
hosts (2):
XXX.XXX.XXX.1
XXX.XXX.XXX.2
执行Ansible的ping
命令,检测添加到hosts中各个节点主机IP能否被访问,免密配置是否已生效
- 若出现
IP | SUCCESS
的则代表该IP可连通 - 如果出现
FAILED
代表该IP无法连接,需要根据上文的免密登录配置进行ssh -o StrictHostKeyChecking=no root@[IP]
检测
对ansible中的webase ip组进行ping检测
ansible webase -m ping
xxx.xxx.xxx.1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
xxx.xxx.xxx.2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
配置Docker¶
配置Docker需要在每个安装节点的主机上都要执行,否则将导致节点远程安装失败。包括以下几个步骤
- 安装Docker并启动Docker
- 配置Docker用户组
安装Docker¶
安装 Docker 服务,请参考下文常见问题中:Docker 安装
如果使用云服务器,推荐使用操作系统镜像模板的方式创建主机,即在一台主机上安装 Docker 后,然后使用安装 Docker 服务后的操作系统做一个镜像模板。通过这个模板镜像来创建主机,这样新创建的主机就自带了 Docker 服务。
配置docker用户组¶
若执行Docker命令,如docker ps
必须使用sudo才能运行,则需要按如下修改:
检测docker ps
命令
docker ps
若docker ps
命令报错Permission Denied则需要配置docker用户组:
# 创建docker用户组
sudo groupadd docker
# 将当前用户添加到docker用户组
sudo usermod -aG docker $USER
# 重启docker服务
sudo systemctl restart docker
# 切换或者退出当前账户,重新登入
exit
重新登入后,执行docker ps
如有输出,未报错Permission Denied则代表配置成功
拉取 Docker 镜像¶
在WeBASE v1.4.3版本后,可视化部署支持自动从CDN拉取镜像,无需手动拉取
若需要手动配置镜像,可以通过以下方法配置
可视化部署需要使用FISCO BCOS + WeBASE-Front
组成的节点与前置Docker镜像,并提供拉取Docker镜像的三种方式(推荐通过CDN加速服务拉取):
- 通过可视化部署页面,自动从CDN拉取镜像压缩包并加载镜像(推荐),需要确保wget命令能正常使用
- 在节点主机上手动通过WeBASE CDN服务下载镜像压缩包后,通过
docker load
命令安装镜像 - 在节点主机上手动通过
docker pull
命令直接从DockerHub拉取镜像
可视化自动部署功能支持自动从 Docker 仓库拉取镜像,仅通过页面点击就可以完成Docker拉取。但是由于DockerHub的网络原因,拉取镜像的速度较慢,耗时过长,容易导致拉取镜像失败,页面的可视化部署操作失败。 因此,为了保证部署过程顺利和快速完成,可在执行可视化部署前,手动拉取镜像,并将镜像上传到每个需要部署节点服务的主机。
拉取镜像的方法,请参考下文常见问题中:拉取 Docker 镜像
部署依赖服务¶
可视化部署需要依赖 WeBASE 的中间件服务,包括管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、签名服务(WeBASE-Sign)。
对于依赖服务的安装,有两种方式( 一键部署 和 手动部署 ),选择其中一种部署方式即可
1. 一键部署依赖服务¶
适合同机部署,快速体验WeBASE的情况使用
一键部署依赖
具体环境依赖参考一键部署-前提条件。
拉取部署脚本
获取部署安装包:
wget https://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/v1.5.0/webase-deploy.zip
# 若网络问题导致长时间无法下载,可尝试以下命令
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/webase-deploy.zip
解压安装包:
unzip webase-deploy.zip
进入目录:
cd webase-deploy
注意:
- 配置可视化部署配置文件时,选择
visual-deploy.properties
进行配置 - 选择部署方式时,选择 可视化部署 方式,即执行
deploy.py
脚本时,执行python3 deploy.py installWeBASE
修改 visual-deploy.properties
文件。
重要
注意: sign.ip 配置的 IP 是WeBASE-Sign签名服务对外提供服务访问的 IP 地址,供其他部署节点主机访问。
# WeBASE子系统的最新版本(v1.1.0或以上版本)
webase.web.version=v1.5.0
webase.mgr.version=v1.5.0
webase.sign.version=v1.5.0
fisco.webase.docker.cdn.version=v1.5.0
# 节点管理子系统mysql数据库配置
mysql.ip=127.0.0.1
mysql.port=3306
mysql.user=dbUsername
mysql.password=dbPassword
mysql.database=webasenodemanager
# 签名服务子系统mysql数据库配置
sign.mysql.ip=localhost
sign.mysql.port=3306
sign.mysql.user=dbUsername
sign.mysql.password=dbPassword
sign.mysql.database=webasesign
# WeBASE管理平台服务端口
web.port=5000
# 启用移动端管理平台 (0: disable, 1: enable)
web.h5.enable=1
# 节点管理子系统服务端口
mgr.port=5001
# 签名服务子系统端口
sign.port=5004
# WeBASE-Sign 对外提供服务的访问 IP 地址
# 部署在其它主机的节点前置,需要使用此 IP 访问 WeBASE-Sign 服务
# 不能是 127.0.0.1 或者 localhost
sign.ip=
# 是否使用国密(0: standard, 1: guomi)
# 此配置决定可视化部署搭建国密或非国密的链
encrypt.type=0
完成配置文件修改后,则执行部署:
备注:
- 部署脚本会拉取相关安装包进行部署,需保持网络畅通。
- 首次部署需要下载编译包和初始化数据库,重复部署时可以根据提示不重复操作
- 部署过程中出现报错时,可根据错误提示进行操作,或根据本文档中的常见问题进行排查
- 不建议使用sudo执行脚本,例如
sudo python3 deploy.py installWeBASE
(sudo会导致无法获取当前用户的环境变量如JAVA_HOME) - 推荐使用Python 3.6及以上版本
# 部署并启动可视化部署的所有服务
python3 deploy.py installWeBASE
如果遇到docker必须使用sudo运行,报错Docker....Permission Denied
,可以参考常见问题-创建docker用户组
部署完成后可以看到deploy has completed
的日志:
$ python3 deploy.py installWeBASE
...
============================================================
_ _ ______ ___ _____ _____
| | | | | ___ \/ _ \/ ___| ___|
| | | | ___| |_/ / /_\ \ `--.| |__
| |/\| |/ _ | ___ | _ |`--. | __|
\ /\ | __| |_/ | | | /\__/ | |___
\/ \/ \___\____/\_| |_\____/\____/
...
...
============================================================
============== deploy has completed ==============
============================================================
============== webase-web version v1.5.0 ========
============== webase-node-mgr version v1.5.0 ========
============== webase-sign version v1.5.0 ========
============================================================
- 服务部署后,需要对各服务进行启停操作,可以使用以下命令:
# 可视化部署
部署并启动可视化部署的所有服务 python3 deploy.py installWeBASE
停止可视化部署的所有服务 python3 deploy.py stopWeBASE
启动可视化部署的所有服务 python3 deploy.py startWeBASE
# 各子服务启停
启动WeBASE-Node-Manager: python3 deploy.py startManager
停止WeBASE-Node-Manager: python3 deploy.py stopManager
启动WeBASE-Web: python3 deploy.py startWeb
停止WeBASE-Web: python3 deploy.py stopWeb
启动WeBASE-Sign: python3 deploy.py startSign
停止WeBASE-Sign: python3 deploy.py stopSign
2. 手动部署依赖服务¶
适合多机部署,企业级的情况使用。
具体步骤如下:
- 签名服务(WeBASE-Sign)
- 参考 签名服务 WeBASE-Sign 部署文档 部署 WeBASE-Sign 服务。
- 安装后需要将Sign的外网IP Port配置到下文的WeBASE-Node-Manager中
- 管理平台(WeBASE-Web)
- 参考 节点管理平台 WeBASE-Web 部署文档 部署 WeBASE-Web 服务
- 节点管理子系统(WeBASE-Node-Manager)
- 参考 节点管理服务 WeBASE-Node-Manager 部署文档 部署 WeBASE-Node-Manager 服务
- 修改
WeBASE-Node-Manager/dist/conf/application.yml
配置文件示例如下:- 配置文件中
deployType
为1
,启用节点管理服务的可视化部署功能 - 配置文件中
webaseSignAddress
的 IP 地址,其余节点主机需要通过此IP访问签名服务;注,此处IP不能使用127.0.0.1
- 配置文件中
重要
- 注意 WeBASE-Node-Manager 服务的 webaseSignAddress 配置。WeBASE-Front 节点会使用此地址访问 WeBASE-Sign。所以不能使用 `127.0.0.1`,需要填写对外服务的 IP 地址。
constant:
# 1.4.0 visual deploy
# 部署方式修改为 1,启用可视化部署
deployType: 1
# WeBASE-Sign 服务的访问地址,前面部署的签名服务的访问地址
# 注意 IP 地址,WeBASE-Front 会使用此 IP 地址访问签名服务
# 因此,在可视化部署中,此处不能使用 127.0.0.1或localhost
webaseSignAddress: "xxx.xx.xx.xxx:5004"
可视化部署节点¶
在部署完依赖服务后,使用浏览器,访问节点管理平台页面:
# 默认端口 5000
http://{deployIP}:{webPort}
具体部署步骤,请参考下文进行部署操作
部署节点¶
可视化部署节点时,后台服务将通过在各个主机安装FISCO BCOS + WeBASE-Front
的Docker镜像,结合免密远程操作进行自动化部署节点与节点前置的过程。
因此,正如上文步骤中“拉取Docker镜像”的阐述,此操作依赖Docker服务,并默认从CDN自动加载节点与前置的Docker镜像
提示:
- 在执行部署前,请提前在节点机中 手动安装 Docker 服务
- 参考下文 常见问题 中的 安装 Docker
- 如果部署 国密 版本
- 国密链需要将WeBASE-Node-Manager yml中的
encryptType
配置修改为1
- 国密链需要将WeBASE-Node-Manager yml中的
- 部署时,默认的链名为
default_chain
,默认机构名为agency1
- 部署节点的所有操作将使用Ansible免密的免密SSH账号进行操作,请确保Ansible自检通过
打开节点管理平台页面后,登录后修改密码,默认进入可视化部署引导页,点击右上角可以进入主机管理开始部署节点
部署节点主要包含三步:添加并检测节点主机、初始化主机(检查Docker与安装依赖)
首先需要选中镜像拉取方式,推荐使用自动从CDN拉取并加载方式。离线环境或网络不好的情况下,推荐使用手动加载方式,提前在各个节点主机下载并加载镜像
(一)添加主机:
visual-deploy-host-add
添加主机时,需要填入主机的IP与部署节点的目录
- 仅在宿主机(即节点管理服务所在主机)部署节点时,则添加主机必须为127.0.0.1,否则填写公网IP或内网IP需要配置Ansible host
- 添加主机时,将检查该IP是否可以连通,同时将检查该主机的路径是否可访问,并自动创建该目录
visual-deploy-host-add
(二)添加节点信息:
visual-deploy-node-add
节点管理,先点击“新增节点”添加节点信息
- 可以在一台主机中指定节点数量
- 添加多个主机的节点,需要确保填入的各个主机间的P2P端口和前置端口互通,否则将影响节点正常运行
visual-deploy-node-info
(三)检查主机:
visual-deploy-start-check
添加节点信息后,将自动检查一下依赖
- 检查主机的可用内存是否支持当前的节点数
- 检测机器的端口是否已被占用
- 检测Docker服务是否已启用,并通过hello-world的镜像进行测试
visual-deploy-host-check
检测失败的信息将在操作日志中显示,只有添加的节点信息全部通过才可以开始下一步“初始化”
- 如果提示内存不足(Free memory too low),则可以释放主机内存,一节点至少 1G 可用内存(Free memory)
- 如果提示端口被占用,可根据提示的端口号,在主机释放端口或删除填入的节点信息,修改后重新填入
- 如果提示Docker相关错误,需要到主机确认已安装Docker并已启用,是否已配置Docker组,确保能拉取并运行hello-world镜像
- 部分虚拟机缺少bc依赖(bc command not found),需要手动安装bc
visual-deploy-host-check-fail
排除错误原因后,可以点击“检测”按钮,再次检测
(四)初始化主机:
点击“初始化”按钮进行主机初始化,将自动完成以下操作,初始化成功后才能进行下一步的部署操作,“初始化”按钮将变成“部署”按钮
- 自动检测并安装相关系统依赖,如
netstat
,wget
等 - 加载节点镜像:根据选中的镜像加载方式进行加载(若手动加载则检测镜像已存在于节点主机)
- 自动加载镜像时,会在节点主机指定目录中创建
download
目录,并下载镜像的tar包保存于此;若已存在同名tar包将不重复下载,直接使用已有tar包(docker-fisco-webase.tar)
visual-deploy-host-init
- 初始化操作预计在两到三分钟内完成,若网速过慢或不稳定建议通过手动加载镜像方式拉取 若初始化失败,则需要结合操作日志排查上述步骤的错误原因,排除主机中存在的问题后,重新执行检测,初始化操作
(五)部署:
添加的主机状态都为“初始化成功”后,点击“部署”按钮后,将自动完成以下操作
- 根据填入的节点信息自动生成链配置与证书
- 通过SCP将节点与前置的配置文件、证书传输到各个主机的指定目录下
visual-deploy-config-start
- 生成配置与传输配置完成后,将自动进入链初始化页面,届时将自动启动各个主机的节点,此过程预计需要几分钟时间,直到链状态为“运行”
visual-deploy-config-ing
若出现启动失败,需要结合报错提示,检查节点主机状态正常,各个节点主机间端口互通,网速过慢或网络丢包严重等等,排查后,点击“删除链”重置当前的链后,重新尝试建链
visual-deploy-delete-chain
如始终无法部署,可以结合Node-Manager日志排查错误原因,并在github上提交配上日志和环境信息的issue
新增节点¶
节点新增,也称作节点扩容,指在已有的区块链服务中,在新的主机上,添加一个新的节点。
提示:
- 新主机需要按照系统依赖中的节点机进行配置
- 参考上文的配置 SSH 免密登录,配置宿主机到新主机的免密登录
- 参考上文的Ansible host更新,把新主机的IP加到Ansible的hosts配置中
- 参考下文常见问题中的 安装 Docker
- 新增的节点,默认处于游离状态,需要手动变更节点为共识或者观察节点后,新节点开始从原有节点同步区块数据。
具体操作:
新增节点与部署时是同样的三个步骤:添加并检测节点主机、初始化主机(检查Docker与安装依赖)、启动节点并重启链
添加主机:
若需要添加新的主机时,填入主机的IP与部署节点的目录
visual-deploy-host-add
- 点击新增节点按钮
visual-deploy-add-node-index
添加主机信息,与部署链时相似的操作
- 选择 Docker 拉取方式,推荐使用CDN拉取,离线环境或网络不好的情况下,推荐使用手动加载方式,提前在各个节点主机下载并加载镜像
- 选择“新增节点”添加信息,选择主机与节点的端口、节点数量等;
- 注,若需要添加新的主机,则按文档的环境要求准备新的主机,并到“主机管理”添加主机
依次执行同部署链相同的检测、初始化、部署即可
visual-deploy-add-node
点击“部署”后将生成并传输新的节点的配置文件到目标主机,同时新增节点比部署链会多出以下操作
- 自动在链的其他节点中添加新节点的P2P连接配置,并在新节点的P2P配置中添加本次新增节点的IP与已有的非游离节点的IP
- [可选]配置完成后,需要手动“重启”已有节点才能使新的P2P配置在已有节点中生效,即双向互联;新节点会默认连接已有的所有节点,此操作可视具体情况自行操作
- 若新节点启动失败,将新节点删除并重新尝试添加即可
visual-deploy-add-node-restart
重启完成后,需要创建私钥或使用已有私钥,将新节点设为共识节点或观察节点
visual-deploy-add-node-removed
节点操作¶
节点操作,包括:节点的启停、节点共识类型切换、删除节点
- 节点的类型切换:共识,观察和游离
- 在可视化部署中,变更节点为游离节点时,该群组内,至少仍有两个共识节点
- 变更节点类型,需要发送交易,请先在私钥管理 中 添加私钥账号;
修改节点为共识节点
visual-deploy-add-node-sealer
若需要添加私钥:
visual-deploy-add-user-key
- 节点的启动,停止
- 若节点的docker容器被意外删除,通过页面点击“启动”即可完成节点重启
- 停止或重启操作时,请确保满足链的共识容错要求。设为观察节点可避免影响共识状态
- 每次启停操作大约需要30秒
- 删除节点
- 将节点设置为游离节点后,即可安全删除节点,删除后,链将会移除被删节点的P2P配置,并重启链
- 删除节点时,节点必须处于停止状态
visual-deploy-add-node-stopped
常见问题¶
安装 Docker¶
在 Debian/Ubuntu/CentOS/RHEL,直接执行命令:
# 该脚本是 Docker 官方提供的 Linux 自动安装脚本
bash <(curl -s -L get.docker.com)
在 CentOS/RHEL 8.x 中,使用上面的自动脚本安装时,会出现下面的错误:
Last metadata expiration check: 0:37:43 ago on Sat 22 Feb 2020 07:40:15 PM CST.
Error:
Problem: package docker-ce-3:19.03.6-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
- cannot install the best candidate for the job
- package containerd.io-1.2.10-3.2.el7.x86_64 is excluded
- package containerd.io-1.2.2-3.3.el7.x86_64 is excluded
- package containerd.io-1.2.2-3.el7.x86_64 is excluded
- package containerd.io-1.2.4-3.1.el7.x86_64 is excluded
- package containerd.io-1.2.5-3.1.el7.x86_64 is excluded
- package containerd.io-1.2.6-3.3.el7.x86_64 is excluded
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
要解决这个问题,需要手动安装 containerd.io
后,在执行自动安装脚本
# 下载最新的 containerd.io 安装包
wget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm
# 手动安装 containerd.io
yum localinstall containerd.io-1.2.13-3.2.el7.x86_64.rpm
拉取 Docker 镜像¶
镜像版本:
- v2.7.2
提示:
拉取方式¶
- 检查本地是否已有镜像
# 检查本地是否有镜像
docker images -a |grep -i "fiscoorg/fisco-webase" | grep -i v2.7.2
# 如果有如下输出,表示本地已有镜像;否则表示本地没有镜像
fiscoorg/fisco-webase v2.7.2 bf4a26d5d389 5 days ago 631MB
如果本地没有镜像(如果本地有镜像,跳过)
如果需要替换镜像,执行
docker rmi [ImageId]
删除镜像即可- 从 CDN 拉取镜像压缩包
# 从 CDN 拉取镜像 tar 文件 # 非国密 wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/docker-fisco-webase.tar # 解压镜像 tar 文件 docker load -i docker-fisco-webase.tar
- 从 Docker 官方拉取镜像
# 执行 Docker 拉取命令 docker pull fiscoorg/fisco-webase:v2.7.2
压缩镜像到
tar
文件
# 压缩镜像为 tar 文件
docker save -o docker-fisco-webase.tar fiscoorg/fisco-webase:v2.7.2
- 发送镜像
tar
文件到部署节点的主机
# 发送镜像 tar 文件到需要部署节点的主机
scp docker-fisco-webase.tar root@[IP]:/root/
- 解压镜像
tar
文件
# 登录需要部署的主机,解压 tar 文件
docker load -i docker-fisco-webase.tar
- 节点主机检查是否已经成功拉取镜像
# 检查是否成功拉取镜像
docker images -a |grep -i "fiscoorg/fisco-webase"
# 如果有如下输出,表示拉取成功
fiscoorg/fisco-webase v2.7.2 bf4a26d5d389 5 days ago 631MB
手动下载 TASSL¶
FISCO BCOS 国密版本需要使用 TASSL 生成国密版本的证书,部署工具会自动从GitHub或CDN下载,解压后放置于 ~/.fisco/tassl
(文件名为tassl),如果碰到下载失败,请尝试从https://gitee.com/FISCO-BCOS/LargeFiles/blob/master/tools/tassl.tar.gz 下载并解压后,放置于 ~/.fisco/tassl
没有进入可视化部署界面¶
在登录区块链管理平台后,没有进入可视化部署页面。此时,修改 WeBASE-Node-Manager 服务中的 dist/conf/application.yml
文件中的 deployType
的值是否为 1
后,重启 WeBASE-Node-Manager 服务即可。
新增节点时,提示请手动拉取 Docker 镜像错误¶
SSH 登录新主机,使用 docker images -a |grep -i "fiscoorg/fisco-webase"
命令检查是否有镜像。
- 如果不存在,请参考上文: 常见问题 中的 拉取 Docker 镜像
- 如果存在,请检查新主机中 SSH 账号的是否已经添加Docker用户组。
部署失败以及区块链重置¶
如果在部署区块链服务时,出现了部署失败的问题,可以使用重置功能,重置区块链服务,然后进行重新部署。
如果要重置当前区块链,点击重置按钮,等待重置完成。
执行重置操作,并 不会真正物理删除节点的数据(但会删除WeBASE数据库中链相关数据),而是使用 mv
命令,将区块链的整个数据移动到临时目录。
- WeBASE-Node-Manager 服务的临时目录
WeBASE-Node-Manager/dist/NODES_ROOT_TMP
目录中存放了所有重置节点的节点配置文件- 不包含具体的节点数据文件
- 文件名格式
default_chain-YYYYMMDD_HHmmSS(删除时间)
:default_chain-20200722_102631
- 节点主机中的临时目录
WeBASE-Node-Manager/dist/conf/application.yml
配置文件中rootDirOnHost
配置目录下的deleted-tmp
目录- 包含了节点的所有文件配置文件和节点数据文件
- 文件名格式
default_chain-YYYYMMDD_HHmmSS(删除时间)
:default_chain-20200722_102631
docker必须使用sudo才能运行,但是sudo下系统环境变量失效¶
答:可以在root用户下配置环境变量如JAVA_HOME等,或者通过下面操作,尝试创建docker用户组
# 创建docker用户组
sudo groupadd docker
# 将当前用户添加到docker用户组
sudo usermod -aG docker $USER
# 重启docker服务
sudo systemctl restart docker
# 切换或者退出当前账户,重新登入
exit
sudo账号免密配置¶
节点主机 sudo 账号免密配置方法
# 切换到 root 或者有权限账户
vi /etc/sudoers
# 添加下面一行并保存
# 替换 user 为 SSH 免密登录账号
user ALL=(ALL) NOPASSWD : ALL
注,可视化部署中需要使用sudo权限执行script/deploy
目录中的host_init_shell进行依赖安装,host_docker_check在docker未启动情况下启动docker服务,host_check_port通过sudo netstat检查端口占用情况
页面中只能部署或添加“国密”节点或“非国密”节点¶
答:需要修改Node-Manager的yml中encryptType
配置项后重启即可(0为非国密,1为国密)。
注:不支持修改已搭建链的类型,若需要修改,则需要重置链后重新进行可视化搭建。
可视化部署如何升级节点版本¶
答:可视化部署暂未支持节点升级。
节点主机检测报错可用内存不足(free memory)¶
答:每个“节点+节点前置”至少需要1G的可用内存,建议增大主机的机器内存,或释放更多的可用内存(Free memory)。
在root用户下执行以下操作可以释放available内存转为free内存
sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches
参考:
sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件 To free pagecache use echo 1 > /proc/sys/vm/drop_caches; to free dentries and inodes use echo 2 > /proc/sys/vm/drop_caches; to free pagecache, dentries and inodes use echo 3 > /proc/sys/vm/drop_caches.
如何进行节点部署的离线安装¶
答:参考环境依赖,将相关依赖都安装好之后
- 部署时选择手动拉取节点的Docker镜像,并在节点主机手动配置镜像,
- 安装
docker run hello-world
所需的hello-world的docker镜像用于主机检测 - 下载TASSL包解压后放到
~/.fisco/
目录中(文件名为tassl),可以参考手动配置TASSL
链部署失败或节点添加失败排查¶
页面提示请求超时,如添加主机、初始化主机等
- 登录主机检查主机是否卡顿或存在异常
若点击初始化按钮后,显示“加载Docker镜像”时,初始化主机失败或提示超时
- 检查主机网速,默认的超时时间为60s,如果网速过慢或丢包严重,可以尝试手动下载cdn镜像包查看网速,并建议通过手动加载镜像方式,提前下载镜像并加载到节点主机
若出现部署链或节点时,需要结合报错提示,通过以下步骤排查:
- 检查节点主机状态正常,如top命令检查CPU或内存使用率正常
- 若在部署或检查过程均频现失败,通过ping命令检查宿主机到节点主机的延迟,延迟过高需要排除问题后再次尝试
- 检查主机硬盘余量是否充足
- 链显示运行中,但是节点异常时,需要确保各个节点主机间端口互通,如节点主机之间的P2P端口互通(保证共识),宿主机到节点主机的Front端口互通(保证WeBASE服务)等
通过日志排查:无法根据提示排查错误,可以在webase-node-mgr(即节点管理服务构建生成的的dist)目录中搜索一下日志
- 部署链失败时
# 进度显示生成链配置时错误,则搜索此关键字
grep "configChainAndScp" log/WeBASE-Node-Manager.log
# 进度条显示传输链配置时错误,则搜索此关键字
grep "scpConfigHostList" log/WeBASE-Node-Manager.log
- 新增节点失败时
grep "batchAddNode" log/WeBASE-Node-Manager.log
upstream/master
一键升级¶
使用WeBASE一键升级脚本¶
在WeBASE v1.5.0后,WeBASE将提供webase-upgrade.sh
脚本(位于webase-deploy目录中,与common.properties
文件同级目录)
升级期间,脚本将暂停节点与WeBASE所有服务,替换WeBASE安装包(不会更新节点)、替换配置文件、更新数据库的数据表(并备份原数据)
- 确保
common.properties
中配置的数据库配置正确;若已经通过该配置成功完成了一键部署,即不用修改 - 需要确保WeBASE一键部署的文件目录未重命名(如webase-front)
- 需要连接外网下载新的WeBASE安装包
- 暂不支持WeBASE可视化部署的自动升级
- 若升级脚本报错中断后,备份的各子服务文件存放在以旧版本号命名的目录,如
./v1.4.3
目录中
检测依赖
# 脚本依赖python3命令,dos2unix命令,curl命令,unzip命令,mysqldump命令,mysql命令
# 检查python3
$ python3 --version
Python 3.6.8
# 检查dos2unix
$ dos2unix -V
dos2unix 6.0.3
# 检查curl命令
$ curl -V
curl 7.29.0
$ mysql -V
mysql Ver 15.1 Distrib 5.5.65-MariaDB, for Linux (x86_64) using readline 5.1
$ mysqldump -V
mysqldump Ver 10.14 Distrib 5.5.65-MariaDB, for Linux (x86_64)
$ unzip -v
UnZip 6.00 of 20 April 2009, by Info-ZIP.
运行脚本,脚本将自动完成升级步骤
## 指定-o旧版本,-n新版本后,即可运行
# bash webase-upgrade.sh -o {old_webase_version} -n {new_webase-version}
$ bash webase-upgrade.sh -o v1.4.3 -n v1.5.0
## 下面简单阐述升级脚本的操作内容
################################################
# 下载新的webase安装包(zip包),已存在旧版本的zip包,则重命名为webase-XXX-{old_version}
# 解压新的zip包到webase-front.zip => webase-front-v1.5.0
# 停止原有的,python3 deploy.py stopAll
## 复制旧版本的自服务的配置文件到新版本目录
# webase-web 直接复制全部
# 复制已有front的conf/*.yml, *.key, *.crt, *.so,覆盖新front的文件
# 复制已有sign的conf/*.yml
# 复制已有node-mgr已有的conf的*.yml,conf/log目录
## 备份node-manager db
# 备份node-mgr数据库到webase-node-mgr/script/backup_node_mgr_{old_version}.sql
# 从common.properties中获取两个数据库密码
# 到node-mgr中检测script/upgrade目录,有匹配v143开头的,v150的结尾的,有则执行 mysql -e "source $sql_file"
# 更新数据表 执行webase-node-mgr-{new_version}/script/upgrade/v{old_version}_v{new_version}.sql
# 到sign...同上(当前版本无需升级数据库)
## 将旧版本的webase-XXX备份到当前目录的{old_version}目录,新版本的webase-XXX-{new_version}重命名为webase-XXX
# mv操作,备份已有的,如 webase-web => ./v1.4.3/webase-web 以及 webase-web-v1.5.0 => webase-web
## 更新各java服务的yml的版本号
# 启动新的,执行python3 deploy.py startAll
################################################
若升级失败,,只需要将当前目录升级中的webase子系统目录移除,并将旧版本目录的文件夹复制到当前目录,如v1.4.3
,并重启WeBASE即可
以v1.4.3升级到v1.5.0为例,具体步骤如下:
- 查看当前目录的升级中的webase安装包:
ls .
- 查看已备份的webase安装包:
ls ./v1.4.3
- 首先将当前目录中已存在的
webase-{subsystem}
安装包移除:如移除当前目录的所有webase安装包,rm -rf webase-*
- 复制旧版本目录中的到当前目录:
cp -rf ./v1.4.3/* .
- 重启
python3 deploy.py startAll
子系统升级¶
WeBASE子系统升级需要参考WeBASE releases中WeBASE子系统间的兼容性说明,若只升级某个子系统,则需要查看子系统的Changelog,检查是否与已有的其他子系统兼容
切记复制备份已有的子服务项目文件,便于恢复,下面介绍各个服务的升级步骤
WeBASE-Front升级¶
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 采用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 bash stop.sh && bash start.sh
重启
WeBASE-Node-Manager升级¶
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 使用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 - 查看节点管理服务升级文档中对应版本是否需要修改数据表,若不需要升级则跳过
3.1 若需要升级数据表,首先使用
mysqldump
命令备份数据库 3.2 按照升级文档指引,操作数据表 bash stop.sh && bash start.sh
重启
WeBASE-Sign升级¶
节点升级¶
FISCO-BCOS节点的升级的详情需要参考FISCO-BCOS 版本信息文档
- 兼容升级 :直接替换 旧版本 的节点二进制文件为 新版本 的节点二进制文件,并重启。此方法无法启用节点新特性
- 全面升级 :参考 安装FISCO-BCOS 搭建新链,重新向新节点提交所有历史交易
国内镜像和CDN加速攻略¶
本节为访问GitHub较慢的用户提供国内源码镜像与安装包下载地址,以及WeBASE文档加速访问介绍。
WeBASE及子系统源码及安装包¶
源码同步¶
WeBASE当前仓库源码位于https://github.com/WebankFinTech/WeBASE,每个新的版本发布会将代码合入master分支。
为了方便国内用户,我们同样在gitee上提供了镜像仓库https://giteee.com/Webank/WeBASE,每次新版本发布后,镜像仓库会同步GitHub上官方仓库的更新,如果从GitHub下载失败,请尝试使用Gitee镜像仓库。
WeBASE各子系统的Github代码仓库则是https://github.com/WebankFinTech/
+ WeBASE-XXX
,对应的gitee仓库则是https://gitee.com/WeBank/
+ WeBASE-XXX
如WeBASE-Front的Github代码仓库为https://github.com/WebankFinTech/WeBASE-Front
,Gitee代码仓库为https://gitee.com/WeBank/WeBASE-Front
一键部署与安装包¶
WeBASE每个新版本发布后,会在WeBASELargefilesGitHub的Releases中提供对应的WeBASE一键部署工具和对应安装包。
其中WeBASELargefiles提供webase-deploy一键部署工具(即WeBASE源码中/deploy
文件夹),以及webase-front.zip, webase-node-mgr.zip, webase-sign.zip, webase-web.zip子系统的安装包。
同时提供以下国内镜像,可加速下载安装包:
https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/{release_version}/webase-{subsystem}.zip
其中{release_version}
为v1.x.x
格式,{subsystem}
则是子系统名字。
支持下载sign, front, node-mgr, web
子系统的zip安装包(全小写),暂不支持webase-transaction的安装包下载。
注:可视化部署中通过国内镜像手动下载docker镜像,文件名则是docker-fisco-webase.tar
或国密版docker-fisco-webase-gm.tar
WeBASE文档¶
WeBASE文档使用readthedocs管理,全部开源于https://webasedoc.readthedocs.io/zh_CN/latest/index.html,同样提供国内镜像文档https://fintech.webank.com/developer/docs/webase/index.html,由于网站资源更新周期安排,国内镜像文档更新会比readthedocs有所延迟。
每个版本发布会为上个版本的文档打Tag,新版本的文档会合入主干分支,文档由于会持续改进,所以是下个版本发布才打上个版本的tag。readthedocs文档支持下载PDF格式,方便用户使用。
举例:使用国内镜像进行一键部署¶
本节WeBASE 1.4.1为例进行一键部署,一键部署会默认使用国内镜像下载安装包,下面仅演示关键步骤,具体操作可参考WeBASE一键部署
下载WeBASE一键部署工具¶
# 使用CDN下载
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/webase-deploy.zip
# 使用github下载
wget https://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/v1.5.0/webase-deploy.zip
单独下载WeBASE子系统的安装包¶
WeBASE一键部署(webase-deploy)会自动下载子系统安装包,用户也可以手动下载安装包或编译源码得到安装包,并复制到webase-deploy目录下。
如需手动下载某一子系统的安装包,可以直接通过wget
或者curl -O
命令直接获取安装包。比如:
- 获取WeBASE-Node-Manager v1.4.1的安装包
webase-node-mgr.zip
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.4.1/webase-node-mgr.zip
// 或
curl -LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.4.1/webase-node-mgr.zip
若通过源码编译获取安装包并用于一键部署工具,需要进行文件夹的重命名,参考下一章节。
举例:使用国内源码镜像编译WeBASE-Front¶
本节以WeBASE-Front子系统为例,从gitee镜像下载源码并编译,编译后的配置方法,请参考各子系统的安装部署文档。
下载源码¶
git clone https://gitee.com/WeBank/WeBASE-Front.git
编译源码¶
依据WeBASE-Front节点前置安装文档的环境要求进行配置,如jdk(oracle jdk8及以上),配置gradle(4.10或以上)或直接使用gradlew脚本进行编译
// java版本
java -version
// 进入源码目录
cd WeBASE-Front
// 已有gradle时,使用gradle
gradle build -x test
// 不配置gradle,直接使用gradlew
chmod +x ./gradlew && ./gradlew build -x test
修改配置¶
编译完成后,将在当前目录得到dist
文件夹
重命名dist包中的conf_template
为conf
后,并将节点的sdk证书复制到conf
目录后,即可启动。
修改配置的具体方法,可参考WeBASE-Front部署
cd dist
mv conf_template conf
// 此处需要复制ca.crt, node.crt, node.key
cp -rf /fisco/nodes/127.0.0.1/sdk/* ./conf
bash start.sh
WeBASE管理平台使用手册¶
概览¶
基本描述¶
WeBASE管理平台是由四个WeBASE子系统组成的一套管理FISCO-BCOS联盟链的工具集。
部署架构¶
这套管理工具主要由:节点前置,签名服务,节点管理,WeBASE管理平台四个WeBASE子系统构成。WeBASE四个服务的部署架构如下图:节点前置需要和区块链节点部署在同一台机器;节点管理和WeBASE管理平台可以同机部署,也可以分开部署。
使用前提¶
群组搭建¶
区块链浏览器展示的数据是从区块链上同步下来的。为了同步数据需要初始化配置(添加群组信息和节点信息),故在同步数据展示前需要用户先搭建好区块链群组。FISCO-BCOS 2.0提供了多种便捷的群组搭建方式。
- 如果是开发者进行开发调试,建议使用build_chain。
- 如果是开发企业级应用,建议使用企业部署工具FISCO-BCOS generator。
两者的主要区别在于build_chain为了使体验更好,搭建速度更快,辅助生成了群组内各个节点的私钥;但企业部署工具出于安全的考虑不辅助生成私钥,需要用户自己生成并设置。
WeBASE管理平台搭建¶
WeBASE管理平台分为四个部分:节点前置,签名服务,节点管理,WeBASE管理台。
当前版本我们提供了三种搭建方式:一键搭建、纯手动搭建各子系统、可视化部署。
2、手动搭建¶
2.1、签名服务搭建¶
签名服务使用Spring Boot的JAVA后台服务,具体搭建流程参见《签名服务安装说明》。
2.2、节点前置搭建¶
节点前置使用Spring Boot的JAVA后台服务,具体搭建流程参见《节点前置安装说明》。
2.3、节点管理搭建¶
节点管理使用Spring Boot的JAVA后台服务,具体搭建流程参见《节点管理安装说明》。
2.4、WeBASE管理平台¶
WeBASE管理台使用框架vue-cli
,具体搭建流程参见《WeBASE管理平台安装说明》。
3、可视化部署¶
可视化部署的具体使用方法搭建流程参见《WeBASE 可视化部署》。
可视化部署是指通过 WeBASE 管理平台的Web页面上通过可视化的操作,快速在多台主机上完成FISCO-BCOS 底层节点和 WeBASE-Front 前置的部署操作。
可视化部署分为部署子系统和搭链两个步骤:
- 步骤一:部署子系统依赖服务,包括管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、签名服务(WeBASE-Sign)。依赖服务可以通过 一键搭建 或 手动搭建 完成。
- 使用一键搭建的
installWeBASE
命令,一键部署依赖服务 - 手动搭建部署依赖服务,参考上文的各子系统搭建指引
- 使用一键搭建的
- 步骤二:使用WeBASE-Web界面搭链,部署 FISCO-BCOS 底层节点 和 节点前置服务(WeBASE-Front)
系统初始化配置¶
服务搭建成功后,可使用网页浏览器访问nginx配置的WeBASE管理台IP和端口(例如127.0.0.1:5000
),进入到管理平台页面。
管理平台默认用户为admin
,默认密码为Abcd1234
(第一次登陆成功后会要求重置密码,请按照密码标准设置一个更加安全的密码)。
添加节点前置¶
未初始化节点前置的管理平台,会引导去节点管理页面添加节点前置。
- 节点前置服务需要填写前置的IP与端口(默认为
127.0.0.1
和5002
),机构名则根据实际自定义填写
前置添加完成后,管理平台就会开始拉取群组信息和群组的区块信息。此时数据概览页面应该就有数据了。为了解析和审计区块数据,需要把相关的合约和用户导入到管理平台。具体看下面两个小节。
合约管理¶
1、添加合约¶
管理平台提供两种添加合约的方式,一个是新建一个合约,一个是导入已有合约。同时合约编辑器还提供新建目录。用目录的形式管理合约,主要是为了解决同名合约引用的问题。合约添加完成后,需要编译保存。
3、合约调用¶
在合约部署成功后,可以在合约IDE页面的右上角点击发交易,向合约发送交易进行合约调用。
交易发送成功后,将返回交易回执。可以在数据概览-交易列表-更多中根据transactionHash搜索交易,通过交易解析和Event解析查看可视化的交易回执信息。具体操作方法参考下文的区块链数据概览章节中的交易解析与Event解析。
私钥管理¶
私钥管理提供了新建私钥用户和导入公钥用户两种用户导入方式。第一种方式主要用于新建用户(私钥托管在签名服务中),在管理平台的合约管理中部署和调用合约。第二种方式主要用于把交易和用户关联起来。
各模块的详细介绍¶
本小节概要介绍管理平台的各个模块,方便大家对WeBASE管理平台套件有一个整体的认识。这套工具集主要提供的管理功能有:
区块链数据概览¶
数据概览页面,展示了区块链的核心数据指标:节点个数,区块数量,交易数量,通过管理台部署的合约数量。关键监控指标:历史15天的交易量。
- 节点信息列表:展示了节点的ID,节点块高,节点view和运行状态;
- 区块信息列表:展示了最近5个块的概览信息,点击更多可以查看更多历史区块;
- 交易信息列表:展示了最近5个交易的概览信息,点击更多可以查看更多历史交易;
其中右下角的交易信息列表点击可跳入具体一条交易中查看交易详细信息:交易详细信息还包含了
- 交易解析:可以将交易返回的交易回执数据进行解析并可视化;
- Event解析:可以将交易返回的Event数据进行解析并可视化;
未解析的raw数据如下图所示:
进行交易解析后如下图所示:
同样的,Event数据解析后可以看到:
节点管理¶
节点管理主要提供了前置列表、节点列表、修改节点共识状态的功能。
用户可以通过新增节点前置,把新的节点前置添加到前置列表。系统会默认拉取这些前置所在的群组和各个群组的节点信息。在节点列表中,用户可以修改节点的共识状态:共识节点、观察节点、游离节点。其中修改为游离节点相当于将节点移出群组,停止节点前务必先将节点设置为游离节点,否则将触发节点异常。
前置列表与节点管理:
- 前置列表:可以查看节点前置状态,导出前置的SDK证书zip包
- 节点管理:显示所有的共识/观察节点(无论运行或停止),以及正在运行的游离节点
修改节点共识状态:
合约管理¶
合约管理提供了一个图形化的合约IDE环境、已部署的合约列表、合约CNS查询以及预编译合约的CRUD功能。
图形化合约IDE提供了一整套的合约管理工具:新建合约,保存合约,编译合约,部署合约,调用合约接口。其中,新建合约可以通过编辑键入合约内容,也可以上传合约文件;编译合约后才可以部署合约;部署合约成功后,可以通过发送交易调用合约接口。具体操作步骤可以参考上一章节中系统初始化配置介绍。
合约IDE:
合约列表:包含WeBASE已登记合约与链上已部署的合约
已登记合约:包含通过IDE部署的合约、导入ABI的合约
链上全量合约:包含通过其他平台部署到链上的合约与WeBASE已登记的合约(链上合约只有合约地址),可通过导入按钮,填入合约ABI导入到本地
ABI编码:支持对ABI的方法与入参进行编码
CNS查询:CNS(Contract Name Service)是通过提供链上合约名称与合约地址映射关系的记录及相应的查询功能,方便调用者通过记忆简单的合约名来实现对链上合约的调用。详情可查看FISCO-BCOS文档的 CNS方案
注册CNS后,CNS可以根据合约名和合约版本号查询CNS信息(合约名和合约版本号用英文冒号连接)。若缺失合约版本号,则返回所有符合合约名的合约信息。
- 需要在合约管理页面部署合约时勾选CNS,或合约列表页面中点击CNS注册,即可完成注册
CRUD:CRUD通过在Solidity合约中支持分布式存储预编译合约,可以实现将Solidity合约中数据存储在FISCO BCOS平台AMDB的表结构中,实现合约逻辑与数据存储的分离。CRUD可以在FISCO-BCOS链上创建数据表,并对表进行增删改查操作,具体CRUD操作教程查看FISCO-BCOS控制台CRUD命令
EventLog查看:支持输入合约地址和ABI、区块范围和Event名,即可查询并同步返回
EventLog
私钥管理¶
私钥管理包含新建私钥用户和新建公钥用户两个功能。在合约管理界面,可以看到合约部署和交易调用功能。这里的私钥管理可以新建私钥用户,私钥将托管在签名服务中,然后通过签名服务对合约部署和合约调用进行签名。注:外部账户可通过新建公钥账户导入,主要用于把交易和用户关联起来。
私钥管理:包含WeBASE本地已登记的私钥用户与链上全量私钥用户。
已登记私钥:包含本地创建的私钥与导入的私钥
链上全量私钥:包含链上私钥和本地已登记的私钥,可通过导入按钮,作为公钥用户导入到本地
添加私钥用户:
导入私钥:支持导入.txt/.pem/.p12格式及明文的私钥,其中.txt私钥可由WeBASE-Front导出,.pem/.p12私钥可由console控制台导出。如果需要导入自定义私钥,可根据节点前置导出的.txt私钥,编辑其中的privateKey字段内容。
导出私钥:可以选中导出.txt/.pem/.p12/WeID等格式的私钥,其中WeID格式私钥为十进制明文私钥,txt则是十六进制明文私钥;在代码中加载私钥可以参考节点前置-私钥加载
系统管理¶
系统管理目前支持权限管理、系统配置管理、证书管理的功能。
权限管理
基于FISCO BCOS 2.5.0及以上版本的基于角色的权限管理:支持链委员会管理和运维管理员管理:
- 链委员会管理:链委员会的修改操作均需要通过多个委员投票完成,链委员拥有投票权,可以增删节点、修改链配置、添加撤销运维、冻结解冻合约、对用户表的写权限控制;
- 修改委员会成员(新增/撤销委员)、修改委员投票阈值、修改委员投票权重值等操作均需要通过投票进行修改;
- 投票阈值为投票生效的阈值,有效投票权重数/委员总权重数>生效阈值投票才能生效,阈值为开区间,即:投票权重比例必须大于阈值(不包含等于);
- 每次投票操作,如果是委员投票,则记录操作内容和投票委员,不重复计票;
- 投票设置过期时间,根据块高,blockLimit的10倍(即10000),固定不可改;
- 用户不能同时成为链委员和运维管理员;
- 运维管理: 运维由链委员直接赋予(无需通过投票赋予),运维可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约;
注:链委员会为空时,不作链委员会权限限制,所有用户拥有委员权限,可以自由给自身或其他用户添加链委员权限;设置了第一个链委员后,非链委员用户无权限;请妥善保管链委员的私钥!
运维管理员为空时,所有用户拥有运维权限;同理,设置了第一个运维管理员后,非运维用户无权限;
FISCO-BCOS基于角色的权限管理机制详情可以参考文档使用手册-基于角色的权限控制,具体的设计原理可以参考文档 系统设计-基于角色的权限控制
链委员会管理:
运维管理员管理:
基于FISCO BCOS 2.0.0 - 2.4.x版本的基于表的权限管理:支持链权限管理和普通权限(四种)管理:
- 链权限管理为分配权限的链管理员,可以使用权限分配功能,非链管理员账户无权限分配功能;
- 普通权限管理包含四种权限: 部署合约和创建用户表权限, 节点管理权限, CNS管理权限, 系统参数管理权限;
注:链管理员为空时,不作权限限制,所有用户拥有权限,可以自由给自身或其他用户添加权限;设置了第一个链管理员后,非管理员用户无权限分配功能;请谨慎设置第一个链管理员;
普通权限管理员为空时,所有用户拥有特定功能,如:节点管理员为空时,所有用户可以管理节点状态,设置了第一个节点管理员后,非节点管理员不可管理节点状态;
FISCO-BCOS基于表的权限管理机制详情可以参考文档FISCO-BCOS基于表的权限控制
链权限管理:
普通权限管理:
系统配置管理:系统属性包含FISCO-BCOS链的tx_count_limit和tx_gas_limit两种属性值的配置。注:一般不建议随意修改tx_count_limit和tx_gas_limit,如下情况可修改这些参数:
- 机器网络或CPU等硬件性能有限:调小tx_count_limit,降低业务压力;
- 业务逻辑太复杂,执行区块时gas不足:调大tx_gas_limit。
配置管理:
配置系统属性值:
证书管理:支持导入和查看证书信息,包括查看Front对应节点的链证书、机构证书、节点证书,可查看证书内容、证书有效期、证书链关系等信息;
- 证书链关系可通过比对父证书指纹与证书指纹查找;
- 平台将默认加载所有Front的证书,需要在Webase-Front配置文件中配置nodePath节点路径;
FISCO-BCOS证书说明可以参考FISCO-BCOS使用手册的证书说明
证书列表:
- 支持导出SDK证书:v1.5.0后支持导出节点前置的SDK证书zip包,可用于连接节点
导入证书:
应用管理¶
应用管理是WeBASE管理台提供的一种第三方应用接入功能。WeBASE作为底层运维平台,已经有了底层运维基础能力。各个应用可以利用这些基础能力来开发自己的运维管理台。这些可以利用的基础能力主要包括四个方面:1、链信息和链运维(权限,配置等);2、合约;3、链的私钥账号;4、管理账号(登录态)。
这样的主要好处是:
- 各应用的进程管理还是自我管理,避免WeBASE过于笨重
- WeBASE提供的是规范,方便其他应用参考打通应用与WeBASE的联系
- 如果有扩展,WeBASE也方便提供API来实现
- 不破坏各应用自身的完整性
管理台新增了应用管理菜单。新增应用有两种方式,一种是选择已有应用模板——目前仅支持WeID;另外一种是自定应用:
新增应用后,会生成应用相关的注册信息,为应用分配的appKey
(应用Key)和appSecret
(应用密码,应用自己保存,不要暴露),WeBASE的IP
为内网IP,访问不了的话需对应修改:
第三方应用未向WeBASE进行注册时,WeBASE管理台不可以通过应用链接跳转到应用服务:
第三方应用接入时,使用注册信息向WeBASE进行注册,调用相关OPEN API。第三方应用接入请参考【应用接入说明】。以下以 WeIdentity 可视化页面接入为例:
选择 WeID + WeBASE集成模式,从WeBASE复制注册信息:
点击下一步时,WeID会向WeBASE进行注册并调用相关API,从WeBASE获取群组、节点、证书等相关信息:
可以选择自动创建公私钥,或选择从WeBASE同步公私钥用户:
部署WeID之后,WeID会将合约相关信息通过API导入WeBASE:
第三方应用向WeBASE进行注册后,在WeBASE管理台可以通过应用链接跳转到应用服务:
注册后WeBASE将和应用间保持心跳。如果应用状态变成不能访问,则应用链接会置灰,变成不可跳转。
系统监控¶
系统监控包含了监控与异常告警两部分;
监控主要包括节点监控和主机监控,可以选择节点、时间范围等条件进行筛选查看:
- 节点监控主要有区块高度,pbftview,待打包交易;
- 主机监控主要有主机的CPU,内存,网络和硬盘IO;
节点监控:
主机监控:
异常告警部分主要包括邮件服务配置和告警类型配置:
邮件服务配置:
如何配置邮件服务可查看本文档末尾的附录-配置邮件服务指南
可配置邮件告警所用到的邮件服务器相关参数,包含邮件协议类型protocol、邮件服务器地址host、服务使用端口port、用户邮箱地址username、用户邮箱授权码password;鉴权选项包含Authentication验证开关authentication(默认开启);
- 邮件告警的邮箱协议类型默认使用SMTP协议,使用25默认端口,默认使用username/password进行用户验证,目前仅支持通过TLS/SSL连接邮件服务器;
- 目前仅支持更新原有的邮件服务器配置,不支持新增配置;
使用测试功能前,需要到“告警类型配置”中,在左上角**开启邮件服务总开关**;
注:邮件告警功能需要确保邮件服务器配置正确;务必使用测试
按键,向指定的邮箱地址发送测试邮件并查收邮件。如果配置错误,将发送测试邮件失败,指定邮箱将收不到测试邮件;
邮件服务配置测试:
以当前表单中输入的配置值发送测试邮件(无论是否已保存,都以表单中当前的值为配置发送测试邮件);需要提前开启邮件服务开关;
告警类型配置(告警邮件配置):
包含了告警类型的配置,告警日志的查看;可配置告警类型的参数值,包含告警邮件标题ruleName,告警邮件内容alertContent,告警邮件发送时间间隔alertIntervalSeconds(单位:秒),上次告警时间lastAlertTime,目标告警邮箱地址userList,是否启用该类型的邮件告警enable,告警等级alertLevel等;
- 包含了节点状态告警、审计告警、证书有效期告警三种;
- 目前仅支持更新原有的三个邮件告警的配置,不支持新增配置;
- 需要先在左上角开启邮件服务才可以开启各个类型的邮件告警以及发送测试邮件;
包含了不同告警类型的配置,左上角可以开启邮件服务(作为告警邮件的全局开关),点击告警标题可查看详细配置内容;
下方则是告警日志的内容,可查看告警邮件的具体内容;告警项已处理后,可以点击确认键确认已消除异常;
其中在WeBASE-Node-Manager的配置文件application.yml的constant可以配置定时任务定时监控节点状态、审计状态、证书有效期的频率,监控到异常状态时将触发邮件告警,发送告警邮件到联系人邮箱,同时按配置的间隔时间定时重复发送告警邮件,直到异常状态消除;
注:定时任务的频率为检查系统是否异常的频率,而配置不同的告警类型中的告警时间间隔是发送告警邮件的频率,如,设置检查频率为1h,配置的告警频率为6h,那么,系统会每小时检查一次系统状态,若出现异常,在定时任务检查到异常时,距离上次告警邮件超过6小时,则会发送一次告警邮件。
点击修改可以修改配置项的值,启用/禁用不同类型的告警,修改配置后不需要重启即可生效;
注:修改告警内容时,大括号{}
以及里面的变量名不可去除,否则无法正常发送告警邮件。
交易审计¶
联盟链中各个机构按照联盟链委员会制定的规章在链上共享和流转数据。这些规章往往是字面的,大家是否遵守缺乏监管和审计。因此为了规范大家的使用方式,避免链的计算资源和存储资源被某些机构滥用,急需一套服务来辅助监管和审计链上的行为。交易审计就是结合上面的区块链数据,私钥管理和合约管理三者的数据,以区块链数据为原材料,以私钥管理和合约管理为依据做的一个综合性的数据分析功能。交易审计提供可视化的去中心化合约部署和交易监控、审计功能,方便识别链资源被滥用的情况,为联盟链治理提供依据。
交易审计主要指标:
主要指标 | 指标描述 |
---|---|
用户交易总量数量统计 | 监控链上各个外部交易账号的每日交易量 |
用户子类交易数量统计 | 监控链上各个外部交易账号的每种类型的每日交易量 |
异常交易用户监控 | 监控链上出现的异常交易用户(没在区块链中间件平台登记的交易用户) |
异常合约部署监控 | 监控链上合约部署情况,非白名单合约(没在区块链中间件平台登记的合约)记录 |
用户交易审计:可以指定用户、时间范围、交易接口进行筛选查看交易
异常用户审计:
异常合约审计:
订阅事件¶
订阅事件管理:可查看前置中已订阅的链上事件通知,包括出块事件列表和合约Event事件列表。详情请参考节点前置-链上事件订阅和通知
出块事件列表:
出块事件列表
合约Event事件列表:
合约Event事件列表
账号管理¶
账号管理提供管理台登陆账号的管理功能。管理台用户分为三种角色:
普通用户,只有查看权限;
管理员用户,拥有管理平台的读写权限;
开发者用户,拥有开发者自身的合约和私钥用户的读写权限,数据概览权限;
开发者模式默认关闭。如需开启此功能,可以在WeBASE-Node-Manager配置文件application.yml中修改developerModeEnable为true,然后重启服务。
注:此处账号与私钥管理的私钥用户为两种不同的概念,账号用于管理台权限控制,私钥用户为区块链账户。
账号管理:
添加登陆账号并指定账号类型:
群组管理¶
群组管理提供动态管理群组的功能,包含:生成群组(生成群组配置文件到单个或多个节点)、启动群组、停止群组、移除群组(标记为移除)、恢复群组、删除群组数据等操作
群组管理入口位于右上角切换群组的下拉窗口中:
进入群组管理后,可以看到群组列表中有“运行”、“维护中”、“异常”的三种状态。
- 正常运行的群组为“运行”;
- 群组中所有节点(节点前置)已停止了群组,会显示为“维护中”,此时只需要将节点的群组重新启动即可恢复正常;
- 本地群组数据与链上数据冲突时,会显示为“异常”:
- 若本地群组的区块数据与链上区块数据存在冲突,如搭建了新的链而后台数据库没有重置,或者群组的所有前置处于异常状态,则会显示群组为异常;
- 如果同一个群组编号的不同节点之间创世块的配置不同,即群组同名,但各节点的群组创世块不同,也会标记该群组为异常。在群组显示异常时,需要用户检查前置状态,如重建链了,可通过删除群组数据重新拉取来恢复正常,如创世块冲突,则需要删除冲突的节点前置;
删除群组数据,将删除后台数据库中保存的群组数据,不会删除链数据。
如果未停止所有节点的群组就删除群组,会在删除后重新拉取数据
下面介绍如何进行动态群组管理,包含在多个节点中批量生成群组、节点加入已有群组:
批量生成群组
选中节点后,生成群组将自动创建群组、启动群组、并通过创世块配置将节点设置为共识节点
如下图,可以选中需要创建新群组的节点,点击确认后即可完成创建
节点加入已有群组
点击群组状态/修改群组,可以查看群组中各个节点的状态;也可以在该页面启动/停止/删除/恢复节点的群组,或添加节点到已有群组
不属于当前群组的节点中会显示“添加”,可以将节点加入该群组;
该操作实际上包含三个步骤,创建与启动是加入的同时自动完成的,用户需要确保新节点加入新群组的共识节点/观察节点
- 加入群组操作会在该节点的conf目录下生成群组创世块文件,并启动群组
- 创世块文件的配置需和加入群组的原有配置完全一致,可通过群组列表中导出配置后导入配置,或到群组中节点conf目录下查看群组的时间戳与共识节点列表
- 创建并启动群组后,需要将节点加入到新群组的共识节点/观察节点:
- 若本地有新群组的节点前置,则可以通过切换到相应群组的“节点管理”中设置新节点为共识节点;
- 如果本地没有新群组的节点前置,则需要到已加入该群组的节点的控制台或节点管理平台将新节点加入到共识节点/观察节点
加入新群组的共识节点/观察节点说明,或直接继续添加节点到新群组
填写已有群组的创世块文件配置,包含时间戳与共识节点NodeId列表,如下图:
注,创世块是群组的标志。新节点加入群组需保证创世块的nodeIdList
完全一致,例:若已有群组的共识节点列表只有node0,当node1加入该群组时,创世块配置的共识节点列表仍填写只有node0的列表,然后再通过节点管理将新节点node1动态添加到该群组。如果错填成包含node0和node1的共识节点列表,那么将生成一个和当前群组同名,但创世块完全不同的新群组。而群组管理会监控到同名群组的创世块存在冲突,标志群组为“异常”。
节点加入新群组后,如果节点未添加到共识节点/观察节点,所属群组一列将显示为横杠;已加入的节点该列会显示具体的群组编号
在右上角切换到新群组后,在“节点管理”页面中可以将游离的新节点加入到共识节点/观察节点中
详情使用说明可以参考本文档附录-动态群组管理使用指南
升级兼容说明¶
v.1.5.0后,通过一键部署的WeBASE可以使用一键升级中提供的一键脚本对已有的WeBASE进行升级
WeBASE-Front升级至最新版,可查看节点前置升级说明,请结合WeBASE-Front Changelog进行阅读
WeBASE-Node-Manager升级至最新版,可查看节点管理服务升级说明,请结合WeBASE-Node-Manager Changelog进行阅读
WeBASE-Sign升级至最新版,可查看签名服务升级说明,请结合WeBASE-Sign Changelog进行阅读
附录¶
配置邮件服务指南¶
请先阅读本文档中管理平台使用手册的各模块的详细介绍-系统监控-邮件服务配置
问:邮件服务怎么用?
答:在后台搭建邮件服务(邮箱服务器),用于后台监控到系统异常情况时,发送告警邮件到指定邮箱,方便运维;
下面介绍具体的使用方法:
邮件服务所使用的邮箱服务器:
- 企业可使用自行搭建的邮箱服务器;
- 普通用户可以使用QQ邮箱、网易邮箱等第三方邮箱;
开通邮箱服务¶
163邮箱开通邮箱服务:
- 登陆邮箱后,在邮箱的
设置
中找到包含SMTP
的设置项;
- 勾选
IMAP/SMTP
和POP3/SMTP
,初次开启时,会提醒用户设置授权码,并进行手机安全验证; - 设置授权码后,勾选
IMAP
,POP3
,SMTP
开启全部服务;
QQ邮箱开通邮箱服务:
- 登陆邮箱后,在邮箱的
设置账户
中找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
项;
- 开启
POP3/SMTP服务
和IMAP/SMTP服务
并按照指引进行手机安全验证并设置授权码,;
配置邮件服务¶
记下所设置的授权码,授权码即邮件服务中用到的“密码”,按照本文档各模块介绍-系统监控进行配置:
第一步,进入“告警类型配置”中,点击左上角“启用告警”以开启邮件服务开关
第二步,进入“邮件告警配置”,配置邮件服务
- 因为Node-Manager仅使用邮箱服务器的发件服务,因此协议类型填写
smtp
(IMAP/POP3均为收件服务协议); - 邮箱服务器填写
smtp.xx.com
,端口号默认为25
即可启用邮件服务;如需使用其他端口如465则需要开放WeBASE-Node-Manager所在服务器的相应端口限制; - 用户名填写邮箱地址,密码填写上文设置的授权码;
配置完成后,点击“测试”后,输入接收测试邮件的邮箱地址,测试成功即可“保存”邮件服务的配置;
注意事项¶
“邮件告警配置”中填写的端口默认为25,在不同服务器环境和不同邮箱所需的端口号有所差异,如果需要开启SSL进行邮箱安全验证则需要开通服务器防火墙相应的端口号。
目前已知的包含:
- SMTP协议:默认使用25端口(非SSL),SSL默认465端口(SSL)或587端口(TLS)
- POP3/IMAP协议:因为邮箱服务使用的是发邮件功能,未用到POP3或IMAP收件协议,此处仅作端口说明:其中POP3默认110端口(非SSL)和995端口(SSL),IMAP默认143端口(非SSL)和993端口(SSL)
- 126邮箱的SSL端口除了587,还可尝试994;在阿里云下25端口被禁用,请尝试587端口或其他端口;
动态群组管理使用指南¶
v1.3.1新增的动态群组功能支持用户在可视化页面中动态管理群组,包括创建多个节点的群组、节点加入已有群组等功能。群组模块介绍可参考本文档群组管理
注:动态群组管理要求各节点间已建立了P2P连接
群组管理入口
群组管理页面
下面我们使用2个节点管理平台,4个节点前置,每个管理台包含两个前置来展示:
管理台1中包含前置A和B,管理台2中包含前置C和D:
管理台1:
管理台2:
群组管理与群组配置文件¶
动态创建群组包含三个基本操作:创建群组、启动群组、节点加入群组共识
注:节点的动态群组操作是针对单个节点进行的,即,如果创建一个新群组包含4个节点,则需要对4个节点分别调用“创建”、“启动”命令;如果需要查询群组中各节点的群组状态,也需要对4个节点轮询获取群组状态。
WeBASE已对这一步骤进行了封装,自动批量调用各个节点前置的“创建”、“启动”和“查询群组状态”的接口。
操作群组的状态转换如下图:
创建群组:
- 创建群组实际上是调用节点的
generateGroup
JSON RPC接口,传入参数timestamp
和sealers
(WeBASE中为nodeList
),并在节点的conf目录下生成群组配置文件group.x.genesis
和group.x.ini
- 其中
group.x.genesis
是群组的创世块配置,包含timestamp
和sealers
,,该配置一旦启动群组之后就不能再修改,否则引起群组异常。详情可以参考文档FISCO BCOS-配置文件与配置项
启动群组:
- 启动群组是将节点的群组状态标记为“RUNNING”
- 启动后,节点进程将读取上文的
group.x.genesis
中的sealers
项,将sealers
中的所有节点设置为共识节点,开始共识
例如:
- 如果需要动态创建一个4节点的群组时,需要设置4个节点均为共识节点,可以在
sealers
中加入所有共识节点,然后启动各个节点的群组即可。 - 但是,如果创建群组时只将其中2个节点设置为
sealers
,那么,另外2个节点需要加入该群组时,调用创建群组接口时,需要传入相同的sealers
,即传入相同的群组原配置中的2个节点,创建群组并启动后,需要通过“节点管理”(addSealer/addObserver
接口)将新节点加入共识。不可修改该群组的sealers
配置,否则将引起群组异常。
下面我们通过单个管理台批量创建群组和多个管理台创建群组并加入群组这两个例子来了解动态群组管理的操作步骤与注意事项
单个节点管理台-批量创建群组¶
此处采用单个节点管理台,两个节点前置,动态创建一个2节点的群组group333
我们在管理台1中将在节点A和节点B中生成群组group333
具体操作如下:
批量创建群组指的是向group.x.genesis-sealers
中包含的所有节点前置发起创建群组的请求(群组的创世块配置如下所示),这要求所有节点的前置在同一个管理台里,才能一次性对所有节点发起创建群组的请求。
若节点分布在多个管理台中,则参考下一小节。
{
// timestamp
"groupTimestamp": "1591013023063",
// 群组333共识节点列表
"nodeIdList": [
// node A
"31e2b051abc27b49aff8846a4037e8bdb45acd6ff98fdad42f7b8a9c4887fffcc99edbf4eeafff656f00df07f44ae3609463a7ddc3ba8481f88b43424007fafe",
// node B
"c867302e786a790663c5cf6fdbbff96570d00a3500b23c9ddd2dd63ada07b85fbc6f4549a9f05cad60bcf7a6199caa95781fd40a25e9098a2c728b90d88938f8"
]
}
选中管理台的两个节点后,将分别对这两个节点发起创建群组、启动群组的请求
创建成功后,可以看到节点A和节点B的group333已处于running状态,且两个节点已经参与新群组group333共识了(橙色区域);
但是可以看到节点列表中还有两个外部节点;节点A、B的群组编号中显示了号码,则代表该群组属于群组的共识节点/观察节点,否则显示”-“代表是游离节点,仅有P2P连接;
下一步,我们将处于管理台2的节点C和节点D也加入到这个群组333中来,因此我们进入下一小节,多个管理台之间创建群组,最终实现如下图的状态:
多个节点管理台-创建群组并加入群组¶
此处例子使用两个节点管理台,而更复杂情况可以以此类推。
我们在上面通过管理台1创建了一个由节点A和节点B组成的新群组group333,现在我们把管理台2的节点C和节点D加入到管理台1中创建的群组group333,实现下图的效果,节点C/D的group333处于running状态,且加入group333的共识
具体操作如下:
在管理台1中,进入群组管理,导出群组group333的配置内容
返回到管理台2的界面中,点击“加入已有群组按钮”
加入群组时,用户需要再加入群组后,手动将群组的新节点添加为共识/观察节点;
点击加入已有群组后,导入群组group333的配置;也可以直接键入群组编号、群组时间戳、创世块共识节点列表
选中需要加入该群组的节点后,点击确定;
创建成功后,可以看到群组列表新增了一个group333,节点C/D的group333处于running状态
点开可以查看新群组的节点,可以看到节点C和节点D的“群组编号”为空,即未参与群组共识
注:加入群组后,需要手动将新节点加入到群组的共识/观察节点,节点才会参与新群组的共识。
因此,下面我们把节点C和节点D加入到新群组的共识/观察节点列表
由于管理台2中没有已属于群组共识/观察节点的节点,因此需要进入管理台1,切换右上角到群组group333,然后将新加入群组的节点C和节点D修改为共识节点/观察节点。 (修改节点类型需要管理员权限私钥,如果未启用首个管理员,则任意私钥即可修改)
全部修改为观察节点后
点击进入群组管理中,查看群组的节点状态,节点C和节点D的“群组编号”已显示333,代表修改成功了
即如下图所示,节点C/D都已加入群组group333的共识
至此,四个节点A/B/C/D成功通过动态群组管理加入到新群组group333中并参与共识了
其他情况¶
- 案例1:管理台2中先创建含有节点C的群组group9后,然后将节点D加入group9;
如果管理台2中的节点C已在新群组group9中,需要将节点D加入该群组,当前群组拓扑如下
可以通过点击群组列表中的群组,点击“添加”,按照与上文类似的提示即可添加成功。
此时节点D的group9状态为running
添加完成后,右上角切换到对应的群组group9,到“节点管理”页,将该节点设置为共识/观察节点(需要创建私钥用户来发交易),即完成加入群组的操作
节点D加入群组group9成功
修改节点D的节点类型为观察节点
点开群组管理中的group9查看节点状态,可以看到节点C和节点D的群组编号已经显示为”9”,说明节点D已成功加入群组group9
至此,节点C/D的群组group9如下图所示,都处于running状态,且都已参与群组group9的共识
- 案例2:管理台1中先创建共识节点包含四个节点A/B/C/D的群组group10后,在管理台2将节点C/D直接加入group10,省略加入为共识/观察节点步骤;
如果一次性创建一个4节点的新群组group4,需要把4个节点的前置都加入到同一个节点管理台,此时,由于nodeList
中已经设置了4个节点均为共识节点,只需要分别到两个管理台中,通过“加入已有群组”中填入一致的配置,即可创建群组,并可以省去上文的“加入群组共识”这一步了
如下图所示,先将创建一个群组group10,在共识节点列表写入所有节点的nodeId。可以看到group10包含了所有节点,但是节点C/D的群组尚不存在
我们通过管理台1中的“加入已有群组”来自定义共识节点列表,在节点列表中包含所有的4个节点A/B/C/D,然后生成群组group10
{
"groupId": 10
"groupTimestamp": "1591079269841",
"nodeIdList": [
"a95ff41839bd9f4576138833a36c4e48e0268dda6ab77ecca468c4f50454ca4faf6609cc7c8126c439380d1df462c098369eea8feff4c9e22e35bfc830818d3d",
"16f6882456e7f05ca90cbe3ca1dbdb49ca84702ccfd0cebb5894624ec475d5ae7b504a136aca2559fdf4e4c27dce7c72a674d0dd3ae339ba6a3a0906a0072aa8",
"31e2b051abc27b49aff8846a4037e8bdb45acd6ff98fdad42f7b8a9c4887fffcc99edbf4eeafff656f00df07f44ae3609463a7ddc3ba8481f88b43424007fafe",
"c867302e786a790663c5cf6fdbbff96570d00a3500b23c9ddd2dd63ada07b85fbc6f4549a9f05cad60bcf7a6199caa95781fd40a25e9098a2c728b90d88938f8"
]
}
我们点开群组列表中的群组group10,可以看到4个节点的群组编号已经显示了”10”,说明4个节点都已经在群组group10的共识节点了。
注:如果采用PBFT共识,此时节点C/D已加入了群组group10,但仍未加入共识,将不满足3F+1>N
的共识准则,导致群组共识异常。将节点C/D创建群组后即可消除异常
下一步我们只需要按照上文所说的,导出当前群组group10的配置文件,在管理台2中导入配置,选中剩余的节点C和节点D,点击确定
进入管理台2,点击“加入已有群组”
加入完成后
操作完成后,如下图所示,节点C/D的群组group10也生成并出于running状态了,至此,我们就顺利完成创建群组group10的所有操作了!
合约仓库¶
合约仓库内置于WeBASE-Front。其中提供常用的工具合约和推荐应用合约模板,用户可将合约导入到自己目录进行引入。
工具合约¶
Address¶
Address library
Address contract usage methods can refer to the Points contract warehouse。
- Detect whether the address is a contract
- Detect if the address is 0x0
String library¶
String library
Provides common string-related operations, including copying, finding, replacing, and so on。
Roles¶
Role permissions control contracts
SafeMath¶
SafeMath library
A secure mathematical library that provides a safe addition, subtract, and divide。The use of secure mathematical contracts can refer to the Points contract warehouse。
table¶
table library
BCOS CRUD uses the base library, which you can reference by re-contract calling CRUD.Table contract usage methods can be described by referring to the assat example in the bcos document https://fisco-bcos-documentation.readthedocs.io.
存证合约模板¶
简介¶
Evidence 示例合约,使用分层的智能合约结构:
- 工厂合约(EvidenceSignersData.sol),由存证各方事前约定,存储存证生效条件,并管理存证的生成。
- 存证合约(Evidence.sol),由工厂合约生成,存储存证id,hash和各方签名(每张存证一个合约)。
使用步骤:¶
- 部署EvidenceSignersData合约,并在构造函数中指定存证生效条件(需要哪些机构进行认证确认)。
- 存证时通过newEvidence接口在区块链上创建具体存证合约。
- 解析newEvidence调用返回的receipt,将解析出来的存证合约地址保存在应用系统。
- 仲裁等认证机构利用存证合约地址调用addSignatures来对存证进行确认。
- 取证时利用存证合约地址调用getEvidence接口进行取证。
积分合约模板¶
简介¶
BAC001 是一套区块链积分合约,可以积分相关的增发,销毁,暂停合约,黑白名单等权限控制。
四个基本元素¶
description
此积分的具体描述
shortName
积分简称
minUnit
积分最小单位
totalAmount
积分总数量
五个基本行为:¶
发行
调用合约的 deploy 方法,传入你初始化的四个元素即可,即在区块链上发行了你指定总量和名称的积分。
- 其中 minUnit 和 totalAmount 不能为负数或小数
转账
调用 send 方法即可实现转账,之后调用 balance 方法可以查看自己的积分余额
增发
调用 issue 方法特定地址增发积分, 并可以通过 addIssuer 增加有权限增发积分的人,也可以通过renounceIssuer 方法移除增发权限
销毁
调用 destory 以及 destoryFrom 销毁自己地址下积分和特定地址下的积分
暂停
遇到紧急状况,你可以调用 suspend 方法,暂停合约,这样任何人都不能调用 send 函数。故障修复后,可以调用 unSuspend 方法解除暂停。也可以通过 addSuspender 和 renounceSuspender 相应增加和移除暂停者权限
使用样例伪码¶
// 示例中Alice和Bob都为一个外部账号地址。
// 部署合约,即初始化积分,示例初始化信息如下:
// 积分描述:car points
// 积分简称 TTT
// 最小转账单位 1
// 发行总量10000000
// 默认合约部署者为第一个发行者
BAC001 bac001 = BAC001.deploy(web3j, credentials,
contractGasProvider, "car points", "TTT", BigInteger.valueOf(1), BigInteger.valueOf(1000000)).send();
String contractAddress = bac001.getContractAddress();
// 增加积分发行者
bac001.addIssuer(Alice).send();
// 增发积分
bac001.issue(Alice, new BigInteger("10000"),"increase 10000 asset ").send();
// 积分转账,以及积分转账备注 Owner -> Alice
bac001.send(Alice,new BigInteger("10000"),"dinner Points").send();
// 查询积分余额
assertEquals( bac001.balance(Alice).send().toString(),"30000");
接口说明¶
totalAmount()
返回积分总量
- 这里的积分总量需要计算最小转账单位,所以实际返回值为 totalAmount * 10minUnit
balance(address owner)
返回owner的帐户的积分余额
send(address to, uint256 value , string data)
将数量为value的积分转入地址 to 并触发 transfer 事件, data 是转账备注
- suspend 状态下无法进行此操作
- 请避免 to 为自身进行操作
sendFrom(address from,address to,uint256 value,string data))
将地址 from 中的 value 数量的积分转入地址 to ,并触发 transfer 事件,data 是转账备注。
- 方法的调用者可以不为 from, 此时需要预先进行 approve 授权
- from 不能为调用者自身地址,否则会报错
- suspend 状态下无法执行此操作
safeSendFrom(address from, address to, uint256 value, string data)
安全的将地址 from 中的 value 数量的积分转入地址 to ( to如果是合约地址,必须实现接收接口 BAC001Holder 才可以接收转账) ,并触发 transfer 事件,data 是转账备注
- suspend 状态下无法执行此操作
safeBatchSend( address[] to, uint256[] values, string data)
批量将自己账户下的积分转给 to 数组的地址, to 和 values 的个数要一致
- suspend 状态下无法执行此操作
approve(address spender,uint256 value)
允许 spender 从自己账户提取限额 value 的积分
- 此方法配合 sendfrom / safesendfrom 一起使用
- 重复授权时,最终授权额度为最后一次授权的值
allowance(address owner,address spender)
返回 spender 可从 owner 提取的积分数量上限
- 此方法配合 approve 一起使用
increaseAllowance(address spender, uint256 addedValue)
允许 spender 提取的积分上限在原有基础上增加 addedValue
- 此方法配合 approve 使用
decreaseAllowance(address spender, uint256 subtractedValue)
允许 spender 提取的积分上限在原有基础上减少 subtractedValue
- 此方法配合 approve 使用
minUnit()
积分最小单位
shortName()
积分简称
description()
积分描述
destory(uint256 value, string data)
减少自己的积分,data 是转账备注
- 调用时,value 值需要小于等于目前自己的积分总量
destroyFrom(address from, uint256 value, string data)
减少地址 from 积分,data 是转账备注
- 调用此方法时,需要配合 approve 进行使用
issue(address to, uint256 value,string data)
给地址 to 增加数量为 value 的积分,data 是转账备注
isIssuer(address account)
检查 account 是否有增加积分的权限
addIssuer(address account)
使地址 account 拥有增加积分的权限
renounceIssuer()
移除增加积分的权限
suspend()
暂停合约
- suspend 后无法进行 send / safesendfrom / sendfrom / safeBatchSend / approves 操作
unSuspend()
重启合约
suspended
判断合约是否处于暂停状态
isSuspender(address account)
是否有暂停合约权限
- 配合 suspend 方法一起使用
addSuspender(address account)
增加暂停权限者
- 配合 suspend 方法一起使用
renounceSuspender()
移除暂停权限
- 配合 suspend / addSuspender 方法使用
使用WeBASE开发区块链应用¶
登录WeBASE管理平台进行配置¶
安装WeBASE完成后,需要将节点信息添加到WeBASE平台中,这样WeBASE才可和节点进行通信。需要添加的信息包含节点信息,生成用户的私钥等。如下图所示:
- 节点信息:
[节点]
- 私钥用户:
[私钥用户]
开发智能合约¶
以HelloWorld.sol为例
pragma solidity ^0.4.2;
contract HelloWorld{
string name;
function HelloWorld(){
name = "Hello, World!";
}
function get()constant returns(string){
return name;
}
function set(string n){
name = n;
}
}
- 通过智能合约IDE部署合约,并获取合约地址等信息,
[合约]
应用层开发¶
- 调用交易接口
请参考交易接口
从IDE中的输出信息,拷贝合约地址,合约名,方法名等信息,同时获取用户的公钥地址信息,调用交易接口。 具体代码请参考 HelloWorld范例
- 主要代码
application.yml
transactionUrl: http://127.0.0.1:5002/WeBASE-Front/trans/handle
groupId: 1
userAddress: "0x4f08eac5af5e77b7006d11bee94adba2f721def8"
useAes: true
contract.name: HelloWorld
contract.address: "0xca597170829f4ad5054b618425a56e0be23cbc55"
contract.funcName: set
contract.funcParam: "[\"abc\"]"
- TransactionService.java
@Slf4j
@Data
@Service
public class TransactionService {
@Autowired
private RestTemplate rest;
@Value("${transactionUrl}")
private String url;
@Value("${userAddress}")
private String user;
@Value("${groupId}")
private int groupId;
@Value("${useAes}")
private Boolean useAes;
@Value("${contract.name}")
private String contractName;
@Value("${contract.address}")
private String contractAddress;
@Value("${contract.funcName}")
private String funcName;
@Value("${contract.funcParam}")
private String funcParam;
public void sendTransaction() {
try {
TransactionParam transParam = new TransactionParam();
transParam.setGroupId(groupId);
transParam.setContractAddress(contractAddress);
transParam.setUseAes(useAes);
transParam.setUser(user);
transParam.setContractName(contractName);
transParam.setFuncName(funcName);
transParam.setFuncParam(JSONArray.parseArray(funcParam));
log.info("transaction param:{}", JSON.toJSONString(transParam));
Object rsp = rest.postForObject(url, transParam, Object.class);
String rspStr = "null";
if (Objects.nonNull(rsp)) {
rspStr = JSON.toJSONString(rsp);
}
log.info("transaction result:{}", rspStr);
} catch (Exception ex) {
log.error("fail sendTransaction", ex);
}
System.exit(1);
}
}
节点前置服务¶
概要介绍¶
使用说明¶
WeBASE-Front是和FISCO-BCOS节点配合使用的一个子系统。此分支支持FISCO-BCOS 2.0以上版本,集成web3sdk,对接口进行了封装,可通过HTTP请求和节点进行通信。另外,具备可视化控制台,可以在控制台上开发智能合约,部署合约和发送交易,并查看交易和区块详情。还可以管理私钥,对节点健康度进行监控和统计。
WeBASE-Front使用方式有以下三种:
1、单独部署作为独立控制台使用,请参考部署说明。
2、结合WeBASE-Node-Manager和WeBASE-Web服务一起部署使用,请参考WeBASE安装部署。
3、结合WeBASE-Sign服务一起部署使用,调用WeBASE-Sign进行数据签名,再发送上链。此方式在方式1的基础上再部署WeBASE-Sign服务,然后需调用合约部署(结合WeBASE-Sign)接口、交易处理(结合WeBASE-Sign)接口进行合约部署和调用。
注意: WeBASE-Front需要跟节点同机部署,一个节点对应一个WeBASE-Front服务。
国密支持¶
WeBASE-Front v1.2.2+已支持 国密版FISCO-BCOS,使用WeBASE v1.2.2及以上版本
WeBASE-Front具体需要适配国密版FISCO-BCOS的地方有:
- 开启web3sdk的国密开关:修改
application.yml/application.properties
中的encryptType
改为1
; - 合约编译支持国密版:
- WeBASE-Front Web编译智能合约已引入sol-0.4.25-gm.js,已自动切换支持国密版智能合约的编译/部署/调用;
- WeBASE-Front后台编译国密版智能合约,已引入solcJ:0.4.25-rc1.jar,自动切换支持国密版智能合约的编译/部署/调用;
安装详情可查看下一章节的WeBASE-Front部署说明
支持链上事件订阅和通知¶
在某些业务场景中,应用层需要实时获取链上的事件,如出块事件、合约Event事件等。应用层通过WeBASE连接节点后,由于无法和节点直接建立长连接,难以实时获取链上的消息。
为了解决这个问题,应用层可通过WeBASE-Front订阅链上事件,当事件触发时,可通过RabbitMQ消息队列通知到应用层,架构如下:
链上事件通知架构
WeBASE-Front默认不启用消息推送功能,如需启用请参考附录-链上事件订阅和通知
部署说明¶
1. 前提条件¶
依赖软件 | 支持版本 |
---|---|
Java | JDK8或以上版本 |
FISCO-BCOS | V2.0.x版本 |
备注: Java推荐使用OracleJDK,可参考JDK配置指引(CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK无法正常连接区块链节点)
国密支持¶
WeBASE-Front v1.2.2+已支持 国密版FISCO-BCOS
开启国密国密SSL:
- 在v1.5.0后,sdk将自动根据链的加密类型切换国密或非国密,自动根据链的SSL类型切换国密SSL
国密编译:
- 编译国密版智能合约在v1.3.1版本后,通过引入solcJ:0.4.25-rc1.jar,自动切换支持国密版智能合约的编译/部署/调用;(可自行替换jar包版本为solcJ-0.5.2来使用0.5进行后台接口的合约编译)
- 该部分仅影响后台的
/contract
合约编译接口,不影响前端合约IDE的合约编译
solidity v0.6.10支持¶
WeBASE-Front v1.4.2已支持solidity v0.5.1
和v0.6.10
2. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Front.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Front.git
进入目录:
cd WeBASE-Front
3. 编译代码¶
使用以下方式编译构建,如果出现问题可以查看 常见问题解答 :
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Front下生成已编译的代码目录dist。
4. 修改配置¶
(1)进入dist目录
cd dist
dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)进入conf目录:
cd conf
注意: 将节点所在目录nodes/${ip}/sdk
下的所有文件拷贝到当前conf
目录,供SDK与节点建立连接时使用(SDK会自动判断是否为国密,且是否使用国密SSL)
- 链的
sdk
目录包含了ca.crt, sdk.crt, sdk.key
和gm
文件夹,gm
文件夹包含了国密SSL所需的证书 - 拷贝命令可使用
cp -r nodes/${ip}/sdk/* ./conf/
- 注,只有在建链时手动指定了
-G
(大写)时节点才会使用国密SSL
(3)修改配置(根据实际情况修改):
如果在企业部署中使用WeBASE-Front,必须配置下文中的keyServer
vi application.yml
spring:
datasource:
url: jdbc:h2:file:./h2/webasefront;DB_CLOSE_ON_EXIT=FALSE // 默认H2库为webasefront,建议修改数据库存放路径
...
server:
port: 5003 // 服务端口
context-path: /WeBASE-Front
sdk:
...
ip: 127.0.0.1 // 连接节点的监听ip
channelPort: 20200 // 连接节点的链上链下端口
certPath: conf // sdk证书的目录,默认为conf
constant:
keyServer: 127.0.0.1:5004 // 密钥服务的IP和端口(WeBASE-Node-Manager服务或者WeBASE-Sign服务,不同服务支持的接口不同),如果作为独立控制台使用可以不配置
transMaxWait: 30 // 交易最大等待时间
monitorDisk: / // 要监控的磁盘目录,配置节点所在目录(如:/data)
monitorEnabled: true // 是否监控数据,默认true
aesKey: EfdsW23D23d3df43 // aes加密key(16位) 如启用,各互联的子系统的加密key需保持一致
nodePath: /fisco/nodes/127.0.0.1/node0 //配置连接节点的绝对路径
...
5. 服务启停¶
返回到dist目录执行:
启动: bash start.sh
停止: bash stop.sh
检查: bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启提示服务进程在运行,则先执行stop.sh,再执行start.sh。
启动成功将出现如下日志:
...
Application() - main run success...
6. 访问控制台¶
http://{deployIP}:{frontPort}/WeBASE-Front
示例:http://localhost:5002/WeBASE-Front
- 部署服务器IP和服务端口需对应修改,网络策略需开通
- 基于可视化控制台,可以开发智能合约,部署合约和发送交易,并查看交易和区块详情。还可以管理私钥,对节点健康度进行监控和统计
接口说明¶
1. 合约接口¶
1.1. 发送abi接口¶
接口描述¶
根据abi内容判断合约是否已部署,未部署则生成对应abi文件
接口URL¶
http://localhost:5002/WeBASE-Front/contract/abiInfo
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | address | String | 是 | ||
4 | 合约abi | abiInfo | List | 是 | abi文件里面的内容,是一个JSONArray | |
5 | 合约bin | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin) |
2)数据格式
{
"groupId": 1,
"contractName": "HelloWorld",
"address": "0x31b26e43651e9371c88af3d36c14cfd938baf4fd",
"contractBin": "608060405234801561001057600080fd5b5060405161031d38038061031d8339810180",
"abiInfo": [
{"inputs": [{"type": "string", "name": "n"}], "constant": false, "name": "set",
"outputs": [], "payable": false, "type": "function"},
{"inputs": [], "constant": true, "name": "get", "outputs": [{"type": "string",
"name": ""}], "payable": false, "type": "function"},
{"inputs": [], "constant": false, "name": "HelloWorld", "outputs": [],
"payable": false, "type": "function"}
]
}
1.2. 合约部署接口(结合WeBASE-Sign)¶
接口描述¶
将合约部署到当前节点。此接口需结合WeBASE-Sign使用,通过调用WeBASE-Sign服务的签名接口让相关用户对数据进行签名,拿回签名数据再发送上链。需要调用此接口时,工程配置文件application.yml中的配置”keyServer”需配置WeBASE-Sign服务的ip和端口,并保证WeBASE-Sign服务正常和存在相关用户。
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义 constructor(uint n,bool b) -> [1,true] constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过本地私钥(测试用户)部署合约的接口(非WeBASE-Sign签名交易),可查看其他接口-合约部署接口(本地签名)
接口URL¶
http://localhost:5002/WeBASE-Front/contract/deployWithSign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | int | 是 | ||
2 | 用户编号 | signUserId | String | 64 | 是 | WeBASE-Sign中的用户编号,通过webase-sign创建私钥获取 |
3 | 合约名称 | contractName | String | 是 | ||
4 | 合约abi | abiInfo | List | 是 | 合约编译后生成的abi文件内容 | |
5 | 合约bin | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 | |
6 | 构造函数参数 | funcParam | List | 否 | 合约构造函数所需参数,JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] | |
7 | 合约版本 | version | String | 否 | 用于指定合约在CNS中的版本 |
2)数据格式
{
"groupId":1,
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3",
"bytecodeBin":"xxx",
"abiInfo": [],
"funcParam":[]
}
示例:
curl -X POST "http://localhost:5002/WeBASE-Front/contract/deployWithSign" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"contractAbi\": [ { \"outputs\": [], \"constant\": false, \"payable\": false, \"inputs\": [ { \"name\": \"n\", \"type\": \"string\" } ], \"name\": \"set\", \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"outputs\": [ { \"name\": \"\", \"type\": \"string\" } ], \"constant\": true, \"payable\": false, \"inputs\": [], \"name\": \"get\", \"stateMutability\": \"view\", \"type\": \"function\" }, { \"payable\": false, \"inputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }, { \"inputs\": [ { \"indexed\": false, \"name\": \"name\", \"type\": \"string\" } ], \"name\": \"nameEvent\", \"anonymous\": false, \"type\": \"event\" } ], \"bytecodeBin\": \"608060405234801561001057600080fd5b506040805190810160405280600681526020017f68656c6c6f2100000000000000000000000000000000000000000000000000008152506000908051906020019061005c92919061011c565b507f9645e7fb5eec05c0f156d4901a10663561199c6dd0401214a0b833fe0022d899600060405180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156101095780601f106100de57610100808354040283529160200191610109565b820191906000526020600020905b8154815290600101906020018083116100ec57829003601f168201915b50509250505060405180910390a16101c1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061015d57805160ff191683800117855561018b565b8280016001018555821561018b579182015b8281111561018a57825182559160200191906001019061016f565b5b509050610198919061019c565b5090565b6101be91905b808211156101ba5760008160009055506001016101a2565b5090565b90565b610391806101d06000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634ed3885e146100515780636d4ce63c146100ba575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061014a565b005b3480156100c657600080fd5b506100cf61021e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010f5780820151818401526020810190506100f4565b50505050905090810190601f16801561013c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b80600090805190602001906101609291906102c0565b507f9645e7fb5eec05c0f156d4901a10663561199c6dd0401214a0b833fe0022d8996000604051808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561020d5780601f106101e25761010080835404028352916020019161020d565b820191906000526020600020905b8154815290600101906020018083116101f057829003601f168201915b50509250505060405180910390a150565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102b65780601f1061028b576101008083540402835291602001916102b6565b820191906000526020600020905b81548152906001019060200180831161029957829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061030157805160ff191683800117855561032f565b8280016001018555821561032f579182015b8281111561032e578251825591602001919060010190610313565b5b50905061033c9190610340565b5090565b61036291905b8082111561035e576000816000905550600101610346565b5090565b905600a165627a7a723058201be6d6e6936e66c64b93771f9bd7ee708553fb6faf82e0273336fac2b1c6d83d0029\", \"funcParam\": [ ], \"groupId\": 1, \"signUserId\": "458ecc77a08c486087a3dcbc7ab5a9c3"}"
1.3. 合约部署接口(本地签名)¶
接口描述¶
此接口为WeBASE-Front使用本地私钥(页面中的测试用户)进行签名
将合约部署到当前节点。
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义 constructor(uint n,bool b) -> [1,true] constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过WeBASE-Sign部署合约的接口(非本地私钥签名交易),可查看合约接口-合约部署接口(结合WeBASE-Sign)
接口URL¶
http://localhost:5002/WeBASE-Front/contract/deploy
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | int | 是 | ||
2 | 用户地址 | user | String | 是 | 用户地址,可通过/privateKey 接口创建 |
|
3 | 合约名称 | contractName | String | 是 | ||
4 | 合约abi | abiInfo | List | 是 | 合约编译后生成的abi文件内容 | |
5 | 合约bin | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 | |
6 | 构造函数参数 | funcParam | List | 否 | 合约构造函数所需参数,JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] | |
7 | 合约版本 | version | String | 否 | 用于指定合约在CNS中的版本 |
2)数据格式
{
"user":"0x2db346f9d24324a4b0eac7fb7f3379a2422704db",
"contractName":"HelloWorld",
"abiInfo": [],
"bytecodeBin":"",
"funcParam":[]
}
1.4. java转译接口¶
接口描述¶
将合约abi转成java文件
接口URL¶
http://localhost:5002/WeBASE-Front/contract/compile-java
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
2 | 合约abi | abiInfo | List | 是 | ||
3 | 合约bin | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin) | |
4 | 所在目录 | packageName | String | 是 | 生成java所在的包名 |
2)数据格式
{
"contractName": "HeHe",
"abiInfo": [],
"contractBin": "60806040526004361061004c576000357c0100000000000000000000029",
"packageName": "com.webank"
}
响应参数¶
1)数据格式 java文件
1.5. 保存合约接口¶
接口描述¶
支持前置的控制台保存合约信息
接口URL¶
http://localhost:5002/WeBASE-Front/contract/save
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | int | 是 | ||
2 | 合约编号 | contractId | int | 否 | ||
3 | 合约名称 | contractName | String | 是 | ||
4 | 合约所在目录 | contractPath | String | 是 | ||
5 | 合约abi | contractAbi | String | 否 | ||
6 | 合约bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 | |
7 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 | |
8 | 合约源码 | contractSource | String | 否 |
2)数据格式
{
"groupId": "1",
"contractName": "HeHe",
"contractPath": "/",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsn0=",
"contractAbi": “[]”
"contractBin": "60806040526004361061004c576000357c0100000000000000000000000029",
"bytecodeBin": "6080604052348015610010572269b80029",
"contractId": 1
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约编号 | id | Integer | 是 | ||
2 | 所在目录 | contractPath | String | 是 | ||
3 | 合约名称 | contractName | String | 是 | ||
4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 | |
5 | 所属群组 | groupId | Integer | 是 | ||
6 | 合约源码 | contractSource | String | 否 | ||
7 | 合约abi | contractAbi | String | 否 | 合约编译后生成的abi文件内容 | |
8 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 | |
9 | 合约bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 | |
10 | 合约地址 | contractAddress | String | 否 | ||
11 | 部署时间 | deployTime | String | 否 | ||
12 | 修改时间 | modifyTime | String | 是 | ||
13 | 创建时间 | createTime | String | 是 | ||
14 | 备注 | description | String | 否 |
2)数据格式
{
"id": 1,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": 1,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsKCmICB9Cn0=",
"contractAbi": "[{\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"contractBin": "60806040526004361061004c5760003569b80029",
"bytecodeBin": "608060405234801561001057600080fd5b506029",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 11:48:51",
"modifyTime": "2019-06-10 15:31:29"
}
1.6. 删除合约接口¶
接口描述¶
支持前置的控制台通过群组编号和合约编号删除未部署的合约信息
接口URL¶
http://localhost:5002/WeBASE-Front/contract/{groupId}/{contractId}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | int | 是 | ||
2 | 合约编号 | contractId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/1/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
1.7. 分页查询合约列表¶
接口描述¶
支持前置的控制台分页查询合约列表
接口URL¶
http://localhost:5002/WeBASE-Front/contract/contractList
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约名称 | contractName | String | 否 | ||
3 | 合约状态 | contractStatus | Integer | 否 | 1未部署,2已部署 | |
4 | 合约地址 | contractAddress | String | 否 | ||
5 | 当前页码 | pageNumber | Integer | 是 | 从1开始 | |
6 | 每页记录数 | pageSize | Integer | 是 | ||
7 | 合约路径 | contractPath | String | 否 |
2)数据格式
{
"groupId": "1",
"pageNumber": 1,
"pageSize": 10,
"contractName": "",
"contractAddress": "",
"contractStatus": 2
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | Integer | 是 | |
3.6 | 合约源码 | contractSource | String | 否 | |
3.7 | 合约abi | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
3.8 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.9 | bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 |
3.10 | 合约地址 | contractAddress | String | 否 | |
3.11 | 部署时间 | deployTime | String | 否 | |
3.12 | 修改时间 | modifyTime | String | 是 | |
3.13 | 创建时间 | createTime | String | 是 | |
3.14 | 备注 | description | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 2,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": 1,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAbi": "",
"contractBin": "",
"bytecodeBin": null,
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
],
"totalCount": 1
}
1.8. 合约是否被修改接口¶
接口描述¶
校验已部署的合约是否被修改了,返回true或false
接口URL¶
http://localhost:5002/WeBASE-Front/contract/ifChanged/{groupId}/{contractId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | int | 是 | ||
2 | 合约编号 | contractId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/ifChanged/1/10
1.9. 后台编译合约¶
接口描述¶
通过后台的solcJ对solidity合约进行编译,返回合约的BIN与ABI
接口URL¶
http://localhost:5002/WeBASE-Front/contract/contractCompile
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
2 | 合约源码 | solidityBase64 | String | 是 | 经过Base64编码的合约源码内容 |
2)数据格式
{
"contractName": "HelloWorld",
"solidityBase64": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsKCmICB9Cn0"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
3 | 合约bin | bytecodeBin | String | 是 | ||
4 | 合约abi | contractAbi | String | 是 |
2)数据格式
{
"contractName": "HeHe",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsKCmICB9Cn0=",
"bytecodeBin": "608060405234801561001057600080fd5b506029",
"contractAbi": "[{\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
}
1.10. 多合约编译¶
接口描述¶
接口参数为合约文件压缩成zip并Base64编码后的字符串。合约文件需要放在同级目录压缩,涉及引用请使用”./XXX.sol”。可参考测试类ContractControllerTest的testMultiContractCompile()方法。国密和非国密编译的bytecodeBin不一样,以下以国密为例。
接口URL¶
http://localhost:5002/WeBASE-Front/contract/multiContractCompile
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约源码 | contractZipBase64 | String | 是 | 合约文件压缩成zip,并Base64编码 |
2)数据格式
{
"contractZipBase64": "UEsDBBQAAAAIAIqMeFAi98KgkQAAAPwAAAAOAAAASGVsbG9Xb3JsZC5zb2xdjjELwjAQhfdC/8ON7VJE3Iq7k4uDmxDSMwSSi1yugkj/u7GJNPjGe/e+9x6sjFcQg7OTlRfcdsNh2I9towMJKy1wQufCNbCb3m0DSVHYkgFSHsd8wSeSwAXlnG5d5ffl4T6TFhsIDErXJ3QUlRKMMjPFkui//Kzi1B3LHykm0q+pTqK32xRaB2StsCNtuOUDUEsBAj8AFAAAAAgAiox4UCL3wqCRAAAA/AAAAA4AJAAAAAAAAAAgAAAAAAAAAEhlbGxvV29ybGQuc29sCgAgAAAAAAABABgA3EMdrL8B1gGPz3r5xAjWAX8gr5/Rr9UBUEsFBgAAAAABAAEAYAAAAL0AAAAAAA=="
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
2 | 合约bin | bytecodeBin | String | 是 | ||
3 | 合约abi | contractAbi | String | 是 | ||
4 | 合约内容 | contractSource | String | 否 | 单个合约内容Base64编码 |
2)数据格式
[
{
"contractName": "HelloWorld",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029"
}
]
1.11. 获取全量合约列表(不包含abi/bin)¶
接口描述¶
根据群组编号和合约状态获取全量合约
接口URL¶
http://localhost:5002/WeBASE-Front/contract/contractList/all/light?groupId={groupId}&contractStatus={contractStatus}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/contractList/all/light?groupId=1&contractStatus=2
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | Integer | 是 | |
3.6 | 合约地址 | contractAddress | String | 否 | |
3.7 | 部署时间 | deployTime | String | 否 | |
3.8 | 修改时间 | modifyTime | String | 是 | |
3.9 | 创建时间 | createTime | String | 是 | |
3.10 | 备注 | description | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 2,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": 1,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
],
"totalCount": 1
}
1.12. 根据id获取单个合约¶
接口描述¶
根据合约id获取单个合约
接口URL¶
http://localhost:5002/WeBASE-Front/contract/findOne/{contractId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约编号 | contractId | Integer | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/findOne/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | Integer | 是 | |
3.6 | 合约源码 | contractSource | String | 否 | |
3.7 | 合约abi | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
3.8 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.9 | bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 |
3.10 | 合约地址 | contractAddress | String | 否 | |
3.11 | 部署时间 | deployTime | String | 否 | |
3.12 | 修改时间 | modifyTime | String | 是 | |
3.13 | 创建时间 | createTime | String | 是 | |
3.14 | 备注 | description | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": 1,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAbi": "",
"contractBin": "",
"bytecodeBin": null,
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
]
}
1.13. 获取合约路径列表¶
接口描述¶
获取合约路径列表
接口URL¶
http://localhost:5002/WeBASE-Front/contract/findPathList/{groupId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/findPathList/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回数据 | data | List | 否 | |
1.1 | 群组编号 | groupId | Integer | 是 | |
1.2 | 所在目录 | contractPath | String | 是 | |
1.3 | 修改时间 | modifyTime | String | 是 | |
1.4 | 创建时间 | createTime | String | 是 |
2)数据格式
[
{
"groupId": 1,
"contractPath": "/",
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
]
1.14. 保存合约路径¶
接口描述¶
保存合约路径
接口URL¶
http://localhost:5002/WeBASE-Front/contract/addContractPath
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
1 | 合约路径 | contractPath | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/addContractPath
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 群组编号 | groupId | Integer | 是 | |
2 | 所在目录 | contractPath | String | 是 | |
3 | 修改时间 | modifyTime | String | 是 | |
4 | 创建时间 | createTime | String | 是 |
2)数据格式
{
"groupId": 1,
"contractPath": "/",
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
1.15. 删除合约路径¶
接口描述¶
删除合约路径
接口URL¶
http://localhost:5002/WeBASE-Front/contract/deletePath/{groupId}/{contractPath}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
1 | 合约路径 | contractPath | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/deletePath/1/test
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
}
1.16. 根据合约路径批量删除合约¶
接口描述¶
根据合约路径批量删除合约
接口URL¶
http://localhost:5002/WeBASE-Front/contract/batch/{groupId}/{contractPath}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
1 | 合约路径 | contractPath | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/batch/1/test
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
}
1.17. 注册cns接口¶
接口描述¶
注册cns
接口URL¶
http://localhost:5002/WeBASE-Front/contract/registerCns
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约名称 | contractName | String | 是 | ||
3 | cns名称 | cnsName | String | 是 | ||
4 | 合约地址 | contractAddress | String | 是 | ||
5 | 合约abi | abiInfo | List | 是 | abi文件里面的内容,是一个JSONArray | |
6 | cns版本 | version | String | 是 | ||
7 | 是否保存 | saveEnabled | bool | 是 | 前置控制台调用时传true,其他调用传false | |
8 | 用户地址 | userAddress | String | 否 | saveEnabled为true时必填 | |
9 | 合约路径 | contractPath | String | 否 | saveEnabled为true时必填 | |
10 | 签名用户编号 | signUserId | String | 否 | saveEnabled为false时必填 |
2)数据格式
{
"groupId": 1,
"contractName": "Hello",
"cnsName": "Hello",
"contractPath": "/",
"version": "v0.4",
"contractAddress": "0xcaff8fdf1d461b91c7c8f0ff2af2f79a80bc189e",
"abiInfo": [{"cons tant":false,"inputs":[{"name":"n","type":"string","type0":null,"indexed":false}],"name":"set","outputs":[{"name":"","type":"string","type0":null,"indexed":false}],"type":"function","payable":false,"stateMutability":"nonpayable"},{"co nstant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string","type0":null,"indexed":false}],"type":"function","payable":false,"stateMutability":"view"},{"constant":false,"inputs":[{"name":"name","type":"string","type0":null,"indexed":false}],"name":"SetName","outputs":null,"type":"event","payable":false,"stateMutability":null}],
"signUserId": null,
"userAddress": "0x8c808ff5beee7b4cfb17f141f6237db93a668e46",
"saveEnabled": true
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
}
1.18. 根据合约地址获取cns信息¶
接口描述¶
根据合约地址获取cns信息,返回改合约地址最新的cns信息
接口URL¶
http://localhost:5002/WeBASE-Front/contract/findCns
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约地址 | contractAddress | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/findCns
{
"groupId": 1,
"contractAddress": "0xe46c1a681811ee78079b48a956ead6d9dd10bf6a"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | List | 否 | |
3.1 | 群组编号 | groupId | Integer | 是 | |
3.2 | 合约路径 | contractPath | String | 是 | |
3.3 | 合约名 | contractName | String | 是 | |
3.4 | cns名 | cnsName | String | 是 | |
3.5 | cns版本 | version | String | 是 | |
3.6 | 合约地址 | contractAddress | String | 是 | |
3.7 | 合约Abi | contractAbi | String | 是 | |
3.8 | 修改时间 | modifyTime | String | 是 | |
3.9 | 创建时间 | createTime | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
"data": {
"groupId": 1,
"contractPath": "/",
"contractName": "Hello",
"cnsName": "Hello",
"version": "v0.4",
"contractAddress": "0xcaff8fdf1d461b91c7c8f0ff2af2f79a80bc189e",
"contractAbi":"[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"type\":\"function\",\"payable\":false,\"stateMutability\":\"view\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"name\":\"set\",\"outputs\":[],\"type\":\"function\",\"payable\":false,\"stateMutability\":\"nonpayable\"},{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"name\":\"SetName\",\"outputs\":null,\"type\":\"event\",\"payable\":false,\"stateMutability\":null}]",
"createTime": "2020-12-30 16:32:28",
"modifyTime": "2020-12-30 16:32:28"
}
}
2. 密钥接口¶
2.1. 获取公私钥接口¶
接口描述¶
通过调用此接口获取公私钥对和对应账户信息
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey?type={type}&userName={userName}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥类型 | type | int | 否 | 0-本地用户;1-本地随机;2-外部用户 | |
2 | 用户名 | userName | String | 否 | 类型为本地用户时必填 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey?type=0&userName=test
响应参数¶
1)数据格式 本地用户时:
{
"address": "0x2007e1430f41f75c850464307c0994472bd92ee0",
"publicKey": "0x9bd35211855f9f8de22d8a8da7f30d35d62ab2c3d36ea5162008fcbb9faff4d83809f7033deb20049bf51e081105076ec7a09a847f852530f81e978b1eda0392",
"privateKey": "42caa160cadcb635381b980ddd981171c862d3105981fe92d6db330f30615f21",
"userName": "test",
"type": 0,
"signUserId": null, // 本地用户则为空
"appId": null // 本地用户则为空
}
外部用户时(来自WeBASE-Sign):
{
"address": "0x2007e1430f41f75c850464307c0994472bd92ee0",
"publicKey": "0x9bd35211855f9f8de22d8a8da7f30d35d62ab2c3d36ea5162008fcbb9faff4d83809f7033deb20049bf51e081105076ec7a09a847f852530f81e978b1eda0392",
"userName": "test",
"type": 0,
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3",
"appId": "458ecc77a08c486087a3dcbc7ab5a9c3"
}
2.2. 导入私钥接口¶
接口描述¶
导入私钥信息,并返回对应的公钥及用户地址
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/import?privateKey={privateKey}&userName={userName}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥信息 | privateKey | String | 是 | ||
2 | 用户名 | userName | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/import?privateKey=8cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c&userName=lili
响应参数¶
1)数据格式
{
"address": "0x2e8ff65fb1b2ce5b0c9476b8f8beb221445f42ee",
"publicKey": "0x1c7073dc185af0644464b178da932846666a858bc492450e9e94c77203428ed54e2ce45679dbb36bfed714dbe055a215dc1aaf4a75faeddce6a62b39c0158e1e",
"privateKey": "8cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c",
"userName": "lili",
"type": 0
}
2.3. 获取本地公私钥列表接口¶
接口描述¶
返回本地公私钥信息列表
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/localKeyStores
调用方法¶
HTTP GET
响应参数¶
1)数据格式
[
{
"address": "0x2007e1430f41f75c850464307c0994472bd92ee0",
"publicKey": "0x9bd35211855f9f8de22d8a8da7f30d35d62ab2c3d36ea5162008fcbb9faff4d83809f7033deb20049bf51e081105076ec7a09a847f852530f81e978b1eda0392",
"privateKey": "42caa160cadcb635381b980ddd981171c862d3105981fe92d6db330f30615f21",
"userName": "test",
"type": 0
},
{
"address": "0x2e8ff65fb1b2ce5b0c9476b8f8beb221445f42ee",
"publicKey": "0x1c7073dc185af0644464b178da932846666a858bc492450e9e94c77203428ed54e2ce45679dbb36bfed714dbe055a215dc1aaf4a75faeddce6a62b39c0158e1e",
"privateKey": "8cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c",
"userName": "lili",
"type": 0
}
]
2.4. 删除公私钥接口¶
接口描述¶
支持前置的控制台通过用户地址删除公私钥信息
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/{address}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户地址 | address | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/0x2e8ff65fb1b2ce5b0c9476b8f8beb221445f42ee
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.5. 导入.pem私钥用户¶
接口描述¶
导入.pem格式的私钥
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/importPem
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | pem文件内容 | pemContent | String | 是 | 必须以-----BEGIN PRIVATE KEY-----\n 开头,以\n-----END PRIVATE KEY-----\n 结尾的格式 |
|
2 | 用户名 | userName | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/importPem
{
"pemContent":"-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgC8TbvFSMA9y3CghFt51/\nXmExewlioX99veYHOV7dTvOhRANCAASZtMhCTcaedNP+H7iljbTIqXOFM6qm5aVs\nfM/yuDBK2MRfFbfnOYVTNKyOSnmkY+xBfCR8Q86wcsQm9NZpkmFK\n-----END PRIVATE KEY-----\n",
"userName":"test222"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.6. 导入.p12私钥用户¶
接口描述¶
导入.p12格式的私钥
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/importP12
调用方法¶
HTTP POST | Content-type: form-data
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | p12文件 | p12File | MultipartFile | 是 | ||
2 | p12文件密码 | p12Password | String | 否 | 使用base64编码的密码;缺省时默认为"",即空密码;p12无密码时,可传入空值或不传;不包含中文 | |
2 | 用户名 | userName | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/importP12
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.7. 导入私钥到WeBASE-Sign¶
接口描述¶
导入私钥到WeBASE-Sign,其中privateKey经过Base64加密
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/importWithSign
调用方法¶
HTTP POST | Content-type: form-data
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | |
2 | 应用编号 | appId | String | 64 | 是 | |
2 | 私钥 | privateKey | String | 是 | 经过Base64加密后的内容 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/importWithSign
{
"privateKey": "OGFmNWIzMzNmYTc3MGFhY2UwNjdjYTY3ZDRmMzE4MzU4OWRmOThkMjVjYzEzZGFlMGJmODhkYjhlYzVhMDcxYw==",
"appId": "app_001",
"signUserId": "user_001"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.8. 对哈希签名¶
接口描述¶
计算HASH和签名值
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/signMessageHash
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | Sign用户Id | signUserId | String | 是 | 在webase-sign创建的私钥的id | |
2 | Hash值 | messageHash | String | 是 |
2)数据格式
{
"messageHash": "0xa271b78b8e869d693f7cdfee7162d7bfb11ae7531fd50f73d86f73a05c84dd7c",
"signUserId": "883cfa1d40117dd2d270aa8bb0bb33776409be8b"
}
响应参数¶
1)数据格式
{
"v": 0,
"r": "0x2a76a45bcf1113615f796cc01b23c57f81f20ce79500080bb34c7994ed04de06",
"s": "0x4f111eb37720e2618d8906368c825fd3cbe89b2781cb678efafb42399594a580",
"p": "0x4405f9d5d6ccff709b6543bc8ac24cbb649d3267a66db19ab8f85f3b884a8505f086c581490e7e50558879abde9c4d07fc2daab92f81c0eb4b805af3c8895cfc"
}
2.9. 导出pem私钥¶
接口描述¶
从本地或WeBASE-Sign导出pem私钥文件
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/exportPem
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | Sign用户编号 | signUserId | String | 否 | 非空时,导出sign的私钥 | |
2 | 用户地址 | userAddress | String | 否 | 若signUserId为空,则地址不能为空,导出本地私钥 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/exportPem
{
"userAddress": "0x883cfa1d40117dd2d270aa8bb0bb33776409be8b"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中,使用pcks12方式接收 |
2)数据格式
headers: content-disposition: attachment;filename*=UTF-8''111_0x0421975cf4a5b27148f65de11cd9d8559a1bbbd9.pem
{
-----BEGIN PRIVATE KEY-----
MIGNAgEAMBAGByqGSM49AgEGBSuBBAAKBHYwdAIBAQQg91Aha3x2UdpN2Sg5C5Wh
7Y8YwIYC5NTNtfQT1yp7hKWgBwYFK4EEAAqhRANCAAQ9SEdu1kLpLXVmayqax7N+
Pf/ATWx5jJIJIiQF6/BIiuORZrZb/M04FlxtGyVuQjQjbYVgyjNDUilj14OlZhXo
-----END PRIVATE KEY-----
}
2.10. 导出p12私钥¶
接口描述¶
从本地或WeBASE-Sign导出p12私钥文件
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/exportP12
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | Sign用户编号 | signUserId | String | 否 | 非空时,导出sign的私钥 | |
2 | 用户地址 | userAddress | String | 否 | 若signUserId为空,则地址不能为空,导出本地私钥 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/exportP12
{
"userAddress": "0x883cfa1d40117dd2d270aa8bb0bb33776409be8b"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中,使用pcks12方式接收 |
2)数据格式
headers: content-disposition: attachment;filename*=UTF-8''111_0x0421975cf4a5b27148f65de11cd9d8559a1bbbd9.p12
{
// 二进制流
}
3. web3接口¶
3.1. 获取块高接口¶
接口描述¶
获取节点最新块高
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/blockNumber
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/blockNumber
3.2. 根据块高获取块信息接口¶
接口描述¶
通过块高获取块信息
接口URL¶
http://localhost:5002/WeBASE-Front/1/web3/blockByNumber/{blockNumber}
调用方法¶
HTTP GET
请求参数¶
- 参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 块高 | blockNumber | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/blockByNumber/100
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"number": 100,
"hash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"parentHash": "0xc784a2af86e6726fcdc63b57ed1b91a40efc7d8b1b7285154d399ea78bd18754",
"nonce": 0,
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000040000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000800000000000000000000000000",
"transactionsRoot": "0x27055bac669a67e8aaa1455ad9fd70b75dd86dc905c6bd0d111ed67ab182d1dc",
"stateRoot": "0xa05ad5db11b8be6aed3b591f2f64fdbb241506cbe9ef591f3a4b946ca777f838",
"receiptsRoot": "0xc1d4b43ed68d7263ddf50861feec26440e933a0b152917e938194f5079b48ce4",
"author": "0x0000000000000000000000000000000000000000",
"miner": "0x0000000000000000000000000000000000000000",
"mixHash": null,
"difficulty": 1,
"totalDifficulty": 101,
"extraData": "0xd98097312e332e302b2b302d524c696e75782f672b2b2f496e74",
"size": 71,
"gasLimit": 2000000000,
"gasUsed": 121038,
"timestamp": 1526437108478,
"transactions": [
{
"hash": "0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b",
"nonce": 9.1623055443573E+74,
"blockHash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"blockNumber": 100,
"transactionIndex": 0,
"from": "0x59bd3815f73b197d6ef327f2a45089f50aba942a",
"to": "0x986278eb8e8b4ef98bdfc055c02d65865fc87ad2",
"value": 0,
"gasPrice": 30000000,
"gas": 30000000,
"input": "0x48f85bce000000000000000000000000000000000000000000000000000000000000001caf3fbec3675eabb85c0b25e2992d6f0a5e1546dad85c20733fdb27cfa4ca782a5fdfb621b416f3494c7d8ca436c12309884550d402ea79f03ef8ddfdd494f7a4",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"valueRaw": "0x0",
"gasPriceRaw": "0x1c9c380",
"gasRaw": "0x1c9c380",
"blockNumberRaw": "0x64",
"transactionIndexRaw": "0x0",
"nonceRaw": "0x2069170146129593df177e2c37f1b7fe74e2d0fda53dcbbca34a243d46e367a"
}
],
"uncles": [],
"sealFields": null,
"gasUsedRaw": "0x1d8ce",
"totalDifficultyRaw": "0x65",
"numberRaw": "0x64",
"nonceRaw": null,
"sizeRaw": "0x47",
"gasLimitRaw": "0x77359400",
"timestampRaw": "0x16366bddafe",
"difficultyRaw": "0x1"
}
}
3.3. 根据块hash获取块信息接口¶
接口描述¶
通过块hash获取块信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/blockByHash/{blockHash}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 区块hash | blockByHash | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/blockByHash/0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"number": 100,
"hash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"parentHash": "0xc784a2af86e6726fcdc63b57ed1b91a40efc7d8b1b7285154d399ea78bd18754",
"nonce": 0,
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000040000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000800000000000000000000000000",
"transactionsRoot": "0x27055bac669a67e8aaa1455ad9fd70b75dd86dc905c6bd0d111ed67ab182d1dc",
"stateRoot": "0xa05ad5db11b8be6aed3b591f2f64fdbb241506cbe9ef591f3a4b946ca777f838",
"receiptsRoot": "0xc1d4b43ed68d7263ddf50861feec26440e933a0b152917e938194f5079b48ce4",
"author": "0x0000000000000000000000000000000000000000",
"miner": "0x0000000000000000000000000000000000000000",
"mixHash": null,
"difficulty": 1,
"totalDifficulty": 101,
"extraData": "0xd98097312e332e302b2b302d524c696e75782f672b2b2f496e74",
"size": 71,
"gasLimit": 2000000000,
"gasUsed": 121038,
"timestamp": 1526437108478,
"transactions": [
{
"hash": "0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b",
"nonce": 9.1623055443573E+74,
"blockHash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"blockNumber": 100,
"transactionIndex": 0,
"from": "0x59bd3815f73b197d6ef327f2a45089f50aba942a",
"to": "0x986278eb8e8b4ef98bdfc055c02d65865fc87ad2",
"value": 0,
"gasPrice": 30000000,
"gas": 30000000,
"input": "0x48f85bce000000000000000000000000000000000000000000000000000000000000001caf3fbec3675eabb85c0b25e2992d6f0a5e1546dad85c20733fdb27cfa4ca782a5fdfb621b416f3494c7d8ca436c12309884550d402ea79f03ef8ddfdd494f7a4",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"valueRaw": "0x0",
"gasPriceRaw": "0x1c9c380",
"gasRaw": "0x1c9c380",
"blockNumberRaw": "0x64",
"transactionIndexRaw": "0x0",
"nonceRaw": "0x2069170146129593df177e2c37f1b7fe74e2d0fda53dcbbca34a243d46e367a"
}
],
"uncles": [],
"sealFields": null,
"gasUsedRaw": "0x1d8ce",
"totalDifficultyRaw": "0x65",
"numberRaw": "0x64",
"nonceRaw": null,
"sizeRaw": "0x47",
"gasLimitRaw": "0x77359400",
"timestampRaw": "0x16366bddafe",
"difficultyRaw": "0x1"
}
}
3.4. 获取块中交易个数接口¶
接口描述¶
根据块高获取该块中的交易个数
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/blockTransCnt/{blockNumber}
调用方法¶
HTTP GET
请求参数¶
- 参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 块高 | blockNumber | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/blockTransCnt/100
3.5. 获取PbftView接口¶
接口描述¶
通过调用此接口获取PbftView
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/pbftView
调用方法¶
HTTP GET
请求参数¶
- 参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/pbftView
3.6. 获取交易回执接口¶
接口描述¶
根据交易hash获取交易回执
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transactionReceipt/{transHash}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 交易hash | transHash | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/transactionReceipt/0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b
响应参数¶
2)数据格式
{
"transactionHash": "0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b",
"transactionIndex": 0,
"blockHash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"blockNumber": 100,
"cumulativeGasUsed": 121038,
"gasUsed": 121038,
"contractAddress": "0x0000000000000000000000000000000000000000",
"root": null,
"from": null,
"to": null,
"logs": [
{
"removed": false,
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b",
"blockHash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"blockNumber": 100,
"address": "0x986278eb8e8b4ef98bdfc055c02d65865fc87ad2",
"data": "0x00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001caf3fbec3675eabb85c0b25e2992d6f0a5e1546dad85c20733fdb27cfa4ca782a5fdfb621b416f3494c7d8ca436c12309884550d402ea79f03ef8ddfdd494f7a40000000000000000000000000000000000000000000000000000000000000040666164363863656230616530316530643731616635356331316561643031613532656638363435343866306134643133633836363164393664326461366239380000000000000000000000000000000000000000000000000000000000000002363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023630000000000000000000000000000000000000000000000000000000000000",
"type": "mined",
"topics": [
"0xbf474e795141390215f4f179557402a28c562b860f7b74dce4a3c0e0604cd97e"
],
"logIndexRaw": "0",
"blockNumberRaw": "100",
"transactionIndexRaw": "0"
}
],
"logsBloom": null,
"gasUsedRaw": "0x1d8ce",
"blockNumberRaw": "100",
"transactionIndexRaw": "0",
"cumulativeGasUsedRaw": "0x1d8ce",
"message": null,
"txProof": null,
"receiptProof": null
}
3.7. 根据交易hash获取交易信息接口¶
接口描述¶
根据交易hash获取交易信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transaction/{transHash}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 交易hash | transHash | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/transaction/0xa6750b812b1a7e36313879b09f0c41fc583b463c15e57608416f3a32688b432b
响应参数¶
1)数据格式
{
"hash": "0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b",
"nonce": 9.1623055443573E+74,
"blockHash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"blockNumber": 100,
"transactionIndex": 0,
"from": "0x59bd3815f73b197d6ef327f2a45089f50aba942a",
"to": "0x986278eb8e8b4ef98bdfc055c02d65865fc87ad2",
"value": 0,
"gasPrice": 30000000,
"gas": 30000000,
"input": "0x48f85bce000000000000000000000000000000000000000000000000000000000000001caf3fbec3675eabb85c0b25e2992d6f0a5e1546dad85c20733fdb27cfa4ca782a5fdfb621b416f3494c7d8ca436c12309884550d402ea79f03ef8ddfdd494f7a4",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"nonceRaw": "0x2069170146129593df177e2c37f1b7fe74e2d0fda53dcbbca34a243d46e367a",
"blockNumberRaw": "0x64",
"transactionIndexRaw": "0x0",
"valueRaw": "0x0",
"gasPriceRaw": "0x1c9c380",
"gasRaw": "0x1c9c380"
}
3.8. 获取web3j版本接口¶
接口描述¶
获取web3j版本
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/clientVersion
调用方法¶
HTTP GET
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
{
"Build Time": "20190318 10:56:37",
"Build Type": "Linux/g++/RelWithDebInfo",
"FISCO-BCOS Version": "2.0.0-rc1",
"Git Branch": "master",
"Git Commit Hash": "2467ddf73b091bc8e0ee611ccee85db7989ad389"
}
3.9. 获取合约二进制代码接口¶
接口描述¶
获取指定块高区块指定合约地址的二进制代码
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/code/{address}/{blockNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 合约地址 | address | String | 是 | ||
3 | 块高 | blockNumber | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/code/0x0000000000000000000000000000000000000000/1
3.10. 获取总交易数¶
接口描述¶
获取总交易数量
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transaction-total
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/transaction-total
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 总交易数 | txSum | int | 是 | ||
2 | 块高 | blockNumber | int | 是 | ||
3 | blockNumberRaw | String | 是 | |||
4 | txSumRaw | String | 是 |
2)数据格式
{
"txSum": 125,
"blockNumber": 125,
"blockNumberRaw": "0x7d",
"txSumRaw": "0x7d"
}
3.11. 根据块hash和交易index获取交易接口¶
接口描述¶
获取指定区块指定位置的交易信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transByBlockHashAndIndex/{blockHash}/{transactionIndex}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 块hash | blockHash | String | 是 | ||
3 | 交易位置 | transactionIndex | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/transByBlockHashAndIndex/0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade/0
响应参数¶
1)数据格式
{
"hash": "0x7c503f202a5e275d8792dd2419ac48418dbec602038fb2a85c899403471f065d",
"nonce": 1.26575985412899E+75,
"blockHash": "0x0d9ed7b20645d5b8200347a72e7fb15347b83d74c6e1b6c3995cdb7a849f95d9",
"blockNumber": 100,
"transactionIndex": 0,
"from": "0x6f00a620a61fd6b33e6076880fecc49959eaa4ea",
"to": "0x9cb5641d991df690ed905c34f9aaf22370034220",
"value": 0,
"gasPrice": 1,
"gas": 100000000,
"input": "0x4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000000",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"blockNumberRaw": "0x64",
"nonceRaw": "0x2cc650a5cbeb268577ac15c7dd2afee0680901de94f8543e86e906247e7edbf",
"valueRaw": "0x0",
"gasPriceRaw": "0x1",
"gasRaw": "0x5f5e100",
"transactionIndexRaw": "0x0"
}
3.12. 根据块高和交易index获取交易接口¶
接口描述¶
获取指定区块指定位置的交易信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transByBlockNumberAndIndex/{blockNumber}/{transactionIndex}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 块高 | blockNumber | BigInteger | 是 | ||
3 | 交易位置 | transactionIndex | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/transByBlockNumberAndIndex/100/0
响应参数¶
1)数据格式
{
"hash": "0x7c503f202a5e275d8792dd2419ac48418dbec602038fb2a85c899403471f065d",
"nonce": 1.26575985412899E+75,
"blockHash": "0x0d9ed7b20645d5b8200347a72e7fb15347b83d74c6e1b6c3995cdb7a849f95d9",
"blockNumber": 100,
"transactionIndex": 0,
"from": "0x6f00a620a61fd6b33e6076880fecc49959eaa4ea",
"to": "0x9cb5641d991df690ed905c34f9aaf22370034220",
"value": 0,
"gasPrice": 1,
"gas": 100000000,
"input": "0x4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000000",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"blockNumberRaw": "0x64",
"nonceRaw": "0x2cc650a5cbeb268577ac15c7dd2afee0680901de94f8543e86e906247e7edbf",
"valueRaw": "0x0",
"gasPriceRaw": "0x1",
"gasRaw": "0x5f5e100",
"transactionIndexRaw": "0x0"
}
3.13. 获取群组内的共识状态信息接口¶
接口描述¶
返回指定群组内的共识状态信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/consensusStatus
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/consensusStatus
响应参数¶
1)数据格式
[
{
"accountType": 1,
"allowFutureBlocks": true,
"cfgErr": false,
"connectedNodes": 3,
"consensusedBlockNumber": 126,
"currentView": 499824,
"groupId": 1,
"highestblockHash": "0x563d4ec57b597d5d81f0c1b0045c04e57ffebe3a02ff3fef402be56742dc8fd1",
"highestblockNumber": 125,
"leaderFailed": false,
"max_faulty_leader": 1,
"node index": 2,
"nodeId": "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"nodeNum": 4,
"omitEmptyBlock": true,
"protocolId": 264,
"sealer.0": "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"sealer.1": "adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
"sealer.2": "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"sealer.3": "dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75",
"toView": 499824
},
[
{
"nodeId": "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"view": 499823
},
{
"nodeId": "adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
"view": 499820
},
{
"nodeId": "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"view": 499824
},
{
"nodeId": "dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75",
"view": 499822
}
]
]
3.14. 获取节点状态列表接口¶
接口描述¶
返回节点的块高、pbftview及状态。(查看nodeHeartBeat)
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/getNodeStatusList
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/getNodeStatusList
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 节点Id | nodeId | String | 是 | ||
2 | 节点块高 | blockNumber | bigInteger | 是 | ||
3 | 节点pbftView | pbftView | bigInteger | 是 | ||
4 | 节点状态 | status | int | 是 | 1正常,2异常 | |
5 | 上次状态修改时间 | latestStatusUpdateTime | String | 是 | 跟上次状态变更时间间隔至少大于三秒才会重新检测节点状态 |
2)数据格式
[
{
"nodeId": "2917803543bcb58ad91cdf67e7b576a5b0440b4f76e6f5440edb8b09dadee297174d25133e841a17e4f89aa59bbaf4c80896af9d6a978aae04b3d0b9cd9d5b84",
"blockNumber": 3,
"pbftView": 146093,
"status": 1,
"latestStatusUpdateTime": "2019-07-25 10:07:07"
},
{
"nodeId": "8722cc018a79bc48b7408649fac4a45bd336a88959570ebba15eefb48fdc23b8a96f328d46852f3d12c4dde7346c573585386fadb5568ce1820144c106af1f72",
"blockNumber": 3,
"pbftView": 146095,
"status": 1,
"latestStatusUpdateTime": "2019-07-25 10:07:07"
}
]
3.15. 获取群组列表接口¶
接口描述¶
返回群组列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/groupList
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/groupList
3.16. 获取观察及共识节点列表¶
接口描述¶
返回指定群组内的共识节点和观察节点列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/groupPeers
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/groupPeers
响应参数¶
1)数据格式
[
"d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
"552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
]
3.17. 获取群组内观察节点列表¶
接口描述¶
返回指定群组内的观察节点列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/observerList
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/observerList
响应参数¶
1)数据格式
[ "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7a165010"
]
3.18. 获取已连接的P2P节点信息¶
接口描述¶
返回指定群组内已连接的P2P节点信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/peers
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/peers
响应参数¶
1)数据格式
[
{
"ipandPort": "127.0.0.1:30301",
"IPAndPort": "127.0.0.1:30301",
"NodeID": "adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
"Topic": []
},
{
"ipandPort": "127.0.0.1:57678",
"IPAndPort": "127.0.0.1:57678",
"NodeID": "e28f3d7f5b82e21918a15639eac342dcf678ebb0efe7c65c76514b0ba6b28ace8e47b4a25c9b3f9763b79db847e250a19f827b132f230298980f3ca9779c2564",
"Topic": []
},
{
"ipandPort": "127.0.0.1:57608",
"IPAndPort": "127.0.0.1:57608",
"NodeID": "dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75",
"Topic": []
},
{
"ipandPort": "127.0.0.1:57616",
"IPAndPort": "127.0.0.1:57616",
"NodeID": "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"Topic": []
},
{
"ipandPort": "127.0.0.1:57670",
"IPAndPort": "127.0.0.1:57670",
"NodeID": "56edfaf60bcb09b9814ad31dcd959eb388f0314445db3deb92cedde97c0ecec210f713591a15f3a7168ba023290cfbe78656b57c37157e6ec74a85182630bd61",
"Topic": []
}
]
3.19. 获取群组内正在处理的交易数¶
接口描述¶
获取群组内正在处理的交易数
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/pending-transactions-count
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/pending-transactions-count
3.20. 获取共识节点接口¶
接口描述¶
返回群组内共识节点列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/sealerList
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/sealerList
响应参数¶
1)数据格式
[
"d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
"552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
]
3.21. 区块/交易¶
接口描述¶
如果输入块高就返回区块信息,如果输入交易hash就返回交易信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/search?input={inputValue}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 查询参数 | inputValue | int/String | 是 | 如果输入块高就返回区块信息,如果输入交易hash就返回交易信息 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/search?input=1
响应参数¶
1)数据格式
{
"number": 1,
"hash": "0x3875dbec6e0ad0790dc0a0e8535b7c286ef7cee4149e5b1494f5c65631a9e321",
"parentHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"nonce": 0,
"sha3Uncles": null,
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"transactionsRoot": "0xa3db8478e08931f8967023a60d260b182d828aad959433e0b77f097d7650b742",
"stateRoot": "0xf32d3e504fc8813c139d1f6f61ae1c8e355502e10b9ea24e5ad5d3ada01ea400",
"receiptsRoot": null,
"author": null,
"sealer": "0x0",
"mixHash": null,
"difficulty": 0,
"totalDifficulty": 0,
"extraData": [],
"size": 0,
"gasLimit": 0,
"gasUsed": 0,
"timestamp": 1557304350431,
"transactions": [
{
"hash": "0x4145b921309fcaa92b05b782e0181d671b8e68fc6d61d939358ed558fa3489c9",
"nonce": 1.47418536037145E+75,
"blockHash": "0x3875dbec6e0ad0790dc0a0e8535b7c286ef7cee4149e5b1494f5c65631a9e321",
"blockNumber": 1,
"transactionIndex": 0,
"from": "0x33a41878e78fb26735bf425f9328990e3a1a89df",
"to": null,
"value": 0,
"gasPrice": 1,
"gas": 100000000,
"input": "0x6080604052348015600f57600080fd5b5060868061001e6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806335b09a6e146044575b600080fd5b348015604f57600080fd5b5060566058565b005b5600a165627a7a723058204aacdb57d6f2ae0f7f6c89c28236bba0205631183fd99785de220481566e683f0029",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"nonceRaw": "0x3425bfe0f36e343686ccbe34a4fe8b05e0e0257ea7ee87417a6d898f0eb43ec",
"transactionIndexRaw": "0x0",
"blockNumberRaw": "0x1",
"valueRaw": "0x0",
"gasPriceRaw": "0x1",
"gasRaw": "0x5f5e100"
}
],
"uncles": null,
"sealFields": null,
"nonceRaw": null,
"numberRaw": "0x1",
"difficultyRaw": null,
"totalDifficultyRaw": null,
"sizeRaw": null,
"gasLimitRaw": "0x0",
"gasUsedRaw": "0x0",
"timestampRaw": "0x16a969296df"
}
3.22. 获取群组内同步状态信息¶
接口描述¶
获取群组内同步状态信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/syncStatus
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/syncStatus
响应参数¶
1)数据格式
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"isSyncing": false,
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"peers": [
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b"
},
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb"
},
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
}
],
"protocolId": 265,
"txPoolSize": "0"
}
3.23. 刷新前置¶
接口描述¶
刷新前置的群组列表,功能与groupList
类似
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/refresh
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/refresh
响应参数¶
1)数据格式
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"isSyncing": false,
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"peers": [
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b"
},
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb"
},
{
"blockNumber": 126,
"genesisHash": "0xed3350d191d23cbc609c98e920baa583403b9a02fa934df868e7f425cd72f5c3",
"latestHash": "0x49ca6eb004f372c71ed900ec6992582cd107e4f3ea36aaa5a0a78829ebef1f14",
"nodeId": "dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
}
],
"protocolId": 265,
"txPoolSize": "0"
}
3.24. 动态生成群组¶
接口描述¶
在节点上动态生成新群组的配置文件与创世块文件
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/generateGroup
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | 此处groupId可填写任意已有群组 | |
1 | 生成群组的编号 | generateGroupId | int | 是 | 待生成新群组的id | |
1 | 共识节点列表 | nodeList | List |
是 | 新群组的共识节点列表,可通过getNodeIdList获取 | |
1 | 群组时间戳 | timestamp | BigInteger | 是 | 新群组的创世块时间戳 |
2)数据格式
{
"generateGroupId": 5,
"nodeList": [
"dd7a2964007d583b719412d86dab9dcf773c61bccab18cb646cd480973de0827cc94fa84f33982285701c8b7a7f465a69e980126a77e8353981049831b550f5c",
"59db64100da70db9c2911f2925bcd0c2f9a1b84f4f8bfef0f6a7edf6d511b2a79203a486c268fb97bc19636f91f71ae9dca076973a4bd551b4a8cdf6d7e7710c"
],
"timestamp": 1589286309000
}
示例:
curl -X POST "http://localhost:5002/WeBASE-Front/{groupId}/web3/generateGroup" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"generateGroupId\": 8, \"nodeList\": [ \"dd7a2964007d583b719412d86dab9dcf773c61bccab18cb646cd480973de0827cc94fa84f33982285701c8b7a7f465a69e980126a77e8353981049831b550f5c\" ], \"timestamp\":1589286309000}"
响应参数¶
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": 201128,
"errorMessage": "group peers not connected"
}
3.25. 操作动态群组的状态¶
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/operateGroup/{type}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组id | groupId | int | 是 | 操作的群组编号 | |
2 | 操作类型 | type | String | 是 | start, stop, remove, recover, getStatus |
2)数据格式
http://localhost:5002/WeBASE-Front/5/web3/operateGroup/start
响应参数¶
1)数据格式
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": 201123,
"errorMessage": "group already running"
}
3.26. 获取当前节点的多个群组状态¶
接口描述¶
传入多个群组编号,对单个节点查询多个群组的状态
包含五种群组状态:该节点不存在该群组”INEXISTENT”、正在停止群组”STOPPING”、群组运行中”RUNNING”、群组已停止”STOPPED”、群组已删除”DELETED”
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/queryGroupStatus
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组id | groupId | int | 是 | 该编号与所查询群组编号无关 | |
2 | 群组id列表 | groupIdList | List |
是 | 传入多个群组id |
2)数据格式
{
"groupIdList": [
1,2,3,4,5
]
}
示例:
curl -X POST "http://localhost:5002/WeBASE-Front/{groupId}/web3/queryGroupStatus" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"groupIdList\": [ 1,2,3,4,5 ]}"
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组与状态Map | - | Map | 是 | ||
1.1 | 群组id | String | 是 | 群组id | ||
1.2 | 群组状态 | String | 是 | 包含五种状态:"INEXISTENT"、"STOPPING"、"RUNNING"、"STOPPED"、"DELETED" |
a、成功:
{
"code": 0,
"message": "success",
"data": {
"1": "RUNNING",
"2": "RUNNING",
"3": "INEXISTENT",
"4": "INEXISTENT",
"5": "INEXISTENT"
}
}
4. 性能检测接口¶
4.1. 获取机器配置信息¶
接口描述¶
获取机器配置信息
接口URL¶
http://localhost:5002/WeBASE-Front/performance/config
调用方法¶
HTTP GET
响应参数¶
1)参数表
{
"memoryTotalSize": "8010916",
"cpuAmount": "4",
"memoryUsedSize": "7818176",
"cpuSize": "2599",
"ip": "127.0.0.1",
"diskUsedSize": "313811828",
"diskTotalSize": "515928320"
}
4.2. 获取机器历史性能信息¶
接口描述¶
获取机器历史性能信息
接口URL¶
http://localhost:5002/WeBASE-Front/performance
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 开始日期 | beginDate | LocalDateTime | |||
2 | 结束日期 | endDate | LocalDateTime | |||
3 | 对比开始日期 | contrastBeginDate | LocalDateTime | |||
4 | 对比结束日期 | contrastEndDate | LocalDateTime | |||
5 | 间隔 | gap | int |
响应参数¶
1)参数表
{
[{
"metricType": "cpu",
"data": {
"lineDataList": {
"timestampList": [],
"valueList": []
},
"contrastDataList": {
"timestampList": [],
"valueList": []
}
}
}, {
"metricType": "memory",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": []
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}, {
"metricType": "disk",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": []
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}, {
"metricType": "txbps",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": []
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}, {
"metricType": "rxbps",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": []
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}]
}
}
4.3. 监测机器性能的启停状态¶
接口描述¶
获取机器历史性能信息的开启或关闭状态
接口URL¶
http://localhost:5002/WeBASE-Front/performance/toggle
调用方法¶
HTTP GET
4.4. 管理监测机器性能的状态¶
接口描述¶
管理监测机器历史性能信息的状态,开启或关闭;默认状态为开启,可通过修改配置文件中constant的monitorEnable值改变监测默认开关状态
接口URL¶
http://localhost:5002/WeBASE-Front/performance/toggle
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 开关 | enable | boolean | 是 | 开启为"1", 关闭为"0" |
2)数据格式
{
"enable": 0
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"enable": 0}' http://127.0.0.1:5002/WeBASE-Front/performance/toggle
响应参数¶
a、关闭监测机器性能信息
{
"code": 0,
"message": "Sync Status is OFF",
"data": false
}
b、开启监测机器性能信息
{
"code": 0,
"message": "Sync Status is ON",
"data": true
}
4.5. 获取节点监控信息¶
接口描述¶
获取节点监控信息
接口URL¶
http://localhost:5002/WeBASE-Front/chain
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 开始日期 | beginDate | LocalDateTime | |||
2 | 结束日期 | endDate | LocalDateTime | |||
3 | 对比开始日期 | contrastBeginDate | LocalDateTime | |||
4 | 对比结束日期 | contrastEndDate | LocalDateTime | |||
5 | 间隔 | gap | int | |||
6 | 群组编号 | groupId | int |
2)入参示例
localhost:5002/WeBASE-Front/chain?beginDate=2019-03-13T00:00:00&endDate=2019-03-13T14:34:22&contrastBeginDate=2019-03-13T00:00:00&contrastEndDate=2019-03-13T14:34:22&gap=60&groupId=1
响应参数¶
1)参数表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | data | Array | 否 | 返回信息列表 |
1.1 | Object | 返回信息实体 | ||
1.1.1 | metricType | String | 否 | 测量类型:blockHeight(块高)、pbftView(pbft视图)、pendingCount(待处理交易数量) |
1.1.2 | data | Object | 否 | |
1.1.2.1 | lineDataList | Object | 否 | 指定时间的数据 |
1.1.2.1.1 | timestampList | List |
否 | 时间戳列表 |
1.1.2.1.2 | valueList | List |
否 | 值列表 |
1.1.2.2 | contrastDataList | Object | 否 | 比对时间的数据 |
1.1.2.2.1 | timestampList | List |
否 | 时间戳列表 |
1.1.2.2.2 | valueList | List |
否 | 值列表 |
2)出参示例
[
{
"metricType": "blockHeight",
"data": {
"lineDataList": {
"timestampList": [
1552406401042,
1552406701001
],
"valueList": [
747309,
747309
]
},
"contrastDataList": {
"timestampList": [
1552320005000,
1552320301001
],
"valueList": [
null,
747309
]
}
}
},
{
"metricType": "pbftView",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [
118457,
157604
]
},
"contrastDataList": {
"timestampList": null,
"valueList": [
null,
33298
]
}
}
}
]
4.6. 检查节点进程是否存活¶
接口描述¶
检查节点进程是否存活
接口URL¶
http://localhost:5002/WeBASE-Front/chain/checkNodeProcess
调用方法¶
HTTP GET
4.7. 获取节点所在群组物理大小信息¶
接口描述¶
获取节点所在群组物理大小信息
接口URL¶
http://localhost:5002/WeBASE-Front/chain/getGroupSizeInfos
调用方法¶
HTTP GET
响应参数¶
1)参数表
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | data | Array | 否 | 返回信息列表 |
1.1 | Object | 返回信息实体 | ||
1.1.1 | groupId | Int | 否 | 群组id |
1.1.2 | groupName | String | 否 | 群组名 |
1.1.3 | path | String | 否 | 文件路径 |
1.1.4 | size | Long | 否 | 大小(单位:KB) |
2)出参示例
- 成功:
[
{
"groupId": 31231,
"groupName": "group31231",
"path": "/data/app/nodes/127.0.0.1/node0/data/group31231",
"size": 27085
},
{
"groupId": 2,
"groupName": "group2",
"path": "/data/app/nodes/127.0.0.1/node0/data/group2",
"size": 23542
},
{
"groupId": 1,
"groupName": "group1",
"path": "/data/app/nodes/127.0.0.1/node0/data/group1",
"size": 25077
},
{
"groupId": 111,
"groupName": "group111",
"path": "/data/app/nodes/127.0.0.1/node0/data/group111",
"size": 21552
}
]
5. 交易接口¶
5.1. 交易处理接口(结合WeBASE-Sign)¶
接口描述¶
通过此接口对合约进行调用,前置根据调用的合约方法是否是“constant”方法区分返回信息,“constant”方法为查询,返回要查询的信息。非“constant”方法为发送数据上链,返回块hash、块高、交易hash等信息。
当合约方法为非“constant”方法,要发送数据上链时,此接口需结合WeBASE-Sign使用。通过调用WeBASE-Sign服务的签名接口让相关用户对数据进行签名,拿回签名数据再发送上链。需要调用此接口时,工程配置文件application.yml中的配置”keyServer”需配置WeBASE-Sign服务的ip和端口,并保证WeBASE-Sign服务正常和存在相关用户。
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过本地私钥(测试用户)交易处理接口(非WeBASE-Sign签名交易),可查看其他接口-交易处理接口(本地签名)
接口URL¶
http://localhost:5002/WeBASE-Front/trans/handleWithSign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | WeBASE-Sign用户编号(查询方法可不传) |
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | ||
4 | 方法名 | funcName | String | 是 | ||
5 | 合约编译后生成的abi文件内容 | contractAbi | List | 是 | 合约中单个函数的ABI,若不存在同名函数可以传入整个合约ABI,格式:JSONArray | |
6 | 方法参数 | funcParam | List | 否 | JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] | |
7 | 群组ID | groupId | int | 是 | 默认为1 | |
8 | 是否使用cns调用 | useCns | bool | 是 | ||
9 | cns名称 | cnsName | String | 否 | CNS名称,useCns为true时不能为空 | |
10 | cns版本 | version | String | 否 | CNS版本,useCns为true时不能为空 |
2)数据格式
{
"groupId" :1,
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3",
"contractAbi":[{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStorageCell","outputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"setVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"storageHash","type":"string"},{"name":"storageInfo","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}],
"contractAddress":"0x14d5af9419bb5f89496678e3e74ce47583f8c166",
"funcName":"set",
"funcParam":["test"],
"useCns":false
}
示例:
curl -X POST "http://localhost:5002/WeBASE-Front/trans/handleWithSign" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"contractAbi\": [ { \"outputs\": [], \"constant\": false, \"payable\": false, \"inputs\": [ { \"name\": \"n\", \"type\": \"string\" } ], \"name\": \"set\", \"stateMutability\": \"nonpayable\", \"type\": \"function\" }, { \"outputs\": [ { \"name\": \"\", \"type\": \"string\" } ], \"constant\": true, \"payable\": false, \"inputs\": [], \"name\": \"get\", \"stateMutability\": \"view\", \"type\": \"function\" }, { \"payable\": false, \"inputs\": [], \"stateMutability\": \"nonpayable\", \"type\": \"constructor\" }, { \"inputs\": [ { \"indexed\": false, \"name\": \"name\", \"type\": \"string\" } ], \"name\": \"nameEvent\", \"anonymous\": false, \"type\": \"event\" } ], \"contractAddress\": \"0x7571ff73f1a37ca07f678aebc4d8213e7ef5c266\", \"funcName\": \"set\", \"funcParam\": [ \"test\" ], \"groupId\": 1, \"signUserId\": "458ecc77a08c486087a3dcbc7ab5a9c3"}"
响应参数¶
a、正确查询交易返回值信息
{"Hi,Welcome!"}
b、正确发送数据上链返回值信息(交易收据)
{
"transactionHash": "0x0b426a58af8ba449742b937f1e9b2b225335638707b93d6b296dfd8107edddd7",
"transactionIndex": 0,
"blockHash": "0xc8eb7a983ecb8c2a0a64450a059d2cf3de8c8d786211dcec48ab9c47219ee8f7",
"blockNumber": 36985,
"gasUsed": 35400,
"contractAddress": "0x0000000000000000000000000000000000000000",
"root": null,
"status": "0x0",
"from": "0xb173ca9a2e07efe6007aee751a013849d53e7c29",
"to": "0x7571ff73f1a37ca07f678aebc4d8213e7ef5c266",
"input": "0x4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000",
"output": "0x",
"logs": [
{
"removed": false,
"logIndex": null,
"transactionIndex": null,
"transactionHash": null,
"blockHash": null,
"blockNumber": null,
"address": "0x7571ff73f1a37ca07f678aebc4d8213e7ef5c266",
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000",
"type": null,
"topics": [
"0x9645e7fb5eec05c0f156d4901a10663561199c6dd0401214a0b833fe0022d899"
],
"logIndexRaw": null,
"blockNumberRaw": null,
"transactionIndexRaw": null
}
],
"logsBloom": "0x00000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000020000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000",
"gasUsedRaw": "0x8a48",
"statusOK": true,
"blockNumberRaw": "0x9079",
"transactionIndexRaw": "0x0"
}
5.2. 交易处理接口(本地签名)¶
接口描述¶
此接口为WeBASE-Front使用本地私钥(页面中的测试用户)进行签名
通过合约信息进行调用,前置根据调用的合约方法是否是“constant”方法区分返回信息,“constant”方法为查询,返回要查询的信息。非“constant”方法为发送数据上链,返回块hash、块高、交易hash等信息。
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过WeBASE-Sign交易处理的接口(非本地私钥签名交易),可查看合约接口-交易处理接口(结合WeBASE-Sign)
接口URL¶
http://localhost:5002/WeBASE-Front/trans/handle
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户地址 | user | String | 是 | 用户地址,可通过/privateKey 接口创建 |
|
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | ||
4 | 方法名 | funcName | String | 是 | ||
5 | 合约编译后生成的abi文件内容 | contractAbi | List | 是 | 合约中单个函数的ABI,若不存在同名函数可以传入整个合约ABI,格式:JSONArray | |
6 | 方法参数 | funcParam | List | 否 | JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]],根据所调用的合约方法判断是否必填 | |
7 | 群组ID | groupId | int | 是 | 默认为1 | |
8 | 合约路径 | contractPath | int | 否 | ||
9 | 是否使用cns调用 | useCns | bool | 是 | ||
10 | cns名称 | cnsName | String | 否 | CNS名称,useCns为true时不能为空 | |
11 | cns版本 | version | String | 否 | CNS版本,useCns为true时不能为空 |
2)数据格式
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"contractName":
"HelloWorld", "contractAbi": [{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}], funcName": "set", "funcParam": ["Hi,Welcome!"], "user": "0x2db346f9d24324a4b0eac7fb7f3379a2422704db", "contractAddress":"dasdfav23rf213vbcdvadf3bcdf2fc23rqde","groupId": 1,"useCns": false}' http://10.0.0.1:5002/WeBASE-Front/trans/handle
传入合约abi:
{
"user":"0x2db346f9d24324a4b0eac7fb7f3379a2422704db",
"contractName":"HelloWorld",
"contractAddress":"dasdfav23rf213vbcdvadf3bcdf2fc23rqde",
"funcName":"set",
"contractAbi":[{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStorageCell","outputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"setVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"storageHash","type":"string"},{"name":"storageInfo","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}],
"funcParam":["Hi,Welcome!"],
"groupId" :"1",
"useCns": false
}
响应参数¶
a、正确查询交易返回值信息
{"Hi,Welcome!"}
b、正确发送数据上链返回值信息(交易收据)
{
"code": 0,
"message": "success",
"data": {
"blockHash":
"0x1d8d8275aa116d65893291c140849be272dac1d4ca0a0a722f44404b2f2356c3",
"gasUsed": 32798,
"transactionIndexRaw": "0",
"blockNumberRaw": "33",
"blockNumber": 33,
"contractAddress": "0x0000000000000000000000000000000000000000",
"cumulativeGasUsed": 32798,
"transactionIndex": 0,
"gasUsedRaw": "0x801e",
"logs": [],
"cumulativeGasUsedRaw": "0x801e",
"transactionHash":"0x0653a8e959771955330461456dd094a96d9071bfa31e6f43b68b30f10a85689c"
}
}
5.3. 已签名交易发送¶
接口描述¶
发送已签名的交易上链,返回交易收据;
接口URL¶
http://localhost:5002/WeBASE-Front/trans/signed-transaction
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 已签名字符串 | signedStr | String | 是 | ||
2 | 是否同步发送 | sync | bool | 是 | ||
2 | 群组ID | groupId | int | 否 |
2)数据格式
{
"signedStr": "0xddd",
"sync": 1,
"groupId":1
}
响应参数¶
1)数据格式
{
"transactionHash": "0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b",
"transactionIndex": 0,
"blockHash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"blockNumber": 100,
"cumulativeGasUsed": 121038,
"gasUsed": 121038,
"contractAddress": "0x0000000000000000000000000000000000000000",
"root": null,
"from": null,
"to": null,
"logs": [
{
"removed": false,
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0xb2c733b742045e61c0fd6e7e2bafece04d56262a4887de9f78dad2c5dd2f944b",
"blockHash": "0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade",
"blockNumber": 100,
"address": "0x986278eb8e8b4ef98bdfc055c02d65865fc87ad2",
"data": "0x00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001caf3fbec3675eabb85c0b25e2992d6f0a5e1546dad85c20733fdb27cfa4ca782a5fdfb621b416f3494c7d8ca436c12309884550d402ea79f03ef8ddfdd494f7a40000000000000000000000000000000000000000000000000000000000000040666164363863656230616530316530643731616635356331316561643031613532656638363435343866306134643133633836363164393664326461366239380000000000000000000000000000000000000000000000000000000000000002363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023630000000000000000000000000000000000000000000000000000000000000",
"type": "mined",
"topics": [
"0xbf474e795141390215f4f179557402a28c562b860f7b74dce4a3c0e0604cd97e"
],
"logIndexRaw": "0",
"blockNumberRaw": "100",
"transactionIndexRaw": "0"
}
],
"logsBloom": null,
"gasUsedRaw": "0x1d8ce",
"blockNumberRaw": "100",
"transactionIndexRaw": "0",
"cumulativeGasUsedRaw": "0x1d8ce",
"message": null,
"txProof": null,
"receiptProof": null
}
5.4. 已编码查询交易发送¶
接口描述¶
发送已编码的查询交易,返回合约的返回值;
接口URL¶
http://localhost:5002/WeBASE-Front/trans/query-transaction
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 已编码字符串 | encodeStr | String | 是 | ||
2 | 合约地址 | contractAddress | String | 是 | ||
3 | 群组ID | groupId | int | 否 | ||
4 | 合约名 | funcName | String | 是 | ||
5 | 合约abi | contractAbi | String | 是 | ||
6 | 用户地址 | userAddress | String | 否 |
2)数据格式
{
"encodeStr": "0xddd",
"contractAddress": "0x2b5ad5c4795c026514f8317c7a215e218dccd6cf",
"groupId":1,
"funcName": "get",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"TransEvent\",\"type\":\"event\"}]"
}
5.5. Hash计算¶
接口描述¶
计算HASH和签名值
接口URL¶
http://localhost:5002/WeBASE-Front/trans/signMessageHash
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户地址 | user | String | 是 | 用户地址,可通过/privateKey 接口创建 |
|
2 | Hash值 | hash | String | 是 |
2)数据格式
{
"hash": "0xa271b78b8e869d693f7cdfee7162d7bfb11ae7531fd50f73d86f73a05c84dd7c",
"user": "0x883cfa1d40117dd2d270aa8bb0bb33776409be8b"
}
响应参数¶
1)数据格式
{
"v": 0,
"r": "0x2a76a45bcf1113615f796cc01b23c57f81f20ce79500080bb34c7994ed04de06",
"s": "0x4f111eb37720e2618d8906368c825fd3cbe89b2781cb678efafb42399594a580",
"p": "0x4405f9d5d6ccff709b6543bc8ac24cbb649d3267a66db19ab8f85f3b884a8505f086c581490e7e50558879abde9c4d07fc2daab92f81c0eb4b805af3c8895cfc"
}
6. 系统管理接口¶
使用FISCO BCOS v2.5.0 与 WeBASE-Front v1.4.1 (及)以上版本将使用预编译合约中的ChainGovernance接口(从本章节接口6.13开始),详情可参考FISCO BCOS基于角色的权限控制
6.1. 查询权限接口¶
6.1.1 查询权限接口¶
接口描述¶
根据PermissionType权限类型,查询该类权限记录列表。共支持查看六种权限的管理员列表:权限管理权限permission, 用户表管理权限userTable, 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
接口URL¶
http://localhost:5002/WeBASE-Front/permission?groupId={groupId}&permissionType={permissionType}&pageSize={pageSize}&pageNumber={pageNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID,默认为1 | |
2 | 权限类型 | permissionType | String | 是 | 分配权限的类型 | |
3 | 分页大小 | pageSize | int | 否 | 默认为10 | |
4 | 分页页码 | pageNumber | int | 否 | 默认为1 | |
5 | 表名 | tableName | String | 否 | 当permissionType 为userTable 时为必填 |
|
2)数据格式 |
http://localhost:5002/WeBASE-Front/permission?groupId=1&permissionType=cns&pageSize=5&pageNumber=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"address": "0x009fb217b6d7f010f12e7876d31a738389fecd51",
"table_name": "_sys_table_access_",
"enable_num": "84"
}
],
"totalCount": 1
}
6.1.2 查询权限接口(不分页)¶
接口URL¶
http://localhost:5002/WeBASE-Front/permission/full?groupId={groupId}&permissionType={permissionType}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 权限类型 | permissionType | String | 是 | 分配权限的类型 | |
3 | 表名 | tableName | String | 否 | 当permissionType为userTable时不可为空 |
2)数据格式
http://localhost:5002/WeBASE-Front/permission/full?groupId=1&permissionType=cns&pageSize=5&pageNumber=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"address": "0x009fb217b6d7f010f12e7876d31a738389fecd51",
"table_name": "_sys_table_access_",
"enable_num": "84"
}
],
"totalCount": 1
}
6.1.3 获取权限状态列表接口(不分页)¶
接口URL¶
http://localhost:5002/WeBASE-Front/permission/sorted/full?groupId={groupId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID |
2)数据格式
http://localhost:5002/WeBASE-Front/permission/sorted/full?groupId=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"0x2cbca2910b650e5816b4731b097eb8985be39805": {
"deployAndCreate": 1,
"cns": 0,
"sysConfig": 0,
"node": 0
},
"0x79d3632a8bc9b3e823a8e475436d5aa6e0fb88a7": {
"deployAndCreate": 1,
"cns": 1,
"sysConfig": 1,
"node": 1
},
"0x202b4245087dbf797f954d8425459bfee3c790f8": {
"deployAndCreate": 1,
"cns": 1,
"sysConfig": 1,
"node": 1
},
"0x7db73896a6db5e86563af18f206405030bd569f8": {
"deployAndCreate": 0,
"cns": 1,
"sysConfig": 0,
"node": 0
}
},
"totalCount": 4
}
6.2. 增加管理权限接口¶
接口描述¶
由管理员赋予外部账户地址不同类型的权限,包含六种:权限管理权限permission, 用户表管理权限userTable, 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
其中userTable权限还需传入相应的表明tableName
接口URL¶
http://localhost:5002/WeBASE-Front/permission
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 权限类型 | permissionType | String | 是 | 分配权限的类型(六种:permission, userTable, deployAndCreate, node, cns, sysConfig) | |
3 | 管理员地址 | fromAddress | String | 是 | ||
4 | 被授予权限地址 | address | String | 是 | ||
5 | 表名 | tableName | String | 否 | 当permissionType为userTable时不可为空 |
2)数据格式
{
"groupId": 1,
"permissionType": "permission",
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"groupId": 1, "permissionType": "permission", "fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1", "address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"}' http://10.0.0.1:5002/WeBASE-Front/permission
响应参数¶
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": -51000,
"message": "table name and address already exist"
}
6.3. 去除管理权限接口¶
接口描述¶
由管理员去除外部账户地址不同类型的权限,包含六种:权限管理权限permission, 用户表管理权限userTable, 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
其中userTable权限还需传入相应的表明tableName
接口URL¶
http://localhost:5002/WeBASE-Front/permission
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 权限类型 | permissionType | String | 是 | 分配权限的类型(六种:permission, userTable, deployAndCreate, node, cns, sysConfig) | |
3 | 管理员地址 | fromAddress | String | 是 | ||
4 | 被授予权限地址 | address | String | 是 | ||
5 | 表名 | tableName | String | 否 | 当permissionType为userTable时不可为空 |
2)数据格式
{
"groupId": 1,
"permissionType": "permission",
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
示例:
curl -l -H "Content-type: application/json" -X DELETE -d '{"groupId": 1, "permissionType": "permission", "fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1", "address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"}' http://10.0.0.1:5002/WeBASE-Front/permission
响应参数¶
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": -51001,
"message": "table name and address does not exist"
}
6.4. 管理用户权限状态接口¶
接口URL¶
http://localhost:5002/WeBASE-Front/permission/sorted
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 管理员地址 | fromAddress | String | 是 | ||
3 | 被授予权限地址 | address | String | 是 | ||
4 | 用户权限状态 | permissionState | Object | 是 | 使用{"permissionType": 1}格式,参照下文数据格式;1代表赋予,0代表去除;支持cns、deployAndCreate、sysConfig、node四种权限 |
2)数据格式
{
"groupId": "2",
"fromAddress": "0x09fb217b6d7f010f12e7876d31a738389fecd517",
"address": "0x09fb217b6d7f010f12e7876d31a738389fecd517",
"permissionState": {
"deployAndCreate": 1,
"node": 1,
"sysConfig": 1,
"cns": 1
}
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"groupId": "2","fromAddress": "0x09fb217b6d7f010f12e7876d31a738389fecd517","address":"0x09fb217b6d7f010f12e7876d31a738389fecd517","permissionState": {"deployAndCreate": 1,"node": 1,"sysConfig": 1,"cns": 1}}' http://localhost:5002/WeBASE-Front/permission/sorted
响应参数¶
a、成功:
{
"code": 0,
"message": "success",
"data": {
"node": 1,
"sysConfig": 1,
"cns": 1,
"deployAndCreate": 1
}
}
b、失败:
{
"code": 201202,
"message": "permission denied, please check chain administrator permission"
}
6.5. 查询CNS接口¶
接口描述¶
根据群组id和合约名(或合约名加版本)获取CNS的list列表。
接口URL¶
http://localhost:5002/WeBASE-Front/precompiled/cns/list?groupId={groupId}&contractNameAndVersion={contractNameAndVersion}&pageSize={pageSize}&pageNumber={pageNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 合约名与版本 | contractNameAndVersion | String | 是 | 版本非必填,合约名与版本中间用英文冒号":"连接,版本号最长为40,由字母数字与"."组成。无版本参数时返回全部版本 | |
3 | 分页大小 | pageSize | int | 是 | 默认为10 | |
4 | 分页页码 | pageNumber | int | 是 | 默认为1 |
2)数据格式
http://localhost:5002/WeBASE-Front/precompiled/cns/list?groupId=1&contractNameAndVersion=HelloWorld&pageSize=5&pageNumber=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"name": "HelloWorld",
"version": "2d36b8ed7ed12da01ed51cc0c85c3002085b17b6",
"address": "0x2d36b8ed7ed12da01ed51cc0c85c3002085b17b6",
"abi": "[{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"nameEvent\",\"payable\":false,\"type\":\"event\"}]"
}
],
"totalCount": 1
}
6.6. 查询系统配置接口¶
接口描述¶
根据群组id获取系统配置SystemConfig的list列表,目前只支持tx_count_limit, tx_gas_limit两个参数。
接口URL¶
http://localhost:5002/WeBASE-Front/sys/config/list?groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 分页大小 | pageSize | int | 是 | 默认为10 | |
3 | 分页页码 | pageNumber | int | 是 | 默认为1 |
2)数据格式
http://localhost:5002/WeBASE-Front/sys/config/list?groupId=1&pageSize=5&pageNumber=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 6,
"groupId": 1,
"fromAddress": "0x",
"configKey": "tx_gas_limit",
"configValue": "300000000"
},
{
"id": 5,
"groupId": 1,
"fromAddress": "0xd0b56b4ce0e8ce5e064f896d9ad1c16b2603f285",
"configKey": "tx_count_limit",
"configValue": "10002"
}
],
"totalCount": 2
}
6.7. 设置系统配置接口¶
接口描述¶
系统配置管理员设置系统配置,目前只支持tx_count_limit, tx_gas_limit两个参数。
接口URL¶
http://localhost:5002/WeBASE-Front/sys/config
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 管理员地址 | fromAddress | String | 是 | ||
3 | 配置的键 | configKey | String | 是 | 目前类型两种(tx_count_limit, tx_gas_limit,用户可自定义key如tx_gas_price | |
4 | 配置的值 | configValue | String | 是 | tx_gas_limit范围为 [100000, 2147483647] |
2)数据格式
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"configKey": "tx_count_limit",
"configValue": "1001"
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"groupId": 1, "fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1", "configKey": "tx_count_limit", "configValue": "1001"}' http://10.0.0.1:5002/WeBASE-Front/sys/config
响应参数¶
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": -50000,
"message": "permission denied"
}
6.8. 查询节点接口(节点管理)¶
接口URL¶
http://localhost:5002/WeBASE-Front/precompiled/consensus/list?groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 分页大小 | pageSize | int | 是 | 默认为10 | |
3 | 分页页码 | pageNumber | int | 是 | 默认为1 |
2)数据格式
http://localhost:5002/WeBASE-Front/precompiled/consensus/list?groupId=1&pageSize=5&pageNumber=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"nodeId": "13e0f2b94cbce924cc3737385a38587939e809fb786c4fc34a6ba3ea97693bccfa173b352ac41f1dbb97e9e4910ccbec1df38ad4020cef3b2044e833188adad9",
"nodeType": "sealer"
},
{
"nodeId": "bce4b2269c25c2cdba30155396bfe90af08c3c08cff205213477683117e4243ebe26588479519e636a5d5d93545cab778435cacacc41993f28f58f60fa5ceb72",
"nodeType": "sealer"
},
{
"nodeId": "e815cc5637cb8c3274c83215c680822e4a0110d0a8315fcf03e43e8e3944edd758c8b173c4e0076f599aa1f853fa207d47cc95d201ae8d0206b71ad5aa8c3f59",
"nodeType": "sealer"
}
],
"totalCount": 3
}
6.9. 设置节点共识状态接口(节点管理)¶
接口描述¶
节点管理相关接口,可用于节点三种共识状态的切换。分别是共识节点sealer, 观察节点observer, 游离节点remove
接口URL¶
http://localhost:5002/WeBASE-Front/precompiled/consensus
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 管理员地址 | fromAddress | String | 是 | ||
3 | 节点类型 | nodeType | String | 是 | 节点类型:observer,sealer,remove | |
4 | 节点ID | nodeId | String | 是 | 节点id,从节点根目录/conf/node.id获取 |
2)数据格式
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"nodeType": "remove",
"nodeId": "224e6ee23e8a02d371298b9aec828f77cc2711da3a981684896715a3711885a3177b3cf7906bf9d1b84e597fad1e0049511139332c04edfe3daddba5ed60cffa"
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"groupId": 1, "fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1", "configKey": "tx_count_limit", "configValue": "1001"}' http://10.0.0.1:5002/WeBASE-Front/sys/config
响应参数¶
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": -50000,
"message": "permission denied"
}
6.10. CRUD表格操作接口¶
接口描述¶
用于操作用户表的CRUD操作,包含create, desc, insert, update, select, remove。
具体sql要求语法参考Fisco-bcos技术文档的 Precompiled Crud API
接口URL¶
http://localhost:5002/WeBASE-Front/precompiled/crud
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | int | 是 | 节点所属群组ID | |
2 | 管理员地址 | fromAddress | String | 是 | ||
3 | SQL语句 | sql | String | 是 | 包含create, desc, insert, update, select, remove,小写 |
2)数据格式
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"sql": "desc t_demo"
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"groupId": 1, "fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1", "sql": "desc t_demo"}' http://10.0.0.1:5002/WeBASE-Front/precompiled/crud
响应参数¶
a、成功:
{
"code": 0,
"message": "success",
"data": {
"tableName": "t_demo",
"key": "name",
"valueFields": "item_id,item_name",
"optional": "",
"entry": {
"fields": {}
},
"condition": {
"conditions": {}
}
}
}
b、失败:
{
"code": 2012228,
"message": "table not exists",
"data": "Table not exists "
}
6.11. 合约状态管理¶
接口描述¶
冻结、解冻合约和授权用户操作权限,还可以查询合约状态和合约用户权限列表
接口URL¶
http://localhost:5002/WeBASE-Front/precompiled/contractStatusManage
调用方法¶
HTTP POST
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | signUserId | String | 否 | WeBASE-Sign签名用户编号,当handleType 为getStatus 或listManager 时,可不传 |
3 | contractAddress | String | 否 | 已部署的合约地址 |
4 | handleType | String | 否 | 操作类型:freeze-冻结;unfreeze-解冻;grantManager-授权;getStatus-查询合约状态;listManager-查询合约权限列表 |
5 | grantAddress | String | 是 | 授权用户地址,操作类型为grantManager时需传入 |
2)入参示例
{
"contractAddress": "0x1d518bf3fb0edceb18519808edf7ad8adeeed792",
"grantAddress": "",
"groupId": 1,
"handleType": "freeze",
"signUserId": "user1001"
}
6.12. 基于角色的权限管理¶
使用FISCO BCOS v2.5.0 与 WeBASE-Front v1.4.1 (及)以上版本将使用预编译合约中的ChainGovernance接口(本章节接口6.13),详情可参考FISCO BCOS基于角色的权限控制
包含链治理委员管理、链运维管理等功能
6.12.1. 查看链治理委员列表¶
接口描述¶
委员的权限包括治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号。
增加委员需要链治理委员会投票,有效票大于阈值才可以生效,且不重复计票
- 委员默认的投票权重为1,默认投票生效阈值50%,若有两个委员,则需要两个委员都投票增加/撤销的委员权限,
有效票/总票数=2/2=1>0.5
才满足条件。 - 投票有过期时间,根据块高,过期时间为块高超过blockLimit的10倍时过期;过期时间固定不可改。‘
接口URL¶
http://localhost:5002/WeBASE-Front/governance/committee/list
调用方法¶
HTTP GET
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2)入参示例
http://localhost:5002/WeBASE-Front/governance/committee/list?groupId=1
6.12.2. 增加链治理委员¶
接口描述¶
委员的权限包括治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号。
增加委员需要链治理委员会投票,有效票大于阈值才可以生效,且不重复计票
- 委员默认的投票权重为1,默认投票生效阈值50%,若有两个委员,则需要两个委员都投票增加/撤销的委员权限,
有效票/总票数=2/2=1>0.5
才满足条件。 - 投票有过期时间,根据块高,过期时间为块高超过blockLimit的10倍时过期;过期时间固定不可改。‘
接口URL¶
http://localhost:5002/WeBASE-Front/governance/committee
调用方法¶
HTTP POST
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
3 | address | String | 否 | 新的链治理委员地址 |
2)入参示例
{
"groupId": 1,
"signUserId": "user1001",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
6.12.3. 取消链治理委员¶
接口描述¶
委员的权限包括治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号。
增加委员需要链治理委员会投票,有效票大于阈值才可以生效,且不重复计票
- 委员默认的投票权重为1,默认投票生效阈值50%,若有两个委员,则需要两个委员都投票增加/撤销的委员权限,
有效票/总票数=2/2=1>0.5
才满足条件。 - 投票有过期时间,根据块高,过期时间为块高超过blockLimit的10倍时过期;过期时间固定不可改。‘
接口URL¶
http://localhost:5002/WeBASE-Front/governance/committee
调用方法¶
HTTP DELETE
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
3 | address | String | 否 | 待取消的链治理委员地址 |
2)入参示例
{
"groupId": 1,
"signUserId": "user1001",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
6.12.4. 查看链治理委员投票权重¶
接口描述¶
委员默认的投票权重为1
接口URL¶
http://localhost:5002/WeBASE-Front/governance/committee/weight
调用方法¶
HTTP GET
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | address | String | 否 | 链治理委员地址 |
2)入参示例
http://localhost:5002/WeBASE-Front/governance/committee/weight?groupId=1&address=0x009fb217b6d7f010f12e7876d31a738389fecd51
6.12.5. 更新链治理委员投票权重¶
接口描述¶
委员默认的投票权重为1
接口URL¶
http://localhost:5002/WeBASE-Front/governance/committee/weight
调用方法¶
HTTP PUT
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
3 | address | String | 否 | 链治理委员地址 |
4 | weight | Int | 否 | 权重值 |
2)入参示例
{
"groupId": 1,
"signUserId": "user1001",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e",
"weight": 2
}
6.12.6. 查看链投票阈值¶
接口描述¶
阈值默认为50,即票数>50%
接口URL¶
http://localhost:5002/WeBASE-Front/governance/threshold
调用方法¶
HTTP GET
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2)入参示例
http://localhost:5002/WeBASE-Front/governance/threshold?groupId=1
6.12.7. 更新链投票阈值¶
接口描述¶
阈值默认为50,即票数>50%
接口URL¶
http://localhost:5002/WeBASE-Front/governance/threshold
调用方法¶
HTTP PUT
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
3 | address | String | 否 | 新的链治理委员地址 |
4 | threshold | Int | 否 | 群组投票阈值 |
2)入参示例
{
"groupId": 1,
"signUserId": "user1001",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e",
"threshold": 60
}
6.12.8. 查看运维列表¶
接口描述¶
由链治理委员添加运维账号,运维账号可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约。
接口URL¶
http://localhost:5002/WeBASE-Front/governance/operator/list
调用方法¶
HTTP GET
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2)入参示例
http://localhost:5002/WeBASE-Front/governance/operator/list?groupId=1
6.12.9. 增加运维接口¶
接口描述¶
由链治理委员添加运维账号,运维账号可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约。
接口URL¶
http://localhost:5002/WeBASE-Front/governance/operator
调用方法¶
HTTP POST
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
3 | address | String | 否 | 新的运维地址 |
2)入参示例
{
"groupId": 1,
"signUserId": "user1001",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
6.12.10. 取消运维接口¶
接口描述¶
由链治理委员添加/取消运维账号;运维账号可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约。 据块高,过期时间为块高超过blockLimit的10倍时过期;过期时间固定不可改。
接口URL¶
http://localhost:5002/WeBASE-Front/governance/operator
调用方法¶
HTTP DELETE
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
3 | address | String | 否 | 待取消的运维地址 |
2)入参示例
{
"groupId": 1,
"signUserId": "user1001",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
7. 链上事件订阅接口¶
7.1. 获取出块事件的订阅信息列表¶
接口URL¶
http://localhost:5002/WeBASE-Front/event/newBlockEvent/list/{groupId}/{pageNumber}/{pageSize}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | 群组编号 | |
2 | 页码 | pageNumber | int | 否 | 同时缺省则返回全量数据 | |
3 | 页大小 | pageSize | int | 否 | 同时缺省则返回全量数据 |
2)数据格式
http://localhost:5002/WeBASE-Front/event/newBlockEvent/list/{groupId}/{pageNumber}/{pageSize}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": "8aba82b570f22a750170f22bcab90000",
"eventType": 1,
"appId": "app2",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app2",
"routingKey": "app2_block_b63",
"createTime": "2020-03-19 17:42:01"
}
],
"totalCount": 1
}
7.2. 获取出块事件的订阅信息¶
接口URL¶
http://localhost:5002/WeBASE-Front/event/newBlockEvent/{groupId}/{appId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 应用编号 | appId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/event/newBlockEvent/{groupId}/{appId}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": "8aba82b570f22a750170f22bcab90000",
"eventType": 1,
"appId": "app2",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app2",
"routingKey": "app2_block_b63",
"createTime": "2020-03-19 17:42:01"
}
]
}
7.3. 订阅出块事件通知¶
接口描述¶
订阅后将在消息队列中获取出块的事件通知
接口URL¶
http://localhost:5002/WeBASE-Front/event/newBlockEvent
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 应用编号 | appId | String | 是 | 注册事件通知的应用的唯一编号,仅支持数字字母和下划线 | |
2 | 所属群组 | groupId | Integer | 是 | ||
3 | 交换机名字 | exchangeName | String | 是 | 队列所属交换机 | |
4 | 队列名 | queueName | String | 是 | 队列名,以appId作队列名 |
2)数据格式
{
"appId": "app1",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app1"
}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success"
}
失败(如:重复订阅)
{
"code": 201242,
"errorMessage": "This data is already in db."
}
7.4. 取消订阅出块事件通知¶
接口描述¶
取消在消息队列中获取出块的事件通知的订阅
接口URL¶
http://localhost:5002/WeBASE-Front/event/newBlockEvent
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 数据编号 | id | String | 是 | 注册事件通知数据的唯一编号,可通过GET接口获取 | |
2 | 应用编号 | appId | String | 是 | 注册事件通知的应用的唯一编号 | |
3 | 所属群组 | groupId | Integer | 是 | ||
4 | 交换机名字 | exchangeName | String | 是 | 队列所属交换机 | |
5 | 队列名 | queueName | String | 是 | 队列名,以appId作队列名 |
2)数据格式
{
"id":"8aba82b5707a1f5701707a248c340000",
"appId": "app1",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app1"
}
7.5. 获取合约Event事件订阅信息列表¶
接口描述¶
获取所有订阅的合约Event事件配置信息
将返回对应的id值, exchange, queue, routingKey及合约Event配置内容(fromBlock, toBlock, contractAddress..)等信息
接口URL¶
http://localhost:5002/WeBASE-Front/event/contractEvent/list/{groupId}/{pageNumber}/{pageSize}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | 群组编号 | |
2 | 页码 | pageNumber | int | 否 | 同时缺省则返回全量数据 | |
3 | 页大小 | pageSize | int | 否 | 同时缺省则返回全量数据 |
2)数据格式
http://localhost:5002/WeBASE-Front/event/contractEvent/list/{groupId}/{pageNumber}/{pageSize}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": "8aba82b57076ae09017076ae403a0001",
"eventType": 2,
"appId": "app1",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app1",
"routingKey": "app1_event_b3c",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"fromBlock": "latest",
"toBlock": "latest",
"contractAddress": "0x657201d59ec41d1dc278a67916f751f86ca672f7",
"topicList": "SetName(string)"
}
],
"totalCount":1
}
7.6. 获取合约Event事件订阅信息¶
接口描述¶
根据群组编号,应用编号获取该应用订阅的合约Event事件配置信息
将返回对应的id值, exchange, queue, routingKey及合约Event配置内容(fromBlock, toBlock, contractAddress..)等信息
接口URL¶
http://localhost:5002/WeBASE-Front/event/contractEvent/{groupId}/{appId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 是 | ||
2 | 应用编号 | appId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/event/contractEvent/{groupId}/{appId}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": "8aba82b57076ae09017076ae403a0001",
"eventType": 2,
"appId": "app1",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app1",
"routingKey": "app1_event_b3c",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"fromBlock": "latest",
"toBlock": "latest",
"contractAddress": "0x657201d59ec41d1dc278a67916f751f86ca672f7",
"topicList": "SetName(string)",
"createTime": "2020-02-26 16:21:12"
}
]
}
7.7. 订阅合约event事件通知¶
接口描述¶
订阅后将在消息队列中获取相应智能合约的event事件通知
接口URL¶
http://localhost:5002/WeBASE-Front/event/contractEvent
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 应用编号 | appId | String | 是 | 注册事件通知的应用的唯一编号,仅支持数字字母和下划线 | |
2 | 所属群组 | groupId | Integer | 是 | ||
3 | 交换机名字 | exchangeName | String | 是 | 队列所属交换机 | |
4 | 队列名 | queueName | String | 是 | 队列名,以appId作队列名 | |
5 | 合约abi | contractAbi | List | 是 | 合约的ABI,用于合约event解析 | |
6 | event起始区块 | fromBlock | String | 是 | 默认latest ,表示一直监听最新区块,最小值为1 |
|
7 | event末区块 | toBlock | String | 是 | 最小值为1,最大值为当前区块高度,需 要大于等于fromBlock ;填写latest ,表示一直监听最新区块 |
|
8 | 合约地址 | contractAddress | String | 是 | 合约地址 | |
9 | 合约event列表 | topicList | List |
是 | List类型,合约Event事件列表,Event参数之间不带空格 |
2)数据格式
{
"appId": "app2",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app2",
"contractAbi": [{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"}],"name":"SetName","type":"event"}],
"fromBlock": "latest",
"toBlock": "latest",
"contractAddress": "0x657201d59ec41d1dc278a67916f751f86ca672f7",
"topicList": ["SetName(string)","TransferEvent(string,address)"],
"createTime": "2020-02-26 16:21:12"
}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success"
}
失败(如:重复订阅)
{
"code": 201242,
"errorMessage": "This data is already in db."
}
7.8. 取消合约Event事件通知的订阅¶
接口描述¶
取消在消息队列中获取合约Event事件通知的订阅
接口URL¶
http://localhost:5002/WeBASE-Front/event/contractEvent
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 数据编号 | id | String | 是 | 注册事件通知数据的唯一编号,可通过GET接口获取 | |
2 | 应用编号 | appId | String | 是 | 注册事件通知的应用的唯一编号 | |
3 | 所属群组 | groupId | Integer | 是 | ||
4 | 交换机名字 | exchangeName | String | 是 | 队列所属交换机 | |
5 | 队列名 | queueName | String | 是 | 队列名,以appId作队列名 |
2)数据格式
{
"id": "8aba82b57076ae09017076ae403a0001",
"appId": "app2",
"groupId": 1,
"exchangeName": "group001",
"queueName": "app2"
}
7.9. 获取历史区块EventLog¶
接口描述¶
同步获取历史区块中的EventLog
接口URL¶
http://localhost:5002/WeBASE-Front/event/eventLogs/list
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约地址 | contractAddress | String | 是 | 已部署合约 | |
3 | 合约ABI | contractAbi | List | 是 | ||
2 | Topic参数 | topics | EventTopicParam | 是 | EventTopicParam包含{String eventName,IndexedParamType indexed1,IndexedParamType indexed2,IndexedParamType indexed3} ,其中IndexedParamType包含{String type,String value} 。eventName为包含参数类型的event名,如SetEvent(uint256,string) ,IndexedParamType中type为indexed参数的类型,value为eventlog需要过滤的参数值 |
|
2 | 开始区块 | fromBlock | Integer | 是 | 始块高 | |
2 | 末区块 | toBlock | Integer | 是 | 末块高 |
2)数据格式
{
"groupId": "1",
"contractAbi": [],
"contractAddress": "0x19fb54101fef551187d3a79ea1c87de8d0ce754e",
"fromBlock": 1,
"toBlock": 1,
"topics": {
"eventName": "SetName",
"indexed1": {
"type": "bool",
"value": true
},
"indexed2": {
"type": "string",
"value": null
}
}
}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [{
"log": {
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0x67c8d9a1bc62586b9feb0c8b1127bf0030f649771db3e3d0d99cd99209851ed8",
"blockHash": "0x0ca880c70a3f24dc5e6052cca4dbb50d9aa0ec973474e07d82e2f5281c54e582",
"blockNumber": 71,
"address": "0xd5d4fcf2a46831510f095bfb447bc945f99309f7",
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033132330000000000000000000000000000000000000000000000000000000000",
"topics": ["0x4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02"]
}, // `org.fisco.bcos.sdk.model.EventLog`,可参考java sdk
"data": ["123"]
}, {
"log": {
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0x7c27078b372cee951dd102edcbbeab6b3b799212e4337d6bfac7f723e487a1fb",
"blockHash": "0x47f8456a656f226d5a4a7206790ae864ae4fb645bca625b87cf0378ecca7e742",
"blockNumber": 72,
"address": "0xd5d4fcf2a46831510f095bfb447bc945f99309f7",
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033333330000000000000000000000000000000000000000000000000000000000",
"topics": ["0x4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02"]
},
"data": ["333"]
}],
"totalCount": 1
}
7.10. 获取ABI与合约所有合约信息¶
接口描述¶
获取导入的ABI与IDE中已部署合约所有合约的地址、合约名字信息
接口URL¶
http://localhost:5002/WeBASE-Front/event/listAddress/{groupId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/event/listAddress/{groupId}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [{
"type": "contract",
"contractAddress": "0x88156d500422a542435616e5a1e9d2df44c7fc70",
"contractName": "Hello3"
}, {
"type": "contract",
"contractAddress": "0xc2b3b552258b6016f80a070c1aa91bf9e3c48c53",
"contractName": "Hello3"
}, {
"type": "abi",
"contractAddress": "0x7a754bb46418c93b4cec7dcc6fef0676ae6a1e32",
"contractName": "Hello3"
}]
}
7.11. 根据地址获取ABI与合约的合约信息¶
接口描述¶
根据合约地址、合约类型(abi
或contract
)获取导入的ABI与IDE中已部署合约的合约地址、合约名字信息
接口URL¶
http://localhost:5002/WeBASE-Front/event/contractInfo/{groupId}/{type}/{contractAddress}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约类型 | type | String | 是 | 包含contract (IDE部署)和abi (ABI管理导入)两种类型 |
|
3 | 合约地址 | contractAddress | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/event/contractInfo/{groupId}/{type}/{contractAddress}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": {
"abiId": 1,
"groupId": 1,
"contractName": "Hello3",
"contractAddress": "0x7a754bb46418c93b4cec7dcc6fef0676ae6a1e32",
"contractAbi": "",
"contractBin": "",
"createTime": "2020-11-06 15:12:51",
"modifyTime": "2020-11-06 15:12:51"
}
}
8. Abi管理接口¶
8.1. 获取Abi信息¶
接口描述¶
根据abiId获取abi信息
接口URL¶
http://localhost:5002/WeBASE-Front/abi/{abiId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | abi编号 | abiId | Long | 是 | abi编号 |
2)数据格式
http://localhost:5002/WeBASE-Front/abi/{abiId}
响应参数¶
1)数据格式
a、成功:
{
"code": 0,
"message": "success",
"data": {
"abiId": 1,
"groupId": 1,
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357...",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
}
8.2. 获取Abi信息分页列表¶
接口描述¶
获取abi信息的列表
接口URL¶
http://localhost:5002/WeBASE-Front/abi/list/{groupId}/{pageNumber}/{pageSize}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组id | groupId | int | 是 | 群组编号 | |
2 | 页码 | pageNumber | int | 是 | ||
3 | 页大小 | pageSize | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/abi/list/{groupId}/{pageNumber}/{pageSize}
响应参数¶
1)数据格式
a、成功:
{
"code": 0,
"message": "success",
"data": [
{
"abiId": 1,
"groupId": 1,
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463fffff...29",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
],
"totalCount": 1
}
8.3. 导入已部署合约的abi¶
接口描述¶
将其他平台已部署的合约导入到本平台进行管理
接口URL¶
http://localhost:5002/WeBASE-Front/abi
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约地址 | contractAddress | String | 是 | 合约地址 | |
3 | 合约名 | contractName | String | 是 | ||
4 | 合约abi | contractAbi | List | 是 | 合约的ABI |
2)数据格式
{
"groupId": 1,
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractName": "HelloWorld",
"contractAbi": [{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"}],"name":"SetName","type":"event"}]
}
8.4. 修改已导入的合约abi¶
接口描述¶
更新已导入的合约abi内容
接口URL¶
http://localhost:5002/WeBASE-Front/abi
调用方法¶
HTTP PUT
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | abi编号 | abiId | Long | 是 | ||
2 | 所属群组 | groupId | Integer | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | 合约地址 | |
4 | 合约名 | contractName | String | 是 | ||
5 | 合约abi | contractAbi | List | 是 | 合约的ABI |
2)数据格式
{
"abiId": 1,
"groupId": 1,
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractName": "HelloWorld",
"contractAbi": [{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"}],"name":"SetName","type":"event"}]
}
9. 统计日志接口¶
9.1. 获取网络统计日志数据¶
接口描述¶
统计日志数据存储在H2数据库,默认存储一万条,超过将不会从节点日志文件拉取新的数据。此时,获取完现有数据,可以调用8.3 删除统计日志数据进行删除,数据量少于一万条时,自动从节点日志文件拉取新的数据。
接口URL¶
http://localhost:5002/WeBASE-Front/charging/getNetWorkData?groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}
调用方法¶
HTTP GET
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | pageSize | Int | 是 | 条数,默认10 |
3 | pageNumber | Int | 是 | 页码,默认1 |
4 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
5 | endDate | LocalDateTime | 是 | 结束时间 |
2)入参示例
http://localhost:5002/WeBASE-Front/charging/getNetWorkData?groupId=1&pageSize=2&pageNumber=1&beginDate=2020-03-27T10:30:04&endDate=2020-03-27T17:30:04
响应参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 主键 |
4.1.2 | groupId | Int | 否 | 群组编号 |
4.1.3 | totalIn | Long | 否 | 总入流量(P2P_InBytes + SDK_InBytes) |
4.1.4 | totalOut | Long | 否 | 总出流量(P2P_OutBytes + SDK_OutBytes) |
4.1.5 | timestamp | Long | 否 | 统计时间 |
2)出参示例
{
"code": 0,
"message": "success",
"data": [
{
"id": 583,
"totalIn": 53837,
"totalOut": 54753,
"groupId": 1,
"timestamp": 1585277486000
},
{
"id": 581,
"totalIn": 55128,
"totalOut": 55092,
"groupId": 1,
"timestamp": 1585277426000
}
],
"totalCount": 22
}
9.2. 获取交易Gas统计日志数据¶
接口描述¶
统计日志数据存储在H2数据库,默认存储一万条,超过将不会从节点日志文件拉取新的数据。此时,获取完现有数据,可以调用8.3 删除统计日志数据进行删除,数据量少于一万条时,自动从节点日志文件拉取新的数据。
接口URL¶
http://localhost:5002/WeBASE-Front/charging/getTxGasData?groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}&transHash={transHash}
调用方法¶
HTTP GET
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | pageSize | Int | 是 | 条数,默认10 |
3 | pageNumber | Int | 是 | 页码,默认1 |
4 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
5 | endDate | LocalDateTime | 是 | 结束时间 |
6 | transHash | String | 是 | 交易hash,不为空时查询指定hash |
2)入参示例
http://localhost:5002/WeBASE-Front/charging/getTxGasData?groupId=1&pageSize=2&pageNumber=1&beginDate=2020-03-27T10:30:04&endDate=2020-03-27T17:30:04
响应参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 主键 |
4.1.2 | groupId | Int | 否 | 群组编号 |
4.1.3 | transHash | Long | 否 | 交易hash |
4.1.4 | gasUsed | Long | 否 | 交易消耗的gas |
4.1.5 | timestamp | Long | 否 | 统计时间 |
2)出参示例
{
"code": 0,
"message": "success",
"data": [
{
"id": 5,
"transHash": "c5e208ec70b899529e11311f1147b1ee24ab8f02301e6cdbe8252c77a89a0d4c",
"gasUsed": 34949,
"groupId": 1,
"timestamp": 1585277499000
},
{
"id": 4,
"transHash": "d9d7800554b68c84a53e54eef8adceecca891dd0dd7e0069a3474a81d4eac440",
"gasUsed": 44892,
"groupId": 1,
"timestamp": 1585277489000
}
],
"totalCount": 5
}
9.3. 删除统计日志数据¶
接口描述¶
统计日志数据存储在H2数据库,默认存储一万条,超过将不会从节点日志文件拉取新的数据。此时,获取完现有数据,可以调用当前接口进行删除,数据量少于一万条时,自动从节点日志文件拉取新的数据。
接口URL¶
http://localhost:5002/WeBASE-Front/charging/deleteData?groupId={groupId}&type={type}&keepEndDate={keepEndDate}
调用方法¶
HTTP DELETE
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 群组编号 |
2 | type | Int | 否 | 删除数据类型(1-网络统计数据;2-交易gas数据) |
3 | keepEndDate | LocalDateTime | 否 | 保留截止时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
2)入参示例
http://localhost:5002/WeBASE-Front/charging/deleteData?groupId=1&type=1&keepEndDate=2020-03-27T10:30:04
响应参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Int | 否 | 处理条数 |
2)出参示例
{
"code": 0,
"message": "success",
"data": 5
}
10. 其他接口¶
10.1. 查询是否使用国密¶
接口描述¶
获取WeBASE-Front的encryptType
,即是否使用国密版;
接口URL¶
http://localhost:5002/WeBASE-Front/encrypt
调用方法¶
HTTP GET
10.2. 查询WeBASE-Front版本¶
接口描述¶
获取WeBASE-Front的版本号
接口URL¶
http://localhost:5002/WeBASE-Front/version
调用方法¶
HTTP GET
10.3. 查询前置连接的WeBASE-Sign版本¶
接口描述¶
获取WeBASE-Front的所连接的WeBASE-Sign的版本号
接口URL¶
http://localhost:5002/WeBASE-Front/version/sign
调用方法¶
HTTP GET
10.4. 查询前置包含的solidity v0.6.10文件¶
接口描述¶
获取WeBASE-Front的本地conf/solcjs
中包含的solidity 0.6.10的js文件列表
如需要使用solidity 0.6.10,则需要手动下载CDN中solidity的v0.6.10.js(国密v0.6.10-gm.js),并在WeBASE-Front的conf文件夹中创建solcjs文件夹,并将js文件复制到该文件夹。
注:使用webase-front.zip安装包直接部署则不需要手动放置js文件
接口URL¶
http://localhost:5002/WeBASE-Front/solc/list
调用方法¶
HTTP GET
11. 工具类接口¶
11.1. 解析Input/Output工具接口¶
接口描述¶
根据合约ABI,解析交易回执中返回的input/output值
接口URL¶
http://localhost:5002/WeBASE-Front/tool/decode
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 解析类型 | decodeType | int | 是 | 1-解析input,2-解析output | |
2 | 返回类型 | returnType | int | 否 | 默认是1,1-实体类类型(InputAndOutputResult.java ),2-Json格式 |
|
3 | 交易输入 | input | String | 否 | 交易输入值 | |
4 | 交易输出 | output | String | 否 | 交易输出值 | |
5 | 合约ABI | abiList | List | 是 | 合约ABI列表 |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/decode
解析output
{
"abiList": [],
"decodeType": 2,
"input": "0x5d0d1f0a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c0010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000",
"output": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
"returnType": 2
}
响应参数¶
1)数据格式
a、成功:
解析output,返回json
{
"function": "set(uint256,uint256,bool,string,bytes1,bytes)",
"methodID": "0x5d0d1f0a",
"result": [{
"name": "",
"type": "uint256",
"data": 1
}, {
"name": "",
"type": "uint256",
"data": 1
}]
}
解析input,返回实体
{
"function": "set(uint256,uint256,bool,string,bytes1,bytes)",
"methodID": "0x5d0d1f0a",
"result": [
{
"name": "n1",
"type": "uint256",
"data": 1
},
{
"name": "n6",
"type": "bytes",
"data": ""
}
]
}
11.2. 获取公私钥对¶
接口描述¶
传入私钥时,返回对应的公私钥对;不传入私钥时,返回随机私钥对
接口URL¶
http://localhost:5002/WeBASE-Front/tool/keypair
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥值 | privateKey | String | 否 | 为空时,返回随机私钥对,BigInteger的HexString格式(十六进制) |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/keypair
{
"privateKey": "a81dfd0d3b1004d6635e099aeddd0e939481081372d791b0c477bb21c663105d"
}
响应参数¶
1)数据格式
a、成功:
{
"privateKey": "a81dfd0d3b1004d6635e099aeddd0e939481081372d791b0c477bb21c663105d",
"publicKey": "0xaa95cfddb68f6e583a204e479536ac2d6f8fba254ef08cfad82aa48b1d9eadd58314d7cbd3c0a8461b68219577ee511e84c630a0df252afa35bd86aa12f1ebff",
"address": "988f01939de8797789ea4889e39a7039af9f4c11",
"encryptType": 0 // 0-ecdsa, 1-sm2
}
11.3. 根据公钥获取地址¶
接口描述¶
根据公钥获取地址
接口URL¶
http://localhost:5002/WeBASE-Front/tool/address?publicKey={publicKey}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 公钥值 | publicKey | String | 是 | BigInteger的HexString格式(十六进制) |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/address?publicKey=0xaa95cfddb68f6e583a204e479536ac2d6f8fba254ef08cfad82aa48b1d9eadd58314d7cbd3c0a8461b68219577ee511e84c630a0df252afa35bd86aa12f1ebff
响应参数¶
1)数据格式
a、成功:
{
"publicKey": "0xaa95cfddb68f6e583a204e479536ac2d6f8fba254ef08cfad82aa48b1d9eadd58314d7cbd3c0a8461b68219577ee511e84c630a0df252afa35bd86aa12f1ebff",
"address": "988f01939de8797789ea4889e39a7039af9f4c11",
"encryptType": 0 // 0-ecdsa, 1-sm2
}
11.4. 获取哈希值¶
接口描述¶
获取哈希值
接口URL¶
http://localhost:5002/WeBASE-Front/tool/hash?input={123}&type={type}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 输入值 | input | String | 是 | 待哈希的输入值 | |
2 | 入参类型 | type | int | 否 | 默认为1,1-hexString十六进制字符串,2-UTF8字符串 |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/hash??input=123&type=1
响应参数¶
1)数据格式
a、成功:
type=1,入参为Hex String时:
{
"hashValue": "0x667d3611273365cfb6e64399d5af0bf332ec3e5d6986f76bc7d10839b680eb58",
"encryptType": 0
}
type=2,入参为UTF8类型时:
{
"hashValue": "0x64e604787cbf194841e7b68d7cd28786f6c9a0a3ab9f8b0a0e87cb4387ab0107",
"encryptType": 0
}
11.5. String转bytes32类型¶
接口描述¶
UTF8字符串或HexString字符串转为solidity中的bytes32类型
接口URL¶
http://localhost:5002/WeBASE-Front/tool/convert2Bytes32?input={input}&type={type}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 输入值 | input | String | 是 | 待转换的输入值 | |
2 | 入参类型 | type | int | 否 | 默认为1,1-hexString十六进制字符串,2-UTF8字符串 |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/utf8ToHexString??input=123&type=1
响应参数¶
1)数据格式
a、成功:
type=1,入参为Hex String时:
0x0123000000000000000000000000000000000000000000000000000000000000
type=2,入参为UTF8类型时:
0x3132330000000000000000000000000000000000000000000000000000000000
11.6. UTF8字符串转十六进制¶
接口描述¶
UTF8字符串转为HexString十六进制(无0x开头)
接口URL¶
http://localhost:5002/WeBASE-Front/tool/utf8ToHexString?input={input}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 输入值 | input | String | 是 | 待转换的输入值 |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/utf8ToHexString??input=123
11.7. 获取指定私钥签名后的内容¶
接口描述¶
UTF8字符串转为HexString十六进制(无0x开头)
接口URL¶
http://localhost:5002/WeBASE-Front/tool/signMsg
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥值 | privateKey | String | 是 | ||
2 | 待签名的值 | rawData | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/signMsg
{
"privateKey ": "1",
"rawData ": "123"
}
响应参数¶
1)数据格式
a、成功:
{
"signatureData": {
"v": 28,
"r": "igg6XONxOgnO5DBlbyZo2E12T13ZSMxdoiZBF06N6Vs=",
"s": "G0mFLQfCH+5yKEEROkGLRH8FROTnSbYEYmpkEqsasxU=",
"pub": null
},
"encryptType": 0
}
11.8. 获取.pem私钥的内容¶
接口描述¶
传入.pem私钥,获取其值
接口URL¶
http://localhost:5002/WeBASE-Front/tool/decodePem
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | .pem私钥文件 | pemFile | MultipartFile | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/decodePem
form-data入参
{
"pemFile ":
}
响应参数¶
1)数据格式
a、成功:
{
"privateKey": "9b71fd37075dc2bb5d6c24145bfcbc12ae44df544cf67f067f3230ca22ccbd",
"publicKey": "0x7bc349e6d8be4df636f09ece0290eb18fa3bc5fb37a79846894dcb414b5714eb50f522a6d7e9d762ad49d0718dbaca462bb4f44c81b27598b3ea6df1ef9b6fa0",
"address": "4d400652406daabb315cece1e5f8b48020679aa2",
"encryptType": 0
}
11.9. 获取.p12私钥的内容¶
接口描述¶
传入.p12私钥,获取其值
接口URL¶
http://localhost:5002/WeBASE-Front/tool/decodeP12
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | .p12私钥文件 | p12File | MultipartFile | 是 | ||
2 | .p12私钥密码 | p12Password | String | 是 | .p12私钥的密码默认""空字符串 |
2)数据格式
http://localhost:5002/WeBASE-Front/tool/decodeP12
form-data入参
{
"p12File ": ,
"p12Password": ""
}
响应参数¶
1)数据格式
a、成功:
{
"privateKey": "9b71fd37075dc2bb5d6c24145bfcbc12ae44df544cf67f067f3230ca22ccbd",
"publicKey": "0x7bc349e6d8be4df636f09ece0290eb18fa3bc5fb37a79846894dcb414b5714eb50f522a6d7e9d762ad49d0718dbaca462bb4f44c81b27598b3ea6df1ef9b6fa0",
"address": "4d400652406daabb315cece1e5f8b48020679aa2",
"encryptType": 0
}
12. 合约仓库¶
12.1. 获取合约仓库列表¶
接口描述¶
返回合约仓库信息列表
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractStoreList
调用方法¶
HTTP GET
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"storeId": 1,
"storeName": "工具箱",
"storeName_en": "Toolbox",
"storeType": "1",
"storeIcon": "toolboxId",
"storeDesc": "工具箱中有常用的工具合约",
"storeDetail": "工具箱中有常用的工具合约",
"storeDesc_en": "Toolbox Contract suite",
"storeDetail_en": "Toolbox Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"storeId": 2,
"storeName": "存证应用",
"storeName_en": "Evidence",
"storeType": "2",
"storeIcon": "evidenceId",
"storeDesc": "一套区块链存证合约",
"storeDetail": "一套区块链存证合约",
"storeDesc_en": "Evidence Contract suite",
"storeDetail_en": "Evidence Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"storeId": 3,
"storeName": "积分应用",
"storeName_en": "Points",
"storeType": "3",
"storeIcon": "pointsId",
"storeDesc": "一套积分合约",
"storeDetail": "一套积分合约",
"storeDesc_en": "Points Contract suite",
"storeDetail_en": "Points Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
12.2. 根据仓库编号获取仓库信息¶
接口描述¶
返回合约仓库信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/{storeId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 仓库编号 | storeId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractStoreById/1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"storeId": 1,
"storeName": "工具箱",
"storeName_en": "Toolbox",
"storeType": "1",
"storeIcon": "toolboxId",
"storeDesc": "工具箱中有常用的工具合约",
"storeDetail": "工具箱中有常用的工具合约",
"storeDesc_en": "Toolbox Contract suite",
"storeDetail_en": "Toolbox Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
12.3. 根据仓库编号获取合约文件夹信息¶
接口描述¶
返回合约文件夹信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/{storeId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 仓库编号 | storeId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getFolderItemListByStoreId/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"contractFolderId": 2,
"storeId": 2,
"contractFolderName": "Evidence",
"contractFolderDesc": "Evidence",
"contractFolderDetail": "Evidence",
"contractFolderDesc_en": "Evidence",
"contractFolderDetail_en": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
12.4. 根据合约文件夹编号获取合约文件夹信息¶
接口描述¶
返回合约文件夹信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/{contractFolderId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约文件夹编号 | contractFolderId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"contractFolderId": 2,
"storeId": 2,
"contractFolderName": "Evidence",
"contractFolderDesc": "Evidence",
"contractFolderDetail": "Evidence",
"contractFolderDesc_en": "Evidence",
"contractFolderDetail_en": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
12.5. 根据文件夹编号获取合约列表¶
接口描述¶
返回合约信息列表
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractItemByFolderId/{folderId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 文件夹编号 | folderId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractItemByFolderId/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 4,
"contractFolderId": 2,
"contractName": "Evidence",
"contractDesc": "Evidence",
"contractSrc": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YUFCSXsgZnVuY3Rpb24gdmVyaWZ5KGFkZHJlc3MgYWRkcilwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhib29sKXt9CmZ1bmN0aW9uIGdldFNpZ25lcih1aW50IGluZGV4KXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3Mpe30gCmZ1bmN0aW9uIGdldFNpZ25lcnNTaXplKCkgcHVibGljIGNvbnN0YW50IHJldHVybnModWludCl7fQp9Cgpjb250cmFjdCBFdmlkZW5jZXsKICAgIAogICAgc3RyaW5nIGV2aWRlbmNlOwogICAgc3RyaW5nIGV2aWRlbmNlSW5mbzsKICAgIHN0cmluZyBldmlkZW5jZUlkOwogICAgdWludDhbXSBfdjsKICAgIGJ5dGVzMzJbXSBfcjsKICAgIGJ5dGVzMzJbXSBfczsKICAgIGFkZHJlc3NbXSBzaWduZXJzOwogICAgYWRkcmVzcyBwdWJsaWMgc2lnbmVyc0FkZHI7CiAgICAKICAgICAgICBldmVudCBhZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IG5ld1NpZ25hdHVyZXNFdmVudChzdHJpbmcgZXZpLCBzdHJpbmcgaW5mbywgc3RyaW5nIGlkLCB1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcyxhZGRyZXNzIGFkZHIpOwogICAgICAgIGV2ZW50IGVycm9yTmV3U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLGFkZHJlc3MgYWRkcik7CiAgICAgICAgZXZlbnQgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsYWRkcmVzcyBhZGRyKTsKICAgICAgICBldmVudCBhZGRSZXBlYXRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsIGFkZHJlc3MgYWRkcik7CgogICAgZnVuY3Rpb24gQ2FsbFZlcmlmeShhZGRyZXNzIGFkZHIpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpIHsKICAgICAgICByZXR1cm4gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikudmVyaWZ5KGFkZHIpOwogICAgfQoKICAgICAgIGZ1bmN0aW9uIEV2aWRlbmNlKHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLCBhZGRyZXNzIGFkZHIsIGFkZHJlc3Mgc2VuZGVyKSBwdWJsaWMgewogICAgICAgc2lnbmVyc0FkZHIgPSBhZGRyOwogICAgICAgaWYoQ2FsbFZlcmlmeShzZW5kZXIpKQogICAgICAgewogICAgICAgICAgIGV2aWRlbmNlID0gZXZpOwogICAgICAgICAgIGV2aWRlbmNlSW5mbyA9IGluZm87CiAgICAgICAgICAgZXZpZGVuY2VJZCA9IGlkOwogICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgX3IucHVzaChyKTsKICAgICAgICAgICBfcy5wdXNoKHMpOwogICAgICAgICAgIHNpZ25lcnMucHVzaChzZW5kZXIpOwogICAgICAgICAgIG5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgICBlcnJvck5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RXZpZGVuY2VJbmZvKCkgcHVibGljIGNvbnN0YW50IHJldHVybnMoc3RyaW5nKXsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlSW5mbzsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRFdmlkZW5jZSgpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ4W10sYnl0ZXMzMltdLGJ5dGVzMzJbXSxhZGRyZXNzW10pewogICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICByZXR1cm4oZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsX3YsX3IsX3Msc2lnbmVyTGlzdCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkU2lnbmF0dXJlcyh1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcykgcHVibGljIHJldHVybnMoYm9vbCkgewogICAgICAgIGZvcih1aW50IGk9IDAgO2k8c2lnbmVycy5sZW5ndGggO2krKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKG1zZy5zZW5kZXIgPT0gc2lnbmVyc1tpXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoIF92W2ldID09IHYgJiYgX3JbaV0gPT0gciAmJiBfc1tpXSA9PSBzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZFJlcGVhdFNpZ25hdHVyZXNFdmVudChldmlkZW5jZSxldmlkZW5jZUluZm8sZXZpZGVuY2VJZCx2LHIscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgIGlmKENhbGxWZXJpZnkobXNnLnNlbmRlcikpCiAgICAgICB7CiAgICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgIF9yLnB1c2gocik7CiAgICAgICAgICAgIF9zLnB1c2gocyk7CiAgICAgICAgICAgIHNpZ25lcnMucHVzaChtc2cuc2VuZGVyKTsKICAgICAgICAgICAgYWRkU2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSW5mbyxldmlkZW5jZUlkLHYscixzKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgICAgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRTaWduZXJzKClwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhhZGRyZXNzW10pCiAgICB7CiAgICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNpZ25lckxpc3Q7CiAgICB9Cn0=",
"contractDesc_en": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"contractId": 5,
"contractFolderId": 2,
"contractName": "EvidenceSignersData",
"contractDesc": "EvidenceSignersData",
"contractSrc": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKaW1wb3J0ICJFdmlkZW5jZS5zb2wiOwoKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YXsKICAgICAgICBhZGRyZXNzW10gc2lnbmVyczsKCQlldmVudCBuZXdFdmlkZW5jZUV2ZW50KGFkZHJlc3MgYWRkcik7CiAgICAgICAgZnVuY3Rpb24gbmV3RXZpZGVuY2Uoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sc3RyaW5nIGlkLHVpbnQ4IHYsIGJ5dGVzMzIgcixieXRlczMyIHMpcHVibGljIHJldHVybnMoYWRkcmVzcykKICAgICAgICB7CiAgICAgICAgICAgIEV2aWRlbmNlIGV2aWRlbmNlID0gbmV3IEV2aWRlbmNlKGV2aSwgaW5mbywgaWQsIHYsIHIsIHMsIHRoaXMsIG1zZy5zZW5kZXIpOwogICAgICAgICAgICBuZXdFdmlkZW5jZUV2ZW50KGV2aWRlbmNlKTsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gRXZpZGVuY2VTaWduZXJzRGF0YShhZGRyZXNzW10gZXZpZGVuY2VTaWduZXJzKXB1YmxpY3sKICAgICAgICAgICAgZm9yKHVpbnQgaT0wOyBpPGV2aWRlbmNlU2lnbmVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBzaWduZXJzLnB1c2goZXZpZGVuY2VTaWduZXJzW2ldKTsKCQkJfQoJCX0KCiAgICBmdW5jdGlvbiB2ZXJpZnkoYWRkcmVzcyBhZGRyKXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpewogICAgZm9yKHVpbnQgaT0wOyBpPHNpZ25lcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoYWRkciA9PSBzaWduZXJzW2ldKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyKHVpbnQgaW5kZXgpcHVibGljIGNvbnN0YW50IHJldHVybnMoYWRkcmVzcyl7CiAgICAgICAgdWludCBsaXN0U2l6ZSA9IHNpZ25lcnMubGVuZ3RoOwogICAgICAgIGlmKGluZGV4IDwgbGlzdFNpemUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc2lnbmVyc1tpbmRleF07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyc1NpemUoKSBwdWJsaWMgY29uc3RhbnQgcmV0dXJucyh1aW50KXsKICAgICAgICByZXR1cm4gc2lnbmVycy5sZW5ndGg7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVycygpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3NbXSl7CiAgICAgICAgcmV0dXJuIHNpZ25lcnM7CiAgICB9Cgp9",
"contractDesc_en": "EvidenceSignersData",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
12.6. 根据合约编号获取合约信息¶
接口描述¶
返回合约信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractItemById/{contractId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约编号 | contractId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractItemById/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"contractId": 2,
"contractFolderId": 1,
"contractName": "LibSafeMathForUint256Utils",
"contractDesc": "LibSafeMathForUint256Utils",
"contractSrc": "LyoKICogQ29weXJpZ2h0IDIwMTQtMjAxOSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKiAqLwoKcHJhZ21hIHNvbGlkaXR5IF4wLjQuMjU7CgpsaWJyYXJ5IExpYlNhZmVNYXRoRm9yVWludDI1NlV0aWxzIHsKCiAgICBmdW5jdGlvbiBhZGQodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHVpbnQyNTYgYyA9IGEgKyBiOwogICAgICAgIHJlcXVpcmUoYyA+PSBhLCAiU2FmZU1hdGhGb3JVaW50MjU2OiBhZGRpdGlvbiBvdmVyZmxvdyIpOwogICAgICAgIHJldHVybiBjOwogICAgfQoKICAgIGZ1bmN0aW9uIHN1Yih1aW50MjU2IGEsIHVpbnQyNTYgYikgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50MjU2KSB7CiAgICAgICAgcmVxdWlyZShiIDw9IGEsICJTYWZlTWF0aEZvclVpbnQyNTY6IHN1YnRyYWN0aW9uIG92ZXJmbG93Iik7CiAgICAgICAgdWludDI1NiBjID0gYSAtIGI7CiAgICAgICAgcmV0dXJuIGM7CiAgICB9CgogICAgZnVuY3Rpb24gbXVsKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICBpZiAoYSA9PSAwIHx8IGIgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHVpbnQyNTYgYyA9IGEgKiBiOwogICAgICAgIHJlcXVpcmUoYyAvIGEgPT0gYiwgIlNhZmVNYXRoRm9yVWludDI1NjogbXVsdGlwbGljYXRpb24gb3ZlcmZsb3ciKTsKICAgICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXYodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJlcXVpcmUoYiA+IDAsICJTYWZlTWF0aEZvclVpbnQyNTY6IGRpdmlzaW9uIGJ5IHplcm8iKTsKICAgICAgICB1aW50MjU2IGMgPSBhIC8gYjsKICAgICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBtb2QodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJlcXVpcmUoYiAhPSAwLCAiU2FmZU1hdGhGb3JVaW50MjU2OiBtb2R1bG8gYnkgemVybyIpOwogICAgICAgIHJldHVybiBhICUgYjsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3dlcih1aW50MjU2IGEsIHVpbnQyNTYgYikgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50MjU2KXsKCiAgICAgICAgaWYoYSA9PSAwKSByZXR1cm4gMDsKICAgICAgICBpZihiID09IDApIHJldHVybiAxOwoKICAgICAgICB1aW50MjU2IGMgPSAxOwogICAgICAgIGZvcih1aW50MjU2IGkgPSAwOyBpIDwgYjsgaSsrKXsKICAgICAgICAgICAgYyA9IG11bChjLCBhKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbWF4KHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gYSA+PSBiID8gYSA6IGI7CiAgICB9CgogICAgZnVuY3Rpb24gbWluKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKICAgIH0KCiAgICBmdW5jdGlvbiBhdmVyYWdlKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gKGEgLyAyKSArIChiIC8gMikgKyAoKGEgJSAyICsgYiAlIDIpIC8gMik7CiAgICB9Cn0K",
"contractDesc_en": "LibSafeMathForUint256Utils",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
13. 证书管理¶
13.1. 查询节点证书接口¶
接口描述¶
获取Front对应节点的Fisco证书和sdk证书(包含链证书、机构证书和节点证书)的内容;
需要在项目配置文件中constant-nodePath
配置Front连接节点的绝对路径;
注:
接口只返回了证书的文本(Base64编码),未包含开头与结尾以及换行的格式文本; 如需将文本保存为一个证书文件,需要加上开头“—–BEGIN CERTIFICATE—–\n”和结尾“\n—–END CERTIFICATE—–\n”;
接口URL¶
http://localhost:5002/WeBASE-Front/cert
调用方法¶
HTTP GET
响应参数¶
1)数据格式
a、成功:
{
"node": "MIICOTCCASGgAwIBAgIJAKHsAYI3TsAOMA0GCSqGSIb3DQEBCwUAMDgxEDAOBgNV\nBAMMB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5j\neTAeFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDIxDDAKBgNVBAMMA3Nk\nazETMBEGA1UECgwKZmlzY28tYmNvczENMAsGA1UECwwEbm9kZTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABJ79rSKIb97xZwByW58xH6tzoNKNLaKG7J5wxAEgAb03O2h4\nMkEMLtf/LB7tELOiyCiIEhLScprb1LjvDDt2RDGjGjAYMAkGA1UdEwQCMAAwCwYD\nVR0PBAQDAgXgMA0GCSqGSIb3DQEBCwUAA4IBAQC0u2lfclRmCszBTi2rtvMibZec\noalRC0sQPBPRb7UQhGCodxmsAT3dBUf+s4wLLrmN/cnNhq5HVObbWxzfu7gn3+IN\nyQEeqdbGdzlu1EDcaMgAz6p2W3+FG/tmx/yrNza29cYekWRL44OT5LOUPEKrJ4bJ\neOBRY4QlwZPFmM0QgP7DoKxHXldRopkmvqT4pbW51hWvPgj7KrdqwbVWzuWQuI3i\n3j3O96XZJsaDZ0+IGa5093+TsTNPfWUZzp5Kg+EyNR6Ea1evuMDNq9NAqqcd5bX9\nO9kgkb8+llO8I5ZhdnN0BuhGvv9wpsa9hW8BImOLzUBwfSVYouGCkoqlVq9X",
"chain": "MIIDPTCCAiWgAwIBAgIJAMfvnu4d5fHdMA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNV\nBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAe\nFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDUxDjAMBgNVBAMMBWNoYWlu\nMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMGsKT/S60cxvFS4tBLyfT0QKPLW1g3ZgMND\n03hrWp1FAnvE9htsDEgqvNLD5hKWaYcUhjQMq0WttiP/vPxkwwJkZhzWhXpdSxMR\nqKVX4BppnkT0ICm84jYSyJdNFjKvfWlBIptIfFuTUDMT+XqF/Ct756JksiUwKZRW\neRAVcYzFM4u4ZuKeaept/8Bv8Z/RlJzGI57qj5BELeA0meUagq2WoCgJrPyvbO0b\nLwogFWS4kEjv20IIdj3fTqeJlooEXtPnuegunSMQB6aIh2im74FfJ3sHuOjQDFuC\nb5ZUiyUHG6IOGCqs+Grk+/VYI16Mx+8OoGBD5koTpK8B+/aedsUCAwEAAaNQME4w\nHQYDVR0OBBYEFLTg2FsUFekx9XjIi01BrDpo0aPIMB8GA1UdIwQYMBaAFLTg2FsU\nFekx9XjIi01BrDpo0aPIMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB\nAJmuMLhWSld8G6i3Vw21TN/d2rSRg3hNqOyycPYtdVK1YXEj4Xm91qgL8An3Kui8\njSq1S9+PstGvyh14YUw43Y1VtEPGpNVTvDtkxQ/8rs1sGHbqUxshgFMbqruxp7WH\ns0fxgn5COHEnRC4jQn02wZAk8pIjFVZLkhqdIYBtC35buHr17mXNL0S4H5cJxzPN\nk3XtKBqXedkTrEsDhR/bZ6qDDq0BcduhtKiYVPiVw9z3moLuwDb0QDM59zCexpcz\nb/w7K4lIxWqpD5tbpKSmj/3v5TCqez0Mim8/j4q29bP913KQrngnVCdCezOsPWIH\nDDoihgeRQHuz1VuGGZ259Hc=",
"agency": "MIIDADCCAeigAwIBAgIJAJUF2Dp1a9U6MA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNV\nBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAe\nFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDgxEDAOBgNVBAMMB2FnZW5j\neUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBANBT4CTciIYdSeEabgJzif+CFB0y3GzG\ny+XQYtWK+TtdJWduXqhnnZiYAZs7OPGEu79Yx/bEpjEXsu2cXH0D6BHZk+wvuxG6\nezXWq5MYjCw3fQiSRWkDYoxzWgulkRyYROF1xoZeNGQssReFmCgP+pcQwRxjcq8z\nIA9iT61YxyW5nrS7xnra9uZq/EE3tsJ0ae3ax6zixCT66aV49S27cMcisS+XKP/q\nEVPxhO7SUjnzZY69MgZzNSFxCzIbapnlmYAOS26vIT0taSkoKXmIsYssga45XPwI\n7YBVCc/34kHzW9xrNjyyThMWOgDsuBqZN9xvapGSQ82Lsh7ObN0dZVUCAwEAAaMQ\nMA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAu3aHxJnCZnICpHbQ\nv1Lc5tiXtAYE9aEP5cxb/cO14xY8dS+t0wiLIvyrE2aTcgImzr4BYNBm1XDt5suc\nMpzha1oJytGv79M9/WnI/BKmgUqTaaXOV2Ux2yPX9SadNcsD9/IbrV0b/hlsPd6M\nK8w7ndowvBgopei+A1NQY6jTDUKif4RxD4u5HZFWUu7pByNLFaydU4qBKVkucXOq\nxmWoupL5XrDk5o490kiz/Zgufqtb4w6oUr3lrQASAbFB3lID/P1ipi0DwX7kZwVX\nECDLYvr+eX6GbTClzn0JGuzqV4OoRo1rrRv+0tp1aLZKpCYn0Lhf6s1iw/kCeM2O\nnP9l2Q=="
}
b、失败:
{
"code": 201231,
"message": "Cert file not found, please check cert path in config",
"data": "FileNotFound, node cert(node.crt) path prefix error"
}
13.2. 获取明文SDK证书与私钥¶
接口描述¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的内容
接口URL¶
http://localhost:5002/WeBASE-Front/cert/sdk
调用方法¶
HTTP GET
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | Map |
Map | 是 | key为文件名,value为文件内容 |
1)数据格式
a、成功:
{
"sdk.key": "-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgxqr/d/VgQ0fAr/KvyAeW\nJ6bD1tqxZ5gYOdfIJiK7WOmhRANCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wr\npyoiQkMy1qI5/3Sj4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhP\n-----END PRIVATE KEY-----\n",
"ca.crt": "-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n",
"sdk.crt": "-----BEGIN CERTIFICATE-----\nMIIBeDCCAR+gAwIBAgIJAJoEtSMUsa8HMAoGCCqGSM49BAMCMDgxEDAOBgNVBAMM\nB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTAg\nFw0yMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowMTEMMAoGA1UEAwwDc2Rr\nMRMwEQYDVQQKDApmaXNjby1iY29zMQwwCgYDVQQLDANzZGswVjAQBgcqhkjOPQIB\nBgUrgQQACgNCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wrpyoiQkMy1qI5/3Sj\n4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhPoxowGDAJBgNVHRMEAjAAMAsGA1Ud\nDwQEAwIF4DAKBggqhkjOPQQDAgNHADBEAiANbeRFiiS6mH+vcAOwV3wXd9YW/B2a\n+vrHMm6NwtliRAIgRH4gSF0XLmpVOEO21bJFDGWm9siIX0cnj0R3kNGZcB4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBcTCCARegAwIBAgIJANrOZ+FrVNpIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAeFw0y\nMTA0MDYxMjMwNDBaFw0zMTA0MDQxMjMwNDBaMDgxEDAOBgNVBAMMB2FnZW5jeUEx\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABIqMDvvzvTq8WW1UtJrnnsifw9/OrPsMc9CrrYBsWdwOGhdx\nfNTJA1ss+vngjrhAmWHczvbh+E1WOlDGzpCumeqjEDAOMAwGA1UdEwQFMAMBAf8w\nCgYIKoZIzj0EAwIDSAAwRQIhALsAbAQ9BDeofk4VYzYx2ZAHB1HviDp9ndvXAkLN\nsfHZAiAjViK97dDr3gxP/qHg0e8BG9ptEv7Do8caOPj33F+yOQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n"
}
13.2. 获取SDK证书与私钥压缩包¶
接口描述¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的zip压缩包
接口URL¶
http://localhost:5002/WeBASE-Front/cert/sdk/zip
调用方法¶
HTTP GET
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中 |
1)数据格式
a、成功:
headers: content-disposition: attachment;filename*=UTF-8''conf.zip
{
// 二进制流
}
14. 附录¶
1. 返回码信息列表¶
code | message | 描述 |
---|---|---|
0 | success | 成功 |
101001 | system error | 系统异常 |
101002 | param valid fail | 参数校验异常 |
101003 | web3jMap of groupId is null, please call /{groupId}/web3/refresh to refresh | 连接当前群组失败,请调用/{groupId}/web3/refresh刷新群组 |
101004 | groupList error for no group, web3jMap is empty | 群组列表为空,请检查节点共识状态 |
201001 | groupId cannot be empty | 群组编号不能为空 |
201002 | user cannot be empty | 用户地址不能为空 |
201003 | useAes cannot be empty | 是否为加密私钥不能为空 |
201004 | version cannot be empty | 合约版本不能为空 |
201005 | funcName cannot be empty | 方法名不能为空 |
201006 | abiInfo cannot be empty | abi内容不能为空 |
201007 | bytecodeBin cannot be empty | 合约bin不能为空 |
201008 | contract's current version has been deployed | 该合约版本已部署 |
201009 | contract is not deployed | 合约未部署 |
201010 | save abi error | abi保存错误 |
201011 | contract funcParam is error | 请求的方法参数错误 |
201012 | requst blockNumber is greater than latest | 请求块高大于最新块高 |
201013 | get abi from chain error | 获取合约abi错误 |
201014 | contract deploy error | 合约部署错误 |
201015 | user's privateKey is null | 用户私钥为空 |
201016 | file is not exist | 文件不存在 |
201017 | failed to get node config | 获取节点配置失败 |
201018 | blockNumber and pbftView unchanged | 块高和view没有变化 |
201019 | request function is error | 请求的方法错误 |
201020 | transaction query from chain failed | 交易查询失败 |
201021 | transaction send to chain failed | 交易上链失败 |
201022 | node request failed | 节点请求失败 |
201023 | contract already exists | 合约已经存在 |
201024 | contract name cannot be repeated | 合约名不能重复 |
201025 | invalid contract id | 无效的合约编号 |
201026 | contract has been deployed | 合约已部署 |
201027 | send abiInfo fail | 发送abi失败 |
201028 | bytecodeBin is null | 合约bin为空 |
201029 | contractAddress is null | 合约地址为空 |
201030 | contractAddress invalid | 合约地址无效 |
201031 | privateKey decode fail | 私钥编码失败 |
201032 | not found config of keyServer | 密钥服务未配置 |
201033 | data request sign error | 数据请求签名异常 |
201034 | groupId not exist | 群组编号不存在 |
201035 | version and address cannot all be null | 合约版本和地址不能同时为空 |
201036 | compile fail | 合约编译失败 |
201037 | user name is null | 用户名为空 |
201038 | user name already exists | 用户名已存在 |
201039 | private key already exists | 私钥已存在 |
201040 | private key not exists | 私钥不存在 |
201041 | external user's appId and signUserId cannot be empty | 外部用户的appId和signUserId不能为空 |
201042 | There is no sol files in source | solidity文件不存在 |
201043 | invalid group operate type | 群组操作类型不正确 |
201044 | invalid data type | 不正确的数据类型 |
201045 | encode string can not be empty | 已签名的参数内容不能为空 |
201046 | transaction failed | 交易上链失败 |
201050 | Fail to parse json | 链上返回值反序列化失败 |
201051 | get consensus status fail | 交易上链失败 |
201101 | groupId cannot be empty | 群组编号不能为空 |
201102 | tableName cannot be empty | 表名不能为空 |
201103 | permissionType cannot be empty | 权限类型不能为空 |
201104 | permissionType not exists | 权限类型不存在 |
201105 | from address cannot be empty | 管理员地址不能为空 |
201106 | contract name cannot be empty | 合约名不能为空 |
201107 | system config key cannot be empty | 系统配置key值不能为空 |
201108 | system config value cannot be empty | 系统配置value值不能为空 |
201109 | node id cannot be empty | 节点id不能为空 |
201110 | node type cannot be empty | 节点类型(共识状态不能为空) |
201111 | Permission state cannot be all empty | 更新的用户权限状态不能为空 |
201112 | contract address cannot be empty | 合约地址不能为空 |
201113 | contract handle type cannot be empty | 合约操作类型不能为空 |
201114 | grantAddress cannot be empty | 赋值的地址不能为空 |
201115 | invalid contract handle type | 不正确的合约操作类型 |
201116 | contract status handle fail | 合约状态修改失败 |
201120 | group operate fail | 群组操作失败 |
201121 | node internal error | 节点内部错误 |
201122 | group already exists | 群组已存在 |
201123 | group already running | 群组已运行 |
201124 | group already stopped | 群组已停止 |
201125 | group already deleted | 群组已删除 |
201126 | group not found | 未找到群组 |
201127 | group operate param error | 群组操作入参错误 |
201128 | group peers not connected | 群组内节点未连接 |
201129 | group genesis conf already exists | 群组创世块文件已存在 |
201130 | group config.ini already exists | 群组的配置文件已存在 |
201131 | group genesis conf not found | 未找到群组创世块文件 |
201132 | group config.ini not found | 未找到群组的配置文件 |
201133 | group is stopping | 群组正在停止 |
201134 | group not deleted | 群组未删除 |
201151 | Unsupported contract param type to encoded | 不支持编码的合约参数类型 |
201152 | Unsupported contract param type to decoded | 不支持解码的合约参数类型 |
201153 | unable to create instance of type, check input params | 无法创建该合约参数类型的实例,请检查入参 |
201154 | contract path is exists. | 合约路径已存在 |
201155 | contract path cannot be empty | 合约路径不能为空 |
201156 | Write front's sdk cert and key fail | 导出SDK证书私钥文件失败,写入文件失败 |
201157 | Write private key file fail | 导出私钥文件失败,写入文件失败 |
201200 | params not fit | 参数不符合要求 |
201201 | address is invalid | 账户地址不正确 |
201202 | permission denied, please check chain administrator permission | 权限不足,请检查用户 |
201208 | unsupported for this system config key | 不支持设置该系统配置 |
201209 | provide value by positive integer mode, from 100000 to 2147483647 | 请输入正值或[100000, 2147483647]范围的值 |
201210 | set system config value fail for params error or permission denied | 设置系统配置失败,请检查权限 |
201211 | query system config value list fail | 获取系统配置列表失败 |
201216 | node id is invalid | 节点id错误 |
201217 | invalid node type: sealer, observer, remove | 节点类型(共识状态)错误:sealer, observer, remove |
201218 | set node consensus type fail, check permission or node's group config file | 节点类型(共识状态)修改失败,请检查权限或节点群组配置文件 |
201221 | Contract version should only contains 'A-Z' or 'a-z' or '0-9' or dot mark | CNS合约版本号应只包含大小写字母、数字和"." |
201222 | version of contract is out of length | 合约版本号过长 |
201223 | cns register fail | cns注册失败 |
201224 | version not exists | 版本不存在 |
201225 | cns name cannot be empty | cns名不能为空 |
201226 | sql syntax error | sql语句错误 |
201227 | crud sql fail | 执行sql语句失败 |
201228 | table not exists | 操作的表格不存在 |
201231 | Cert file not found, please check cert path in config | 配置文件中的证书地址错误,未找到证书文件 |
201232 | Pem file format error, must surrounded by -----XXXXX PRIVATE KEY----- | pem证书格式错误,必须以"-----XXXXX PRIVATE KEY-----"开头结尾 |
201233 | Pem file content error | pem证书内容错误 |
201235 | p12's password cannot be chinese | p12证书密码不能是中文 |
201236 | p12's password not match | p12证书密码错误 |
201237 | P12 file content error | p12证书内容错误 |
201241 | Exchange or message queue not exists, please check mq server or mq configuration | 交换机或消息队列不存在,请检查mq-server运行状态及其配置 |
201242 | Database error: data already exists in db | 数据库错误:该数据记录已存在于数据库中 |
201243 | Block range error, from/toBlock must greater than 0, toBlock must be greater than fromBlock | 合约Event区块范围错误,from大于0,to大于from |
201244 | Database error: data not exists in db, please check your params | 该数据记录不存在,请检查参数 |
201245 | Only support letter and digit, please check your params | 仅支持使用数字字母与下划线,请检查参数 |
201246 | Register contractEvent failed, please check your param | 订阅合约事件失败,请检查参数格式 |
201247 | Unregister event failed, please check mq server exchange | 取消订阅事件失败,请检查参数格式 |
201248 | Contract abi invalid, please check abi | 合约ABI格式错误,请检查入参 |
201255 | contract address already exists | 合约地址已存在 |
201256 | abi info of this id not exists | abi不存在 |
201301 | threshold must be greater than zero | 链阈值必须大于0 |
201302 | committee weight must be greater than zero | 链委员权重必须大于0 |
201303 | chain governance address cannot be blank | 链管理委员/运维地址不能为空 |
201311 | get event callback fail for time out | 获取event回调超时 |
201312 | get event callback error | 获取event回调失败 |
201501 | web3sdk create key pair fail and return null | sdk创建私钥对失败并返回Null |
201502 | pem/p12 manager get key pair error for input params | pem/p12证书获取私钥对失败,检查入参 |
201503 | pem/p12 manager get key pair error for bc dependency error | pem/p12证书获取私钥对失败,检查bc依赖包版本 |
201504 | sign service return error | 签名服务并返回异常 |
201510 | transaction receipt status return error | 交易回执状态码非0x0,交易执行失败 |
201511 | contract abi parse json error | 合约ABI转JSON失败 |
201512 | call contract error for io exception | 调用合约的交易上链失败 |
201513 | get transaction receipt fail for exec | 获取交易回执失败,返回执行错误 |
201514 | get transaction receipt fail for time out | 获取交易回执失败,链上链下请求超时 |
201515 | transaction receipt fail and parse output fail | 转化交易回执中output输出值失败 |
201516 | transaction receipt fail and output is null | 交易回执output为空 |
201517 | call contract constant method fail | 合约状态异常,调用合约constant方法失败 |
201518 | get message's hash fail | 获取哈希失败 |
201521 | get list of manager on chain fail | 获取链上管理员列表失败 |
201522 | table key length error | 用户表的键值长度大于最大值255 |
201523 | crud's param parse json error | CRUD方法的入参转Entry/Condition失败,请检查入参 |
201524 | precompiled common transfer to json fail | 预编译错误码转JSON失败 |
2. Precompiled Service说明¶
对预编译合约接口的使用有疑惑,可以查看FISCO BCOS的PreCompiledService API说明
查看预编译合约的solidity接口代码,可以查看FISCO BCOS的web3sdk precompile模块,如crud/TableFactory.sol:
pragma solidity ^0.4.2;
contract TableFactory {
function createTable(string tableName, string key, string valueField) public returns (int);
}
查看FISCO BCOS中实现的precompild合约列表、地址分配及源码:
地址 | 功能 | 源码(libprecompiled目录) |
---|---|---|
0x1000 | 系统参数管理 | SystemConfigPrecompiled.cpp |
0x1001 | 表工厂合约 | TableFactoryPrecompiled.cpp |
0x1002 | CRUD合约 | CRUDPrecompiled.cpp |
0x1003 | 共识节点管理 | ConsensusPrecompiled.cpp |
0x1004 | CNS功能 | CNSPrecompiled.cpp |
0x1005 | 存储表权限管理 | AuthorityPrecompiled.cpp |
0x1006 | 并行合约配置 | ParallelConfigPrecompiled.cpp |
Precompiled Service API 错误码
错误码 | 消息内容 | 备注 |
---|---|---|
0 | success | |
-50000 | permission denied | |
-50001 | table name already exist | |
-50100 | unknow function call | |
-50101 | table does not exist | |
-51000 | table name and address already exist | |
-51001 | table name and address does not exist | |
-51100 | invalid node ID | SDK错误码 |
-51101 | the last sealer cannot be removed | |
-51102 | the node is not reachable | SDK错误码 |
-51103 | the node is not a group peer | SDK错误码 |
-51104 | the node is already in the sealer list | SDK错误码 |
-51105 | the node is already in the observer list | SDK错误码 |
-51200 | contract name and version already exist | SDK错误码 |
-51201 | version string length exceeds the maximum limit | SDK错误码 |
-51300 | invalid configuration entry | |
-51500 | contract name and version already exist | |
-51501 | condition parse error | |
-51502 | condition operation undefined | |
-51600 | invalid ciphers | |
-51700 | group sig failed | |
-51800 | ring sig failed | |
-51900 | contract frozen | |
-51901 | contract available | |
-51902 | contract repeat authorization | |
-51903 | invalid contract address | |
-51904 | table not exist | |
-51905 | no authorized | |
-52000 | committee member exist | |
-52001 | committee member not exist | |
-52002 | invalid request permission denied | |
-52003 | invalid threshold | |
-52004 | operator can't be committee member | |
-52005 | committee member can't be operator | |
-52006 | operator exist | |
-52007 | operator not exist | |
-52008 | account not exist | |
-52009 | invalid account address | |
-52010 | account already available | |
-52011 | account frozen | |
-52012 | current value is expected value |
升级说明¶
WeBASE-Front升级的兼容性说明,请结合WeBASE-Front Changelog进行阅读
WeBASE-Front升级的必须步骤:
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 采用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 bash stop.sh && bash start.sh
重启
各个版本的具体修改可参考下文
v1.4.3¶
- 新增了合约仓库、在线工具、支持CNS
v1.4.2¶
- 新增了合约EventLog查询功能
v1.4.1¶
- 新增链权限ChainGovernance接口
- 新增getBlockHeaderByHash与getBlockHeaderByNumber接口
v1.4.0¶
- 增加返回 WeBASE-Front 和 WeBASE-Sign 版本号接口
v1.3.2¶
- 移除Fastjson,替换为Jackson 2.11.0。
- 升级web3sdk为2.4.1,并升级springboot等依赖项
v1.3.1¶
- 新增动态群组接口,包含生成群组、启动/停止群组、删除/恢复群组、单个/批量查询群组状态等接口
注:动态群组操作指南可参考动态群组操作指南,接口详情可参考接口文档
- 前置的“合约管理”Tab中,新增导入合约abi功能,可以导入已部署的合约进行管理
- 前置的“合约管理”Tab中,新增合约ABI编码功能,可用于构造交易input入参
- 私钥管理中,支持导入控制台所导出的.p12私钥;
v1.3.0¶
私钥管理修改¶
- 节点前置Web页面中的私钥管理转移至合约管理Tab下,改为测试用户管理
WeBASE-Front本地私钥仅用于本地的合约调试,不建议用于生产;因此Web页面中的私钥管理转移至合约管理Tab下,改为测试用户管理;
在WeBASE-Front的Web页面部署合约、发交易时所使用的私钥均为本地私钥,与WeBASE-Node-Manager私钥区分开;
节点管理与前置私钥模块调整¶
- WeBASE-Node-Manager的私钥将通过WeBASE-Sign托管(新建私钥、保存私钥和交易签名),不再由WeBASE-Front生成和保存(仅保存公钥与地址);
- 节点管理WeBASE-Node-Manager v1.3.0前通过节点前置WeBASE-Front的
/trans/handle
和/contract/deploy
进行合约交易与部署,v1.3.0后将通过/trans/handleWithSign
接口和/contract/deployWithSign
接口进行合约部署与交易
生成私钥的流程(此处为type=2的外部私钥,WeBASE-Front的私钥始终留在Front的数据库中)
使用sign生成私钥的流程
交易签名的流程
使用sign交易签名的流程
因此WeBASE-Node-Manager私钥数据需要转移到WeBASE-Sign数据库中,具体操作请参考WeBASE-Node-Manager v1.3.0升级说明
API字段更新¶
- WeBASE-Front的
/trans/handleWithSign
接口和/contract/deployWithSign
接口传参修改如下;
/trans/handleWithSign
接口:
{
"groupId" :1,
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3",
"contractAbi":[],
"contractAddress":"0x14d5af9419bb5f89496678e3e74ce47583f8c166",
"funcName":"set",
"funcParam":["test"]
}
/contract/deployWithSign
接口
{
"groupId":1,
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3",
"bytecodeBin":"xxx",
"abiInfo": [],
"funcParam":[]
}
- WeBASE-Front的所有接口中
useAes
字段将默认为true
,即私钥默认采用aes加密保存,调用时可不传入useAes
;
v1.2.3¶
修复api中的合约Bin字段¶
修复了WeBASE-Front接口中contractBin
与bytecodeBin
字段的bug
contractBin
是指合约编译后的运行时二进制码(runtime-bin),多用于交易解析用bytecodeBin
是指合约编译的完整二进制码(bytecode bin),一般用于部署合约
将部分接口的contractBin
字段修改为bytecodeBin
字段,修改的接口包含contract/deployWithSign
,共1个;
其余包含以上两个字段的接口,均在接口文档中丰富了字段说明,方便区分
支持链上事件订阅和通知¶
在某些业务场景中,应用层需要实时获取链上的事件,如出块事件、合约Event事件等。应用层通过WeBASE连接节点后,由于无法和节点直接建立长连接,难以实时获取链上的消息。
为了解决这个问题,应用层可通过WeBASE-Front订阅链上事件,当事件触发时,可通过RabbitMQ消息队列通知到应用层,架构如下:
链上事件通知架构
启用消息队列的事件推送服务,需要以下几步操作:
- 安装RabbitMQ Server,启动mq服务,并确保RabbitMQ Server服务所在服务器的
5672
,15672
端口可访问; - 启用RabbitMQ的
rabbitmq_managerment
功能,(在mq服务所在主机中运行rabbitmq-plugins enable rabbitmq_management
); - 配置
application.yml
中spring-rabbitmq
项,通过host
,port
连接mq server, 且username
,password
有足够权限配置管理mq服务;
注:需要在build.gradle的dependencies中添加org.springframework.boot:spring-boot-starter-amqp:1.5.9.RELEASE
的依赖
WeBASE-Front默认不启用事件消息推送功能,如需启用请参考附录-链上事件订阅和通知
附录¶
1. 安装问题¶
1.1 Java部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
2. 常见问题¶
1:执行shell脚本报错误”permission denied”或格式错误
赋权限:chmod + *.sh 转格式:dos2unix *.sh
2:eclipse环境编译源码失败,错误提示如下:
...
/data/temp/WeBASE-Front/src/main/java/com/webank/webase/front/performance/PerformanceService.java:167: error: cannot find symbol
log.info("begin sync performance");
^
symbol: variable log
location: class PerformanceService
Note: /data/temp/WeBASE-Front/src/main/java/com/webank/webase/front/contract/CommonContract.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
100 errors
> Task :compileJava FAILED
FAILURE: Build failed with an exception.
...
答:问题是不能编译Lombok注解 ,修改build.gradle文件,将以下代码的注释加上
//annotationProcessor 'org.projectlombok:lombok:1.18.6'
3:节点运行一段时间后新增了一个群组,前置查不到新群组的信息。
答:调用 http://{ip}:{port}/WeBASE-Front/1/web3/refresh 方法,即可手动更新。
4:升级1.0.2版本时,数据库报错:
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "TYPE"; SQL statement: alter table key_store_info add column type integer not null [23502-197] at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) ~[h2-1.4.197.jar:1.4.197] at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.197.jar:1.4.197] at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.197.jar:1.4.197]
答:将H2数据库删除(在h2目录下),或者配置新数据库名,在 application.yml 文件中的配置如下:
spring: datasource: url: jdbc:h2:file:./h2/webasefront;DB_CLOSE_ON_EXIT=FALSE // 默认H2库为webasefront ...
5:日志报以下错误信息:
2019-08-08 17:29:05.505 [pool-11-thread-1] ERROR TaskUtils$LoggingErrorHandler() - Unexpected error occurred in scheduled task. org.hyperic.sigar.SigarFileNotFoundException: 没有那个文件或目录 at org.hyperic.sigar.FileSystemUsage.gather(Native Method) ~[sigar-1.6.4.jar:?] at org.hyperic.sigar.FileSystemUsage.fetch(FileSystemUsage.java:30) ~[sigar-1.6.4.jar:?] at org.hyperic.sigar.Sigar.getFileSystemUsage(Sigar.java:667) ~[sigar-1.6.4.jar:?]
答:监控目录不存在,需配置节点所在磁盘目录,在 application.yml 文件中的配置如下:
... constant: monitorDisk: / // 要监控的磁盘目录,配置节点所在目录(如:/home) ...
6:启动报错“nested exception is javax.net.ssl.SSLException”:
...
nested exception is javax.net.ssl.SSLException: Failed to initialize the client-side SSLContext: Input stream not contain valid certificates.
答:CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK无法正常连接区块链节点,因此在使用CentOS操作系统时,推荐使用OracleJDK。
- 7:启动报错“Processing bcos message timeout”
...
[main] ERROR SpringApplication() - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractController': Unsatisfied dependency expressed through field 'contractService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractService': Unsatisfied dependency expressed through field 'web3jMap'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'web3j' defined in class path resource [com/webank/webase/front/config/Web3Config.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.HashMap]: Factory method 'web3j' threw exception; nested exception is java.io.IOException: Processing bcos message timeout
...
答:一些OpenJDK版本缺少相关包,导致节点连接异常。推荐使用OracleJDK。
- 8:启动失败,日志却没有异常
===============================================================================================
Starting Server com.webank.webase.front.Application Port 5002 ................................[Failed]. Please view log file (default path:./log/).
Because port 5002 not up in 20 seconds.Script finally killed the process.
===============================================================================================
答:确认机器是否满足硬件要求。机器性能过低会导致服务端口一定时间内没起来,脚本会自动杀掉进程。可以尝试手动修改dist目录下的start.sh脚本,将启动等待时间设置久一点(默认600,单位:秒),然后启动。
...
startWaitTime=600
...
- 9:启动报错SSLContext: null
答:确保conf/
目录下包含sdk证书;
若使用的是v1.5.0以前的版本,则需要保证ca.crt, node.crt, node.key
;其中node.crt, node.key为sdk.crt, sdk.key复制并重命名得到;若使用v1.5.0及以上版本,则需要复制链的sdk目录下的所有文件(ca.crt, sdk.crt, sdk.key及gm文件夹)到前置服务的conf
目录
3. 使用说明¶
测试用户管理¶
3.1. 导入私钥¶
支持txt文件和pem文件导入测试用户的私钥信息
导入.txt私钥内容格式示例:
{
"address":"0x06f81c8e1cb59b5df2cdeb87a212d17fba79aad7",
"publicKey":"0x4b1041710a4427dc1c0d542c8f0fd312d92b0d03a989f512d1f8d3cafb851967f3592df0035e01fa63b2626165d0f5cffab15792161aa0360b8dfba2f3a7cf59",
"privateKey":"71f1479d9051e8d6b141a3b3ef9c01a7756da823a0af280c6bf62d18ee0cc978", // 十六进制
"userName":"111",
"type":0 // type为0,不可修改
}
其中用户类型为0代表用户为WeBASE-Front的本地私钥用户,导入的私钥均为该类型;
导入.pem私钥内容示例:
-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgC8TbvFSMA9y3CghFt51/
XmExewlioX99veYHOV7dTvOhRANCAASZtMhCTcaedNP+H7iljbTIqXOFM6qm5aVs
fM/yuDBK2MRfFbfnOYVTNKyOSnmkY+xBfCR8Q86wcsQm9NZpkmFK
-----END PRIVATE KEY-----
其中pem文件开头的-----BEGIN PRIVATE KEY-----\n
和结尾的\n-----END PRIVATE KEY-----\n
格式不可更改,否则将读取pem文件失败
3.2. 导出私钥¶
目前仅支持导出测试用户的txt格式私钥
Java中如何使用导出的私钥
以上文中的私钥加载:
基于javasdk的私钥加载:
@Test
public void testCrypto() {
// 1-国密,0-ECDSA
CryptoSuite cryptoSuite = new CryptoSuite(1);
CryptoKeyPair keyPair = cryptoSuite.createKeyPair("e843a542a7a8240f9c9e418b9517c2c8f4dc041a11a44e614a3b026c3588c188");
System.out.println("privateKey: " + keyPair.getHexPrivateKey());
System.out.println("address: " + keyPair.getAddress());
System.out.println("publicKey: " + keyPair.getHexPublicKey());
}
基于web3sdk的私钥加载:
@Test
public void loadPrivateKeyTest() {
CryptoSuite
String privateKey = "71f1479d9051e8d6b141a3b3ef9c01a7756da823a0af280c6bf62d18ee0cc978";
Credentials credentials = GenCredential.create(privateKey);
// private key 实例
BigInteger privateKeyInstance = credentials.getEcKeyPair().getPrivateKey();
System.out.println(Numeric.toHexStringNoPrefix(privateKeyInstance));
// public key 实例
BigInteger publicKeyInstance = credentials.getEcKeyPair().getPublicKey();
System.out.println(Numeric.toHexString(publicKeyInstance));
// address 地址
String address = credentials.getAddress();
System.out.println(address);
}
在IDE中开发WeBASE-Front¶
IDE配置
- 由于项目依赖了lombok,需要在settings-build-compiler的
Enable Annotation Processing
设置中打钩 - 本项目使用gradle进行构建,可以在settings-build-build tools-gradle中设置本地的gradle环境
证书与项目配置
- 需要在资源目录中创建
conf
目录 - 将sdk中的所有证书文件拷贝到
resources/conf
目录 - 修改application.yml中的
sdk.ip
和sdk.channelPort
访问h2数据库¶
WeBASE-Front采用 JPA + H2数据库 的方式保存数据
- 源码查看各个数据表的内容:需要通过查看WeBASE-Front源码的各个包中带有
@Entity
注解的entity实体类;如,查看私钥数据表KeyStoreInfo
则查看该文件com.webank.webase.front.keystore.entity.KeyStoreInfo.java
- 通过H2控制台连接H2数据库:
- 同机H2访问:可以通过浏览器打开
localhost:5002/WeBASE-Front/console
,以默认配置为例填入连接参数JDBC URL
应填入file:../h2/webasefront;
,与前置服务的application.yml中配置的spring.datasource.url
对应- 若未设置用户名与密码,则默认用户名为
sa
,密码为空
- 服务端H2访问:
- 修改前置服务的application.yml中的
spring.h2.console.settings.web-allow-others
设为true
,允许远端访问H2控制台 - 重启前置服务
- 访问
{ip}:{port}/WeBASE-Front/console
,参数填入方法同上
- 修改前置服务的application.yml中的
4. 支持链上事件订阅和通知¶
在某些业务场景中,应用层需要实时获取链上的事件,如出块事件、合约Event事件等。应用层通过WeBASE连接节点后,由于无法和节点直接建立长连接,难以实时获取链上的消息。
支持通过消息队列(Message Queue)来获取WeBASE-Front(v1.2.3+)的链上事件的消息推送
目前支持出块事件与智能合约Event事件的事件Push通知,大致流程为:
- WeBASE-Front连接到MQ-Server(目前支持RabbitMQ-Server);
- WeBASE-Front接收节点的事件Push后,如出块通知,WeBASE-Front将出块消息发送到消息队列中;
- 区块链应用连接MQ-Server,获取消息队列中待消费的消息,即可获得事件通知;
下面介绍如何搭建RabbitMQ的消息队列服务与WeBASE-Front的配置方法
4.1 RabbitMQ消息队列事件通知¶
安装RabbitMQ服务并启用管理功能¶
启用消息队列的事件推送服务,需要
- 安装RabbitMQ Server
参考RabbitMQ官网的下载与安装教程,安装并启动RabbitMQ-Server服务
注:RabbitMQ依赖Erlang环境,可根据官网教程安装Erlang
- 启动mq服务,并确保RabbitMQ Server服务所在主机的
5672
,15672
端口可访问; - 启用RabbitMQ的
rabbitmq_managerment
功能
启用该功能可通过访问localhost:15672
页面,可视化管理MQ的队列与用户;否则,需要通过rabbitmqctl命令行工具管理;
启用方法:服务启动后,在mq所在主机运行以下命令,命令行显示启用成功即可:
rabbitmq-plugins enable rabbitmq_management
添加RabbitMQ管理员账户¶
若启用了rabbitmq_managerment
的功能,可在浏览器访问mq服务所在主机的ip:15672
端口,如访问本机localhost:15672
通过默认用户guest
(密码也为guest
)登录管理页,在Web页面上方的Admin
项中,选择add user
,新增tag为Administrator
的管理员用户
注:
可通过RabbitMQ的命令行工具,添加管理员账户(Administrator
),具体可参考rabbitmqctl文档
guest用户不支持远程登录Web管理页,如需远程登录管理页面,需要通过rabbitmqctl新增一个管理员用户
WeBASE-Front的配置¶
通过配置applcation.yml中spring-rabbitmq
项,WeBASE-Front即可连接到RabbitMQ-Server,将出块通知与合约Event通知推送到消息队列中:
需要配置mq服务所在主机与管理员账户密码
spring:
datasource:
...
jpa:
...
h2:
...
rabbitmq:
host: 127.0.0.1 # rabbitmq部署所在主机的ip
port: 5672 # rabbitmq默认连接端口
username: defaultAccount # 要求具有Administrator权限的用户,本地连接rabbitmq可用guest账户
password: defaultPassword
virtual-host: defaultVirtualHost # 消息队列和Exchange所在虚拟节点,默认为空或"/"
publisher-confirm: true # 消息发布确认开启
ssl:
enabled: false # 是否启用ssl连接,默认false
客户端(区块链应用/消息消费者)使用说明¶
- 申请账号:客户端用户提供自己客户端应用编号appId,向mq-server运维管理员申请MQ服务的账号(可设置账户名和密码、virtual host)。
- 创建队列与赋予权限:运维管理员创建账号后,管理员以用户提供的客户端应用的
appId
为名字,创建一个该账户专属的队列,然后赋予该账户read其专属队列的权限( permission-read中设置)。 - 客户端连接到MQ:用户根据运维管理员提供的MQ账户名和密码、virtual host、消息交换机名(exchangeName),将自己的区块链应用连接到相应队列中,获取消息推送。
下面简单展示运维管理员通过RabbitMQ的Web工具管理MQ服务:
创建MQ账户:
创建MQ账户
赋予MQ账户访问appId队列的read权限:
赋予read权限
创建以appId命名的队列
创建appId队列
- 客户端调用WeBASE-Front节点前置服务接口(
/event/newBlockEvent
和event/contractEvent
),注册事件监听;接口内容请查看接口文档-事件通知
用户调用注册事件接口之后,实际上WeBASE-Front将以appId+事件名+{randomString}
的routingKey,将用户所拥有的的队列Queue绑定到对应的Exchange中:
appId队列绑定到群组Exchange
- 用户在客户端以用户名密码连接到对应的virtual host,监听自己队列的消息,接收到消息后解析处理;
客户端获取事件通知过程需如上进行配置,可参考WeBASE-Event-Client的消费者客户端的代码实现(Dev分支)
消费者客户端核心代码逻辑为:
@RabbitListener(queues = "${spring.rabbitmq.username}")
public void receive(Channel channel, Message message) throws IOException {
log.info("++++++++ mq message body: {}, queue:{}", new String(message.getBody()),
message.getMessageProperties());
try {
String bodyStr = new String(message.getBody());
JSONObject json = JSONObject.parseObject(bodyStr);
...
// 处理json消息体
} catch (Exception e) {
log.error("++++++++ mq 消息消费失败:id:{} Exception: {}", message.getMessageProperties().getDeliveryTag(), e);
...
}
...
}
5. 配置文件解析¶
- 配置文件解析
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5002 | 当前服务端口 |
server.context-path | /WeBASE-Front | 当前服务访问目录 |
server.connection-timeout | 30000 | 服务连接超时时间ms |
server.tomcat.max-threads | 200 | tomcat最大线程数 |
server.tomcat.max-connections | 10000 | tomcat最大连接数 |
sdk.orgName | orgTest | sdk中默认的机构名 |
sdk.corePoolSize | 50 | sdk的core线程池大小 |
sdk.maxPoolSize | 100 | sdk的线程池最大值 |
sdk.queueCapacity | 100 | sdk请求队列最大长度 |
sdk.timeout | 10000 | sdk处理请求的超时时间ms |
sdk.keepAlive | 60 | sdk最大连接数 |
sdk.ip | 127.0.0.1 | 节点的ip |
sdk.channelPort | 20200 | 节点的channel端口 |
sdk.encryptType | 0 | 链的加密类型:0-ECDSA,1-国密 |
logging.config | classpath:log4j2.xml | logging配置文件的位置 |
constant.keyServer | 127.0.0.1:5004 | webase-sign服务的IP:Port(单个) |
constant.transMaxWait | 30 | 交易最大等待时间(s) |
constant.monitorDisk | / | 节点主机监控的路径 |
constant.monitorEnabled | true | 是否启用节点主机监控服务 |
constant.aesKey | EfdsW23D23d3df43 | webase服务的aes秘钥 |
constant.nodePath | /fisco/nodes/127.0.0.1/node0 | 节点路径 |
constant.http_read_timeOut | 100000 | 访问服务的读取超时(ms) |
constant.http_connect_timeOut | 100000 | 访问服务的连接超时(ms) |
constant.eventRegisterTaskFixedDelay | 5000 | 事件推送注册的频率(ms) |
constant.syncEventMapTaskFixedDelay | 60000 | 事件推送内存的同步频率(ms) |
constant.syncStatLogTime | 5000 | 节点日志监控频率(ms) |
constant.syncStatLogCountLimit | 10000 | 节点日志监控数据最大值 |
constant.statLogEnabled | false | 是否启用节点日志监控 |
constant.eventCallbackWait | 10 | 获取event log的超时时间(秒) |
节点管理服务¶
概要介绍¶
1. 功能说明¶
WeBASE-Node-Manager可以是处理前端页面所有web请求,管理各个节点的状态,管理链上所有智能合约,对区块链的数据进行统计、分析,对异常交易的审计,私钥管理等,含有如下功能模块:
序号 | 模块 | 描述 |
---|---|---|
1 | 前置管理模块 | 维护关联WeBASE-Front服务信息 |
2 | 交易信息模块 | 查看交易信息 |
3 | 帐号管理模块 | 维护系统登录账号信息 |
4 | 区块管理模块 | 查看区块信息 |
5 | 合约管理模块 | 维护合约信息 |
6 | 服务器监控 | 监控节点服务器状态与邮件告警 |
7 | 审计模块 | 查看异常合约及异常用户信息 |
8 | 群组信息模块 | 查看群组信息 |
9 | 节点管理模块 | 查看节点信息 |
10 | 角色管理模块 | 查看系统登录用户的角色信息 |
11 | 用户管理模块 | 维护密钥信息 |
12 | 合约方法管理模块 | 维护合约abi文件中所包含的的方法信息 |
13 | 系统管理模块 | 预编译API,包含权限管理,节点管理,CNS管理等信息 |
14 | 证书管理模块 | 查看sdk证书、节点证书等信息 |
15 | 订阅事件模块 | 查看已订阅的链上事件通知信息 |
16 | 可视化部署模块 | 可视化部署底层区块链服务以及节点的管理 |
17 | 应用管理模块 | 维护应用接入信息 |
2. 国密支持¶
WeBASE-Node-Manager v1.2.2+已支持 国密版FISCO-BCOS,使用WeBASE-Front v1.2.2及以上版本
WeBASE-Node-Manager具体需要适配国密版FISCO-BCOS与WeBASE-Front的地方有:
- 在配置文件
application.yml/applicationContext.xml
中开启web3sdk的国密开关; - 国密版部署初始化数据库时,执行国密版的初始化脚本
script/gm/webase-gm.sh
;
安装详情可查看下一章节的WeBASE-Node-Manager部署说明
部署说明¶
1. 前提条件¶
序号 | 软件 |
---|---|
1 | FISCO-BCOS 2.0 |
2 | WeBASE-Front 对应版本 |
3 | MySQL5.6或以上版本 |
4 | Java8或以上版本 |
2. 注意事项¶
通过WeBASE-Sign私钥管理 WeBASE-Node-Manager v1.3.0+将通过WeBASE-Sign进行私钥管理,即使用WeBASE-Node-Manager v1.3.0+的版本需要同步安装WeBASE-Sign v1.3.0,详情可参考升级文档进行阅读
国密支持:
WeBASE-Node-Manager v1.2.2+已支持 国密版FISCO-BCOS,与WeBASE-Front v1.2.2+配合使用
重要
使用国密版WeBASE-Node-Manager需要开启web3sdk的国密开关和script/gm中的webase-gm.sh脚本进行数据库初始化
开启web3sdk的国密开关:
- 将配置文件
application.yml/applicationContext.xml
中web3sdk配置的encryptType
从0
修改为1
;
部署时初始化数据库:
- 执行
dist/script/gm
中的webase-gm.sh脚本进行初始化,而非dist/script
中的webase.sh,;
3. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Node-Manager.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Node-Manager.git
进入目录:
cd WeBASE-Node-Manager
4. 编译代码¶
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Node-Manager下生成已编译的代码目录dist。
5. 数据库初始化¶
5.1 新建数据库¶
#登录MySQL:
mysql -u ${your_db_account} -p${your_db_password} 例如:mysql -u root -p123456
#新建数据库:
CREATE DATABASE IF NOT EXISTS {your_db_name} DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
5.2 修改脚本配置¶
进入数据库脚本目录
cd dist/script
如果使用国密版,应进入dist/script/gm目录,对/gm目录下的webase-gm.sh进行下文的操作(即`sed`操作`/gm/webase-gm.sh`),并在最后运行webase-gm.sh
修改数据库连接信息:
修改数据库名称:sed -i "s/webasenodemanager/${your_db_name}/g" webase.sh
修改数据库用户名:sed -i "s/defaultAccount/${your_db_account}/g" webase.sh
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" webase.sh
例如:将数据库用户名修改为root,则执行:
sed -i "s/defaultAccount/root/g" webase.sh
6. 服务配置及启停¶
6.1 服务配置修改¶
(1)回到dist目录,dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改服务配置:
修改服务端口:sed -i "s/5001/${your_server_port}/g" conf/application.yml
修改数据库IP:sed -i "s/127.0.0.1/${your_db_ip}/g" conf/application.yml
修改数据库端口:sed -i "s/3306/${your_db_port}/g" conf/application.yml
修改数据库名称:sed -i "s/webasenodemanager/${your_db_name}/g" conf/application.yml
修改数据库用户:sed -i "s/defaultAccount/${your_db_account}/g" conf/application.yml
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" conf/application.yml
备注:
- 如果使用国密版本,则将application.yml中
sdk-encryptType
由0
改为1
- 如果使用可视化部署,则将application.yml中
constant-deployType
由0
改为1
,并设置constant-webaseSignAddress
为当前的webase-sign路径。具体使用方法可以参考可视化部署-手动部署
6.2 服务启停¶
在dist目录下执行:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
6.3 查看日志¶
在dist目录查看:
全量日志:tail -f log/WeBASE-Node-Manager.log
错误日志:tail -f log/WeBASE-Node-Manager-error.log
接口说明¶
1 前置管理模块¶
1.1 新增节点前置信息¶
1.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /front/new
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontIp | string | 否 | 前置ip |
2 | frontPort | int | 否 | 前置服务端口 |
3 | agency | int | 否 | 所属机构 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/front/new
{
"frontIp": "127.0.0.1",
"frontPort": "5002",
"agency": "abc"
}
1.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 节点信息对象 | |
3.1 | frontId | int | 否 | 前置编号 |
3.2 | frontIp | string | 否 | 前置ip |
3.3 | frontPort | int | 否 | 前置端口 |
3.4 | agency | string | 否 | 所属机构 |
3.5 | createTime | LocalDateTime | 否 | 落库时间 |
3.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"frontId": 500001,
"frontIp": "127.0.0.1",
"frontPort": 8181,
"agency": "abc",
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.2 获取所有前置列表¶
1.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/find?frontId={frontId}&groupId={groupId}
- 请求方式:GET
- 返回格式:JSON
1.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 是 | 前置编号 |
2 | groupId | Int | 是 | 所属群组编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/front/find
1.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | frontId | int | 否 | 前置编号 |
4.1.2 | frontIp | string | 否 | 前置ip |
4.1.3 | frontPort | int | 否 | 前置端口 |
4.1.4 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.5 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.6 | agency | string | 否 | 备注所属机构 |
4.1.7 | frontVersion | string | 否 | 前置的后台版本,如: v1.4.0 |
4.1.8 | signVersion | string | 否 | 前置所连接签名服务的后台版本,如: v1.4.0 |
4.1.9 | clientVersion | string | 否 | 链节点的版本,如: 2.5.0 gm |
4.1.10 | supportVersion | string | 否 | 链节点所支持的最高版本, 如: 2.5.0, (此处仅显示支持的最高版本,不显示是否为国密。若从2.4.0升级到2.5.0,此处将返回2.4.0) |
4.1.11 | status | int | 否 | 前置服务状态:0,未创建;1,停止;2,启动; |
4.1.12 | runType | int | 否 | 运行方式:0,命令行;1,Docker |
4.1.13 | agencyId | int | 否 | 所属机构 ID |
4.1.14 | agencyName | string | 否 | 所属机构名称 |
4.1.15 | hostId | int | 否 | 所属主机 |
4.1.16 | hostIndex | int | 否 | 一台主机可能有多个节点。表示在主机中的编号,从 0 开始编号 |
4.1.17 | imageTag | string | 否 | 运行的镜像版本标签 |
4.1.18 | containerName | string | 否 | Docker 启动的容器名称 |
4.1.19 | jsonrpcPort | int | 否 | jsonrpc 端口 |
4.1.20 | p2pPort | int | 否 | p2p 端口 |
4.1.21 | channelPort | int | 否 | channel 端口 |
4.1.22 | chainId | int | 否 | 所属链 ID |
4.1.23 | chainName | string | 否 | 所属链名称 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontId": 500001,
"frontIp": "127.0.0.1",
"frontPort": 5002,
"agency": "aa",
"frontVersion": "v1.4.0",
"signVersion": "v1.4.0",
"clientVersion": "2.5.0 gm",
"supportVersion": "2.5.0",
"createTime": "2019-06-04 20:49:42",
"modifyTime": "2019-06-04 20:49:42",
"status": 1,
"runType": 1,
"agencyId": 1,
"agencyName": "AgencyA",
"hostId": 1,
"hostIndex": 0,
"imageTag": "v2.5.0",
"containerName": "rootfisconode0",
"jsonrpcPort": 8545,
"p2pPort": 30300,
"channelPort": 20200,
"chainId": 1,
"chainName": "default_chain"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.3 删除前置信息¶
1.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/{frontId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | int | 否 | 前置编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/front/500001
1.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.4 刷新前置信息¶
1.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/refresh
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
1.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2 交易信息模块¶
2.1 查询交易信息列表¶
2.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/transaction/transList/{groupId}/{pageNumber}/{pageSize}?transactionHash={transactionHash}&blockNumber={blockNumber}
- 请求方式:GET
- 返回格式:JSON
2.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | transactionHash | String | 是 | 交易hash |
3 | blockNumber | BigInteger | 是 | 块高 |
4 | pageSize | int | 否 | 每页记录数 |
5 | pageNumber | int | 否 | 当前页码 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/transaction/transList/300001/1/10?transactionHash=0x303daa78ebe9e6f5a6d9761a8eab4bf5a0ed0b06c28764488e4716de42e1df01
2.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 交易信息列表 |
4.1 | Object | 交易信息对象 | ||
4.1.1 | transHash | String | 否 | 交易hash |
4.1.2 | groupId | Int | 否 | 所属群组编号 |
4.1.3 | blockNumber | BigInteger | 否 | 所属块高 |
4.1.4 | statisticsFlag | Int | 否 | 是否已经统计 |
4.1.5 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"transHash": "0x303daa78ebe9e6f5a6d9761a8eab4bf5a0ed0b06c28764488e4716de42e1df01",
"groupId": 300001,
"blockNumber": 133,
"statisticsFlag": 1,
"createTime": "2019-03-15 09:36:17",
"modifyTime": "2019-03-15 09:36:17"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.2 查询交易回执¶
2.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/transaction/transactionReceipt/{groupId}/{transHash}
- 请求方式:GET
- 返回格式:JSON
2.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | transHash | String | 是 | 交易hash |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/transaction/transactionReceipt/1/0xda879949df6b5d75d2d807f036b461e0cebcc1abaccac119c9a282d3941a4818
2.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 交易信息对象 | ||
3.1 | transactionHash | String | 否 | 交易hash |
3.2 | transactionIndex | Int | 否 | 在区块中的索引 |
3.2 | blockHash | String | 否 | 区块hash |
3.3 | blockNumber | BigInteger | 否 | 所属块高 |
3.4 | cumulativeGasUsed | Int | 否 | |
3.5 | gasUsed | Int | 否 | 交易消耗的gas |
3.6 | contractAddress | String | 否 | 合约地址 |
3.7 | status | String | 否 | 交易的状态值 |
3.8 | from | String | 否 | 交易发起者 |
3.9 | to | String | 否 | 交易目标 |
3.10 | output | String | 否 | 交易输出内容 |
3.11 | logs | String | 否 | 日志 |
3.12 | logsBloom | String | 否 | log的布隆过滤值 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"transactionHash": "0xda879949df6b5d75d2d807f036b461e0cebcc1abaccac119c9a282d3941a4818",
"transactionIndex": 0,
"blockHash": "0x739853061c6c87ed691c0ee6f938589f7e2e442d42b16f582b353a475359b91d",
"blockNumber": 4311,
"cumulativeGasUsed": 0,
"gasUsed": 32940,
"contractAddress": "0x0000000000000000000000000000000000000000",
"status": "0x0",
"from": "0xe4bc056009daed8253008e03db6f62d93ccfacea",
"to": "0x522eda3fbe88c07025f1db3f7dc7d9836af95b3f",
"output": "0x",
"logs": [],
"logsBloom": "0x000000000000000000000000000000000000000",
"blockNumberRaw": "0x10d7",
"transactionIndexRaw": "0x0",
"statusOK": true,
"gasUsedRaw": "0x80ac"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.3 根据交易hash查询交易信息¶
2.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/transaction/transInfo/{groupId}/{transHash}
- 请求方式:GET
- 返回格式:JSON
2.3.2 参数信息详情¶
请求参数
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | transHash | String | 是 | 交易hash |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/transaction/transInfo/1/0xda879949df6b5d75d2d807f036b461e0cebcc1abaccac119c9a282d3941a4818
2.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 交易信息对象 | ||
3.1 | hash | String | 否 | 交易hash |
3.2 | transactionIndex | Int | 否 | 在区块中的索引 |
3.2 | blockHash | String | 否 | 区块hash |
3.3 | blockNumber | BigInteger | 否 | 所属块高 |
3.4 | cumulativeGasUsed | Int | 否 | |
3.5 | gasUsed | Int | 否 | 交易消耗的gas |
3.6 | contractAddress | String | 否 | 合约地址 |
3.7 | status | String | 否 | 交易的状态值 |
3.8 | from | String | 否 | 交易发起者 |
3.9 | to | String | 否 | 交易目标 |
3.10 | output | String | 否 | 交易输出内容 |
3.11 | logs | String | 否 | 日志 |
3.12 | logsBloom | String | 否 | log的布隆过滤值 |
3.13 | nonce | String | 否 | |
3.14 | value | String | 否 | |
3.15 | gasPrice | long | 否 | |
3.16 | gas | long | 否 | |
3.17 | input | String | 否 | |
3.18 | v | int | 否 | |
3.19 | nonceRaw | String | 否 | |
3.20 | blockNumberRaw | String | 否 | |
3.21 | gasPriceRaw | String | 否 | |
3.22 | gasRaw | String | 否 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"hash": "0xda879949df6b5d75d2d807f036b461e0cebcc1abaccac119c9a282d3941a4818",
"nonce": "600264747827990445399299219738839026203774909117379671331964756256186263529",
"blockHash": "0x739853061c6c87ed691c0ee6f938589f7e2e442d42b16f582b353a475359b91d",
"blockNumber": 4311,
"transactionIndex": 0,
"from": "0xe4bc056009daed8253008e03db6f62d93ccfacea",
"to": "0x522eda3fbe88c07025f1db3f7dc7d9836af95b3f",
"value": 0,
"gasPrice": 100000000,
"gas": 100000000,
"input": "0x4ed3885e000000000000000",
"v": 0,
"nonceRaw": "0x153bce0f26461030fe5189385b9c3e84336b007769a3849524ca3f4af7d67e9",
"blockNumberRaw": "0x10d7",
"transactionIndexRaw": "0x0",
"gasPriceRaw": "0x5f5e100",
"gasRaw": "0x5f5e100"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3 帐号管理模块¶
3.1 新增帐号¶
3.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/accountInfo
- 请求方式:post
- 请求头:Content-type: application/json
- 返回格式:JSON
3.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | account | String | 否 | 帐号名称 |
2 | accountPwd | String | 否 | 登录密码(sha256) |
3 | roleId | int | 否 | 所属角色 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/accountInfo
{
"account": "testAccount",
"accountPwd": "3f21a8490cef2bfb60a9702e9d2ddb7a805c9bd1a263557dfd51a7d0e9dfa93e",
"roleId": 100001
}
3.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
3.1 | account | String | 否 | 帐号 |
3.2 | roleId | Integer | 否 | 所属角色 |
3.3 | roleName | String | 否 | 角色名称 |
3.4 | roleNameZh | String | 否 | 角色中文名 |
3.5 | loginFailTime | Integer | 是 | 登录失败次数 |
3.6 | accountStatus | Integer | 否 | 帐号状态 |
3.7 | description | String | 是 | 备注 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"account": "testAccount",
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"loginFailTime": 0,
"accountStatus": 1,
"description": null,
"createTime": "2019-03-04 15:11:44",
"modifyTime": "2019-03-04 15:11:44"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.2 修改帐号¶
3.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/accountInfo
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
3.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | account | String | 否 | 帐号名称 |
2 | accountPwd | String | 否 | 登录密码(sha256) |
3 | roleId | int | 否 | 所属角色 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/accountInfo
{
"account": "testAccount",
"accountPwd": "82ca84cf0d2ae423c09a214cee2bd5a7ac65c230c07d1859b9c43b30c3a9fc80",
"roleId": 100001
}
3.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
3.1 | account | String | 否 | 帐号 |
3.2 | roleId | Integer | 否 | 所属角色 |
3.3 | roleName | String | 否 | 角色名称 |
3.4 | roleNameZh | String | 否 | 角色中文名 |
3.5 | loginFailTime | Integer | 是 | 登录失败次数 |
3.6 | accountStatus | Integer | 否 | 帐号状态 |
3.7 | description | String | 是 | 备注 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"account": "testAccount",
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"loginFailTime": 0,
"accountStatus": 1,
"description": null,
"createTime": "2019-03-04 15:11:44",
"modifyTime": "2019-03-04 15:11:44"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.3 删除帐号¶
3.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/{account}
- 请求方式:DELETE
- 返回格式:JSON
3.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | account | String | 否 | 帐号名称 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/testAccount
3.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.4 查询帐号列表¶
3.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/accountList/{pageNumber}/{pageSize}?account={account}
- 请求方式:GET
- 返回格式:JSON
3.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageSize | Int | 否 | 每页记录数 |
2 | pageNumber | Int | 否 | 当前页码 |
3 | account | String | 是 | 帐号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/accountList/1/10?account=
3.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 信息列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | account | String | 否 | 帐号 |
4.1.2 | roleId | Integer | 否 | 所属角色 |
4.1.3 | roleName | String | 否 | 角色名称 |
4.1.4 | roleNameZh | String | 否 | 角色中文名 |
4.1.5 | loginFailTime | Integer | 是 | 登录失败次数 |
4.1.6 | accountStatus | Integer | 否 | 帐号状态 |
4.1.7 | description | String | 是 | 备注 |
4.1.8 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"account": "testAccount",
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"loginFailTime": 0,
"accountStatus": 1,
"description": null,
"createTime": "2019-03-04 15:11:44",
"modifyTime": "2019-03-04 15:18:47"
},
{
"account": "admin",
"roleId": 100000,
"roleName": "admin",
"roleNameZh": "管理员",
"loginFailTime": 0,
"accountStatus": 2,
"description": null,
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-02-14 17:45:53"
}
],
"totalCount": 2
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.5 更新当前密码¶
3.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/passwordUpdate
- 请求方式:put
- 请求头:Content-type: application/json
- 返回格式:JSON
3.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | oldAccountPwd | String | 否 | 旧密码(sha256) |
2 | newAccountPwd | String | 否 | 新密码(sha256) |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/passwordUpdate
{
"oldAccountPwd": "dfdfgdg490cef2bfb60a9702erd2ddb7a805c9bd1arrrewefd51a7d0etttfa93e ",
"newAccountPwd": "3f21a8490cef2bfb60a9702e9d2ddb7a805c9bd1a263557dfd51a7d0e9dfa93e"
}
3.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.6 获取登录验证码¶
3.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/pictureCheckCode
- 请求方式:get
- 请求头:Content-type: application/json
- 返回格式:JSON
3.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 图片信息实体 |
3.1 | base64Image | String | 否 | 图片的base64 |
3.2 | token | String | 否 | token(登录接口需要用到此值) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"base64Image": "iVBORw0KGgoAAAANSUhEUgAAAJsAAAA8CAIAAAD+Gl+NAAAC3ElEQVR42u3cO04DMRAG4DkER6CFhoNwCgoq6DgQh0DiVJR0oUCKovWuPU977P2trZK1s/GnGb8g9PN7wbXSRReUtQpEIYoCURSIokAUBaIQTV2+P798r3mfnJbB69nXvmAnjdHm9+8ZgruNjI31mUQrvWPpPpeuH+43n2g9FOJyrOJmiMpQ+4fC0cdVniED6hzj6NjMdv3cZvJHjCpz70DazJY+oh2mBptmH+7um5eo/ff3F+mVENJHVDrMeEUGB1W0mFGgLrhnVI9OL1QdZ58wzTnVIMcA3X3FXTQP6tjJ7dFuBjnm29JgXlGXbazoubcs63K23JgSxu/MQXXpKd1IWS6XQ42b7ZOoH/lIZfp9ff7YXCuJHvX709sj87Jb1kQ5Ichp/XpPySmlra9hvCJAl3vr77qg8kO/h2idU4eaRJTTCXzRo9QtSuOkBuOjckQVriWqC7MIldnX6jD1OfF25NwNUP679X50n+4qljH2rMBJvNYY5QefDrWspZ4xRSxjOqMyh1I+arhoqbVbS4HK5IzebejAKUIlS/AlRL0OJ1OgShcwyvVotKjjLGmD2vSOXptGc3J63iSaBFUUx+oDmVSilf4/nWieMHURLRWsomrUnhvcOVEdRW8tyIIkuj9OtKmVUDSC01NUh9ozr2ZDdU+5jRPvIFHmEsUy3eVMeqP37jtwVk7uyCgkrcU5VtOFcsW1/2F4kCjnCLZxPqqI1Hot/mmMPVKDNgXdRflnMso9I07Aqc/abl+PWMOsispvmaRZVL3ru3vmF7EkdT+NWUq0kr5FO4Vl3U31iB0GL865UAV/Czj8X/tOUoxdhN9hyChqqQ7RpTghClEUiKJAFKIQBSpEF0aFKETX7cRsW1q6JyEoHh0qZABWfDqdnDPi5rGPSqflHLK06OBKiM7O1e0DRH1EIETn2HY4bMxffp31F5MHRmeQq3EW5vPrN2eOTq8h2X0u/d/aH4oBfftm+5EiAAAAAElFTkSuQmCC",
"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIzOGM0NjlhNC1kMTg3LTQyZDQtYWM1YS02OWU0OWM5MjMxNTkiLCJpYXQiOjE1NjAyNDY3MzksInN1YiI6ImU1RnoiLCJleHAiOjE1NjAyNDY3OTl9.FJYRZJSAhFjvO_P4AjMO6bnoOZJiu-AOSdO9ikb-30M"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.7 登录接口¶
3.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/login?checkCode={checkCode}
- 请求方式:get
- 请求头:Content-type: application/json;token:{token}
- 返回格式:JSON
3.7.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | checkCode | String | 否 | 登录验证码 |
2 | account | String | 否 | 帐号 |
3 | accountPwd | String | 否 | 密码 |
4 | token | String | 否 | 随验证码返回的token |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/login?checkCode=aege
{
"account": "admin",
"accountPwd": "Abcd1234"
}
1.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 图片信息实体 |
3.1 | account | String | 否 | 账户 |
3.2 | roleName | String | 否 | 角色 |
3.3 | accountStatus | Int | 否 | 状态 |
2)出参示例
- 成功:
{
"code": 0,
"data": {
"accountStatus": 2,
"roleName": "admin",
"account": "admin"
},
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4 区块管理模块¶
4.1 查询区块列表¶
4.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/block/blockList/{groupId}/{pageNumber}/{pageSize}}?pkHash={pkHash}&blockNumber={blockNumber}
- 请求方式:GET
- 返回格式:JSON
4.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 当前所属链 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | pageNumber | Int | 否 | 当前页码 |
4 | pkHash | String | 是 | 区块hash |
5 | blockNumber | BigInteger | 是 | 块高 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/block/blockList/300001/1/10?pkHash=
4.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 区块列表 |
4.1 | Object | 区块信息对象 | ||
4.1.1 | pkHash | String | 否 | 块hash |
4.1.2 | blockNumber | BigInteger | 否 | 块高 |
4.1.3 | blockTimestamp | LocalDateTime | 否 | 出块时间 |
4.1.4 | transCount | int | 否 | 交易数 |
4.1.5 | sealerIndex | int | 否 | 打包节点索引 |
4.1.6 | sealer | String | 否 | 打包节点 |
4.1.7 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"pkHash": "0x10fb8485eebffbb2a0b0d4f22d58d5cd54df2ac53f974b6c731c954957f36dd7",
"blockNumber": 127,
"blockTimestamp": "2019-06-11 18:11:32",
"transCount": 1,
"sealerIndex": 2,
"sealer": "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"createTime": "2019-06-11 18:11:36",
"modifyTime": "2019-06-11 18:11:36"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.2 根据块高或hash查询区块信息¶
4.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/block/blockList/{groupId}/{pageNumber}/{pageSize}}?pkHash={pkHash}&blockNumber={blockNumber}
- 请求方式:GET
- 返回格式:JSON
4.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 当前所属链 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | pageNumber | Int | 否 | 当前页码 |
4 | pkHash | String | 是 | 区块hash |
5 | blockNumber | BigInteger | 是 | 块高 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/block/blockByNumber/1/11
4.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 区块信息对象 | ||
3.1 | number | BigInteger | 否 | 块高 |
3.2 | hash | String | 否 | 区块hsah |
3.3 | parentHash | String | 否 | 父块hash |
3.4 | nonce | String | 否 | 随机数 |
3.5 | sealer | String | 否 | 打包节点索 |
3.6 | logsBloom | String | 否 | log的布隆过滤值 |
3.7 | transactionsRoot | String | 否 | |
3.8 | stateRoot | String | 否 | |
3.9 | difficulty | String | 否 | |
3.10 | totalDifficulty | String | 否 | |
3.11 | extraData | String | 否 | |
3.12 | size | int | 否 | |
3.13 | gasLimit | long | 否 | 限制gas值 |
3.14 | gasUsed | long | 否 | 已使用的gas值 |
3.15 | timestamp | String | 否 | 出块时间 |
3.16 | gasLimitRaw | String | 否 | |
3.17 | timestampRaw | String | 否 | |
3.18 | gasUsedRaw | String | 否 | |
3.19 | numberRaw | String | 否 | |
3.20 | transactions | List | 否 | |
3.20.1 | Object | 交易信息对象 | ||
3.20.1.1 | hash | String | 否 | 交易hash |
3.20.1.2 | blockHash | String | 否 | 区块hash |
3.20.1.3 | blockNumber | BigInteger | 否 | 所属块高 |
3.20.1.4 | cumulativeGasUsed | Int | 否 | |
3.20.1.5 | gasUsed | Int | 否 | 交易消耗的gas |
3.20.1.6 | contractAddress | String | 否 | 合约地址 |
3.20.1.7 | status | String | 否 | 交易的状态值 |
3.20.1.8 | from | String | 否 | 交易发起者 |
3.20.1.9 | to | String | 否 | 交易目标 |
3.20.1.10 | output | String | 否 | 交易输出内容 |
3.20.1.11 | logs | String | 否 | 日志 |
3.20.1.12 | logsBloom | String | 否 | log的布隆过滤值 |
3.20.1.13 | nonce | String | 否 | |
3.20.1.14 | value | String | 否 | |
3.20.1.15 | gasPrice | long | 否 | |
3.20.1.16 | gas | long | 否 | |
3.20.1.17 | input | String | 否 | |
3.20.1.18 | v | int | 否 | |
3.20.1.19 | nonceRaw | String | 否 | |
3.20.1.20 | blockNumberRaw | String | 否 | |
3.20.1.21 | gasPriceRaw | String | 否 | |
3.20.1.22 | gasRaw | String | 否 | |
3.20.1.23 | transactionIndex | Int | 否 | 在区块中的索引 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"number": 11,
"hash": "0xeef574a136f1d5031ce7f5d4bbc19fa1a1b5736f38ec5687d43405a572219405",
"parentHash": "0xca84147e343acb972dc9247727b920b5c081320bbe940f4e2b24363836dca4a1",
"nonce": "0",
"sealer": "0x0",
"logsBloom": "0x000000000000000000000000000000000000",
"transactionsRoot": "0x68510be0e37b993874c6cb59170b87f01fc9672a162b30df7ea96cb026f3ab27",
"stateRoot": "0xa6e930f100c2f4a13816e57aede9b63f3b7d51d64148f4412d8a6efcb0fa9c79",
"difficulty": 0,
"totalDifficulty": 0,
"extraData": [],
"size": 0,
"gasLimit": 0,
"gasUsed": 0,
"timestamp": "1551667286153",
"gasLimitRaw": "0x0",
"timestampRaw": "0x1694693d089",
"gasUsedRaw": "0x0",
"numberRaw": "0xb",
"transactions": [
{
"hash": "0x30ab22a942a6545cfe46fd725e53311fbcfea655f9c0d1e198b83749f5d7bf9b",
"nonce": "1224685724047484442779169279180691132123728860283320089873703663086305160417",
"blockHash": "0xeef574a136f1d5031ce7f5d4bbc19fa1a1b5736f38ec5687d43405a572219405",
"blockNumber": 11,
"transactionIndex": 0,
"from": "0x148947262ec5e21739fe3a931c29e8b84ee34a0f",
"to": "0xdfb1684019f7f6ea2c41590ac55d29961de5deba",
"value": 0,
"gasPrice": 300000000,
"gas": 300000000,
"input": "0x66c991390000000000000000000000000000000000000000000000000000000000000004",
"v": 0,
"nonceRaw": "0x2b525c633f530fdd935428a58afcfbb533e4dd16f24eda6b6a860b63e6a2ce1",
"blockNumberRaw": "0xb",
"transactionIndexRaw": "0x0",
"gasPriceRaw": "0x11e1a300",
"gasRaw": "0x11e1a300"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5 合约管理模块¶
5.1 查询合约列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/contractList/{groupId}/{pageNumber}/{pageSize}
- 请求方式:POST
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | contractName | String | 是 | 合约名 |
3 | contractAddress | String | 是 | 合约地址 |
4 | pageSize | int | 否 | 每页记录数 |
5 | pageNumber | int | 否 | 当前页码 |
6 | contractStatus | int | 是 | 1未部署,2已部署 |
7 | account | String | 是 | 关联账户 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/contractList
{"groupId":"1","pageNumber":1,"pageSize":500}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
5.1 | Object | 返回信息实体 | ||
5.1.1 | contractId | int | 否 | 合约编号 |
5.1.2 | contractPath | String | 否 | 合约所在目录 |
5.1.3 | contractName | String | 否 | 合约名称 |
5.1.4 | groupId | Int | 否 | 所属群组编号 |
5.1.5 | contractStatus | int | 否 | 1未部署,2已部署 |
5.1.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
5.1.7 | contractSource | String | 否 | 合约源码base64 |
5.1.8 | contractAbi | String | 是 | 合约编译后生成的abi文件内容 |
5.1.9 | contractBin | String | 是 | 合约编译后生成的bin,可用于交易解析 |
5.1.10 | bytecodeBin | String | 是 | 合约编译后生成的bytecodeBin,可用于合约部署 |
5.1.11 | contractAddress | String | 是 | 合约地址 |
5.1.12 | deployTime | LocalDateTime | 是 | 部署时间 |
5.1.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
5.1.14 | description | String | 是 | 备注 |
5.1.15 | account | String | 是 | 关联账户 |
5.1.16 | createTime | LocalDateTime | 否 | 创建时间 |
5.1.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 200002,
"contractPath": "hellos",
"contractVersion": null,
"contractName": "hellos",
"contractStatus": 2,
"groupId": 1,
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXgICAJbmFtZSA9IG47CiAgICB9Cn0=",
"contractAbi": "[\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"contractBin": "608060405234801561001057600080004d4c",
"bytecodeBin": "60806040526004361061004c576000398de7e4ddf5fdc9ccbcfd44565fed695cd960b0029",
"deployTime": "2019-06-11 18:11:33",
"description": null,
"account": "admin",
"createTime": "2019-06-05 16:40:40",
"modifyTime": "2019-06-11 18:11:33"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.2 查询合约信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/{contractId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | contractId | int | 否 | 合约编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/200001
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | groupId | Int | 否 | 所属群组编号 |
3.5 | contractStatus | int | 否 | 1未部署,2已部署 |
3.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.7 | contractSource | String | 否 | 合约源码 |
3.8 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.9 | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.10 | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 |
3.11 | contractAddress | String | 是 | 合约地址 |
3.12 | deployTime | LocalDateTime | 是 | 部署时间 |
3.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
3.14 | description | String | 是 | 备注 |
3.15 | account | String | 是 | 关联账户 |
3.16 | createTime | LocalDateTime | 否 | 创建时间 |
3.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 200002,
"contractPath": "hellos",
"contractVersion": null,
"contractName": "hellos",
"contractStatus": 2,
"groupId": 1,
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXgICAJbmFtZSA9IG47CiAgICB9Cn0=",
"contractAbi": "[\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"bytecodeBin": "60806040526004361061004c576000398de7e4ddf5fdc9ccbcfd44565fed695cd960b0029",
"contractBin": "608060405234801561001057600080004d4c",
"deployTime": "2019-06-11 18:11:33",
"description": null,
"account": "admin",
"createTime": "2019-06-05 16:40:40",
"modifyTime": "2019-06-11 18:11:33"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.3 部署合约¶
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/deploy
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 所属群组编号 |
2 | contractName | String | 否 | 合约名称 |
3 | contractSource | String | 否 | 合约源码 |
4 | contractAbi | String | 否 | 编译合约生成的abi文件内容 |
5 | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
6 | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 |
7 | contractId | String | 否 | 合约名称 |
8 | contractPath | String | 否 | 合约所在目录 |
9 | user | String | 否 | 私钥用户的地址 |
10 | account | String | 是 | 关联账户 |
11 | constructorParams | List | 是 | 构造函数入参 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/deploy
{
"groupId": "1",
"contractBin": "60806040526004361061004c576000357c010000002269b80029",
"bytecodeBin": "60806040523480156100105761146031c79ef057dd274c87bff322ea2269b80029",
"contractAbi": "[]",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLICAJbmFtZSA9IG47CiAgICB9Cn0=",
"user": "0x2db346f9d24324a4b0eac7fb7f3379a2422704db",
"account": "admin",
"contractName": "HeHe",
"contractId": 200008,
"contractPath": "Hi",
"constructorParams": ["a"]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | groupId | Int | 否 | 所属群组编号 |
3.5 | contractStatus | int | 否 | 1未部署,2已部署 |
3.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.7 | contractSource | String | 否 | 合约源码 |
3.8 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.9 | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.10 | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 |
3.11 | contractAddress | String | 是 | 合约地址 |
3.12 | deployTime | LocalDateTime | 是 | 部署时间 |
3.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
3.14 | description | String | 是 | 备注 |
3.15 | account | String | 是 | 关联账户 |
3.16 | createTime | LocalDateTime | 否 | 创建时间 |
3.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 200008,
"contractPath": "Hi",
"contractVersion": null,
"contractName": "HeHe",
"contractStatus": 2,
"groupId": 1,
"contractType": null,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuM0=",
"contractAbi": "[]",
"bytecodeBin": "60806040526004361061004c576000357c010274c87bff322ea2269b80029",
"contractBin": "608060405234801561001057629",
"contractAddress": "0xa2ea2280b3a08a3ae2e1785dff09561e13915fb2",
"deployTime": "2019-06-11 18:58:33",
"description": null,
"account": "admin",
"createTime": null,
"modifyTime": null
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.4 发送交易¶
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/transaction
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 所属群组编号 |
2 | user | String | 否 | 私钥用户的地址 |
3 | contractName | String | 否 | 合约名称 |
4 | contractId | Int | 否 | 合约编号 |
5 | funcName | String | 否 | 合约方法名 |
6 | contractAddress | String | 是 | 合约地址 |
7 | funcParam | List | 是 | 合约方法入参 |
8 | contractAbi | List | 否 | 合约abi/合约单个函数的abi |
9 | useCns | bool | 否 | 是否使用cns调用 |
10 | cnsName | String | 是 | CNS名称,useCns为true时不能为空 |
11 | version | String | 是 | CNS合约版本,useCns为true时不能为空 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/transaction
{
"groupId":"1",
"user":"0x6accbdb86107b70decceee618ce40e20e15c8ad4",
"contractName":"HelloWorld",
"funcName":"set",
"funcParam":["gwes"],
"contractAbi": [{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],
"contractId":200002,
"contractAddress":"0x7bd586b045e3684dbcd5506cb175c5d771f38d13",
"useCns":false
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.5 根据包含bytecodeBin的字符串查询合约¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /contract/findByPartOfBytecodeBin
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | partOfBytecodeBin | String | 否 | 包含合约bytecodeBin的的字符串 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/findByPartOfBytecodeBin
{
"groupId": "300001",
"partOfBytecodeBin": "abc123455dev"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | Int | 否 | 所属群组编号 |
3.4 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.5 | contractSource | String | 否 | 合约源码 |
3.6 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.7 | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.8 | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 |
3.9 | contractAddress | String | 是 | 合约地址 |
3.10 | deployTime | LocalDateTime | 是 | 部署时间 |
3.11 | contractVersion | String | 否 | 合约版本 |
3.12 | description | String | 是 | 备注 |
3.13 | account | String | 是 | 关联账户 |
3.14 | createTime | LocalDateTime | 否 | 创建时间 |
3.15 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 200002,
"contractName": "Ok",
"groupId": 2,
"chainIndex": null,
"contractType": 0,
"contractSource": "cHJhZ21hIDQoNCg0KfQ==",
"contractAbi": "[]",
"contractBin": "60606040526000357c01000000000029",
"bytecodeBin": "123455",
"contractAddress": "0x19146d3a2f138aacb97ac52dd45dd7ba7cb3e04a",
"deployTime": null,
"contractVersion": "v6.0",
"description": null,
"account": "admin",
"createTime": "2019-04-15 21:14:40",
"modifyTime": "2019-04-15 21:14:40"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.6. 保存合约接口¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/save
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | contractId | int | 是 | 合约编号,传入contractId表示更新,否则新增 |
3 | contractName | String | 否 | 合约名称 |
4 | contractPath | String | 否 | 合约所在目录 |
5 | contractSource | String | 是 | 合约源码的base64 |
6 | contractAbi | String | 是 | 合约编译后生成的abi文件内容 |
7 | contractBin | String | 是 | 合约编译后生成的bin,可用于交易解析 |
8 | bytecodeBin | String | 是 | 合约编译后生成的bytecodeBin,可用于合约部署 |
9 | account | String | 是 | 关联账户,新建时不能为空 |
2)入参示例
{
"groupId": "1",
"contractName": "HeHe",
"contractPath": "/",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsn0=",
"contractAbi": “[]”
"contractBin": "60806040526004361061004c576000357c0100000000000000000000000029",
"bytecodeBin": "6080604052348015610010572269b80029",
"contractId": 1,
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | groupId | Int | 否 | 所属群组编号 |
3.5 | contractStatus | int | 否 | 1未部署,2已部署 |
3.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.7 | contractSource | String | 否 | 合约源码base64 |
3.8 | contractAbi | String | 是 | 合约编译后生成的abi文件内容 |
3.9 | contractBin | String | 是 | 合约编译后生成的bin,可用于交易解析 |
3.10 | bytecodeBin | String | 是 | 合约编译后生成的bytecodeBin,可用于合约部署 |
3.11 | contractAddress | String | 是 | 合约地址 |
3.12 | deployTime | LocalDateTime | 是 | 部署时间 |
3.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
3.14 | description | String | 是 | 备注 |
3.15 | account | String | 是 | 关联账户 |
3.16 | createTime | LocalDateTime | 否 | 创建时间 |
3.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
5.7 获取Abi信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /abi/{abiId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | abiId | Long | 否 | abi编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/abi/1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | abiId | int | 否 | 合约编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | Int | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"abiId": 1,
"groupId": 1,
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357...",
"account": "admin",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
}
5.8 获取Abi信息分页列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /abi/list/{groupId}/{pageNumber}/{pageSize}?account={account}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组编号 |
2 | pageNumber | int | 否 | 页码,从1开始 |
3 | pageSize | int | 否 | 页大小 |
4 | account | String | 是 | 所属账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/abi/list/1/1/5?account=
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | abiId | int | 否 | 合约编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | Int | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"abiId": 1,
"groupId": 1,
"account": "admin",
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463fffff...29",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
],
"totalCount": 1
}
5.9. 导入已部署合约的abi¶
将其他平台已部署的合约导入到本平台进行管理
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/abi
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | contractAddress | String | 否 | 合约地址 |
3 | contractName | String | 否 | 合约名称 |
4 | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
5 | account | String | 否 | 所属账号 |
2)入参示例
{
"groupId": 1,
"account": "admin",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractName": "HelloWorld",
"contractAbi": [{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"}],"name":"SetName","type":"event"}]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
5.10. 修改已部署合约的abi¶
将其他平台已部署的合约导入到本平台进行管理
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/abi
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | abiId | long | 否 | abi编号 |
2 | groupId | int | 否 | 所属群组编号 |
3 | contractAddress | String | 否 | 合约地址 |
4 | contractName | String | 否 | 合约名称 |
5 | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
2)入参示例
{
"abiId": 1,
"groupId": 1,
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractName": "HelloWorld",
"contractAbi": [{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"}],"name":"SetName","type":"event"}]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
5.11. 获取全量合约列表(不包含abi/bin)¶
接口描述¶
根据群组编号和合约状态获取全量合约
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/contractList/all/light?groupId={groupId}&contractStatus={contractStatus}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/contractList/all/light?groupId=1&contractStatus=2
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | Integer | 是 | |
3.6 | 合约地址 | contractAddress | String | 否 | |
3.7 | 部署时间 | deployTime | String | 否 | |
3.8 | 修改时间 | modifyTime | String | 是 | |
3.9 | 创建时间 | createTime | String | 是 | |
3.10 | 备注 | description | String | 否 | |
3.11 | 部署用户地址 | deployAddress | String | 否 | |
3.12 | 部署用户姓名 | deployUserName | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 2,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": 1,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
],
"totalCount": 1
}
5.12. 获取合约路径列表¶
接口描述¶
获取合约路径列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/findPathList/{groupId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/findPathList/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 路径id | id | Integer | 是 | |
3.2 | 群组编号 | groupId | Integer | 是 | |
3.3 | 所在目录 | contractPath | String | 是 | |
3.4 | 修改时间 | modifyTime | String | 是 | |
3.5 | 创建时间 | createTime | String | 是 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"groupId": 1,
"contractPath": "/",
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
]
}
5.13. 保存合约路径¶
接口描述¶
保存合约路径
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/contractPath
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
1 | 合约路径 | contractPath | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/contractPath
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | int | 否 | 增加数 |
2)数据格式
{
"code": 0,
"message": "success",
"data": 1
}
5.14. 删除合约路径并批量删除合约¶
接口描述¶
删除合约路径并批量删除合约
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/batch/path
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
1 | 合约路径 | contractPath | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/batch/path
{
"groupId": 1,
"contractPath": test
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
}
5.15. 注册cns接口¶
接口描述¶
注册cns
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/registerCns
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约路径 | contractPath | String | 是 | ||
3 | 合约名称 | contractName | String | 是 | ||
4 | cns名称 | cnsName | String | 是 | ||
5 | 合约地址 | contractAddress | String | 是 | ||
6 | 合约abi | contractAbi | List | 是 | abi文件里面的内容,是一个JSONArray | |
7 | cns版本 | version | String | 是 | ||
8 | 用户地址 | userAddress | String | 是 |
2)数据格式
{
"groupId": 1,
"contractPath": "/",
"contractName": "Hello",
"cnsName": "Hello",
"version": "v0.4",
"contractAddress": "0xcaff8fdf1d461b91c7c8f0ff2af2f79a80bc189e",
"contractAbi": [{"cons tant":false,"inputs":[{"name":"n","type":"string","type0":null,"indexed":false}],"name":"set","outputs":[{"name":"","type":"string","type0":null,"indexed":false}],"type":"function","payable":false,"stateMutability":"nonpayable"},{"co nstant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string","type0":null,"indexed":false}],"type":"function","payable":false,"stateMutability":"view"},{"constant":false,"inputs":[{"name":"name","type":"string","type0":null,"indexed":false}],"name":"SetName","outputs":null,"type":"event","payable":false,"stateMutability":null}],
"userAddress": "0x8c808ff5beee7b4cfb17f141f6237db93a668e46"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
}
5.16. 根据合约地址获取cns信息¶
接口描述¶
根据合约地址获取该合约地址最新的cns信息
传输协议规范¶
网络传输协议:使用HTTP协议
请求地址:/contract/findCns
请求方式:POST
请求头:Content-type: application/json
返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约地址 | contractAddress | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/findCns
{
"groupId": 1,
"contractAddress": "0xcaff8fdf1d461b91c7c8f0ff2af2f79a80bc189e"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 编号 | id | Integer | 是 | |
3.2 | 群组编号 | groupId | Integer | 是 | |
3.3 | 合约路径 | contractPath | String | 是 | |
3.4 | 合约名称 | contractName | String | 是 | |
3.5 | cns名称 | cnsName | String | 是 | |
3.6 | cns版本 | version | String | 是 | |
3.7 | 合约地址 | contractAddress | String | 是 | |
3.8 | 修改时间 | modifyTime | String | 是 | |
3.9 | 创建时间 | createTime | String | 是 |
2)数据格式
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"groupId": 1,
"contractPath": "/",
"contractName": "Hello",
"cnsName": "Hello",
"version": "v0.4",
"contractAddress": "0xcaff8fdf1d461b91c7c8f0ff2af2f79a80bc189e",
"createTime": "2020-12-30 16:32:28",
"modifyTime": "2020-12-30 16:32:28"
}
}
5.17. 获取本地cns信息列表¶
接口描述¶
获取本地cns信息列表
传输协议规范¶
网络传输协议:使用HTTP协议
请求地址:/contract/findCnsList
请求方式:POST
请求头:Content-type: application/json
返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 每页记录数 | pageSize | Integer | 是 | ||
3 | 当前页码 | pageNumber | Integer | 是 | ||
4 | cns名称 | cnsName | String | 否 | ||
5 | cns版本 | version | String | 否 | ||
6 | 合约地址 | contractAddress | String | 否 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/findCnsList
{
"groupId": 1,
"pageSize": 1,
"pageNumber": 1
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 记录数 | totalCount | Int | 否 | 总记录数 |
4 | 返回数据 | data | List | 否 | |
4.1 | 返回信息实体 | Object | 否 | ||
4.1.1 | 编号 | id | Integer | 是 | |
4.1.2 | 群组编号 | groupId | Integer | 是 | |
4.1.3 | 合约路径 | contractPath | String | 是 | |
4.1.4 | 合约名称 | contractName | String | 是 | |
4.1.5 | cns名称 | cnsName | String | 是 | |
4.1.6 | cns版本 | version | String | 是 | |
4.1.7 | 合约地址 | contractAddress | String | 是 | |
4.1.8 | 合约Abi | contractAbi | String | 是 | |
4.1.9 | 修改时间 | modifyTime | String | 是 | |
4.1.10 | 创建时间 | createTime | String | 是 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"groupId": 1,
"contractPath": "/",
"contractName": "Hello",
"cnsName": "Hello",
"version": "v0.4",
"contractAddress": "0xcaff8fdf1d461b91c7c8f0ff2af2f79a80bc189e",
"contractAbi":"[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"type\":\"function\",\"payable\":false,\"stateMutability\":\"view\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"name\":\"set\",\"outputs\":[],\"type\":\"function\",\"payable\":false,\"stateMutability\":\"nonpayable\"},{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"name\":\"SetName\",\"outputs\":null,\"type\":\"event\",\"payable\":false,\"stateMutability\":null}]",
"createTime": "2020-12-30 16:32:28",
"modifyTime": "2020-12-30 16:32:28"
}
],
"totalCount": 1
}
5.18 获取合约与导入ABI列表(分页)¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /abi/list/all/{groupId}/{pageNumber}/{pageSize}?account={account}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组编号 |
2 | pageNumber | int | 否 | 页码,从1开始 |
3 | pageSize | int | 否 | 页大小 |
4 | account | String | 是 | 所属账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/abi/list/all/1/1/5?account=
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回数据 | ||
3.0 | contractId | int | 合约编号(contractId为空时,说明合约为外部导入的) | |
3.1 | abiId | int | 否 | 合约编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | Int | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
3.10 | contractPath | String | 是 | 合约路径 |
3.11 | contractStatus | int | 是 | 合约状态 |
3.12 | deployAddress | String | 否 | 部署用户地址 |
3.13 | deployUserName | String | 否 | 部署用户名 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"contractId": null,
"contractPath": null,
"contractVersion": null,
"contractName": "c",
"account": null,
"contractStatus": null,
"groupId": 1,
"contractType": null,
"contractSource": null,
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"register\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
"contractBin": null,
"bytecodeBin": null,
"contractAddress": "0x4ac92d4d1680f426ac2da943b3ff67e82976d075",
"deployTime": null,
"description": null,
"createTime": "2021-04-07 09:29:54",
"modifyTime": "2021-04-07 09:29:54",
"deployAddress": null,
"deployUserName": null,
"abiId": 8
}, {
"contractId": 200013,
"contractPath": "weid_0xcde7c667528b6df1b61fd6483a0925ccc67931a02394acab1835254546e67d80",
"contractVersion": null,
"contractName": "SpecificIssuerController",
"account": "admin",
"contractStatus": 2,
"groupId": 1,
"contractType": 2,
"contractSource": null,
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"addIssuer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isSpecificTypeIssuer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"extraValue\",\"type\":\"bytes32\"}],\"name\":\"addExtraValue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"registerIssuerType\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"getExtraValue\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"isIssuerTypeExist\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"removeIssuer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"startPos\",\"type\":\"uint256\"},{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"getSpecificTypeIssuerList\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"specificIssuerDataAddress\",\"type\":\"address\"},{\"name\":\"roleControllerAddress\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"operation\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"retCode\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"typeName\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"SpecificIssuerRetLog\",\"type\":\"event\"}]",
"contractBin": "",
"bytecodeBin": "",
"contractAddress": "0xce1d576181e1d68899a3f2b86c8e274657c07fea",
"deployTime": null,
"description": null,
"createTime": "2021-04-06 21:34:38",
"modifyTime": "2021-04-06 21:34:38",
"deployAddress": null,
"deployUserName": null,
"abiId": 6
}],
"totalCount": 2
}
6 服务器监控相关¶
6.1 获取节点监控信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/monitorInfo/{nodeId}?beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}&gap={gap}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | int | 否 | 群组id |
2 | beginDate | LocalDateTime | 是 | 显示时间(开始) yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00 |
3 | endDate | LocalDateTime | 是 | 显示时间(结束) |
4 | contrastBeginDate | LocalDateTime | 是 | 对比时间(开始) |
5 | contrastEndDate | LocalDateTime | 是 | 对比时间(结束) |
6 | gap | Int | 是 | 数据粒度 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/chain/mointorInfo/500001?gap=60&beginDate=2019-03-13T00:00:00&endDate=2019-03-13T14:34:22&contrastBeginDate=2019-03-13T00:00:00&contrastEndDate=2019-03-13T14:34:22
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | metricType | String | 否 | 测量类型:blockHeight、pbftView |
3.1.2 | data | Object | 否 | |
3.1.2.1 | lineDataList | Object | 否 | |
3.1.2.1.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.1.2 | valueList | List\<Integer> | 否 | 值列表 |
3.1.2.2 | contrastDataList | Object | 否 | |
3.1.2.2.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.2.2 | valueList | List\<Integer> | 否 | 值列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"metricType": "blockHeight",
"data": {
"lineDataList": {
"timestampList": [
1552406401042,
1552406701001
],
"valueList": [
747309,
747309
]
},
"contrastDataList": {
"timestampList": [
1552320005000,
1552320301001
],
"valueList": [
null,
747309
]
}
}
},
{
"metricType": "pbftView",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [
118457,
157604
]
},
"contrastDataList": {
"timestampList": null,
"valueList": [
null,
33298
]
}
}
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6.2 获取服务器监控信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
performance/ratio/{nodeId}?gap={gap}&beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | int | 否 | 群组id |
2 | beginDate | LocalDateTime | 是 | 显示时间(开始) yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00 |
3 | endDate | LocalDateTime | 是 | 显示时间(结束) |
4 | contrastBeginDate | LocalDateTime | 是 | 对比时间(开始) |
5 | contrastEndDate | LocalDateTime | 是 | 对比时间(结束) |
6 | gap | Int | 是 | 数据粒度 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/performance/ratio/500001?gap=1&beginDate=2019-03-15T00:00:00&endDate=2019-03-15T15:26:55&contrastBeginDate=2019-03-15T00:00:00&contrastEndDate=2019-03-15T15:26:55
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | metricType | String | 否 | 测量类型: cpu、memory、disk、txbps、rxbps |
3.1.2 | data | Object | 否 | |
3.1.2.1 | lineDataList | Object | 否 | |
3.1.2.1.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.1.2 | valueList | List\<Integer> | 否 | 值列表 |
3.1.2.2 | contrastDataList | Object | 否 | |
3.1.2.2.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.2.2 | valueList | List\<Integer> | 否 | 值列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"metricType": "txbps",
"data": {
"lineDataList": {
"timestampList": [
1552406401042,
1552406701001
],
"valueList": [
12.24,
54.48
]
},
"contrastDataList": {
"timestampList": [
1552320005000,
1552320301001
],
"valueList": [
22.24,
24.48
]
}
}
},
{
"metricType": "cpu",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [
118457,
157604
]
},
"contrastDataList": {
"timestampList": null,
"valueList": [
null,
33298
]
}
}
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6.3 获取邮件告警配置¶
配置邮件告警的邮件服务器的相关参数,包含协议类型protocol
、邮件服务器地址host
、端口port
、用户邮箱地址username
、用户邮箱授权码password
;包含Authentication验证开关(默认开启)authentication
,以及邮件告警模块的开关enable
;
注:邮件告警的邮箱协议类型默认使用SMTP协议,使用25默认端口,默认使用username/password进行用户验证,目前仅支持通过TLS/SSL连接邮件服务器;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /mailServer/config/{serverId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | serverId | Int | 否 | 邮件服务的编号 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/mailServer/config/1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 成功时返回 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | serverId | Int | 否 | 邮件服务器的编号 |
3.1.2 | serverName | String | 否 | 邮件服务器的名字 |
3.1.3 | host | String | 否 | 邮件服务器的主机地址 |
3.1.4 | port | Int | 否 | 邮件服务器的端口号 |
3.1.5 | username | String | 否 | 邮件服务器的用户地址 |
3.1.6 | password | String | 否 | 邮件服务器的用户授权码 |
3.1.7 | protocol | String | 否 | 邮件服务器的协议 |
3.1.8 | defaultEncoding | String | 否 | 邮件服务器的编码 |
3.1.9 | authentication | Int | 否 | 开启验证:0-关闭,1-开启 |
3.1.10 | starttlsEnable | Int | 否 | 开启优先使用STARTTLS:0-关闭,1-开启 |
3.1.11 | enable | Int | 否 | 开启邮件服务器:0-关闭,1-开启 |
3.1.12 | starttlsRequired | Int | 否 | 必须使用STARTTLS:0-关闭,1-开启 |
3.1.13 | socketFactoryPort | Int | 否 | TLS使用的端口号 |
3.1.14 | socketFactoryClass | String | 否 | TLS使用的java类 |
3.1.15 | socketFactoryFallback | Int | 否 | 开启TLS Fallback函数:0-关闭,1-开启 |
3.1.16 | timeout | Int | 否 | 从邮箱服务器读取超时时间 |
3.1.17 | connectionTimeout | Int | 否 | 邮箱服务器连接超时时间 |
3.1.18 | writeTimeout | Int | 否 | 从邮箱服务器写超时时间 |
3.1.19 | createTime | LocalDateTime | 否 | 创建时间 |
3.1.20 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"serverId": 1,
"serverName": "Default config",
"host": "smtp.qq.com",
"port": 25,
"username": "yourmail@qq.com",
"password": "yourpassword",
"protocol": "smtp",
"defaultEncoding": "UTF-8",
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"authentication": 1,
"starttlsEnable": 1,
"starttlsRequired": 0,
"socketFactoryPort": 465,
"socketFactoryClass": "javax.net.ssl.SSLSocketFactory",
"socketFactoryFallback": 0,
"enable": 0,
"timeout": 5000,
"connectionTimeout": 5000,
"writeTimeout": 5000
}
}
6.4 获取全部邮件告警配置¶
返回所有的邮件告警的邮件服务配置
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /mailServer/config/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
- | - | - | - | - |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/mailServer/config/list
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | serverId | Int | 否 | 邮件服务器的编号 |
3.1.2 | serverName | String | 否 | 邮件服务器的名字 |
3.1.3 | host | String | 否 | 邮件服务器的主机地址 |
3.1.4 | port | Int | 否 | 邮件服务器的端口号 |
3.1.5 | username | String | 否 | 邮件服务器的用户地址 |
3.1.6 | password | String | 否 | 邮件服务器的用户授权码 |
3.1.7 | protocol | String | 否 | 邮件服务器的协议 |
3.1.8 | defaultEncoding | String | 否 | 邮件服务器的编码 |
3.1.9 | authentication | Int | 否 | 开启验证:0-关闭,1-开启 |
3.1.10 | starttlsEnable | Int | 否 | 开启优先使用STARTTLS:0-关闭,1-开启 |
3.1.11 | enable | Int | 否 | 开启邮件服务器:0-关闭,1-开启 |
3.1.12 | starttlsRequired | Int | 否 | 必须使用STARTTLS:0-关闭,1-开启 |
3.1.13 | socketFactoryPort | Int | 否 | TLS使用的端口号 |
3.1.14 | socketFactoryClass | String | 否 | TLS使用的java类 |
3.1.15 | socketFactoryFallback | Int | 否 | 开启TLS Fallback函数:0-关闭,1-开启 |
3.1.16 | timeout | Int | 否 | 从邮箱服务器读取超时时间 |
3.1.17 | connectionTimeout | Int | 否 | 邮箱服务器连接超时时间 |
3.1.18 | writeTimeout | Int | 否 | 从邮箱服务器写超时时间 |
3.1.19 | createTime | LocalDateTime | 否 | 创建时间 |
3.1.20 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"serverId": 1,
"serverName": "Default config",
"host": "smtp.qq.com",
"port": 25,
"username": "yourmail@qq.com",
"password": "yourpassword",
"protocol": "smtp",
"defaultEncoding": "UTF-8",
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"authentication": 1,
"starttlsEnable": 1,
"starttlsRequired": 0,
"socketFactoryPort": 465,
"socketFactoryClass": "javax.net.ssl.SSLSocketFactory",
"socketFactoryFallback": 0,
"enable": 0,
"timeout": 5000,
"connectionTimeout": 5000,
"writeTimeout": 5000
}
]
}
6.5 更新邮件告警配置¶
更新邮件告警的配置内容;目前仅支持单个邮件服务器配置,不支持新增配置;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /mailServer/config
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | serverId | int | 否 | 邮件告警配置的编号 |
2 | protocol | String | 否 | 邮件服务的协议类型,小写(发件服务器默认使用smtp) |
3 | host | String | 否 | 邮件服务的地址 |
4 | port | int | 否 | 邮件服务使用的端口,默认25 |
5 | username | String | 是 | 邮件服务的用户邮箱地址,authentication开启时为必填 |
6 | password | String | 是 | 邮件服务的用户邮箱授权码,使用base64编码,authentication开启时为必填 |
7 | authentication | int | 否 | 是否启用验证,默认使用username/password验证:0-关闭,1-开启 |
8 | enable | int | 否 | 是否启用邮件服务:0-关闭,1-开启 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/mailServer/config
{
"serverId": 1,
"host": "smtp.qq.com",
"port": 25,
"username": "yourmail@qq.com",
"password": "eW91cnBhc3N3b3Jk", // 原文:yourpassword
"protocol": "smtp",
"authentication": 1,
"enable": 1
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回邮件服务配置的具体内容 |
3.1 | Object | 否 | 参数含义参考上文GET接口出参表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"serverId": 1,
"serverName": "Default config",
"host": "smtp.qq.com",
"port": 25,
"username": "yourmail@qq.com",
"password": "yourpassword",
"protocol": "smtp",
"defaultEncoding": "UTF-8",
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-11-07 10:04:47",
"authentication": 1,
"starttlsEnable": 1,
"starttlsRequired": 0,
"socketFactoryPort": 465,
"socketFactoryClass": "javax.net.ssl.SSLSocketFactory",
"socketFactoryFallback": 0,
"enable": 1,
"timeout": 5000,
"connectionTimeout": 5000,
"writeTimeout": 5000
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6.6 发送测试邮件¶
使用当前的邮件服务配置,向指定的邮箱地址发送测试邮件,如果配置错误将发送失败;
注:需要确保配置正确才能使用后续的邮件告警功能;返回成功信息后,需要用户到自己的邮箱查看是否收到邮测试邮件;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/mail/test/{toMailAddress}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | {toMailAddress} | String | 否 | 接收测试邮件的邮箱地址 |
2 | host | String | 否 | 邮件服务的地址 |
3 | port | int | 否 | 邮件服务使用的端口,默认25 |
4 | protocol | String | 是 | 邮件服务的协议类型,默认使用smtp |
5 | defaultEncoding | String | 是 | 邮件服务的邮件编码格式,默认为UTF-8编码 |
6 | username | String | 否 | 邮件服务的用户邮箱地址,authentication开启时为必填 |
7 | password | String | 否 | 邮件服务的用户邮箱授权码,authentication开启时为必填 |
8 | authentication | int | 否 | 开启鉴权验证,默认开启(使用username/password验证)0-关闭,1-开启 |
9 | starttlsEnable | int | 是 | 开启优先使用STARTTLS,默认开启 0-关闭,1-开启 |
10 | starttlsRequired | int | 是 | 开启必须使用STARTTLS,默认关闭,开启时需要配置socketFactoryPort, socketFactoryClass, socketFactoryFallback 0-关闭,1-开启 |
11 | socketFactoryPort | String | 是 | TLS/SSL的Socket端口,默认465 |
12 | socketFactoryClass | String | 是 | TLS/SSL的Socket工厂类 |
13 | socketFactoryFallback | int | 是 | 开启Socket的Fallback函数,默认关闭 0-关闭,1-开启 |
14 | timeout | int | 是 | 读超时时间值,默认5000ms |
15 | connectionTimeout | int | 是 | 连接超时时间值,默认5000ms |
16 | writeTimeout | int | 是 | 写超时时间值,默认5000ms |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/mail/test/yourmail@qq.com
{
"host": "smtp.qq.com",
"port": 25,
"username": "yourmail@qq.com",
"password": "yourpassword",
"protocol": "smtp",
"defaultEncoding": "UTF-8",
"authentication": 1,
"starttlsEnable": 1,
"starttlsRequired": 0,
"socketFactoryPort": 465,
"socketFactoryClass": "javax.net.ssl.SSLSocketFactory",
"socketFactoryFallback": 0,
"timeout": 5000,
"connectionTimeout": 5000,
"writeTimeout": 5000
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 错误时返回错误原因 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 202080,
"message": "Send mail error, please check mail server configuration.",
"data": "Failed messages: javax.mail.SendFailedException: No recipient addresses"
}
6.7 获取告警类型配置¶
获取单个告警配置的内容;告警类型配置是对不同告警类型下的不同内容,包含告警邮件标题ruleName
,告警邮件内容alertContent
,告警邮件发送时间间隔alertIntervalSeconds
,上次告警时间lastAlertTime
,目标告警邮箱地址列表userList
,是否启用该类型的邮件告警enable
,告警等级alertLevel
等;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/{ruleId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | ruleId | Int | 否 | 告警配置的编号 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 成功时返回 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | ruleId | Int | 否 | 告警类型配置的编号 |
3.1.2 | ruleName | String | 否 | 告警类型的名字/告警邮件标题 |
3.1.3 | enable | Int | 否 | 是否开启该告警:0-关闭,1-开启 |
3.1.4 | alertType | Int | 否 | 告警类型:1-节点状态告警,2-审计告警,3-证书有效期 |
3.1.5 | alertLevel | Int | 否 | 告警等级:1-高,2-中,3-低 |
3.1.6 | alertIntervalSeconds | Long | 否 | 告警邮件发送时间间隔 |
3.1.7 | alertContent | String | 否 | 告警邮件内容,其中包含{}括起来的变量 |
3.1.8 | contentParamList | String | 否 | 告警邮件内容中变量的列表,由List<String> 序列化为String |
3.1.9 | description | String | 否 | 告警描述 |
3.1.10 | userList | Int | 否 | 目标告警邮箱地址列表,由List<String> 序列化为String |
3.1.11 | lastAlertTime | LocalDateTime | 否 | 上次告警时间 |
3.1.12 | isAllUser | Int | 否 | 发送给所有用户:0-关闭,1-开启 |
3.1.13 | createTime | LocalDateTime | 否 | 创建时间 |
3.1.14 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ruleId": 1,
"ruleName": "节点异常告警",
"enable": 0,
"alertType": 1,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "{nodeId}节点异常,请到\"节点管理\"页面查看具体信息",
"contentParamList": "[\"{nodeId}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
}
6.8 获取全部告警类型配置列表¶
返回所有的告警类型配置
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
- | - | - | - | - |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/list
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | ruleId | Int | 否 | 告警类型配置的编号 |
3.1.2 | ruleName | String | 否 | 告警类型的名字/告警邮件标题 |
3.1.3 | enable | Int | 否 | 是否开启该告警:0-关闭,1-开启 |
3.1.4 | alertType | Int | 否 | 告警类型:1-节点状态告警,2-审计告警,3-证书有效期 |
3.1.5 | alertLevel | Int | 否 | 告警等级:1-高,2-中,3-低 |
3.1.6 | alertIntervalSeconds | Long | 否 | 告警邮件发送时间间隔 |
3.1.7 | alertContent | String | 否 | 告警邮件内容,其中包含{}括起来的变量 |
3.1.8 | contentParamList | String | 否 | 告警邮件内容中变量的列表,由List<String> 序列化为String |
3.1.9 | description | String | 否 | 告警描述 |
3.1.10 | userList | Int | 否 | 目标告警邮箱地址列表,由List<String> 序列化为String |
3.1.11 | lastAlertTime | LocalDateTime | 否 | 上次告警时间 |
3.1.12 | isAllUser | Int | 否 | 发送给所有用户:0-关闭,1-开启 |
3.1.13 | createTime | LocalDateTime | 否 | 创建时间 |
3.1.14 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"ruleId": 1,
"ruleName": "节点异常告警",
"enable": 0,
"alertType": 1,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "{nodeId}节点异常,请到\"节点管理\"页面查看具体信息",
"contentParamList": "[\"{nodeId}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
},
{
"ruleId": 2,
"ruleName": "审计异常",
"enable": 0,
"alertType": 2,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "审计异常:{auditType},请到\"交易审计\"页面查看具体信息",
"contentParamList": "[\"{auditType}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
},
{
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 0,
"alertType": 3,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"contentParamList": "[\"{time}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
]
}
6.9 更新告警类型配置¶
更新告警类型配置的内容;目前仅支持更新原有的三个邮件告警的配置,不支持新增配置;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | ruleId | int | 否 | 告警类型配置编号 |
2 | ruleName | String | 是 | 告警邮件的标题 |
3 | enable | int | 否 | 是否启用该类型的告警:0-关闭,1-开启 |
4 | alertType | int | 是 | 告警类型:1-节点状态告警,2-审计告警,3-证书有效期告警 |
6 | alertIntervalSeconds | int | 是 | 告警邮件的发送间隔时间(秒),默认3600s |
7 | alertContent | String | 是 | 告警邮件的内容,其中大括号{} 及里面的英文变量不可去除 |
8 | userList | String | 否 | 接收告警邮件的邮箱列表,以List<String> 序列化得到的字符串 |
9 | alertLevel | Int | 是 | 告警等级:1-高,2-中,3-低 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/mailServer/config
{
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 0,
"alertType": 3,
"alertIntervalSeconds": 1800,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"userList": "[\"targetmail@qq.com\"]",
"alertLevel": 1
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回邮件服务配置的具体内容 |
3.1 | Object | 否 | 参数含义参考上文GET接口出参表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 0,
"alertType": 3,
"alertLevel": 1,
"alertIntervalSeconds": 1800,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"contentParamList": "[\"{time}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-11-07 10:35:03",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6.9 开启/关闭 告警类型¶
修改告警类型配置中的enable
,0-关闭,1-开启;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/toggle
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | ruleId | int | 否 | 告警类型配置编号 |
2 | enable | int | 否 | 是否启用该类型的告警:0-关闭,1-开启 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/toggle
{
"ruleId": 3,
"enable": 1
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回邮件服务配置的具体内容 |
3.1 | Object | 否 | 参数含义参考上文GET接口出参表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 1,
"alertType": 3,
"alertLevel": 1,
"alertIntervalSeconds": 1800,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"contentParamList": "[\"{time}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-11-07 10:35:03",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6.10 获取出块监控信息¶
获取出块周期、块大小、平均TPS的监控数据
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/stat?groupId={groupId}&beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}&gap={gap}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | int | 否 | 群组id |
2 | beginDate | long | 是 | 显示时间(开始) 时间戳 |
3 | endDate | long | 是 | 显示时间(结束)时间戳 |
4 | contrastBeginDate | long | 是 | 对比时间(开始)时间戳 |
5 | contrastEndDate | long | 是 | 对比时间(结束)时间戳 |
6 | gap | Int | 是 | 数据粒度 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/stat?groupId=1&gap=60eginDate=1617811200000&endDate=1617871955000&contrastBeginDate=&contrastEndDate=
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | metricType | String | 否 | 测量类型:blockSize, blockCycle, tps |
3.1.2 | data | Object | 否 | |
3.1.2.1 | lineDataList | Object | 否 | |
3.1.2.1.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.1.2 | valueList | List\<Integer> | 否 | 值列表 |
3.1.2.2 | contrastDataList | Object | 否 | |
3.1.2.2.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.2.2 | valueList | List\<Integer> | 否 | 值列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"metricType": "blockSize",
"data": {
"lineDataList": {
"timestampList": [1617866162706, 1617866462706, 1617866762706, 1617867062706, 1617867362706, 1617867662706, 1617867962706, 1617868262706, 1617868562706, 1617868862706, 1617869162706, 1617869462706, 1617869762706, 1617870062706, 1617870362706, 1617870664184, 1617870964184],
"valueList": [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
},
"contrastDataList": {
"timestampList": [],
"valueList": []
}
}
}, {
"metricType": "blockCycle",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}, {
"metricType": "tps",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}],
"attachment": null
}
7 审计相关模块¶
7.1 获取用户交易监管信息列表¶
7.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/monitor/userList/{groupId}
- 请求方式:GET
- 返回格式:JSON
7.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/userList/300001
7.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 是 | 信息列表 |
3.1 | Object | 是 | 监管信息对象 | |
3.1.1 | userName | String | 是 | 用户名称 |
3.1.2 | userType | Int | 是 | 用户类型(0-正常,1-异常) |
3.1.3 | groupId | Int | 是 | 所属群组 |
3.1.4 | contractName | String | 是 | 合约名称 |
3.1.5 | contractAddress | String | 是 | 合约地址 |
3.1.6 | interfaceName | String | 是 | 合约接口名 |
3.1.7 | transType | Int | 是 | 交易类型(0-合约部署,1-接口调用) |
3.1.8 | transUnusualType | Int | 是 | 交易异常类型 (0-正常,1-异常合约,2-异常接口) |
3.1.9 | transCount | Int | 是 | 交易量 |
3.1.10 | transHashs | String | 是 | 交易hashs(最多5个) |
3.1.11 | transHashLastest | String | 是 | 最新交易hash |
3.1.12 | createTime | LocalDateTime | 是 | 落库时间 |
3.1.13 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userName": "SYSTEMUSER",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
},
{
"userName": "asdf",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
7.2 获取合约方法监管信息列表¶
7.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/monitor/interfaceList/{groupId}?userName={userName}
- 请求方式:GET
- 返回格式:JSON
7.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | userName | String | 是 | 用户名 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/interfaceList/300001
7.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 是 | 信息列表 |
3.1 | Object | 是 | 监管信息对象 | |
3.1.1 | userName | String | 是 | 用户名称 |
3.1.2 | userType | Int | 是 | 用户类型(0-正常,1-异常) |
3.1.3 | groupId | Int | 是 | 所属群组 |
3.1.4 | contractName | String | 是 | 合约名称 |
3.1.5 | contractAddress | String | 是 | 合约地址 |
3.1.6 | interfaceName | String | 是 | 合约接口名 |
3.1.7 | transType | Int | 是 | 交易类型(0-合约部署,1-接口调用) |
3.1.8 | transUnusualType | Int | 是 | 交易异常类型 (0-正常,1-异常合约,2-异常接口) |
3.1.9 | transCount | Int | 是 | 交易量 |
3.1.10 | transHashs | String | 是 | 交易hashs(最多5个) |
3.1.11 | transHashLastest | String | 是 | 最新交易hash |
3.1.12 | createTime | LocalDateTime | 是 | 落库时间 |
3.1.13 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userName": "SYSTEMUSER",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
},
{
"userName": "asdf",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
7.3 获取交易hash监管信息列表¶
7.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /monitor/interfaceList/{groupId}
- 请求方式:GET
- 返回格式:JSON
7.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | userName | String | 是 | 用户名 |
3 | startDate | String | 开始时间 | |
4 | endDate | String | 结束时间 | |
5 | interfaceName | String | 接口名称 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/transList/300001?userName=0x5d97f8d41638a7b1b669b70b307bab6d49df8e2c&interfaceName=0x4ed3885e
7.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回结果实体 |
3.1 | groupId | Int | 否 | 所属群组编号 |
3.2 | userName | String | 否 | 用户名 |
3.3 | interfaceName | String | 否 | 接口名 |
3.4 | totalCount | Int | 否 | 总记录数 |
3.5 | transInfoList | List\<Object> | 是 | 交易信息列表 |
3.5.1 | Object | 是 | 交易信息实体 | |
3.5.1.1 | transCount | Int | 是 | 交易记录数 |
3.5.1.2 | time | LcalDateTime | 是 | 时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"groupId": 300001,
"userName": "0x5d97f8d41638a7b1b669b70b307bab6d49df8e2c",
"interfaceName": "0x4ed3885e",
"totalCount": 1,
"transInfoList": [
{
"transCount": 1,
"time": "2019-03-13 15:41:56"
}
]
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
7.4 获取异常用户信息列表¶
7.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/unusualUserList/{groupId}/{pageNumber}/{pageSize}?userName={userName}
- 请求方式:GET
- 返回格式:JSON
7.4.2 参数信息详情¶
请求参数
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | userName | String | 是 | 用户名 |
3 | pageNumber | int | 否 | 当前页码 |
4 | pageSize | int | 否 | 页面大小 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/unusualUserList/300001/1/10?userName=
7.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 返回信息列表 |
4.1 | object | 是 | 返回信息实体 | |
4.1.1 | userName | String | 是 | 用户名 |
4.1.2 | transCount | int | 是 | 交易数 |
4.1.3 | hashs | String | 是 | 交易hash |
4.1.4 | time | LocalDateTime | 是 | 时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userName": "0x08b52f85638a925929cf62a3ac77c67415012c24",
"transCount": 1,
"hashs": "0x43b50faa3f007c22cf5dd710c3561c5cde516e01a55b5b4acffd7d94cf61fc57",
"time": "2019-03-13 22:28:29"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
7.5 获取异常合约信息列表¶
7.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/unusualContractList/{groupId}/{pageNumber}/{pageSize}?contractAddress={contractAddress}
- 请求方式:GET
- 返回格式:JSON
7.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | contractAddress | String | 是 | 合约地址 |
3 | pageNumber | int | 否 | 当前页码 |
4 | pageSize | int | 否 | 页面大小 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/unusualContractList/300001/1/10?contractAddress=
7.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 返回信息列表 |
4.1 | object | 是 | 返回信息实体 | |
4.1.1 | contractName | String | 是 | 合约名称 |
4.1.2 | contractAddress | String | 是 | 合约地址 |
4.1.3 | transCount | int | 是 | 交易数 |
4.1.4 | hashs | String | 是 | 交易hash |
4.1.5 | time | LocalDateTime | 是 | 时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"contractName": "0x00000000",
"contractAddress": "0x0000000000000000000000000000000000000000",
"transCount": 3,
"hashs": "0xc87e306db85740895369cc2a849984fe544a6e9b0ecdbd2d898fc0756a02a4ce",
"time": "2019-03-13 15:41:56"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8 群组信息模块¶
8.1 获取群组概况¶
8.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/general/{groupId}
- 请求方式:GET
- 返回格式:JSON
8.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/300001
8.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
3.1 | groupId | int | 否 | 群组id |
3.2 | nodeCount | int | 否 | 节点数量 |
3.3 | contractCount | int | 否 | 已部署智能合约数量 |
3.4 | transactionCount | int | 否 | 交易数量 |
3.5 | latestBlock | int | 否 | 当前块高 |
2)出参示例
- 成功:
{
"code": 0,
"data": {
"latestBlock": 7156,
"contractCount": 0,
"groupId": "300001",
"nodeCount": 2,
"transactionCount": 7131
},
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.2 获取所有群组列表¶
默认只返回groupStatus为1的群组ID,可传入groupStatus筛选群组 (1-normal, 2-maintaining, 3-conflict-genesisi, 4-conflict-data)
8.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/all
- 请求方式:GET
- 返回格式:JSON
8.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupStatus | int | 是 | 群组状态,1-normal, 2-maintaining, 3-conflict-genesisi, 4-conflict-data |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/all
http://127.0.0.1:5001/WeBASE-Node-Manager/group/all/{groupStatus}
8.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 组织信息对象 | ||
4.1.1 | groupId | Integer | 否 | 群组编号 |
4.1.2 | groupName | String | 否 | 群组名称 |
4.1.2 | groupStatus | Integer | 否 | 群组状态:1-正常, 2-维护中, 3-脏数据, 4-创世块冲突 |
4.1.2 | nodeCount | Integer | 否 | 群组节点数 |
4.1.3 | latestBlock | BigInteger | 否 | 最新块高 |
4.1.4 | transCount | BigInteger | 否 | 交易量 |
4.1.5 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.2 | description | String | 否 | 群组描述 |
4.1.2 | groupType | Integer | 否 | 群组类别:1-同步,2-动态创建 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"groupId":1,
"groupName":"group1",
"groupStatus":1,
"nodeCount":4,
"latestBlock":0,
"transCount":0,
"createTime":"2020-05-07 16:32:02",
"modifyTime":"2020-05-08 10:50:13",
"description":"synchronous",
"groupType":1
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.3 查询每日交易数据¶
8.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/transDaily/{groupId}
- 请求方式:GET
- 返回格式:JSON
8.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/transDaily/300001
8.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | list | 否 | 返回信息列表 |
3.1 | object | 返回信息实体 | ||
4.1 | day | string | 否 | 日期YYYY-MM-DD |
4.2 | groupId | int | 否 | 群组编号 |
4.3 | transCount | int | 否 | 交易数量 |
2)出参示例
- 成功:
{
"code": 0,
"data": [
{
"day": "2018-11-21",
"groupId": "300001",
"transCount": 12561
},
{
"day": "2018-11-22",
"groupId": "300001",
"transCount": 1251
}
],
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.4 向单个节点生成新群组¶
向单个节点的前置发起请求,以当前时间生成timestamp
时间戳,nodeList
为群组创世块的共识节点列表,生成新群组配置信息;节点和前置一一对应,节点编号可以从前置列表获取。
nodeList
需要填入新群组中所有的nodeId,通过本接口分别请求每个节点,在每个节点生成群组配置信息。
群组生成后,需对应调用新群组启动的接口,并确保新节点加入新群组的共识节点/观察节点
节点加入已存在群组并启动后,可调用POST /precompiled/consensus
接口将该节点加入到新加入群组的共识节点或观察节点中
8.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/generate/{nodeId}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
8.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | String | 否 | 路径变量:节点id |
2 | generateGroupId | Integer | 否 | 新群组编号 |
3 | timestamp | Integer | 否 | 群组创世块时间戳 |
4 | nodeList | List |
否 | 新群组中所有共识节点 |
5 | description | String | 是 | 群组描述 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/generate/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2
{
"generateGroupId": 2,
"timestamp": 1574853659000,
"nodeList": [
"78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2",
"dd7a2964007d583b719412d86dab9dcf773c61bccab18cb646cd480973de0827cc94fa84f33982285701c8b7a7f465a69e980126a77e8353981049831b550f5c"
],
"description": "test"
}
8.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 组织列表 |
3.1 | Object | 组织信息对象 | ||
3.1.1 | groupId | int | 否 | 群组编号 |
3.1.2 | groupName | String | 否 | 群组名称 |
3.1.3 | groupStatus | Integer | 否 | 群组状态:1-正常, 2-维护中, 3-脏数据, 4-创世块冲突 |
3.1.4 | nodeCount | Integer | 否 | 群组节点数 |
3.1.5 | description | String | 否 | 描述 |
3.1.6 | groupType | Integer | 否 | 群组类型: 1-同步 2-动态创建 |
3.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
3.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"groupId": 2,
"groupName": "group2",
"nodeCount": 2,
"groupStatus": 2,
"groupType": 2,
"description": "test",
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-03-15 09:36:17"
}
}
- 失败:
{
"code": 202301,
"message": "node's front not exists",
"data": {}
}
8.5 向多个节点生成新群组¶
向nodeList
中所有节点的前置发起请求,以当前时间生成timestamp
时间戳,以nodeList
为创世块的共识节点列表,生成新群组配置信息;节点和前置一一对应,节点编号可以从前置列表获取。
群组生成后,需对应调用新群组启动的接口,并确保新节点加入新群组的共识节点/观察节点
节点加入已存在群组并启动后,可调用POST /precompiled/consensus
接口将该节点加入到新加入群组的共识节点或观察节点中
8.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/generate
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
8.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | generateGroupId | Integer | 否 | 新群组编号 |
2 | timestamp | Integer | 否 | 群组创世块时间戳 |
3 | nodeList | List |
否 | 新群组中所有共识节点 |
4 | description | String | 是 | 群组描述 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/generate
{
"generateGroupId": 2,
"timestamp": 1574853659000,
"nodeList": [
"78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2",
"dd7a2964007d583b719412d86dab9dcf773c61bccab18cb646cd480973de0827cc94fa84f33982285701c8b7a7f465a69e980126a77e8353981049831b550f5c"
],
"description": "test"
}
8.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 群组操作结果 |
3.1 | frontId | Integer | 否 | 群组操作请求的节点前置编号 |
3.2 | code | Integer | 否 | 群组操作结果,0-成功,其他:失败 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"frontId": 500011,
"code": 0
}, {
"frontId": 500013,
"code": 1
}]
}
- 失败:
{
"code": 202301,
"message": "node's front not exists",
"data": {}
}
8.6 动态操作群组¶
可以对已存在的群组或新生成的群组进行动态操作,包括启动、停止、删除、恢复、状态查询。
说明: 生成新群组后,需要向每个前置调用启动群组的操作,并确保新节点是新群组中的共识节点/观察节点
节点加入已存在群组并启动后,可调用POST /precompiled/consensus
接口将该节点加入到新加入群组的共识节点或观察节点中
8.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/operate/{nodeId}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
8.6.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | String | 否 | 路径变量:节点id |
2 | generateGroupId | Integer | 否 | 新群组编号 |
3 | type | String | 否 | 操作类型: start, stop, remove, recover, getStatus |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/operate/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2
{
"generateGroupId": 2,
"type": "start"
}
8.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {}
}
- 失败:
{
"code": 205032,
"message": "Group 2 is already running",
"data": null
}
8.7 批量启动群组¶
批量启动多个节点的群组,向nodeList
中所有节点批量发起启动群组的请求;nodeId可以从前置列表获取。
8.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/batchStart
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
8.7.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | generateGroupId | Integer | 否 | 新群组编号 |
2 | nodeList | List |
否 | 新群组中所有需要启动的节点nodeId |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/batchStart
{
"generateGroupId": 2,
"nodeList": [
"78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2",
"dd7a2964007d583b719412d86dab9dcf773c61bccab18cb646cd480973de0827cc94fa84f33982285701c8b7a7f465a69e980126a77e8353981049831b550f5c"
]
}
8.7.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 群组操作结果 |
3.1 | frontId | Integer | 否 | 群组操作请求的节点前置编号 |
3.2 | code | Integer | 否 | 群组操作结果,0-成功,其他:失败 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"frontId": 500011,
"code": 0 // 启动成功
}, {
"frontId": 500013,
"code": 1 // 启动失败
}]
}
- 失败:
{
"code": 205032,
"message": "Group 2 is already running",
"data": null
}
8.8 多个节点获取该节点的多个群组状态¶
向多个节点获取该节点视角下groupIdList
中所有群组的状态;nodeId可以从前置列表获取。
群组状态包含:群组不存在”INEXISTENT”、群组正在停止”STOPPING”、群组运行中”RUNNING”、群组已停止”STOPPED”、群组已删除”DELETED”
8.8.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/queryGroupStatus/list
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
8.8.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeIdList | List |
否 | 需要获取群组状态的节点编号列表 |
2 | groupIdList | List |
否 | 需要查询群组状态的群组编号列表 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/queryGroupStatus/list
{
"nodeIdList": [
"02ad41a54e5403293855624e6088a1ac6c0a391d6381175bb9c9881f2ae83de6db54fc95a772f22b9e62109393c1a4229dc6d99536548db693e43b244a5b9d84",
"3fc60c4dddcb8f64c910b7afc4bd400339a007eff9be22012c5ae2f7eebef67a4b770094bf7564dd100e1456d85a72f3488457e9f4d44d51e289071d995285d7"
]
"groupIdList": [2]
}
8.8.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | GroupStatusInfo的列表 |
3.1 | nodeId | String | 包含groupId和GroupStatus的Map{"1": "RUNNING","20","INEXISTENT"} |
|
3.2 | groupStatusMap | Map | 包含groupId和GroupStatus的Map<String,String> , 如{"1": "RUNNING","20","INEXISTENT"} |
|
3.2.1 | groupId | String | 否 | 群组编号,如果获取失败,则显示为<nodeId, "FAIL"> ,如下所示 |
3.2.2 | groupStatus | String | 否 | 链上的群组状态:"INEXISTENT"、"STOPPING"、"RUNNING"、"STOPPED"、"DELETED", 获取失败为"FAIL" |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"nodeId": "02ad41a54e5403293855624e6088a1ac6c0a391d6381175bb9c9881f2ae83de6db54fc95a772f22b9e62109393c1a4229dc6d99536548db693e43b244a5b9d84",
"groupStatusMap": {
// 当前nodeId获取群组2状态成功
"2": "RUNNING"
}
}, {
"nodeId": "3fc60c4dddcb8f64c910b7afc4bd400339a007eff9be22012c5ae2f7eebef67a4b770094bf7564dd100e1456d85a72f3488457e9f4d44d51e289071d995285d7",
"groupStatusMap": {
// 当前nodeId获取群组2状态成功
"2": "RUNNING"
}
}]
}
- 获取群组状态成功,但某个节点的获取请求失败:
{
"code": 0,
"message": "success",
"data": [{
"nodeId": "02ad41a54e5403293855624e6088a1ac6c0a391d6381175bb9c9881f2ae83de6db54fc95a772f22b9e62109393c1a4229dc6d99536548db693e43b244a5b9d84",
"groupStatusMap": {
"2": "RUNNING"
}
}, {
"nodeId": "3fc60c4dddcb8f64c910b7afc4bd400339a007eff9be22012c5ae2f7eebef67a4b770094bf7564dd100e1456d85a72f3488457e9f4d44d51e289071d995285d7",
"groupStatusMap": {
// 3fc6..节点的状态获取失败
"3fc60c4dddcb8f64c910b7afc4bd400339a007eff9be22012c5ae2f7eebef67a4b770094bf7564dd100e1456d85a72f3488457e9f4d44d51e289071d995285d7": "FAIL"
}
}]
}
- 失败:
{
"code": 202301,
"message": "node's front not exists"
}
8.9 刷新群组列表¶
刷新节点管理服务的群组列表,检查本地群组数据与链上群组数据是否有冲突,检查多个节点之间的创世块是否一致,并从链上拉取最新的群组列表
8.9.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/update
- 请求方式:GET
- 返回格式:JSON
8.9.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | - | - | - | - |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/update
8.9.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | list | 否 | 返回信息列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {}
}
8.10 获取所有群组列表(包含异常群组)¶
返回所有群组,包含正常运行、维护中、脏数据冲突、创世块冲突4种状态的群组
8.10.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/all/invalidIncluded
- 请求方式:GET
- 返回格式:JSON
8.10.2 请求参数¶
1)入参表 | 序号 | 输入参数 | 类型 | 可为空 | 备注 | |——|————-|—————|——–|——————————-| | 1 | pageSize | Integer | 否 | 每页记录数 | | 2 | pageNumber | Integer | 否 | 当前页码 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/all/invalidIncluded/{pageNumber}/{pageSize}
8.10.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Integer | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 组织信息对象 | ||
4.1.1 | groupId | Integer | 否 | 群组编号 |
4.1.2 | groupName | String | 否 | 群组名称 |
4.1.2 | groupStatus | Integer | 否 | 群组状态:1-正常, 2-维护中, 3-脏数据, 4-创世块冲突 |
4.1.2 | nodeCount | Integer | 否 | 群组节点数 |
4.1.3 | latestBlock | BigInteger | 否 | 最新块高 |
4.1.4 | transCount | BigInteger | 否 | 交易量 |
4.1.5 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.2 | description | String | 否 | 群组描述 |
4.1.2 | groupType | Integer | 否 | 群组类别:1-同步,2-动态创建 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"groupId":1,
"groupName":"group1",
"groupStatus":1,
"nodeCount":4,
"latestBlock":0,
"transCount":0,
"createTime":"2020-05-07 16:32:02",
"modifyTime":"2020-05-08 10:50:13",
"description":"synchronous",
"groupType":1
},
{
"groupId":2020,
"groupName":"group2020",
"groupStatus":2,
"nodeCount":2,
"latestBlock":0,
"transCount":0,
"createTime":"2020-05-07 16:32:02",
"modifyTime":"2020-05-08 10:50:13",
"description":"",
"groupType":2
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.11 删除群组所有数据¶
删除指定群组编号的群组的所有数据,包含节点数据、交易数据、交易审计数据等等。
8.11.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/{groupId}
- 请求方式:DELETE
- 返回格式:JSON
8.11.2 请求参数¶
1)入参表 | 序号 | 输入参数 | 类型 | 可为空 | 备注 | |——|————-|—————|——–|——————————-| | 1 | groupId | Integer | 否 | 群组编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/{groupId}
8.11.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 202006,
"message": "invalid group id"
}
9 节点管理模块¶
9.1 查询节点列表¶
9.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/nodeList/{groupId}/{pageNumber}/{pageSize}?nodeName={nodeName}
- 请求方式:GET
- 返回格式:JSON
9.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | pageSize | Int | 否 | 每页记录数 |
3 | pageNumber | Int | 否 | 当前页码 |
4 | nodeName | String | 是 | 节点名称 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/node/nodeList/300001/1/10?nodeName=
9.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 节点列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | nodeId | int | 否 | 节点编号 |
4.1.2 | nodeName | string | 否 | 节点名称 |
4.1.3 | groupId | int | 否 | 所属群组编号 |
4.1.4 | nodeActive | int | 否 | 状态 |
4.1.5 | nodeIp | string | 否 | 节点ip |
4.1.6 | P2pPort | int | 否 | 节点p2p端口 |
4.1.7 | description | String | 否 | 备注 |
4.1.8 | blockNumber | BigInteger | 否 | 节点块高 |
4.1.9 | pbftView | BigInteger | 否 | Pbft view |
4.1.10 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"nodeId": 500001,
"nodeName": "127.0.0.1_10303",
"groupId": 300001,
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
9.2 查询节点信息¶
9.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/nodeInfo/{groupId}?nodeType={nodeType}
- 请求方式:GET
- 返回格式:JSON
9.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/node/nodeInfo/1
9.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 节点信息对象 | |
3.1 | nodeId | int | 否 | 节点编号 |
3.2 | nodeName | string | 否 | 节点名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | nodeActive | int | 否 | 状态 |
3.5 | nodeIp | string | 否 | 节点ip |
3.6 | P2pPort | int | 否 | 节点p2p端口 |
3.7 | description | String | 否 | 备注 |
3.8 | blockNumber | BigInteger | 否 | 节点块高 |
3.9 | pbftView | BigInteger | 否 | Pbft view |
3.10 | createTime | LocalDateTime | 否 | 落库时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"nodeId": 500001,
"nodeName": "127.0.0.1_10303",
"groupId": 1,
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
10 角色管理模块¶
10.1 查询角色列表¶
10.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:role/roleList
- 请求方式:GET
- 返回格式:JSON
10.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | roleId | int | 否 | 角色id |
2 | roleName | String | 是 | 角色名称 |
3 | pageSize | int | 否 | 每页记录数 |
4 | pageNumber | int | 否 | 当前页码 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/role/roleList?groupId=300001&pageNumber=&pageSize=&roleId=&roleName=
10.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 组织信息对象 | ||
4.1.1 | roleId | Int | 否 | 角色编号 |
4.1.2 | roleName | String | 否 | 角色名称 |
4.1.3 | roleNameZh | String | 否 | 角色中文名称 |
4.1.4 | roleStatus | Int | 否 | 状态(1-正常2-无效) 默认1 |
4.1.5 | description | String | 否 | 备注 |
4.1.6 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 2,
"data": [
{
"roleId": 100000,
"roleName": "admin",
"roleNameZh": "管理员",
"roleStatus": 1,
"description": null,
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-02-14 17:33:50"
},
{
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"roleStatus": 1,
"description": null,
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-02-14 17:33:50"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11 用户管理模块¶
11.1 新增私钥用户¶
11.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/userInfo
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
11.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userName | string | 否 | 用户名称 |
2 | description | string | 是 | 备注 |
3 | groupId | Int | 否 | 所属群组 |
4 | account | string | 否 | 关联账户 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/userInfo
{
"groupId": "300001",
"description": "密钥拥有者",
"userName": "user1",
"account": "admin"
}
11.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | string | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700007,
"userName": "asdfvw",
"groupId": 300001,
"publicKey": "0x4189fdacff55fb99172e015e1adc360777bee6682fcc975238aabf144fbf610a3057fd4b5",
"userStatus": 1,
"userType": 1,
"address": "0x40ec3c20b5178401ae14ad8ce9c9f94fa5ebb86a",
"hasPk": 1,
"description": "sda",
"account": "admin",
"createTime": "2019-03-15 18:00:27",
"modifyTime": "2019-03-15 18:00:27"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11.2 绑定公钥用户¶
11.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/bind
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
11.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userName | string | 否 | 用户名称 |
2 | description | string | 是 | 备注 |
3 | groupId | Int | 否 | 所属群组 |
4 | account | string | 否 | 关联账户 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/userInfo
{
"userName": "sdfasd",
"publicKey": "0x4189fdacff55fb99172e015e1adb96dc77b0cae1619b1a41cc360777bee6682fcc9752d8aabf144fbf610a3057fd4b5",
"groupId": "300001",
"description": "sdfa",
"account": "admin"
}
11.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | string | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700007,
"userName": "asdfvw",
"groupId": 300001,
"publicKey": "0x4189fdacff55fb99172e015e1adb96dc77b0cae1619b1a41cc360777bee6682fcc9752d8aabf144fbf610a3057fd4b5",
"userStatus": 1,
"userType": 1,
"address": "0x40ec3c20b5178401ae14ad8ce9c9f94fa5ebb86a",
"hasPk": 1,
"description": "sda",
"account": "admin",
"createTime": "2019-03-15 18:00:27",
"modifyTime": "2019-03-15 18:00:27"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11.3 修改用户备注¶
11.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/userInfo
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
11.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userId | int | 否 | 用户编号 |
2 | description | String | 是 | 备注 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/userInfo
{
"userId": "400001",
"description": "newDescription"
}
11.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | string | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 400001,
"userName": "asdfvw",
"groupId": 300001,
"publicKey": "0x4189fdacff55fb99172e015e1682fcc9752d8aabf144fbf610a3057fd4b5",
"userStatus": 1,
"userType": 1,
"address": "0x40ec3c20b5178401ae14ad8ce9c9f94fa5ebb86a",
"hasPk": 1,
"description": "newDescription",
"account": "admin",
"createTime": "2019-03-15 18:00:27",
"modifyTime": "2019-03-15 18:00:27"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11.4 查询私钥(1.3.0已移除)¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/privateKey/{userId}
- 请求方式:GET
- 返回格式:json
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userId | int | 否 | 用户编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/privateKey/4585
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回私钥信息实体 |
3.1 | privateKey | String | 否 | 私钥 |
3.2 | address | String | 否 | 用户链上地址 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"privateKey": 123456,
"address": "asfsafasfasfasfasfas"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11.5 查询用户列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/userList/{groupId}/{pageNumber}/{pageSize}?userParam={userName}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组id |
2 | pageSize | Int | 否 | 每页记录数 |
3 | pageNumber | Int | 否 | 当前页码 |
4 | userParam | String | 是 | 查询参数(用户名或公钥地址) |
5 | account | string | 是 | 关联账户 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/userList/300001/1/10?userParam=asdfvw
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 用户列表 |
4.1 | Object | 用户信息对象 | ||
4.1.1 | userId | int | 否 | 用户编号 |
4.1.2 | userName | string | 否 | 用户名称 |
4.1.3 | groupId | int | 否 | 所属群组编号 |
4.1.4 | description | String | 是 | 备注 |
4.1.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
4.1.6 | publicKey | String | 否 | 公钥信息 |
4.1.7 | address | String | 是 | 在链上位置的hash |
4.1.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
4.1.9 | account | string | 否 | 关联账户 |
4.1.10 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"userId": 700007,
"userName": "asdfvw",
"groupId": 300001,
"publicKey": "0x4189fdacff55fb99172e015e1adb96dc71cc360777bee6682fcc975238aabf144fbf610a3057fd4b5",
"userStatus": 1,
"userType": 1,
"address": "0x40ec3c20b5178401ae14ad8ce9c9f94fa5ebb86a",
"hasPk": 1,
"description": "sda",
"account": "admin",
"createTime": "2019-03-15 18:00:27",
"modifyTime": "2019-03-15 18:00:28"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11.6 导入私钥用户¶
可在页面导入WeBASE-Front所导出的私钥txt文件
其中私钥字段用Base64加密
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/import
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | privateKey | string | 否 | Base64加密后的私钥内容 |
2 | userName | string | 否 | 用户名称 |
3 | description | string | 是 | 备注 |
4 | groupId | Int | 否 | 所属群组 |
5 | account | string | 否 | 关联账户 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/import
{
"privateKey": "OGFmNWIzMzNmYTc3MGFhY2UwNjdjYTY3ZDRmMzE4MzU4OWRmOThkMjVjYzEzZGFlMGJmODhkYjhlYzVhMDcxYw==",
"groupId": "300001",
"description": "密钥拥有者",
"userName": "user1",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 201031,
"message": "privateKey decode fail",
"data": null
}
11.7 导入.pem私钥¶
可导入控制台所生成的私钥.pem文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/importPem
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pemContent | string | 否 | pem文件的内容,必须以-----BEGIN PRIVATE KEY-----\n 开头,以\n-----END PRIVATE KEY-----\n 结尾的格式 |
2 | userName | string | 否 | 用户名称 |
3 | description | string | 是 | 备注 |
4 | groupId | Int | 否 | 所属群组 |
5 | account | string | 否 | 关联账户 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/importPem
{
"pemContent":"-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgC8TbvFSMA9y3CghFt51/\nXmExewlioX99veYHOV7dTvOhRANCAASZtMhCTcaedNP+H7iljbTIqXOFM6qm5aVs\nfM/yuDBK2MRfFbfnOYVTNKyOSnmkY+xBfCR8Q86wcsQm9NZpkmFK\n-----END PRIVATE KEY-----\n",
"groupId": "1",
"description": "密钥拥有者",
"userName": "user2",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 201232,
"message": "Pem file format error, must surrounded by -----XXXXX PRIVATE KEY-----"",
"data": null
}
11.8 导入.p12私钥¶
可导入控制台生成的私钥.p12文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/importP12
- 请求方式:POST
- 请求头:Content-type: form-data
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | p12File | MultipartFile | 否 | .p12文件 |
2 | p12Password | string | 是 | 使用base64编码的密码;.p12文件的密码,缺省时默认为"",即空密码;p12无密码时,可传入空值或不传;不包含中文 |
3 | userName | string | 否 | 用户名称 |
4 | description | string | 是 | 备注 |
5 | groupId | Int | 否 | 所属群组 |
6 | account | string | 否 | 关联账户 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/importP12
使用form-data传参
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:(p12文件的密码错误)
{
"code": 201236,
"message": "p12's password not match",
"data": null
}
11.9 导出明文私钥¶
可在页面导入WeBASE-Front所导出的私钥txt文件
其中私钥字段用Base64加密
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/export/{userId}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | privateKey | string | 否 | Base64加密后的私钥内容 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/export/300001
{
"privateKey": "OGFmNWIzMzNmYTc3MGFhY2UwNjdjYTY3ZDRmMzE4MzU4OWRmOThkMjVjYzEzZGFlMGJmODhkYjhlYzVhMDcxYw==",
"groupId": "1",
"description": "密钥拥有者",
"userName": "user1",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | string | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.12 | privateKey | String | 否 | 私钥,用base64编码 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700003,
"userName": "vivi_d",
"account": "xyzshen",
"groupId": 1,
"publicKey": "04d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85aa9f34ffdc815e0d7a8b64537e17bd81579238c5dd9a86d526b051b13f4062327",
"privateKey": "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYw==",
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0xdbc23ae43a150ff8884b02cea117b22d1c3b9796",
"signUserId": "b751efc5d0cc4e12b90908b1f2670258",
"appId": "1",
"hasPk": 1,
"description": "",
"createTime": "2021-04-06 21:24:12",
"modifyTime": "2021-04-06 21:24:12"
},
"attachment": null
}
11.10 导出.pem私钥¶
导出pem格式的私钥文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/exportPem
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | signUserId | string | 否 | 用户的signUserId |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/exportPem
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
- | - | InputStream | 否 | 返回文件的二进制流 |
2)出参示例
- 成功:
-----BEGIN PRIVATE KEY-----
MIGNAgEAMBAGByqGSM49AgEGBSuBBAAKBHYwdAIBAQQgnAXS1DYA90nML3Kge4Qd
IgMXiQ9cojmRgyjo1BLYXOqgBwYFK4EEAAqhRANCAATLPOzgUzNbo6UeCAjYv2++
FwlBmT1Sa7goXELaazyJEJLbAlAFGB6qvjdA9m2nx5+rTmfGoSuQK9T2hC/vWJfq
-----END PRIVATE KEY-----
12 合约方法管理模块¶
12.1 新增合约方法¶
12.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/method/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
12.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 所属群组 |
2 | methodList | List | 否 | 方法列表 |
2.1 | Object | 否 | 方法实体 | |
2.1.1 | abiInfo | String | 否 | 合约abi信息 |
2.1.2 | methodId | String | 否 | 方法编号 |
2.1.3 | methodType | String | 否 | 方法类型 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/method/add
{
"groupId": 2,
"methodList": [
{
"abiInfo": "fsdabiTestfd232222",
"methodId": "methodIasdfdttttt",
"methodType": "function"
}
]
}
1.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
12.2 根据方法编号查询¶
12.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/method/findById/{groupId}/{methodId}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
12.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 否 | 所属群组 |
2 | methodId | String | 否 | 方法编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/method/findById/2/methodIasdfdttttt
1.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 否 | 方法实体 | |
3.1 | abiInfo | String | 否 | 合约abi信息 |
3.2 | methodId | String | 否 | 方法编号 |
3.3 | methodType | String | 否 | 方法类型 |
3.4 | createTime | LocalDateTime | 否 | 创建时间 |
3.5 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"methodId": "methodIasdfdttttt",
"groupId": 2,
"abiInfo": "fsdabiTestfd232222",
"methodType": "function",
"createTime": "2019-04-16 16:59:27",
"modifyTime": "2019-04-16 16:59:27"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
13 系统管理模块¶
系统管理中的权限管理接口
- 使用FISCO BCOS v2.5.0 与 WeBASE-Node-Manager v1.4.1 (及)以上版本将使用预编译合约中的ChainGovernance接口(本章节接口13.14开始),详情可参考FISCO BCOS基于角色的权限控制
- 使用低于FISCO BCOS v2.5.0 与 WeBASE-Node-Manager v1.4.1版本,则使用接口13.1至13.4接口
13.1 查看权限管理¶
根据PermissionType权限类型,查询该类权限记录列表。共支持查看六种权限的管理员列表:权限管理权限permission, 用户表管理权限userTable, 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
13.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /permission
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | permissionType | String | 否 | 查看拥有某个权限的address list |
3 | tableName | String | 是 | type=UserTable的时候不能为空。查看某个表的管理员list |
4 | pageSize | int | 否 | |
5 | pageNumber | int | 否 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/permission?groupId=1&permissionType=cns&pageSize=5&pageNumber=1
13.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | List数组 | 直接返回数组 | |
4 | totalCount | int | 总数目 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"address": "0x009fb217b6d7f010f12e7876d31a738389fecd51",
"table_name": "_sys_table_access_",
"enable_num": "84"
}
],
"totalCount": 1
}
- 失败:
{
"code": 400,
"message": "Required String parameter 'tableName' is not present"
}
13.2 查看权限管理列表(不分页)¶
根据PermissionType权限类型,查询该类权限记录列表。共支持查看六种权限的管理员列表:权限管理权限permission, 用户表管理权限userTable, 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
13.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /permission/full
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | permissionType | String | 否 | 查看拥有某个权限的address list |
3 | tableName | String | 是 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/permission/full?groupId=1&permissionType=cns
13.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | List数组 | 直接返回数组 | |
4 | totalCount | int | 总数目 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"address": "0x009fb217b6d7f010f12e7876d31a738389fecd51",
"table_name": "_sys_table_access_",
"enable_num": "84"
}
],
"totalCount": 1
}
- 失败:
{
"code": 400,
"message": "Required String parameter 'tableName' is not present"
}
13.3 增加管理权限接口¶
由管理员赋予外部账户地址不同类型的权限,包含六种:权限管理权限permission, 用户表管理权限userTable, 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
其中userTable权限还需传入相应的表明tableName
13.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /permission
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | permissionType | String | 否 | 分配权限的类型(六种:permission, userTable, deployAndCreate, node, cns, sysConfig) |
3 | fromAddress | String | 否 | 管理员自己的地址 |
4 | address | String | 否 | 分配链管理员的用户地址 |
5 | tableName | String | 是 | 当permissionType为userTable时不可为空 |
6 | useAes | Boolean | 是 | 发交易的私钥是否为加密私钥,默认为false |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/permission
{
"groupId": 1,
"permissionType": "permission",
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
13.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -51000,
"message": "table name and address already exist"
}
13.4 去除管理权限接口¶
由管理员去除外部账户地址不同类型的权限,包含六种:权限管理权限permission, 用户表管理权限userTable, 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
其中userTable权限还需传入相应的表明tableName
13.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /permission
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
13.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | permissionType | String | 否 | 分配权限的类型(六种:permission, userTable, deployAndCreate, node, cns, sysConfig) |
3 | fromAddress | String | 否 | 管理员自己的地址 |
4 | address | String | 否 | 分配链管理员的用户地址 |
5 | tableName | String | 是 | 当permissionType为userTable时不可为空 |
6 | useAes | Boolean | 是 | 发交易的私钥是否为加密私钥,默认为false |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/permission
{
"groupId": 1,
"permissionType": "permission",
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
13.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -51001,
"message": "table name and address does not exist"
}
13.5 获取用户权限状态列表¶
获取所有用户的权限状态列表,权限状态包含有四种权限: 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig
13.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /permission/sorted
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | pageSize | int | 是 | 分页大小 |
3 | pageNumber | int | 是 | 分页页码 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/permission/sorted?groupId=1&pageSize=3&pageNumber=1
13.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | List数组 | 返回权限状态数组 | |
3.1 | Object | 以用户地址为key,以用户的权限状态为value的的Map结构体,1为赋予,0为去除 | ||
3.1.1 | deployAndCreate | Int | 用户的部署与建表权限状态:0-已去除,1-已赋予 | |
3.1.2 | cns | Int | 用户的CNS管理权限状态:0-已去除,1-已赋予 | |
3.1.3 | sysConfig | Int | 用户的系统配置管理权限状态:0-已去除,1-已赋予 | |
3.1.4 | node | Int | 用户的节点共识管理权限状态:0-已去除,1-已赋予 | |
4 | totalCount | Int | 总数目 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"0x17de6cd8e173bac6f457f3f73d8d9a1b1dd33451": {
"deployAndCreate": 0,
"cns": 1,
"sysConfig": 0,
"node": 0
}
},
{
"0x202b4245087dbf797f954d8425459bfee3c790f8": {
"deployAndCreate": 1,
"cns": 1,
"sysConfig": 1,
"node": 1
}
},
{
"0x99af2eb68db52ba21a033af235e680feb0ca7ae5": {
"deployAndCreate": 0,
"cns": 0,
"sysConfig": 0,
"node": 0
}
}
],
"totalCount": 11
}
13.6 管理用户权限状态接口¶
管理用户的权限状态,权限状态包含有四种权限: 部署合约和创建用户表权限deployAndCreate, 节点管理权限node, 使用CNS权限cns, 系统参数管理权限sysConfig;1代表赋予权限,0代表去除权限
13.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /permission/sorted
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.6.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 管理员自己的地址 |
3 | address | String | 否 | 分配链管理员的用户地址 |
4 | permissionState | Object | 否 | 使用{"permissionType": 1}的结构格式,1代表赋予,0代表去除;支持cns、deployAndCreate、sysConfig、node四种权限 |
5 | useAes | Boolean | 是 | 发交易的私钥是否为加密私钥,默认为false |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/permission/sorted
{
"groupId": "2",
"fromAddress": "0x09fb217b6d7f010f12e7876d31a738389fecd517",
"address": "0x09fb217b6d7f010f12e7876d31a738389fecd517",
"permissionState": {
"deployAndCreate": 1,
"node": 1,
"sysConfig": 1,
"cns": 1
}
}
13.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List数组 | 返回权限状态数组 | |
3.1 | Object | 以用户地址为key,以用户的权限状态为value的的Map结构体,1为赋予,0为去除 | ||
3.1.1 | deployAndCreate | Int | 用户的部署与建表权限状态:0-已去除,1-已赋予 | |
3.1.2 | cns | Int | 用户的CNS管理权限状态:0-已去除,1-已赋予 | |
3.1.3 | sysConfig | Int | 用户的系统配置管理权限状态:0-已去除,1-已赋予 | |
3.1.4 | node | Int | 用户的节点共识管理权限状态:0-已去除,1-已赋予 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"node": 1,
"sysConfig": 1,
"cns": 1,
"deployAndCreate": 1
}
}
- 失败:
{
"code": 201202,
"message": "permission denied, please check chain administrator permission"
}
13.7 查询CNS接口¶
根据群组id和合约名(或合约名加版本)获取CNS的list列表。
13.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/cns/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.7.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | contractNameAndVersion | String | 否 | 只需要合约名,version缺乏时返回所有版本,version与contractName用英文冒号":"连接 |
4 | pageSize | int | 否 | |
5 | pageNumber | int | 否 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/cns/list?groupId=1&contractNameAndVersion=HelloWorld&pageSize=10&pageNumber=1
13.7.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List数组 | 否 | 描述 |
4 | totalCount | int | 总数目 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"name": "HelloWorld",
"version": "2d36b8ed7ed12da01ed51cc0c85c3002085b17b6",
"address": "0x2d36b8ed7ed12da01ed51cc0c85c3002085b17b6",
"abi": "[{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"constant\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"nameEvent\",\"payable\":false,\"type\":\"event\"}]"
}
],
"totalCount": 1
}
13.8 获取系统配置¶
根据群组id获取系统配置SystemConfig的list列表,目前只支持tx_count_limit, tx_gas_limit两个参数。
13.8.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /sys/config/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.8.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | pageSize | int | 否 | |
3 | pageNumber | int | 否 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/sys/config/list?groupId=1&pageSize=10&pageNumber=1
13.8.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | 数组 | 否 | list包含数据库存储的配置key与对应value |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 6,
"groupId": 1,
"fromAddress": "0x",
"configKey": "tx_gas_limit",
"configValue": "300000000"
},
{
"id": 5,
"groupId": 1,
"fromAddress": "0xd0b56b4ce0e8ce5e064f896d9ad1c16b2603f285",
"configKey": "tx_count_limit",
"configValue": "10002"
}
],
"totalCount": 2
}
13.9 设置系统配置¶
系统配置管理员设置系统配置,目前只支持tx_count_limit, tx_gas_limit两个参数。
13.9.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /sys/config
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.9.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 管理员自己的地址 |
3 | configKey | String | 否 | 目前类型两种(tx_count_limit, tx_gas_limit,用户可自定义key如tx_gas_price |
4 | configValue | String | 否 | |
5 | useAes | Boolean | 是 | 发交易的私钥是否为加密私钥,默认为false |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/sys/config
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"configKey": "tx_count_limit",
"configValue": "1001"
}
13.9.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -50000,
"message": "permission denied"
}
13.10 获取节点列表(节点管理)¶
获取节点的list列表,包含节点id,节点共识状态。
注:接口返回所有的共识/观察节点(无论运行或停止),以及正在运行的游离节点
13.10.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/consensus/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.10.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | pageSize | int | 否 | |
3 | pageNumber | int | 否 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/consensus/list?groupId=1&pageSize=10&pageNumber=1
13.10.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"nodeId": "13e0f2b94cbce924cc3737385a38587939e809fb786c4fc34a6ba3ea97693bccfa173b352ac41f1dbb97e9e4910ccbec1df38ad4020cef3b2044e833188adad9",
"nodeType": "sealer"
},
{
"nodeId": "bce4b2269c25c2cdba30155396bfe90af08c3c08cff205213477683117e4243ebe26588479519e636a5d5d93545cab778435cacacc41993f28f58f60fa5ceb72",
"nodeType": "sealer"
},
{
"nodeId": "e815cc5637cb8c3274c83215c680822e4a0110d0a8315fcf03e43e8e3944edd758c8b173c4e0076f599aa1f853fa207d47cc95d201ae8d0206b71ad5aa8c3f59",
"nodeType": "sealer"
}
],
"totalCount": 3
}
13.11 设置节点共识状态接口(节点管理)¶
节点管理相关接口,可用于节点三种共识状态的切换。分别是共识节点sealer, 观察节点observer, 游离节点remove
13.11.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/consensus
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.11.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 管理员的地址 |
3 | nodeType | String | 否 | 节点类型:observer,sealer,remove |
4 | nodeId | String | 否 | 节点id |
5 | useAes | Boolean | 是 | 发交易的私钥是否为加密私钥,默认为false |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/consensus
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"nodeType": "remove",
"nodeId": "224e6ee23e8a02d371298b9aec828f77cc2711da3a981684896715a3711885a3177b3cf7906bf9d1b84e597fad1e0049511139332c04edfe3daddba5ed60cffa"
}
13.12.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 | |
2)出参示例
- 成功:
[
{
"code": 0,
"message": "success"
}
]
- 失败:
{
"code": -51000,
"message": "nodeId already exist"
}
13.13 CRUD表格操作接口¶
用于操作用户表的CRUD操作,包含create, desc, insert, update, select, remove。
具体sql要求语法参考Fisco-bcos技术文档的 Precompiled Crud API
13.13.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/crud
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.13.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | UserTable管理员的地址 |
3 | sql | String | 否 | 需要调用的sql语句 |
4 | useAes | Boolean | 是 | 发交易的私钥是否为加密私钥,默认为false |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/crud
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"sql": "desc t_demo"
}
13.13.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 调用结果 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"tableName": "t_demo",
"key": "name",
"valueFields": "item_id,item_name",
"optional": "",
"entry": {
"fields": {}
},
"condition": {
"conditions": {}
}
}
}
或者
{
"code": 0,
"message": "success",
"data": {
"Insert OK, 1 row effected"
}
}
- 失败:
{
"code": 201228,
"message": "table not exists",
"data": "Table not exists "
}
13.14 获取链治理委员列表¶
使用FISCO BCOS v2.5.0 与 WeBASE-Node-Manager v1.4.1 (及)以上版本将使用预编译合约中的ChainGovernance接口(本章节接口13.14开始),详情可参考FISCO BCOS基于角色的权限控制
委员的权限包括治理投票、增删节点、冻结解冻合约、冻结解冻账号、修改链配置和增删运维账号。
增加委员需要链治理委员会投票,有效票大于阈值才可以生效,且不重复计票
- 委员默认的投票权重为1,默认投票生效阈值50%,若有两个委员,则需要两个委员都投票增加/撤销的委员权限,
有效票/总票数=2/2=1>0.5
才满足条件。 - 投票有过期时间,根据块高,过期时间为块高超过blockLimit的10倍时过期;过期时间固定不可改。
- 一个用户不能同时作为委员和运维
13.14.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/committee/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.14.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | pageSize | int | 否 | |
3 | pageNumber | int | 否 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/committee/list?groupId=1&pageSize=5&pageNumber=1
13.14.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | List数组 | 直接返回数组 | |
4 | totalCount | int | 总数目 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"address": "0x009fb217b6d7f010f12e7876d31a738389fecd51",
"enable_num": "84"
}
],
"totalCount": 1
}
13.15 增加链治理委员¶
增加委员需要链治理委员会投票,有效票大于阈值才可以生效,且不重复计票
- 委员默认的投票权重为1,默认投票生效阈值50%,若有两个委员,则需要两个委员都投票增加/撤销的委员权限,
有效票/总票数=2/2=1>0.5
才满足条件。 - 投票有过期时间,根据块高,过期时间为块高超过blockLimit的10倍时过期;过期时间固定不可改。
13.15.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/committee
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.15.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 链治理委员地址 |
3 | address | String | 否 | 新的链治理委员地址 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/committee
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
13.15.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -52000,
"message": "committee member already exist"
}
13.16 去除链管理委员接口¶
增加委员需要链治理委员会投票,有效票大于阈值才可以生效,且不重复计票
- 委员默认的投票权重为1,默认投票生效阈值50%,若有两个委员,则需要两个委员都投票增加/撤销的委员权限,
有效票/总票数=2/2=1>0.5
才满足条件。 - 投票有过期时间,根据块高,过期时间为块高超过blockLimit的10倍时过期;过期时间固定不可改。
13.16.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/committee
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
13.16.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 链治理委员地址 |
3 | address | String | 否 | 待取消的链治理委员地址 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/committee
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
13.16.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -52001,
"message": "committee member not exist"
}
13.17 获取链治理委员投票权重¶
委员默认的投票权重为1
13.17.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/committee/weight
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.17.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | address | String | 否 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/committee/weight?groupId=1&address=0x009fb217b6d7f010f12e7876d31a738389fecd51
13.17.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | Integer | 权重值 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 2
}
13.18 更新链治理委员投票权重值¶
委员默认的投票权重为1
13.18.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/committee/weight
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
13.18.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 链治理委员地址 |
3 | address | String | 否 | 新的链治理委员地址 |
4 | weight | int | 否 | 投票权重值 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/committee/weight
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e",
"weight": 2
}
13.18.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -52001,
"message": "committee member not exist"
}
13.19 获取链治理投票阈值¶
默认投票阈值为50,即超过(不包括)50%的票数权重即可通过
13.19.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/threshold
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.19.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/threshold?groupId=1
13.19.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | Integer | 阈值 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 50
}
13.19 更新链治理投票阈值¶
委员默认的投票权重为1
13.19.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/threshold
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
13.19.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 链治理委员地址 |
3 | threshold | int | 否 | 投票阈值 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/threshold
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"threshold": 60
}
13.19.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败,如非委员更新阈值:
{
"code": -52001,
"message": "committee member not exist"
}
13.20 查看运维列表¶
由链治理委员添加运维账号,运维账号可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约。
13.20.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/operator/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.20.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | pageSize | int | 否 | |
3 | pageNumber | int | 否 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/operator/list?groupId=1&pageSize=5&pageNumber=1
13.20.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | List数组 | 直接返回数组 | |
4 | totalCount | int | 总数目 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"address": "0x009fb217b6d7f010f12e7876d31a738389fecd51",
"enable_num": "4"
}
],
"totalCount": 1
}
13.21 增加运维接口¶
由链治理委员添加/去除运维账号,运维账号可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约。
13.21.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/operator
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.21.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
3 | fromAddress | String | 否 | 链治理委员地址 |
4 | address | String | 否 | 运维地址 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/operator
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
13.21.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -52001,
"message": "committee member not exist"
}
或
{
"code": -52005,
"message": "committee member cannot be operator"
}
13.22 去除运维接口¶
由链治理委员添加/去除运维账号,运维账号可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约。
13.22.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/operator
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
13.22.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
3 | fromAddress | String | 否 | 链治理委员地址 |
4 | address | String | 否 | 运维地址 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/governance/operator
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"address": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e"
}
13.22.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -52001,
"message": "committee member not exist"
}
13.23 合约状态管理¶
由合约部署者(一般由运维所部属)与链治理委员共同管理合约的状态,包含冻结/解冻合约、查询合约状态功能
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/contract/status
- 请求方式: POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | fromAddress | String | 否 | 合约管理者地址 |
3 | contractAddress | String | 否 | 已部署的合约地址 |
4 | handleType | String | 否 | 操作类型:freeze-冻结;unfreeze-解冻;getStatus-查询合约状态; |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/contract/status
{
"groupId": 1,
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"contractAddress": "0x2357ad9d97027cd71eea1d639f1e5750fbdfd38e",
"handleType": "freeze"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -52007,
"message": "operator member not exist"
}
13.24 批量查看合约冻结状态¶
传入多个合约地址的List,查看该合约地址的冻结状态
13.24.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/contract/status/list
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.24.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | addressList | List |
否 | 多个合约地址的列表 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/contract/status/list
{
"groupId": 1,
"addressList": ["0x009fb217b6d7f010f12e7876d31a738389fecd51", "0x6b9fb217b6d7f010f12e7876d31a738389feef62"]
}
13.24.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 返回码,0:成功 其它:失败 | |
2 | message | String | 描述 | |
3 | data | Map | 直接返回Map, 0-正常,1-冻结 如:["0x009fb217b6d7f010f12e7876d31a738389fecd51": 0, "0x6b9fb217b6d7f010f12e7876d31a738389feef62": 1] |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
"0x009fb217b6d7f010f12e7876d31a738389fecd51": 0,
"0x6b9fb217b6d7f010f12e7876d31a738389feef62": 1
],
"totalCount": 1
}
13.25 获取链委员会投票记录列表¶
当链委员会发起一笔交易时会产生一条投票记录,此接口返回某群组下的修改记录列表
13.25.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /vote/record/list
- 请求方式:GET
- 返回格式:JSON
13.25.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组编号 |
2 | pageNumber | int | 否 | 页码,从1开始 |
3 | pageSize | int | 否 | 页大小 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/vote/record/list?groupId=1&pageNumber=1&pageSize=10
13.25.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | id | int | 否 | 合约记录编号 |
3.2 | groupId | Int | 否 | 所属群组编号 |
3.3 | timeLimit | Long | 否 | 投票块高限制范围 |
3.4 | fromAddress | String | 否 | 链委员的地址 |
3.5 | type | Int | 否 | 投票类型,1-增加委员,2-去除委员,3-更新委员权重,4-更新阈值 |
3.6 | toAddress | String | 否 | 被修改的外部账户地址,当类型为1,2,3时为非空 |
3.7 | detail | String | 否 | 投票内容详情,当类型为3,4时为非空;3-{weight: 2} ,4-{threshold: 2} |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
4 | totalCount | Int | 总数 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"groupId": 1,
"timeLimit": 200,
"fromAddress": "0x2ac4227e87bccca63893317febadd0b51ad33e1",
"type": 3,
"toAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"detail": "{weight: 2}",
"createTime": "2020-09-18 10:59:02",
"modifyTime": "2020-09-18 10:59:02"
}
],
"totalCount": 1
}
13.26 删除链委员会投票记录¶
删除投票记录
13.26.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /vote/record/{voteId}
- 请求方式:DELETE
- 返回格式:JSON
13.26.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | voteId | int | 否 | 投票记录编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/vote/record/{voteId}
13.26.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
13.27 获取链治理委员列表(包含权重)¶
获取链治理委员列表,同时返回委员投票的权重值
13.27.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /governance/committee/list/sorted
- 请求方式:GET
- 返回格式:JSON
13.27.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组编号 |
2 | pageNumber | int | 否 | 页码,从1开始 |
3 | pageSize | int | 否 | 页大小 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/governance/committee/list/sorted?groupId=1&pageNumber=1&pageSize=10
13.27.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | weight | Int | 否 | 委员投票权重值 |
3.2 | weightRate | BigDecimal | 否 | 权重比 |
3.3 | address | String | 否 | 委员的用户地址 |
3.4 | enable_num | Int | 否 | 委员生效块高 |
4 | totalCount | Int | 总数 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"weight": 1,
"weightRate": 33.3
"address": "0x2ac4227e87bccca63893317febadd0b51ad33e1",
"enable_num": 3
}
],
"totalCount": 1
}
14 证书管理模块¶
14.1 获取证书列表接口¶
获取证书的list列表,返回的列表包含证书指纹、证书内容、证书名字、证书的父证书、证书对应nodeid(节点证书)、证书有效期
注:首次启动项目会自动拉取每一个Front的证书
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回证书相关信息的列表 |
3 | Object | 否 | 单个证书相关信息 | |
3.1 | fingerPrint | String | 否 | 证书的指纹 |
3.1 | certName | String | 否 | 证书名字 |
3.1 | content | String | 否 | 证书文件的内容 |
3.1 | certType | String | 否 | 证书类型:chain, agency, node, sdk等,国密版中node证书分为加密ennode证书与签名gmnode证书 |
3.1 | publicKey | String | 否 | 证书对应nodeid(仅限节点证书公钥) |
3.1 | address | String | 否 | 证书对应地址(仅限节点证书公钥) |
3.1 | father | String | 否 | 证书的父证书指纹 |
3.1 | validityFrom | Date | 否 | 证书有效期开始时间 |
3.1 | validityTo | Date | 否 | 证书有效期结束时间 |
3.1 | createTime | LocalDateTime | 否 | 导入创建时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"fingerPrint": "814D51FB7CBAB33676FE73E8FBBFECB3D3B1301A",
"certName": "sdk",
"content": "-----BEGIN CERTIFICATE-----\nMIICOTCCASGgAwIBAgIJAKHsAYI3TsAOMA0GCSqGSIb3DQEBCwUAMDgxEDAOBgNV\nBAMMB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5j\neTAeFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDIxDDAKBgNVBAMMA3Nk\nazETMBEGA1UECgwKZmlzY28tYmNvczENMAsGA1UECwwEbm9kZTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABJ79rSKIb97xZwByW58xH6tzoNKNLaKG7J5wxAEgAb03O2h4\nMkEMLtf/LB7tELOiyCiIEhLScprb1LjvDDt2RDGjGjAYMAkGA1UdEwQCMAAwCwYD\nVR0PBAQDAgXgMA0GCSqGSIb3DQEBCwUAA4IBAQC0u2lfclRmCszBTi2rtvMibZec\noalRC0sQPBPRb7UQhGCodxmsAT3dBUf+s4wLLrmN/cnNhq5HVObbWxzfu7gn3+IN\nyQEeqdbGdzlu1EDcaMgAz6p2W3+FG/tmx/yrNza29cYekWRL44OT5LOUPEKrJ4bJ\neOBRY4QlwZPFmM0QgP7DoKxHXldRopkmvqT4pbW51hWvPgj7KrdqwbVWzuWQuI3i\n3j3O96XZJsaDZ0+IGa5093+TsTNPfWUZzp5Kg+EyNR6Ea1evuMDNq9NAqqcd5bX9\nO9kgkb8+llO8I5ZhdnN0BuhGvv9wpsa9hW8BImOLzUBwfSVYouGCkoqlVq9X\n-----END CERTIFICATE-----\n",
"certType": "node",
"publicKey": "9efdad22886fdef16700725b9f311fab73a0d28d2da286ec9e70c4012001bd373b687832410c2ed7ff2c1eed10b3a2c828881212d2729adbd4b8ef0c3b764431",
"address": "5cb81b06ef0734fff99929c5deae4a5b25e800cc",
"father": "EEBAAB2F674D05CF1EAD70367B4D2A928D894EF8",
"validityFrom": 1562860800000,
"validityTo": 1878220800000,
"createTime": 1569686400000
}
],
"totalCount": 1
}
14.2 根据指纹获取证书接口¶
根据指纹获取单个证书
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | fingerPrint | String | 否 | 证书指纹,证书唯一标识 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/cert?fingerPrint=814D51FB7CBAB33676FE73E8FBBFECB3D3B1301A
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回 |
3 | Object | 否 | 单个证书相关信息 | |
3.1 | fingerPrint | String | 否 | 证书的指纹 |
3.1 | certName | String | 否 | 证书名字 |
3.1 | content | String | 否 | 证书文件的内容 |
3.1 | certType | String | 否 | 证书类型:chain, agency, node, sdk等,国密版node证书分为加密ennode证书与签名gmnode证书 |
3.1 | publicKey | String | 否 | 证书对应nodeid(仅限节点证书公钥) |
3.1 | address | String | 否 | 证书对应地址(仅限节点证书公钥) |
3.1 | father | String | 否 | 证书的父证书指纹 |
3.1 | validityFrom | Date | 否 | 证书有效期开始时间 |
3.1 | validityTo | Date | 否 | 证书有效期结束时间 |
3.1 | createTime | LocalDateTime | 否 | 导入创建时间 |
2)出参示例
- 成功:’
{
"code": 0,
"message": "success",
"data": {
"fingerPrint": "EEBAAB2F674D05CF1EAD70367B4D2A928D894EF8",
"certName": "agencyA",
"content": "-----BEGIN CERTIFICATE-----\nMIIDADCCAeigAwIBAgIJAJUF2Dp1a9U6MA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNV\nBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAe\nFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDgxEDAOBgNVBAMMB2FnZW5j\neUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBANBT4CTciIYdSeEabgJzif+CFB0y3GzG\ny+XQYtWK+TtdJWduXqhnnZiYAZs7OPGEu79Yx/bEpjEXsu2cXH0D6BHZk+wvuxG6\nezXWq5MYjCw3fQiSRWkDYoxzWgulkRyYROF1xoZeNGQssReFmCgP+pcQwRxjcq8z\nIA9iT61YxyW5nrS7xnra9uZq/EE3tsJ0ae3ax6zixCT66aV49S27cMcisS+XKP/q\nEVPxhO7SUjnzZY69MgZzNSFxCzIbapnlmYAOS26vIT0taSkoKXmIsYssga45XPwI\n7YBVCc/34kHzW9xrNjyyThMWOgDsuBqZN9xvapGSQ82Lsh7ObN0dZVUCAwEAAaMQ\nMA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAu3aHxJnCZnICpHbQ\nv1Lc5tiXtAYE9aEP5cxb/cO14xY8dS+t0wiLIvyrE2aTcgImzr4BYNBm1XDt5suc\nMpzha1oJytGv79M9/WnI/BKmgUqTaaXOV2Ux2yPX9SadNcsD9/IbrV0b/hlsPd6M\nK8w7ndowvBgopei+A1NQY6jTDUKif4RxD4u5HZFWUu7pByNLFaydU4qBKVkucXOq\nxmWoupL5XrDk5o490kiz/Zgufqtb4w6oUr3lrQASAbFB3lID/P1ipi0DwX7kZwVX\nECDLYvr+eX6GbTClzn0JGuzqV4OoRo1rrRv+0tp1aLZKpCYn0Lhf6s1iw/kCeM2O\nnP9l2Q==\n-----END CERTIFICATE-----\n",
"certType": "agency",
"publicKey": "",
"address": "",
"father": "",
"validityFrom": 1562860800000,
"validityTo": 1878220800000,
"createTime": 1569686400000
}
}
14.3 导入证书接口¶
导入保存证书文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
14.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | content | String | 否 | 证书文件的内容,需保留开头与结尾以及证书原有的回车\n的格式文本;证书中包含多个证书亦可 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/cert
{
"content": "-----BEGIN CERTIFICATE-----\nMIICOzCCASOgAwIBAgIJANJZtoFLZsGcMA0GCSqGSIb3DQEBCwUAMDgxEDAOBgNVBAMMB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTAeFw0xOTA5MDUwNzQ3NDdaFw0yOTA5MDIwNzQ3NDdaMDQxDjAMBgNVBAMMBW5vZGUzMRMwEQYDVQQKDApmaXNjby1iY29zMQ0wCwYDVQQLDARub2RlMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE9CwTicQwi5Gx1gckJ0ibZbcIoL13IHyLK7z4xuzkAi+PbgI9M3vKDuMzZ73IFKCYOwzfhvqM8ksFonpBZqT0NqMaMBgwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQELBQADggEBAIv+PE8bQlxxVDxfUlevf3jJeaK97U5tmP8Tx1pesblzcMWTC8OxfUtYP0zy4CQL0zo6OjmSn4FYvTyDUSVqj5BXXDXiZQwtWxnPgLD75tqSTlFcR2jB+amhmzWQ7mXgfepvL+RV+1OL8WXJy7Xl01fL0nCwHaWCCwaBg+KnUgbc9YXhhyH8X8aqDDpjz9oYpZcbLITGI0V8lvr1EU3NII6LudgGp/xNolQDBOYZX1E0XtUwMUp6Az2xbmSH/7S3sXJCwgHZrtoiKkcFLbss1TDk/UdUya4n/dz4BcH3OzR2MvMHenA8kh4yaofJNsJeXFqPHAbI5+yUVK2+VK2hI0o=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDPTCCAiWgAwIBAgIJAKUGxOHHqV05MA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNVBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAeFw0xOTA5MDUwNzI2MTJaFw0yOTA5MDIwNzI2MTJaMDUxDjAMBgNVBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM9LlTwIAKp36uB8sjoai2O3R+3KPMN9xAt8/k5+B943CUPF/RDxZ8/7Q2v6Z+t+1v3Dc81aszMr/8YyyCQWh0I3EdWyInsocZ2pBkjymetyE5VOSd+p7I8qc9PpHJKZjy2M9J5bePVjHJxleHP2u6I4QctjZoE8PJnZYT5Q0On0MJATpY856vHbF3Amvxj9dmeLKjF62T/KtyDKlyPTETXOFGMiLerWusXZxFgj0K0xhuXaNkbJI6AdhQnywgn755ugfBDzi24rfsk/BkUf5DVitfWePh4C7zaCZIeTTr8whV3twE2BTv4LENdidxCVUHN1JBvZNGyHaH4gIbwtsZcCAwEAAaNQME4wHQYDVR0OBBYEFNTCWbm1EzCYIXyoF7j3l6IXX3BoMB8GA1UdIwQYMBaAFNTCWbm1EzCYIXyoF7j3l6IXX3BoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAIjYTyxP5ikaGYdwYzQZdF4aqx+7UL3Wo/6LNJa8w2m+pAvC3ILIBcvpDe6lH3cMOz2HwCzFkKlT8Ji1HwsKPywx/9fmO60RvEoPIBanziqONLb8HDUT0QHz3jgCTj46URM6hXIEhFwg4KekpzvqaLPRHHtoCrcebUAmySOlNvlwkSnxJnufp0zFpdNu+kSl1/r21ZRMeu/hNaUb1gOzP06NOB7NodOQ5MR7ItVXyN9rl3fABP3rUFIJ+Z11WmSldaCRCQMlEOkdD8LGFYVj4Q5fx06hcJlPd2arnxALWrZUl2cs+K+MW9qQUUKAQ+7FirdRRk6ZfZtlpHMdlTfAVWA=\n-----END CERTIFICATE-----\n"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 成功保存证书的个数或错误信息 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 2
}
- 失败:
{
"code": 202060,
"message": "cert handle error",
"data": "Could not parse certificate: java.io.IOException: Empty input"
}
14.4 删除证书接口¶
根据证书指纹删除一个证书
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | fingerPrint | String | 否 | 证书指纹,证书的唯一标识 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/cert
{
"fingerPrint": "F588C511F5471860120F7BE8127DE026ADD8378C"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 成功删除证书的个数或错误信息 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 1
}
14.5. 获取明文SDK证书与私钥¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的内容
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert/sdk//{frontId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | frontId | Int | 是 | 前置编号 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/cert/sdk/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | Map |
Map | 是 | key为文件名,value为文件内容 |
1)数据格式
a、成功:
{
"sdk.key": "-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgxqr/d/VgQ0fAr/KvyAeW\nJ6bD1tqxZ5gYOdfIJiK7WOmhRANCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wr\npyoiQkMy1qI5/3Sj4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhP\n-----END PRIVATE KEY-----\n",
"ca.crt": "-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n",
"sdk.crt": "-----BEGIN CERTIFICATE-----\nMIIBeDCCAR+gAwIBAgIJAJoEtSMUsa8HMAoGCCqGSM49BAMCMDgxEDAOBgNVBAMM\nB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTAg\nFw0yMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowMTEMMAoGA1UEAwwDc2Rr\nMRMwEQYDVQQKDApmaXNjby1iY29zMQwwCgYDVQQLDANzZGswVjAQBgcqhkjOPQIB\nBgUrgQQACgNCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wrpyoiQkMy1qI5/3Sj\n4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhPoxowGDAJBgNVHRMEAjAAMAsGA1Ud\nDwQEAwIF4DAKBggqhkjOPQQDAgNHADBEAiANbeRFiiS6mH+vcAOwV3wXd9YW/B2a\n+vrHMm6NwtliRAIgRH4gSF0XLmpVOEO21bJFDGWm9siIX0cnj0R3kNGZcB4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBcTCCARegAwIBAgIJANrOZ+FrVNpIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAeFw0y\nMTA0MDYxMjMwNDBaFw0zMTA0MDQxMjMwNDBaMDgxEDAOBgNVBAMMB2FnZW5jeUEx\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABIqMDvvzvTq8WW1UtJrnnsifw9/OrPsMc9CrrYBsWdwOGhdx\nfNTJA1ss+vngjrhAmWHczvbh+E1WOlDGzpCumeqjEDAOMAwGA1UdEwQFMAMBAf8w\nCgYIKoZIzj0EAwIDSAAwRQIhALsAbAQ9BDeofk4VYzYx2ZAHB1HviDp9ndvXAkLN\nsfHZAiAjViK97dDr3gxP/qHg0e8BG9ptEv7Do8caOPj33F+yOQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n"
}
14.6. 获取SDK证书与私钥压缩包¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的zip压缩包
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert/sdk/zip/{frontId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | frontId | Int | 是 | 前置编号 |
2)数据格式
http://localhost:5002/WeBASE-Front/cert/sdk/zip/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中 |
1)数据格式
a、成功:
headers: content-disposition: attachment;filename*=UTF-8''conf.zip
{
// 二进制流
}
15 订阅事件管理¶
15.1 获取已订阅的出块事件列表¶
获取所有前置中已订阅的节点出块事件列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /event/newBlockEvent/list/{groupId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Integer | 否 | 群组编号 |
2 | pageNumber | Integer | 否 | 页码,从1开始 |
3 | pageSize | Integer | 否 | 页容量 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/event/newBlockEvent/list/{groupId}/{pageNumber}/{pageSize}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | newBlockEvent info |
3.1 | frontInfo | String | 否 | 前置对应IP |
3.1 | id | String | 否 | 订阅信息的id |
3.1 | eventType | Integer | 否 | 事件通知类型,1: newBlockEvent, 2: contractEvent, 3: others |
3.1 | appId | String | 否 | 事件通知对应的应用Id |
3.1 | groupId | Integer | 否 | 群组编号 |
3.1 | exchangeName | String | 否 | exchange名 |
3.1 | queueName | String | 否 | 队列名 |
3.1 | routingKey | String | 否 | 路由键值 |
3.1 | createTime | String | 否 | 订阅信息创建时间 |
4 | totalCount | Integer | 否 | 1: 国密,0:非国密 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontInfo": "127.0.0.1",
"id": "8aba82b570f22a750170f22bcab90000",
"eventType": 1,
"appId": "app2",
"groupId": 1,
"exchangeName": "group001",
"queueName": "user1",
"routingKey": "app2_block_b63",
"createTime": "2020-03-19 17:42:01"
}
],
"totalCount": 1
}
15.2 获取已订阅的合约Event事件列表¶
获取所有前置中已订阅的合约Event事件列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /event/contractEvent/list/{groupId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Integer | 否 | 群组编号 |
2 | pageNumber | Integer | 否 | 页码,从1开始 |
3 | pageSize | Integer | 否 | 页容量 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/event/contractEvent/list/{groupId}/{pageNumber}/{pageSize}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | newBlockEvent info |
3.1 | frontInfo | String | 否 | 前置对应IP |
3.1 | id | String | 否 | 订阅信息的id |
3.1 | eventType | Integer | 否 | 事件通知类型,1: newBlockEvent, 2: contractEvent, 3: others |
3.1 | appId | String | 否 | 事件通知对应的应用Id |
3.1 | groupId | Integer | 否 | 群组编号 |
3.1 | exchangeName | String | 否 | exchange名 |
3.1 | queueName | String | 否 | 队列名 |
3.1 | routingKey | String | 否 | 路由键值 |
3.1 | createTime | String | 否 | 起始区块范围 |
3.1 | fromBlock | String | 否 | 末区块范围 |
3.1 | toBlock | String | 否 | 订阅信息创建时间 |
3.1 | contractAddress | String | 否 | 订阅的合约地址 |
3.1 | contractAbi | String | 否 | 对应合约ABI |
3.1 | topicList | String | 否 | 订阅的合约Event |
4 | totalCount | Integer | 否 | 1: 国密,0:非国密 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontInfo": "127.0.0.1",
"id": "8aba82b5708095af01708095e4f70001",
"eventType": 2,
"appId": "app1",
"groupId": 1,
"exchangeName": "group001",
"queueName": "user1",
"routingKey": "user1_event_app1",
"fromBlock": "latest",
"toBlock": "latest",
"contractAddress": "0x657201d59ec41d1dc278a67916f751f86ca672f7",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"topicList": "SetName(string)",
"createTime": "2020-02-26 16:21:12"
}
],
"totalCount": 1
}
15.3. 获取历史区块EventLog¶
接口描述¶
同步获取历史区块中的EventLog
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /event/eventLogs/list
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约地址 | contractAddress | String | 是 | 已部署合约 | |
3 | 合约ABI | contractAbi | List | 是 | ||
2 | Topic参数 | topics | EventTopicParam | 是 | EventTopicParam包含{String eventName,IndexedParamType indexed1,IndexedParamType indexed2,IndexedParamType indexed3} ,其中IndexedParamType包含{String type,String value} 。eventName为包含参数类型的event名,如SetEvent(uint256,string) ,IndexedParamType中type为indexed参数的类型,value为eventlog需要过滤的参数值 |
|
2 | 开始区块 | fromBlock | Integer | 是 | 始块高 | |
2 | 末区块 | toBlock | Integer | 是 | 末块高 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/event/eventLogs/list
{
"groupId": "1",
"contractAbi": [],
"contractAddress": "0x19fb54101fef551187d3a79ea1c87de8d0ce754e",
"fromBlock": 1,
"toBlock": 1,
"topics": {
"eventName": "SetName",
"indexed1": {
"type": "bool",
"value": true
},
"indexed2": {
"type": "string",
"value": null
}
}
}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [{
"log": {
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0x67c8d9a1bc62586b9feb0c8b1127bf0030f649771db3e3d0d99cd99209851ed8",
"blockHash": "0x0ca880c70a3f24dc5e6052cca4dbb50d9aa0ec973474e07d82e2f5281c54e582",
"blockNumber": 71,
"address": "0xd5d4fcf2a46831510f095bfb447bc945f99309f7",
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033132330000000000000000000000000000000000000000000000000000000000",
"topics": ["0x4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02"]
}, // `org.fisco.bcos.sdk.model.EventLog`,可参考java sdk
"data": ["123"]
}, {
"log": {
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0x7c27078b372cee951dd102edcbbeab6b3b799212e4337d6bfac7f723e487a1fb",
"blockHash": "0x47f8456a656f226d5a4a7206790ae864ae4fb645bca625b87cf0378ecca7e742",
"blockNumber": 72,
"address": "0xd5d4fcf2a46831510f095bfb447bc945f99309f7",
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033333330000000000000000000000000000000000000000000000000000000000",
"topics": ["0x4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02"]
},
"data": ["333"]
}],
"totalCount": 1
}
15.4. 获取ABI与合约所有合约信息¶
接口描述¶
获取导入的ABI与IDE中已部署合约所有合约的地址、合约名字信息
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/event/listAddress/{groupId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/event/listAddress/{groupId}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [{
"type": "contract",
"contractAddress": "0x88156d500422a542435616e5a1e9d2df44c7fc70",
"contractName": "Hello3"
}, {
"type": "contract",
"contractAddress": "0xc2b3b552258b6016f80a070c1aa91bf9e3c48c53",
"contractName": "Hello3"
}, {
"type": "abi",
"contractAddress": "0x7a754bb46418c93b4cec7dcc6fef0676ae6a1e32",
"contractName": "Hello3"
}]
}
15.5. 根据地址获取ABI与合约的合约信息¶
接口描述¶
根据合约地址、合约类型(abi
或contract
)获取导入的ABI与IDE中已部署合约的合约地址、合约名字信息
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/event/contractInfo/{groupId}/{type}/{contractAddress}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | Integer | 是 | ||
2 | 合约类型 | type | String | 是 | 包含contract (IDE部署)和abi (ABI管理导入)两种类型 |
|
3 | 合约地址 | contractAddress | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/event/contractInfo/{groupId}/{type}/{contractAddress}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": {
"abiId": 1,
"groupId": 1,
"contractName": "Hello3",
"contractAddress": "0x7a754bb46418c93b4cec7dcc6fef0676ae6a1e32",
"contractAbi": "",
"contractBin": "",
"createTime": "2020-11-06 15:12:51",
"modifyTime": "2020-11-06 15:12:51"
}
}
16 可视化部署¶
16.1 获取 Docker 镜像版本¶
查询部署时可以选择的 Docker 镜像版本
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/list
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | type | Integer | 否 | 获取配置类型,1: Docker 镜像列表 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/config/list?type=1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功;其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 镜像列表 | |
3.1 | id | Integer | 否 | 镜像编号 |
3.1 | configName | String | 否 | 配置名称 |
3.1 | configType | Integer | 否 | 配置类型,1: Docker 镜像列表 |
3.1 | configValue | String | 否 | 镜像版本 |
3.1 | createTime | Long | 否 | 创建时间 |
3.1 | modifyTime | Long | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"configName": "docker 镜像版本",
"configType": 1,
"configValue": "v2.5.0",
"createTime": 1590577419000,
"modifyTime": 1590577419000
}
]
}
16.2 初始化主机¶
根据填写的节点主机信息,在节点主机上安装主机依赖,并拉取或检测选择的镜像是否存在。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/init
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainName | String | 否 | 链名称,默认为default_chain |
2 | imageTag | String | 否 | 镜像编号, 返回参数中的 id 值 |
3 | dockerImageType | Integer | 否 | Docker 镜像拉取方式,0: 手动获取;1: 自动从 Docker Hub 拉取,2-从CDN拉取;默认为2 |
4 | hostIdList | List |
否 | 需要初始化的主机Id数组 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/init
{
"imageTag": "v2.7.1"
"chainName": "default_chain",
"dockerImageType": "0",
"hostIdList": [1,2,3]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 部署请求结果 |
4 | attachment | List | 否 | 补充信息,比如:如果连接主机失败,表示连接失败的主机 IP |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": ""
}
- 失败:
{
"code": 205015,
"message": "Connect to host error",
"data": "",
"attachment": "172.0.0.2"
}
16.4 检查主机初始化情况¶
调用了主机初始化接口后,若前端页面显示请求超时时,后台初始化操作仍在进行,可以通过此接口检查主机是否初始化完成
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/initCheck
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainName | String | 否 | 链名称,默认为default_chain |
2 | imageTag | String | 否 | 镜像编号, 返回参数中的 id 值 |
3 | dockerImageType | Integer | 否 | Docker 镜像拉取方式,0: 手动获取;1: 自动从 Docker Hub 拉取,2-从CDN拉取;默认为2 |
4 | hostIdList | List |
否 | 需要初始化的主机Id数组 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/initCheck
{
"imageTag": "v2.7.1"
"chainName": "default_chain",
"dockerImageType": "0",
"hostIdList": [1,2,3]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 开关状态,0: 不进入可视化部署;1: 进入可视化部署。 |
3.1 | id | Integer | 否 | 主机编号 |
3.2 | ip | String | 否 | 主机 IP |
3.3 | rootDir | String | 否 | 主机存放节点数据的目录,默认:/opt/fisco |
3.4 | status | Integer | 否 | 主机状态,0: 添加中,1: 初始化中,2: 初始化成功,3: 初始化失败,4:检测成功,5:检测失败,6:配置链成功,7:配置链失败 |
3.5 | remark | Integer | 否 | 部署失败时,主机的错误日志 |
3.6 | createTime | Long | 否 | 创建时间 |
3.7 | modifyTime | Long | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 19,
"ip": "172.0.0.2",
"rootDir": "/root/fisco",
"status": 2,
"remark": "",
"createTime": 1596959644000,
"modifyTime": 1596959661000
},
.......
],
"attachment": null
}
16.5 检查主机端口占用¶
传入主机的节点信息,检查目标主机中需要用到的端口是否已被占用;端口被占用时,报错信息保存在主机列表的remark字段里
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/checkPort
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | deployNodeInfoList | List |
否 | 节点部署信息数组 |
DeployNodeInfo | Object | 否 | 节点的主机编号与端口信息 | |
1.1 | hostId | int | 否 | 主机编号 |
1.2 | ip | String | 否 | 主机IP |
1.3 | frontPort | int | 否 | 前置端口 |
1.4 | channelPort | int | 否 | 节点的channel端口 |
1.5 | p2pPort | int | 否 | 节点的P2P端口 |
1.6 | rpcPort | int | 否 | 节点的RPC端口 |
2 | ipconf | String[] | 否 | 默认传入空的String数组即可 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/checkPort
{
"deployNodeInfoList": [{
"hostId": 20,
"ip": "127.0.0.1",
"frontPort": 5002,
"p2pPort": 30300,
"channelPort": 20200,
"rpcPort": 8545
}],
"ipconf": []
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
16.6 配置并部署链¶
传入主机的节点信息,检查目标主机中需要用到的端口是否已被占用;端口被占用时,报错信息保存在主机列表的remark字段里
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/config
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | deployNodeInfoList | List |
否 | 节点部署信息数组 |
DeployNodeInfo | Object | 否 | 节点的主机编号与端口信息 | |
1.1 | hostId | int | 否 | 主机编号 |
1.2 | ip | String | 否 | 主机IP |
1.3 | frontPort | int | 否 | 前置端口 |
1.4 | channelPort | int | 否 | 节点的channel端口 |
1.5 | p2pPort | int | 否 | 节点的P2P端口 |
1.6 | rpcPort | int | 否 | 节点的RPC端口 |
2 | ipconf | String[] | 否 | 单个String中包含:主机IP,节点数量,机构名称,所属群组,端口等 |
注:ipconf 格式参考
# 1. 可以添加多行;
# 2. 页面需要提示,机构名只能包含英文字母,数字和下划线'_';
# 3. 群组编号必须是数字;v1.4.3后只支持群组1,如需多个群组请通过动态群组后续增加
# 4. 数量至少为 1,客户端的输入框默认为 1;
# 5. 同一个 IP 的主机,只属于一个机构;如果在单机部署,只能填写一个机构名;v1.4.3后**只支持默认的agency1**
#
# 格式:IP:数量 机构名 群组列表
# 比如:
172.0.0.1:2 agency1 1
172.0.0.2:2 agency1 1
172.0.0.3:2 agency1 1
# 上面配置的意思:
1. 部署三台主机:172.0.0.1,172.0.0.2,172.0.0.3。
2. 172.0.0.x 的每台机器上创建 2 个节点,一共创建 6 个节点。
3. 创建单个机构:agency1。
4. 创建单个群组:1。
5. 群组后续可以动态添加。
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/config
{
"chainName": "default_chain",
"ipconf": ["127.0.0.1:1 agency1 1 30300,20200,8545"],
"imageTag": "v2.7.1",
"encryptType": 0,
"deployNodeInfoList": [{
"hostId": 20,
"ip": "127.0.0.1",
"frontPort": 5002,
"p2pPort": 30300,
"channelPort": 20200,
"rpcPort": 8545
}],
"agencyName": "agency1"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 部署请求结果 |
4 | attachment | List | 否 | 补充信息,比如:如果连接主机失败,表示连接失败的主机 IP |
若部署失败,可结合/host/list
接口查询remark
了解错误详情
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
16.7 新增节点¶
添加一个新的节点到指定群组。服务器接收新增节点请求后,完成参数校验和数据库数据插入后,返回客户端请求结果,再异步完成节点新增操作。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/node/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | deployNodeInfoList | List |
否 | 节点部署信息数组 |
DeployNodeInfo | Object | 否 | 节点的主机编号与端口信息 | |
1.1 | hostId | int | 否 | 主机编号 |
1.2 | ip | String | 否 | 主机IP |
1.3 | frontPort | int | 否 | 前置端口 |
1.4 | channelPort | int | 否 | 节点的channel端口 |
1.5 | p2pPort | int | 否 | 节点的P2P端口 |
1.6 | rpcPort | int | 否 | 节点的RPC端口 |
2 | chainName | String | 否 | 已有的链名称 |
2 | groupId | int | 否 | 群组id,默认为1 |
2 | agencyName | String | 否 | 1.4.3后默认均为agency1 |
2 | encryptType | int | 否 | 加密类型,与已有链一致 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/node/add
{
"chainName": "default_chain",
"deployNodeInfoList": [{
"hostId": 20,
"ip": "127.0.0.1",
"frontPort": 5002,
"p2pPort": 30300,
"channelPort": 20200,
"rpcPort": 8545
}],
"groupId": 1,
"agencyName": "agency1",
"encryptType": 0
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 部署请求结果 |
4 | attachment | List | 否 | 补充信息,比如:如果连接主机失败,表示连接失败的主机 IP |
若部署失败,可结合/host/list
接口查询remark
了解错误详情
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": ""
}
- 失败:
{
"code": 205015,
"message": "Connect to host error",
"data": "",
"attachment": "172.0.0.2"
}
16.8 启动节点¶
启动指定节点。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/node/start
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | String | 否 | 启动节点的节点编号 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/node/start
{
"nodeId": "6aba77a7b81ddf71f5e5988c2ba96f51484b55d637286bf49babe48a34f935ee3866fc1a226b465b6bc9d716bfe8b349d82e80710b162e826c0cf91fb58e5099"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 启动命令执行结果 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": ""
}
16.9 停止节点¶
停止指定节点。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/node/stop
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | String | 否 | 停止节点的节点编号 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/node/stop
{
"nodeId": "6aba77a7b81ddf71f5e5988c2ba96f51484b55d637286bf49babe48a34f935ee3866fc1a226b465b6bc9d716bfe8b349d82e80710b162e826c0cf91fb58e5099"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 停止命令执行结果 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": ""
}
16.10 强制停止节点¶
强制停止指定节点,/deploy/node/stop
接口需要节点为游离才可以停止,强制停止节点可以结合节点启动接口,用于正常的节点重启
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/node/stopForce
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | String | 否 | 停止节点的节点编号 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/node/stop
{
"nodeId": "6aba77a7b81ddf71f5e5988c2ba96f51484b55d637286bf49babe48a34f935ee3866fc1a226b465b6bc9d716bfe8b349d82e80710b162e826c0cf91fb58e5099"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 停止命令执行结果 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": ""
}
16.11 删除节点¶
删除指定节点。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/node/delete
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | nodeId | String | 否 | 停止节点的节点编号 |
2 | deleteHost | Boolean | 是 | 删除节点时,如果被删除节点是主机上最后一个节点,是否删除主机,true: 删除;false: 不删除;默认:false。 |
3 | deleteAgency | Boolean | 是 | 如果需要删除主机,在被删除主机机构最后一台主机,是否删除相应机构,true: 删除;false: 不删除; 默认:false。 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/deploy/node/stop
{
"nodeId": "6aba77a7b81ddf71f5e5988c2ba96f51484b55d637286bf49babe48a34f935ee3866fc1a226b465b6bc9d716bfe8b349d82e80710b162e826c0cf91fb58e5099",
"deleteHost": "true",
"deleteAgency": "false"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 节点删除结果 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": ""
}
- 失败:
{
"code": 205053,
"message": "Node is running.",
"data": ""
}
16.12 获取链信息¶
查询区块链信息,如果没有部署链,返回空;如果已经部署链,返回部署的链信息。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/chain/info
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 链信息查询结果 |
3.1 | id | Integer | 否 | 链编号 |
3.1 | chainName | String | 否 | 链名称 |
3.1 | chainDesc | String | 否 | 链描述 |
3.1 | version | String | 否 | 底层的镜像版本 |
3.1 | encryptType | Integer | 否 | 加密方式,0: 非国密;1: 国密 |
3.1 | chainStatus | Integer | 否 | 链状态,具体状态查看备注信息 |
3.1 | rootDir | String | 否 | 节点主机存放节点数据的目录,默认:/opt/fisco |
3.1 | webaseSignAddr | String | 否 | WeBASE-Sign 服务的地址 |
3.1 | runType | Integer | 否 | 运行方式,1: 使用 Docker 运行 |
3.1 | createTime | Long | 否 | 创建时间 |
3.1 | modifyTime | Long | 否 | 修改时间 |
注:链状态
链状态编号 | 链状态 |
---|---|
0 | 初始化中 |
1 | 部署中 |
2 | 部署失败 |
3 | 运行 |
4 | 重启中 |
2)出参示例
- 没有部署链:
{
"code": 0,
"message": "success",
"data": ""
}
- 已经部署链:
{
"code": 0,
"message": "success",
"data": {
"id": 10,
"chainName": "default_chain",
"chainDesc": "default_chain",
"version": "v2.5.0",
"encryptType": 0,
"chainStatus": 3,
"rootDir": "/opt/fisco",
"webaseSignAddr": "172.0.0.1:5004",
"runType": 1,
"createTime": 1596959644000,
"modifyTime": 1596959700000
},
"attachment": null
}
16.13 删除链¶
重置已部署链,删除节点管理服务的数据库数据,并同时备份当前链数据到临时文件夹。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/delete
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 重置链结果 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": ""
}
16.14 查询服务器可视化部署选项配置¶
查询服务器的可视化部署的选项状态,判断是否进入可视化部署页面。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/type
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 开关状态,0: 不进入可视化部署;1: 进入可视化部署。 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": "1"
}
16.15 查询主机执行进度¶
查询主机在可视化的检测、初始化、部署过程中的各个进度
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /deploy/progress
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 进度状态,具体值与对应状态如下 |
部署的总步骤流程,添加节点时,流程相同
- 0-等待开始;1-检测机器内存与依赖,2-检测Docker服务,3-检测端口占用,4-初始化安装主机依赖,5-初始化加载Docker镜像中
- 6-生成链证书与配置,7-初始化链与前置数据,8-传输链配置到主机
- 9-配置完成,启动中
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": "5" // 正在初始化主机,拉取docker镜像中
}
主机管理接口
16.16 获取主机列表¶
获取主机列表
如果部署出现失败,调用此接口,在remark
字段中返回每台主机部署的错误信息
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /host/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 开关状态,0: 不进入可视化部署;1: 进入可视化部署。 |
3.1 | id | Integer | 否 | 主机编号 |
3.2 | ip | String | 否 | 主机 IP |
3.3 | rootDir | String | 否 | 主机存放节点数据的目录,默认:/opt/fisco |
3.4 | status | Integer | 否 | 主机状态,0: 添加中,1: 初始化中,2: 初始化成功,3: 初始化失败,4:检测成功,5:检测失败,6:配置链成功,7:配置链失败 |
3.5 | remark | Integer | 否 | 部署失败时,主机的错误日志 |
3.6 | createTime | Long | 否 | 创建时间 |
3.7 | modifyTime | Long | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 19,
"ip": "172.0.0.2",
"rootDir": "/root/fisco",
"status": 2,
"remark": "",
"createTime": 1596959644000,
"modifyTime": 1596959661000
},
.......
],
"attachment": null
}
16.17 添加主机接口¶
添加主机
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /host/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | sshIp | String | 否 | 主机的IP,或与节点管理服务同机的127.0.0.1 |
2 | rootDir | String | 否 | 主机用于部署节点的路径,若不存在,将自动通过ansible创建 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/host/add
{
"sshIp": "127.0.0.1",
"rootDir": "/data/home/webase/opt"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
16.18 删除主机接口¶
删除主机,将判断主机上是否仍存在节点,若有则无法删除
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /host/{hostId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | hostId | Integer | 否 | 主机编号 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/host/{hostId}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
16.19 Ping主机接口¶
通过Ansible对主机IP执行ansible {ip} -m ping
命令,检测宿主机到节点主机的SSH免密连接是否连通
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /host/ping
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | sshIp | String | 否 | 主机的IP,或与节点管理服务同机的127.0.0.1 |
2 | rootDir | String | 否 | 主机用于部署节点的路径,若不存在,将自动通过ansible创建 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/host/ping
{
"sshIp": "127.0.0.1",
"rootDir": "/data/home/webase/opt"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
16.20 检测是否安装Ansible接口¶
检测节点管理服务(宿主机)是否已安装Ansible,节点主机无需安装Ansible
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /host/ansible
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
16.21 检测主机依赖接口¶
根据单个主机需要安装的节点数,检测已添加主机是否有足够的空闲内存,检测主机是否已安装Docker并启动Docker
通过并行方式同时检测多个主机,并在主机的remark
字段中记录检测不通过的原因,若检测不通过,可结合/host/list
接口查询remark
了解错误详情
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /host/check
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | hostIdList | List |
否 | 主机编号数组,多个节点时主机id重复多次即可 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/host/check
下面代表主机编号为1的主机上安装两个节点,主机编号2的主机安装一个节点
{
"hostIdList": [1,1,2]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
若检测不通过,可结合/host/list
接口查询remark
了解错误详情
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 202493,
"message": "Check host not pass, please check host remark",
"data": null,
"attachment": null
}
17 应用管理模块¶
17.1 保存应用信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /app/save
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | appName | string | 否 | 应用名称 |
2 | appDocLink | string | 否 | 应用文档链接 |
3 | appDesc | string | 否 | 应用描述 |
4 | appIcon | string | 是 | 应用图标 |
5 | appDetail | string | 是 | 应用详细介绍 |
6 | id | int | 是 | 应用编号,传入时表示更新,否则新增 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/app/save
{
"appName":"WeID",
"appDocLink":"https://weidentity.readthedocs.io/zh_CN/latest/docs/deploy-via-web.html",
"appIcon":"test",
"appDesc":"WeIdentity是一套分布式多中心的技术解决方案,可承载实体对象(人或者物)的现实身份与链上身份的可信映射、以及实现实体对象之间安全的访问授权与数据交换。WeIdentity由微众银行自主研发并完全开源,秉承公众联盟链整合资源、交换价值、服务公众的理念,致力于成为链接多个垂直行业领域的分布式商业基础设施,促进泛行业、跨机构、跨地域间的身份认证和数据合作。",
"appDetail":""
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | id | int | 否 | 自增编号 |
3.2 | appName | string | 否 | 应用名称 |
3.3 | appKey | string | 否 | 应用Key |
3.4 | appSecret | string | 否 | 应用密码 |
3.5 | appDocLink | string | 否 | 应用文档链接 |
3.6 | appIcon | string | 否 | 应用图标 |
3.7 | appDesc | string | 否 | 应用描述 |
3.8 | appDetail | string | 是 | 应用详细介绍 |
3.9 | appIp | string | 是 | 应用ip |
3.10 | frontPort | int | 是 | 应用端口 |
3.11 | appLink | string | 是 | 应用服务链接 |
3.12 | appStatus | int | 否 | 应用状态(1存活,2不存活) |
3.13 | createTime | LocalDateTime | 否 | 落库时间 |
3.14 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"appName": "WeID",
"appKey": "z2dJaYXe",
"appSecret": "5bTi2zMgdxAbFwgmkZhxNrUXFFvdjmM8",
"appStatus": 2,
"appDocLink": "https://weidentity.readthedocs.io/zh_CN/latest/docs/deploy-via-web.html",
"appLink": null,
"appIp": null,
"appPort": null,
"appIcon": "test",
"appDesc": "WeIdentity是一套分布式多中心的技术解决方案,可承载实体对象(人或者物)的现实身份与链上身份的可信映射、以及实现实体对象之间安全的访问授权与数据交换。WeIdentity由微众银行自主研发并完全开源,秉承公众联盟链整合资源、交换价值、服务公众的理念,致力于成为链接多个垂直行业领域的分布式商业基础设施,促进泛行业、跨机构、跨地域间的身份认证和数据合作。",
"appDetail": "",
"createTime": "2021-03-07 18:15:47",
"modifyTime": "2021-03-07 18:15:47"
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
17.2 查询应用列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/app/list?appName={appName}&appKey={appKey}&appType={appType}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | appName | string | 是 | 应用名称 |
2 | appKey | string | 是 | 应用Key |
3 | appType | Int | 是 | 应用类型(1模板,2新建),传入时查询对应列表,不传入则返回新建的应用列表 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/app/list?appType=1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | int | 否 | 自增编号 |
4.1.2 | appName | string | 否 | 应用名称 |
4.1.3 | appKey | string | 否 | 应用Key |
4.1.4 | appSecret | string | 否 | 应用密码 |
4.1.5 | appDocLink | string | 否 | 应用文档链接 |
4.1.6 | appIcon | string | 否 | 应用图标 |
4.1.7 | appDesc | string | 否 | 应用描述 |
4.1.8 | appDetail | string | 是 | 应用详细介绍 |
4.1.9 | appIp | string | 是 | 应用ip |
4.1.10 | frontPort | int | 是 | 应用端口 |
4.1.11 | appLink | string | 是 | 应用服务链接 |
4.1.12 | appStatus | int | 否 | 应用状态(1存活,2不存活) |
4.1.13 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.14 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"appName": "WeID",
"appKey": "RXiHxhWn",
"appSecret": "FA4evmGGAAQTGnpiu6FF4uWzb2RvuiWU",
"appStatus": 2,
"appDocLink": "https://weidentity.readthedocs.io/zh_CN/latest/docs/deploy-via-web.html",
"appLink": null,
"appIp": null,
"appPort": null,
"appIcon": "test",
"appDesc": "WeIdentity是一套分布式多中心的技术解决方案,可承载实体对象(人或者物)的现实身份与链上身份的可信映射、以及实现实体对象之间安全的访问授权与数据交换。WeIdentity由微众银行自主研发并完全开源,秉承公众联盟链整合资源、交换价值、服务公众的理念,致力于成为链接多个垂直行业领域的分布式商业基础设施,促进泛行业、跨机构、跨地域间的身份认证和数据合作。",
"appDetail": "",
"createTime": "2021-03-07 18:15:47",
"modifyTime": "2021-03-07 18:15:47"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
17.3 删除应用信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/app/{id}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | id | int | 否 | 应用编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/app/1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
18 配置接口¶
18.1 查询是否使用国密¶
获取WeBASE-Node-Manager是否使用国密版
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/encrypt
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Int | 否 | 1: 国密,0:非国密 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 1
}
18.2 查询WeBASE-Node-Manager的版本¶
获取WeBASE-Node-Manager服务的版本号
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/version
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
18.3 获取服务ip和端口¶
返回本服务ip和端口。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/ipPort
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | ip | string | 否 | 服务IP |
3.2 | port | int | 否 | 服务端口 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ip": "127.0.0.1",
"port": 5001
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
18.4 查询已部署合约是否支持修改¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/isDeployedModifyEnable
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | boolean | 否 | true: 支持,false:不支持 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": true
}
19. 链上全量数据接口¶
19.1 查询链上全量私钥用户列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /external/account/list/all/{groupId}/{pageNumber}/{pageSize}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | string | 否 | 群组id |
2 | pageNumber | int | 否 | 页码 |
3 | pageSize | int | 否 | 页大小 |
4 | account | int | 是 | 所属用户(已登记私钥) |
5 | type | int | 否 | 1-全量,2-本地已登记,3-本地未登记,默认为1 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/external/account/list/all/1/1/10
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 是 | 用户编号(若仅存于链上则为null) |
3.2 | userName | string | 是 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 是 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 是 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 是 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.12 | extAccountId | int | 否 | 链上用户编号 |
3.13 | transCount | int | 否 | 用户交易量 |
3.14 | hashs | String | 否 | 用户交易hash(5个) |
3.14 | signUserId | String | 是 | 用户的sign用户编号 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"userId": null,
"userName": null,
"account": null,
"groupId": 1,
"publicKey": null,
"privateKey": null,
"userStatus": null,
"chainIndex": null,
"userType": null,
"address": "0x11523906f9c6d4bbf2bf7ab2ff1049e7bdf2fbf6",
"signUserId": null,
"appId": null,
"hasPk": null,
"description": null,
"createTime": "2021-04-07 16:34:42",
"modifyTime": "2021-04-07 16:34:42",
"extAccountId": 4,
"transCount": 1,
"hashs": "0x6889e8ea793d6326026b2a32bab023183ccc7846d3bcb9bd1001e1f08fb892c5"
},{
"userId": 700001,
"userName": "2222",
"account": "mars",
"groupId": 1,
"publicKey": "04299feb42f324521464c9503220efaeaae99093d92ef08e6f9c1f76e761c2a57422c5fe4dc721e049dfdc05ff8e9b64f59471235ad5e5f4fc07e653f2cd22314e",
"privateKey": null,
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0x6bc1eeb7d1bb3f1d8195336843bd938d51e594ee",
"signUserId": "0c01b17d67734e95b1e8d5c55e78b4d8",
"appId": "1",
"hasPk": 1,
"description": "",
"createTime": "2021-04-06 21:14:04",
"modifyTime": "2021-04-06 21:14:04",
"extAccountId": 1,
"transCount": null,
"hashs": null
}],
"totalCount": 2
}
19.2 查询链上全量合约列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /external/contract/list/all/{groupId}/{pageNumber}/{pageSize}&type={type}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | string | 否 | 群组id |
2 | pageNumber | int | 否 | 页码 |
3 | pageSize | int | 否 | 页大小 |
4 | account | int | 是 | 所属用户(已登记私钥) |
5 | type | int | 否 | 1-全量,2-本地已登记,3-本地未登记,默认为1 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/external/contract/list/all/1/1/10?type=1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | abiId | int | 是 | 合约编号(若未登记,则为空) |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | Int | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
3.10 | extContractId | int | 否 | 链上合约编号 |
3.11 | transCount | int | 否 | 合约交易量 |
3.12 | hashs | String | 否 | 合约交易hash(5个) |
3.13 | deployTxHash | String | 是 | 部署合约的交易hash |
3.14 | deployAddress | String | 是 | 部署合约的用户地址 |
3.15 | deployTime | Date | 是 | 合约的部署时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"abiId": 6,
"groupId": 1,
"account": "admin",
"contractName": "SpecificIssuerController",
"contractAddress": "0xce1d576181e1d68899a3f2b86c8e274657c07fea",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"addIssuer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isSpecificTypeIssuer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"extraValue\",\"type\":\"bytes32\"}],\"name\":\"addExtraValue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"registerIssuerType\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"getExtraValue\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"isIssuerTypeExist\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"removeIssuer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"startPos\",\"type\":\"uint256\"},{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"getSpecificTypeIssuerList\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"specificIssuerDataAddress\",\"type\":\"address\"},{\"name\":\"roleControllerAddress\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"operation\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"retCode\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"typeName\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"SpecificIssuerRetLog\",\"type\":\"event\"}]",
"contractBin": "",
"createTime": "2021-04-06 21:34:38",
"modifyTime": "2021-04-06 21:34:38",
"extContractId": 800014,
"deployAddress": "0x222d68876bed5a33c8efe04c6fc9783031c22cd1",
"deployTxHash": "0xd04b35d7741f0568546de4fc29a880fa0f3727beef544497ca5816fa8793fa13",
"deployTime": 1617716070000,
"transCount": 0,
"hashs": null
},{
"abiId": null,
"groupId": 1,
"account": null,
"contractName": null,
"contractAddress": "0x5e103407b2a06b32bad0fc578e1888036a3e26a8",
"contractAbi": null,
"contractBin": "",
"createTime": null,
"modifyTime": null,
"extContractId": 800007,
"deployAddress": "0x222d68876bed5a33c8efe04c6fc9783031c22cd1",
"deployTxHash": "0x4c6f026e72b69e9ed1f3685f24bc055f5ef1bdde4778ee684a96d25deba6b34b",
"deployTime": 1617716065000,
"transCount": 1,
"hashs": "0x4c6f026e72b69e9ed1f3685f24bc055f5ef1bdde4778ee684a96d25deba6b34b"
}],
"totalCount": 2
}
附录¶
1. 返回码信息列表¶
X01XXX
为WeBASE-Front节点前置错误码,X02XXX
为WeBASE-Node-Manager节点管理服务错误码,X03XXX
为WeBASE-Sign签名服务错误码。
code | message | 描述 |
---|---|---|
0 | success | 成功 |
102001 | system error | 系统异常 |
102002 | system exception: please check front | 系统异常,请检查前置状态 |
102003 | No group belongs to this groupId(node not belongs to this group) | 当前节点不属于当前群组 |
202000 | invalid front id | 不正确的前置ID(添加节点前置失败) |
202001 | database exception | 数据库异常 |
202002 | not found any front for this group | 找不到此群组的任何前置 |
202003 | not support this ip | 不支持该ip |
202004 | front already exists | 前置已经存在 |
202005 | group id cannot be empty | 群组不能为空 |
202006 | invalid group id | 无效的网络编号 |
202007 | checkCode is null | 校验码为空 |
202008 | invalid checkCode | 无效的校验码 |
202009 | save front fail | 保存前置失败 |
202010 | request front fail | 请求前置失败 |
202011 | abiInfo cannot be empty | abi信息不能为空 |
202012 | user id cannot be empty | 用户编号不能为空 |
202013 | invalid user | 无效的用户编号 |
202014 | user already exists | 用户信息已经存在 |
202015 | contract already exists | 合约信息已经存在 |
202017 | invalid contract id | 无效的合约编号 |
202018 | invalid param info | 无效的入参信息 |
202019 | contract name cannot be repeated | 合约名称不能重复 |
202020 | deployed contract cannot be modified | 已部署合约不支持修改 |
202023 | contract has not deploy | 合约尚未部署 |
202026 | account info already exists | 该帐号已经存在 |
202027 | account info not exists | 该帐号不存在 |
202028 | account name empty | 帐号名称不能为空 |
202029 | invalid account name | 无效的账号名称 |
202030 | password error | 密码错误 |
202031 | role id cannot be empty | 角色编号不能为空 |
202032 | invalid role id | 无效的角色编号 |
202033 | invalid contract address | 无效的合约地址 |
202034 | login fail | 登录失败 |
202035 | contract has been deployed | 该合约已经部署 |
202036 | publicKey cannot be empty | 公钥不能为空 |
202037 | associated account cannot be empty | 关联账号不能为空 |
202040 | contract deploy not success | 合约部署失败 |
202045 | the new password cannot be same as old | 新旧密码不能一致 |
202050 | publicKey's length is 130,address's length is 42 | 公钥长度为130,公钥地址长度为42 |
202051 | wrong host or port | 错误的主机或端口 |
202052 | invalid token | 无效的token |
202053 | token expire | token过期 |
202054 | Available front url is empty, check front status | 合约尚未部署 |
202060 | cert handle error | 证书句柄错误 |
202061 | store cert error | 存储证书错误 |
202062 | cert format error, must start with -----BEGIN CERTIFICATE-----\n, end with end | 证书格式错误,必须由 --BEGIN CERTIFICATE-- 包 |
202063 | saving front's cert error | 保存前置证书错误 |
202070 | Mail server config error | 邮件服务器配置错误。 |
202071 | Mail server config param empty/not match | 邮件服务器配置参数为空/不匹配 |
202072 | Mail server config error, db's server config is empty | 邮件服务器配置错误,数据库的服务器配置为空 |
202076 | Alert rule error | 警报规则错误。 |
202077 | Alert rule param not match | 警报规则参数不匹配。 |
202080 | Send mail error, please check mail server configuration | 发送邮件错误,请检查邮件服务器配置。 |
202081 | Send mail error, please enable mail server before send | 发送邮件错误,请在发送前启用邮件服务器。 |
202086 | Alert log error | 警报日志错误。 |
202087 | Alert log param: status/logId is empty | 警报日志参数:status/logId为空。 |
202090 | Update guomi methodId error | 更新国密methodId错误 |
202091 | Front's encrypt type not matches with nodemgr | Front的加密类型与nodemgr不匹配 |
202096 | contract address already exists | 合约地址已存在 |
202097 | abi info of this id not exists | 此ID的ABI信息不存在 |
202098 | Contract abi invalid, please check abi | 合约ABI无效,请检查ABI |
202099 | Abi Id cannot be empty | 此ID的ABI信息为空 |
202100 | contractAddress is null | 合约地址为空 |
202110 | User's signUserId not exist | 用户的signUserId不存在 |
202111 | Fail to parse json | 解析json错误 |
202121 | Cert file not found, please check cert path in config | 找不到证书文件,请检查配置中的证书路径 |
202122 | Pem file format error, must surrounded by -----XXXXX PRIVATE KEY----- | Pem文件格式错误,必须包含-----XXXXX PRIVATE KEY----- |
202123 | Pem file content error | Pem文件内容错误 |
202124 | p12's password cannot be chinese | P12的密码不能为中文 |
202125 | p12's password not match | P12的密码错误 |
202126 | P12 file content error | P12文件内容错误 |
202300 | Group id already exists | 群组id已存在 |
202301 | Node's front not exists | 节点前置不存在 |
202310 | govern vote record not exist | 投票记录不存在 |
202311 | permission denied on chain | 链上权限被禁止 |
202321 | path contains deployed contract, please delete one by one | 路径中包含已部署的合约,请逐个删除未部署的合约 |
202322 | contract path cannot be blank(use "/" instead) | 合约地址不能为空(默认请使用"/") |
202323 | privateKey decode fail | 私钥解码失败 |
202324 | password decode fail | 密码/授权码解码失败 |
202401 | No configured of docker registry url. | 没有配置 Docker 镜像更新 URL 地址 |
202402 | Fetch image tag from docker registry error. | 从 Docker 源更新镜像版本失败 |
202403 | Fetch Docker image tag list error, unknown config type. | 查询 Docker 镜像版本失败(未知类型) |
202404 | Save chain's configuration to file error. | 保存链配置信息文件失败 |
202405 | Docker image tag invalid. | 错误的镜像版本 |
202406 | Configuration of host is empty. | 主机配置参数为空 |
202407 | Chain exists, deploy failed. | 链已存在,部署失败 |
202408 | Save chain data to DB error. | 插入链信息到数据库失败 |
202409 | Chain root dir exist, please move it manually. | 主机节点的链安装目录(default_chains)已存在,请手动移除 |
202410 | Execute build_chain.sh script error. | 执行 build_chain.sh 链生成脚本失败 |
202411 | Host, agency, group configuration error. | 主机,机构,群组配置信息错误 |
202412 | Host ip and num error. | 主机 IP,节点数量配置错误 |
202413 | Agency name invalid, only [a-zA-Z0-9_] is valid. | 机构名称格式错误,只能包含大小写字母,数字,下划线 |
202414 | Group id error, only positive integer is valid. | 群组编号格式错误,必须为正整数 |
202415 | Login to host /ip/ through SSH error. Please check SSH configuration. | SSH登录主机/ip/失败,请检查 SSH 配置 |
202416 | Save agency data into DB error. | 插入新机构信息到数据库失败 |
202417 | Save group data into DB error. | 插入新群组信息到数据库失败 |
202418 | Save host data into DB error. | 插入主机信息到数据库失败 |
202419 | Save front data into DB error. | 插入前置信息到数据库失败 |
202420 | Save node data into DB error. | 插入节点信息到数据库失败 |
202421 | Save node and front mapping data into DB error. | 插入前置和群组映射关系到数据库失败 |
202422 | Parse node index from directory error. | 从目录获取节点序号失败 |
202423 | A single host IP only belongs to one agency. | 一个 IP 主机,只能属于一个机构 |
202424 | Unknown error during deploying. | 部署时发生未知错误 |
202425 | SSH login through username and password is unsupported yet. | 不支持使用 SSH 密码登录主机 |
202426 | Chain has no agency. | 当前链没有所属机构 |
202427 | No deployed chain | 链不存在 |
202428 | IP format error. | IP 格式错误 |
202429 | Agency name cannot be blank when IP is new. | 主机 IP 是新 IP 时,机构名称不能为空 |
202430 | Agency name already exists. | 存在同名机构 |
202431 | Add new node error. | 新增节点错误 |
202432 | No valid chain certification. | 链证书无效 |
202433 | Generate agency private key and crt file error. | 生成机构私钥和证书失败 |
202434 | Host without agency error." | 主机所属机构为空 |
202435 | Node num should be positive integer, and less then 10. | 主机数量格式错误,正整数,并且小于 10 |
202436 | Generate sdk | 生成主机 SDK 私钥和证书失败 |
202437 | Generate node private key and crt files error. | 生成新节点私钥和证书失败 |
202438 | Copy SDK files error. | 拷贝 SDK 证书和私钥失败 |
202439 | Upload SDK files error. | 上传 SDK 证书和私钥失败 |
202440 | Upload node config files error. | 上传节点证书和私钥失败 |
202441 | Copy group config files from original node error. | 从旧节点复制群组配置文件失败 |
202442 | Delete tmp directory of agency error. | 删除机构临时目录失败 |
202443 | Delete tmp directory of SDK error. | 删除 SDK 临时目录失败 |
202444 | Delete tmp directory of node error. | 删除节点临时目录失败 |
202445 | Unknown nodeid. | 未知节点编号(nodeid) |
202446 | Stop node error. | 停止节点失败(停止容器) |
202447 | Start node error. | 启动节点失败(启动容器) |
202448 | Both new image tag and old are the same. | 链升级的新版本和链的现有版本相同 |
202449 | Upgrade chain to new image tag error. | 链升级失败 |
202450 | Delete node failed, node is still in group. | 节点仍属于群组,删除失败 |
202451 | Parse node's config files error. | 读取节点配置文件失败 |
202452 | Delete node's config error. | 删除节点配置文件失败 |
202453 | Stop node before deleting. | 节点正在运行,删除失败,请先停止节点 |
202454 | Update p2p part of related nodes error. | 更新关联节点 P2P 配置失败 |
202455 | Delete chain error. | 删除链失败 |
202456 | Node is still a sealer or observer, delete failed. | 节点处于观察或共识状态,删除失败 |
202457 | Fetch node list from host's configuration files | 从主机配置文件获取节点列表失败 |
202458 | Generate application.yml for front error | 生成前置 application.yml 配置文件失败 |
202459 | Init host with shell script error. | 通过脚本初始化主机失败 |
202460 | Sync files error. | 传输文件失败 |
202461 | Control container through Docker api error. | Docker 容器操作失败 |
202462 | Two nodes at least. | 至少两个节点。 |
202463 | Group need two sealers at least. | 群组至少需要两个共识节点。 |
202464 | WebaseSignAddess configuration error in Application.yml | application.yml中的webaseSignAddess配置错误 |
202465 | webaseSignAddress cannot be 127.0.0.1 or localhost in application.yml file | sign的地址不能为127.0.0.1或localhost |
202466 | Please pull the Docker image manually in host /ip/ | 主机/ip/请手动拉取 Docker 镜像 |
202467 | Max 4 nodes on a single host | 单个主机最多部署 4 个节点 |
202468 | Host of WeBASE-Node-Manager's ip is already existed. | WeBASE-Node-Manager所在主机的IP已存在 |
202469 | Check docker installed and running of host | 检测主机Docker已安装且已启动未通过 |
202470 | Check host memory not enough for nodes(s) | 检测主机安装节点所需空余内存未通过 |
202471 | Check host cpu core count not enough for node(s) | 检测主机安装节点所需CPU核核心数未通过 |
202472 | Host check had been interrupt | 主机检测过程被中断 |
202473 | Host check fail for inpurt param | 主机检测入参错误 |
202475 | Fail to generate chain and front config locally | 本地生成链与前置配置失败 |
202476 | Not all host init success | 部分主机在检测时未通过 |
202477 | Ipconf's node port config error | Ipconf入参格式中节点端口格式错误 |
202478 | Ipconf not match with deploy info list | Ipconf与主机节点信息不匹配 |
202479 | Delete host fail for host contains node(front) | 无法删除主机,主机中仍包含节点 |
202480 | Ansible not installed! | Node-Manager所在主机未安装Ansible |
202481 | Ansible fetch not support fetch directory | Ansible不支持Fetch目录 |
202482 | Ansible ping cannot reach target ip | Ansible无法ping连通目标IP |
202483 | Ansible init host of image and scp config not all success | 主机初始化镜像与传输配置未全部成功 |
202484 | Ansible pull docker hub fail | Ansible拉取Docker hub镜像失败 |
202485 | Ansible pull docker cdn fail | Ansible拉取CDN镜像失败 |
202486 | Ansible run docker command fail | Ansible执行Docker命令失败 |
202487 | Ansible exec command error | Ansible执行命令失败 |
202488 | Ansible exec scp(copy) error | Ansible执行scp复制到远端失败 |
202489 | Ansible exec scp(fetch) error | Ansible执行scp拉取文件失败 |
202491 | Ansible check image exist error for param | Ansible检测Docker镜像存在的入参错误 |
202492 | Ansible check docker container exist error for param | Ansible检测Docker容器存在的入参错误 |
202493 | Check host not pass, please check host remark | 检测主机未通过,请通过主机的remark查看错误信息 |
202494 | Check host port is in use, please check host remark | 主机的端口已被占用,请通过主机的remark查看错误信息 |
202495 | Host already exist | 主机已存在 |
202496 | Host root dir access denied | 主机的安装目录无权限访问 |
202497 | Host not exist or already been deleted | 主机不存在或已被删除 |
202501 | contract path is exists. | 合约路径已存在 |
202502 | version cannot be empty | 版本不能为空 |
202503 | cns name cannot be empty | cns名不能为空 |
202504 | version already exists | 版本已存在 |
202511 | Front's sdk cert and key not found | 未找到前置的SDK证书与私钥 |
202512 | Write front's sdk cert and key fail | 导出SDK证书私钥文件失败,无法写入文件 |
202513 | Write private key file fail | 导出私钥文件失败,无法写入文件 |
202514 | group genesis conf not found | 群组的创世块文件不存在,无法添加为共识节点 |
202516 | app name exists | 应用名称已存在 |
202517 | app name not exists | 应用名称不存在 |
202518 | app id not exists | 应用编号不存在 |
202519 | link format invalid | 链接格式错误 |
302000 | user not logged in | 未登录的用户 |
302001 | Access denied | 没有权限 |
402000 | param exception | 参数错误 |
2. Precompiled Service说明¶
对预编译合约接口的使用有疑惑,可以查看FISCO BCOS的PreCompiledService API说明
查看预编译合约的solidity接口代码,可以查看FISCO BCOS的web3sdk precompile模块,如crud/TableFactory.sol:
pragma solidity ^0.4.2;
contract TableFactory {
function createTable(string tableName, string key, string valueField) public returns (int);
}
查看FISCO BCOS中实现的precompild合约列表、地址分配及源码:
地址 | 功能 | 源码(libprecompiled目录) |
---|---|---|
0x1000 | 系统参数管理 | SystemConfigPrecompiled.cpp |
0x1001 | 表工厂合约 | TableFactoryPrecompiled.cpp |
0x1002 | CRUD合约 | CRUDPrecompiled.cpp |
0x1003 | 共识节点管理 | ConsensusPrecompiled.cpp |
0x1004 | CNS功能 | CNSPrecompiled.cpp |
0x1005 | 存储表权限管理 | AuthorityPrecompiled.cpp |
0x1006 | 并行合约配置 | ParallelConfigPrecompiled.cpp |
Precompiled Service API 错误码
错误码 | 消息内容 | 备注 |
---|---|---|
0 | success | |
-50000 | permission denied | |
-50001 | table name already exist | |
-50100 | unknow function call | |
-50101 | table does not exist | |
-51000 | table name and address already exist | |
-51001 | table name and address does not exist | |
-51100 | invalid node ID | SDK错误码 |
-51101 | the last sealer cannot be removed | |
-51102 | the node is not reachable | SDK错误码 |
-51103 | the node is not a group peer | SDK错误码 |
-51104 | the node is already in the sealer list | SDK错误码 |
-51105 | the node is already in the observer list | SDK错误码 |
-51200 | contract name and version already exist | SDK错误码 |
-51201 | version string length exceeds the maximum limit | SDK错误码 |
-51300 | invalid configuration entry | |
-51500 | contract name and version already exist | |
-51501 | condition parse error | |
-51502 | condition operation undefined | |
-51600 | invalid ciphers | |
-51700 | group sig failed | |
-51800 | ring sig failed | |
-51900 | contract frozen | |
-51901 | contract available | |
-51902 | contract repeat authorization | |
-51903 | invalid contract address | |
-51904 | table not exist | |
-51905 | no authorized | |
-52000 | committee member exist | |
-52001 | committee member not exist | |
-52002 | invalid request permission denied | |
-52003 | invalid threshold | |
-52004 | operator can't be committee member | |
-52005 | committee member can't be operator | |
-52006 | operator exist | |
-52007 | operator not exist | |
-52008 | account not exist | |
-52009 | invalid account address | |
-52010 | account already available | |
-52011 | account frozen | |
-52012 | current value is expected value |
应用接入说明¶
应用管理是WeBASE管理台提供的一种第三方应用接入功能。其他应用可以通过WeBASE通用API来开发自己的运维管理台。接入的步骤如下:
- 通过WeBASE管理平台获得注册信息,并通过API向WeBASE注册服务。
- 通过WeBASE提供的基础能力API和WeBASE连通。
签名¶
签名说明¶
第三方应用从WeBASE管理平台获取注册信息WeBASE的IP和端口、为应用分配的appKey
(应用Key)和appSecret
(应用密码,应用自己保存,不要暴露),向WeBASE发送请求时,需要使用应用分配的appSecret
对请求进行签名。WeBASE收到请求后,根据appKey
查询应用对应的appSecret
,使用相同规则对请求进行签名验证。只有在验证通过后,WeBASE才会对请求进行相应的处理。
- 每个URL请求需带以下三个参数:
参数名 | 类型 | 描述 | 参数值 | 备注 |
---|---|---|---|---|
timestamp | long | 请求的时间戳(毫秒) | 1614928857832 | 当前时间戳,有效期默认5分钟 |
appKey | String | 应用Key | fdsf78aW | 从WeBASE管理平台获取 |
signature | String | 签名串 | 15B8F38... | 从WeBASE管理平台获取appSecret对appKey做的签名 |
签名规则¶
使用MD5对timestamp
、appKey
加密并转大写得到签名值signature
public static String md5Encrypt(long timestamp, String appKey, String appSecret) {
try {
String dataStr = timestamp + appKey + appSecret;
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(dataStr.getBytes("UTF8"));
byte s[] = m.digest();
String result = "";
for (int i = 0; i < s.length; i++) {
result += Integer.toHexString((0x000000FF & s[i]) | 0xFFFFFF00).substring(6);
}
return result.toUpperCase();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
示例¶
- 参数值:
参数 | 参数值 |
---|---|
timestamp | 1614928857832 |
appKey | fdsf78aW |
appSecret | oMdarsqFOsSKThhvXagTpNdoOcIJxUwQ |
- 签名后的
signature
为
EEFD7CD030E6B311AA85B053A90E8A31
WeBASE通用API¶
1 应用管理模块¶
1.1 应用注册¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/appRegister?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:POST
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | appIp | String | 否 | 应用ip |
2 | appPort | int | 否 | 应用端口 |
3 | appLink | String | 否 | 应用服务链接 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/appRegister?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
{
"appIp": "127.0.0.1",
"appPort": 8080,
"appLink": "http://127.0.0.1:8080/sample"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "Success",
"data": {}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2 系统账号信息模块¶
2.1 查询帐号列表¶
查询系统登录账号列表,不返回密码
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/accountList?appKey={appKey}&signature={signature}×tamp={timestamp}&pageNumber={pageNumber}&pageSize={pageSize}&account={account}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageSize | int | 否 | 每页记录数 |
2 | pageNumber | int | 否 | 当前页码 |
3 | account | String | 是 | 帐号名,不为空时查询具体账号信息 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/accountList?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31&pageNumber=1&pageSize=10&account=
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | int | 否 | 总记录数 |
4 | data | List | 是 | 信息列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | account | String | 否 | 帐号 |
4.1.2 | roleId | int | 否 | 所属角色 |
4.1.3 | roleName | String | 否 | 角色名称 |
4.1.4 | roleNameZh | String | 否 | 角色中文名 |
4.1.5 | loginFailTime | int | 是 | 登录失败次数 |
4.1.6 | accountStatus | int | 否 | 帐号状态 |
4.1.7 | description | String | 是 | 备注 |
4.1.8 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"account": "testAccount",
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"loginFailTime": 0,
"accountStatus": 1,
"description": null,
"createTime": "2019-03-04 15:11:44",
"modifyTime": "2019-03-04 15:18:47"
},
{
"account": "admin",
"roleId": 100000,
"roleName": "admin",
"roleNameZh": "管理员",
"loginFailTime": 0,
"accountStatus": 2,
"description": null,
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-02-14 17:45:53"
}
],
"totalCount": 2
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3 链信息模块¶
3.1 查询基本信息¶
获取链基本信息,包括链版本、是否使用国密、是否使用国密SSL连接、WeBASE版本等。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /api/basicInfo?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/api/basicInfo?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 基本信息 |
3.1 | encryptType | int | 否 | 是否使用国密(1: 国密,0:非国密) |
3.2 | sslCryptoType | int | 否 | 是否使用国密SSL连接(1: 国密,0:非国密) |
3.3 | fiscoBcosVersion | String | 否 | FISCO-BCOS版本 |
3.4 | webaseVersion | String | 否 | WeBASE版本 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"encryptType": 1,
"sslCryptoType": 1,
"fiscoBcosVersion": "2.7.2 gm",
"webaseVersion": "v1.5.0"
},
"attachment": null
}
3.2 查询群组列表¶
默认只返回groupStatus为1的群组ID,可传入groupStatus筛选群组 (1-normal, 2-maintaining, 3-conflict-genesisi, 4-conflict-data)
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/groupList?appKey={appKey}&signature={signature}×tamp={timestamp}&groupStatus={groupStatus}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupStatus | int | 是 | 群组状态(默认1),1-正常, 2-维护中, 3-脏数据, 4-创世块冲突 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/groupList?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31&groupStatus=
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | groupId | int | 否 | 群组编号 |
4.1.2 | groupName | String | 否 | 群组名称 |
4.1.2 | groupStatus | int | 否 | 群组状态:1-正常, 2-维护中, 3-脏数据, 4-创世块冲突 |
4.1.2 | nodeCount | int | 否 | 群组节点数 |
4.1.3 | latestBlock | BigInteger | 否 | 最新块高 |
4.1.4 | transCount | BigInteger | 否 | 交易量 |
4.1.5 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.2 | description | String | 是 | 群组描述 |
4.1.2 | groupType | int | 否 | 群组类别:1-同步,2-动态创建 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"groupId":1,
"groupName":"group1",
"groupStatus":1,
"nodeCount":4,
"latestBlock":0,
"transCount":0,
"createTime":"2020-05-07 16:32:02",
"modifyTime":"2020-05-08 10:50:13",
"description":"synchronous",
"groupType":1
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.3 查询所有节点列表¶
查询所有节点列表,用于获取所有节点信息,包括自动同步的节点信息
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/nodeList?appKey={appKey}&signature={signature}×tamp={timestamp}&pageNumber={pageNumber}&pageSize={pageSize}&groupId={groupId}&nodeId={nodeId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageSize | int | 否 | 每页记录数 |
2 | pageNumber | int | 否 | 当前页码 |
3 | groupId | int | 是 | 群组id,不为空则查询该群组下所有节点 |
4 | nodeId | String | 是 | 节点编号,不为空则查询该节点相关信息 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/nodeList?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31&pageNumber=1&pageSize=10
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | int | 否 | 总记录数 |
4 | data | List | 是 | 节点列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | nodeId | String | 否 | 节点编号 |
4.1.2 | nodeName | String | 否 | 节点名称 |
4.1.3 | groupId | int | 否 | 所属群组编号 |
4.1.4 | nodeActive | int | 否 | 状态 |
4.1.5 | nodeIp | String | 否 | 节点ip |
4.1.6 | P2pPort | int | 否 | 节点p2p端口 |
4.1.7 | description | String | 是 | 备注 |
4.1.8 | blockNumber | BigInteger | 否 | 节点块高 |
4.1.9 | pbftView | BigInteger | 否 | Pbft view |
4.1.10 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"nodeId": "5942fe2460c1a6329b8ebf5bc5a9ca9bd02ee944e8dac297742982de5920e7211489950ac4ac5eb1bd7219dcd773f861da496539d79328ae63f379f898bd2172",
"nodeName": "127.0.0.1_10303",
"groupId": 1,
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.4 查询节点信息¶
查询具体某个节点信息
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/nodeInfo?appKey={appKey}&signature={signature}×tamp={timestamp}&groupId={groupId}&nodeId={nodeId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 群组id |
2 | nodeId | String | 否 | 节点编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/nodeInfo?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31&groupId=1&nodeId=5942fe2460c1a6329b8ebf5bc5a9ca9bd02ee944e8dac297742982de5920e7211489950ac4ac5eb1bd7219dcd773f861da496539d79328ae63f379f898bd2172
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 是 | 节点信息对象 |
3.1 | nodeId | String | 否 | 节点编号 |
3.2 | nodeName | String | 否 | 节点名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | nodeActive | int | 否 | 状态 |
3.5 | nodeIp | String | 否 | 节点ip |
3.6 | P2pPort | int | 否 | 节点p2p端口 |
3.7 | description | String | 是 | 备注 |
3.8 | blockNumber | BigInteger | 否 | 节点块高 |
3.9 | pbftView | BigInteger | 否 | Pbft view |
3.10 | createTime | LocalDateTime | 否 | 落库时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"nodeId": "5942fe2460c1a6329b8ebf5bc5a9ca9bd02ee944e8dac297742982de5920e7211489950ac4ac5eb1bd7219dcd773f861da496539d79328ae63f379f898bd2172",
"nodeName": "127.0.0.1_10303",
"groupId": 1,
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.5 查询前置节点列表¶
查询前置及其对应节点信息列表,包括前置ip(对应节点Ip),节点端口等。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/frontNodeList?appKey={appKey}&signature={signature}×tamp={timestamp}&groupId={groupId}&nodeId={nodeId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | Int | 是 | 所属群组编号 |
2 | nodeId | String | 是 | 节点编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/frontNodeList?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | frontId | int | 否 | 前置编号 |
4.1.2 | frontIp | string | 否 | 前置ip |
4.1.3 | frontPort | int | 否 | 前置端口 |
4.1.4 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.5 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.6 | agency | string | 否 | 备注所属机构 |
4.1.7 | frontVersion | string | 否 | 前置的后台版本,如: v1.4.0 |
4.1.8 | signVersion | string | 否 | 前置所连接签名服务的后台版本,如: v1.4.0 |
4.1.9 | clientVersion | string | 否 | 链节点的版本,如: 2.5.0 gm |
4.1.10 | supportVersion | string | 否 | 链节点所支持的最高版本, 如: 2.5.0, (此处仅显示支持的最高版本,不显示是否为国密。若从2.4.0升级到2.5.0,此处将返回2.4.0) |
4.1.11 | status | int | 否 | 前置服务状态:0,未创建;1,停止;2,启动; |
4.1.12 | runType | int | 否 | 运行方式:0,命令行;1,Docker |
4.1.13 | agencyId | int | 否 | 所属机构 ID |
4.1.14 | agencyName | string | 否 | 所属机构名称 |
4.1.15 | hostId | int | 否 | 所属主机 |
4.1.16 | hostIndex | int | 否 | 一台主机可能有多个节点。表示在主机中的编号,从 0 开始编号 |
4.1.17 | imageTag | string | 否 | 运行的镜像版本标签 |
4.1.18 | containerName | string | 否 | Docker 启动的容器名称 |
4.1.19 | jsonrpcPort | int | 否 | jsonrpc 端口 |
4.1.20 | p2pPort | int | 否 | p2p 端口 |
4.1.21 | channelPort | int | 否 | channel 端口 |
4.1.22 | chainId | int | 否 | 所属链 ID |
4.1.23 | chainName | string | 否 | 所属链名称 |
4.1.23 | groupList | List |
否 | 节点所属群组列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontId": 500001,
"frontIp": "127.0.0.1",
"frontPort": 5002,
"agency": "aa",
"groupList": [
1,
2
],
"frontVersion": "v1.4.0",
"signVersion": "v1.4.0",
"clientVersion": "2.5.0 gm",
"supportVersion": "2.5.0",
"createTime": "2019-06-04 20:49:42",
"modifyTime": "2019-06-04 20:49:42",
"status": 1,
"runType": 1,
"agencyId": 1,
"agencyName": "AgencyA",
"hostId": 1,
"hostIndex": 0,
"imageTag": "v2.5.0",
"containerName": "rootfisconode0",
"jsonrpcPort": 8545,
"p2pPort": 30300,
"channelPort": 20200,
"chainId": 1,
"chainName": "default_chain"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.6 查询sdk证书信息¶
返回sdk证书文件名和内容,根据需要保存。根据底层是否使用国密和是否使用国密SSL连接,自动识别返回国密还是非国密证书。
- 非国密证书:非国密链或国密链未使用国密SSL连接
- 国密证书:国密链且使用国密SSL连接
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/sdkCert?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/sdkCert?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 列表 |
3.1 | Object | 信息对象 | ||
3.1.1 | name | int | 否 | 证书名 |
3.1.2 | content | string | 否 | 证书内容 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"name": "sdk.key",
"content": "-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQg4mtXDYHIhSPJwmy+CBVZ\nfZM7cpSimSxTKsbtPEWqYZKhRANCAAQZhhhtmx872M2puJDQtfPJ0WE1DUvsxjLX\nmUzCO9OqKGVFjyo1fAMCgAqwObdp5NIW06y1EAqYKjNiZywsOwzC\n-----END PRIVATE KEY-----\n"
},
{
"name": "ca.crt",
"content": "-----BEGIN CERTIFICATE-----\nMIIBsTCCAVagAwIBAgIJAM+BzxI9PhQhMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTAyMjYwMjQ2NTRaGA8yMTIxMDIwMjAyNDY1NFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAEYRLMZw7xe6xHt76AVHivokoHhz6ffwbKmOzbP0I5LAChwD5n\n1glOfWwJc4fFhn2bH/qfFlIGIdOj8vmOzywsqaNQME4wHQYDVR0OBBYEFPd7x8U8\nnHjZ5YWuzyKQh9SZ7p5bMB8GA1UdIwQYMBaAFPd7x8U8nHjZ5YWuzyKQh9SZ7p5b\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAO9s16mWfFzceJahV2GA\n4Od9d0fBvMN+UamEUGL0twsOAiEAza/jJna1+nPKBVB+lxnfK3TpN/QH4V0sS1VW\nkpOFMVU=\n-----END CERTIFICATE-----\n"
},
{
"name": "sdk.crt",
"content": "-----BEGIN CERTIFICATE-----\nMIIBeTCCAR+gAwIBAgIJAPYOLyl8weZiMAoGCCqGSM49BAMCMDgxEDAOBgNVBAMM\nB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTAg\nFw0yMTAyMjYwMjQ2NTRaGA8yMTIxMDIwMjAyNDY1NFowMTEMMAoGA1UEAwwDc2Rr\nMRMwEQYDVQQKDApmaXNjby1iY29zMQwwCgYDVQQLDANzZGswVjAQBgcqhkjOPQIB\nBgUrgQQACgNCAAQZhhhtmx872M2puJDQtfPJ0WE1DUvsxjLXmUzCO9OqKGVFjyo1\nfAMCgAqwObdp5NIW06y1EAqYKjNiZywsOwzCoxowGDAJBgNVHRMEAjAAMAsGA1Ud\nDwQEAwIF4DAKBggqhkjOPQQDAgNIADBFAiBaUwBn+xmdq4kMY4RdamjOdy5IhGih\nLNlC6uowICpHFgIhAOPuWHD5FwJ6iKgia/Pg28vUh1OycM6m58SB0uYWHCPi\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBcTCCARegAwIBAgIJAKA09HPrLxBIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAeFw0y\nMTAyMjYwMjQ2NTRaFw0zMTAyMjQwMjQ2NTRaMDgxEDAOBgNVBAMMB2FnZW5jeUEx\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABMvK4cYauT6D3aVBGt4tl1lD0XGxGQ9On4dGsG7lnuyxn96x\nhWGWJf7WxWcIM5cSZRxmcH8yGxTfsVJQCCC0FuujEDAOMAwGA1UdEwQFMAMBAf8w\nCgYIKoZIzj0EAwIDSAAwRQIhAOwC+rimC9RWRjEVJqoI6eP+Hm8I0Cx+3SQc6yDa\n+sZXAiBRW+SRjA2PdxbKrUEWP88V5iIrKoaNedaKJn0ydBJuHQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBsTCCAVagAwIBAgIJAM+BzxI9PhQhMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTAyMjYwMjQ2NTRaGA8yMTIxMDIwMjAyNDY1NFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAEYRLMZw7xe6xHt76AVHivokoHhz6ffwbKmOzbP0I5LAChwD5n\n1glOfWwJc4fFhn2bH/qfFlIGIdOj8vmOzywsqaNQME4wHQYDVR0OBBYEFPd7x8U8\nnHjZ5YWuzyKQh9SZ7p5bMB8GA1UdIwQYMBaAFPd7x8U8nHjZ5YWuzyKQh9SZ7p5b\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAO9s16mWfFzceJahV2GA\n4Od9d0fBvMN+UamEUGL0twsOAiEAza/jJna1+nPKBVB+lxnfK3TpN/QH4V0sS1VW\nkpOFMVU=\n-----END CERTIFICATE-----\n"
}
],
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4 私钥管理模块¶
**说明:**私钥传输时以Base64加密传输,示例如下:
String hexPrivateKey = CryptoSuite.createKeyPair().getHexPrivateKey();
// 加密
String privateKey = Base64.getEncoder().encodeToString(hexPrivateKey.getBytes());
// 解密
hexPrivateKey = new String(Base64.getDecoder().decode(privateKey));
4.1 新增私钥用户¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/newUser?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userName | String | 否 | 用户名称 |
2 | description | String | 是 | 备注 |
3 | groupId | int | 否 | 所属群组 |
4 | account | String | 否 | 关联系统账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/newUser?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
{"groupId":"1","userName":"bob","account":"admin","description":""}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | String | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | privateKey | String | 是 | Base64加密后的私钥内容 |
3.8 | address | String | 否 | 用户链上地址 |
3.9 | hasPk | int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.10 | account | String | 否 | 关联系统账号 |
3.11 | signUserId | String | 否 | 用户在sign服务的ID |
3.12 | createTime | LocalDateTime | 否 | 创建时间 |
3.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700001,
"userName": "bob",
"account": "admin",
"groupId": 1,
"publicKey": "04d7e3391db028aba558e7111702b42d90db9fe3b3b47f19a9dd9ff3b7fd216e9f19adc4643b40c86cab266edbf947503b202f90ff3d8f07e5df49d7e2047f0636",
"privateKey": "OGNlZDA1OTUyM2NmYjgzYThjYjk1MmMxMTM1YmQwZDViNzAzNmZkNWM2ZDExNmFhMjMwZWZkNGFmYzcwMWVjMQ==",
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0xc1c7f7e5916d1cf787924128bca0cb5b34622952",
"signUserId": "6c804064630e46f587de3d905e82295a",
"appId": "1",
"hasPk": 1,
"description": "",
"createTime": "2021-03-07 16:52:29",
"modifyTime": "2021-03-07 16:52:29"
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.2 查询用户列表¶
返回用户信息列表,不返回私钥内容,查询私钥需调用4.3
。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/userList?appKey={appKey}&signature={signature}×tamp={timestamp}&pageNumber={pageNumber}&pageSize={pageSize}&groupId={groupId}&userParam={userParam}&account={account}&hasPrivateKey={hasPrivateKey}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组id |
2 | pageSize | int | 否 | 每页记录数 |
3 | pageNumber | int | 否 | 当前页码 |
4 | userParam | String | 是 | 查询参数(用户名或公钥地址) |
5 | account | String | 是 | 关联系统账号 |
6 | hasPrivateKey | int | 是 | 是否拥有私钥(1-拥有,2-不拥有) |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/userList?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31&pageNumber=1&pageSize=10&groupId=1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | int | 否 | 总记录数 |
4 | data | List | 是 | 用户列表 |
4.1 | Object | 用户信息对象 | ||
4.1.1 | userId | int | 否 | 用户编号 |
4.1.2 | userName | String | 否 | 用户名称 |
4.1.3 | groupId | int | 否 | 所属群组编号 |
4.1.4 | description | String | 是 | 备注 |
4.1.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
4.1.6 | publicKey | String | 否 | 公钥信息 |
4.1.7 | privateKey | String | 是 | 列表不返回私钥 |
4.1.8 | address | String | 否 | 用户链上地址 |
4.1.9 | hasPk | int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
4.1.10 | account | String | 否 | 关联系统账号 |
4.1.11 | signUserId | String | 否 | 用户在sign服务的ID |
4.1.12 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userId": 700001,
"userName": "bob",
"account": "admin",
"groupId": 1,
"publicKey": "04d7e3391db028aba558e7111702b42d90db9fe3b3b47f19a9dd9ff3b7fd216e9f19adc4643b40c86cab266edbf947503b202f90ff3d8f07e5df49d7e2047f0636",
"privateKey": null,
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0xc1c7f7e5916d1cf787924128bca0cb5b34622952",
"signUserId": "6c804064630e46f587de3d905e82295a",
"appId": "1",
"hasPk": 1,
"description": "",
"createTime": "2021-03-07 16:52:29",
"modifyTime": "2021-03-07 16:52:29"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.3 查询用户信息¶
返回具体用户信息,包含私钥内容(Base64加密后的私钥内容)。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/userInfo?appKey={appKey}&signature={signature}×tamp={timestamp}&userId={userId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userId | int | 否 | 用户编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/userInfo?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31&userId=700001
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | String | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | privateKey | String | 是 | Base64加密后的私钥内容 |
3.8 | address | String | 否 | 用户链上地址 |
3.9 | hasPk | int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.10 | account | String | 否 | 关联系统账号 |
3.11 | signUserId | String | 否 | 用户在sign服务的ID |
3.12 | createTime | LocalDateTime | 否 | 创建时间 |
3.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700001,
"userName": "bob",
"account": "admin",
"groupId": 1,
"publicKey": "04d7e3391db028aba558e7111702b42d90db9fe3b3b47f19a9dd9ff3b7fd216e9f19adc4643b40c86cab266edbf947503b202f90ff3d8f07e5df49d7e2047f0636",
"privateKey": "OGNlZDA1OTUyM2NmYjgzYThjYjk1MmMxMTM1YmQwZDViNzAzNmZkNWM2ZDExNmFhMjMwZWZkNGFmYzcwMWVjMQ==",
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0xc1c7f7e5916d1cf787924128bca0cb5b34622952",
"signUserId": "6c804064630e46f587de3d905e82295a",
"appId": "1",
"hasPk": 1,
"description": "",
"createTime": "2021-03-07 16:52:29",
"modifyTime": "2021-03-07 16:52:29"
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.4 导入私钥用户¶
导入私钥,其中私钥字段用Base64加密
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/importPrivateKey?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | privateKey | String | 否 | Base64加密后的私钥内容 |
2 | userName | String | 否 | 用户名称 |
3 | description | String | 是 | 备注 |
4 | groupId | int | 否 | 所属群组 |
5 | account | String | 否 | 关联系统账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/importPrivateKey?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
{
"privateKey": "Yjk4YzM3Y2EzNTMxMzNiOWI2MWUwOTMxODhmOTk2NTc2MGYxMTBhMTljNTI2MmY3NTczMDVkNThlOGM3ZWNlMA==",
"groupId": 1,
"description": "test",
"userName": "alice",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 201031,
"message": "privateKey decode fail",
"data": null
}
4.5 导入.pem私钥¶
可导入控制台所生成的私钥.pem文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/importPem?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pemContent | String | 否 | pem文件的内容,必须以-----BEGIN PRIVATE KEY-----\n 开头,以\n-----END PRIVATE KEY-----\n 结尾的格式 |
2 | userName | String | 否 | 用户名称 |
3 | description | String | 是 | 备注 |
4 | groupId | int | 否 | 所属群组 |
5 | account | String | 否 | 关联系统账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/importPem?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
{
"pemContent":"-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgC8TbvFSMA9y3CghFt51/\nXmExewlioX99veYHOV7dTvOhRANCAASZtMhCTcaedNP+H7iljbTIqXOFM6qm5aVs\nfM/yuDBK2MRfFbfnOYVTNKyOSnmkY+xBfCR8Q86wcsQm9NZpkmFK\n-----END PRIVATE KEY-----\n",
"groupId": "1",
"description": "test",
"userName": "user2",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 201232,
"message": "Pem file format error, must surrounded by -----XXXXX PRIVATE KEY-----"",
"data": null
}
4.6 导入.p12私钥¶
可导入控制台生成的私钥.p12文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/importP12?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:POST
- 请求头:Content-type: form-data
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | p12File | MultipartFile | 否 | .p12文件 |
2 | p12Password | String | 是 | 使用base64编码的密码;.p12文件的密码,缺省时默认为"",即空密码;p12无密码时,可传入空值或不传;不包含中文 |
3 | userName | String | 否 | 用户名称 |
4 | description | String | 是 | 备注 |
5 | groupId | int | 否 | 所属群组 |
6 | account | String | 否 | 关联系统账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/importP12?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
使用form-data传参
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:(p12文件的密码错误)
{
"code": 201236,
"message": "p12's password not match",
"data": null
}
4.7 导入公钥用户¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/importPublicKey
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userName | string | 否 | 用户名称 |
2 | publicKey | string | 否 | 用户公钥 |
3 | groupId | Int | 否 | 所属群组 |
4 | account | string | 否 | 关联账户 |
5 | description | string | 是 | 备注 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/importPublicKey?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
{
"userName": "rose",
"publicKey": "0x98c4e9896dfa062c7555ede0f1509bda90668902ee9a3b382a3941869d3d69026ece966e1afe9f9de41c2e762750dee8d7df47439b3340a22cd620e2f6975ef8",
"groupId": 1,
"description": "test",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | string | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700003,
"userName": "rose",
"account": "admin",
"groupId": 1,
"publicKey": "0x98c4e9896dfa062c7555ede0f1509bda90668902ee9a3b382a3941869d3d69026ece966e1afe9f9de41c2e762750dee8d7df47439b3340a22cd620e2f6975ef8",
"privateKey": null,
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0xd5eefc7e9df47f17ee8da8639078ac5da934a782",
"signUserId": null,
"appId": null,
"hasPk": 2,
"description": "sdfa",
"createTime": "2021-03-12 18:39:39",
"modifyTime": "2021-03-12 18:39:39"
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5 合约管理模块¶
5.1 合约原文保存接口¶
导入应用合约原文信息,按版本导入,WeBASE会存储到应用合约仓库表。当应用调用合约地址保存接口(5.2)时,会从合约仓库表获取对应合约保存到合约表,在WeBASE管理平台展示。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/contractSourceSave?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | contractList | List | 否 | 合约列表 |
1.1 | contractName | String | 否 | 合约名称 |
1.2 | contractSource | String | 否 | 合约源码的base64 |
1.3 | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
1.4 | bytecodeBin | String | 否 | 合约编译后生成的bytecodeBin,可用于合约部署 |
2 | contractVersion | String | 否 | 合约版本 |
3 | account | String | 否 | 关联系统账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/contractSourceSave?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
{
"contractList": [
{
"contractName": "HelloWorld",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQogICAgZnVuY3Rpb24gZ2V0KGJ5dGVzMzJbXSB2KWNvbnN0YW50IHJldHVybnMoYWRkcmVzcyl7DQogICAgICAgIGlmICh2Lmxlbmd0aCA8IDIpIHsNCiAgICAgICAgICAgIHJldHVybiAweDA7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDB4MTsNCiAgICB9DQp9",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"v\",\"type\":\"bytes32[]\"}],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"bytecodeBin": "608060405234801561001057600080fd5b50610443806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634ed3885e1461005c5780636d4ce63c146100c5578063abf306a814610155575b600080fd5b34801561006857600080fd5b506100c3600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101fb565b005b3480156100d157600080fd5b506100da6102b1565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561011a5780820151818401526020810190506100ff565b50505050905090810190601f1680156101475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561016157600080fd5b506101b960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610353565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b7f4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025d578082015181840152602081019050610242565b50505050905090810190601f16801561028a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a180600090805190602001906102ad929190610372565b5050565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103495780601f1061031e57610100808354040283529160200191610349565b820191906000526020600020905b81548152906001019060200180831161032c57829003601f168201915b5050505050905090565b6000600282511015610368576000905061036d565b600190505b919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103b357805160ff19168380011785556103e1565b828001600101855582156103e1579182015b828111156103e05782518255916020019190600101906103c5565b5b5090506103ee91906103f2565b5090565b61041491905b808211156104105760008160009055506001016103f8565b5090565b905600a165627a7a72305820731c8ae3330a613a2a8c196a28a9fb816dd19bdea5fdcab508d9d968af0fdccd0029",
"account": "admin"
}
],
"contractVersion": "1.0.0",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.2 合约地址保存接口¶
应用自己部署完合约,导入相应合约地址。导入时,WeBASE会从应用合约仓库表获取对应合约保存到合约表,从而可以在WeBASE管理平台进行展示和调用。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/contractAddressSave?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | groupId | int | 否 | 所属群组编号 |
2 | contractName | String | 否 | 合约名称 |
3 | contractPath | String | 否 | 合约目录(应用以自己部署合约的逻辑定义路径,部署一次则提供一个路径,该路径在WeBASE管理平台合约文件夹) |
4 | contractAddress | String | 否 | 合约地址 |
5 | contractVersion | String | 否 | 合约版本 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/contractAddressSave?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
{
"groupId": "1",
"contractName": "hellos",
"contractPath": "/",
"contractVersion": "1.0.0",
"contractAddress": "0x651a8e7899084019f82a93da880d77470bacf6d7"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6 其他接口¶
6.1 查询数据库信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/api/dbInfo?appKey={appKey}&signature={signature}×tamp={timestamp}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/api/dbInfo?timestamp=1614928857832&appKey=fdsf78aW&signature=EEFD7CD030E6B311AA85B053A90E8A31
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 返回信息实体 | |
3.1 | dbIp | String | 否 | 数据库IP |
3.2 | dbPort | int | 否 | 数据库端口 |
3.3 | dbUser | String | 否 | 数据库用户名 |
3.4 | dbPwd | String | 否 | Base64加密后的数据库密码 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"dbIp": "127.0.0.1",
"p2pPort": 3306,
"dbUser": test,
"dbPwd": "Yjk4YzM3Y2EzNTMxMzNiOWI2MWUwOTMxODhmOTk2NTc2MGYxMTBhMTljNTI2MmY3NTcz=="
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
附录¶
1. 返回码信息列表¶
code | message | 描述 |
---|---|---|
0 | success | 成功 |
102001 | system error | 系统异常 |
202001 | database exception | 数据库异常 |
202005 | group id cannot be empty | 群组不能为空 |
202012 | user id cannot be empty | 用户编号不能为空 |
202013 | invalid user | 无效的用户编号 |
202014 | user already exists | 用户信息已经存在 |
202015 | contract already exists | 合约信息已经存在 |
202017 | invalid contract id | 无效的合约编号 |
202018 | invalid param info | 无效的入参信息 |
202019 | contract name cannot be repeated | 合约名称不能重复 |
202027 | account info not exists | 该帐号不存在 |
202028 | account name empty | 帐号名称不能为空 |
202029 | invalid account name | 无效的账号名称 |
202520 | contract source not exist | 合约原文不存在 |
202521 | timestamp cannot be empty | 时间戳不能为空 |
202522 | appKey cannot be empty | 应用Key不能为空 |
202523 | signature cannot be empty | 签名不能为空 |
202524 | timestamp timeout | 时间戳超时 |
202525 | app key not exists | 应用Key不存在 |
202526 | signature not match | 签名不匹配 |
升级说明¶
WeBASE-Node-Manager升级的兼容性说明,请结合WeBASE-Node-Manager Changelog进行阅读
WeBASE-Node-Manager升级的必须步骤:
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 使用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 - 查看节点管理服务升级文档中对应版本是否需要修改数据表,若不需要升级则跳过
3.1 若需要升级数据表,首先使用
mysqldump
命令备份数据库 3.2 按照升级文档指引,操作数据表 bash stop.sh && bash start.sh
重启
各个版本的具体修改可参考下文
v1.5.0¶
- 新增应用管理,支持WeIdentity模板和自定义应用接入
- 新增节点监控的链上TPS、出块周期、块大小的统计
- 新增合约列表中的已登记合约与链上全量合约视图、新增私钥用户列表中的已登记私钥与链上全量私钥视图
- 支持导出Txt/Pem/P12/WeID私钥文件、支持导出前置的SDK证书
数据表更新¶
执行webase-node-mgr中script/upgrade
目录中的v143_v150.sql
即可更新数据表可通过mysql -e source v143_v150.sql
命令执行
- 注:提前备份mysql数据
更新详情如下
数据表字段修改
tb_app_info
中插入WeIdentity示例应用信息tb_contract
表中修改contract_path
字段长度为varchar(128)
tb_cns
表中修改contract_path
字段长度为varchar(128)
,DEFAULT NULL
tb_contract_path
表中修改contract_path
字段长度为varchar(128)
tb_abi
表中移除唯一约束unique_name
数据表结构更改
- 新增了应用信息表
tb_app_info
- 新增了合约仓库信息表
tb_contract_store
- 新增了区块统计数据表
tb_stat
- 新增了外部合约信息表
tb_external_contract
- 新增了外部账户信息表
tb_external_account
v1.4.3¶
- 拆分可视化部署步骤为:添加主机、初始化主机、部署节点
- 可视化部署支持同机部署节点、支持自动拉取镜像
- 可视化部署使用ansible,并完善各个步骤的检测脚本
- 支持注册CNS合约
数据表更新¶
字段更新:
tb_contract
表中bytecodeBin
的列名修改为bytecode_bin
,并对应更新了conf/mapper/ContractMapper.xml
文件tb_host
表中remark
字段从varchar修改为text类型,移除了agency_id
,agency_name
,docker_port
字段,唯一约束改为UNIQUE KEY unique_ip (ip) USING BTREE
tb_user
表增加地址的唯一约束UNIQUE KEY unique_address (group_id,address)
tb_front_group_map
中增加默认值为1的节点类型字段type tinyint(4) DEFAULT 1 COMMENT '节点的共识类型:1-共识节点(默认),2-观察节点'
数据表具体更新方法可根据实际情况自行制定
数据表新增:
- 新增合约CNS信息表
tb_cns
CREATE TABLE IF NOT EXISTS tb_cns (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
group_id int(11) NOT NULL COMMENT '群组ID',
contract_path varchar(24) binary NOT NULL COMMENT '合约所在目录',
contract_name varchar(120) binary NOT NULL COMMENT '合约名称',
cns_name varchar(120) binary NOT NULL COMMENT 'cns名称',
version varchar(120) DEFAULT NULL COMMENT 'cns版本',
contract_address varchar(64) DEFAULT NULL COMMENT '合约地址',
create_time datetime DEFAULT NULL COMMENT '创建时间',
modify_time datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (id),
UNIQUE KEY uk_path_name (group_id,contract_path,contract_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='cns信息表';
v1.4.2¶
- 新增了合约EventLog查询功能
数据表更新¶
字段更新:
tb_contract
表中bytecodeBin
的列名修改为bytecode_bin
,并对应更新了conf/mapper/ContractMapper.xml
文件
数据表新增:
- 新增合约路径信息表
tb_contract_path
CREATE TABLE IF NOT EXISTS tb_contract_path (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '合约路径编号',
contract_path varchar(24) binary NOT NULL COMMENT '合约所在目录',
group_id int(11) NOT NULL COMMENT '所属群组编号',
create_time datetime DEFAULT NULL COMMENT '创建时间',
modify_time datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (id),
UNIQUE KEY uk_group_path_name (group_id,contract_path)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='合约路径表';
v1.4.1¶
新增FISCO BCOS v2.5.0及以上版本的基于角色的权限管理功能,新增了开发者模式
- 新的权限管理基于角色,可参考FISCO BCOS权限控制文档
- 开发者模式:新增了用户角色developer,可进行查询交易,合约部署调用等功能,无法使用管理员的系统管理与监控等功能。
数据表更新¶
登录 MySQL 后,选择数据库 use webasenodemanager;
后,按顺序执行下面的 SQL 语句进行 DB 升级。
数据表字段新增
- 新增了
tb_user
,tb_contract
中的account
字段,并更新了唯一约束。 - 用户角色表
tb_role
中新增了默认值developer
- 合约表
tb_contract
中新增了deploy_address
和deploy_user_name
字段,记录部署的私钥用户信息
-- tb_user修改
alter table tb_user add column account varchar(50) binary NOT NULL COMMENT '关联账号';
alter table tb_user drop index `unique_name`
alter table tb_user add UNIQUE KEY `unique_name` (group_id,user_name,account);
-- tb_contract修改
alter table tb_contract add column account varchar(50) binary NOT NULL COMMENT '关联账号';
alter table tb_contract drop index `uk_group_path_name`
alter table tb_contract add UNIQUE KEY uk_group_path_name (group_id,contract_path,contract_name,account);
alter table tb_contract add column deploy_address varchar(64) DEFAULT NULL COMMENT '合约部署者地址';
alter table tb_contract add column deploy_user_name varchar(64) DEFAULT NULL COMMENT '合约部署者用戶名';
-- tb_role修改
INSERT INTO `tb_role` (role_name,role_name_zh,create_time,modify_time)VALUES ('developer', '开发者', now(), now());
数据表结构更改
- 新增了链委员管理投票信息表
tb_govern_vote
CREATE TABLE IF NOT EXISTS tb_govern_vote (
id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '链治理委员投票记录ID',
group_id int(11) NOT NULL COMMENT '群组ID',
time_limit bigint DEFAULT NULL COMMENT '投票截止块高',
from_address varchar(64) NOT NULL COMMENT '管理员地址',
type tinyint(8) NOT NULL COMMENT '投票类型,1-选举,2-去除,3-修改委员权重,4,-修改阈值',
to_address varchar(64) DEFAULT NULL COMMENT '选举/去除的地址',
detail varchar(64) DEFAULT NULL COMMENT '3-修改权重,4-修改阈值时存储具体信息',
create_time datetime NOT NULL COMMENT '创建时间',
modify_time datetime NOT NULL COMMENT '最近一次更新时间',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='链治理委员投票信息';
v1.4.0¶
v1.4.0 新增了可视化部署区块链的功能,同时支持节点的动态管理(扩容、停止、删除等)功能,同时兼容原有的手动搭链添加WeBASE-Front节点前置的模式
注:在运行WeBASE-Node-Manager前要选择在下面两种模式中二选一:
- 添加前置方式
- 可视化部署方式
提示:如果要体验完整的可视化部署,可通过可视化部署的安装指引,通过一键部署或手动部署安装子系统进行搭建
数据库结构变更¶
- 登录 MySQL 后,选择数据库
use webasenodemanager;
后,按顺序执行下面的 SQL 语句进行 DB 升级。 - 合约abi与bin相关字段的类型修改,修改
text
类型到mediumtext
ALTER TABLE `tb_abi` MODIFY COLUMN `contract_abi` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '合约ABI的内容';
ALTER TABLE `tb_abi` MODIFY COLUMN `contract_bin` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '合约ABI的runtime-bin';
ALTER TABLE `tb_contract` MODIFY COLUMN `contract_abi` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '编译合约生成的abi文件内容';
ALTER TABLE `tb_contract` MODIFY COLUMN `contract_bin` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '合约binary';
ALTER TABLE `tb_contract` MODIFY COLUMN `bytecodeBin` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '合约bin';
ALTER TABLE `tb_front_group_map` MODIFY COLUMN `status` int(11) NOT NULL DEFAULT 1 COMMENT '节点(前置)的群组状态,1-normal,2-invalid';
ALTER TABLE `tb_group` MODIFY COLUMN `group_status` int(1) NULL DEFAULT 1 COMMENT '状态(1-正常 2-异常 3-脏数据冲突 4-创世块冲突)';
- 新增字段
ALTER TABLE `tb_group` ADD COLUMN `chain_id` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '所属链 ID';
ALTER TABLE `tb_group` ADD COLUMN `chain_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '所属链名称,冗余字段';
ALTER TABLE `tb_group` ADD UNIQUE INDEX `unique_chain_id_group_id`(`chain_id`, `group_id`) USING BTREE;
ALTER TABLE `tb_front` ADD COLUMN `support_version` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点兼容版本';
ALTER TABLE `tb_front` ADD COLUMN `front_version` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点前置版本号';
ALTER TABLE `tb_front` ADD COLUMN `sign_version` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点前置对应签名服务版本号';
ALTER TABLE `tb_front` MODIFY COLUMN `front_port` int(11) NOT NULL COMMENT '前置服务端口';
ALTER TABLE `tb_front` MODIFY COLUMN `status` int(11) NULL DEFAULT 1 COMMENT '前置服务状态:0,初始化;1,运行;2,停止;3,启动;4,添加中;5,添加失败';
ALTER TABLE `tb_front` MODIFY COLUMN `create_time` datetime(0) NOT NULL COMMENT '创建时间';
ALTER TABLE `tb_front` MODIFY COLUMN `modify_time` datetime(0) NOT NULL COMMENT '修改时间';
ALTER TABLE `tb_front` ADD COLUMN `run_type` tinyint(8) UNSIGNED NULL DEFAULT 0 COMMENT '运行方式:0,命令行;1,Docker';
ALTER TABLE `tb_front` ADD COLUMN `agency_id` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '所属机构 ID';
ALTER TABLE `tb_front` ADD COLUMN `agency_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '所属机构名称,冗余字段, 跟 agency 字段相同'
ALTER TABLE `tb_front` ADD COLUMN `host_id` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '所属主机';
ALTER TABLE `tb_front` ADD COLUMN `host_index` int(6) NULL DEFAULT 0 COMMENT '一台主机可能有多个节点。表示在主机中的编号,从 0 开始编号';
ALTER TABLE `tb_front` ADD COLUMN `image_tag` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '运行的镜像版本标签';
ALTER TABLE `tb_front` ADD COLUMN `container_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT 'Docker 启动的容器名称';
ALTER TABLE `tb_front` ADD COLUMN `jsonrpc_port` int(6) NULL DEFAULT 8545 COMMENT 'jsonrpc 端口';
ALTER TABLE `tb_front` ADD COLUMN `p2p_port` int(6) NULL DEFAULT 30303 COMMENT 'p2p 端口';
ALTER TABLE `tb_front` ADD COLUMN `channel_port` int(6) NULL DEFAULT 20200 COMMENT 'channel 端口';
ALTER TABLE `tb_front` ADD COLUMN `chain_id` int(10) UNSIGNED NULL DEFAULT 0 COMMENT '所属链 ID';
ALTER TABLE `tb_front` ADD COLUMN `chain_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '所属链名称,冗余字段';
ALTER TABLE `tb_front` ADD UNIQUE INDEX `unique_agency_id_host_id_front_port`(`agency_id`, `front_ip`, `front_port`) USING BTREE;
- 机构信息表
tb_agency
, 链信息表tb_chain
, 系统配置信息表tb_config
, 物理主机信息表tb_host
CREATE TABLE `tb_agency` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增长 ID',
`agency_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '机构名称',
`agency_desc` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '机构描述信息',
`chain_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属链 ID',
`chain_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '所属链名称,冗余字段',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`modify_time` datetime(0) NOT NULL COMMENT '最近一次更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_chain_id_agency_name`(`chain_id`, `agency_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '机构信息表' ROW_FORMAT = Dynamic;
CREATE TABLE `tb_chain` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增长 ID',
`chain_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '链名称',
`chain_desc` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链描述信息',
`version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '创建链时选择的镜像版本',
`encrypt_type` tinyint(8) UNSIGNED NOT NULL DEFAULT 1 COMMENT '加密类型:1,标密;2,国密;默认 1 ',
`chain_status` tinyint(8) UNSIGNED NOT NULL DEFAULT 0 COMMENT '0: 初始化;1,部署中;2,部署失败;3,运行;4,重启中;5,升级过;6,升级失败',
`root_dir` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '/opt/fisco-bcos' COMMENT '主机存放节点配置文件的根目录,可能存放多个节点配置',
`webase_sign_addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '127.0.0.1:5004' COMMENT 'WeBASE-Sign 的访问地址',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`modify_time` datetime(0) NOT NULL COMMENT '最近一次更新时间',
`run_type` tinyint(8) UNSIGNED NULL DEFAULT 0 COMMENT '运行方式:0,命令行;1,Docker',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_chain_name`(`chain_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '链信息表' ROW_FORMAT = Dynamic;
CREATE TABLE `tb_config` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增长 ID',
`config_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置名称',
`config_type` int(10) NOT NULL DEFAULT 0 COMMENT '配置类型',
`config_value` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '配置值',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`modify_time` datetime(0) NOT NULL COMMENT '最近一次更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统配置信息表' ROW_FORMAT = Dynamic;
CREATE TABLE `tb_host` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增长 ID',
`agency_id` int(10) UNSIGNED NOT NULL DEFAULT 1 COMMENT '所属机构 ID',
`agency_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属机构名称,冗余字段',
`ip` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主机IP',
`ssh_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'root' COMMENT 'SSH 登录账号',
`ssh_port` int(10) UNSIGNED NOT NULL DEFAULT 22 COMMENT 'SSH 端口',
`root_dir` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '/opt/fisco-bcos' COMMENT '主机存放节点配置文件的根目录,可能存放多个节点配置',
`docker_port` int(10) UNSIGNED NOT NULL DEFAULT 2375 COMMENT 'Docker demon 的端口',
`status` tinyint(8) UNSIGNED NOT NULL DEFAULT 0 COMMENT '主机状态:0,新建;1,初始化;2,初始化成功;3,初始化失败',
`remark` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'remark',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`modify_time` datetime(0) NOT NULL COMMENT '最近一次更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unq_agency_id,ip`(`agency_id`, `ip`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '物理主机信息' ROW_FORMAT = Dynamic;
- 插入常量数据
INSERT INTO `tb_config`(`config_name`, `config_type`, `config_value`, `create_time`, `modify_time`) VALUES ('docker 镜像版本', 1, 'v2.5.0', '2020-07-22 17:14:23', '2020-07-22 17:14:23');
INSERT INTO `tb_config`(`config_name`, `config_type`, `config_value`, `create_time`, `modify_time`) VALUES ('docker 镜像版本', 1, 'v2.5.0-gm', '2020-07-22 17:14:23', '2020-07-22 17:14:23');
v1.3.1¶
v1.3.1主要新增了动态群组接口、导入abi接口、导入私钥接口、定时任务优化等功能,详情升级说明如下:
新增动态群组接口¶
- 新增动态群组接口,包含生成群组、启动/停止群组、删除/恢复群组、单个/批量查询群组状态等接口
注:节点生成新群组或加入新群组需要对节点进行三步操作:生成群组、启动群组、节点加入群组共识节点/观察节点;如何通过WeBASE页面操作可参考动态群组管理使用指南
接口详情可参考接口文档中群组管理模块的动态群组接口说明
新增导入已部署合约Abi功能、合约Abi编码器¶
- 新增导入合约abi接口,可以导入已部署的合约进行管理
新增导入.p12私钥用户¶
- 新增导入.p12/.pem/.txt私钥接口;其中.txt与节点前置导出私钥格式一致,.p12/.pem与控制台导出私钥格式一致;
定时任务优化¶
- 定时任务并行化,可通过yml配置线程池大小,线程阻塞时长等加快拉取区块、拉取交易
数据表的字段修改¶
- tb_front新增
status
字段,用于记录已添加的节点前置的状态,与节点状态同步,每过7.5秒更新一次;同时每请求一次节点前置会更新前置状态(每次更新至少间隔3秒) - 新增tb_abi数据表,用于记录导入的合约abi
- tb_group数据表新增字段:
group_status
字段新增两种状态,全部状态包括:1-normal, 2-maintaining, 3-dirty-data, 4-conflict-genesis
group_desc
字段修改为description
,记录群组的描述内容- 新增
group_timestamp
记录动态创建群组的创世块时间戳 - 新增
node_id_list
记录动态创建群组的创世块共识节点列表
- tb_front_group_map数据表新增
status
字段,记录节点前置某一群组的状态(1-可用,2-不可用)
数据表升级操作
登陆mysql后,进入到相应database中,以webasenodemanager
的database为例;
mysql -uroot -p123456
// mysql 命令行
mysql> use webasenodemanager;
// tb_front表新增status字段
mysql> alter table tb_front add column status int(11) DEFAULT 1 COMMENT '前置服务状态';
// 新增tb_abi表
mysql> CREATE TABLE IF NOT EXISTS tb_abi (
abi_id int(11) NOT NULL AUTO_INCREMENT COMMENT '合约ABI的编号',
group_id int(11) NOT NULL COMMENT '合约ABI所属群组的编号',
contract_name varchar(120) NOT NULL COMMENT '合约ABI的合约名',
contract_address varchar(64) NOT NULL COMMENT '合约ABI的合约地址',
contract_abi text NOT NULL COMMENT '合约ABI的内容',
contract_bin text NOT NULL COMMENT '合约ABI的runtime-bin',
create_time datetime DEFAULT NULL COMMENT '合约ABI的创建时间',
modify_time datetime DEFAULT NULL COMMENT '合约ABI的修改时间',
PRIMARY KEY (abi_id),
UNIQUE KEY unique_address (group_id,contract_address),
UNIQUE KEY unique_name (group_id,contract_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='合约ABI表';
// tb_group新增description、group_timestamp、node_id_list字段
mysql> alter table tb_group add column description varchar(1024) COMMENT '群组描述';
mysql> alter table tb_group add column group_timestamp varchar(64) COMMENT '群组创世块时间戳';
mysql> alter table tb_group add column node_id_list text COMMENT '群组成员节点的ID';
// tb_front_group_map新增status字段
mysql> alter table tb_front_group_map add column status int(11) DEFAULT 1 NOT NULL COMMENT '节点(前置)的群组状态';
v1.3.0¶
WeBASE-Node-Manager v1.3.0后,将通过WeBASE-Sign来管理私钥和对交易签名,可查看以下升级说明进行修改:
- 私钥用户数据表
tb_user
新增字段sign_user_id
和app_id
- 将WeBASE-Node-Manager的私钥数据移植到WeBASE-Sign数据库
生成私钥的流程
使用sign生成私钥的流程
交易签名的流程
使用sign交易签名的流程
私钥用户数据表字段新增¶
- 数据库中的
tb_user
新增了varchar类型的字段sign_user_id
和app_id
,其中signUserId
会在新建私钥时用随机的UUID String赋值并保存;
tb_user表字段的修改:
CREATE TABLE IF NOT EXISTS tb_user (
user_id int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
user_name varchar(64) binary NOT NULL COMMENT '用户名',
...
sign_user_id varchar(64) NOT NULL COMMENT '签名服务中的user的业务id',
app_id varchar(64) DEFAULT NULL COMMENT '区块链应用的编号',
...
UNIQUE KEY unique_uuid (sign_user_id)
) ENGINE=InnoDB AUTO_INCREMENT=700001 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
新增字段升级操作说明
登陆mysql后,进入到相应database中,以webasenodemanager
的database为例;
mysql -uroot -p123456
// mysql 命令行
mysql> use webasenodemanager;
// 在tb_user中添加列
mysql> alter table tb_user add column sign_user_id varchar(64) default null;
mysql> alter table tb_user add column app_id varchar(64) not null;
// 添加sign_user_id的唯一约束
mysql> alter table tb_user add unique key unique_uuid (sign_user_id);
// 生成唯一的sign_user_id和app_id
...
// 为已存在的用户的sign_user_id和app_id赋值
...
注意,WeBASE-Node-Manager赋值的sign_user_id与app_id将在私钥数据迁移时,一同赋值给WeBASE-Sign tb_user表的对应字段
私钥数据移植到WeBASE-Sign¶
- WeBASE-Node-Manager的私钥将通过WeBASE-Sign托管(新建私钥、保存私钥和交易签名),不再由WeBASE-Front生成和保存(仅保存公钥与地址);
- WeBASE-Node-Manager将通过WeBASE-Front的
/trans/handleWithSign
接口和/contract/deployWithSign
接口进行合约部署与交易
如已安装WeBASE-Sign,则按照WeBASE-Sign v1.3.0升级文档更新其tb_user
表,再执行私钥数据转移操作;
如未安装WeBASE-Sign,则按照WeBASE-Sign安装文档配置环境并运行WeBASE-Sign后(运行WeBASE-Sign服务后会自动创建tb_user表),再执行私钥数据转移操作;
转移WeBASE-Node-Manager私钥到WeBASE-Sign的操作说明
用户需要通过以下操作将存于节点服务数据库(如webasenodemanager
数据库)的私钥数据导出,并导入到WeBASE-Sign数据库(如webasesign
数据库)中
- 由于保存到数据库的私钥值是经过AES加密后存储的,因此,需保证WeBASE-Front和WeBASE-Sign application.yml中的
constant-aesKey
字段的值一样; - 在WeBASE-Node-Manager数据库中的
tb_user
表和tb_user_key_mapping
表,获取所有WeBASE-Node-Manager的私钥数据,包括tb_user
表中的sign_user_id
和app_id
(前文所插入的值),地址address
与公钥publick_key
,还有tb_user_key_mapping
表中的私钥private_key
; - 在WeBASE-Sign数据库中,将上文获得的所有私钥数据按对应字段,执行insert操作,插入到其
tb_user
表中;
升级操作说明
登陆mysql,进入到相应database中,以webasenodemanager
和webasesign
的database为例;
> mysql -uroot -p123456
// 选择webase-node-manager数据库
mysql> use webasenodemanager;
// 使用left join查询所有私钥数据(address,public_key,sign_user_id,app_id,private_key)
mysql> select a.address,a.public_key,a.sign_user_id,a.app_id,b.private_key from tb_user a left join tb_user_key_mapping b on(a.user_id=b.user_id) where b.map_status=1
// 选择webase-sign数据库进行插入操作
mysql> use webasesign;
// 将上述操作获取的(address,public_key,sign_user_id,app_id,private_key)插入到webase-sign的tb_user表
// 略
v1.2.2¶
国密支持说明¶
国密版FISCO-BCOS与非国密版不可互通,同理,WeBASE组件的国密与非国密也不可互通,因此如果需要切换到国密版,需要重新建链与搭建WeBASE平台
可根据WeBASE一键部署重新搭建国密的FISCO BCOS + WeBASE平台
详细子系统的国密参数设置可参考FISCO-BCOS 国密支持、WeBASE-Node-Manager 国密支持和WeBASE-Front 国密支持
- 初始化数据修改:数据表的
tb_method
默认数据需要替换为国密版默认数据,可参考项目中scripts/gm
中的webase-dml-gm.sql
中的第5项进行数据初始化;
兼容性说明:中英文支持,优化部分功能¶
- 初始化数据修改:数据表
tb_alert_rule
默认数据支持中英文告警,可结合项目中scripts/webase-dml.sql
第6项进行数据更新; - 数据表字段增加:数据表
tb_front
增加一列client_version
,用于记录节点版本与是否为国密; - 数据表字段增加:动态增加的数据表
tb_trans_hash_x
增加一列trans_number
,用于记录交易数;该更改无法与前一版本兼容;如需升级v1.2.2,可根据下文将getCountByMinMax()方法替换为原来的getCount()方法
升级中英文告警操作说明
登陆mysql后,进入到相应database中,以webasenodemanager
的database为例;
mysql -uroot -p123456
// mysql 命令行
mysql> use webasenodemanager;
可以参考WeBASE-Node-Manager v1.2.2源码中的webase-dml.sql
- 修改
tb_alert_rule
的默认数据:
// 删除原有数据
mysql> delete * from tb_alert_rule where 1=1;
// 插入新的中英文数据
---- add node status alert rule template
INSERT INTO `tb_alert_rule`(`rule_name`,`enable`,`alert_type`,`alert_level`,`alert_interval_seconds`,`alert_content`,`content_param_list`,`create_time`,`modify_time`) VALUES ('节点异常告警/Node Exception', 0, 1, 1, 3600, '{nodeId}节点异常,请到“节点管理”页面查看具体信息 / Node: {nodeIdEn} node status exception,please check out in \"Node Management\"', '[\"{nodeId}\", \"{nodeIdEn}\"]', '2019-10-29 20:02:30', '2019-10-29 20:02:30');
---- add audit alert rule template
INSERT INTO `tb_alert_rule`(`rule_name`,`enable`,`alert_type`,`alert_level`,`alert_interval_seconds`,`alert_content`,`content_param_list`,`create_time`,`modify_time`) VALUES ('审计异常告警/Audit Exception', 0, 2, 1, 3600, '审计异常:{auditType},请到“交易审计”页面查看具体信息 / Audit alert: {auditTypeEn},please check out in \"Transaction Audit\"', '[\"{auditType}\", \"{auditTypeEn}\"]', '2019-10-29 20:02:30', '2019-10-29 20:02:30');
-- add cert alert rule template
INSERT INTO `tb_alert_rule`(`rule_name`,`enable`,`alert_type`,`alert_level`,`alert_interval_seconds`,`alert_content`,`content_param_list`,`create_time`,`modify_time`) VALUES ('证书有效期告警/Cert Validity Exception', 0, 3, 1, 3600, '证书将在{time}过期,请到“证书管理”页面查看具体信息 / Cert validity exception:invalid at {timeEn},please check out in \"Cert Management\"', '[\"{time}\", \"{timeEn}\"]', '2019-10-29 20:02:30', '2019-10-29 20:02:30');
数据表字段增加-tb_front
- 获取Front的IP与端口,登陆mysql同上操作
mysql> select * from tb_front;
+----------+----------------------------------------------------------------------------------------------------------------------------------+------------+------------+--------+---------------------+---------------------+----------------+
| front_id | node_id | front_ip | front_port | agency | create_time | modify_time | client_version |
+----------+----------------------------------------------------------------------------------------------------------------------------------+------------+------------+--------+---------------------+---------------------+----------------+
| 500001 | b44c4f713b40b67ed2f9dae2ef208808b7f31112efe1a822de046604fe0bbdffdf46b7c0cf1ca9aa468752d514958cb603670a6d345c78faff6e69d825e851b8 | 127.0.0.1 | 5002 | agency0 | 2019-12-23 17:57:35 | 2019-12-23 17:57:35 | 2.1.0 gm |
+----------+----------------------------------------------------------------------------------------------------------------------------------+------------+------------+--------+---------------------+---------------------+----------------+
1 row in set (0.00 sec)
- 获取相应Front的节点版本:通过访问WeBASE-Front的
front_ip:front_port/{groupId}/web3/clientVersion
接口获取节点版本FISCO-BCOS Version
// 获取clientVersion
curl http://front_ip:front_port/WeBASE-Front/1/web3/clientVersion
// response:
{
...
"Chain Id": "1",
"FISCO-BCOS Version": "2.1.0 gm",
...
}
- 在
tb_front
增加client_version
一列 - 更新其数据值为上面获取的
FISCO-BCOS Version
值,如国密节点2.1.0 gm
mysql> alter table tb_front add column client_version varchar(32) NOT NULL COMMENT '节点版本(国密/非国密)';
mysql> update tb_front set client_version='2.1.0 gm' where front_id='{front_id}';
数据表字段增加-tb_trans_hash_xx
- 更新由TableService动态生成的数据表
tb_trans_hash_xx
的字段:该更改无法与前一版本兼容;
如需升级v1.2.2,可将代码中使用TransHashMapper/getCountByMinMax()方法替换为原来的getCount()方法
package com.webank.webase.node.mgr.transaction;
...
public Integer queryCountOfTranByMinus(int groupId)
throws NodeMgrException {
...
try{
...
// getCount(String tableName,TransParam transParam);
Integer count = transHashMapper.getCountByMinMax(tableName);
...
}
...
}
v1.2.1¶
兼容性说明:增加邮件告警功能
- 数据表修改:增加了
tb_mail_server_config
邮箱服务器配置表(邮箱服务配置),tb_alert_rule
告警规则表(告警类型配置),tb_alert_log
告警日志表,可通过项目中scripts/webase-ddl.sql
进行数据表初始化; - 初始化数据修改:邮件告警功能的默认数据需要通过项目中
scripts/webase-dml.sql
的6, 7项进行数据初始化;
操作说明:
登陆mysql后,进入到相应database中,以webasenodemanager
的database为例;
mysql -uroot -p123456
// mysql 命令行
mysql> use webasenodemanager;
可以参考WeBASE-Node-Manager v1.2.1源码中的webase-ddl.sql与webase-dml.sql
- 执行
tb_alert_rule
,tb_mail_server_config
,tb_alert_log
,建表操作
// tb_alert_rule表
mysql> CREATE TABLE IF NOT EXISTS tb_alert_rule (
rule_id int(11) NOT NULL AUTO_INCREMENT COMMENT '告警规则的ID',
rule_name varchar(50) NOT NULL COMMENT '告警规则的命名',
enable tinyint(4) DEFAULT 0 NOT NULL COMMENT '是否启用规则, 0:false, 1:true',
alert_type tinyint(4) NOT NULL COMMENT '告警规则的类型, 1-节点, 2-审计, 3-证书',
alert_level tinyint(4) NOT NULL COMMENT '告警规则的级别, 1-高, 2-中, 3-低',
alert_interval_seconds bigint NOT NULL COMMENT '告警规则的间隔时间(s)',
alert_content text NOT NULL COMMENT '告警邮件的内容',
content_param_list text NOT NULL COMMENT '告警邮件内容中的可替代参数,如nodeId',
description varchar(50) DEFAULT NULL COMMENT '告警规则的描述',
is_all_user tinyint(4) DEFAULT 0 COMMENT '是否选中所有用户, 0:false, 1:true',
user_list text DEFAULT NULL COMMENT '告警规则作用的用户列表',
create_time datetime DEFAULT NULL COMMENT '告警规则的创建时间',
modify_time datetime DEFAULT NULL COMMENT '告警规则的修改时间',
less_than varchar(40) DEFAULT NULL COMMENT '告警规则:小于某个值',
less_and_equal varchar(40) DEFAULT NULL COMMENT '告警规则:小于等于某个值',
larger_than varchar(40) DEFAULT NULL COMMENT '告警规则:大于某个值',
larger_and_equal varchar(40) DEFAULT NULL COMMENT '告警规则:大于等于某个值',
equal varchar(40) DEFAULT NULL COMMENT '告警规则:等于某个值',
last_alert_time datetime DEFAULT NULL COMMENT '上次告警的时间,与Interval间隔共同作用',
PRIMARY KEY (rule_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='告警规则表';
// tb_mail_server_config表
mysql> CREATE TABLE IF NOT EXISTS tb_mail_server_config (
server_id int(11) NOT NULL AUTO_INCREMENT COMMENT '邮件服务器配置的ID',
server_name varchar(40) NOT NULL COMMENT '邮件服务器配置的命名',
host varchar(30) NOT NULL COMMENT '邮件服务器的主机',
port int(10) DEFAULT '25' NOT NULL COMMENT '邮件服务器的端口',
username varchar(40) NOT NULL COMMENT '邮件服务器的邮箱地址',
password varchar(40) NOT NULL COMMENT '邮件服务器的邮箱授权码',
protocol varchar(10) NOT NULL COMMENT '邮件服务器的协议',
default_encoding varchar(10) DEFAULT 'UTF-8' NOT NULL COMMENT '邮件服务器的默认编码(UTF-8)',
create_time datetime DEFAULT NULL COMMENT '邮件服务器配置的创建时间',
modify_time datetime DEFAULT NULL COMMENT '邮件服务器配置的修改时间',
authentication tinyint(4) DEFAULT 1 NOT NULL COMMENT '是否开启验证, 0:false, 1:true',
starttls_enable tinyint(4) DEFAULT 1 NOT NULL COMMENT '如支持,是否优先选用STARTTLS, 0:false, 1:true',
starttls_required tinyint(4) DEFAULT 0 COMMENT '是否必须使用STARTTLS, 0:false, 1:true',
socket_factory_port int(10) DEFAULT 465 COMMENT 'SSL的端口',
socket_factory_class varchar(150) DEFAULT 'javax.net.ssl.SSLSocketFactory' COMMENT 'SSL选用的JAVA类',
socket_factory_fallback tinyint(4) DEFAULT 0 COMMENT '是否启用SSL的fallback, 0:false, 1:true',
enable tinyint(4) DEFAULT 0 NOT NULL COMMENT '邮件服务器是否已配置完成,0初始,1完成',
connection_timeout int(10) DEFAULT 5000 NOT NULL COMMENT '邮件服务器的连接超时值',
timeout int(10) DEFAULT 5000 NOT NULL COMMENT '邮件服务器的通用超时值',
write_timeout int(10) DEFAULT 5000 NOT NULL COMMENT '邮件服务器的写超时值',
PRIMARY KEY (server_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='邮件服务器配置表';
// tb_alert_log表
mysql> CREATE TABLE IF NOT EXISTS tb_alert_log (
log_id int(11) NOT NULL AUTO_INCREMENT COMMENT '告警日志的编号',
alert_type tinyint(4) NOT NULL COMMENT '告警日志的类型, 1-节点, 2-审计, 3-证书',
alert_level tinyint(4) NOT NULL COMMENT '告警日志的告警等级:1-high, 2-middle, 3-low',
alert_content text NOT NULL COMMENT '告警日志的内容',
description text DEFAULT NULL COMMENT '告警日志的描述',
status tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警日志的状态:0-未处理,1-已处理',
create_time datetime DEFAULT NULL COMMENT '告警日志的创建时间',
modify_time datetime DEFAULT NULL COMMENT '告警日志的修改时间',
PRIMARY KEY (log_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='告警日志表';
- mysql下执行插入,初始化默认数据:
---- add node status alert rule template
INSERT INTO `tb_alert_rule`(`rule_name`,`enable`,`alert_type`,`alert_level`,`alert_interval_seconds`,`alert_content`,`content_param_list`,`create_time`,`modify_time`) VALUES ('节点异常告警', 0, 1, 1, 3600, '{nodeId}节点异常,请到“节点管理”页面查看具体信息', '[\"{nodeId}\"]', '2019-10-29 20:02:30', '2019-10-29 20:02:30');
---- add audit alert rule template
INSERT INTO `tb_alert_rule`(`rule_name`,`enable`,`alert_type`,`alert_level`,`alert_interval_seconds`,`alert_content`,`content_param_list`,`create_time`,`modify_time`) VALUES ('审计异常', 0, 2, 1, 3600, '审计异常:{auditType},请到“交易审计”页面查看具体信息', '[\"{auditType}\"]', '2019-10-29 20:02:30', '2019-10-29 20:02:30');
-- add cert alert rule template
INSERT INTO `tb_alert_rule`(`rule_name`,`enable`,`alert_type`,`alert_level`,`alert_interval_seconds`,`alert_content`,`content_param_list`,`create_time`,`modify_time`) VALUES ('证书有效期告警', 0, 3, 1, 3600, '证书将在{time}过期,请到“证书管理”页面查看具体信息', '[\"{time}\"]', '2019-10-29 20:02:30', '2019-10-29 20:02:30');
-- add mail_server_config template
INSERT INTO `tb_mail_server_config`(`server_name`,`host`,`port`,`username`,`password`,`protocol`,`default_encoding`,`create_time`,`modify_time`,`authentication`,`starttls_enable`,`starttls_required`,`socket_factory_port`,`socket_factory_class`,`socket_factory_fallback`,`enable`) VALUES ('Default config', 'smtp.qq.com', '25', 'yourmail@qq.com', 'yourpassword','smtp', 'UTF-8','2019-10-29 20:02:30', '2019-10-29 20:02:30', 1, 1, 0, 465, 'javax.net.ssl.SSLSocketFactory', 0, 0);
v1.2.0¶
兼容性说明:增加证书管理功能
- 数据表修改:增加证书管理功能:增加了
tb_cert
数据表,可通过项目中scripts/webase-ddl.sql
进行数据表初始化;; - 数据表修改:数据表
tb_method
增加contract_type字段
,用于判断合约方法method为普通合约或系统合约(precompiled),同时添加了所有系统合约的method_id;可结合项目中scripts/webase-dml.sql
第5项进行数据更新;
操作说明:
登陆mysql后,进入到相应database中,以webasenodemanager
的database为例;
mysql -uroot -p123456
// mysql 命令行
mysql> use webasenodemanager;
- 执行
tb_cert
建表操作,
mysql> CREATE TABLE IF NOT EXISTS tb_cert (
finger_print varchar(120) NOT NULL COMMENT '证书的指纹(唯一标记)',
cert_name varchar(60) NOT NULL COMMENT '证书id',
content text NOT NULL COMMENT 'cert(crt证书)的内容',
cert_type varchar(20) NOT NULL COMMENT '证书类型',
public_key varchar(150) DEFAULT NULL COMMENT '节点证书的公钥/编号(nodeid)',
address varchar(50) DEFAULT NULL COMMENT '节点证书的节点地址',
father varchar(120) NOT NULL COMMENT '父证书对应地址(fingerprint)',
validity_from datetime NOT NULL COMMENT '有效期开始',
validity_to datetime NOT NULL COMMENT '有效期截止',
modify_time datetime DEFAULT NULL COMMENT '修改时间',
create_time datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (finger_print)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='证书信息表';
- 在表
tb_method
增加contract_type
列
mysql> alter table tb_method add column contract_type tinyint(4) DEFAULT '0' COMMENT '合约类型(0-普通合约,1-系统合约)';
- 在表
tb_method
插入系统合约的默认数据
可以参考WeBASE-Node-Manager v1.2.0源码中的webase-dml.sql
-- (system config info 0x1000) setValueByKey
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0xbd291aef', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"setValueByKey\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
-- (table factory 0x1001) createTable
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x56004b6a', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"tableName\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"valueField\",\"type\":\"string\"}],\"name\":\"createTable\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
-- (crud info 0x1002) update select remove insert(same as cns's insert)
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x2dca76c1', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"tableName\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"entry\",\"type\":\"string\"},{\"name\":\"condition\",\"type\":\"string\"},{\"name\":\"optional\",\"type\":\"string\"}],\"name\":\"update\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x983c6c4f', 0, '{\"constant\":true,\"inputs\":[{\"name\":\"tableName\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"condition\",\"type\":\"string\"},{\"name\":\"optional\",\"type\":\"string\"}],\"name\":\"select\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0xa72a1e65', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"tableName\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"condition\",\"type\":\"string\"},{\"name\":\"optional\",\"type\":\"string\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0xa216464b', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"addr\",\"type\":\"string\"},{\"name\":\"abi\",\"type\":\"string\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-06-17 20:32:30', '2019-06-17 20:32:30');
-- (consensus info node manage 0x1003) addObserver addSealer remove
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x2800efc0', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"nodeID\",\"type\":\"string\"}],\"name\":\"addObserver\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x89152d1f', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"nodeID\",\"type\":\"string\"}],\"name\":\"addSealer\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x80599e4b', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"nodeID\",\"type\":\"string\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
-- (cns info 0x1004) selectByName selectByNameAndVersion // insert(ignored, same as crud's insert method: insert(string,string,string,string)
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x819a3d62', 0, '{\"constant\":true,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"}],\"name\":\"selectByName\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}', 'function', 1, '2019-06-17 20:32:30', '2019-06-17 20:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x897f0251', 0, '{\"constant\":true,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"}],\"name\":\"selectByNameAndVersion\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}', 'function', 1, '2019-06-17 20:32:30', '2019-06-17 20:32:30');
-- INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0xa216464b', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"addr\",\"type\":\"string\"},{\"name\":\"abi\",\"type\":\"string\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-06-17 20:32:30', '2019-06-17 20:32:30');
-- (permission manage 0x1005) insert queryByName remove
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x06e63ff8', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"table_name\",\"type\":\"string\"},{\"name\":\"addr\",\"type\":\"string\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x20586031', 0, '{\"constant\":true,\"inputs\":[{\"name\":\"table_name\",\"type\":\"string\"}],\"name\":\"queryByName\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
INSERT INTO `tb_method`(`method_id`, `group_id`, `abi_info`, `method_type`, `contract_type`, `create_time`, `modify_time`) VALUES ('0x44590a7e', 0, '{\"constant\":false,\"inputs\":[{\"name\":\"table_name\",\"type\":\"string\"},{\"name\":\"addr\",\"type\":\"string\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}', 'function', 1, '2019-09-02 16:32:30', '2019-09-02 16:32:30');
如果结果为以下则代表插入成功:
// 插入成功
Query OK, 1 row affected (0.01 sec)
// 数据已存在
ERROR 1062 (23000): Duplicate entry '0x20586031-0' for key 'PRIMARY'
附录¶
1. 安装问题¶
1.1 Java部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
2. 常见问题及方案¶
一般问题¶
- 问:执行shell脚本报下面错误:
[app@VM_96_107_centos deployInputParam]$ bash start.sh
start.sh: line 2: $'\r': command not found
start.sh: line 8: $'\r': command not found
start.sh: line 9: $'\r': command not found
start.sh: line 10: $'\r': command not found
答:这是编码问题,在脚本的目录下执行转码命令:
dos2unix *.sh
数据库问题¶
- 问:服务访问数据库抛出异常:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
答:检查数据库的网络策略是否开通
下面以centos7为例:
查看防火墙是否开放3306端口: firewall-cmd --query-port=3306/tcp
防火墙永久开放3306端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新启动防火墙:firewall-cmd --reload
- 问:执行数据库初始化脚本抛出异常:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (110)
答:MySQL没有开通该帐号的远程访问权限,登录MySQL,执行如下命令,其中TestUser改为你的帐号
GRANT ALL PRIVILEGES ON *.* TO 'TestUser'@'%' IDENTIFIED BY '此处为TestUser的密码’' WITH GRANT OPTION;
WeBASE-Node-Manager服务搭建问题¶
- 问:执行构建命令
gradle build -x test
抛出异常:
A problem occurred evaluating root project 'WeBASE-Node-Manager'.
Could not find method compileOnly() for arguments [[org.projectlombok:lombok:1.18.2]] on root project 'WeBASE-Node-Manager'.
答:
方法1、已安装的Gradle版本过低,升级Gradle版本到4.10以上即可。
方法2、直接使用命令:./gradlew build -x test
,如果提示gradlew为非可执行文件,执行chmod +x ./gradlew
再次执行build操作即可。
启动问题¶
- 问:启动Node-Manager进程后,后台日志显示
not found any front
:
答:此处为正常提示,表示后台没有可访问的节点前置。通过WeBASE-Web连接Node-Manager后台服务后,添加节点前置即可。
节点管理服务忘记密码¶
登录到WeBASE-Node-Manager中配置的Mysql数据库(默认为webasenodemanager)后,在tb_account_info
中插入一条新的管理员账号test
,密码Abcd1234
INSERT INTO tb_account_info (account,account_pwd,role_id,create_time,modify_time)values('test', '$2a$10$F/aEB1iEx/FvVh0fMn6L/uyy.PkpTy8Kd9EdbqLGo7Bw7eCivpq.m',100000,now(),now());
3. 配置文件解析¶
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5001 | 当前服务端口 |
server.servlet.context-path | /WeBASE-Node-Manager | 当前服务访问目录 |
mybatis.typeAliasesPackage | com.webank.webase.node.mgr | mapper类扫描路径 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasenodemanager | mysql连接地址 |
spring.datasource.username | defaultAccount | mysql账号 |
spring.datasource.password | defaultPassword | mysql密码 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目录 |
logging.level | com.webank.webase.node.mgr: info | 日志扫描目录和级别 |
constant.isDeleteInfo | true | 是否定时删除数据(区块、交易hash、审计数据);true-是,false-否 |
constant.transRetainMax | 10000 | 表中交易hash保留的条数(开启constant.isDeleteInfo时有效) |
constant.deleteInfoCron | "0 0/1 * * * ?" | 定时删除数据的频率,默认一分钟 |
constant.statisticsTransDailyCron | "0 0/1 * * * ?" | 统计交易记录的执行频率,默认一分钟 |
constant.resetGroupListCycle | 600000 | 刷新群组列表任务执行完后,下一个开始间隔(毫秒) |
constant.groupInvalidGrayscaleValue | 1M | 群组失效灰度期长度,灰度期过后,如果还没查到失效状态的群组,就删除(y:年, M:月, d:天, h:小时, m:分钟, n:永远有效) |
constant.notSupportFrontIp | localhost | 不支持的前置ip |
constant.isBlockPullFromZero | false | 是否从0开始同步区块信息(true-是,false-最新块开始同步) |
constant.pullBlockInitCnts | 1000 | 最新块的前1000个块之后开始同步(constant.isBlockPullFromZero=false时有效) |
constant.pullBlockSleepTime | 200 | 拉完一个区块,睡眠时间(毫秒) |
constant.pullBlockTaskFixedDelay | 30000 | 拉区块任务执行完后,间隔多久开始下一次(毫秒) |
constant.blockRetainMax | 10000 | 表中区块保留的条数(开启constant.isDeleteInfo时有效) |
constant.verificationCodeMaxAge | 300 | y验证码有效时长(秒) |
constant.authTokenMaxAge | 1800 | 登录token有效时长(秒) |
constant.isUseSecurity | true | 是否启用登录鉴权 |
constant.aesKey | ERTadb83f9ege39k | aes加密key(16位),建议更改 |
constant.jwtSecret | S3g4HtJyg7G6Hg0Ln3g4H5Jyg7H6f9dL | jwt生成时用到的key,建议更改 |
constant.frontUrl | http://%1s:%2d/WeBASE-Front/%3s | 前置服务的请求路径 |
constant.httpTimeOut | 5000 | http请求超时时间(毫秒) |
constant.contractDeployTimeOut | 30000 | 合约部署超时时间(毫秒) |
constant.isPrivateKeyEncrypt | true | 前置私钥接口返回的私钥是否需要加密,true-加密,false-不加密 |
constant.maxRequestFail | 3 | 请求前置(frot)被允许失败次数,达到配置值后,将会停止往该路径发送请求 |
constant.sleepWhenHttpMaxFail | 60000 | 请求失败次数过多,熔断时间长度(毫秒) |
constant.transMonitorTaskFixedRate | 60000 | 交易审计开始执行后,下一个任务开始时间(毫秒) |
constant.analysisSleepTime | 200 | 审计完一条交易hash后,睡眠时间(毫秒) |
constant.monitorInfoRetainMax | 10000 | 表中审计数据保留的条数(开启constant.isDeleteInfo时有效) |
constant.isMonitorIgnoreUser | false | 审计逻辑是否忽略私钥用户 |
constant.isMonitorIgnoreContract | false | 审计逻辑是否忽略合约 |
constant.monitorUnusualMaxCount | 20 | 审计异常数据被允许最大值,到达后会停止审计 |
constant.auditMonitorTaskFixedDelay | 300000 | 监控审计数据任务的运行间隔时间,异常时将发送告警邮件(毫秒)(注:此处为检查频率,告警配置中是告警频率) |
constant.nodeStatusMonitorTaskFixedDelay | 60000 | 监控节点状态任务的运行间隔时间,异常时将发送告警邮件(毫秒)(注:此处为检查频率,告警配置中是告警频率) |
constant.certMonitorTaskFixedDelay | 300000 | 监控证书任务的运行间隔时间,有效期结束7天前时将发送告警邮件(毫秒) (注:此处为检查频率,告警配置中是告警频率) |
constant.deployType | 0 | 部署方式选择:0-手动添加前置,1-可视化部署 |
constant.dockerRepository | fiscoorg/fisco-webase | 镜像名 |
constant.webaseSignAddress | 127.0.0.1:5004 | WeBASE-Sign 访问地址(不能是localhost) |
constant.dockerRestartPeriodTime | 30000 | 单位ms,节点Docker容器重启的超时时间,默认30秒 |
constant.execScpTimeout | 10000 | 单位ms,主机间SCP的超时时间(网络差时需要适当调大) |
constant.execAddNodeTimeout | 40000 | 单位ms,添加节点的超时时间 |
constant.execDockerCheckTimeout | 55000 | 单位ms,执行docker检测的超时时间 |
constant.execHostCheckTimeout | 55000 | 单位ms,执行主机检测的超时时间 |
constant.execHostCheckPortTimeout | 50000 | 单位ms,执行主机端口检测的超时时间 |
constant.execHostInitTimeout | 300000 | 单位ms,执行主机初始化的超时时间,默认5min(需要下载镜像包,网速慢需要适当调大) |
constant.execHostConfigTimeout | 40000 | 单位ms,配置主机的链节点超时时间 |
constant.execBuildChainTimeout | 40000 | 单位ms,执行建链脚本/生成节点证书脚本的超时时间 |
constant.execShellTimeout | 600000 | 单位ms,执行脚本的超时实际,默认10min |
constant.developerModeEnable | false | 是否启用开发者模式(管理员、用户并增加开发者角色) |
constant.deployedModifyEnable | true | 是否允许重复部署合约 |
constant.enableVerificationCode | true | 验证码是否启用随机 |
constant.verificationCodeValue | "8888" | 当不启用验证码的随机时,设置固定验证码(方便联调) |
constant.ignoreCheckFront | /account/login,/account/pictureCheckCode,/login,/user/privateKey/*,/config/encrypt,/config/version,/front/refresh,/api/ | 直接访问前置的URI |
constant.resetGroupListInterval | 15000 | 异步刷新所有群组连接的间隔,默认15s |
constant.appRequestTimeOut | 300000 | 接入应用的请求间隔(ms) |
constant.appStatusCheckCycle | 3000 | 接入应用的状态检查频率(ms) |
constant.statBlockRetainMax | 100000 | 区块监控数据的最大存储量 |
constant.statBlockFixedDelay | 5000 | 区块监控数据的频率(ms) |
constant.statBlockPageSize | 10 | 区块监控数据拉取的单次请求量 |
constant.enableExternalFromBlock | true | 是否启用全量用户与全量合约采集 |
sdk.encryptType | 0 | sdk的加密类型,0:标准,1:国密;需要与链和Front的类型一致 |
executor | 异步拉取区块、刷新群组状态、监控群组数据的线程池配置 | |
executor.corePoolSize | 3 | 异步任务的核心线程数 |
executor.maxPoolSize | 10 | 异步任务的最大线程数 |
executor.queueSize | 50 | 异步任务的队列容量 |
executor.threadNamePrefix | node-mgr-async- | 异步拉取区块、刷新群组状态、监控群组数据的线程名字前缀 |
scheduler | 拉取区块、刷新群组状态、监控群组数据、交易解析、定时删除区块等定时任务的线程池配置 | |
scheduler.poolSize | 50 | 定时任务的线程池大小 |
scheduler.threadNamePrefix | node-mgr-task- | 定时任务的线程名字前缀 |
scheduler.awaitTerminationSeconds | 600 | 定时任务的线程等待超时时长(秒) |
scheduler.waitForTasksToCompleteOnShutdown | true | 定时任务完成后再停止线程 |
WeBASE管理平台¶
概要介绍¶
功能说明¶
本项目是区块链中间件平台WeBASE管理平台,使用框架vue-cli
。
支持FISCO-BCOS 2.0以上版本,支持群组和群组切换。具体功能有:
- 区块链数据概览,可以查看区块链的节点、区块、交易、合约信息。点击左上角交易信息和区块信息界面,可以跳转到区块或交易信息列表页,交易信息支持input解码和event解码。
- 节点管理,可以查看前置列表、节点列表、修改节点共识状态。可以查看链上的所有群组和节点,查看前置所在服务器状态相关信息,管理节点的共识状态。
- 合约管理,提供图形化合约IDE、查询已部署合约列表、合约CNS查询以及预编译合约的CRUD功能。编译、部署合约后该合约会被保存。
- 私钥管理,管理所有可以发交易的帐号,公钥用户是其他机构的帐号,无法在本机构发交易,可以通过手动绑定和自动同步获取。私钥用户为本机构发交易的用户。
- 系统管理,提供权限管理、系统配置管理、证书管理的功能。权限管理可以控制私钥用户的权限范围,证书管理可以查看链的相关证书。
- 系统监控,系统监控包含了节点监控、主机监控与异常告警。监控整条链所有机构所有用户发送交易行为,查看是否有异常用户和异常合约,并在异常状态下通过告警邮件通知运维管理员。
- 交易审计,主要监控整条链所有机构所有用户发送交易行为,查看是否有异常用户和异常合约。
- 订阅事件,查看前置已订阅的链上事件通知信息列表。
- 帐号管理,只有admin帐号才能查看此功能,可以新增帐号(登录此系统帐号)、修改密码、修改账户邮箱等等。
- 群组管理,动态管理群组,可以创建新群组、将节点加入已有群组、删除群组数据等
国密支持¶
WeBASE-Web v1.2.2+已支持国密功能,使用WeBASE-Node-Manager v1.2.2,使用WeBASE-Front v1.2.2及以上版本
WeBASE-Web将根据WeBASE-Node-Manager的版本,自动在国密与非国密之间切换,合约编译、合约部署、调用合约、发送交易等功能均已支持国密。
solidity v0.5.1和v0.6.10支持¶
WeBASE-Web v1.4.2+已支持solidity v0.5.1
和v0.6.10
,可在合约IDE中的左上角进行版本切换
部署说明¶
2. 拉取代码¶
代码可以放在/data下面,执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Web.git
# 若网络问题导致长时间无法下载,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Web.git
进入目录:
cd WeBASE-Web
2.1 下载solc-bin¶
执行脚本get_solc_js.sh会自动下载solc-bin,即下面v0.4.25.js等文件。
在WeBASE-Web/
目录中直接执行脚本get_solc_js.sh((脚本与dist
文件夹同级))
bash ./get_solc_js.sh
等待脚本执行完成
- 如果执行不成功,请使用下面的命令:
注意:当且仅当get_solc_js.sh脚本执行失败才需要执行下面的命令
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.4.25.js -o ./dist/static/js/v0.4.25.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.4.24-gm.js -o ./dist/static/js/v0.4.24-gm.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.5.1.js -o ./dist/static/js/v0.5.1.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.5.1-gm.js -o ./dist/static/js/v0.5.1-gm.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.6.10.js -o ./dist/static/js/v0.6.10.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.6.10-gm.js -o ./dist/static/js/v0.6.10-gm.js
执行完后检查dist/static/js是否下载完这些js文件。
3. 拉取移动端代码¶
WeBASE新增了h5的移动端页面,支持手机浏览器访问 代码和WeBASE-Web放在同一个目录 拉取代码
git clone https://github.com/WeBankFinTech/WeBASE-Web-Mobile.git
# 若网络问题导致长时间无法下载,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Web-Mobile.git
4. 修改配置¶
在docs目录下有配置文件nginx.conf,修改完后替换安装的nginx的配置文件nginx.conf(这里nginx安装配置文件在/usr/local/nginx/conf下面,如果这里没找到,可以到/etc下寻找,如有权限问题,请加上sudo)。
- 修改配置:
# 修改服务器ip,也可以使用域名
sed -i "s%127.0.0.1%${your_ip}%g" docs/nginx.conf
# 修改WeBASE-Web服务端口(端口需要开通策略且不能被占用)
sed -i "s%5000%${your_port}%g" docs/nginx.conf
# 修改静态文件路径(文件需要有权限访问)
sed -i "s%/data/WeBASE-Web/dist%${your_file_dir}%g" docs/nginx.conf
# 节点管理服务ip和端口
sed -i "s%10.0.0.1:5001%${your_node_manager}%g" docs/nginx.conf
- 复制配置文件nginx.conf
cp -rf docs/nginx.conf /usr/local/nginx/conf
备注: 如果服务器已有nginx,可在原配置文件nginx.conf增加一个server:
upstream node_mgr_server{
server 10.0.0.1:5001; # 节点管理服务ip和端口
}
server {
listen 5000 default_server; # 前端端口(端口需要开通策略且不能被占用)
server_name 127.0.0.1; # 服务器ip,也可配置为域名
location / {
root /data/WeBASE-Web/dist; # 前端文件路径(文件需要有权限访问)
# 下面是移动端nginx配置
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
{
root /data/WeBASE-Web-Mobile/dist;
}
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
include /etc/nginx/default.d/*.conf;
location /mgr {
proxy_pass http://node_mgr_server/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
5. 启动nginx¶
启动命令:
/usr/local/nginx/sbin/nginx # nginx在/usr/local目录下
检查nginx是否启动:
ps -ef | grep nginx
6. 访问页面¶
http://{deployIP}:{webPort}
示例:http://127.0.0.1:5000
备注:
- 部署服务器IP和管理平台服务端口需对应修改,网络策略需开通
- 默认账号密码:admin/Abcd1234
- WeBASE管理平台使用说明请查看使用手册
7. 查看日志¶
进程日志:tail -f logs/access.log
错误日志:tail -f logs/eror.log
升级说明¶
WeBASE-Web升级说明,请结合WeBASE-Web Changelog和WeBASE管理平台使用手册进行阅读。
WeBASE-Web升级的必须步骤: 0. 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 采用新的安装包,替换旧的
webase-web
目录,无需重启nginx
各个版本的具体修改可参考下文
v1.5.0¶
- 新增应用管理,支持WeIdentity模板和自定义应用接入
- 新增节点监控的链上TPS、出块周期、块大小的统计
- 新增合约列表中的已登记合约与链上全量合约视图、新增私钥用户列表中的已登记私钥与链上全量私钥视图
- 支持导出Txt/Pem/P12/WeID私钥文件、支持导出前置的SDK证书
- 新增适配移动端的WeBASE管理台
其中移动端管理台需要启用新的nginx.conf,新增了移动端自动重路由、移除auto-index、增加gzip压缩
- 需要将已有的webase-node-mgr的ip port及webase-web的port配置到新的nginx.conf文件中,使用nginx重载配置文件
新增内容如下
- 需要启用移动端时,则需要下载移动端的webase-web-mobile.zip安装包并解压,即
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/webase-web-mobile.zip
,并解压unzip webase-web-mobile.zip
- 在nginx.conf中的
location /
中的phone_page_url
替换为webase-web-mobile
解压后的路径(已有的root web_page_url
无需修改) - 最后使用
nginx -s reload
重载新的nginx配置文件
location / {
# default pc page url
root web_page_url;
# if using phone
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
{
root phone_page_url;
}
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
- 需要启用gzip时,在nginx.conf中的
server
中添加以下内容
server {
...
# zip solidity js file
gzip on;
gzip_min_length 10k;
gzip_buffers 32 4k;
gzip_http_version 1.0;
gzip_comp_level 1;
gzip_proxied any;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
}
v1.4.1¶
新增FISCO BCOS v2.5.0及以上版本的基于角色的权限管理功能,新增了开发者模式
- 新的权限管理基于角色,可参考FISCO BCOS权限控制文档
- 开发者模式:新增了用户角色developer,可进行查询交易,合约部署调用等功能,无法使用管理员的系统管理与监控等功能。
v1.4.0¶
v1.4.0 主要在兼容原有手动部署底层服务,手动添加 WeBASE-Front 前置服务的基础上,新增了可视化部署底层服务,以及节点的动态管理功能。
- 增加左下展示版本号,包括链版本和兼容版本。如果是国密版本,链版本号会带有
gm
后缀,兼容版本仅代表兼容的节点版本,不带有gm
后缀。
提示
- 如果要体验可视化部署,请参考可视化部署部署新环境然后部署新链;
v1.3.1¶
v1.3.1主要新增了动态群组管理、合约ABI导入、合约ABI编码器、支持导入私钥等功能,详情升级说明如下:
- 新增动态群组管理,包含生成群组、启动/停止群组、删除/恢复群组、查询节点群组状态等功能,操作说明可参考动态群组管理使用指南
- 新增导入已部署合约ABI功能,支持导入已部署合约,进行合约调用
- 新增合约Abi编码器,可通过ABI构建交易参数
- 新增导入.p12/.pem/.txt私钥功能;其中.txt与节点前置导出私钥格式一致,.p12/.pem与控制台导出私钥格式一致;
附录¶
1 安装nginx¶
1.1 下载nginx依赖¶
在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。如果没有,请执行命令
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
执行命令时注意权限问题,如遇到,请加上sudo
1.2 下载nginx¶
nginx下载地址:https://nginx.org/download/(下载最新稳定版本即可) 或者使用命令:
wget http://nginx.org/download/nginx-1.9.9.tar.gz (版本号可换)
将下载的包移动到/usr/local/下
1.3 安装nginx¶
1.3.1 解压¶
tar -zxvf nginx-1.9.9.tar.gz
1.3.2 进入nginx目录¶
cd nginx-1.9.9
1.3.3 配置¶
./configure --prefix=/usr/local/nginx
1.3.4 make¶
make
make install
1.3.5 测试是否安装成功¶
使用命令:
/usr/local/nginx/sbin/nginx –t
正常情况的信息输出:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
1.3.6 nginx几个常见命令¶
/usr/local/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/nginx/sbin/nginx -s stop # 停止 Nginx
ps -ef | grep nginx # 查看nginx进程
2 常见问题¶
2.1 出现“登录错误”怎么排查问题¶
登录时出现“登录错误”,请一一排查:
- WeBASE-Node-Manager服务是否启动成功,
- WeBASE-Node-Manager的数据库是否正常,
- nginx代理是否存在错误。
2.2 登录页面的验证码加载不出来¶
进入
webase-node-mgr
目录下,执行bash status.sh
检查服务是否启动,如果服务没有启动,运行bash start.sh
启动服务;如果服务已经启动,按照如下修改日志级别
webase-node-mgr/conf/application.yml
#log config logging: level: com.webank.webase.node.mgr: debug
webase-node-mgr/conf/log/log4j2.xml
<Loggers> <Root level="debug"> <AppenderRef ref="asyncInfo"/> <AppenderRef ref="asyncErrorLog"/> </Root> </Loggers>
重启服务
bash stop.sh && bash start.sh
重启服务后,检查日志文件
log/WeBASE-Node-Manager.log
。- 检查是否有异常信息。如果有异常信息,根据具体的异常信息检查环境配置,或者通过搜索引擎进行排查。
2.3 为什么输入正确的验证码显示验证码错误¶
登录验证码有效时间为五分钟,五分钟后验证码失效,登录会出现“验证码错误” 。
2.4 交易解码解不出来¶
将该交易所属的合约上传到合约管理,并编译一次,下一笔调用合约的交易触发后即可成功解码。
2.5 交易审计异常交易和异常合约怎么消除¶
- 将发送交易的账户在私钥管理中添加成公钥用户,那么该用户所发的交易将审计成正常交易;
- 将部署该合约的账户在私钥管理中添加成公钥用户,那么该用户所部署的合约将审计成正常合约。
交易服务¶
概要介绍¶
功能介绍¶
本系统为交易上链代理子系统。主要接收无状态交易请求,缓存到数据库中,再异步上链。本系统可大幅提升吞吐量,解决区块链的tps瓶颈。
架构图
主要功能:合约编译;交易请求处理,交易分为合约部署和普通的合约调用请求。
合约编译:上传合约文件zip压缩包(压缩包里的每个合约的文件名要和合约名一致,合约引用需使用“./xxx.sol”),返回合约编译信息。
合约部署:交易服务子系统会将合约部署请求信息缓存到数据库,通过轮询服务向节点发送交易请求,确保合约成功部署。
合约调用:分为无状态交易上链(非constant方法)和交易结果查询(constant方法)。 无状态交易上链是交易服务子系统会将交易请求信息缓存到数据库,通过轮询服务向节点发送交易请求,确保交易成功上链。 交易结果查询是交易服务子系统会同步向节点发送交易请求,返回结果。
交易上链数据签名支持以下三种模式:
- 本地配置私钥签名
- 本地随机私钥签名
- 调用WeBASE-Sign进行签名
本工程支持单机部署,也支持分布式任务多活部署(使用分布式任务的话需部署Zookeeper)。
国密支持¶
WeBASE-Transaction v1.2.2+已支持 国密版FISCO-BCOS,使用WeBASE v1.2.2及以上版本
具体需要适配国密版FISCO-BCOS的地方有:
- 开启web3sdk的国密开关:修改
application.properties
中的encryptType
改为1
; - 合约编译支持国密版:
- WeBASE-Transaction编译国密版智能合约,v1.3.1+版本已支持自动切换国密版soclJ jar包;
安装详情可查看下一章节的WeBASE-Transaction部署说明
部署说明¶
1. 前提条件¶
环境 | 版本 |
---|---|
Java | JDK8或以上版本 |
数据库 | MySQL-5.6或以上版本 |
ZooKeeper | ZooKeeper-3.6.0或以上版本 |
备注:
- Java推荐使用OpenJDK,建议从OpenJDK网站 自行下载(CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK无法正常连接区块链节点)
- 安装说明请参看 安装示例,不使用分布式任务可以不部署ZooKeeper。
国密支持:
WeBASE-Transaction v1.2.2+已支持 国密版FISCO-BCOS
开启web3sdk的国密开关:
- 开启web3sdk的国密开关:将配置文件
application.properties
中sdk配置的encryptType
从0
修改为1
; - 编译国密版智能合约在v1.3.1版本后,通过引入solcJ:0.4.25-rc1.jar,自动切换支持国密版智能合约的编译/部署/调用;(可自行切换solcJ-0.5.2)
2. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Transaction.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Transaction.git
进入目录:
cd WeBASE-Transaction
3. 编译代码¶
使用以下方式编译构建,如果出现问题可以查看 常见问题解答 方式一:如果服务器已安装Gradle,且版本为gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Transaction下生成已编译的代码目录dist。
4. 修改配置¶
4.1 复制模板¶
进入编译目录dist:
cd dist
dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
4.2 复制证书¶
进入配置目录conf:
cd conf
将节点所在目录nodes/${ip}/sdk
下的所有文件拷贝到当前conf目录(包括ca.crt, sdk.crt, sdk.key, node.crt, node.key和gm文件夹),供SDK与节点建立连接时使用。
4.3 修改配置¶
说明: 有注释的地方根据实际情况修改,完整配置项说明请查看 配置说明
vi application.properties
################################### Basic Configuration ###################################
# 工程服务端口,端口被占用则修改
server.port=5003
server.context-path=/WeBASE-Transaction
mybatis.mapper-locations=classpath:mapper/*.xml
logging.config=classpath:log4j2.xml
################################### web3sdk Configuration ###################################
# 机构名
sdk.orgName=webank
sdk.timeoutsdk=10000
# 线程池配置
sdk.corePoolSize=100
sdk.maxPoolSize=500
sdk.queueCapacity=500
sdk.keepAlive=60
# 群组信息,可配置多群组和多节点
# 群组id(下同)
sdk.groupConfig.allChannelConnections[0].groupId=1
# 连接节点的ip和channelPort(下同)
sdk.groupConfig.allChannelConnections[0].connectionsStr[0]=127.0.0.1:20200
sdk.groupConfig.allChannelConnections[0].connectionsStr[1]=127.0.0.1:20201
sdk.groupConfig.allChannelConnections[1].groupId=2
sdk.groupConfig.allChannelConnections[1].connectionsStr[0]=127.0.0.1:20200
sdk.groupConfig.allChannelConnections[1].connectionsStr[1]=127.0.0.1:20201
# 切换国密与非国密 0: standard, 1: guomi
sdk.encryptType=0
################################### constant Configuration ###################################
# WeBASE-Sign签名服务ip端口,使用本签名方式则对应修改
constant.signServer=127.0.0.1:5004
# 本地配置私钥进行签名,使用本签名方式则对应修改
constant.privateKey=edf02a4a69b14ee6b1650a95de71d5f50496ef62ae4213026bd8d6651d030995
constant.cronTrans=0/1 * * * * ?
constant.requestCountMax=6
constant.selectCount=10
constant.intervalTime=600
constant.sleepTime=50
# 是否删除数据
constant.ifDeleteData=false
constant.cronDeleteData=0 0 1 * * ?
constant.keepDays=360
# 使用分布式任务部署多活(true-是,false-否)
constant.ifDistributedTask=false
################################### elastic-job 分布式任务 ###################################
# 部署多活的话需配置zookeeper,支持集群
job.regCenter.serverLists=127.0.0.1:2181
# zookeeper命名空间
job.regCenter.namespace=elasticjob-transaction
# 分片数(如多活3个的话可分成3片)
job.dataflow.shardingTotalCount=3
################################### 数据源配置 ###################################
# * 说明:本工程使用Sharding-JDBC分库分表,支持单一数据源,也支持多库多表。
# * 单库单表:配置单个数据源,将分库策略和分表策略注释或删除
# * 多库多表:配置多数据源,以群组分库,以年份分表,用户自定义每年分成几个表(注:分表策略的路由字段不可修改[id,gmt_create])
# * 样例:以两个数据源为例(数据库需事先创建),每张表根据年分表,每年再分成两个子表,以2020和2021年的表为例
# 配置所有的数据源,如此处定义了ds0,ds1两个数据源,对应两个库
sharding.jdbc.datasource.names=ds0,ds1
# 定义数据源ds0,配置数据库连接信息
sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://127.0.0.1:3306/webasetransaction0?autoReconnect=true&useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8
sharding.jdbc.datasource.ds0.username=dbUsername
sharding.jdbc.datasource.ds0.password=dbPassword
# 定义数据源ds1,配置数据库连接信息
sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/webasetransaction1?autoReconnect=true&useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8
sharding.jdbc.datasource.ds1.username=dbUsername
sharding.jdbc.datasource.ds1.password=dbPassword
# 定义数据库分片策略,如此处以群组id取模2来路由到ds0或ds1
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=group_id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{group_id % 2}
# 定义tb_deploy_transaction的分表策略,如此处以创建时间的年份和自增id取模2来路由到子表
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.actual-data-nodes=ds$->{0..1}.tb_deploy_transaction_$->{2020..2021}_$->{0..1}
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.table-strategy.complex.sharding-columns=id,gmt_create
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.table-strategy.complex.algorithm-class-name=com.webank.webase.transaction.config.MyComplexShardingAlgorithm
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.key-generator-column-name=id
# 定义tb_stateless_transaction的分表策略,如此处以创建时间的年份和自增id取模2来路由到子表
sharding.jdbc.config.sharding.tables.tb_stateless_transaction.actual-data-nodes=ds$->{0..1}.tb_stateless_transaction_$->{2020..2021}_$->{0..1}
sharding.jdbc.config.sharding.tables.tb_stateless_transaction.table-strategy.complex.sharding-columns=id,gmt_create
sharding.jdbc.config.sharding.tables.tb_stateless_transaction.table-strategy.complex.algorithm-class-name=com.webank.webase.transaction.config.MyComplexShardingAlgorithm
sharding.jdbc.config.sharding.tables.tb_stateless_transaction.key-generator-column-name=id
sharding.jdbc.config.props.sql.show=false
5. 服务启停¶
返回到dist目录执行:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
接口说明¶
1. 合约接口¶
1.1. 合约编译接口¶
接口描述¶
调用此接口编译合约。上传合约文件zip压缩包(压缩包里的每个合约的文件名要和合约名一致,合约引用需使用“./xxx.sol”),返回合约编译信息。
WeBASE-Transaction编译国密版智能合约,v1.3.1+版本已支持根据配置项的encryptType
自动切换国密版soclJ jar包;
接口URL¶
http://localhost:5003/WeBASE-Transaction/contract/compile
调用方法¶
HTTP POST
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": [
{
"contractName": "HelloWorld",
"contractBin": "xxx",
"contractAbi": []
}
]
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
1.2. 合约部署接口¶
接口描述¶
调用此接口发送合约部署相关信息,交易服务子系统会将合约部署请求信息缓存到数据库,通过轮询服务向节点发送交易请求,确保合约成功部署。
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
接口URL¶
http://localhost:5003/WeBASE-Transaction/contract/deploy
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 部署业务流水号 | uuidDeploy | String | 64 | 是 | |
3 | 签名类型 | signType | int | 2 | 是 | 0-本地配置私钥签名,1-本地随机私钥签名,2-调用WeBASE-Sign签名 |
4 | 合约Bin | contractBin | String | 是 | ||
5 | 合约Abi | contractAbi | List\<Object> | 是 | JSON数组 | |
6 | 构造方法参数 | funcParam | List\<Object> | 否 | JSON数组 | |
7 | 签名用户编号 | signUserId | String | 否 | signType为2时必填 |
2)数据格式
{
"groupId":1,
"uuidDeploy":"XXX",
"signType":0,
"contractBin":"0xXXXXX",
"contractAbi":[],
"funcParam":["hello"],
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": null
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
1.3. 合约地址查询接口¶
接口描述¶
根据群组编号和和部署业务流水号查询部署的合约地址。
接口URL¶
http://localhost:5003/WeBASE-Transaction/contract/address/{groupId}/{uuidDeploy}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 部署业务流水号 | uuidDeploy | String | 64 | 是 |
2)数据格式
http://127.0.0.1:5003/WeBASE-Transaction/contract/address/1/10001
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 合约地址 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": "0xXXXXX"
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
1.4. 部署event查询接口¶
接口描述¶
根据群组编号和和部署业务流水号查询部署的合约的构造函数的event信息。
接口URL¶
http://localhost:5003/WeBASE-Transaction/contract/event/{groupId}/{uuidDeploy}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 部署业务流水号 | uuidDeploy | String | 64 | 是 |
2)数据格式
http://127.0.0.1:5003/WeBASE-Transaction/contract/event/1/10001
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": {
"constructorEvent1": [
"hello!"
],
"constructorEvent": [
"test",
8
]
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
1.5. 部署信息查询接口¶
接口描述¶
根据群组编号和和部署业务流水号查询部署的信息。
接口URL¶
http://localhost:5003/WeBASE-Transaction/contract/deployInfo/{groupId}/{uuidDeploy}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 部署业务流水号 | uuidDeploy | String | 64 | 是 |
2)数据格式
http://127.0.0.1:5003/WeBASE-Transaction/contract/deployInfo/1/10001
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | |||
3.1 | 编号 | id | int | 是 | ||
3.2 | 群组编号 | groupId | int | 是 | ||
3.3 | 流水号 | uuidDeploy | String | 是 | ||
3.4 | 合约bin | contractBin | String | 是 | ||
3.5 | 合约abi | contractAbi | String | 是 | ||
3.6 | 合约地址 | contractAddress | String | 是 | ||
3.7 | 方法参数 | funcParam | String | 是 | ||
3.8 | 签名类型 | signType | int | 是 | ||
3.9 | 签名用户编号 | signUserId | String | 是 | ||
3.10 | 请求上链次数 | requestCount | int | 是 | ||
3.11 | 处理状态 | handleStatus | int | 是 | 0-待处理,1-处理成功 | |
3.12 | 交易hash | transHash | String | 是 | ||
3.13 | 交易回执状态 | receiptStatus | boolean | 是 | 0-异常,1-正常 | |
3.14 | 创建时间 | gmtCreate | Date | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"groupId": 1,
"uuidDeploy": "10001",
"contractBin": "XXX",
"contractAbi": "XXX"
"contractAddress": "XXX",
"funcParam": "[]",
"signType": 0,
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3",
"requestCount": 1,
"handleStatus": 1,
"transHash": "XXX",
"receiptStatus": true,
"gmtCreate": 1574853659000
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
2. keystore接口¶
2.1. 查询账户地址接口¶
接口描述¶
查询本地配置私钥对应的账户地址 。
接口URL¶
http://localhost:5003/WeBASE-Transaction/key/address
调用方法¶
HTTP GET
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": {
"0xfe12013103cf85f05b0862e5ef49da4fbdbd8f99"
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
3. 交易接口¶
3.1. 交易请求接口¶
接口描述¶
调用此接口发送无状态交易请求,交易服务子系统会将交易请求信息缓存到数据库,通过轮询服务向节点发送交易请求,确保交易成功上链。当部署业务流水号为空时(即不是调用交易子系统部署合约),合约地址和abi不能为空。
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
接口URL¶
http://localhost:5003/WeBASE-Transaction/trans/send
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 交易业务流水号 | uuidStateless | String | 64 | 是 | |
3 | 部署业务流水号 | uuidDeploy | String | 64 | 否 | |
4 | 签名类型 | signType | int | 2 | 是 | 0-本地配置私钥签名,1-本地随机私钥签名,2-调用WeBASE-Sign签名 |
5 | 合约地址 | contractAddress | String | 是 | ||
6 | 合约Abi | contractAbi | List\<Object> | 是 | JSON数组 | |
7 | 调用方法名 | funcName | String | 是 | ||
8 | 方法参数 | funcParam | List\<Object> | 否 | JSON数组 | |
9 | 签名用户编号 | signUserId | String | 否 | signType为2时必填 |
2)数据格式
{
"groupId":1,
"uuidStateless":"XXX",
"uuidDeploy":"XXX",
"signType":0,
"contractAddress":"0xXXXXX",
"contractAbi":[],
"funcName":"set",
"funcParam":["hello"],
"signUserId":"458ecc77a08c486087a3dcbc7ab5a9c3"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": null
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
3.2. 交易查询接口¶
接口描述¶
调用此接口同步从节点查询交易信息。当部署业务流水号为空时(即不是调用交易子系统部署合约),合约地址和abi不能为空。
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
接口URL¶
http://localhost:5003/WeBASE-Transaction/trans/call
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 部署业务流水号 | uuidDeploy | String | 64 | 否 | |
3 | 合约地址 | contractAddress | String | 否 | ||
4 | 合约Abi | contractAbi | List\<Object> | 否 | JSON数组 | |
5 | 调用方法名 | funcName | String | 是 | ||
6 | 方法参数 | funcParam | List\<Object> | 否 | JSON数组 |
2)数据格式
{
"groupId":1,
"uuidDeploy":"XXX",
"contractAbi":[],
"funcName":"get",
"funcParam":[]
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": [
"hello"
]
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
3.3. 交易请求event查询接口¶
接口描述¶
根据群组编号和交易业务流水号查询交易请求的event信息。
接口URL¶
http://localhost:5003/WeBASE-Transaction/trans/event/{groupId}/{uuidStateless}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 交易业务流水号 | uuidStateless | String | 64 | 是 |
2)数据格式
http://127.0.0.1:5003/WeBASE-Transaction/trans/event/1/20001
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": {
"setEvent": [
"test"
],
"setEvent1": [
"test"
]
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
3.4. 交易请求output查询接口¶
接口描述¶
根据群组编号和交易业务流水号查询交易请求的output信息。
接口URL¶
http://localhost:5003/WeBASE-Transaction/trans/output/{groupId}/{uuidStateless}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 交易业务流水号 | uuidStateless | String | 64 | 是 |
2)数据格式
http://127.0.0.1:5003/WeBASE-Transaction/trans/output/1/20001
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": [
"hello!"
]
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
3.5. 交易信息查询接口¶
接口描述¶
根据群组编号和交易业务流水号查询交易信息。
接口URL¶
http://localhost:5003/WeBASE-Transaction/trans/transInfo/{groupId}/{uuidStateless}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | int | 16 | 是 | |
2 | 交易业务流水号 | uuidStateless | String | 64 | 是 |
2)数据格式
http://127.0.0.1:5003/WeBASE-Transaction/trans/transInfo/1/20001
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | |||
3.1 | 编号 | id | int | 是 | ||
3.2 | 群组编号 | groupId | int | 是 | ||
3.3 | 交易流水号 | uuidStateless | String | 是 | ||
3.4 | 部署流水号 | uuidDeploy | String | 是 | ||
3.5 | 合约abi | contractAbi | String | 是 | ||
3.6 | 合约地址 | contractAddress | String | 是 | ||
3.7 | 方法名 | funcName | String | 是 | ||
3.8 | 方法参数 | funcParam | String | 是 | ||
3.9 | 签名类型 | signType | int | 是 | ||
3.10 | 签名用户编号 | signUserId | String | 是 | ||
3.11 | 请求上链次数 | requestCount | int | 是 | ||
3.12 | 处理状态 | handleStatus | int | 是 | 0-待处理,1-处理成功 | |
3.13 | 交易hash | transHash | String | 是 | ||
3.14 | 交易返回原文 | transOutput | String | 是 | ||
3.15 | 交易回执状态 | receiptStatus | boolean | 是 | 0-异常,1-正常 | |
3.16 | 创建时间 | gmtCreate | Date | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"groupId": 1,
"uuidStateless": "20001",
"uuidDeploy": "10001",
"contractAbi": "XXX"
"contractAddress": "XXX",
"funcName": "set",
"funcParam": "XXX",
"signType": 0,
"signUserId": "458ecc77a08c486087a3dcbc7ab5a9c3",
"requestCount": 1,
"handleStatus": 1,
"transHash": "XXX",
"transOutput": "0x",
"receiptStatus": true,
"gmtCreate": 1574854118000
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
4. 其他接口¶
4.1. 获取EncryptType接口¶
接口描述¶
返回Transaction服务中web3sdk所使用的encryptType
,0:标准,1:国密
接口URL¶
http://localhost:5003/WeBASE-Transaction/encrypt
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | - | - | - | - | - |
2)数据格式
http://127.0.0.1:5003/WeBASE-Transaction/encrypt
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Integer | encryptType: 0:标准, 1:国密 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": 0
}
附录¶
1. 返回码信息列表¶
Code | message | 描述 |
---|---|---|
0 | success | 正常 |
103001 | system error | 系统异常 |
103002 | param valid fail | 参数校验异常 |
203001 | group id cannot be empty | 群组编号不能为空 |
203002 | uuid cannot be empty | 业务流水号不能为空 |
203003 | sign type cannot be empty | 签名类型不能为空 |
203004 | contract bin cannot be empty | 合约bin不能为空 |
203005 | contract abi cannot be empty | 合约abi不能为空 |
203006 | contract address cannot be empty | 合约地址不能为空 |
203007 | function name cannot be empty | 方法名不能为空 |
303001 | uuid is already exists | 业务流水号已经存在 |
303002 | get sign data from sign service error | 调用签名服务签名错误 |
303003 | contract funcParam is error | 合约方法参数错误 |
303004 | sign type is not exists | 签名类型不存在 |
303005 | contract abi is empty | 合约abi不存在 |
303006 | request function can not be constant | 交易上链不能为constant方法 |
303007 | query function must be constant | 查询方法必须是constant |
303008 | query data from chain failed | 查询链上数据失败 |
303009 | file cannot be empty | 文件不能为空 |
303010 | it is not a zip file | 文件不是zip格式 |
303011 | contract has not been deployed | 合约还没有部署 |
303012 | contract compile error | 合约编译错误 |
303013 | node request failed | 节点请求失败 |
303014 | there is not event | 不存在event |
303015 | trans has not been sent to the chain | 交易还没有上链 |
303016 | if deploy uuid is empty, contract address and contract abi cannot be empty | 部署业务流水号为空时,合约地址和abi不能为空 |
303017 | trans output is empty | 交易返回值为空 |
303018 | trans is not exists | 交易不存在 |
303019 | request group id has not been configured | 请求的群组编号未配置 |
303020 | sign user id cannot be empty while sign type is 2 | 签名类型为2是签名用户编号不能为空 |
303021 | sign user id check failed | 签名用户编号校验失败 |
303022 | function is not exists | 合约方法不存在 |
303023 | data is not exists | 数据不存在 |
附录¶
1. 安装问题¶
1.1 Java部署¶
此处给出OpenJDK安装简单步骤,供快速查阅。更详细的步骤,请参考官网。
② 配置环境变量¶
- 修改/etc/profile
sudo vi /etc/profile
- 在/etc/profile末尾添加以下信息
JAVA_HOME=/software/jdk-11
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH==.:$JAVA_HOME/lib
export JAVA_HOME CLASSPATH PATH
- 重载/etc/profile
source /etc/profile
③ 查看版本¶
java -version
1.2. 数据库部署¶
此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网。
① 安装MariaDB¶
- 安装命令
sudo yum install -y mariadb*
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasetransaction;
2. 常见问题¶
2.2 构建失败¶
“gradle build -x test”失败,不能编译Lombok注解:
...
/data/trans/webase-transcation/src/main/java/com/webank/webase/transaction/trans/TransService.java:175: error: cannot find symbol
log.warn("save fail. contract is not deploed", contractAddress);
^
symbol: variable log
location: class TransService
/data/trans/webase-transcation/src/main/java/com/webank/webase/transaction/trans/TransService.java:183: error: cannot find symbol
log.warn("call fail. contractAddress:{} abi is not exists", contractAddress);
^
symbol: variable log
location: class TransService
Note: /data/trans/webase-transcation/src/main/java/com/webank/webase/transaction/util/ContractAbiUtil.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
100 errors
FAILURE: Build failed with an exception.
...
答: 修改 build.gradle文件,将以下代码的注释去掉
//annotationProcessor 'org.projectlombok:lombok:1.18.2'
2.3 启动报错“nested exception is javax.net.ssl.SSLException”¶
...
nested exception is javax.net.ssl.SSLException: Failed to initialize the client-side SSLContext: Input stream not contain valid certificates.
答:CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK无法正常连接区块链节点,因此在使用CentOS操作系统时,推荐从OpenJDK网站自行下载。
2.4 启动报错“Processing bcos message timeout”¶
[main] ERROR SpringApplication() - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'scheduleService': Unsatisfied dependency expressed through field 'transService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'transService': Unsatisfied dependency expressed through field 'web3jMap'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'web3j' defined in class path resource [com/webank/webase/transaction/config/Web3Config.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.HashMap]: Factory method 'web3j' threw exception; nested exception is java.io.IOException: Processing bcos message timeout
答:一些Oracle JDK版本缺少相关包,导致节点连接异常。推荐使用OpenJDK,从OpenJDK网站自行下载。
3. application.properties配置项说明¶
配置项 | 说明 |
---|---|
server.port | 工程服务端口 |
server.context-path | 工程跟URI |
mybatis.mapper-locations | mapper路径 |
logging.config | 日志文件路径 |
sdk.orgName | 机构名 |
sdk.timeout | sdk连接超时时间 |
sdk.corePoolSize | sdk线程池配置 |
sdk.maxPoolSize | sdk线程池配置 |
sdk.queueCapacity | sdk线程池配置 |
sdk.keepAlive | sdk线程池配置 |
sdk.groupConfig.allChannelConnections[0].groupId | sdk连接的群组id |
sdk.groupConfig.allChannelConnections[0].connectionsStr[0] | sdk连接的节点的ip和channelPort |
sdk.encryptType | sdk的加密类型:0:标准,1:国密,需要与链的类型一致 |
constant.signServer | WeBASE-Sign签名服务ip端口 |
constant.privateKey | 本地配置私钥 |
constant.cronTrans | 轮询上链时间间隔 |
constant.requestCountMax | 重复请求上链最大次数 |
constant.selectCount | 每次查询未上链数据条数 |
constant.intervalTime | 未上链数据查询时间间隔 |
constant.sleepTime | 多线程时间间隔 |
constant.ifDeleteData | 是否删除数据 |
constant.cronDeleteData | 删除数据任务时间间隔 |
constant.keepDays | 数据保留天数 |
constant.ifDistributedTask | 是否使用分布式任务部署多活 |
job.regCenter.serverLists | 部署多活的话需配置zookeeper,支持集群 |
job.regCenter.namespace | zookeeper命名空间 |
job.dataflow.shardingTotalCount | 分片数 |
sharding.jdbc.datasource.names | 配置所有的数据源,对应多个数据库 |
sharding.jdbc.datasource.ds0.type | 数据连接池类型 |
sharding.jdbc.datasource.ds0.driver-class-name | 数据驱动 |
sharding.jdbc.datasource.ds0.url | 数据库连接url |
sharding.jdbc.datasource.ds0.username | 数据库用户名 |
sharding.jdbc.datasource.ds0.password | 数据库密码 |
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column | 数据库分片列 |
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression | 分片算法行表达式,需符合groovy语法 |
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.actual-data-nodes | 由数据源名 + 表名组成,以小数点分隔 |
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.table-strategy.complex.sharding-columns | 复合分片场景的分片列名称,多个列以逗号分隔 |
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.table-strategy.complex.algorithm-class-name | 复合分片算法类名称。该类需实现ComplexKeysShardingAlgorithm接口 |
sharding.jdbc.config.sharding.tables.tb_deploy_transaction.key-generator-column-name | 自增列名称 |
sharding.jdbc.config.props.sql.show | 是否开启SQL显示 |
签名服务¶
概要介绍¶
功能介绍¶
本系统为签名服务子系统。功能:管理公私钥、对数据进行签名。
国密支持¶
WeBASE-Sign v1.2.2+已支持 国密版FISCO-BCOS,使用WeBASE v1.2.2及以上版本
本系统同时支持国密与非国密,分别提供了ECDSA与国密两类接口,可生成/管理ECDSA和国密公私钥用户,可对数据进行国密或非国密的签名
部署说明¶
2. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Sign.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Sign.git
进入目录:
cd WeBASE-Sign
3. 编译代码¶
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Sign下生成已编译的代码目录dist。
4. 修改配置¶
(1)进入dist目录
cd dist
dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改配置(根据实际情况修改):
vi conf/application.yml
server:
# 本工程服务端口,端口被占用则修改
port: 5004
context-path: /WeBASE-Sign
spring:
datasource:
# 数据库连接信息
url: jdbc:mysql://127.0.0.1:3306/webasesign?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8
# 数据库用户名
username: "dbUsername"
# 数据库密码
password: "dbPassword"
driver-class-name: com.mysql.cj.jdbc.Driver
constant:
# aes加密key(16位),如启用,各互联的子系统的加密key需保持一致
aesKey: EfdsW23D23d3df43
5. 服务启停¶
在dist目录下执行:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
接口说明¶
1. 新增用户接口¶
1.1. 新增ECDSA/国密用户接口¶
接口描述¶
根据传入的encryptType
值,新增ECDSA或国密公私钥用户。
接口URL¶
http://localhost:5004/WeBASE-Sign/user/newUser?signUserId={signUserId}&appId={appId}&encryptType={encryptType}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2 | 应用编号 | appId | String | 64 | 是 | 用于标志用户的应用编号,仅支持数字字母下划线 |
3 | 加密类型 | encryptType | Integer | 否 | 默认为0,0: ECDSA, 1: 国密 | |
4 | 是否返回私钥 | returnPrivateKey | boolean | 否 | 默认false,true时返回aes加密的私钥 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/newUser?signUserId={signUserId}&appId={appId}&encryptType=0
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 是 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi |
2)数据格式
a.请求正常返回结果
ECDSA用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "",
"description": null,
"encryptType": 0
}
}
国密用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_222",
"appId": "group_02",
"address": "0x0bc3465986845864fc1646dedf2dd892c0fe11be",
"publicKey": "0xd09d4efe3c127898186c197ae6004a9b40d7c7805fc7e31f7c4a835a4b9cf4148155cbd6dfcf3e5fd84acf1ea55c26b5a9b05d118b456738be2becf0e667c0d6",
"privateKey": "",
"description": null,
"encryptType": 1
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303001,
"message": "user of this sign user id is already exists",
"data": null
}
1.2. 导入私钥用户接口¶
接口描述¶
导入私钥到Sign,与新增私钥类似
接口URL¶
http://localhost:5004/WeBASE-Sign/sign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥 | privateKey | String | 是 | 通过Base64加密后的私钥内容(编码前私钥为BigInteger的HexString十六进制字符串) | |
2 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
3 | 应用编号 | appId | String | 64 | 是 | 用于标志用户的应用编号,仅支持数字字母下划线 |
4 | 加密类型 | encryptType | Integer | 否 | 默认为0,0: ECDSA, 1: 国密 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/newUser
{
//privateKey编码前原文为: 3d1a470b2e7ae9d536c69af1cc5edf7830ece5b6a97df0e9441bab9f7a77b131
"privateKey": "M2QxYTQ3MGIyZTdhZTlkNTM2YzY5YWYxY2M1ZWRmNzgzMGVjZTViNmE5N2RmMGU5NDQxYmFiOWY3YTc3YjEzMQ==",
"signUserId": "user_222",
"appId": "app_222",
"encryptType": 0
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 否 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi |
2)数据格式
a.请求正常返回结果
ECDSA用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "", //不返回私钥
"description": null,
"encryptType": 0
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303001,
"message": "user of this sign user id is already exists",
"data": null
}
2. 查询用户接口¶
2.1 根据userId查询用户¶
接口描述¶
根据用户编号查询用户信息。
接口URL¶
http://localhost:5004/WeBASE-Sign/user/{signUserId}/userInfo
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2 | 是否返回私钥 | returnPrivateKey | boolean | 否 | 默认false,true时返回aes加密的私钥 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/{signUserId}/userInfo
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 是 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi |
2)数据格式
a.请求正常返回结果
ECDSA用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "",
"description": null,
"encryptType": 0
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303002,
"message": "user does not exist",
"data": null
}
3. 私钥用户管理接口¶
3.1. 停用私钥用户¶
接口描述¶
通过修改私钥用户的status
状态值来停用私钥用户;停用后,其他接口将不返回被停用的私钥用户
接口URL¶
http://localhost:5004/WeBASE-Sign/user
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user
{
"signUserId": "user_111"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success"
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303002,
"message": "user does not exist",
"data": null
}
4. 用户列表接口¶
4.1. 根据appId查询用户列表(分页)¶
接口描述¶
根据传入的appId
值,查询所有所有属于该appId的用户信息列表。
接口URL¶
http://localhost:5004/WeBASE-Sign/user/list/{appId}/{pageNumber}/{pageSize}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 应用编号 | appId | String | 是 | 用于标志用户的应用编号 | |
2 | 页码 | pageNumber | Integer | 是 | 页码,同时为空则返回全部 | |
3 | 页大小 | pageSize | Integer | 是 | 页大小,同时为空则返回全部 | |
4 | 是否返回私钥 | returnPrivateKey | boolean | 否 | 默认false,true时返回aes加密的私钥 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/list/group_01/1/5
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | List | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 是 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi | |
4 | 总量 | totalCount | Long | 否 | 数据总量 |
2)数据格式
a.请求正常返回结果
ECDSA用户列表:
{
"code": 0,
"message": "success",
"data": [
{
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "",
"description": null,
"encryptType": 0
}
],
"totalCount": 1
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
5. 数据签名接口¶
5.1. ECDSA/国密数据签名接口¶
接口描述¶
指定用户通过ECDSA/国密SM2对数据进行签名。
接口URL¶
http://localhost:5004/WeBASE-Sign/sign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2 | 请求数据 | encodedDataStr | String | 是 | 十六进制String类型,使用web3sdk的Numeric.toHexString(byte[] input)方法将编码数据转换成HexString |
2)数据格式
http://localhost:5004/WeBASE-Sign/sign
{
"signUserId": "user_111",
"encodedDataStr": "0xba001"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 签名数据 | signDataStr | String | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": {
"signDataStr": "1c3f59a48593b66de4c57fe99f9c429811aa2dc9b495823cd99faa3e72b4a4d02e04bb7c3da6390a17adc00b0e740293c6306229a26a0c0cf2974581880d19e57b"
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 203009,
"message": "encoded data string must be hex string",
"data": null
}
6. 其他接口¶
附录¶
1. 返回码信息列表¶
Code | message | 描述 |
---|---|---|
0 | success | 正常 |
103001 | system error | 系统异常 |
103002 | param valid fail | 参数校验失败 |
203003 | param exception | 参数校验异常 |
203004 | sign user id cannot be blank | signUserId不可为空 |
203005 | invalid sign user id, only support letter and digit | signUserId不正确,仅支持数字字母下划线 |
203006 | app id cannot be blank | appId不可为空 |
203007 | app id invalid, only support letter and digit | appId不正确,仅支持数字字母下划线 |
203008 | encrypt type should be 0 (ecdsa) or 1 (guomi) | encryptType仅支持0或1 |
203009 | encoded data string must be hex string | encodedDataStr仅支持十六进制String |
303001 | user is already exists | 用户已存在 |
303002 | user does not exist | 用户不存在 |
303003 | privateKey is null | 用户私钥为空 |
303004 | privateKey decode fail | 私钥解码失败 |
303005 | privateKey format error | 私钥格式错误 |
303006 | privateKey not support transfer | 私钥不支持传输 |
升级说明¶
WeBASE-Sign升级的兼容性说明,请结合WeBASE-Sign Changelog进行阅读
WeBASE-Sign升级的必须步骤:
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 使用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 - 查看签名服务升级文档中对应版本是否需要修改数据表,若不需要升级则跳过
3.1 若需要升级数据表,首先使用
mysqldump
命令备份数据库 3.2 按照升级文档指引,操作数据表 bash stop.sh && bash start.sh
重启
各个版本的具体修改可参考下文
v1.5.0¶
- 支持导出私钥,增加配置项
supportPrivateKeyTransfer: true
,接口支持私钥传输(aes加密后的私钥),配置项为false
时不支持导出 - jar包升级:mysql-connector-java:8.0.22、bcprov-jdk15on:1.67
- 修复ECDSA签名结果序列化bug
v1.4.3¶
- 增加数据签名接口
v1.4.2¶
- 使用新版java-sdk替换web3sdk
v1.4.0¶
- 增加返回 WeBASE-Sign 版本号接口
- 默认Aes加密模式由
ECB
改为更安全的CBC
,同时支持在yml配置中选择CBC与ECB
v1.3.2¶
- 移除Fastjson,替换为Jackson 2.11.0。
- 升级web3sdk为2.4.1,并升级springboot等依赖项
v1.3.0¶
私钥数据表字段更新¶
- WeBASE-Sign的tb_user表新增两个字段: 私钥用户的唯一业务编号
signUserId
,和私钥用户所属应用编号appId
升级操作说明
如果WeBASE-Sign中有已存在的私钥数据,则在tb_user
表新增列sign_user_id
和app_id
后,还需要赋予其初始值,且sign_user_id
需赋予唯一值
登陆mysql后,进入到相应database中,以webasesign
的database为例;
mysql -uroot -p123456
// mysql 命令行
mysql> use webasesign;
// 在tb_user中添加列
mysql> alter table tb_user add column sign_user_id varchar(64) not null;
mysql> alter table tb_user add column app_id varchar(64) not null;
// 添加sign_user_id的唯一约束
mysql> alter table tb_user add unique key unique_uuid (sign_user_id);
如果仅将WeBASE-Node-Manager的私钥迁移至WeBASE-Sign中,则无需进行下面的sign_user_id赋值操作
如果有已存在的user的sign_user_id和app_id赋值,sign_user_id赋予唯一的随机值即可;
// app_id可以设置为一样,也可根据user具体标签赋予不同的app_id值
mysql> update tb_user set app_id = 'app_default' where 1=1;
// 为每个user的sign_user_id设置一个唯一的随机值
mysql> update tb_user set sign_user_id = '{yourValue}'' where user_id = '{yourUserId}';
API更新¶
- WeBASE-Sign的新建私钥接口
/user/newUser
需传入signUserId
,appId
才可新建用户,且可以传值encryptType
指定该用户的类型为ECDSA或国密算法;
值得注意的是,现在WeBASE-Sign新建私钥用户后,不再返回privateKey字段
,即私钥不离开WeBASE-Sign数据库。
- WeBASE-Sign的数据签名接口
/sign
传参修改,原用的userId
改为传入signUserId
,签名时会根据user的类型选择ECDSA或国密算法进行签名; - WeBASE-Sign新增停用用户的接口
/user
(DELETE),可根据signUserId
停用相应用户;
附录¶
1. 安装问题¶
1.1 Java部署¶
此处给出简单步骤,供快速查阅。更详细的步骤,请参考官网。
② 配置环境变量¶
- 修改/etc/profile
sudo vi /etc/profile
- 在/etc/profile末尾添加以下信息
JAVA_HOME=/nemo/jdk1.8.0_181
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH==.:$JAVA_HOME/lib
export JAVA_HOME CLASSPATH PATH
- 重载/etc/profile
source /etc/profile
③ 查看版本¶
java -version
1.2. 数据库部署¶
此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网。
① 安装MariaDB¶
- 安装命令
sudo yum install -y mariadb*
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasesign;
3. 配置文件解析¶
- 配置文件解析
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5004 | 当前服务端口 |
server.context-path | /WeBASE-Sign | 当前服务访问目录 |
server.tomcat.max-threads | 200 | tomcat最大线程数 |
server.tomcat.max-connections | 10000 | tomcat最大连接数 |
spring.cache.type | simple | Spring缓存模式 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasesign | mysql连接地址 |
spring.datasource.username | dbUsername | mysql账号 |
spring.datasource.password | dbPassword | mysql密码 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目录 |
constant.aesKey | EfdsW23D23d3df43 | webase服务的aes秘钥 |
constant.aesPattern | CBC | AES加密模式 |
constant.keepAliveRequests | 100 | 访问服务的请求存活数 |
constant.syncUsrCacheTaskFixedDelay | 10000 | 同步缓存的私钥间隔时间(ms) |
constant.supportPrivateKeyTransfer | true | 是否允许导出私钥 |
链管理服务¶
概要介绍¶
WeBASE-Chain-Manager为微众区块链中间件平台-链管理服务子系统,链管理服务支持管理多条链和动态群组管理功能,支持国密链、非国密链。主要包括以下模块:
序号 | 模块 | 描述 |
---|---|---|
1 | 链管理 | 维护链信息 |
2 | 前置管理 | 维护关联WeBASE-Front服务信息 |
3 | 群组管理 | 查询群组信息,动态操作群组 |
4 | 节点管理 | 查询节点列表,查看块高、区块等信息 |
5 | 合约管理 | 合约信息处理,包括编译、保存、部署、交易、状态管理(冻结、解冻) |
部署和接口说明如下:
部署说明¶
1. 前提条件¶
序号 | 软件 |
---|---|
1 | FISCO-BCOS 2.7+ |
2 | WeBASE-Front 1.4.0+ |
3 | WeBASE-Sign 1.4.0+ |
4 | MySQL5.6或以上版本 |
5 | Java8或以上版本 |
2. 注意事项¶
3. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Chain-Manager.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Chain-Manager.git
进入目录:
cd WeBASE-Chain-Manager
4. 编译代码¶
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
- 安装gradle可以参考 gradle安装示例
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Chain-Manager下生成已编译的代码目录dist。
5. 数据库初始化¶
5.1 新建数据库¶
#登录MySQL:
mysql -u ${your_db_account} -p${your_db_password} 例如:mysql -u root -p123456
#新建数据库:
CREATE DATABASE IF NOT EXISTS {your_db_name} DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
5.2 修改脚本配置¶
进入数据库脚本目录
cd dist/script
修改数据库连接信息:
修改数据库名称:sed -i "s/webasechainmanager/${your_db_name}/g" webase.sh
修改数据库用户名:sed -i "s/defaultAccount/${your_db_account}/g" webase.sh
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" webase.sh
例如:将数据库用户名修改为root,则执行:
sed -i "s/defaultAccount/root/g" webase.sh
6. 服务配置及启停¶
6.1 服务配置修改¶
(1)回到dist目录,dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改服务配置,完整配置项说明请查看 配置说明
修改服务端口:sed -i "s/5005/${your_server_port}/g" conf/application.yml
修改数据库IP:sed -i "s/127.0.0.1/${your_db_ip}/g" conf/application.yml
修改数据库端口:sed -i "s/3306/${your_db_port}/g" conf/application.yml
修改数据库名称:sed -i "s/webasechainmanager/${your_db_name}/g" conf/application.yml
修改数据库用户:sed -i "s/defaultAccount/${your_db_account}/g" conf/application.yml
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" conf/application.yml
6.2 服务启停¶
在dist目录下执行:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启。如果提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
7 访问¶
WeBASE链管理平台示例页面:
http://{deployIP}:{deployPort}/WeBASE-Chain-Manager
示例:http://localhost:5005/WeBASE-Chain-Manager
如果只调用接口,可以通过swagger查看调用接口:
http://{deployIP}:{deployPort}/WeBASE-Chain-Manager/swagger-ui.html
示例:http://localhost:5005/WeBASE-Chain-Manager/swagger-ui.html
备注:
- 部署服务器IP和服务端口需对应修改,网络策略需开通
8 查看日志¶
在dist目录查看:
全量日志:tail -f log/WeBASE-Chain-Manager.log
错误日志:tail -f log/WeBASE-Chain-Manager-error.log
接口说明¶
[TOC]
1 区块链管理模块¶
1.1 新增链信息¶
1.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /chain/new
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | chainName | string | 否 | 链名称 |
3 | chainType | int | 否 | 链类型(0-非国密,1-国密) |
4 | description | string | 是 | 备注 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/chain/new
{
"chainId": 100001,
"chainName": "链一",
"chainType": 0,
"description": "test"
}
1.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | chainId | int | 否 | 链编号 |
3.2 | chainName | string | 否 | 链名称 |
3.3 | chainType | int | 否 | 链类型(0-非国密,1-国密) |
3.4 | description | string | 是 | 备注 |
3.5 | createTime | LocalDateTime | 否 | 落库时间 |
3.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"chainId": 100001,
"chainName": "链一",
"chainType": 0,
"description": "test"
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.2 获取所有链列表¶
1.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/all
- 请求方式:GET
- 返回格式:JSON
1.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | chainId | int | 否 | 链编号 |
4.1.2 | chainName | string | 否 | 链名称 |
4.1.3 | chainType | int | 否 | 链类型(0-非国密,1-国密) |
4.1.4 | description | string | 是 | 备注 |
4.1.5 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"chainId": 100001,
"chainName": "链一",
"chainType": 0,
"description": "test"
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.3 删除链信息¶
1.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/{chainId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/chain/100001
1.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2 前置管理模块¶
2.1 新增节点前置信息¶
2.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /front/new
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
2.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | frontIp | string | 否 | 前置ip |
3 | frontPort | int | 否 | 前置服务端口 |
4 | agency | string | 否 | 所属机构 |
5 | description | string | 是 | 备注 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/new
{
"chainId": 100001,
"frontIp": "127.0.0.1",
"frontPort": 5002,
"agency": "abc",
"description": "test"
}
2.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | frontId | int | 否 | 前置编号 |
3.2 | chainId | int | 否 | 链编号 |
3.3 | nodeId | string | 否 | 前置对应的节点编号 |
3.4 | frontIp | string | 否 | 前置ip |
3.5 | frontPort | int | 否 | 前置端口 |
3.6 | agency | string | 否 | 所属机构 |
3.7 | description | string | 是 | 备注 |
3.8 | createTime | LocalDateTime | 否 | 落库时间 |
3.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"frontId": 200001,
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2",
"frontIp": "127.0.0.1",
"frontPort": 5002,
"agency": "aa",
"description": "test"
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.2 获取所有前置列表¶
2.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/find?chainId={chainId}?frontId={frontId}&groupId={groupId}
- 请求方式:GET
- 返回格式:JSON
2.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 是 | 链编号 |
2 | frontId | Int | 是 | 前置编号 |
3 | groupId | Int | 是 | 所属群组编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/find
2.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | frontId | int | 否 | 前置编号 |
4.1.2 | chainId | int | 否 | 链编号 |
4.1.3 | nodeId | string | 否 | 前置对应的节点编号 |
4.1.4 | frontIp | string | 否 | 前置ip |
4.1.5 | frontPort | int | 否 | 前置端口 |
4.1.6 | agency | string | 否 | 所属机构 |
4.1.7 | description | string | 是 | 备注 |
4.1.8 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontId": 200001,
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2",
"frontIp": "127.0.0.1",
"frontPort": 5002,
"agency": "aa",
"description": "test"
"createTime": "2019-06-04 20:49:42",
"modifyTime": "2019-06-04 20:49:42"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.3 删除前置信息¶
2.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/{frontId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
2.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | int | 否 | 前置编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/200001
2.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.4 前置节点监控信息¶
2.4.1 传输协议规范¶
网络传输协议:使用HTTP协议
请求地址:
/mointorInfo/{frontId}?beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}&gap={gap}&groupId={groupId}
请求方式:GET
请求头:Content-type: application/json
返回格式:JSON
2.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | int | 否 | 前置编号 |
2 | beginDate | LocalDateTime | 是 | 显示时间(开始) yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00 |
3 | endDate | LocalDateTime | 是 | 显示时间(结束) |
4 | contrastBeginDate | LocalDateTime | 是 | 对比时间(开始) |
5 | contrastEndDate | LocalDateTime | 是 | 对比时间(结束) |
6 | gap | Int | 是 | 数据粒度,默认1 |
7 | groupId | int | 否 | 群组编号,默认1 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/mointorInfo/200001?beginDate=2019-03-13T00:00:00&endDate=2019-03-13T14:34:22&contrastBeginDate=2019-03-13T00:00:00&contrastEndDate=2019-03-13T14:34:22&gap=60&groupId=1
2.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | metricType | String | 否 | 测量类型:blockHeight(块高)、pbftView(pbft视图)、pendingCount(待处理交易数量) |
3.1.2 | data | Object | 否 | |
3.1.2.1 | lineDataList | Object | 否 | 指定时间的数据 |
3.1.2.1.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.1.2 | valueList | List\<Integer> | 否 | 值列表 |
3.1.2.2 | contrastDataList | Object | 否 | 比对时间的数据 |
3.1.2.2.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.2.2 | valueList | List\<Integer> | 否 | 值列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"metricType": "blockHeight",
"data": {
"lineDataList": {
"timestampList": [
1552406401042,
1552406701001
],
"valueList": [
747309,
747309
]
},
"contrastDataList": {
"timestampList": [
1552320005000,
1552320301001
],
"valueList": [
null,
747309
]
}
}
},
{
"metricType": "pbftView",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [
118457,
157604
]
},
"contrastDataList": {
"timestampList": null,
"valueList": [
null,
33298
]
}
}
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.5 前置节点服务器监控信息¶
2.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/front/ratio/{frontId}?gap={gap}&beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}
- 请求方式:GET
- 返回格式:JSON
2.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | int | 否 | 前置编号 |
2 | beginDate | LocalDateTime | 是 | 显示时间(开始) yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00 |
3 | endDate | LocalDateTime | 是 | 显示时间(结束) |
4 | contrastBeginDate | LocalDateTime | 是 | 对比时间(开始) |
5 | contrastEndDate | LocalDateTime | 是 | 对比时间(结束) |
6 | gap | Int | 是 | 数据粒度,默认1 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/ratio/200001?gap=1&beginDate=2019-03-15T00:00:00&endDate=2019-03-15T15:26:55&contrastBeginDate=2019-03-15T00:00:00&contrastEndDate=2019-03-15T15:26:55
2.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | metricType | String | 否 | 测量类型: cpu(cpu利用率:%)、memory(内存利用率:%)、disk(硬盘利用率:%)、txbps(上行bandwith:KB/s)、rxbps(下行bandwith:KB/s) |
3.1.2 | data | Object | 否 | |
3.1.2.1 | lineDataList | Object | 否 | 指定时间的数据 |
3.1.2.1.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.1.2 | valueList | List\<Integer> | 否 | 值列表 |
3.1.2.2 | contrastDataList | Object | 否 | 比对时间的数据 |
3.1.2.2.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.2.2 | valueList | List\<Integer> | 否 | 值列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"metricType": "txbps",
"data": {
"lineDataList": {
"timestampList": [
1552406401042,
1552406701001
],
"valueList": [
12.24,
54.48
]
},
"contrastDataList": {
"timestampList": [
1552320005000,
1552320301001
],
"valueList": [
22.24,
24.48
]
}
}
},
{
"metricType": "cpu",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [
118457,
157604
]
},
"contrastDataList": {
"timestampList": null,
"valueList": [
null,
33298
]
}
}
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.6 前置节点服务器配置信息¶
2.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/config/{frontId}
- 请求方式:GET
- 返回格式:JSON
2.6.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | int | 否 | 前置编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/config/200001
2.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | ip | String | 否 | ip地址 |
3.1.2 | memoryTotalSize | String | 否 | 内存总量(单位:KB) |
3.1.3 | memoryUsedSize | String | 否 | 当前内存使用量(单位:KB) |
3.1.4 | cpuSize | String | 否 | CPU的大小(单位:MHz) |
3.1.5 | cpuAmount | String | 否 | CPU的核数(单位:个) |
3.1.6 | diskTotalSize | String | 否 | 文件系统总量(单位:KB) |
3.1.7 | diskUsedSize | String | 否 | 文件系统已使用量(单位:KB) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"memoryTotalSize": "8010916",
"cpuAmount": "4",
"memoryUsedSize": "7674492",
"cpuSize": "2599",
"ip": "127.0.0.1",
"diskUsedSize": "306380076",
"diskTotalSize": "515928320"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.7 检查前置节点进程是否存活¶
2.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/checkNodeProcess/{frontId}
- 请求方式:GET
- 返回格式:JSON
2.7.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/checkNodeProcess/200001
2.7.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | boolean | 否 | true-存活;false-未存活 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": true
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.8 获取前置节点所在群组物理大小信息¶
2.8.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/getGroupSizeInfos/{frontId}
- 请求方式:GET
- 返回格式:JSON
2.8.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/front/getGroupSizeInfos/200001
2.8.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | List | 返回信息实体 | ||
3.1.1 | groupId | Int | 否 | 群组id |
3.1.2 | groupName | String | 否 | 群组名 |
3.1.3 | path | String | 否 | 文件路径 |
3.1.4 | size | Long | 否 | 大小(单位:KB) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"groupId": 31231,
"groupName": "group31231",
"path": "/data/app/nodes/127.0.0.1/node0/data/group31231",
"size": 27085
},
{
"groupId": 2,
"groupName": "group2",
"path": "/data/app/nodes/127.0.0.1/node0/data/group2",
"size": 23542
},
{
"groupId": 1,
"groupName": "group1",
"path": "/data/app/nodes/127.0.0.1/node0/data/group1",
"size": 25077
},
{
"groupId": 111,
"groupName": "group111",
"path": "/data/app/nodes/127.0.0.1/node0/data/group111",
"size": 21552
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3 群组管理模块¶
3.1 生成新群组¶
向单个节点请求生成新群组配置信息,节点和前置一一对应,节点编号可以从前置列表获取。适用于新群组下的节点属于不同链管理服务,每个节点都要请求一遍。群组生成后,需对应调用3.3的启动。
3.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/generate/{nodeId}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
3.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | generateGroupId | int | 否 | 生成的群组编号 |
3 | timestamp | BigInteger | 否 | 创世块时间(单位:ms) |
4 | nodeList | List |
否 | 节点编号列表(新群组的所有节点编号) |
5 | description | string | 是 | 备注 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/generate/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2
{
"chainId": 100001,
"generateGroupId": 2,
"timestamp": 1574853659000,
"nodeList": [
"78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2"
],
"description": "description"
}
3.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 组织信息对象 |
3.1 | groupId | int | 否 | 群组编号 |
3.2 | chainId | int | 否 | 链编号 |
3.3 | groupName | String | 否 | 群组名称 |
3.4 | nodeCount | int | 否 | 节点数量 |
3.5 | description | String | 是 | 描述 |
3.6 | createTime | LocalDateTime | 否 | 落库时间 |
3.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"groupId": 2,
"chainId": 100001,
"groupName": "group2",
"nodeCount": 1,
"description": "test",
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-03-15 09:36:17"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.2 批量生成新群组¶
向新群组下所有节点请求生成新群组配置信息,节点和前置一一对应,节点编号可以从前置列表获取。适用于新群组下的节点属于同一个链管理服务(节点对应前置都要添加到链管理服务)。群组生成后,需对应调用3.4的批量启动。
3.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/generate
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
3.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | generateGroupId | int | 否 | 生成的群组编号 |
3 | timestamp | BigInteger | 否 | 创世块时间(单位:ms) |
4 | nodeList | List |
否 | 节点编号列表(新群组的所有节点编号) |
5 | description | string | 是 | 备注 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/generate
{
"chainId": 100001,
"generateGroupId": 2,
"timestamp": 1574853659000,
"nodeList": [
"78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2"
],
"description": "description"
}
3.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 组织信息对象 |
3.1 | groupId | int | 否 | 群组编号 |
3.2 | chainId | int | 否 | 链编号 |
3.3 | groupName | String | 否 | 群组名称 |
3.4 | nodeCount | int | 否 | 节点数量 |
3.5 | description | String | 是 | 描述 |
3.6 | createTime | LocalDateTime | 否 | 落库时间 |
3.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"groupId": 2,
"chainId": 100001,
"groupName": "group2",
"nodeCount": 1,
"description": "test",
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-03-15 09:36:17"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.3 动态操作群组¶
可以对已存在的群组或新生成的群组进行动态操作,包括启动、停止、删除、恢复、状态查询。
说明: 生成新群组时,新群组下每一个节点都要启动,节点和前置一一对应。适用于新群组下的节点属于不同链管理服务,每个节点都要请求一遍进行启动。
3.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/operate/{chainId}/{groupId}/{nodeId}/{type}
- 请求方式:GET
- 返回格式:JSON
3.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | groupId | int | 否 | 要操作的群组编号 |
3 | nodeId | String | 否 | 节点Id |
4 | type | String | 否 | 操作类型:start-启动;stop-停止;remove-删除;recover-恢复;getStatus-查询状态 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/operate/100001/2/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2/start
3.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {}
}
- 失败:
{
"code": 205032,
"message": "Group 2 is already running",
"data": null
}
3.4 批量启动群组¶
节点和前置一一对应,节点编号可以从前置列表获取。适用于新群组下的节点属于同一个链管理服务(节点对应前置都要添加到链管理服务)。
3.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/batchStart
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
3.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | generateGroupId | int | 否 | 生成的群组编号 |
3 | nodeList | List |
否 | 节点编号列表 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/generate
{
"chainId": 100001,
"generateGroupId": 2,
"nodeList": [
"78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2"
]
}
3.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 组织信息对象 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
~~3.5 更新群组~~(废弃,启动或停止后自动更新)¶
生成新群组并启动新群组的每一个节点后,调用此接口更新群组相关信息。
3.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/update
- 请求方式:GET
- 返回格式:JSON
3.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.6 获取群组概况¶
3.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/general/{chainId}/{groupId}
- 请求方式:GET
- 返回格式:JSON
3.6.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | groupId | int | 否 | 群组id |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/100001/300001
3.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
3.1 | groupId | int | 否 | 群组id |
3.2 | nodeCount | int | 否 | 节点数量 |
2)出参示例
- 成功:
{
"code": 0,
"data": {
"groupId": "300001",
"nodeCount": 2
},
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.7 获取所有群组列表¶
3.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/all/{chainId}
- 请求方式:GET
- 返回格式:JSON
3.7.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 组织信息对象 | ||
4.1.1 | chainId | int | 否 | 链编号 |
4.1.2 | groupId | int | 否 | 群组编号 |
4.1.3 | groupName | String | 否 | 群组名称 |
4.1.4 | nodeCount | int | 否 | 节点数量 |
4.1.5 | description | String | 是 | 描述 |
4.1.6 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"chainId": 100001,
"groupId": 2,
"groupName": "group2",
"nodeCount": 1,
"description": "test",
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-03-15 09:36:17"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.8 获取群组下节点共识列表¶
获取节点的共识列表,包含节点Id,节点共识状态。返回所有的共识/观察节点(无论运行或停止),以及正在运行的游离节点。
3.8.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/getConsensusList/{chainId}/{groupId}/{nodeId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
3.8.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点Id,指定节点调用 |
4 | pageSize | Int | 是 | 条数,默认10 |
5 | pageNumber | Int | 是 | 页码,默认1 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/getConsensusList/1001/1/413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1?pageSize=10&pageNumber=1
3.8.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 共识列表 |
4.1 | Object | 共识信息对象 | ||
4.1.1 | nodeId | String | 否 | 节点编号 |
4.1.2 | nodeType | String | 否 | 节点类型 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"nodeId": "626e1f1df03e217a7a25361444b857ec68003482aabfb24645a67111cbd96ceedc998975e158475605e38b899bc97be7283006a0171f4ec4796972ff6ad55b1a",
"nodeType": "sealer"
},
{
"nodeId": "cd3a0d965ca5e5de9edce69245db827a3a253e4868e074020c3f5fb83ca0ae884d5705940c1fc1de550874de0f02374e83eaeb5317b819e420a8ff2e07e4b84c",
"nodeType": "sealer"
}
],
"totalCount": 2
}
- 失败:
{
"code": 205002,
"message": "not fount any front",
"data": null
}
3.9 设置群组下节点共识状态¶
可用于节点三种共识状态的切换。分别是共识节点sealer,观察节点observer,游离节点remove。
3.9.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/setConsensusStatus
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
3.9.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
4 | nodeId | String | 否 | 要切换状态节点Id |
5 | nodeType | String | 否 | 要设置的节点类型:observer/sealer/remove |
6 | reqNodeId | String | 否 | 调用前置对应的节点Id |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/setConsensusStatus
{
"signUserId": "user100001",
"chainId": 1001,
"groupId": 1,
"nodeId": "626e1f1df03e217a7a25361444b857ec68003482aabfb24645a67111cbd96ceedc998975e158475605e38b899bc97be7283006a0171f4ec4796972ff6ad55b1a",
"nodeType": "sealer",
"reqNodeId": "413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1"
}
3.9.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"msg": "success"
}
- 失败:
{
"code": -51000,
"message": "nodeId already exist"
}
3.10 获取系统配置列表¶
获取系统配置列表,目前支持tx_count_limit、tx_gas_limit两个参数。
3.10.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/getSysConfigList/{chainId}/{groupId}/{nodeId}?pageSize={pageSize}&pageNumber={pageNumber}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
3.10.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点Id,指定节点调用 |
4 | pageSize | Int | 是 | 条数,默认10 |
5 | pageNumber | Int | 是 | 页码,默认1 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/getSysConfigList/1001/1/413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1?pageSize=10&pageNumber=1
3.10.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 配置列表 |
4.1 | Object | 配置信息对象 | ||
4.1.1 | groupId | Int | 否 | 群组编号 |
4.1.2 | configKey | String | 否 | 配置项,目前支持tx_count_limit、tx_gas_limit两个参数 |
4.1.4 | configValue | String | 否 | 配置值 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"groupId": 1,
"configKey": "tx_count_limit",
"configValue": "1000"
},
{
"groupId": 1,
"configKey": "tx_gas_limit",
"configValue": "300000000"
}
],
"totalCount": 2
}
- 失败:
{
"code": 205002,
"message": "not fount any front",
"data": null
}
3.11 设置系统配置值¶
设置系统配置值,目前支持tx_count_limit、tx_gas_limit两个参数。
3.11.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/setSysConfig
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
3.11.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点Id,指定节点调用 |
4 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
5 | configKey | String | 否 | 配置项,目前支持tx_count_limit、tx_gas_limit两个参数 |
6 | configValue | String | 否 | 配置值 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/setSysConfig
{
"signUserId": "user100001",
"chainId": 1001,
"configKey": "tx_gas_limit",
"configValue": "300000000",
"groupId": 1,
"nodeId": "413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1"
}
3.11.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"msg": "success"
}
- 失败:
{
"code": 205002,
"message": "not fount any front",
"data": null
}
3.12 获取网络统计日志数据¶
统计日志数据存储在前置H2数据库,前置默认存储一万条,超过将不会从节点日志文件拉取新的数据。此时,获取完现有数据,可以调用3.14 删除前置统计日志数据进行删除,数据量少于一万条时,前置自动从节点日志文件拉取新的数据。
3.12.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/group/charging/getNetWorkData/{chainId}/{groupId}/{nodeId}?pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
3.12.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点Id,指定节点调用 |
4 | pageSize | Int | 是 | 条数,默认10 |
5 | pageNumber | Int | 是 | 页码,默认1 |
6 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
7 | endDate | LocalDateTime | 是 | 结束时间 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/group/charging/getNetWorkData/1001/1/413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1?pageSize=2&pageNumber=1&beginDate=2020-03-27T10:30:04&endDate=2020-03-27T17:30:04
3.12.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 主键 |
4.1.2 | groupId | Int | 否 | 群组编号 |
4.1.3 | totalIn | Long | 否 | 总入流量(P2P_InBytes + SDK_InBytes) |
4.1.4 | totalOut | Long | 否 | 总出流量(P2P_OutBytes + SDK_OutBytes) |
4.1.5 | timestamp | Long | 否 | 统计时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 583,
"totalIn": 53837,
"totalOut": 54753,
"groupId": 1,
"timestamp": 1585277486000
},
{
"id": 581,
"totalIn": 55128,
"totalOut": 55092,
"groupId": 1,
"timestamp": 1585277426000
}
],
"totalCount": 22
}
- 失败:
{
"code": 205002,
"message": "not fount any front",
"data": null
}
3.13 获取交易Gas统计日志数据¶
统计日志数据存储在前置H2数据库,前置默认存储一万条,超过将不会从节点日志文件拉取新的数据。此时,获取完现有数据,可以调用3.14 删除前置统计日志数据进行删除,数据量少于一万条时,前置自动从节点日志文件拉取新的数据。
3.13.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/group/charging/getTxGasData/{chainId}/{groupId}/{nodeId}?pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}&transHash={transHash}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
3.13.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点Id,指定节点调用 |
4 | pageSize | Int | 是 | 条数,默认10 |
5 | pageNumber | Int | 是 | 页码,默认1 |
6 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
7 | endDate | LocalDateTime | 是 | 结束时间 |
8 | transHash | String | 是 | 交易hash,不为空时查询指定hash |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/group/charging/getTxGasData/1001/1/413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1?pageSize=2&pageNumber=1&beginDate=2020-03-27T10:30:04&endDate=2020-03-27T17:30:04
3.13.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 主键 |
4.1.2 | groupId | Int | 否 | 群组编号 |
4.1.3 | transHash | Long | 否 | 交易hash |
4.1.4 | gasUsed | Long | 否 | 交易消耗的gas |
4.1.5 | timestamp | Long | 否 | 统计时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 5,
"transHash": "c5e208ec70b899529e11311f1147b1ee24ab8f02301e6cdbe8252c77a89a0d4c",
"gasUsed": 34949,
"groupId": 1,
"timestamp": 1585277499000
},
{
"id": 4,
"transHash": "d9d7800554b68c84a53e54eef8adceecca891dd0dd7e0069a3474a81d4eac440",
"gasUsed": 44892,
"groupId": 1,
"timestamp": 1585277489000
}
],
"totalCount": 5
}
- 失败:
{
"code": 205002,
"message": "not fount any front",
"data": null
}
3.14 删除前置统计日志数据¶
删除群组下统计日志数据。
3.14.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/charging/deleteData/{chainId}/{groupId}/{nodeId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
3.14.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点Id,指定节点调用 |
4 | type | Int | 否 | 删除数据类型(1-网络统计数据;2-交易gas数据) |
5 | keepEndDate | LocalDateTime | 否 | 保留截止时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/group/charging/deleteData/1001/1/413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1?type=2&keepEndDate=2020-01-27T17%3A30%3A04
3.14.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 处理条数 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 5
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4 节点管理模块¶
4.1 查询节点信息列表¶
4.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/nodeList/{chainId}/{groupId}/{pageNumber}/{pageSize}?nodeId={nodeId}
- 请求方式:GET
- 返回格式:JSON
4.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | groupId | int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | nodeId | String | 是 | 节点Id |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/node/nodeList/100001/300001/1/10?nodeId=
4.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 节点列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | chainId | int | 否 | 链编号 |
4.1.2 | nodeId | String | 否 | 节点编号 |
4.1.3 | nodeName | string | 否 | 节点名称 |
4.1.4 | groupId | int | 否 | 所属群组编号 |
4.1.5 | nodeActive | int | 否 | 共识状态(1正常,2不正常) |
4.1.6 | nodeIp | string | 否 | 节点ip |
4.1.7 | P2pPort | int | 否 | 节点p2p端口 |
4.1.8 | description | String | 否 | 备注 |
4.1.9 | blockNumber | BigInteger | 否 | 节点块高 |
4.1.10 | pbftView | BigInteger | 否 | Pbft view |
4.1.11 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.12 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2,
"nodeName": "1_78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b",
"groupId": 1,
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
~~4.2 查询节点信息~~(废弃,可通过4.1查询)¶
节点和前置一一对应,节点编号可以从前置列表获取。
4.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/nodeInfo/{chainId}/{groupId}/{nodeId}
- 请求方式:GET
- 返回格式:JSON
4.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组id |
3 | nodeId | String | 否 | 节点编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/node/nodeInfo/100001/1/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2
4.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | chainId | Int | 否 | 链编号 |
3.2 | nodeId | String | 否 | 节点编号 |
3.3 | nodeName | String | 否 | 节点名称 |
3.4 | groupId | Int | 否 | 所属群组编号 |
3.5 | nodeActive | Int | 否 | 共识状态(1正常,2不正常) |
3.6 | nodeIp | String | 否 | 节点ip |
3.7 | P2pPort | Int | 否 | 节点p2p端口 |
3.8 | description | String | 否 | 备注 |
3.9 | blockNumber | BigInteger | 否 | 节点块高 |
3.10 | pbftView | BigInteger | 否 | Pbft view |
3.11 | createTime | LocalDateTime | 否 | 落库时间 |
3.12 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2",
"nodeName": "1_78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b",
"groupId": 1,
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.3 获取区块高度¶
指定节点获取区块高度。节点和前置一一对应,节点编号可以从前置列表获取。
4.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/getBlockNumber/{chainId}/{groupId}/{nodeId}
- 请求方式:GET
- 返回格式:JSON
4.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/node/getBlockNumber/1001/1/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2
4.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 块高 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 74
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.4 根据区块高度获取区块信息¶
指定节点根据区块高度获取区块信息。节点和前置一一对应,节点编号可以从前置列表获取。
4.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/getBlockByNumber/{chainId}/{groupId}/{nodeId}/{blockNumber}
- 请求方式:GET
- 返回格式:JSON
4.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点编号 |
4 | blockNumber | BigInteger | 否 | 区块高度 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/node/getBlockByNumber/1001/1/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2/1
4.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 区块信息 |
2)出参示例
- 成功:
"code": 0,
"message": "success",
"data": {
"number": 1,
"hash": "0x74ce7bf9daea04cfc9f69a2269f5f524dc62fcc19c7c649d56ded98c064321dd",
"parentHash": "0xcd55822ef3c4bf20cd12a110e0d7d14e436385dd68ed133e4bf48183208943dc",
"nonce": 0,
"sha3Uncles": null,
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"transactionsRoot": "0x623f3f6b4a0bf166d70001876dd5ce6af6d215aa4282e390580e66f65f652eb5",
"stateRoot": "0x286b6bb8045118b1f4429f4155e71847cf2c021dce78bf1ef780c5d131dfe0f2",
"receiptsRoot": "0x5c15415b928ba2726259094659d3753d752e009fd5c36d4e86138e7260890553",
"author": null,
"sealer": "0x1",
"mixHash": null,
"extraData": [],
"gasLimit": 0,
"gasUsed": 0,
"timestamp": 1577777367654,
"transactions": [
{
"hash": "0x2bf33fff3b81d74548079a669333aef601d4d2acaf8d33a31687fac8d5d9c815",
"nonce": 4.2909445613494797e+74,
"blockHash": "0x74ce7bf9daea04cfc9f69a2269f5f524dc62fcc19c7c649d56ded98c064321dd",
"blockNumber": 1,
"transactionIndex": 0,
"from": "0x42446154be80379b68debfdb06682d29d084fad4",
"to": null,
"value": 0,
"gasPrice": 1,
"gas": 100000000,
"input": "0xxx",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"blockNumberRaw": "1",
"transactionIndexRaw": "0",
"nonceRaw": "429094456134947991292268568258086729239801142894854477452577045806616816236",
"gasRaw": "100000000",
"valueRaw": "0",
"gasPriceRaw": "1"
}
],
"uncles": null,
"sealerList": [
"626e1f1df03e217a7a25361444b857ec68003482aabfb24645a67111cbd96ceedc998975e158475605e38b899bc97be7283006a0171f4ec4796972ff6ad55b1a",
"cd3a0d965ca5e5de9edce69245db827a3a253e4868e074020c3f5fb83ca0ae884d5705940c1fc1de550874de0f02374e83eaeb5317b819e420a8ff2e07e4b84c"
],
"timestampRaw": "1577777367654",
"nonceRaw": "0",
"gasUsedRaw": "0",
"gasLimitRaw": "0",
"numberRaw": "1"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.5 获取群组交易总数信息¶
指定节点获取群组交易总数信息。节点和前置一一对应,节点编号可以从前置列表获取。
4.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/getTotalTransactionCount/{chainId}/{nodeId}/{groupId}
- 请求方式:GET
- 返回格式:JSON
4.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/node/getTotalTransactionCount/1001/1/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2
4.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | ||
3.1 | txSum | Int | 否 | 交易总数 |
3.2 | blockNumber | Int | 否 | 当前块高 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"txSum": 74,
"blockNumber": 74
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.6 根据交易hash获取交易信息¶
指定节点根据交易hash获取交易信息。节点和前置一一对应,节点编号可以从前置列表获取。
4.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/getTransactionByHash/{chainId}/{groupId}/{nodeId}/{transHash}
- 请求方式:GET
- 返回格式:JSON
4.6.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点编号 |
4 | transHash | String | 否 | 交易hash |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/node/getTransactionByHash/1001/1/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2/0x2bf33fff3b81d74548079a669333aef601d4d2acaf8d33a31687fac8d5d9c815
4.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 交易信息 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"hash": "0x2bf33fff3b81d74548079a669333aef601d4d2acaf8d33a31687fac8d5d9c815",
"nonce": 4.2909445613494797e+74,
"blockHash": "0x74ce7bf9daea04cfc9f69a2269f5f524dc62fcc19c7c649d56ded98c064321dd",
"blockNumber": 1,
"transactionIndex": 0,
"from": "0x42446154be80379b68debfdb06682d29d084fad4",
"to": "0x0000000000000000000000000000000000000000",
"value": 0,
"gasPrice": 1,
"gas": 100000000,
"input": "0xxxx",
"creates": null,
"publicKey": null,
"raw": null,
"r": null,
"s": null,
"v": 0,
"blockNumberRaw": "1",
"transactionIndexRaw": "0",
"nonceRaw": "429094456134947991292268568258086729239801142894854477452577045806616816236",
"gasRaw": "100000000",
"valueRaw": "0",
"gasPriceRaw": "1"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.7 根据交易hash获取交易回执信息¶
指定节点根据交易hash获取交易回执信息。节点和前置一一对应,节点编号可以从前置列表获取。
4.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/getTransactionReceipt/{chainId}/{groupId}/{nodeId}/{transHash}
- 请求方式:GET
- 返回格式:JSON
4.7.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点编号 |
4 | transHash | String | 否 | 交易hash |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/node/getTransactionReceipt/1001/1/78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2/0x2bf33fff3b81d74548079a669333aef601d4d2acaf8d33a31687fac8d5d9c815
4.7.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 交易回执信息 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"transactionHash": "0x2bf33fff3b81d74548079a669333aef601d4d2acaf8d33a31687fac8d5d9c815",
"transactionIndex": 0,
"blockHash": "0x74ce7bf9daea04cfc9f69a2269f5f524dc62fcc19c7c649d56ded98c064321dd",
"blockNumber": 1,
"gasUsed": 371053,
"contractAddress": "0xff15a64b529be2538826acd6bd436ebdedbc0557",
"root": "0x286b6bb8045118b1f4429f4155e71847cf2c021dce78bf1ef780c5d131dfe0f2",
"status": "0x0",
"message": null,
"from": "0x42446154be80379b68debfdb06682d29d084fad4",
"to": "0x0000000000000000000000000000000000000000",
"input": "0xxxxx",
"output": "0x",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5 合约管理模块¶
5.1 编译合约¶
接口参数为合约文件压缩成zip并Base64编码后的字符串。合约文件需要放在同级目录压缩,涉及引用请使用”./XXX.sol”。可参考测试类ContractControllerTest的testCompileContract()方法。国密和非国密编译的bytecodeBin不一样,合约管理模块以国密为例。
5.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/compile
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
5.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | nodeId | String | 否 | 节点编号 |
3 | contractZipBase64 | String | 是 | 合约源码(合约文件压缩成zip,并Base64编码) |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/contract/compile
{
"chainId": 1001,
"contractZipBase64": "UEsDBBQAAAAIAIqMeFAi98KgkQAAAPwAAAAOAAAASGVsbG9Xb3JsZC5zb2xdjjELwjAQhfdC/8ON7VJE3Iq7k4uDmxDSMwSSi1yugkj/u7GJNPjGe/e+9x6sjFcQg7OTlRfcdsNh2I9towMJKy1wQufCNbCb3m0DSVHYkgFSHsd8wSeSwAXlnG5d5ffl4T6TFhsIDErXJ3QUlRKMMjPFkui//Kzi1B3LHykm0q+pTqK32xRaB2StsCNtuOUDUEsBAj8AFAAAAAgAiox4UCL3wqCRAAAA/AAAAA4AJAAAAAAAAAAgAAAAAAAAAEhlbGxvV29ybGQuc29sCgAgAAAAAAABABgA3EMdrL8B1gGPz3r5xAjWAX8gr5/Rr9UBUEsFBgAAAAABAAEAYAAAAL0AAAAAAA==",
"nodeId": "a89e1fcb189ad740636bbef814388f2782a577cfc8ee9d6e0751bfbb4e3ddb4f0eadde82d5108bc6f3734aef4b04eafcb0911a2166bf47f309c16e31740548d2"
}
5.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 列表 | |
3.1 | Object | 信息对象 | ||
3.1.1 | contractName | String | 否 | 合约名称 |
3.1.2 | contractAbi | String | 否 | 编译合约生成的abi文件内容 |
3.1.3 | bytecodeBin | String | 否 | 合约bytecode binary,用于部署合约 |
3.1.4 | contractSource | String | 否 | 单个合约内容Base64编码 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"contractName": "HelloWorld",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.2 保存合约和更新¶
5.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/save
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
5.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 所属群组编号 |
3 | contractName | String | 否 | 合约名称 |
4 | contractSource | String | 是 | 合约源码,Base64编码 |
5 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
6 | contractBin | String | 是 | 合约运行时binary,用于合约解析 |
7 | bytecodeBin | String | 是 | 合约bytecode binary,用于部署合约 |
8 | contractId | String | 是 | 合约编号(为空时表示新增,不为空表示更新) |
9 | contractPath | String | 否 | 合约所在目录 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/contract/save
{
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"chainId": 1001,
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractBin": "xxx",
"contractName": "HelloWorld",
"contractPath": "/",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"groupId": 1
}
5.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | Int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | chainId | Int | 否 | 链编号 |
3.5 | groupId | Int | 否 | 所属群组编号 |
3.6 | contractStatus | Int | 否 | 1未部署,2已部署 |
3.7 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约,默认0) |
3.8 | contractSource | String | 否 | 合约源码 |
3.9 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.10 | contractBin | String | 是 | 合约运行时binary,用于合约解析 |
3.11 | bytecodeBin | String | 是 | 合约bytecode binary,用于部署合约 |
3.12 | contractAddress | String | 是 | 合约地址 |
3.13 | deployTime | LocalDateTime | 是 | 部署时间 |
3.14 | description | String | 是 | 备注 |
3.15 | createTime | LocalDateTime | 否 | 创建时间 |
3.16 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 400003,
"contractPath": "/",
"contractName": "HelloWorld",
"contractStatus": 1,
"chainId": 1001,
"groupId": 1,
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractBin": "xxx",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2020-04-02 16:17:20",
"modifyTime": "2020-04-02 16:17:20"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.3 查询合约列表¶
5.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/contractList
- 请求方式:POST
- 返回格式:JSON
5.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组id |
3 | contractName | String | 是 | 合约名 |
4 | contractAddress | String | 是 | 合约地址 |
5 | pageSize | Int | 是 | 每页记录数 |
6 | pageNumber | Int | 是 | 当前页码 |
7 | contractStatus | Int | 是 | 1未部署,2已部署 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/contract/contractList
{
"chainId": 1001,
"groupId": 1
}
5.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4 | Object | 返回信息实体 | ||
4.1.1 | contractId | int | 否 | 合约编号 |
4.1.2 | contractPath | String | 否 | 合约所在目录 |
4.1.3 | contractName | String | 否 | 合约名称 |
4.1.4 | chainId | int | 否 | 链编号 |
4.1.5 | groupId | Int | 否 | 所属群组编号 |
4.1.6 | contractStatus | int | 否 | 1未部署,2已部署 |
4.1.7 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
4.1.8 | contractSource | String | 否 | 合约源码 |
4.1.9 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
4.1.10 | contractBin | String | 是 | 合约运行时binary,用于合约解析 |
4.1.11 | bytecodeBin | String | 是 | 合约bytecode binary,用于部署合约 |
4.1.12 | contractAddress | String | 是 | 合约地址 |
4.1.13 | deployTime | LocalDateTime | 是 | 部署时间 |
4.1.14 | description | String | 是 | 备注 |
4.1.15 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.16 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例 |
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 400003,
"contractPath": "/",
"contractName": "HelloWorld",
"contractStatus": 1,
"chainId": 1001,
"groupId": 1,
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractBin": "xxx",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2020-04-02 16:17:20",
"modifyTime": "2020-04-02 16:17:20"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.4 查询合约信息¶
5.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/{contractId}
- 请求方式:GET
- 返回格式:JSON
5.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | contractId | int | 否 | 合约编号 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/contract/400003
5.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | chainId | int | 否 | 链编号 |
3.5 | groupId | Int | 否 | 所属群组编号 |
3.6 | contractStatus | int | 否 | 1未部署,2已部署 |
3.7 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.8 | contractSource | String | 否 | 合约源码 |
3.9 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.10 | contractBin | String | 是 | 合约运行时binary,用于合约解析 |
3.11 | bytecodeBin | String | 是 | 合约bytecode binary,用于部署合约 |
3.12 | contractAddress | String | 是 | 合约地址 |
3.13 | deployTime | LocalDateTime | 是 | 部署时间 |
3.14 | description | String | 是 | 备注 |
3.15 | createTime | LocalDateTime | 否 | 创建时间 |
3.16 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 400003,
"contractPath": "/",
"contractName": "HelloWorld",
"contractStatus": 1,
"chainId": 1001,
"groupId": 1,
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractBin": "xxx",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2020-04-02 16:17:20",
"modifyTime": "2020-04-02 16:17:20"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.5 部署合约¶
调用此接口进行合约部署。
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
5.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/deploy
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
5.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 所属群组编号 |
3 | contractName | String | 否 | 合约名称 |
4 | contractSource | String | 是 | 合约源码 |
5 | contractAbi | String | 否 | 编译合约生成的abi文件内容 |
6 | contractBin | String | 是 | 合约运行时binary,用于合约解析 |
7 | bytecodeBin | String | 否 | 合约bytecode binary,用于部署合约 |
8 | contractId | String | 否 | 合约编号 |
9 | contractPath | String | 否 | 合约所在目录 |
10 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
11 | constructorParams | List | 是 | 构造函数入参,JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] |
12 | nodeId | String | 否 | 节点编号,指定节点调用 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/contract/deploy
{
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"chainId": 1001,
"constructorParams": [
],
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractBin": "xxx",
"contractId": 400003,
"contractName": "HelloWorld",
"contractPath": "/",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"groupId": 1,
"nodeId": "a89e1fcb189ad740636bbef814388f2782a577cfc8ee9d6e0751bfbb4e3ddb4f0eadde82d5108bc6f3734aef4b04eafcb0911a2166bf47f309c16e31740548d2",
"signUserId": "user1001"
}
5.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | chainId | int | 否 | 链编号 |
3.5 | groupId | Int | 否 | 所属群组编号 |
3.6 | contractStatus | int | 否 | 1未部署,2已部署 |
3.7 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.8 | contractSource | String | 否 | 合约源码 |
3.9 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.10 | contractBin | String | 是 | 合约binary |
3.11 | bytecodeBin | String | 是 | 合约bin |
3.12 | contractAddress | String | 是 | 合约地址 |
3.13 | deployTime | LocalDateTime | 是 | 部署时间 |
3.14 | description | String | 是 | 备注 |
3.15 | createTime | LocalDateTime | 否 | 创建时间 |
3.16 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 400003,
"contractPath": "/",
"contractName": "HelloWorld",
"contractStatus": 2,
"chainId": 1001,
"groupId": 1,
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractBin": "xxx",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"contractAddress": "0x377127dbe8c03cf0decf353ac5119f5e7cbcfe97",
"deployTime": "2020-04-02 16:22:44",
"description": null,
"createTime": "2020-04-02 16:17:20",
"modifyTime": "2020-04-02 16:22:44"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.6 发送交易¶
调用此接口发送交易请求,数据上链或查询结果。
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
5.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/transaction
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
5.6.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | groupId | Int | 否 | 所属群组编号 |
3 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
4 | contractName | String | 否 | 合约名称 |
5 | contractId | Int | 否 | 合约编号 |
6 | funcName | String | 否 | 合约方法名 |
7 | contractAddress | String | 是 | 合约地址 |
8 | funcParam | List | 是 | 合约方法入参,JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] |
9 | contractAbi | String | 否 | 所调用合约方法的abi,注意格式(传入所有abi可能导致合约重载方法出问题) |
10 | nodeId | String | 否 | 节点编号,指定节点调用 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/contract/transaction
{
"chainId": 1001,
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]",
"contractId": 400003,
"contractName": "HelloWorld",
"funcName": "get",
"funcParam": [],
"groupId": 1,
"nodeId": "a89e1fcb189ad740636bbef814388f2782a577cfc8ee9d6e0751bfbb4e3ddb4f0eadde82d5108bc6f3734aef4b04eafcb0911a2166bf47f309c16e31740548d2",
"signUserId": "user1001"
}
5.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 上链成功:
{
"code": 0,
"message": "success",
"data": {
"transactionHash": "0x150b562cfe3f8432853925bbed13f3ae549dc5083da9f42a5226f5df18094974",
"transactionIndex": 0,
"blockHash": "0x70ae837060441a087a12e4b6d70a5d76b7c9af3d97ec97035ffefdbe1836e567",
"blockNumber": 177303,
"gasUsed": 44956,
"contractAddress": "0x0000000000000000000000000000000000000000",
"root": "0x98372c72262170a0325f7c162feb2c310f7f43f13aeac42349e62784a98efebe",
"status": "0x0",
"message": null,
"from": "0xdb4ed7a548623c219235aa68156f117dff959a17",
"to": "0x377127dbe8c03cf0decf353ac5119f5e7cbcfe97",
"input": "0x3590b49f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000",
"output": "0x",
"logs": [
{
"removed": false,
"logIndex": null,
"transactionIndex": null,
"transactionHash": null,
"blockHash": null,
"blockNumber": null,
"address": "0x377127dbe8c03cf0decf353ac5119f5e7cbcfe97",
"data": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000",
"type": null,
"topics": [
"0x05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81"
],
"transactionIndexRaw": null,
"logIndexRaw": null,
"blockNumberRaw": null
}
],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}
}
- 查询成功:
{
"code": 0,
"message": "success",
"data": [
"Hello"
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.7 合约状态管理¶
通过预编译合约管理合约状态,根据入参的操作类型进行调用,可以冻结、解冻合约和授权用户操作权限,还可以查询合约状态和合约用户权限列表。
5.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /contract/statusManage
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
5.7.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | nodeId | String | 否 | 节点Id |
4 | signUserId | String | 否 | WeBASE-Sign签名用户编号 |
5 | contractAddress | String | 否 | 已部署的合约地址 |
6 | handleType | String | 否 | 操作类型:freeze-冻结;unfreeze-解冻;grantManager-授权;getStatus-查询合约状态;listManager-查询合约权限列表 |
7 | grantAddress | String | 是 | 授权用户地址,操作类型为grantManager时需传入 |
2)入参示例
http://127.0.0.1:5005/WeBASE-Chain-Manager/contract/statusManage
{
"chainId": 1001,
"contractAddress": "0x1d518bf3fb0edceb18519808edf7ad8adeeed792",
"grantAddress": "",
"groupId": 1,
"handleType": "freeze",
"nodeId": "413c788ec4b55e8170815e1c61977bac8c38f2df8670d09868a6099a044c0bff7884b9c30f3fa9c331358fcbded28f8d0211e2ffc48019c9796fa05274ed89b1",
"signUserId": "user1001"
}
5.7.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 是 | 描述 |
3 | data | String | 是 | 数据 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 205002,
"message": "not fount any front",
"data": null
}
附录¶
1. 返回码信息列表¶
Code | message | 描述 |
---|---|---|
0 | success | 正常 |
105000 | system error | 系统异常 |
205000 | invalid front id | 无效的前置编号 |
205001 | database exception | 数据库异常 |
205002 | not fount any front | 找不到前置 |
205003 | front already exists | 前置已存在 |
205004 | group id cannot be empty | 群组编号不能为空 |
205005 | invalid group id | 无效的群组编号 |
205006 | save front fail | 保存前置失败 |
205007 | request front fail, please check front | 请求前置失败 |
205008 | abiInfo cannot be empty | abi信息不能为空 |
205009 | contract already exists | 合约已存在 |
205010 | invalid contract id | 无效的合约编号 |
205011 | invalid param info | 无效的参数 |
205012 | contract name cannot be repeated | 合约名称不能重复 |
205013 | contract has not deploy | 合约未部署 |
205014 | invalid contract address | 无效的合约地址 |
205015 | contract has been deployed | 合约已部署 |
205016 | contract deploy not success | 合约部署不成功 |
205017 | wrong host or port | 地址或端口错误 |
205018 | group id already exists | 群组编号已存在 |
205019 | node not exists | 节点不存在 |
205020 | front's encrypt type not match | 前置加密类型不匹配 |
205021 | chain name already exists | 链名称已经存在 |
205022 | save chain fail | 保存链失败 |
205023 | invalid chain id | 无效的链编号 |
205024 | user already exists | 用户已存在 |
205025 | publicKey cannot be empty | 公钥不能为空 |
205026 | publicKey's length is 130,address's length is 42 | 公钥或地址长度不对 |
205027 | user id cannot be empty | 用户编号不能为空 |
205028 | invalid user | 无效用户 |
205029 | chain id already exists | 链编号已存在 |
205030 | contract compile error | 合约编译错误 |
205031 | group generate fail | 群组创建失败 |
205032 | group operate fail | 群组操作失败 |
205033 | request node exception | 请求节点异常 |
305000 | param exception | 参数异常 |
附录¶
1. 安装示例¶
1.1 Java部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
1.2 Gradle部署¶
此处给出简单步骤,供快速查阅。更详细的步骤,请参考官网。
(1)从官网下载对应版本的Gradle安装包,并解压到相应目录
mkdir /software/
unzip -d /software/ gradleXXX.zip
(2)配置环境变量
export GRADLE_HOME=/software/gradle-4.9
export PATH=$GRADLE_HOME/bin:$PATH
(3)查看版本
gradle -version
1.3. 数据库部署¶
此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网。
① 安装MariaDB¶
- 安装命令
sudo yum install -y mariadb*
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasechainmanager;
2. 常见问题¶
2.2 构建失败¶
- 执行构建命令
gradle build -x test
抛出异常:
A problem occurred evaluating root project 'WeBASE-Chain-Manager'.
Could not find method compileOnly() for arguments [[org.projectlombok:lombok:1.18.2]] on root project 'WeBASE-Chain-Manager'.
答:
方法1、已安装的Gradle版本过低,升级Gradle版本到4.10以上即可
方法2、直接使用命令:./gradlew build -x test
2.3 数据库问题¶
- 服务访问数据库抛出异常:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
答:检查数据库的网络策略是否开通
下面以centos7为例:
查看防火墙是否开放3306端口: firewall-cmd --query-port=3306/tcp
防火墙永久开放3306端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新启动防火墙:firewall-cmd --reload
- 执行数据库初始化脚本抛出异常:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (110)
答:MySQL没有开通该帐号的远程访问权限,登录MySQL,执行如下命令,其中TestUser改为你的帐号
GRANT ALL PRIVILEGES ON *.* TO 'TestUser'@'%' IDENTIFIED BY '此处为TestUser的密码’' WITH GRANT OPTION;
3. application.yml配置项说明¶
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5005 | 当前服务端口 |
server.servlet.context-path | /WeBASE-Chain-Manager | 当前服务访问目录 |
mybatis.typeAliasesPackage | com.webank.webase.chain.mgr | mapper类扫描路径 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasechainmanager | mysql连接地址 |
spring.datasource.username | defaultAccount | mysql账号 |
spring.datasource.password | defaultPassword | mysql密码 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目录 |
logging.level | com.webank.webase.chain.mgr: info | 日志扫描目录和级别 |
constant.resetGroupListCycle | 600000 | 刷新群组列表任务执行完后,下一个开始间隔(毫秒) |
constant.groupInvalidGrayscaleValue | 1M | 群组失效灰度期长度,灰度期过后,如果还没查到失效状态的群组,就删除(y:年, M:月, d:天, h:小时, m:分钟, n:永远有效) |
constant.frontUrl | http://%1s:%2d/WeBASE-Front/%3s | 前置服务的请求路径 |
constant.httpTimeOut | 5000 | http请求超时时间(毫秒) |
constant.contractDeployTimeOut | 30000 | 合约部署超时时间(毫秒) |
constant.maxRequestFail | 3 | 请求前置(frot)被允许失败次数,达到配置值后,将会停止往该路径发送请求 |
constant.sleepWhenHttpMaxFail | 60000 | 请求失败次数过多,熔断时间长度(毫秒) |
executor.corePoolSize | 3 | 线程池大小 |
executor.maxPoolSize | 10 | 线程池最大线程数 |
executor.queueSize | 50 | 线程池队列大小 |
executor.threadNamePrefix | "chain-mgr-async-" | 线程名前缀 |
数据统计服务¶
概要介绍¶
WeBASE-Stat为微众区块链中间件平台-数据统计服务子系统,统计数据服务以前置为基础,拉取CPU、内存、IO、群组大小、群组gas、群组网络流量的数据,记录数据库。主要包括以下模块:
序号 | 模块 | 描述 |
---|---|---|
1 | 前置管理 | 维护WeBASE-Front服务信息,可以新增、查询和删除前置(调用请查看接口说明1) |
2 | 群组管理 | 查询前置群组信息(调用请查看接口说明2) |
3 | 数据管理 | 查询统计数据信息(调用请查看接口说明3)、定时拉取数据(后台定时处理) |
部署和接口说明如下:
部署说明¶
1. 前提条件¶
序号 | 软件 |
---|---|
1 | FISCO-BCOS 2.7+ |
2 | WeBASE-Front 1.4.0+ |
3 | MySQL5.6或以上版本 1.4.0+ |
4 | Java8或以上版本 |
2. 注意事项¶
3. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Stat.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Stat.git
进入目录:
cd WeBASE-Stat
4. 编译代码¶
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上。
- 安装gradle可以参考 gradle安装示例
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Stat下生成已编译的代码目录dist。
5. 数据库初始化¶
5.1 新建数据库¶
#登录MySQL: 例如:mysql -u root -p123456
mysql -u ${your_db_account} -p${your_db_password}
#新建数据库:默认数据库名为webasestat
CREATE DATABASE IF NOT EXISTS {your_db_name} DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
6. 服务配置及启停¶
6.1 服务配置修改¶
(1)回到dist目录,dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改服务配置,完整配置项说明请查看 配置说明
修改服务端口:sed -i "s/5008/${your_server_port}/g" conf/application.yml
修改数据库IP:sed -i "s/127.0.0.1/${your_db_ip}/g" conf/application.yml
修改数据库端口:sed -i "s/3306/${your_db_port}/g" conf/application.yml
修改数据库名称:sed -i "s/webasestat/${your_db_name}/g" conf/application.yml
修改数据库用户:sed -i "s/defaultAccount/${your_db_account}/g" conf/application.yml
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" conf/application.yml
6.2 服务启停¶
在dist目录下执行:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启。如果提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
7. 访问¶
可以通过swagger查看调用接口:
http://{deployIP}:{deployPort}/WeBASE-Stat/swagger-ui.html
示例:http://localhost:5008/WeBASE-Stat/swagger-ui.html
备注:
- 部署服务器IP和服务端口需对应修改,网络策略需开通
接口说明¶
[TOC]
1 前置管理模块¶
1.1 新增节点前置信息¶
1.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /front/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 节点编号 |
2 | frontIp | String | 否 | 前置ip |
3 | frontPort | Int | 否 | 前置服务端口 |
5 | description | String | 是 | 备注 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/front/add
{
"frontId": 1001,
"frontIp": "127.0.0.1",
"frontPort": 5002,
"description": "test"
}
2.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | frontId | Int | 否 | 前置编号 |
3.2 | frontIp | String | 否 | 前置ip |
3.3 | frontPort | Int | 否 | 前置端口 |
3.4 | memoryTotalSize | String | 否 | 内存总量(单位:KB) |
3.5 | memoryUsedSize | String | 否 | 内存使用量(单位:KB) |
3.6 | cpuSize | String | 否 | CPU的大小(单位:MHz) |
3.7 | cpuAmount | String | 否 | CPU的核数(单位:个) |
3.8 | diskTotalSize | String | 否 | 文件系统总量(单位:KB) |
3.9 | diskUsedSize | String | 否 | 文件系统已使用量(单位:KB) |
3.10 | description | String | 是 | 备注 |
3.11 | createTime | LocalDateTime | 否 | 落库时间 |
3.12 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"frontId": 1001,
"frontIp": "127.0.0.1",
"frontPort": 5302,
"memoryTotalSize": "8008840",
"memoryUsedSize": "7652872",
"cpuSize": "2599",
"cpuAmount": "4",
"diskTotalSize": "51474044",
"diskUsedSize": "44137936",
"description": "dd",
"createTime": "2020-04-29T12:15:40",
"modifyTime": "2020-05-03T12:04:08"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.2 获取所有前置列表¶
1.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/list?frontId={frontId}
- 请求方式:GET
- 返回格式:JSON
1.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 是 | 前置编号 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/front/list?frontId=1001
1.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | frontId | Int | 否 | 前置编号 |
4.1.2 | frontIp | String | 否 | 前置ip |
4.1.3 | frontPort | Int | 否 | 前置端口 |
4.1.4 | memoryTotalSize | String | 否 | 内存总量(单位:KB) |
4.1.5 | memoryUsedSize | String | 否 | 内存使用量(单位:KB) |
4.1.6 | cpuSize | String | 否 | CPU的大小(单位:MHz) |
4.1.7 | cpuAmount | String | 否 | CPU的核数(单位:个) |
4.1.8 | diskTotalSize | String | 否 | 文件系统总量(单位:KB) |
4.1.9 | diskUsedSize | String | 否 | 文件系统已使用量(单位:KB) |
4.1.10 | description | String | 是 | 备注 |
4.1.11 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.12 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontId": 1001,
"frontIp": "127.0.0.1",
"frontPort": 5302,
"memoryTotalSize": "8008840",
"memoryUsedSize": "7652872",
"cpuSize": "2599",
"cpuAmount": "4",
"diskTotalSize": "51474044",
"diskUsedSize": "44137936",
"description": "dd",
"createTime": "2020-04-29T12:15:40",
"modifyTime": "2020-05-03T12:04:08"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.3 删除前置信息¶
1.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/{frontId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/front/1001
1.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2 群组管理模块¶
2.1 获取群组列表¶
2.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/list/{frontId}
- 请求方式:GET
- 返回格式:JSON
2.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/group/list/1001
2.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | frontId | Int | 否 | 前置编号 |
4.1.2 | groupId | Int | 否 | 群组编号 |
4.1.3 | description | String | 是 | 描述 |
4.1.4 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.5 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontId": 1001,
"groupId": 1,
"description": null,
"createTime": "2020-04-29T12:15:40",
"modifyTime": "2020-04-29T12:15:40"
},
{
"frontId": 1001,
"groupId": 2,
"description": null,
"createTime": "2020-04-29T12:15:40",
"modifyTime": "2020-04-29T12:15:40"
}
],
"totalCount": 2
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3 数据管理模块¶
3.1 查询群组基本数据¶
3.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/data/groupBasicData?frontId={frontId}&groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}
- 请求方式:GET
- 返回格式:JSON
3.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
6 | endDate | LocalDateTime | 是 | 结束时间 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/data/groupBasicData?frontId=1001&groupId=1&pageSize=1&pageNumber=1&beginDate=2020-04-30T16%3A57%3A35&endDate=2020-04-30T22%3A57%3A35
3.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 编号 |
4.1.2 | frontId | Int | 否 | 前置编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | size | Long | 否 | 群组大小 |
4.1.5 | transCount | Long | 否 | 群组交易数量 |
4.1.6 | comment | String | 否 | 备注 |
4.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 13475,
"frontId": 1001,
"groupId": 1,
"size": 17157,
"transCount": 121,
"comment": null,
"createTime": "2020-04-30T20:21:23",
"modifyTime": "2020-04-30T20:21:23"
}
],
"totalCount": 14
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.2 查询群组网络基本数据¶
3.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/data/netWorkData?frontId={frontId}&groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}
- 请求方式:GET
- 返回格式:JSON
3.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
6 | endDate | LocalDateTime | 是 | 结束时间 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/data/netWorkData?frontId=1001&groupId=1&pageSize=1&pageNumber=1&beginDate=2020-04-30T16%3A57%3A35&endDate=2020-04-30T17%3A57%3A35
3.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 编号 |
4.1.2 | frontId | Int | 否 | 前置编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | totalIn | Long | 否 | 总入流量(P2P_InBytes + SDK_InBytes) |
4.1.5 | totalOut | Long | 否 | 总出流量(P2P_OutBytes + SDK_OutBytes) |
4.1.6 | timestamp | Long | 否 | 统计时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 202055,
"frontId": 1001,
"groupId": 1,
"totalIn": 91952,
"totalOut": 92934,
"timestamp": 1588240648000
}
],
"totalCount": 60
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.3 查询群组GAS基本数据¶
3.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/data/gasData?frontId={frontId}&groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}
- 请求方式:GET
- 返回格式:JSON
3.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
6 | endDate | LocalDateTime | 是 | 结束时间 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/data/gasData?frontId=1001&groupId=1&pageSize=1&pageNumber=1&beginDate=2020-04-20T16%3A57%3A35&endDate=2020-04-30T16%3A57%3A35
3.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 编号 |
4.1.2 | frontId | Int | 否 | 前置编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | transHash | String | 否 | 交易hash |
4.1.5 | gasUsed | Long | 否 | 交易消耗的gas |
4.1.6 | timestamp | Long | 否 | 统计时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 123,
"frontId": 1001,
"groupId": 1,
"transHash": "0x1c232b58a6bf7a718d1434f160b6aa4dbbc9b65e831a2a10f9e36ffaa8b88ac6",
"gasUsed": 41758,
"timestamp": 1588230163000
}
],
"totalCount": 54
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.4 查询群组节点监控基本数据¶
3.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/data/nodeMonitor?frontId={frontId}&groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}
- 请求方式:GET
- 返回格式:JSON
3.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
6 | endDate | LocalDateTime | 是 | 结束时间 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/data/nodeMonitor?frontId=1001&groupId=1&pageSize=1&pageNumber=1&beginDate=2020-04-30T16%3A57%3A35&endDate=2020-04-30T18%3A57%3A35
3.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 编号 |
4.1.2 | frontId | Int | 否 | 前置编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | blockHeight | Long | 否 | 块高 |
4.1.5 | pbftView | Long | 否 | view |
4.1.6 | pendingTransactionCount | Int | 否 | 待交易数 |
4.1.7 | timestamp | Long | 否 | 统计时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 44144,
"frontId": 1001,
"groupId": 1,
"blockHeight": 121,
"pbftView": 11754,
"pendingTransactionCount": 0,
"timestamp": 1588242055000
}
],
"totalCount": 1001
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.5 查询群组主机性能基本数据¶
3.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/data/serverPerformance?frontId={frontId}&pageSize={pageSize}&pageNumber={pageNumber}&beginDate={beginDate}&endDate={endDate}
- 请求方式:GET
- 返回格式:JSON
3.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | pageNumber | Int | 否 | 当前页码 |
4 | beginDate | LocalDateTime | 是 | 开始时间(yyyy-MM-dd'T'HH:mm:ss.SSS 2019-03-13T00:00:00) |
5 | endDate | LocalDateTime | 是 | 结束时间 |
2)入参示例
http://127.0.0.1:5008/WeBASE-Stat/data/serverPerformance?frontId=1001&pageSize=1&pageNumber=1&beginDate=2020-04-20T16%3A57%3A35&endDate=2020-04-30T16%3A57%3A35
3.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | id | Long | 否 | 编号 |
4.1.2 | frontId | Int | 否 | 前置编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | cpuUseRatio | BigDecimal | 否 | cpu利用率 |
4.1.5 | diskUseRatio | BigDecimal | 否 | 硬盘利用率 |
4.1.6 | memoryUseRatio | BigDecimal | 否 | 内存利用率 |
4.1.7 | rxbps | BigDecimal | 否 | 上行bandwith |
4.1.8 | txbps | BigDecimal | 否 | 下行bandwith |
4.1.9 | timestamp | Long | 否 | 统计时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 22078,
"frontId": 1001,
"cpuUseRatio": 10,
"diskUseRatio": 89,
"memoryUseRatio": 72,
"rxbps": 21,
"txbps": 21,
"timestamp": 1588240650003
}
],
"totalCount": 502
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
附录¶
1. 安装示例¶
1.1 Java部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
1.2 Gradle部署¶
此处给出简单步骤,供快速查阅。更详细的步骤,请参考官网。
(1)从官网下载对应版本的Gradle安装包,并解压到相应目录
mkdir /software/
unzip -d /software/ gradleXXX.zip
(2)配置环境变量
export GRADLE_HOME=/software/gradle-4.9
export PATH=$GRADLE_HOME/bin:$PATH
(3)查看版本
gradle -version
1.3 数据库部署¶
此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网。
① 安装MariaDB¶
- 安装命令
sudo yum install -y mariadb*
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasechainmanager;
2. 常见问题¶
2.2 构建失败¶
- 执行构建命令
gradle build -x test
抛出异常:
A problem occurred evaluating root project 'WeBASE-Stat'.
Could not find method compileOnly() for arguments [[org.projectlombok:lombok:1.18.2]] on root project 'WeBASE-Stat'.
答:
方法1、已安装的Gradle版本过低,升级Gradle版本到4.10以上即可
方法2、直接使用命令:./gradlew build -x test
2.3 数据库问题¶
- 服务访问数据库抛出异常:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
答:检查数据库的网络策略是否开通
下面以centos7为例:
查看防火墙是否开放3306端口: firewall-cmd --query-port=3306/tcp
防火墙永久开放3306端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新启动防火墙:firewall-cmd --reload
- 执行数据库初始化脚本抛出异常:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (110)
答:MySQL没有开通该帐号的远程访问权限,登录MySQL,执行如下命令,其中TestUser改为你的帐号
GRANT ALL PRIVILEGES ON *.* TO 'TestUser'@'%' IDENTIFIED BY '此处为TestUser的密码’' WITH GRANT OPTION;
3. application.yml配置项说明¶
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5008 | 当前服务端口 |
server.servlet.context-path | /WeBASE-Stat | 当前服务访问目录 |
mybatis.typeAliasesPackage | com.webank.webase.stat | mapper类扫描路径 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasestat | mysql连接地址 |
spring.datasource.username | defaultAccount | mysql账号 |
spring.datasource.password | defaultPassword | mysql密码 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目录 |
logging.level | com.webank.webase.stat: info | 日志扫描目录和级别 |
constant.pageSize | 100 | 每次拉取条数 |
constant.updateFrontInfoInterval | 600000 | 更新前置信息时间间隔(毫秒) |
constant.resetGroupListInterval | 60000 | 刷新群组信息时间间隔(毫秒) |
constant.pullGroupBasicDataInterval | 60000 | 拉取群组基本信息时间间隔(毫秒) |
constant.pullNetWorkDataInterval | 5000 | 拉取网络流量数据时间间隔(毫秒) |
constant.pullGasDataInterval | 5000 | 拉取gas数据时间间隔(毫秒) |
constant.pullNodeMonitorInterval | 5000 | 拉取节点监控数据时间间隔(毫秒) |
constant.pullServerPerformanceInterval | 5000 | 拉取服务器性能信息时间间隔(毫秒) |
constant.httpTimeOut | 10000 | http请求超时时间(毫秒) |
executor.corePoolSize | 50 | 线程池大小 |
executor.maxPoolSize | 100 | 线程池最大线程数 |
executor.queueSize | 50 | 线程池队列大小 |
executor.threadNamePrefix | "stat-async-" | 线程名前缀 |
数据监管服务¶
概要介绍¶
随着区块链的广泛应用,区块链相关应用的监管变成了一个现实问题。区块链应用有其自身的特点——其业务数据是由共识实时确认,并且由各个机构冗余存储。这些特性给监管带来了新机遇——能够实时同步和自主存储业务数据,并进行监管分析。与此同时区块链的数据存储结构又异于传统的DB存储结构,在进行业务分析和监管分析前必须有专用的工具服务来进行数据处理。
WeBASE-Data为微众区块链中间件平台-数据监管服务,导出区块链数据并解析,提供一个可视化的监管视图。包括三个子系统:WeBASE-Data-Collect(监管数据导出和分析服务)、WeBASE-Data-Fetcher(监管数据查询服务)、WeBASE-Data-Web(数据监管平台)。
主要提供以下功能:
- 拉取链上数据。
- 配置群组和节点信息。
- 配置合约和用户,解析交易。
- 查看链上的交易数量和交易详情。
- 通过关键字搜索,查询交易属于哪条链,哪个用户,哪个合约。保证链上数据可查可管。
部署和使用说明如下:
部署说明¶
1 环境准备¶
依赖软件 | 支持版本 |
---|---|
FISCO BCOS | 2.5.0或以上版本 |
WeBASE-Front | 1.4.0或以上版本 |
Java | JDK8或以上版本 |
MySQL | 5.6或以上版本 |
Elasticsearch | 7.8.0(使用ES时部署) |
elasticsearch-analysis-ik | 7.8.0(使用ES时部署) |
Nginx | nginx1.6或以上版本 |
2. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Data.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Data.git
3 WeBASE-Data-Collect搭建¶
WeBASE-Data-Collect为监管数据导出和分析服务,自带配置页面,支持配置多个链,并通过添加区块链前置来获取区块链数据。同时可以配置应用相关信息,合约和用户信息。
3.1 编译代码¶
进入目录:
cd WeBASE-Data/WeBASE-Data-Collect
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在目录WeBASE-Data-Collect下生成已编译的代码目录dist。
3.2 数据库初始化¶
(1)新建数据库
#登录MySQL:
mysql -u ${your_db_account} -p${your_db_password}
例如:mysql -u root -p123456
#新建数据库:
CREATE DATABASE IF NOT EXISTS {your_db_name} DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
例如:CREATE DATABASE IF NOT EXISTS webasedata DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
(2)修改脚本配置
进入数据库脚本目录script
cd dist/script
修改数据库连接信息:
修改数据库名称:sed -i "s/webasedata/${your_db_name}/g" webase.sh
修改数据库用户名:sed -i "s/defaultAccount/${your_db_account}/g" webase.sh
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" webase.sh
例如:将数据库用户名修改为root,则执行:
sed -i "s/defaultAccount/root/g" webase.sh
(3)运行数据库脚本
bash webase.sh ${dbIP} ${dbPort}
例如:bash webase.sh 127.0.0.1 3306
3.3 配置修改¶
(1)回到dist目录,dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改配置文件conf/applicationyml,主要修改数据库连接和es连接信息,完整配置项说明请查看 配置项说明(附录3.1)
- 服务端口,默认不修改。
- 数据库连接(数据库名需事先创建)。
- 需要需要将交易数据存入elasticsearch的话,需要将ifEsEnable设置成true,并配置IP端口和用户名密码。不使用则不需要修改。使用elasticsearch的话,需先部署elasticsearch,再部署WeBASE-Data。
...
server:
port: 5009
servlet:
context-path: /WeBASE-Data-Collect
# database connection configuration
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/webasedata?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username: "defaultAccount"
password: "defaultPassword"
elasticsearch:
rest:
uris: 127.0.0.1:9200
username: "elasticAccount"
password: "elasticPassword"
# constants
constant:
## if use elasticsearch
ifEsEnable: false
...
3.4 服务启停¶
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启。如果提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
3.5 访问¶
配置页面访问:
http://{deployIP}:{deployPort}/WeBASE-Data-Collect
示例:http://localhost:5009/WeBASE-Data-Collect
- 部署服务器IP和服务端口需对应修改,网络策略需开通
3.6 查看日志¶
全量日志:tail -f log/WeBASE-Data-Collect.log
错误日志:tail -f log/WeBASE-Data-Collect-error.log
4 WeBASE-Data-Fetcher搭建¶
WeBASE-Data-Fetcher为监管数据查询服务,向WeBASE-Data-Web服务提供数据查询接口。
4.1 编译代码¶
返回WeBASE-Data目录并进入WeBASE-Data-Fetcher目录。
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在目录WeBASE-Data-Fetcher下生成已编译的代码目录dist。
4.2 配置修改¶
(1)dist目录,dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改配置文件conf/applicationyml,完整配置项说明请查看 配置项说明(附录3.2)
- 服务端口,默认不修改。
- 数据库连接(数据库名需事先创建,需要和WeBASE-Data-Collect服务连接相同的数据库)。
- 如果需要进行搜索,查询elasticsearch里的交易数据,需要将ifEsEnable设置成true,并配置IP端口和用户名密码。不使用则不需要修改。使用elasticsearch的话,需先部署elasticsearch,再部署WeBASE-Data。
# server config
server:
port: 5010
servlet:
context-path: /WeBASE-Data-Fetcher
# database connection configuration
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/webasedata?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username: "defaultAccount"
password: "defaultPassword"
elasticsearch:
rest:
uris: 127.0.0.1:9200
username: "elasticAccount"
password: "elasticPassword"
# constant config
constant:
## if use elasticsearch
ifEsEnable: false
...
4.3 服务启停¶
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启。如果提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
4.4 访问¶
没有单独页面,可以通过swagger查看调用接口:
http://{deployIP}:{deployPort}/WeBASE-Data-Fetcher/swagger-ui.html
示例:http://localhost:5010/WeBASE-Data-Fetcher/swagger-ui.html
- 部署服务器IP和服务端口需对应修改,网络策略需开通
4.5 查看日志¶
全量日志:tail -f log/WeBASE-Data-Fetcher.log
错误日志:tail -f log/WeBASE-Data-Fetcher-error.log
5 WeBASE-Data-Web搭建¶
WeBASE-Data-Web为数据监管平台,提供数据浏览页面。
5.2 配置修改¶
在docs目录下有配置文件nginx.conf,修改完后替换安装的nginx的配置文件nginx.conf(这里nginx安装配置文件在/usr/local/nginx/conf下面,如果这里没找到,可以到/etc下寻找,如有权限问题,请加上sudo)。
- 修改配置:
# 修改服务器ip,也可以使用域名
sed -i "s%127.0.0.1%${your_ip}%g" docs/nginx.conf
# 修改WeBASE-Data-Web服务端口(端口需要开通策略且不能被占用)
sed -i "s%5200%${your_port}%g" docs/nginx.conf
# 修改静态文件路径(文件需要有权限访问)
sed -i "s%/data/WeBASE-Data-Web/dist%${your_file_dir}%g" docs/nginx.conf
# WeBASE-Data-Fetcher服务ip和端口
sed -i "s%10.0.0.1:5010%${your_fetcher}%g" docs/nginx.conf
- 复制配置文件nginx.conf
cp -rf docs/nginx.conf /usr/local/nginx/conf
备注: 如果服务器已有nginx,可在原配置文件nginx.conf增加一个server:
upstream data_server{
server 10.0.0.1:5010; # WeBASE-Data-Fetcher服务ip和端口
}
server {
listen 5200 default_server; # 前端端口(端口需要开通策略且不能被占用)
server_name 127.0.0.1; # 服务器ip,也可配置为域名
location / {
root /WeBASE-Data/WeBASE-Data-Web/dist; # 前端文件路径(对应修改文件需要有权限访问)
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
include /etc/nginx/default.d/*.conf;
location /mgr {
proxy_pass http://data_server/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
5.3 启动nginx¶
启动命令:
/usr/local/nginx/sbin/nginx # nginx在/usr/local目录下
检查nginx是否启动:
ps -ef | grep nginx
5.5 查看日志¶
进程日志:tail -f logs/access.log
错误日志:tail -f logs/eror.log
使用手册¶
1. 简介¶
本文将用一个实例来说明数据监管服务的部署和使用。实例详情如下图:从下至上我们可以看到:
- 部署两条物理链,包括四个区块链应用(后面以存证链为例存证链)。
- 监管机构在每一套链中都有一个监管节点用于同步数据。
- 监管节点之上部署了一个WeBASE-Front(区块链节点前置),这个服务主要作用是代理节点,提供restful的接口。
- 在WeBASE-Front之上是WeBASE-Data-Collect(监管数据导出和分析服务),这个服务主要用于导出数据到DB和ES,用于分析。
- WeBASE-Data-Collect(监管数据导出和分析服务)之上是WeBASE-Data-Fetcher(监管数据查询服务),这个服务主要的功能是对外提供数据查询服务。
- WeBASE-Data-Web(数据监管平台)是一个网页服务,对外提供数据展示和交互UI。
3. 数据上链(mock数据,真实环境有数据不需要此步骤)¶
根据部署说明将数据监管平台搭建成功后,可以通过WeBASE-Front(节点前置服务)模拟存证交易(默认:http://localhost:5002/WeBASE-Front)。
首先,创建测试用户,供交易使用
节点前置服务已内置存证合约,可以使用该存证合约将存证数据上链。过程包括:合约编译、合约部署、调用合约将存证数据上链。
合约编译:
合约部署,部署时私钥地址选择创建的测试用户地址。存证合约部署时需要设置签名用户地址,可以使用测试用户地址作为参数。
合约调用,调用合约将存证数据上链。
4. 运维配置¶
WeBASE-Data-Collect服务搭建成功后,可使用网页浏览器访问管理平台配置页面(默认:http://localhost:5009/WeBASE-Data-Collect)。
4.3 设置应用信息和节点机构信息¶
前置添加完成后,管理平台就会开始拉取群组信息和群组的区块信息。此时链管理下应该就有相关数据了。可以通过修改按钮设置应用信息(每个应用对应一个群组)。还可以设置链下节点机构信息。
应用信息:
节点机构信息,节点编号可以通过节点目录下个的node.nodeid文件获取,如:nodes/127.0.0.1/node0/conf/node.nodeid
4.4 合约管理¶
为了解析和审计区块数据,需要把相关的合约导入到管理平台。
管理平台提供支持导入已有合约(支持同时选择多个合约文件上传)。同时合约编辑器还提供新建目录,用目录的形式管理合约,主要是为了解决同名合约引用的问题。合约添加完成后,需要编译保存。
将存证合约Evidence.sol、EvidenceFactory.sol上传编译,注意选择编译器版本(国密版本名称带有gm字样)
5. 平台使用¶
WeBASE-Data-Fetcher和WeBASE-Data-Web服务搭建成功后,可使用网页浏览器访问数据监管平台(默认:http://127.0.0.1:5200)。
5.1 搜索页¶
搜索页展示全局数据概览:链数量,应用数量,用户数量,智能合约数量,区块数量,交易数量。
搜索支持关键字搜索和条件搜索。条件搜索包括区块搜索、交易搜索、用户搜索、合约搜索。
其中,交易搜索出的交易数据如果需要监管处理,可以通过介入处理按钮添加到监管告警列表。
如下搜索出存证上链的数据:
5.2 区块链数据概览¶
区块链概览页展示链列表信息,以及链下应用和节点信息。
通过应用跳转到具体应用数据概览页面,页面展示了区块链应用的核心数据指标:用户数量,合约数量,区块数量,交易数量。关键监控指标:最近7天的交易量。
- 节点信息列表:展示了节点的ID,所属机构,节点块高,节点view和运行状态;
- 区块信息列表:展示了最近区块的概览信息,点击更多可以查看更多历史区块;
- 交易信息列表:展示了最近交易的概览信息,点击更多可以查看更多历史交易;
其中右下角的交易信息列表点击可跳入具体一条交易中查看交易详细信息:交易详细信息还包含了
- 交易解析:可以将交易返回的交易回执数据进行解析并可视化;
- Event解析:可以将交易返回的Event数据进行解析并可视化;
接口说明¶
WeBASE-Data-Collect接口说明¶
1 区块链管理模块¶
1.1 新增链信息¶
- 网络传输协议:使用HTTP协议
- 请求地址: /chain/new
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号(1~9999) |
2 | chainName | String | 否 | 链名称 |
3 | encryptType | Int | 否 | 链加密类型(0-非国密,1-国密) |
4 | description | String | 是 | 备注 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/chain/new
{
"chainId": 1,
"chainName": "链一",
"encryptType": 0,
"description": "test"
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | chainId | Int | 否 | 链编号 |
3.2 | chainName | String | 否 | 链名称 |
3.3 | chainType | Int | 否 | 链类型( 0-fisco 1-fabric) |
3.4 | encryptType | Int | 否 | 链加密类型(0-非国密,1-国密) |
3.5 | description | String | 是 | 备注 |
3.6 | createTime | LocalDateTime | 否 | 落库时间 |
3.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"chainId": 1,
"chainName": "链一",
"chainType": 0,
"encryptType": 0,
"description": "test"
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 209001,
"message": "chain id already exists",
"data": {}
}
1.2 修改链信息¶
- 网络传输协议:使用HTTP协议
- 请求地址: /chain/update
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | chainName | String | 否 | 链名称 |
3 | description | String | 是 | 备注 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/chain/update
{
"chainId": 1,
"chainName": "链一",
"description": "test"
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | chainId | Int | 否 | 链编号 |
3.2 | chainName | String | 否 | 链名称 |
3.3 | chainType | Int | 否 | 链类型( 0-fisco 1-fabric) |
3.4 | encryptType | Int | 否 | 链加密类型(0-非国密,1-国密) |
3.5 | description | String | 是 | 备注 |
3.6 | createTime | LocalDateTime | 否 | 落库时间 |
3.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"chainId": 1,
"chainName": "链一",
"chainType": 0,
"encryptType": 0,
"description": "test"
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
}
- 失败:
{
"code": 209006,
"message": "chain id not exists",
"data": {}
}
1.3 获取链列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/all
- 请求方式:GET
- 返回格式:JSON
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | chainId | Int | 否 | 链编号 |
4.1.2 | chainName | String | 否 | 链名称 |
4.1.3 | chainType | Int | 否 | 链类型( 0-fisco 1-fabric) |
4.1.4 | encryptType | Int | 否 | 链加密类型(0-非国密,1-国密) |
4.1.5 | description | String | 是 | 备注 |
4.1.6 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"chainId": 1,
"chainName": "链一",
"chainType": 0,
"encryptType": 0,
"description": "test"
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
],
"totalCount": 1
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
1.4 删除链信息¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/{chainId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/chain/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "success"
}
- 失败:
{
"code": 209004,
"message": "invalid chain id",
"data": {}
}
1.5 查询数据拉取开关¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/togglePullData
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 信息对象 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": true
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
1.6 修改数据拉取开关¶
- 网络传输协议:使用HTTP协议
- 请求地址: /chain/update
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | enable | boolean | 否 | 是否启用开关(true-开启;false-关闭) |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/chain/togglePullData
{
"enable": false
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 信息对象 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
2 前置管理模块¶
2.1 新增节点前置¶
- 网络传输协议:使用HTTP协议
- 请求地址: /front/new
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | frontIp | String | 否 | 前置ip |
3 | frontPort | Int | 否 | 前置服务端口 |
4 | agency | Int | 否 | 所属机构 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/front/new
{
"chainId": 1,
"frontIp": "localhost",
"frontPort": "5002",
"agency": "test"
}
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | frontId | Int | 否 | 前置编号 |
3.2 | chainId | Int | 否 | 链编号 |
3.3 | frontIp | String | 否 | 前置ip |
3.4 | frontPort | Int | 否 | 前置端口 |
3.5 | nodeId | String | 否 | 节点编号 |
3.6 | agency | String | 否 | 所属机构 |
3.7 | createTime | LocalDateTime | 是 | 落库时间 |
3.8 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"chainId": 1,
"frontId": 1,
"nodeId": "944607f7e83efe2ba72476dc39a269a910811db8caac34f440dd9c9dd8ec2490b8854b903bd6c9b95c2c79909649977b8e92097c2f3ec32232c4f655b5a01850",
"frontIp": "localhost",
"frontPort": 5002,
"agency": "test",
"createTime": null,
"modifyTime": null
}
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
2.2 获取所有前置列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/list?chainId={chainId}?frontId={frontId}&groupId={groupId}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 是 | 链编号 |
2 | frontId | Int | 是 | 前置编号 |
3 | groupId | Int | 是 | 群组编号 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/front/list
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | frontId | Int | 否 | 前置编号 |
4.1.2 | chainId | Int | 否 | 链编号 |
4.1.3 | frontIp | String | 否 | 前置ip |
4.1.4 | frontPort | Int | 否 | 前置端口 |
4.1.5 | nodeId | String | 否 | 节点编号 |
4.1.6 | agency | String | 否 | 所属机构 |
4.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"chainId": 1,
"frontId": 1,
"nodeId": "944607f7e83efe2ba72476dc39a269a910811db8caac34f440dd9c9dd8ec2490b8854b903bd6c9b95c2c79909649977b8e92097c2f3ec32232c4f655b5a01850",
"frontIp": "localhost",
"frontPort": 5002,
"agency": "test",
"createTime": "2020-05-20 20:22:35",
"modifyTime": "2020-05-20 20:22:35"
}
],
"totalCount": 1
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
2.3 删除前置信息¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/{frontId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/front/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
3 群组管理模块¶
3.1 获取群组列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/list/{chainId}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/group/list/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | chainId | Int | 否 | 链编号 |
4.1.2 | groupId | Int | 否 | 群组编号 |
4.1.3 | appName | String | 否 | 应用名称 |
4.1.4 | appVersion | String | 是 | 应用版本号 |
4.1.5 | appSummary | String | 是 | 应用概要介绍 |
4.1.6 | genesisBlockHash | String | 否 | 创世块hash |
4.1.7 | groupStatus | Int | 否 | 群组状态 |
4.1.8 | nodeCount | Int | 否 | 节点个数 |
4.1.9 | description | String | 否 | 应用描述 |
4.1.10 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"chainId": 1,
"groupId": 1,
"appName": "APP1",
"appVersion": "v1.0.0",
"appSummary": "存证",
"genesisBlockHash": "0x7bc361d7d8e078ea9e8f352f2b856d6ea76ab1b9522f4b09853c861d0ed0779f",
"groupStatus": 1,
"nodeCount": 2,
"description": "test",
"createTime": "2020-05-20 20:22:35",
"modifyTime": "2020-05-20 20:31:38"
},
{
"chainId": 1,
"groupId": 2,
"appName": "APP2",
"appVersion": "v1.0.0",
"appSummary": "供应链",
"genesisBlockHash": "0x1208de0d47dcba9447d304039d1e4512dd4ce740ec408ef83c5f7ee2aefc7468",
"groupStatus": 1,
"nodeCount": 2,
"description": "test",
"createTime": "2020-05-20 20:22:36",
"modifyTime": "2020-05-20 20:31:38"
}
],
"totalCount": 2
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
3.2 修改群组对应的应用信息¶
- 网络传输协议:使用HTTP协议
- 请求地址: /group/update
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | appName | String | 是 | 应用名称 |
4 | appVersion | String | 是 | 应用版本号 |
5 | appSummary | String | 是 | 应用概要介绍 |
6 | description | String | 是 | 应用描述 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/group/update
{
"chainId": 1,
"groupId": 1,
"appName": "存证",
"appVersion": "v1.0.0",
"appSummary": "存证测试",
"description": "这是一个存证应用"
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
4 节点管理模块¶
4.1 查询群组节点列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/list/{chainId}/{groupId}/{pageNumber}/{pageSize}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | nodeId | String | 是 | 节点编号 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/node/nodeList/100001/300001/1/10
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 节点列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | chainId | int | 否 | 链编号 |
4.1.2 | nodeId | String | 否 | 节点编号 |
4.1.3 | nodeName | string | 否 | 节点名称 |
4.1.4 | groupId | int | 否 | 所属群组编号 |
4.1.5 | orgName | string | 是 | 机构名称 |
4.1.6 | nodeActive | int | 否 | 共识状态(1正常,2不正常) |
4.1.7 | nodeIp | string | 是 | 节点ip |
4.1.8 | P2pPort | int | 是 | 节点p2p端口 |
4.1.9 | description | String | 是 | 备注 |
4.1.10 | blockNumber | BigInteger | 否 | 节点块高 |
4.1.11 | pbftView | BigInteger | 否 | Pbft view |
4.1.12 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2,
"nodeName": "1_78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b",
"groupId": 1,
"orgName": "org",
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
]
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
4.2 查询机构节点列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/orgList/{chainId}/{pageNumber}/{pageSize}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | pageNumber | Int | 否 | 当前页码 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/node/orgList/100001/1/10
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 节点列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | chainId | Int | 否 | 链编号 |
4.1.2 | nodeId | String | 否 | 节点编号 |
4.1.3 | orgName | String | 是 | 机构名称 |
4.1.4 | description | String | 是 | 备注 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2,
"orgName": "org",
"description": "test"
}
]
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
4.3 修改节点的机构信息¶
- 网络传输协议:使用HTTP协议
- 请求地址: /node/update
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | nodeId | String | 否 | 节点编号 |
3 | orgName | String | 否 | 机构名称 |
4 | description | String | 是 | 描述 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/node/update
{
"chainId": 1,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2",
"orgName": "org",
"description": "test"
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
5 用户管理模块¶
5.1 新增用户¶
- 网络传输协议:使用HTTP协议
- 请求地址: /user/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | userName | String | 否 | 用户名 |
4 | address | String | 否 | 用户地址 |
5 | description | String | 是 | 描述 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/user/add
{
"address": "0x056a6b8bd27e861773ec2419a871ff245291a2d6",
"chainId": 1,
"description": "string",
"groupId": 1,
"userName": "alice"
}
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 节点信息对象 | ||
3.1 | userId | Int | 否 | 用户编号 |
3.2 | chainId | Int | 否 | 链编号 |
3.3 | groupId | Int | 否 | 群组编号 |
3.2 | userName | String | 否 | 用户名 |
3.3 | address | String | 否 | 用户地址 |
3.4 | description | String | 是 | 描述 |
3.5 | createTime | LocalDateTime | 是 | 落库时间 |
3.6 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 1,
"chainId": 1,
"groupId": 1,
"userName": "alice",
"address": "0x056a6b8bd27e861773ec2419a871ff245291a2d6",
"description": "test",
"createTime": "2020-06-02 20:35:20",
"modifyTime": "2020-06-02 20:35:20"
}
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
5.2 获取用户列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/list/{pageNumber}/{pageSize}?chainId={chainId}&groupId={groupId}&userParam={userParam}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageNumber | Int | 否 | 当前页码 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | chainId | Int | 是 | 链编号 |
4 | groupId | Int | 是 | 群组编号 |
5 | userParam | String | 是 | 参数,用户名或地址 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/user/list/1/2
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 对象 | ||
4.1.1 | userId | Int | 否 | 用户编号 |
4.1.2 | chainId | Int | 否 | 链编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | userName | String | 否 | 用户名 |
4.1.5 | address | String | 否 | 用户地址 |
4.1.6 | description | String | 是 | 描述 |
4.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userId": 1,
"chainId": 1,
"groupId": 1,
"userName": "alice",
"address": "0x056a6b8bd27e861773ec2419a871ff245291a2d6",
"description": "test",
"createTime": "2020-06-02 20:35:20",
"modifyTime": "2020-06-02 20:35:20"
}
],
"totalCount": 1
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
5.3 删除用户¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/{userId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | userId | Int | 否 | 用户编号 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/user/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
6 合约管理模块¶
6.1 保存合约和更新¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/save
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | contractName | String | 否 | 合约名称 |
4 | contractSource | String | 是 | 合约源码,Base64编码 |
5 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
6 | runtimeBin | String | 是 | 合约运行时binary,用于合约解析 |
7 | bytecodeBin | String | 是 | 合约bytecode binary,用于部署合约 |
8 | contractId | String | 是 | 合约编号(为空时表示新增,不为空表示更新) |
9 | contractPath | String | 否 | 合约所在目录 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/contract/save
{
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"chainId": 1,
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"runtimeBin": "xxx",
"contractName": "HelloWorld",
"contractPath": "/",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"groupId": 1
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | Int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | chainId | Int | 否 | 链编号 |
3.5 | groupId | Int | 否 | 群组编号 |
3.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约,默认0) |
3.7 | contractSource | String | 否 | 合约源码 |
3.8 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.9 | runtimeBin | String | 是 | 合约运行时binary,用于合约解析 |
3.10 | bytecodeBin | String | 是 | 合约bytecode binary,用于部署合约 |
3.11 | description | String | 是 | 备注 |
3.12 | createTime | LocalDateTime | 否 | 创建时间 |
3.13 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 1,
"chainId": 1,
"groupId": 1,
"contractType": 0,
"contractPath": "/",
"contractName": "HelloWorld",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"runtimeBin": "xxx",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"description": null,
"createTime": "2020-06-02 20:50:58",
"modifyTime": "2020-06-02 20:50:58"
}
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
6.2 查询合约列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/list
- 请求方式:POST
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组id |
3 | contractName | String | 是 | 合约名 |
4 | pageSize | Int | 是 | 每页记录数 |
5 | pageNumber | Int | 是 | 当前页码 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/contract/list
{
"chainId": 1,
"groupId": 1,
"pageNumber": 1,
"pageSize": 2
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
5.1 | Object | 返回信息实体 | ||
5.1.1 | contractId | Int | 否 | 合约编号 |
5.1.2 | contractPath | String | 否 | 合约所在目录 |
5.1.3 | contractName | String | 否 | 合约名称 |
5.1.4 | chainId | Int | 否 | 链编号 |
5.1.5 | groupId | Int | 否 | 群组编号 |
5.1.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
5.1.7 | contractSource | String | 否 | 合约源码 |
5.1.8 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
5.1.9 | runtimeBin | String | 是 | 合约运行时binary,用于合约解析 |
5.1.10 | bytecodeBin | String | 是 | 合约bytecode binary,用于部署合约 |
5.1.11 | description | String | 是 | 备注 |
5.1.12 | createTime | LocalDateTime | 否 | 创建时间 |
5.1.13 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 1,
"chainId": 1,
"groupId": 1,
"contractPath": "/",
"contractName": "HelloWorld",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"runtimeBin": "xxx",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029",
"contractType": 0,
"description": null,
"createTime": "2020-06-02 20:50:58",
"modifyTime": "2020-06-02 20:50:58"
}
],
"totalCount": 1
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
6.3 删除合约¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/{contractId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | contractId | Int | 否 | 合约编号 |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/contract/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
6.4 保存合约方法信息¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/addMethod
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | contractId | Int | 否 | 合约编号 |
2 | methodList | List | 否 | 方法列表 |
2.1 | Object | 否 | 方法实体 | |
2.1.1 | methodId | String | 否 | 方法编号 |
2.1.2 | methodName | String | 否 | 方法名 |
2.1.4 | methodType | String | 否 | 方法类型 |
2)入参示例
http://127.0.0.1:5009/WeBASE-Data-Collect/contract/addMethod
{
"contractId": 2,
"methodList": [
{
"methodId": "0x3590b49f",
"methodName": "set",
"methodType": "function"
},
{
"methodId": "0x9bd13510",
"methodName": "get",
"methodType": "function"
}
]
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 109000,
"message": "system exception",
"data": {}
}
7. 编译器管理模块¶
7.1. 查询编译器列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/solc/list?encryptType={encryptType}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | encryptType | Int | 是 | 类型(0-ecdsa;1-guomi) |
2)入参示例
http://localhost:5009/WeBASE-Data-Collect/solc/list
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 对象 | ||
4.1.1 | id | Int | 否 | 编号 |
4.1.2 | solcName | Int | 否 | 编译器文件名 |
4.1.3 | encryptType | Int | 否 | 类型 |
4.1.4 | md5 | String | 否 | md5值 |
4.1.5 | fileSize | Long | 否 | 文件长度 |
4.1.6 | description | String | 是 | 描述 |
4.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"solcName": "soljson-v0.4.25-gm.js",
"encryptType": 1,
"md5": "c0810103136fb9177df943346b2dcad4",
"fileSize": 8273598,
"description": "guomi",
"createTime": "2020-06-14 11:05:56",
"modifyTime": "2020-06-14 11:05:56"
},
{
"id": 2,
"solcName": "soljson-v0.4.25+commit.59dbf8f1.js",
"encryptType": 0,
"md5": "e201c5913e0982cb90cdb2a711e36f63",
"fileSize": 8276063,
"description": "ecdsa",
"createTime": "2020-06-14 11:19:10",
"modifyTime": "2020-06-14 11:19:10"
}
]
}
附录¶
1. 返回码信息列表¶
Code | message | 描述 |
---|---|---|
0 | success | 正常 |
109000 | system exception | 系统异常 |
109001 | param exception | 请求参数错误 |
109002 | database exception | 数据库异常 |
209001 | chain id already exists | 链编号已经存在 |
209002 | chain name already exists | 链名称已经存在 |
209003 | save chain fail | 链保存失败 |
209004 | invalid chain id | 无效链编号 |
209005 | invalid encrypt type | 无效链加密类型 |
209006 | chain id not exists | 链编号不存在 |
209101 | wrong host or port | ip或端口错误 |
209102 | invalid front id | 无效前置编号 |
209103 | not found any front | 找不到前置 |
209104 | front already exists | 前置已经存在 |
209105 | save front fail | 前置保存失败 |
209106 | request front fail | 前置请求失败 |
209107 | request node exception | 前置节点请求失败 |
209108 | front's encrypt type not matches | 前置类型不匹配 |
209109 | invalid block number | 无效块高 |
209110 | invalid node id | 无效节点编号 |
209201 | invalid group id | 无效群组编号 |
209202 | group name already exist | 群组名称已存在 |
209301 | user name already exists | 用户名已存在 |
209302 | user address already exists | 用户地址已存在 |
209401 | contract already exists | 合约已存在 |
209402 | invalid contract id | 无效合约编号 |
209403 | contract name cannot be repeated | 合约名重复 |
209501 | task is still running | 任务正在执行 |
209502 | block has been reset | 区块已重置 |
209601 | solc js file cannot be empty | 编译器文件不能为空 |
209602 | solc js file already exist | 编译器文件已存在 |
209603 | solc js file not exist | 编译器文件不存在 |
209604 | save solc js file error | 编译器文件保存失败 |
209605 | read solc js file error | 编译器文件读取失败 |
WeBASE-Data-Fetcher接口说明¶
1 区块链管理模块¶
1.1 全量数据概览¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/general
- 请求方式:GET
- 返回格式:JSON
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
2.1 | chainCount | Int | 是 | 链数量 |
2.2 | groupCount | int | 否 | 群组数量 |
2.3 | blockCount | int | 否 | 区块数量 |
2.4 | txnCount | int | 否 | 交易数量 |
2.5 | userCount | int | 否 | 用户数量 |
2.6 | contractCount | int | 否 | 合约数量 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"chainCount": 1,
"groupCount": 2,
"blockCount": 360,
"txnCount": 360,
"userCount": 28,
"contractCount": 77
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
1.2 查询链列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/chain/all
- 请求方式:GET
- 返回格式:JSON
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | chainId | Int | 否 | 链编号 |
4.1.2 | chainName | String | 否 | 链名称 |
4.1.3 | chainType | Int | 否 | 链类型( 0-fisco 1-fabric) |
4.1.4 | encryptType | Int | 否 | 链加密类型(0-非国密,1-国密) |
4.1.5 | description | String | 是 | 备注 |
4.1.6 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"chainId": 1,
"chainName": "链一",
"chainType": 0,
"encryptType": 0,
"description": "test"
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2 群组管理模块¶
2.1 查询群组列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/list
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 是 | 链编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/list?chainId=1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | chainId | Int | 否 | 链编号 |
4.1.2 | groupId | Int | 否 | 群组编号 |
4.1.3 | appName | String | 否 | 应用名称 |
4.1.4 | appVersion | String | 是 | 应用版本号 |
4.1.5 | appSummary | String | 是 | 应用概要介绍 |
4.1.6 | genesisBlockHash | String | 否 | 创世块hash |
4.1.7 | groupStatus | Int | 否 | 群组状态 |
4.1.8 | nodeCount | Int | 否 | 节点个数 |
4.1.9 | description | String | 否 | 应用描述 |
4.1.10 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"chainId": 1,
"groupId": 1,
"appName": "APP1",
"appVersion": "v1.0.0",
"appSummary": "存证",
"genesisBlockHash": "0x7bc361d7d8e078ea9e8f352f2b856d6ea76ab1b9522f4b09853c861d0ed0779f",
"groupStatus": 1,
"nodeCount": 2,
"description": "test",
"createTime": "2020-05-20 20:22:35",
"modifyTime": "2020-05-20 20:31:38"
},
{
"chainId": 1,
"groupId": 2,
"appName": "APP2",
"appVersion": "v1.0.0",
"appSummary": "供应链",
"genesisBlockHash": "0x1208de0d47dcba9447d304039d1e4512dd4ce740ec408ef83c5f7ee2aefc7468",
"groupStatus": 1,
"nodeCount": 2,
"description": "test",
"createTime": "2020-05-20 20:22:36",
"modifyTime": "2020-05-20 20:31:38"
}
],
"totalCount": 2
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.2 查询群组概况¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/general/{chainId}/{groupId}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | int | 否 | 群组id |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/general/1/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
2.1 | chainId | Int | 是 | 链编号 |
2.2 | groupId | int | 否 | 群组id |
2.3 | nodeCount | int | 否 | 节点数量 |
2.4 | userCount | int | 否 | 用户数量 |
2.5 | contractCount | int | 否 | 已部署智能合约数量 |
2.6 | txnCount | int | 否 | 交易数量 |
2.7 | blockNumber | int | 否 | 当前块高 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"chainId": 1,
"groupId": 1,
"nodeCount": 3,
"userCount": 22,
"contractCount": 58,
"txnCount": 237,
"blockNumber": 237
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.3 查询近七日交易数据¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/txnDaily/{chainId}/{groupId}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | int | 否 | 群组id |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/txnDaily/1/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | list | 否 | 返回信息列表 |
4 | object | 返回信息实体 | ||
4.1 | statDate | string | 否 | 日期YYYY-MM-DD |
4.2 | chainId | Int | 是 | 链编号 |
4.3 | groupId | int | 否 | 群组编号 |
4.4 | txn | int | 否 | 交易数量 |
2)出参示例
- 成功:
{
"code": 0,
"data": [
{
"statDate": "2018-11-22",
"chainId": "1",
"groupId": "1",
"txn": 10
},
{
"statDate": "2018-11-21",
"chainId": "1",
"groupId": "1",
"txn": 5
}
],
"message": "Success"
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.4 查询群组节点列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/nodeList/{chainId}/{groupId}/{pageNumber}/{pageSize}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | groupId | int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/nodeList/100001/300001/1/10
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 节点列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | chainId | int | 否 | 链编号 |
4.1.2 | nodeId | String | 否 | 节点编号 |
4.1.3 | nodeName | string | 否 | 节点名称 |
4.1.4 | groupId | int | 否 | 所属群组编号 |
4.1.5 | orgName | string | 是 | 机构名称 |
4.1.6 | nodeActive | int | 否 | 共识状态(1正常,2不正常) |
4.1.7 | nodeIp | string | 是 | 节点ip |
4.1.8 | P2pPort | int | 是 | 节点p2p端口 |
4.1.9 | description | String | 是 | 备注 |
4.1.10 | blockNumber | BigInteger | 否 | 节点块高 |
4.1.11 | pbftView | BigInteger | 否 | Pbft view |
4.1.12 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2,
"nodeName": "1_78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b",
"groupId": 1,
"orgName": "org",
"nodeIp": "127.0.0.1",
"p2pPort": 10303,
"description": null,
"blockNumber": 133,
"pbftView": 5852,
"nodeActive": 1,
"createTime": "2019-02-14 17:47:00",
"modifyTime": "2019-03-15 11:14:29"
}
]
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.5 查询机构节点列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/orgList/{chainId}/{pageNumber}/{pageSize}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | int | 否 | 链编号 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | pageNumber | Int | 否 | 当前页码 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/orgList/100001/1/10
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 节点列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | chainId | Int | 否 | 链编号 |
4.1.2 | nodeId | String | 否 | 节点编号 |
4.1.3 | orgName | String | 是 | 机构名称 |
4.1.4 | description | String | 是 | 备注 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"chainId": 100001,
"nodeId": "78e467957af3d0f77e19b952a740ba8c53ac76913df7dbd48d7a0fe27f4c902b55e8543e1c4f65b4a61695c3b490a5e8584149809f66e9ffc8c05b427e9d3ca2,
"orgName": "org",
"description": "test"
}
]
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.6 查询区块列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/blockList/{chainId}/{groupId}/{pageNumber}/{pageSize}}?blockHash={blockHash}&blockNumber={blockNumber}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | blockHash | String | 是 | 区块hash |
6 | blockNumber | BigInteger | 是 | 块高 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/blockList/1/1/1/2?blockHash=
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 区块列表 |
4.1 | Object | 区块信息对象 | ||
4.1.1 | blockHash | String | 否 | 块hash |
4.1.2 | blockNumber | BigInteger | 否 | 块高 |
4.1.3 | blockTimestamp | LocalDateTime | 否 | 出块时间 |
4.1.4 | transCount | Int | 否 | 交易数 |
4.1.5 | sealerIndex | Int | 否 | 打包节点索引 |
4.1.6 | sealer | String | 否 | 打包节点 |
4.1.7 | blockDetail | String | 否 | 区块详情 |
4.1.8 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 26,
"blockHash": "0x1d0a57a6ee2b73e537ef6d929c8d0bdb2a9799dd6357f04dc5f38e4e0c6c5ac2",
"blockNumber": 35,
"blockTimestamp": "2020-05-13 19:47:37",
"transCount": 1,
"sealerIndex": 0,
"sealer": "944607f7e83efe2ba72476dc39a269a910811db8caac34f440dd9c9dd8ec2490b8854b903bd6c9b95c2c79909649977b8e92097c2f3ec32232c4f655b5a01850",
"blockDetail": "",
"createTime": "2020-05-20 20:22:41",
"modifyTime": "2020-05-20 20:22:41"
},
{
"id": 8,
"blockHash": "0x4c29bb921f4bf346ad1f92704e225f6323c85f16f2fa4eb0e3f126355ff9fa12",
"blockNumber": 34,
"blockTimestamp": "2020-05-13 19:12:20",
"transCount": 1,
"sealerIndex": 0,
"sealer": "944607f7e83efe2ba72476dc39a269a910811db8caac34f440dd9c9dd8ec2490b8854b903bd6c9b95c2c79909649977b8e92097c2f3ec32232c4f655b5a01850",
"blockDetail": "",
"createTime": "2020-05-20 20:22:41",
"modifyTime": "2020-05-20 20:22:41"
}
],
"totalCount": 36
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.7 查询交易列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/group/transList/{chainId}/{groupId}/{pageNumber}/{pageSize}?transHash={transHash}&blockNumber={blockNumber}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageNumber | Int | 否 | 当前页码 |
4 | pageSize | Int | 否 | 每页记录数 |
5 | transHash | String | 是 | 交易hash |
6 | blockNumber | BigInteger | 是 | 块高 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/transList/1/1/1/2?transHash=0x4933b1e0a7d6913a2179b879cdf716096d8da1c162fe400a492b0d61259e2ab2
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 交易信息列表 |
4.1 | Object | 交易信息对象 | ||
4.1.1 | transHash | String | 否 | 交易hash |
4.1.2 | blockNumber | BigInteger | 否 | 所属块高 |
4.1.3 | blockTimestamp | LocalDateTime | 否 | 所属块出块时间 |
4.1.4 | transDetail | String | 否 | 交易详情 |
4.1.5 | receiptDetail | String | 否 | 交易回执详情 |
4.1.6 | auditFlag | Int | 否 | 是否已统计(1-未审计,2-已审计) |
4.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 26,
"transHash": "0x4933b1e0a7d6913a2179b879cdf716096d8da1c162fe400a492b0d61259e2ab2",
"blockNumber": 35,
"blockTimestamp": "2020-05-13 19:47:37",
"transDetail": "{}",
"receiptDetail": "{}",
"auditFlag": 1,
"createTime": "2020-05-20 20:22:41",
"modifyTime": "2020-05-20 20:22:41"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.8 查询用户列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/userList/{chainId}/{groupId}/{pageNumber}/{pageSize}?userParam={userParam}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageNumber | Int | 否 | 当前页码 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | chainId | Int | 否 | 链编号 |
4 | groupId | Int | 否 | 群组编号 |
5 | userParam | String | 是 | 参数,用户名或地址 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/userList/1/1/1/2
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 对象 | ||
4.1.1 | userName | String | 否 | 用户名 |
4.1.2 | userAddress | String | 否 | 用户地址 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userName": "alice",
"userAddress": "0x056a6b8bd27e861773ec2419a871ff245291a2d6"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
2.9 查询合约列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/contractList/{chainId}/{groupId}/{pageNumber}/{pageSize}?contractParam={contractParam}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组id |
3 | pageSize | Int | 是 | 每页记录数 |
4 | pageNumber | Int | 是 | 当前页码 |
5 | contractParam | String | 是 | 合约名或地址 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/group/contractList/1/1/1/2
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
5.1 | Object | 返回信息实体 | ||
5.1.1 | contractName | String | 否 | 合约名称 |
5.1.2 | contractAddress | String | 否 | 合约地址 |
5.1.3 | contractAbi | String | 是 | 合约abi文件内容 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"contractName": "ConsensusPrecompiled",
"contractAddress": "0x0000000000000000000000000000000000001003",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"nodeID\",\"type\":\"string\"}],\"name\":\"addObserver\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"nodeID\",\"type\":\"string\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"nodeID\",\"type\":\"string\"}],\"name\":\"addSealer\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
3 数据检索模块¶
3.1 普通检索¶
- 网络传输协议:使用HTTP协议
- 请求地址:/search/normal
- 请求方式:POST
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | pageSize | Int | 否 | 每页记录数 |
4 | pageNumber | Int | 否 | 当前页码 |
5 | searchType | Int | 否 | 检索类型:1-区块;2-交易;3-用户;4-合约 |
6 | blockParam | String | 是 | 块高或区块Hash,检索类型为1时必填 |
7 | transHash | String | 是 | 交易Hash,检索类型为2时必填 |
8 | userParam | String | 是 | 用户名称或地址,检索类型为3时必填 |
9 | contractParam | String | 是 | 合约名称或地址,检索类型为4时必填 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/search/normal
{
"chainId": 1,
"groupId": 1,
"pageSize": 1,
"pageNumber": 1,
"searchType": 2,
"transHash": "0x16dafe7f879f13d5fca6046e87022cdf71c9076b90c90b12403b82e1b68d3a22"
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 区块列表 |
4.1 | Object | 区块信息对象 | ||
4.1.1 | transHash | String | 否 | 块hash |
4.1.2 | blockNumber | BigInteger | 否 | 块高 |
4.1.3 | blockTimestamp | LocalDateTime | 否 | 出块时间 |
4.1.4 | userName | String | 否 | 用户名称 |
4.1.5 | userAddress | String | 否 | 用户地址 |
4.1.6 | userType | Int | 否 | 用户类型(0-正常,1-异常) |
4.1.7 | contractName | String | 否 | 合约名称 |
4.1.8 | contractAddress | String | 否 | 合约地址 |
4.1.9 | interfaceName | String | 否 | 合约接口名 |
4.1.10 | transType | Int | 否 | 交易类型(0-合约部署,1-接口调用) |
4.1.11 | transParserType | Int | 否 | 交易解析类型(0-正常,1-异常合约,2-异常接口) |
4.1.12 | input | String | 是 | 交易输入信息 |
4.1.13 | output | String | 是 | 交易输出信息 |
4.1.14 | logs | String | 是 | 交易event信息 |
4.1.15 | transDetail | String | 是 | 交易详情 |
4.1.16 | receiptDetail | String | 是 | 交易回执详情 |
4.1.17 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.18 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"transHash": "0x16dafe7f879f13d5fca6046e87022cdf71c9076b90c90b12403b82e1b68d3a22",
"blockNumber": 35,
"blockTimestamp": "2020-05-13 19:47:37",
"userName": "alice",
"userAddress": "0x7939e26070be44e6c4fc759ce55c6c8b166d94be",
"userType": 0,
"contractName": "HelloWorld",
"contractAddress": "0x970d7d42726e8f1069f6d9aa0aca10e950fcebf9",
"interfaceName": "set(string)",
"transType": 1,
"transParserType": 0,
"input":"[{\"name\":\"n\",\"type\":\"string\",\"data\":\"test\"}]",
"output":"",
"logs":"{\"SetName(string)\":[[{\"name\":\"name\",\"type\":\"string\",\"data\":\"test\",\"indexed\":false}]]}",
"transDetail":"{}",
"receiptDetail":"{}",
"createTime": "2020-05-20 20:22:41",
"modifyTime": "2020-05-20 20:22:41"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
3.2 关键字检索¶
- 网络传输协议:使用HTTP协议
- 请求地址:/search/keyword/{pageNumber}/{pageSize}?keyword={keyword}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageSize | Int | 否 | 每页记录数 |
2 | pageNumber | Int | 否 | 当前页码 |
3 | keyword | String | 否 | 要检索的关键字 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/search/keyword/1/2?keyword="测试"
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 区块列表 |
4.1 | Object | 区块信息对象 | ||
4.1.1 | transHash | String | 否 | 块hash |
4.1.2 | blockNumber | BigInteger | 否 | 块高 |
4.1.3 | blockTimestamp | LocalDateTime | 否 | 出块时间 |
4.1.4 | userName | String | 否 | 用户名称 |
4.1.5 | userAddress | String | 否 | 用户地址 |
4.1.6 | userType | Int | 否 | 用户类型(0-正常,1-异常) |
4.1.7 | contractName | String | 否 | 合约名称 |
4.1.8 | contractAddress | String | 否 | 合约地址 |
4.1.9 | interfaceName | String | 否 | 合约接口名 |
4.1.10 | transType | Int | 否 | 交易类型(0-合约部署,1-接口调用) |
4.1.11 | transParserType | Int | 否 | 交易解析类型(0-正常,1-异常合约,2-异常接口) |
4.1.12 | input | String | 是 | 交易输入信息 |
4.1.13 | output | String | 是 | 交易输出信息 |
4.1.14 | logs | String | 是 | 交易event信息 |
4.1.15 | chainId | Int | 否 | 链编号 |
4.1.16 | groupId | Int | 否 | 群组编号 |
4.1.17 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.18 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"transParserType": 0,
"transHash": "0xd33a6343ecee98cd6804456d34299d893258e5e3ebc2b8d6d57dc1fdc9a34b43",
"groupId": 1,
"contractAddress": "0x513657158171fc69017b52ea997bdf49cd0260ba",
"userName": "bob",
"userAddress": "0x7939e26070be44e6c4fc759ce55c6c8b166d94be",
"output": null,
"input": "[{\"name\":\"n\",\"type\":\"string\",\"data\":\"试验\"}]",
"modifyTime": "2020-07-14 17:51:26",
"transType": 1,
"chainId": 1,
"createTime": "2020-07-14 17:51:26",
"blockNumber": 312,
"contractName": "HelloWorld",
"blockTimestamp": "2020-07-14 17:51:12",
"id": 312,
"userType": 0,
"interfaceName": "set(string)",
"logs": "{\"SetName(string)\":[[{\"name\":\"name\",\"type\":\"string\",\"data\":\"试验\",\"indexed\":false}]]}"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
4 关键字管理模块¶
4.1 新增关键字¶
- 网络传输协议:使用HTTP协议
- 请求地址: /keywords/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | keyword | String | 否 | 关键字 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/keywords/add
{
"keyword": "禽流感"
}
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | id | Int | 否 | 编号 |
3.2 | keyword | String | 否 | 关键字 |
3.3 | createTime | LocalDateTime | 是 | 落库时间 |
3.2 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"keyword": "禽流感",
"createTime": "2020-07-30 20:14:38",
"modifyTime": "2020-07-30 20:14:38"
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
4.2 获取关键字列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/keywords/list/{pageNumber}/{pageSize}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageNumber | Int | 否 | 当前页码 |
2 | pageSize | Int | 否 | 每页记录数 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/keywords/list/1/2
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 对象 | ||
4.1.1 | id | Int | 否 | 编号 |
4.1.2 | keyword | String | 否 | 关键字 |
4.1.3 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.4 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"keyword": "禽流感",
"createTime": "2020-07-30 20:14:38",
"modifyTime": "2020-07-30 20:14:38"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
4.3 修改关键字¶
- 网络传输协议:使用HTTP协议
- 请求地址: /keywords/update
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | id | Int | 否 | 关键字编号 |
2 | keyword | String | 否 | 关键字 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/keywords/update
{
"id": 1,
"keyword": "冠状病毒"
}
1)出参表
序号 | 输出参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | id | Int | 否 | 编号 |
3.2 | keyword | String | 否 | 关键字 |
3.3 | createTime | LocalDateTime | 是 | 落库时间 |
3.2 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"keyword": "冠状病毒",
"createTime": "2020-07-30 20:14:38",
"modifyTime": "2020-07-30 20:15:35"
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
4.4 删除关键字¶
- 网络传输协议:使用HTTP协议
- 请求地址:/keywords/{id}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | id | Int | 否 | 关键字编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/keywords/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
5 交易告警信息管理模块¶
5.1 新增告警信息¶
- 网络传输协议:使用HTTP协议
- 请求地址: /transAudit/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | type | Int | 否 | 信息来源类型,1-关键字 2-交易列表 |
4 | keyword | String | 是 | 关键字,type为1是必填 |
5 | comment | String | 否 | 监管意见 |
6 | txHash | String | 否 | 交易hash |
7 | address | String | 否 | 用户地址 |
8 | chainName | String | 是 | 链名称 |
9 | appName | String | 是 | 应用名称 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/transAudit/add
{
"chainId": 1,
"groupId": 1,
"type": 1,
"keyword": "禽流感",
"comment": "停止售卖",
"txHash": "0x8e8b15e87f09e35f4ce811fb61b0bbd730eab0cfe63a350e2bab6f7a2bfe36b0",
"address": "0xd0332a67b2136ff5767c9ee7b775be83950da59c",
"chainName": "存证链",
"appName": "文件存证"
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | id | Int | 否 | 编号 |
3.2 | chainId | Int | 否 | 链编号 |
3.3 | groupId | Int | 否 | 群组编号 |
3.4 | type | Int | 否 | 信息来源类型,1-关键字 2-交易列表 |
3.5 | keyword | String | 否 | 关键字 |
3.6 | comment | String | 否 | 监管意见 |
3.7 | txHash | String | 否 | 交易hash |
3.8 | address | String | 否 | 用户地址 |
3.9 | status | Int | 否 | 状态(1-未处理, 2-已处理) |
3.10 | chainName | String | 是 | 链名称 |
3.11 | appName | String | 是 | 应用名称 |
3.12 | createTime | LocalDateTime | 否 | 落库时间 |
3.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"chainId": 1,
"groupId": 1,
"type": 1,
"keyword": "禽流感",
"comment": "停止售卖",
"txHash": "0x8e8b15e87f09e35f4ce811fb61b0bbd730eab0cfe63a350e2bab6f7a2bfe36b0",
"address": "0xd0332a67b2136ff5767c9ee7b775be83950da59c",
"status": 1,
"chainName": "存证链",
"appName": "文件存证",
"createTime": "2020-07-30 20:19:39",
"modifyTime": "2020-07-30 20:19:39"
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
5.2 获取告警信息列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/transAudit/list/{pageNumber}/{pageSize}?status={status}&chainId={chainId}&groupId={groupId}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageNumber | Int | 否 | 当前页码 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | status | Int | 是 | 状态(1-未处理, 2-已处理) |
4 | chainId | Int | 是 | 链编号 |
5 | groupId | Int | 是 | 群组编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/transAudit/list/1/2
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 对象 | ||
4.1.1 | id | Int | 否 | 编号 |
4.1.2 | chainId | Int | 否 | 链编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | type | Int | 否 | 信息来源类型,1-关键字 2-交易列表 |
4.1.5 | keyword | String | 是 | 关键字 |
4.1.6 | comment | String | 是 | 监管意见 |
4.1.7 | txHash | String | 否 | 交易hash |
4.1.8 | address | String | 否 | 用户地址 |
4.1.9 | status | Int | 否 | 状态(1-未处理, 2-已处理) |
4.1.10 | chainName | String | 是 | 链名称 |
4.1.11 | appName | String | 是 | 应用名称 |
4.1.12 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"chainId": 1,
"groupId": 1,
"type": 1,
"keyword": "禽流感",
"comment": "停止售卖",
"txHash": "0x8e8b15e87f09e35f4ce811fb61b0bbd730eab0cfe63a350e2bab6f7a2bfe36b0",
"address": "0xd0332a67b2136ff5767c9ee7b775be83950da59c",
"status": 1,
"chainName": "存证链",
"appName": "文件存证",
"createTime": "2020-07-30 20:19:39",
"modifyTime": "2020-07-30 20:19:39"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
5.3 确认处理状态¶
- 网络传输协议:使用HTTP协议
- 请求地址: /transAudit/confirm/{id}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | id | Int | 否 | 告警信息编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/transAudit/confirm/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | id | Int | 否 | 编号 |
3.2 | chainId | Int | 否 | 链编号 |
3.3 | groupId | Int | 否 | 群组编号 |
3.4 | type | Int | 否 | 信息来源类型,1-关键字 2-交易列表 |
3.5 | keyword | String | 是 | 关键字 |
3.6 | comment | String | 否 | 监管意见 |
3.7 | txHash | String | 否 | 交易hash |
3.8 | address | String | 否 | 用户地址 |
3.9 | status | Int | 否 | 状态(1-未处理, 2-已处理) |
3.10 | chainName | String | 是 | 链名称 |
3.11 | appName | String | 是 | 应用名称 |
3.12 | createTime | LocalDateTime | 否 | 落库时间 |
3.13 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"chainId": 1,
"groupId": 1,
"type": 1,
"keyword": "禽流感",
"comment": "停止售卖",
"txHash": "0x8e8b15e87f09e35f4ce811fb61b0bbd730eab0cfe63a350e2bab6f7a2bfe36b0",
"address": "0xd0332a67b2136ff5767c9ee7b775be83950da59c",
"status": 2,
"chainName": "存证链",
"appName": "文件存证",
"createTime": "2020-07-30 20:19:39",
"modifyTime": "2020-07-30 20:22:06"
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
5.4 删除告警信息¶
- 网络传输协议:使用HTTP协议
- 请求地址:/transAudit/{id}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | id | Int | 否 | 告警信息编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/transAudit/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
6 应用告警信息管理模块¶
6.1 新增告警信息¶
- 网络传输协议:使用HTTP协议
- 请求地址: /appAudit/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | chainId | Int | 否 | 链编号 |
2 | groupId | Int | 否 | 群组编号 |
3 | comment | String | 否 | 监管意见 |
4 | chainName | String | 是 | 链名称 |
5 | appName | String | 是 | 应用名称 |
6 | appVersion | String | 是 | 应用版本号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/appAudit/add
{
"chainId": 1,
"groupId": 1,
"comment": "停止",
"chainName": "存证链",
"appName": "文件存证",
"appVersion": "1.0.0"
}
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | id | Int | 否 | 编号 |
3.2 | chainId | Int | 否 | 链编号 |
3.3 | groupId | Int | 否 | 群组编号 |
3.4 | comment | String | 否 | 监管意见 |
3.5 | chainName | String | 是 | 链名称 |
3.6 | appName | String | 是 | 应用名称 |
3.7 | appVersion | String | 是 | 应用版本号 |
3.8 | status | Int | 否 | 状态(1-未处理, 2-已处理) |
3.9 | createTime | LocalDateTime | 否 | 落库时间 |
3.10 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"chainId": 1,
"groupId": 1,
"comment": "停止",
"chainName": "存证链",
"appName": "文件存证",
"appVersion": "1.0.0",
"status": 1,
"createTime": "2020-07-30 20:19:39",
"modifyTime": "2020-07-30 20:19:39"
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
6.2 获取告警信息列表¶
- 网络传输协议:使用HTTP协议
- 请求地址:/appAudit/list/{pageNumber}/{pageSize}?chainId={chainId}
- 请求方式:GET
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | pageNumber | Int | 否 | 当前页码 |
2 | pageSize | Int | 否 | 每页记录数 |
3 | chainId | Int | 是 | 链编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/appAudit/list/1/2
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 列表 |
4.1 | Object | 对象 | ||
4.1.1 | id | Int | 否 | 编号 |
4.1.2 | chainId | Int | 否 | 链编号 |
4.1.3 | groupId | Int | 否 | 群组编号 |
4.1.4 | comment | String | 否 | 监管意见 |
4.1.5 | chainName | String | 是 | 链名称 |
4.1.6 | appName | String | 是 | 应用名称 |
4.1.7 | appVersion | String | 是 | 应用版本号 |
4.1.8 | status | Int | 否 | 状态(1-未处理, 2-已处理) |
4.1.9 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.10 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"chainId": 1,
"groupId": 1,
"comment": "停止",
"chainName": "存证链",
"appName": "文件存证",
"appVersion": "1.0.0",
"status": 1,
"createTime": "2020-07-30 20:19:39",
"modifyTime": "2020-07-30 20:19:39"
}
],
"totalCount": 1
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
6.3 确认处理状态¶
- 网络传输协议:使用HTTP协议
- 请求地址: /appAudit/confirm/{id}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | id | Int | 否 | 告警信息编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/appAudit/confirm/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | id | Int | 否 | 编号 |
3.2 | chainId | Int | 否 | 链编号 |
3.3 | groupId | Int | 否 | 群组编号 |
3.4 | comment | String | 否 | 监管意见 |
3.5 | chainName | String | 是 | 链名称 |
3.6 | appName | String | 是 | 应用名称 |
3.7 | appVersion | String | 是 | 应用版本号 |
3.8 | status | Int | 否 | 状态(1-未处理, 2-已处理) |
3.9 | createTime | LocalDateTime | 否 | 落库时间 |
3.10 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"chainId": 1,
"groupId": 1,
"comment": "停止",
"chainName": "存证链",
"appName": "文件存证",
"appVersion": "1.0.0",
"status": 2,
"createTime": "2020-07-30 20:19:39",
"modifyTime": "2020-07-30 20:22:06"
}
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
6.4 删除告警信息¶
- 网络传输协议:使用HTTP协议
- 请求地址:/appAudit/{id}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
1)入参表
序号 | 输入参数 | 类型 | 可为空 | 备注 |
---|---|---|---|---|
1 | id | Int | 否 | 告警信息编号 |
2)入参示例
http://localhost:5010/WeBASE-Data-Fetcher/appAudit/1
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 110000,
"message": "system exception",
"data": {}
}
附录¶
1. 返回码信息列表¶
Code | message | 描述 |
---|---|---|
0 | success | 正常 |
110000 | system exception | 系统异常 |
110001 | param exception | 请求参数错误 |
110002 | database exception | 数据库异常 |
210101 | invalid group id | 无效群组编号 |
210201 | searchType not exists | 搜索类型不存在 |
210202 | search content can not be empty | 搜索内容不能为空 |
210203 | search index not exists | 索引不存在 |
210204 | search fail | 搜索失败 |
210205 | elasticsearch's config is false | elasticsearch配置未启用 |
210301 | keyword id not exists | 关键字不存在 |
210302 | keyword exists | 关键字已存在 |
210303 | save keyword fail | 关键字保存失败 |
210401 | audit id not exists | 告警信息不存在 |
210402 | audit inffo exists | 告警信息已存在 |
210403 | save audit info fail | 告警信息保存失败 |
附录¶
1. 安装示例¶
1.1 Java部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
1.2. 数据库部署¶
此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网。
① 安装MariaDB¶
- 安装命令
sudo yum install -y mariadb*
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasedata;
1.3. Elasticsearch部署¶
此处以Centos安装为例。详情请查看Elasticsearch官网。
① 安装包下载¶
下载elasticsearch和elasticsearch-analysis-ik,注意版本要对应。
# 上传elasticsearch安装包并解压
tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz /software/
# 在elasticsearch的plugins目录创建子目录ik,并将ik分词插件上传解压到该目录
mkdir /software/elasticsearch-7.8.0/plugins/ik
# 进入目录
cd /software/elasticsearch-7.8.0/plugins/ik
# 上传ik分词插件安装包并解压
unzip elasticsearch-analysis-ik-7.8.0.zip
② 启动¶
在 ES 根目录下面,执行启动脚本文件:
cd /software/elasticsearch-7.8.0
bin/elasticsearch -d
如果需要设置用户名密码访问,则进行以下操作:
在配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启
xpack.security.enabled: true xpack.license.self_generated.type: basic xpack.security.transport.ssl.enabled: true
设置用户名和密码,需要为4个用户分别设置密码(elastic,kibana,logstash_system,beats_system)
bin/elasticsearch-setup-passwords interactive
如果需要修改密码,命令如下:
curl -H "Content-Type:application/json" -XPOST -u elastic 'http://127.0.0.1:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'
③ 验证¶
打开浏览器,输入 http://localhost:9200/ 地址,然后可以得到下面的信息:
{
"name" : "node-1",
"cluster_name" : "my-application",
"cluster_uuid" : "K194HmUgRW2uwE9Zv0IDDQ",
"version" : {
"number" : "7.8.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
"build_date" : "2020-06-14T19:35:50.234439Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
1.5 nginx部署¶
① 安装依赖¶
在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。如果没有,请执行命令
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
执行命令时注意权限问题,如遇到,请加上sudo
② 安装包下载¶
nginx下载地址:https://nginx.org/download/(下载最新稳定版本即可),或者使用命令:
wget http://nginx.org/download/nginx-1.9.9.tar.gz (版本号可换)
将下载的包移动到/usr/local/下
③ 安装¶
- 解压后进入目录
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
- 配置
./configure --prefix=/usr/local/nginx
- make
make
make install
- 测试是否安装成功
使用命令:
/usr/local/nginx/sbin/nginx –t
正常情况的信息输出:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
- nginx几个常见命令
/usr/local/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/nginx/sbin/nginx -s stop # 停止 Nginx
ps -ef | grep nginx # 查看nginx进程
2. 常见问题¶
2.2 构建失败¶
- 执行构建命令
gradle build -x test
抛出异常:
A problem occurred evaluating root project 'WeBASE-Data-Collect'.
Could not find method compileOnly() for arguments [[org.projectlombok:lombok:1.18.8]] on root project 'WeBASE-Data-Collect'.
答:
方法1、已安装的Gradle版本过低,升级Gradle版本到4.10以上即可
方法2、直接使用命令:./gradlew build -x test
2.3 数据库问题¶
- 服务访问数据库抛出异常:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
答:检查数据库的网络策略是否开通
下面以centos7为例:
查看防火墙是否开放3306端口: firewall-cmd --query-port=3306/tcp
防火墙永久开放3306端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新启动防火墙:firewall-cmd --reload
- 执行数据库初始化脚本抛出异常:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (110)
答:MySQL没有开通该帐号的远程访问权限,登录MySQL,执行如下命令,其中TestUser改为你的帐号
GRANT ALL PRIVILEGES ON *.* TO 'TestUser'@'%' IDENTIFIED BY '此处为TestUser的密码’' WITH GRANT OPTION;
- 数据存储时抛出异常:
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (1,048,871 > 1,048,576). You can change this value on the server by setting the 'max_allowed_packet' variable.
答:插入数据量过大。MySQL根据配置文件会限制Server接受的数据包大小,有时候插入、更新或查询时数据包的大小,会受 max_allowed_packet 参数限制,导致操作失败。
客户端执行命令查看大小:
show VARIABLES like '%max_allowed_packet%';
修改mysql的配置文件my.ini的配置,修改后重启mysql:
max_allowed_packet=20M
2.3 Elasticsearch问题¶
- root账户启动失败
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
这个错误是因为使用了root账户启动Elasticsearch,换个非root账户启动就可以了。
- 启动没权限
-bash: bin/elasticsearch: Permission denied
使用chmod
命令给文件夹赋权限。
- 虚拟内存太小
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
这是因为设置的最大虚拟内存太小,elasticsearch需要较大内存,切换到root用户下,修改配置文件sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=262144
并执行命令:
sysctl -p
- 文件数太小
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
这是用户最大可创建的文件数太小,只有4096,无法创建本地文件,需要增加到65536。切换到root用户,编辑limits.conf配置文件
vi /etc/security/limits.conf
添加如下两行,然后保存
{启动Elasticsearch的用户} soft nofile 65536
{启动Elasticsearch的用户} hard nofile 65536
- 验证时报错
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
确认是否设置了用户名密码,如果已设置,确认是否正确。
3. application.yml配置项说明¶
3.1 WeBASE-Data-Collect¶
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5009 | 当前服务端口 |
server.servlet.context-path | /WeBASE-Data-Collect | 当前服务访问目录 |
mybatis.typeAliasesPackage | com.webank.webase.data.collect | mapper类扫描路径 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasedata | mysql连接地址 |
spring.datasource.username | defaultAccount | mysql账号 |
spring.datasource.password | defaultPassword | mysql密码 |
spring.elasticsearch.rest.uris | 127.0.0.1:9200 | elasticsearch服务的ip地址 |
spring.elasticsearch.rest.username | elasticAccount | elasticsearch用户名,可以为空 |
spring.elasticsearch.rest.password | elasticPassword | elasticsearch密码,可以为空 |
spring.servlet.multipart.max-request-size | 30MB | 请求资源最大值 |
spring.servlet.multipart.max-file-size | 20MB | 单个文件最大值 |
constant.ifEsEnable | false | 是否使用elasticsearch |
constant.httpTimeOut | 5000 | 请求前置超时时间 |
constant.maxRequestFail | 3 | 失败次数 |
constant.sleepWhenHttpMaxFail | 30000 | 失败后睡眠时间(毫秒) |
constant.resetGroupListCycle | 300000 | 更新群组时间间隔(毫秒) |
constant.groupInvalidGrayscaleValue | 1M | 群组失效后保留时间 |
constant.nodeStatusTaskFixedDelay | 30000 | 更新节点状态任务时间间隔(毫秒) |
constant.statTxnDailyTaskFixedDelay | 60000 | 统计每日交易任务时间间隔(毫秒) |
constant.ifPullData | true | 是否拉取区块(可通过接口修改) |
constant.startBlockNumber | 0 | 开始块 |
constant.crawlBatchUnit | 50 | 异步处理条数 |
constant.dataPullCron | 0/10 * * ? | 数据拉取任务时间间隔(10秒) |
constant.dataParserCron | 5/10 * * ? | 数据解析任务时间间隔(10秒) |
constant.eventExportCron | 7/10 * * ? | 事件导出任务时间间隔(10秒) |
constant.partitionType | 0 | 表分区类型(0-按天,1-按月),部署后修改需重建数据库 |
constant.createPartitionCron | 0 0 1 * * ? | 创建表分区任务时间(每天凌晨1点) |
constant.multiLiving | false | 是否使用分布式任务部署多活 |
job.regCenter.serverLists | 127.0.0.1:2181 | 部署多活的话需配置zookeeper,支持集群 |
job.regCenter.namespace | elasticjob-collect | zookeeper命名空间 |
job.dataflow.shardingTotalCount | 2 | 多活分片数 |
executor.corePoolSize | 50 | 线程池大小 |
executor.maxPoolSize | 100 | 线程池最大线程数 |
executor.queueSize | 50 | 线程池队列大小 |
executor.threadNamePrefix | "custom-async-" | 线程名前缀 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目 |
logging.level | com.webank.webase.data.collect: info | 日志级别 |
3.2 WeBASE-Data-Fetcher¶
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5010 | 当前服务端口 |
server.servlet.context-path | /WeBASE-Data-Fetcher | 当前服务访问目录 |
mybatis.typeAliasesPackage | com.webank.webase.data.fetcher | mapper类扫描路径 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasedata | mysql连接地址 |
spring.datasource.username | defaultAccount | mysql账号 |
spring.datasource.password | defaultPassword | mysql密码 |
spring.elasticsearch.rest.uris | 127.0.0.1:9200 | elasticsearch服务的ip地址 |
spring.elasticsearch.rest.username | elasticAccount | elasticsearch用户名,可以为空 |
spring.elasticsearch.rest.password | elasticPassword | elasticsearch密码,可以为空 |
constant.ifEsEnable | false | 是否使用elasticsearch |
constant.keywordAuditCron | 0 0 0/1 * * ? | 关键字审计任务执行时间,默认每小时执行一次 |
executor.corePoolSize | 50 | 线程池大小 |
executor.maxPoolSize | 100 | 线程池最大线程数 |
executor.queueSize | 50 | 线程池队列大小 |
executor.threadNamePrefix | custom-async- | 线程名前缀 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目录 |
logging.level | com.webank.webase.data.fetcher: info | 日志扫描目录和级别 |
WeBASE贡献指南¶
欢迎,提前感谢你的帮助和支持!
如果你是第一次贡献,只需按照以下简单步骤操作即可。我们将以修改WeBASE-Node-Manager为例子给你介绍。
如果你的电脑上尚未安装 git, 请按照这个 安装指引 进行安装。
Clone代码仓库¶
接下来,将复制后的代码仓库克隆到你的电脑上。点击图示中的绿色按钮,接着点击复制到剪切板按钮(将代码仓库地址复制下来)
随后打开命令行窗口,敲入如下 git 命令:
git clone "刚才复制的 url 链接"
“刚才复制的 url 链接”(去掉双引号)就是复制到你账户名下的代码仓库地址。获取这链接地址的方法请见上一步。
git clone https://github.com/"你的 Github 用户名"/WeBASE-Node-Manager.git
‘你的 Github 用户名’ 指的就是你的 Github 用户名。这一步,你将复制你账户名下的 WeBASE-Node-Manager 这个代码仓库克隆到你的本地电脑上。
代码修改¶
cd WeBASE-Node-Manager
vim XXX
Commit修改¶
git commit -am "一个伟大改进"
提出 Pull Request 将你的修改供他人审阅¶
前往 Github 你的代码仓库,你会看到一个 Compare & pull request
的按钮。点击该按钮。
接着再点击 Create pull request
按钮,正式提交 pull request。
提交的改动经过审核,会合入到仓库。合并后,你会收到电子邮件通知。
更多开源项目¶
All the project addresses participated and established by WeBank Blockchain are collected.
汇集了微众银行参与和建立的所有区块链项目地址。
FISCO-BCOS 适用于金融行业的区块链底层平台¶
git地址:https://github.com/FISCO-BCOS
gitee地址:https://gitee.com/FISCO-BCOS
文档地址: https://fisco-bcos-documentation.readthedocs.io/
WeIdentity 基于区块链的实体身份标识及可信数据交换解决方案¶
git地址:https://github.com/WeBankFinTech/WeIdentity
gitee地址:https://gitee.com/WeBank/WeIdentity
文档地址:https://weidentity.readthedocs.io/
WeEvent 基于区块链的分布式事件驱动架构¶
git地址:https://github.com/WeBankFinTech/WeEvent
gitee地址:https://gitee.com/WeBank/WeEvent
文档地址:https://weevent.readthedocs.io/
WeBASE 区块链中间件平台¶
git地址:https://github.com/WeBankFinTech/WeBASE
gitee地址:https://gitee.com/WeBank/WeBASE
文档地址:https://webasedoc.readthedocs.io/
WeCross 区块链跨链协作平台¶
git地址:https://github.com/WeBankBlockchain/WeCross
gitee地址:https://gitee.com/WeBank/WeCross
文档地址:https://wecross.readthedocs.io/
WeDPR 即时可用,场景式隐私保护高效解决方案套件和服务¶
git地址:https://github.com/WeBankBlockchain/WeDPR-Lab-Core
文档地址:https://wedpr-lab.readthedocs.io/
Data-Stash 数据仓库组件¶
git地址:https://github.com/WeBankBlockchain/Data-Stash
gitee地址:https://gitee.com/WeBankBlockchain/Data-Stash
文档地址:https://data-doc.readthedocs.io/zh_CN/stable/docs/WeBankBlockchain-Data-Stash/index.html
Data-Export 数据导出组件¶
git地址:https://github.com/WeBankBlockchain/Data-Export
gitee地址:https://gitee.com/WeBankBlockchain/Data-Export
文档地址:https://data-doc.readthedocs.io/zh_CN/stable/docs/WeBankBlockchain-Data-Export/index.html
Data-Reconcile 数据对账组件¶
git地址:https://github.com/WeBankBlockchain/Data-Reconcile
gitee地址:https://gitee.com/WeBankBlockchain/Data-Reconcile
文档地址:https://data-doc.readthedocs.io/zh_CN/stable/docs/WeBankBlockchain-Data-Reconcile/index.html
Liquid 智能合约编程语言软件¶
git地址:https://github.com/WeBankBlockchain/liquid
gitee地址:https://gitee.com/WeBankBlockchain/liquid
文档地址: https://liquid-doc.readthedocs.io/
cargo-liquid Liquid智能合约辅助开发工具¶
Governance-Account 账户治理组件¶
git地址:https://github.com/WeBankBlockchain/Governance-Account
gitee地址:https://gitee.com/WeBankBlockchain/Governance-Account
文档地址:https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Acct/index.html
Governance-Authority 权限治理组件¶
git地址:https://github.com/WeBankBlockchain/Governance-Authority
gitee地址:https://gitee.com/WeBankBlockchain/Governance-Authority
文档地址:https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Auth/index.html
Governance-Key 私钥管理组件¶
git地址:https://github.com/WeBankBlockchain/Governance-Key
gitee地址:https://gitee.com/WeBankBlockchain/Governance-Key
文档地址:https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Key/index.html
Governance-Cert 证书管理组件¶
git地址:https://github.com/WeBankBlockchain/Governance-Cert
gitee地址:https://gitee.com/WeBankBlockchain/Governance-Cert
文档地址:https://governance-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-Governance-Cert/index.html
Truora 可信预言机服务¶
git地址:https://github.com/WeBankBlockchain/Truora
gitee地址:https://gitee.com/WeBankBlockchain/Truora
文档地址:https://truora.readthedocs.io/
SmartDev-Contract 智能合约库组件¶
git地址:https://github.com/WeBankBlockchain/SmartDev-Contract
gitee地址:https://gitee.com/WeBankBlockchain/SmartDev-Contract
文档地址:https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Contract/index.html
SmartDev-SCGP 合约编译插件¶
git地址:https://github.com/WeBankBlockchain/SmartDev-SCGP
gitee地址:https://gitee.com/WeBankBlockchain/SmartDev-SCGP
文档地址:https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-SCGP/index.html
SmartDev-Scaffold 应用开发脚手架¶
git地址:https://github.com/WeBankBlockchain/SmartDev-Scaffold
gitee地址:https://gitee.com/WeBankBlockchain/SmartDev-Scaffold
文档地址:https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html