WeBASE 技术文档

_images/logo1.jpg

Overview

什么是WeBASE

WeBASE(WeBank Blockchain Application Software Extension) 是在区块链应用和FISCO-BCOS节点之间搭建的一套通用组件。围绕交易、合约、密钥管理,数据,可视化管理来设计各个模块,开发者可以根据业务所需,选择子系统进行部署。WeBASE屏蔽了区块链底层的复杂度,降低开发者的门槛,大幅提高区块链应用的开发效率,包含节点前置、节点管理、交易链路,数据导出,Web管理平台等子系统。

建立区块链应用开发标准

WeBASE将区块链应用开发标准化,按照部署、配置、开发智能合约、开发应用层、在线运维管理五个步骤即可完成一个区块链应用的开发,详细开发流程请参阅 使用WeBASE开发区块链应用

设计原则

按需部署 WeBASE抽象应用开发的诸多共性模块,形成各类服务组件,开发者根据需要部署所需组件。

微服务 WeBASE采用微服务架构,基于Spring Boot框架,提供RESTful风格接口。

零耦合 WeBASE所有子系统独立存在,均可独立部署,独立提供服务。

可定制 前端页面往往带有自身的业务属性,因此WeBASE采用前后端分离的技术,便于开发者基于后端接口定制自己的前端页面。

整体架构

完整的部署架构如下,其中WeBASE-Front需要和区块链节点同机部署。 _images/architecture2.png[]

功能介绍

从可视化,智能合约,交易,数据四个维度设计各个中间件,各模块主要功能如下 _images/function.png[]

各子系统简介

  • 节点前置服务 WeBASE-Front仓库 集成web3sdk,提供RESTful风格的接口,客户端可以使用http的形式和节点进行交互,内置内存数据库,采集节点健康度数据。内置web控制台,实现节点的可视化操作。
  • 节点管理服务 WeBASE-Node-Manager仓库 处理前端页面所有web请求,管理各个节点的状态,管理链上所有智能合约,对区块链的数据进行统计、分析,对异常交易的审计,私钥管理等。
  • WeBASE管理平台 WeBASE-Web仓库 可视化操作平台,可基于此平台查看节点信息,开发智能合约等。
  • 交易服务 WeBASE-Transcation仓库 接收交易请求,缓存交易到数据库中,异步上链,可大幅提升吞吐量,解决区块链的tps瓶颈。
  • 私钥托管和签名服务 WeBASE-Sign仓库 托管用户私钥,提供云端签名。
  • 链管理服务子系统 WeBASE-Chain-Manager仓库 支持管理多条链和动态群组管理功能,支持国密链、非国密链。
  • 数据统计服务子系统 WeBASE-Stat仓库 以前置为基础,拉取CPU、内存、IO、群组大小、群组gas、群组网络流量的数据,记录数据库。
  • 数据监管服务 WeBASE-Data仓库 以前置为基础,导出区块链数据并解析,提供一个可视化的监管视图。可以查询交易属于哪条链,哪个用户,哪个合约,保证链上数据可查可管。
  • 数据导出代码生成工具 WeBASE-Codegen-Monkey仓库 代码生成工具,通过配置可以生成数据导出的核心代码。
  • 数据导出服务 WeBASE-Collect-Bee仓库 导出区块链上的基础数据,如当前块高、交易总量等,通过智能合约的配置,导出区块链上合约的业务数据,包括event、构造函数、合约地址、执行函数的信息等。

各子系统的技术文档可到WeBASE子系统文档中查看

版本及兼容

支持FISCO-BCOS 2.X.X系列版本

WeBASE v1.4.3

WeBASE v1.4.3 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.1版本。

WeBASE子系统名称 配套版本地址 FISCO-BCOS 2.X.X
节点前置服务 WeBASE-Front Release v1.4.3 FISCO BCOS 2.7.1
节点管理服务 WeBASE-Node-Manager Release v1.4.3 FISCO BCOS 2.7.1
WeBASE管理平台 WeBASE-Web Release v1.4.3 FISCO BCOS 2.7.1
签名服务 WeBASE-Sign Release v1.4.3 FISCO BCOS 2.7.1
交易服务 WeBASE-Transaction Release v1.4.0 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子系统名称 配套版本地址 FISCO-BCOS 2.X.X
节点前置服务 WeBASE-Front Release v1.4.2 FISCO BCOS 2.7.0
节点管理服务 WeBASE-Node-Manager Release v1.4.2 FISCO BCOS 2.7.0
WeBASE管理平台 WeBASE-Web Release v1.4.2 FISCO BCOS 2.7.0
签名服务 WeBASE-Sign Release v1.4.2 FISCO BCOS 2.7.0
交易服务 WeBASE-Transaction Release v1.4.0 FISCO BCOS 2.7.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子系统名称 配套版本地址 FISCO-BCOS 2.X.X
节点前置服务 WeBASE-Front Release v1.2.4 FISCO BCOS 2.3.0
节点管理服务 WeBASE-Node-Manager Release v1.2.4 FISCO BCOS 2.3.0
WeBASE管理平台 WeBASE-Web Release v1.2.4 FISCO BCOS 2.3.0
数据导出代码生成子系统 WeBASE-Codegen-Monkey V1.2.0 FISCO BCOS 2.3.0
数据导出子系统 WeBASE-Collect-Bee V1.2.0 FISCO BCOS 2.3.0
签名服务 WeBASE-Sign Release v1.2.2 FISCO BCOS 2.3.0
交易服务 WeBASE-Transaction Release v1.2.2 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子系统名称 配套版本地址 FISCO-BCOS 2.X.X
节点前置服务 WeBASE-Front Release v1.2.3 FISCO BCOS 2.2.0
节点管理服务 WeBASE-Node-Manager Release v1.2.2 FISCO BCOS 2.2.0
WeBASE管理平台 WeBASE-Web Release v1.2.2 FISCO BCOS 2.2.0
数据导出代码生成子系统 WeBASE-Codegen-Monkey V1.2.0 FISCO BCOS 2.2.0
数据导出子系统 WeBASE-Collect-Bee V1.2.0 FISCO BCOS 2.2.0
签名服务 WeBASE-Sign Release v1.2.2 FISCO BCOS 2.2.0
交易服务 WeBASE-Transaction Release v1.2.2 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子系统名称 配套版本地址 FISCO-BCOS 2.X.X
节点前置服务 WeBASE-Front Release v1.2.2 FISCO BCOS 2.2.0
节点管理服务 WeBASE-Node-Manager Release v1.2.2 FISCO BCOS 2.2.0
WeBASE管理平台 WeBASE-Web Release v1.2.2 FISCO BCOS 2.2.0
数据导出代码生成子系统 WeBASE-Codegen-Monkey V1.2.0 FISCO BCOS 2.2.0
数据导出子系统 WeBASE-Collect-Bee V1.2.0 FISCO BCOS 2.2.0
签名服务 WeBASE-Sign Release v1.2.2 FISCO BCOS 2.2.0
交易服务 WeBASE-Transaction Release v1.2.2 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子系统名称 配套版本地址 FISCO-BCOS 2.X.X
节点前置服务 WeBASE-Front Release v1.2.1 FISCO BCOS 2.1.0
节点管理服务 WeBASE-Node-Manager Release v1.2.1 FISCO BCOS 2.1.0
WeBASE管理平台 WeBASE-Web Release v1.2.1 FISCO BCOS 2.1.0
数据导出代码生成子系统 WeBASE-Codegen-Monkey V1.2.0 FISCO BCOS 2.1.0
数据导出子系统 WeBASE-Collect-Bee V1.2.0 FISCO BCOS 2.1.0
签名服务 WeBASE-Sign Release v1.1.0 FISCO BCOS 2.1.0
交易服务 WeBASE-Transaction Release v1.2.0 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子系统名称 配套版本地址 FISCO-BCOS 2.0.X
节点前置服务 WeBASE-Front Release v1.2.0 FISCO BCOS 2.1.0
节点管理服务 WeBASE-Node-Manager Release v1.2.0 FISCO BCOS 2.1.0
WeBASE管理平台 WeBASE-Web Release v1.2.0 FISCO BCOS 2.1.0
数据导出代码生成子系统 WeBASE-Codegen-Monkey V1.2.0 FISCO BCOS 2.1.0
数据导出子系统 WeBASE-Collect-Bee V1.2.0 FISCO BCOS 2.1.0
签名服务 WeBASE-Sign Release v1.1.0 FISCO BCOS 2.1.0
交易服务 WeBASE-Transaction Release v1.2.0 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子系统名称 配套版本地址 FISCO-BCOS 2.0.X
节点前置服务 WeBASE-Front Release v1.1.0 FISCO BCOS 2.1.0
节点管理服务 WeBASE-Node-Manager Release v1.1.0 FISCO BCOS 2.1.0
WeBASE管理平台 WeBASE-Web Release v1.1.0 FISCO BCOS 2.1.0
数据导出代码生成子系统 WeBASE-Codegen-Monkey V1.1.0 FISCO BCOS 2.1.0
数据导出子系统 WeBASE-Collect-Bee V1.1.0 FISCO BCOS 2.1.0
签名服务 WeBASE-Sign Release v1.1.0 FISCO BCOS 2.1.0
交易服务 WeBASE-Transaction Release v1.0.0 FISCO BCOS 2.1.0

支持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 Release V0.5.4 FISCO BCOS 1.3.8 Release
节点管理服务,文档 WeBASE-Node-Manager Release V0.5.4 FISCO BCOS 1.3.8 Release
WeBASE管理平台,文档 WeBASE-Web Release V0.5.4 FISCO BCOS 1.3.8 Release

安装部署

硬件要求:

配置 最低配置 推荐配置
CPU 1.5GHz 2.4GHz
内存 4GB 8GB
核心 1核 4核
带宽 1Mb 10Mb

快速入门:开发者只需要搭建节点和节点前置服务(WeBASE-Front),就可通过WeBASE-Front的合约编辑器进行合约的编辑,编译,部署,调试。

一键部署:通过一键脚本,可以搭建一个WeBASE的基础环境,可以方便用户体验WeBASE核心功能如:区块浏览,节点查看,合约IDE,交易审计,私钥管理。

企业部署:在生产环境中,建议用户参考详细安装,部署全部功能,保证系统高效和稳定。

可视化部署:先部署 WeBASE 服务,然后通过可视化的界面操作来部署区块链底层(FISCO-BCOS 节点),完成区块链的部署操作,适用于本机部署,多主机部署场景。

快速入门搭建

在区块链应用开发阶段建议用户使用快速入门搭建。在快速入门搭建模式,开发者只需要搭建节点和节点前置服务(WeBASE-Front),就可通过WeBASE-Front的合约编辑器进行合约的编辑,编译,部署,调试。

节点搭建

节点搭建的方法建议使用build_chain

节点前置服务搭建

前提条件

依赖软件 支持版本
Java JDK 8 至JDK 14

备注:部署出现问题请查看问题记录

  1. 下载安装包

    wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.4.3/webase-front.zip
    
  2. 解压

    unzip webase-front.zip
    cd webase-front
    
  3. 拷贝sdk证书文件(build_chain的时候生成的)

    将节点所在目录nodes/${ip}/sdk下的ca.crt、node.crt和node.key文件拷贝到conf下

    如果使用了国密版SSL nodes/${ip}/sdk/gm/下的所有证书拷贝到conf目录下。

    • 注,国密版默认使用非国密SSL,只有在建链时手动指定了-G(大写)时才会使用国密SSL
  4. 服务起停

    国密版则通过vi修改application.yml中将sdk-encryptType设置为1(默认为0),也可以直接通过以下命令进行快速修改,修改后即可执行启停命令进行服务启停。

    sed -i "s%encryptType: 0%encryptType: 1%g" ./conf/application.yml
    

    服务启停命令:

    启动: 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)

_images/front-overview.pngFront页面

一键部署

​ 一键部署可以在 同机 快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。

​ 一键部署会搭建:节点(FISCO-BCOS 2.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。其中,节点的搭建是可选的,可以通过配置来选择使用已有链或者搭建新链。一键部署架构如下:

_images/one_click_struct.png[]

前提条件

环境 版本
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依赖项后重试

检查Java

推荐JDK8-JDK13版本,使用OracleJDK安装指引

java -version

注意:不要用sudo执行安装脚本

检查mysql

MySQL-5.6或以上版本:

mysql --version
检查Python

使用Python3.6或以上版本:

python --version
# python3时
python3 --version

如已安装python3,也可通过python3 --version查看,在运行脚本时,使用python3命令即可

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://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/v1.4.3/webase-deploy.zip

解压安装包:

unzip webase-deploy.zip

进入目录:

cd webase-deploy

修改配置

① mysql数据库需提前安装,已安装直接配置即可,还未安装请参看数据库部署

② 修改配置文件(vi common.properties),没有变化的可以不修改;

③ 一键部署支持使用已有链或者搭建新链。通过参数”if.exist.fisco”配置是否使用已有链,以下配置二选一即可:

  • 当配置”yes”时,需配置已有链的路径fisco.dir。路径下要存在sdk目录,当使用非国密链,或者使用国密链,但是sdk和节点使用非国密ssl连接时,sdk目录里存放非国密sdk证书(ca.crt、node.crt和node.key);当使用国密链,并且sdk和节点使用国密ssl连接时,需在sdk目录里创建gm目录,gm目录存放国密sdk证书(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.4.3
webase.mgr.version=v1.4.3
webase.sign.version=v1.4.3
webase.front.version=v1.4.3

# 节点管理子系统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
# 节点管理子系统服务端口
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

# Encrypt type (0: standard, 1: guomi)
encrypt.type=0
# ssl encrypt type (0: standard ssl, 1: guomi ssl)
# only guomi type support guomi ssl
encrypt.sslType=0

# 是否使用已有的链(yes/no)
if.exist.fisco=no

# 使用已有链时需配置
# 已有链的路径,start_all.sh脚本所在路径
# 路径下要存在sdk目录
# 当使用非国密链,或者使用国密链,但是sdk和节点使用非国密ssl连接时,sdk目录里存放非国密sdk证书(ca.crt、node.crt和node.key)
# 当使用国密链,并且sdk和节点使用国密ssl连接时,需在sdk目录里创建gm目录,gm目录存放国密sdk证书(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.0
# 搭建节点个数(默认两个)
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.4.3        ========
==============    webase-node-mgr version  v1.4.3   ========
==============    webase-sign version  v1.4.3       ========
==============    webase-front version  v1.4.3      ========
============================================================
  • 服务部署后,需要对各服务进行启停操作,可以使用以下命令:
# 一键部署
部署并启动所有服务        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-webnginx进程,以及签名服务进程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
Ubuntu环境安装Java

  # 安装默认Java版本(Java 8或以上)
  sudo apt install -y default-jdk
  # 查询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、node.crt、node.key)复制到该目录,再重新部署。如果是国密链,并且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加速攻略

企业部署

1、企业部署

WeBASE四个服务的部署架构如下图:节点前置需要和区块链节点部署在同一台机器,签名服务可以和节点前置分开部署,也可以同机部署;节点管理和WeBASE管理平台可以同机部署,也可以分开部署。在企业生产环境,为了容灾往往会在多个节点上部署节点前置,也会部署多个签名服务、节点管理和WeBASE管理台。

_images/Framework_21.png

具体部署可以参考《WeBASE管理平台使用说明》中手动搭建部分。

2、使用手册

WeBASE管理平台的使用请查看使用手册

可视化部署

可视化部署是指通过 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 +
操作系统

部署节点的主机操作系统需要满足安装 Docker 服务的最低版本要求;

操作系统 最低要求
CentOS / RHEL CentOS 7.3
Ubuntu Xenial 16.04

端口开放

主机防火墙需要开放以下端口。如果是云服务器,需要配置云服务器安全组策略中的端口开放规则。

端口 描述
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的免密登录远程操作,在远程的节点主机中执行系统命令来操作节点。

下面介绍配置免密登录的各个步骤

重要

  1. 配置 WeBASE-Node-Manager 主机到其它节点主机的 SSH 免密登录;
  2. 配置Ansible的hosts列表并配置免密登录私钥路径
  3. 注意免密登录的账号sudo权限,否则会造成Docker服务启动、检测端口占用失败;
  4. 如果免密账号为非 root 账号,保证账号有 sudo 免密 权限,即使用 sudo 执行命令时,不需要输入密码;参考本章节的[sudo账号配置]

免密登录配置方法

重要

  1. 如果 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.4.3/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.4.3
webase.mgr.version=v1.4.3
webase.sign.version=v1.4.3
fisco.webase.docker.cdn.version=v1.4.3

# 节点管理子系统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

# 节点管理子系统服务端口
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.4.3        ========
==============    webase-node-mgr version  v1.4.3   ========
==============    webase-sign version  v1.4.3       ========
============================================================
  • 服务部署后,需要对各服务进行启停操作,可以使用以下命令:
# 可视化部署
部署并启动可视化部署的所有服务  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-Web)
  • 节点管理子系统(WeBASE-Node-Manager)
    • 参考 节点管理服务 WeBASE-Node-Manager 部署文档 部署 WeBASE-Node-Manager 服务
    • 修改 WeBASE-Node-Manager/dist/conf/application.yml 配置文件示例如下:
      • 配置文件中 deployType1,启用节点管理服务的可视化部署功能
      • 配置文件中 webaseSignAddress 的 IP 地址,其余节点主机需要通过此IP访问签名服务;注,此处IP不能使用127.0.0.1

重要

  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 服务
  • 如果部署 国密 版本
    • 国密链需要将WeBASE-Node-Manager yml中的encryptType配置修改为1
  • 部署时,默认的链名为default_chain,默认机构名为agency1
  • 部署节点的所有操作将使用Ansible免密的免密SSH账号进行操作,请确保Ansible自检通过

打开节点管理平台页面后,登录后修改密码,默认进入可视化部署引导页,点击右上角可以进入主机管理开始部署节点

部署节点主要包含三步:添加并检测节点主机、初始化主机(检查Docker与安装依赖)

首先需要选中镜像拉取方式,推荐使用自动从CDN拉取并加载方式。离线环境或网络不好的情况下,推荐使用手动加载方式,提前在各个节点主机下载并加载镜像

(一)添加主机

_images/add_host_index.pngvisual-deploy-host-add

添加主机时,需要填入主机的IP与部署节点的目录

  • 仅在宿主机(即节点管理服务所在主机)部署节点时,则添加主机必须为127.0.0.1,否则填写公网IP或内网IP需要配置Ansible host
  • 添加主机时,将检查该IP是否可以连通,同时将检查该主机的路径是否可访问,并自动创建该目录

_images/add_host.pngvisual-deploy-host-add

(二)添加节点信息

_images/add_deploy_node.pngvisual-deploy-node-add

节点管理,先点击“新增节点”添加节点信息

  • 可以在一台主机中指定节点数量
  • 添加多个主机的节点,需要确保填入的各个主机间的P2P端口和前置端口互通,否则将影响节点正常运行

_images/deploy_node_info.pngvisual-deploy-node-info

(三)检查主机

_images/host_check_start.pngvisual-deploy-start-check

添加节点信息后,将自动检查一下依赖

  • 检查主机的可用内存是否支持当前的节点数
  • 检测机器的端口是否已被占用
  • 检测Docker服务是否已启用,并通过hello-world的镜像进行测试

_images/host_check_suc.pngvisual-deploy-host-check

检测失败的信息将在操作日志中显示,只有添加的节点信息全部通过才可以开始下一步“初始化”

  • 如果提示内存不足(Free memory too low),则可以释放主机内存,一节点至少 1G 可用内存(Free memory)
  • 如果提示端口被占用,可根据提示的端口号,在主机释放端口或删除填入的节点信息,修改后重新填入
  • 如果提示Docker相关错误,需要到主机确认已安装Docker并已启用,是否已配置Docker组,确保能拉取并运行hello-world镜像
  • 部分虚拟机缺少bc依赖(bc command not found),需要手动安装bc

_images/node_check_fail.pngvisual-deploy-host-check-fail

排除错误原因后,可以点击“检测”按钮,再次检测

(四)初始化主机

点击“初始化”按钮进行主机初始化,将自动完成以下操作,初始化成功后才能进行下一步的部署操作,“初始化”按钮将变成“部署”按钮

  • 自动检测并安装相关系统依赖,如netstat, wget
  • 加载节点镜像:根据选中的镜像加载方式进行加载(若手动加载则检测镜像已存在于节点主机)
  • 自动加载镜像时,会在节点主机指定目录中创建download目录,并下载镜像的tar包保存于此;若已存在同名tar包将不重复下载,直接使用已有tar包(docker-fisco-webase.tar)

_images/host_init.pngvisual-deploy-host-init

  • 初始化操作预计在两到三分钟内完成,若网速过慢或不稳定建议通过手动加载镜像方式拉取 若初始化失败,则需要结合操作日志排查上述步骤的错误原因,排除主机中存在的问题后,重新执行检测,初始化操作

(五)部署

添加的主机状态都为“初始化成功”后,点击“部署”按钮后,将自动完成以下操作

  • 根据填入的节点信息自动生成链配置与证书
  • 通过SCP将节点与前置的配置文件、证书传输到各个主机的指定目录下

_images/host_start_deploy.pngvisual-deploy-config-start

  • 生成配置与传输配置完成后,将自动进入链初始化页面,届时将自动启动各个主机的节点,此过程预计需要几分钟时间,直到链状态为“运行”

_images/chain_deploying.pngvisual-deploy-config-ing

若出现启动失败,需要结合报错提示,检查节点主机状态正常,各个节点主机间端口互通,网速过慢或网络丢包严重等等,排查后,点击“删除链”重置当前的链后,重新尝试建链

_images/chain_delete.pngvisual-deploy-delete-chain

如始终无法部署,可以结合Node-Manager日志排查错误原因,并在github上提交配上日志和环境信息的issue

新增节点

节点新增,也称作节点扩容,指在已有的区块链服务中,在新的主机上,添加一个新的节点。

提示:

  • 新主机需要按照系统依赖中的节点机进行配置
  • 新增的节点,默认处于游离状态,需要手动变更节点为共识或者观察节点后,新节点开始从原有节点同步区块数据。

具体操作:

新增节点与部署时是同样的三个步骤:添加并检测节点主机、初始化主机(检查Docker与安装依赖)、启动节点并重启链

添加主机

若需要添加新的主机时,填入主机的IP与部署节点的目录

_images/add_host.pngvisual-deploy-host-add

  • 点击新增节点按钮

_images/add_node_index.pngvisual-deploy-add-node-index

添加主机信息,与部署链时相似的操作

  • 选择 Docker 拉取方式,推荐使用CDN拉取,离线环境或网络不好的情况下,推荐使用手动加载方式,提前在各个节点主机下载并加载镜像
  • 选择“新增节点”添加信息,选择主机与节点的端口、节点数量等;
  • ,若需要添加新的主机,则按文档的环境要求准备新的主机,并到“主机管理”添加主机

依次执行同部署链相同的检测、初始化、部署即可

_images/add_node.pngvisual-deploy-add-node

点击“部署”后将生成并传输新的节点的配置文件到目标主机,同时新增节点比部署链会多出以下操作

  • 自动在链的其他节点中添加新节点的P2P连接配置,并在新节点的P2P配置中添加本次新增节点的IP与已有的非游离节点的IP
  • [可选]配置完成后,需要手动“重启”已有节点才能使新的P2P配置在已有节点中生效,即双向互联;新节点会默认连接已有的所有节点,此操作可视具体情况自行操作
  • 若新节点启动失败,将新节点删除并重新尝试添加即可

_images/add_node_restart.pngvisual-deploy-add-node-restart

重启完成后,需要创建私钥或使用已有私钥,将新节点设为共识节点或观察节点

_images/add_node_remove_node.pngvisual-deploy-add-node-removed

节点操作

节点操作,包括:节点的启停、节点共识类型切换、删除节点

  • 节点的类型切换:共识,观察和游离
    • 在可视化部署中,变更节点为游离节点时,该群组内,至少仍有两个共识节点
    • 变更节点类型,需要发送交易,请先在私钥管理 中 添加私钥账号;

修改节点为共识节点

_images/add_node_set_sealer.pngvisual-deploy-add-node-sealer

若需要添加私钥:

_images/visual-deploy-add-user-key.pngvisual-deploy-add-user-key

  • 节点的启动,停止
    • 若节点的docker容器被意外删除,通过页面点击“启动”即可完成节点重启
    • 停止或重启操作时,请确保满足链的共识容错要求。设为观察节点可避免影响共识状态
    • 每次启停操作大约需要30秒
  • 删除节点
    • 将节点设置为游离节点后,即可安全删除节点,删除后,链将会移除被删节点的P2P配置,并重启链
    • 删除节点时,节点必须处于停止状态

_images/node_stopped.pngvisual-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.1

提示:

拉取方式
  • 检查本地是否已有镜像
# 检查本地是否有镜像
docker images -a |grep -i "fiscoorg/fisco-webase" | grep -i v2.7.1
    
# 如果有如下输出,表示本地已有镜像;否则表示本地没有镜像
fiscoorg/fisco-webase   v2.7.1     bf4a26d5d389  5 days ago   631MB
  • 如果本地没有镜像(如果本地有镜像,跳过)

  • 如果需要替换镜像,执行docker rmi [ImageId]删除镜像即可

    • 从 CDN 拉取镜像压缩包
    # 从 CDN 拉取镜像 tar 文件
    # 非国密
    wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.4.3/docker-fisco-webase.tar
    
    # 解压镜像 tar 文件
    docker load -i docker-fisco-webase.tar
    
    • 从 Docker 官方拉取镜像
    # 执行 Docker 拉取命令
    docker pull fiscoorg/fisco-webase:v2.7.1 
    
  • 压缩镜像到 tar 文件

# 压缩镜像为 tar 文件
docker save -o docker-fisco-webase.tar fiscoorg/fisco-webase:v2.7.1
  • 发送镜像 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.1  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" 命令检查是否有镜像。

部署失败以及区块链重置

如果在部署区块链服务时,出现了部署失败的问题,可以使用重置功能,重置区块链服务,然后进行重新部署。

如果要重置当前区块链,点击重置按钮,等待重置完成。

执行重置操作,并 不会真正物理删除节点的数据(但会删除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

WeBASE管理平台使用手册

概览

基本描述

WeBASE管理平台是由四个WeBASE子系统组成的一套管理FISCO-BCOS联盟链的工具集。

主要功能

  1. 区块链数据概览
  2. 节点管理
  3. 合约管理
  4. 私钥管理
  5. 系统管理
  6. 系统监控
  7. 交易审计
  8. 订阅事件
  9. 账号管理
  10. 群组管理

_images/overview_2.png

部署架构

这套管理工具主要由:节点前置,签名服务,节点管理,WeBASE管理平台四个WeBASE子系统构成。WeBASE四个服务的部署架构如下图:节点前置需要和区块链节点部署在同一台机器;节点管理和WeBASE管理平台可以同机部署,也可以分开部署。

_images/Framework_2.png

使用前提

群组搭建

区块链浏览器展示的数据是从区块链上同步下来的。为了同步数据需要初始化配置(添加群组信息和节点信息),故在同步数据展示前需要用户先搭建好区块链群组。FISCO-BCOS 2.0提供了多种便捷的群组搭建方式。

  1. 如果是开发者进行开发调试,建议使用build_chain
  2. 如果是开发企业级应用,建议使用企业部署工具FISCO-BCOS generator

两者的主要区别在于build_chain为了使体验更好,搭建速度更快,辅助生成了群组内各个节点的私钥;但企业部署工具出于安全的考虑不辅助生成私钥,需要用户自己生成并设置。

WeBASE管理平台搭建

WeBASE管理平台分为四个部分:节点前置,签名服务,节点管理,WeBASE管理台。

当前版本我们提供了三种搭建方式:一键搭建、纯手动搭建各子系统、可视化部署

1、一键搭建

适合同机部署,快速体验的情况使用。具体搭建流程参见安装文档

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.15002),机构名则根据实际自定义填写

_images/node_manager_add_front_2.png

前置添加完成后,管理平台就会开始拉取群组信息和群组的区块信息。此时数据概览页面应该就有数据了。为了解析和审计区块数据,需要把相关的合约和用户导入到管理平台。具体看下面两个小节。

合约管理

1、添加合约

管理平台提供两种添加合约的方式,一个是新建一个合约,一个是导入已有合约。同时合约编辑器还提供新建目录。用目录的形式管理合约,主要是为了解决同名合约引用的问题。合约添加完成后,需要编译保存。

_images/contract_add_2.png

2、部署合约

合约编译时会自动保存合约内容,编译成功后可以执行合约部署。

_images/contract_compile_deploy_2.png

3、合约调用

在合约部署成功后,可以在合约IDE页面的右上角点击发交易,向合约发送交易进行合约调用。

_images/contract_send_transaction.png

交易发送成功后,将返回交易回执。可以在数据概览-交易列表-更多中根据transactionHash搜索交易,通过交易解析和Event解析查看可视化的交易回执信息。具体操作方法参考下文的区块链数据概览章节中的交易解析与Event解析。

_images/transaction_output.png

私钥管理

私钥管理提供了新建私钥用户和导入公钥用户两种用户导入方式。第一种方式主要用于新建用户(私钥托管在签名服务中),在管理平台的合约管理中部署和调用合约。第二种方式主要用于把交易和用户关联起来。

_images/key_manager_tx_audit.png

各模块的详细介绍

本小节概要介绍管理平台的各个模块,方便大家对WeBASE管理平台套件有一个整体的认识。这套工具集主要提供的管理功能有:

区块链数据概览

数据概览页面,展示了区块链的核心数据指标:节点个数,区块数量,交易数量,通过管理台部署的合约数量。关键监控指标:历史15天的交易量。

  • 节点信息列表:展示了节点的ID,节点块高,节点view和运行状态;
  • 区块信息列表:展示了最近5个块的概览信息,点击更多可以查看更多历史区块;
  • 交易信息列表:展示了最近5个交易的概览信息,点击更多可以查看更多历史交易;

_images/overview_2.png

其中右下角的交易信息列表点击可跳入具体一条交易中查看交易详细信息:交易详细信息还包含了

  • 交易解析:可以将交易返回的交易回执数据进行解析并可视化;
  • Event解析:可以将交易返回的Event数据进行解析并可视化;

未解析的raw数据如下图所示:

_images/transaction_analysis_raw.png

进行交易解析后如下图所示:

_images/transaction_analysis.png

同样的,Event数据解析后可以看到:

_images/transaction_event.png

节点管理

节点管理主要提供了前置列表、节点列表、修改节点共识状态的功能。

用户可以通过新增节点前置,把新的节点前置添加到前置列表。系统会默认拉取这些前置所在的群组和各个群组的节点信息。在节点列表中,用户可以修改节点的共识状态:共识节点、观察节点、游离节点。其中修改为游离节点相当于将节点移出群组,停止节点前务必先将节点设置为游离节点,否则将触发节点异常。

节点管理:

显示所有的共识/观察节点(无论运行或停止),以及正在运行的游离节点

_images/node_manager_2.png

修改节点共识状态:

_images/node_manager_edit.png

合约管理

合约管理提供了一个图形化的合约IDE环境、已部署的合约列表、合约CNS查询以及预编译合约的CRUD功能。

图形化合约IDE提供了一整套的合约管理工具:新建合约,保存合约,编译合约,部署合约,调用合约接口。其中,新建合约可以通过编辑键入合约内容,也可以上传合约文件;编译合约后才可以部署合约;部署合约成功后,可以通过发送交易调用合约接口。具体操作步骤可以参考上一章节中系统初始化配置介绍。

合约IDE:

_images/contract_2.png

合约列表:

_images/contract_list_2.png

ABI列表:支持导入已部署的合约ABI进行合约调用

_images/import_abi.png

ABI编码:支持对ABI的方法与入参进行编码

_images/abi_analysis.png

CNS查询:CNS(Contract Name Service)是通过提供链上合约名称与合约地址映射关系的记录及相应的查询功能,方便调用者通过记忆简单的合约名来实现对链上合约的调用。详情可查看FISCO-BCOS文档的 CNS方案

注册CNS后,CNS可以根据合约名和合约版本号查询CNS信息(合约名和合约版本号用英文冒号连接)。若缺失合约版本号,则返回所有符合合约名的合约信息。

  • 需要在合约管理页面部署合约时勾选CNS,或合约列表页面中点击CNS注册,即可完成注册

_images/new_cns_index.png

CRUD:CRUD通过在Solidity合约中支持分布式存储预编译合约,可以实现将Solidity合约中数据存储在FISCO BCOS平台AMDB的表结构中,实现合约逻辑与数据存储的分离。CRUD可以在FISCO-BCOS链上创建数据表,并对表进行增删改查操作,具体CRUD操作教程查看FISCO-BCOS控制台CRUD命令

_images/contract_crud.png

EventLog查看:支持输入合约地址和ABI、区块范围和Event名,即可查询并同步返回

_images/event_sync_query.pngEventLog

私钥管理

私钥管理包含新建私钥用户和新建公钥用户两个功能。在合约管理界面,可以看到合约部署和交易调用功能。这里的私钥管理可以新建私钥用户,私钥将托管在签名服务中,然后通过签名服务对合约部署和合约调用进行签名。注:外部账户可通过新建公钥账户导入,主要用于把交易和用户关联起来。

私钥管理:

_images/private_key_manage.png

添加私钥用户:

_images/key_manager_add_user_2.png

导入私钥:支持导入.txt/.pem/.p12格式及明文的私钥,其中.txt私钥可由WeBASE-Front导出,.pem/.p12私钥可由console控制台导出。如果需要导入自定义私钥,可根据节点前置导出的.txt私钥,编辑其中的privateKey字段内容。

_images/import_private.png

系统管理

系统管理目前支持权限管理、系统配置管理、证书管理的功能。

权限管理

基于FISCO BCOS 2.5.0及以上版本的基于角色的权限管理:支持链委员会管理和运维管理员管理:

  • 链委员会管理:链委员会的修改操作均需要通过多个委员投票完成,链委员拥有投票权,可以增删节点、修改链配置、添加撤销运维、冻结解冻合约、对用户表的写权限控制;
    • 修改委员会成员(新增/撤销委员)、修改委员投票阈值、修改委员投票权重值等操作均需要通过投票进行修改;
    • 投票阈值为投票生效的阈值,有效投票权重数/委员总权重数>生效阈值投票才能生效,阈值为开区间,即:投票权重比例必须大于阈值(不包含等于);
    • 每次投票操作,如果是委员投票,则记录操作内容和投票委员,不重复计票;
    • 投票设置过期时间,根据块高,blockLimit的10倍(即10000),固定不可改;
    • 用户不能同时成为链委员和运维管理员;
  • 运维管理: 运维由链委员直接赋予(无需通过投票赋予),运维可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约;

注:链委员会为空时,不作链委员会权限限制,所有用户拥有委员权限,可以自由给自身或其他用户添加链委员权限;设置了第一个链委员后,非链委员用户无权限;请妥善保管链委员的私钥!

运维管理员为空时,所有用户拥有运维权限;同理,设置了第一个运维管理员后,非运维用户无权限;

FISCO-BCOS基于角色的权限管理机制详情可以参考文档使用手册-基于角色的权限控制,具体的设计原理可以参考文档 系统设计-基于角色的权限控制

链委员会管理:

_images/governance_committee.png

运维管理员管理:

_images/governance_operator.png

基于FISCO BCOS 2.0.0 - 2.4.x版本的基于表的权限管理:支持链权限管理和普通权限(四种)管理:

  • 链权限管理为分配权限的链管理员,可以使用权限分配功能,非链管理员账户无权限分配功能;
  • 普通权限管理包含四种权限: 部署合约和创建用户表权限, 节点管理权限, CNS管理权限, 系统参数管理权限;

注:链管理员为空时,不作权限限制,所有用户拥有权限,可以自由给自身或其他用户添加权限;设置了第一个链管理员后,非管理员用户无权限分配功能;请谨慎设置第一个链管理员;

普通权限管理员为空时,所有用户拥有特定功能,如:节点管理员为空时,所有用户可以管理节点状态,设置了第一个节点管理员后,非节点管理员不可管理节点状态;

FISCO-BCOS基于表的权限管理机制详情可以参考文档FISCO-BCOS基于表的权限控制

链权限管理:

_images/permission_admin.png

普通权限管理:

_images/permission_normal_admin.png

系统配置管理:系统属性包含FISCO-BCOS链的tx_count_limit和tx_gas_limit两种属性值的配置。注:一般不建议随意修改tx_count_limit和tx_gas_limit,如下情况可修改这些参数:

  • 机器网络或CPU等硬件性能有限:调小tx_count_limit,降低业务压力;
  • 业务逻辑太复杂,执行区块时gas不足:调大tx_gas_limit。

配置管理:

_images/system_config.png

配置系统属性值:

_images/system_config_edit.png

证书管理:支持导入和查看证书信息,包括查看Front对应节点的链证书、机构证书、节点证书,可查看证书内容、证书有效期、证书链关系等信息;

  • 证书链关系可通过比对父证书指纹与证书指纹查找;
  • 平台将默认加载所有Front的证书,需要在Webase-Front配置文件中配置nodePath节点路径;

FISCO-BCOS证书说明可以参考FISCO-BCOS使用手册的证书说明

证书列表:

_images/cert_manage.png

导入证书:

_images/cert_manage_add.png

系统监控

系统监控包含了监控异常告警两部分;

监控主要包括节点监控和主机监控,可以选择节点、时间范围等条件进行筛选查看:

  • 节点监控主要有区块高度,pbftview,待打包交易;
  • 主机监控主要有主机的CPU,内存,网络和硬盘IO;

节点监控:

_images/node_monitor_2.png

主机监控:

_images/host_mornitor_2.png

异常告警部分主要包括邮件服务配置告警类型配置

邮件服务配置:

如何配置邮件服务可查看本文档末尾的附录-配置邮件服务指南

可配置邮件告警所用到的邮件服务器相关参数,包含邮件协议类型protocol、邮件服务器地址host、服务使用端口port、用户邮箱地址username、用户邮箱授权码password;鉴权选项包含Authentication验证开关authentication(默认开启);

  • 邮件告警的邮箱协议类型默认使用SMTP协议,使用25默认端口,默认使用username/password进行用户验证,目前仅支持通过TLS/SSL连接邮件服务器;
  • 目前仅支持更新原有的邮件服务器配置,不支持新增配置;

使用测试功能前,需要到“告警类型配置”中,在左上角**开启邮件服务总开关**;

注:邮件告警功能需要确保邮件服务器配置正确;务必使用测试按键,向指定的邮箱地址发送测试邮件并查收邮件。如果配置错误,将发送测试邮件失败,指定邮箱将收不到测试邮件;

_images/mail_server_config.png

邮件服务配置测试:

以当前表单中输入的配置值发送测试邮件(无论是否已保存,都以表单中当前的值为配置发送测试邮件);需要提前开启邮件服务开关

_images/mail_server_config_test.png

告警类型配置(告警邮件配置):

包含了告警类型的配置,告警日志的查看;可配置告警类型的参数值,包含告警邮件标题ruleName,告警邮件内容alertContent,告警邮件发送时间间隔alertIntervalSeconds(单位:秒),上次告警时间lastAlertTime,目标告警邮箱地址userList,是否启用该类型的邮件告警enable,告警等级alertLevel等;

  • 包含了节点状态告警、审计告警、证书有效期告警三种;
  • 目前仅支持更新原有的三个邮件告警的配置,不支持新增配置;
  • 需要先在左上角开启邮件服务才可以开启各个类型的邮件告警以及发送测试邮件;

包含了不同告警类型的配置,左上角可以开启邮件服务(作为告警邮件的全局开关),点击告警标题可查看详细配置内容;

下方则是告警日志的内容,可查看告警邮件的具体内容;告警项已处理后,可以点击确认键确认已消除异常;

其中在WeBASE-Node-Manager的配置文件application.yml的constant可以配置定时任务定时监控节点状态、审计状态、证书有效期的频率,监控到异常状态时将触发邮件告警,发送告警邮件到联系人邮箱,同时按配置的间隔时间定时重复发送告警邮件,直到异常状态消除;

注:定时任务的频率为检查系统是否异常的频率,而配置不同的告警类型中的告警时间间隔是发送告警邮件的频率,如,设置检查频率为1h,配置的告警频率为6h,那么,系统会每小时检查一次系统状态,若出现异常,在定时任务检查到异常时,距离上次告警邮件超过6小时,则会发送一次告警邮件。

_images/alert_rule.png

点击修改可以修改配置项的值,启用/禁用不同类型的告警,修改配置后不需要重启即可生效;

注:修改告警内容时,大括号{}以及里面的变量名不可去除,否则无法正常发送告警邮件。

_images/alert_rule_edit.png

交易审计

联盟链中各个机构按照联盟链委员会制定的规章在链上共享和流转数据。这些规章往往是字面的,大家是否遵守缺乏监管和审计。因此为了规范大家的使用方式,避免链的计算资源和存储资源被某些机构滥用,急需一套服务来辅助监管和审计链上的行为。交易审计就是结合上面的区块链数据,私钥管理和合约管理三者的数据,以区块链数据为原材料,以私钥管理和合约管理为依据做的一个综合性的数据分析功能。交易审计提供可视化的去中心化合约部署和交易监控、审计功能,方便识别链资源被滥用的情况,为联盟链治理提供依据。

交易审计主要指标:

主要指标 指标描述
用户交易总量数量统计 监控链上各个外部交易账号的每日交易量
用户子类交易数量统计 监控链上各个外部交易账号的每种类型的每日交易量
异常交易用户监控 监控链上出现的异常交易用户(没在区块链中间件平台登记的交易用户)
异常合约部署监控 监控链上合约部署情况,非白名单合约(没在区块链中间件平台登记的合约)记录

用户交易审计:可以指定用户、时间范围、交易接口进行筛选查看交易

_images/tx_audit_user_tx_2.png

异常用户审计:

_images/tx_audit_abnormal_user_2.png

异常合约审计:

_images/tx_audit_abnormal_contract_2.png

订阅事件

订阅事件管理:可查看前置中已订阅的链上事件通知,包括出块事件列表和合约Event事件列表。详情请参考节点前置-链上事件订阅和通知

出块事件列表:

_images/event_new_block.png出块事件列表:

合约Event事件列表: _images/event_contract_event.png合约Event事件列表

账号管理

账号管理提供管理台登陆账号的管理功能。管理台用户分为三种角色:

  • 普通用户,只有查看权限;

  • 管理员用户,拥有管理平台的读写权限;

  • 开发者用户,拥有开发者自身的合约和私钥用户的读写权限,数据概览权限;

    开发者模式默认关闭。如需开启此功能,可以在WeBASE-Node-Manager配置文件application.yml中修改developerModeEnable为true,然后重启服务。

    _images/developer_mode_enable.png

注:此处账号与私钥管理的私钥用户为两种不同的概念,账号用于管理台权限控制,私钥用户为区块链账户。

账号管理:

_images/login_user_manager_2.png

添加登陆账号并指定账号类型:

_images/login_user_add_2.png

群组管理

群组管理提供动态管理群组的功能,包含:生成群组(生成群组配置文件到单个或多个节点)、启动群组、停止群组、移除群组(标记为移除)、恢复群组、删除群组数据等操作

群组管理入口位于右上角切换群组的下拉窗口中:

_images/group_manage_entrance.png

进入群组管理后,可以看到群组列表中有“运行”、“维护中”、“异常”的三种状态。

  • 正常运行的群组为“运行”;
  • 群组中所有节点(节点前置)已停止了群组,会显示为“维护中”,此时只需要将节点的群组重新启动即可恢复正常;
  • 本地群组数据与链上数据冲突时,会显示为“异常”:
    • 若本地群组的区块数据与链上区块数据存在冲突,如搭建了新的链而后台数据库没有重置,或者群组的所有前置处于异常状态,则会显示群组为异常;
    • 如果同一个群组编号的不同节点之间创世块的配置不同,即群组同名,但各节点的群组创世块不同,也会标记该群组为异常。在群组显示异常时,需要用户检查前置状态,如重建链了,可通过删除群组数据重新拉取来恢复正常,如创世块冲突,则需要删除冲突的节点前置;

_images/group_manage_main.png

删除群组数据,将删除后台数据库中保存的群组数据,不会删除链数据。 _images/remove_group_data.png

如果未停止所有节点的群组就删除群组,会在删除后重新拉取数据 _images/remove_group_data_2.png

下面介绍如何进行动态群组管理,包含在多个节点中批量生成群组节点加入已有群组

批量生成群组

选中节点后,生成群组将自动创建群组、启动群组、并通过创世块配置将节点设置为共识节点

如下图,可以选中需要创建新群组的节点,点击确认后即可完成创建 _images/group_generate.png

节点加入已有群组

点击群组状态/修改群组,可以查看群组中各个节点的状态;也可以在该页面启动/停止/删除/恢复节点的群组,或添加节点到已有群组 _images/group_all_front_stop.png

不属于当前群组的节点中会显示“添加”,可以将节点加入该群组;

该操作实际上包含三个步骤,创建与启动是加入的同时自动完成的,用户需要确保新节点加入新群组的共识节点/观察节点

  • 加入群组操作会在该节点的conf目录下生成群组创世块文件,并启动群组
  • 创世块文件的配置需和加入群组的原有配置完全一致,可通过群组列表中导出配置导入配置,或到群组中节点conf目录下查看群组的时间戳与共识节点列表
  • 创建并启动群组后,需要将节点加入到新群组的共识节点/观察节点
    • 若本地有新群组的节点前置,则可以通过切换到相应群组的“节点管理”中设置新节点为共识节点;
    • 如果本地没有新群组的节点前置,则需要到已加入该群组的节点的控制台或节点管理平台将新节点加入到共识节点/观察节点

加入新群组的共识节点/观察节点说明,或直接继续添加节点到新群组 _images/join_group_desc.png

填写已有群组的创世块文件配置,包含时间戳与共识节点NodeId列表,如下图:

注,创世块是群组的标志。新节点加入群组需保证创世块的nodeIdList完全一致,例:若已有群组的共识节点列表只有node0,当node1加入该群组时,创世块配置的共识节点列表仍填写只有node0的列表,然后再通过节点管理将新节点node1动态添加到该群组。如果错填成包含node0和node1的共识节点列表,那么将生成一个和当前群组同名,但创世块完全不同的新群组。而群组管理会监控到同名群组的创世块存在冲突,标志群组为“异常”。

_images/join_group_config.png

节点加入新群组后,如果节点未添加到共识节点/观察节点,所属群组一列将显示为横杠;已加入的节点该列会显示具体的群组编号 _images/join_group_after.png

在右上角切换到新群组后,在“节点管理”页面中可以将游离的新节点加入到共识节点/观察节点中 _images/join_group_add_sealer.png

详情使用说明可以参考本文档附录-动态群组管理使用指南

升级兼容说明

WeBASE-Front升级至最新版,可查看节点前置升级说明,请结合WeBASE-Front Changelog进行阅读

WeBASE-Node-Manager升级至最新版,可查看节点管理服务升级说明,请结合WeBASE-Node-Manager Changelog进行阅读

WeBASE-Sign升级至最新版,可查看签名服务升级说明,请结合WeBASE-Sign Changelog进行阅读

附录

配置邮件服务指南

请先阅读本文档中管理平台使用手册的各模块的详细介绍-系统监控-邮件服务配置

问:邮件服务怎么用?

答:在后台搭建邮件服务(邮箱服务器),用于后台监控到系统异常情况时,发送告警邮件到指定邮箱,方便运维;

下面介绍具体的使用方法:

邮件服务所使用的邮箱服务器:

  1. 企业可使用自行搭建的邮箱服务器;
  2. 普通用户可以使用QQ邮箱、网易邮箱等第三方邮箱;
开通邮箱服务

163邮箱开通邮箱服务:

  • 登陆邮箱后,在邮箱的设置中找到包含SMTP的设置项;

_images/mail_guide_setting_163.png

  • 勾选IMAP/SMTPPOP3/SMTP,初次开启时,会提醒用户设置授权码,并进行手机安全验证;
  • 设置授权码后,勾选IMAP, POP3, SMTP开启全部服务;

_images/mail_guide_163.png

QQ邮箱开通邮箱服务:

  • 登陆邮箱后,在邮箱的设置账户中找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务项;

_images/mail_guide_setting_qq.png

  • 开启POP3/SMTP服务IMAP/SMTP服务并按照指引进行手机安全验证并设置授权码,;
配置邮件服务

记下所设置的授权码,授权码即邮件服务中用到的“密码”,按照本文档各模块介绍-系统监控进行配置:

第一步,进入“告警类型配置”中,点击左上角“启用告警”以开启邮件服务开关

_images/alert_rule.png

第二步,进入“邮件告警配置”,配置邮件服务

  • 因为Node-Manager仅使用邮箱服务器的发件服务,因此协议类型填写smtp(IMAP/POP3均为收件服务协议);
  • 邮箱服务器填写smtp.xx.com,端口号默认为25即可启用邮件服务;如需使用其他端口如465则需要开放WeBASE-Node-Manager所在服务器的相应端口限制;
  • 用户名填写邮箱地址,密码填写上文设置的授权码

_images/mail_server_config.png

配置完成后,点击“测试”后,输入接收测试邮件的邮箱地址,测试成功即可“保存”邮件服务的配置;

_images/mail_server_config_test.png

注意事项

“邮件告警配置”中填写的端口默认为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连接

群组管理入口

_images/group_manage_entrance.png

群组管理页面

_images/group_manage_main.png

下面我们使用2个节点管理平台,4个节点前置,每个管理台包含两个前置来展示:

_images/nodemgr_front.png

管理台1中包含前置A和B,管理台2中包含前置C和D:

管理台1:

_images/nodemgr_1.png

管理台2:

_images/nodemgr_2.png

群组管理与群组配置文件

动态创建群组包含三个基本操作:创建群组、启动群组、节点加入群组共识

注:节点的动态群组操作是针对单个节点进行的,即,如果创建一个新群组包含4个节点,则需要对4个节点分别调用“创建”、“启动”命令;如果需要查询群组中各节点的群组状态,也需要对4个节点轮询获取群组状态。

WeBASE已对这一步骤进行了封装,自动批量调用各个节点前置的“创建”、“启动”和“查询群组状态”的接口。

操作群组的状态转换如下图: _images/group_state.png

创建群组:

  • 创建群组实际上是调用节点的generateGroup JSON RPC接口,传入参数timestampsealers(WeBASE中为nodeList),并在节点的conf目录下生成群组配置文件group.x.genesisgroup.x.ini
  • 其中group.x.genesis是群组的创世块配置,包含timestampsealers,,该配置一旦启动群组之后就不能再修改,否则引起群组异常。详情可以参考文档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

_images/nodemgr_front.png

具体操作如下:

批量创建群组指的是向group.x.genesis-sealers中包含的所有节点前置发起创建群组的请求(群组的创世块配置如下所示),这要求所有节点的前置在同一个管理台里,才能一次性对所有节点发起创建群组的请求。 若节点分布在多个管理台中,则参考下一小节

{
	// timestamp
	"groupTimestamp": "1591013023063",
	// 群组333共识节点列表
	"nodeIdList": [
		// node A
		"31e2b051abc27b49aff8846a4037e8bdb45acd6ff98fdad42f7b8a9c4887fffcc99edbf4eeafff656f00df07f44ae3609463a7ddc3ba8481f88b43424007fafe",
		// node B
		"c867302e786a790663c5cf6fdbbff96570d00a3500b23c9ddd2dd63ada07b85fbc6f4549a9f05cad60bcf7a6199caa95781fd40a25e9098a2c728b90d88938f8"
	]
}

选中管理台的两个节点后,将分别对这两个节点发起创建群组、启动群组的请求

_images/batch_generate_group.png

创建成功后,可以看到节点A和节点B的group333已处于running状态,且两个节点已经参与新群组group333共识了(橙色区域);

_images/group333_running.png

但是可以看到节点列表中还有两个外部节点;节点A、B的群组编号中显示了号码,则代表该群组属于群组的共识节点/观察节点,否则显示”-“代表是游离节点,仅有P2P连接;

_images/batch_generate_after.png

下一步,我们将处于管理台2的节点C和节点D也加入到这个群组333中来,因此我们进入下一小节,多个管理台之间创建群组,最终实现如下图的状态:

_images/group333_all_sealer.png

多个节点管理台-创建群组并加入群组

此处例子使用两个节点管理台,而更复杂情况可以以此类推。

我们在上面通过管理台1创建了一个由节点A和节点B组成的新群组group333,现在我们把管理台2的节点C和节点D加入到管理台1中创建的群组group333,实现下图的效果,节点C/D的group333处于running状态,且加入group333的共识

_images/group333_all_sealer.png

具体操作如下:

在管理台1中,进入群组管理,导出群组group333的配置内容

_images/export_group_config.png

返回到管理台2的界面中,点击“加入已有群组按钮”

加入群组时,用户需要再加入群组后,手动将群组的新节点添加为共识/观察节点;

_images/join_group_tips.png

点击加入已有群组后,导入群组group333的配置;也可以直接键入群组编号、群组时间戳、创世块共识节点列表

_images/join_group_config.png

选中需要加入该群组的节点后,点击确定;

_images/join_group_select_node.png

创建成功后,可以看到群组列表新增了一个group333,节点C/D的group333处于running状态

_images/group333_nodeCD_runing.png

点开可以查看新群组的节点,可以看到节点C和节点D的“群组编号”为空,即未参与群组共识

_images/join_group_not_sealer.png

注:加入群组后,需要手动将新节点加入到群组的共识/观察节点,节点才会参与新群组的共识

因此,下面我们把节点C和节点D加入到新群组的共识/观察节点列表

由于管理台2中没有已属于群组共识/观察节点的节点,因此需要进入管理台1,切换右上角到群组group333,然后将新加入群组的节点C和节点D修改为共识节点/观察节点。 (修改节点类型需要管理员权限私钥,如果未启用首个管理员,则任意私钥即可修改)

_images/join_group_add_sealer.png

全部修改为观察节点后

_images/join_group_add_sealer_after.png

点击进入群组管理中,查看群组的节点状态,节点C和节点D的“群组编号”已显示333,代表修改成功了

_images/join_group_list_final.png

即如下图所示,节点C/D都已加入群组group333的共识

_images/group333_all_sealer.png

至此,四个节点A/B/C/D成功通过动态群组管理加入到新群组group333中并参与共识了

其他情况
  • 案例1:管理台2中先创建含有节点C的群组group9后,然后将节点D加入group9

如果管理台2中的节点C已在新群组group9中,需要将节点D加入该群组,当前群组拓扑如下

_images/group9_first.png

可以通过点击群组列表中的群组,点击“添加”,按照与上文类似的提示即可添加成功。

_images/join_group_local.png

此时节点D的group9状态为running

_images/group9_generate.png

添加完成后,右上角切换到对应的群组group9,到“节点管理”页,将该节点设置为共识/观察节点(需要创建私钥用户来发交易),即完成加入群组的操作

节点D加入群组group9成功

_images/join_group_local_after.png

修改节点D的节点类型为观察节点

_images/join_group_local_add_sealer.png

点开群组管理中的group9查看节点状态,可以看到节点C和节点D的群组编号已经显示为”9”,说明节点D已成功加入群组group9

_images/join_group_local_final.png

至此,节点C/D的群组group9如下图所示,都处于running状态,且都已参与群组group9的共识

_images/group9_all_sealer.png

  • 案例2:管理台1中先创建共识节点包含四个节点A/B/C/D的群组group10后,在管理台2将节点C/D直接加入group10,省略加入为共识/观察节点步骤

如果一次性创建一个4节点的新群组group4,需要把4个节点的前置都加入到同一个节点管理台,此时,由于nodeList中已经设置了4个节点均为共识节点,只需要分别到两个管理台中,通过“加入已有群组”中填入一致的配置,即可创建群组,并可以省去上文的“加入群组共识”这一步了

如下图所示,先将创建一个群组group10,在共识节点列表写入所有节点的nodeId。可以看到group10包含了所有节点,但是节点C/D的群组尚不存在

_images/group10_all_first.png

我们通过管理台1中的“加入已有群组来自定义共识节点列表,在节点列表中包含所有的4个节点A/B/C/D,然后生成群组group10

{
	"groupId": 10
	"groupTimestamp": "1591079269841",
	"nodeIdList": [
		"a95ff41839bd9f4576138833a36c4e48e0268dda6ab77ecca468c4f50454ca4faf6609cc7c8126c439380d1df462c098369eea8feff4c9e22e35bfc830818d3d",
		"16f6882456e7f05ca90cbe3ca1dbdb49ca84702ccfd0cebb5894624ec475d5ae7b504a136aca2559fdf4e4c27dce7c72a674d0dd3ae339ba6a3a0906a0072aa8",
		"31e2b051abc27b49aff8846a4037e8bdb45acd6ff98fdad42f7b8a9c4887fffcc99edbf4eeafff656f00df07f44ae3609463a7ddc3ba8481f88b43424007fafe",
		"c867302e786a790663c5cf6fdbbff96570d00a3500b23c9ddd2dd63ada07b85fbc6f4549a9f05cad60bcf7a6199caa95781fd40a25e9098a2c728b90d88938f8"
	]
}

_images/join_group_batch.png

我们点开群组列表中的群组group10,可以看到4个节点的群组编号已经显示了”10”,说明4个节点都已经在群组group10的共识节点了。

注:如果采用PBFT共识,此时节点C/D已加入了群组group10,但仍未加入共识,将不满足3F+1>N的共识准则,导致群组共识异常。将节点C/D创建群组后即可消除异常

_images/join_group_batch_after.png

下一步我们只需要按照上文所说的,导出当前群组group10的配置文件,在管理台2中导入配置,选中剩余的节点C和节点D,点击确定

进入管理台2,点击“加入已有群组

_images/join_group_batch_config.png

加入完成后

_images/join_group_batch_finish.png

操作完成后,如下图所示,节点C/D的群组group10也生成并出于running状态了,至此,我们就顺利完成创建群组group10的所有操作了!

_images/group10_all_sealer.png

合约仓库

合约仓库内置于WeBASE-Front。其中提供常用的工具合约和推荐应用合约模板,用户可将合约导入到自己目录进行引入。

_images/contract.png

工具合约

Address

Address library

Address contract usage methods can refer to the Points contract warehouse。

  1. Detect whether the address is a contract
  2. 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和各方签名(每张存证一个合约)。

使用步骤:

  1. 部署EvidenceSignersData合约,并在构造函数中指定存证生效条件(需要哪些机构进行认证确认)。
  2. 存证时通过newEvidence接口在区块链上创建具体存证合约。
  3. 解析newEvidence调用返回的receipt,将解析出来的存证合约地址保存在应用系统。
  4. 仲裁等认证机构利用存证合约地址调用addSignatures来对存证进行确认。
  5. 取证时利用存证合约地址调用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-Front是和FISCO-BCOS节点配合使用的一个子系统。此分支支持FISCO-BCOS 2.0以上版本,集成web3sdk,对接口进行了封装,可通过HTTP请求和节点进行通信。另外,具备可视化控制台,可以在控制台上开发智能合约,部署合约和发送交易,并查看交易和区块详情。还可以管理私钥,对节点健康度进行监控和统计。

_images/2.png

WeBASE-Front使用方式有以下三种:

1、单独部署作为独立控制台使用,请参考部署说明

2、结合WeBASE-Node-ManagerWeBASE-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消息队列通知到应用层,架构如下:

_images/event_structure.png链上事件通知架构

WeBASE-Front默认不启用消息推送功能,如需启用请参考附录-链上事件订阅和通知

solidity v0.5.1和v0.6.10支持

WeBASE-Front v1.4.2+已支持solidity v0.5.1v0.6.10:

其中v0.5.1可在合约IDE中直接进行切换,若需要使用solidity v0.6.10,可参考部署说明的v0.6.10配置

部署说明

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

重要

使用国密版WeBASE-Front需要开启web3sdk的国密开关

开启web3sdk的国密开关:

  • 开启web3sdk的国密开关:将配置文件application.ymlsdkencryptType0修改为1
  • 编译国密版智能合约在v1.3.1版本后,通过引入solcJ:0.4.25-rc1.jar,自动切换支持国密版智能合约的编译/部署/调用;(可自行切换jar包版本为solcJ-0.5.2)

solidity v0.6.10支持

WeBASE-Front v1.4.2已支持solidity v0.5.1v0.6.10:

若需要使用solidity v0.6.10,则需要手动下载CDN中solidity的v0.6.10.js(国密v0.6.10-gm.js),并在WeBASE-Front编译后得到的conf文件夹(conf_template复制得到conf)中创建solcjs文件夹,并将js文件复制到该文件夹,无需重启后台服务,刷新合约IDE页面即可加载。(v0.4.25及v0.5.1已自动配置)

注:使用webase-front.zip安装包直接部署或使用WeBASE一键部署则不需要手动放置solidity的js文件;

// 可直接在conf目录中创建solcjs目录,并进入solcjs目录直接下载下面其中一个.js文件。
// ecdsa
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.6.10.js
// 国密
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/v0.6.10-gm.js
2. 拉取代码

执行命令:

git clone https://github.com/WeBankFinTech/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下的ca.crtnode.crtnode.key文件拷贝到当前conf目录,供SDK与节点建立连接时使用。

如果使用了国密版SSL nodes/${ip}/sdk/gm/下的所有证书拷贝到conf目录下。

  • 注,国密版默认使用非国密SSL,只有在建链时手动指定了-G(大写)时才会使用国密SSL

如果需要使用solidity v0.6.10,可参考v0.6.10配置

(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            // 连接节点的链上链下端口
  encryptType: 0                // 0: ECDSA, 1: 国密
constant: 
  keyServer: 127.0.0.1:5001     // 密钥服务的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和服务端口需对应修改,网络策略需开通
  • 基于可视化控制台,可以开发智能合约,部署合约和发送交易,并查看交易和区块详情。还可以管理私钥,对节点健康度进行监控和统计
7. 查看日志

在dist目录查看:

前置服务日志:tail -f log/WeBASE-Front.log
web3连接日志:tail -f log/web3sdk.log

接口说明

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)数据格式

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)数据格式

{
    "0x7571ff73f1a37ca07f678aebc4d8213e7ef5c266"
}

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)数据格式

{
    "0x60aac015d5d41adc74217419ea77815ecb9a2192"
}
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)数据格式

true
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)参数表

2)数据格式

http://localhost:5002/WeBASE-Front/privateKey/localKeyStores
响应参数

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
}
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
响应参数

1)数据格式

{
    8346
}
3.2. 根据块高获取块信息接口
接口描述
通过块高获取块信息
接口URL

http://localhost:5002/WeBASE-Front/1/web3/blockByNumber/{blockNumber}

调用方法

HTTP GET

请求参数
  1. 参数表
序号 中文 参数名 类型 最大长度 必填 说明
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. 参数表
序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 块高 blockNumber BigInteger

2)数据格式

http://localhost:5002/WeBASE-Front/1/web3/blockTransCnt/100
响应参数

1)数据格式

{
    1
}
3.5. 获取PbftView接口
接口描述
通过调用此接口获取PbftView
接口URL

http://localhost:5002/WeBASE-Front/{groupId}/web3/pbftView

调用方法

HTTP GET

请求参数
  1. 参数表
序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int

2)数据格式

http://localhost:5002/WeBASE-Front/1/web3/pbftView
响应参数

1)数据格式

{
    160565
}
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)参数表

无入参

2)数据格式

http://localhost:5002/WeBASE-Front/1/web3/clientVersion
响应参数

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
响应参数

1)数据格式

{
    0xxxx
}
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
响应参数

1)数据格式

[
  "1",
  "2"
]
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
响应参数

1)数据格式

0
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. 操作动态群组的状态
接口描述

启动群组、停止群组、移除群组、恢复群组、查询群组状态等操作

创建群组后,需要对群组内每个节点分别调用start来启动群组,群组才算完全创建

接口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)参数表

无入参

响应参数

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

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -
响应参数

1)参数表

{
    "code": 0,
    "message": "Sync Status is ON",
    "data": true
}
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

请求参数

1)参数表

响应参数

1)参数表

true
4.7. 获取节点所在群组物理大小信息
接口描述

获取节点所在群组物理大小信息

接口URL

http://localhost:5002/WeBASE-Front/chain/getGroupSizeInfos

调用方法

HTTP GET

请求参数

1)参数表

响应参数

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\"}]"
}
响应参数

Object返回类型

{"Hi,Welcome!"}
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 permissionTypeuserTable时为必填
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. 管理用户权限状态接口
接口描述

管理用户权限状态,批量修改用户权限

注:目前只支持cns、deployAndCreate、sysConfig、node四种权限管理

接口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. 查询节点接口(节点管理)
接口描述

获取节点的list列表,列表包含节点id,节点共识状态。

注:接口返回所有的共识/观察节点(无论运行或停止),以及正在运行的游离节点

接口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. 查询节点证书接口
接口描述

获取Front对应节点的Fisco证书和sdk证书(包含链证书、机构证书和节点证书)的内容;

需要在项目配置文件中constant-nodePath配置Front连接节点的绝对路径;

注:

接口只返回了证书的文本(Base64编码),未包含开头与结尾以及换行的格式文本; 如需将文本保存为一个证书文件,需要加上开头“—–BEGIN CERTIFICATE—–\n”和结尾“\n—–END CERTIFICATE—–\n”;
接口URL

http://localhost:5002/WeBASE-Front/cert

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -

2)数据格式

http://localhost:5002/WeBASE-Front/cert
响应参数

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"
}
6.12. 合约状态管理
接口描述
冻结、解冻合约和授权用户操作权限,还可以查询合约状态和合约用户权限列表
接口URL

http://localhost:5002/WeBASE-Front/precompiled/contractStatusManage

调用方法

HTTP POST

请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 groupId Int 群组编号
2 signUserId String WeBASE-Sign签名用户编号,当handleTypegetStatuslistManager时,可不传
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"
}
响应参数

1)数据格式

{
  "code": 0,
  "message": "success",
  "data": null
}
6.13. 基于角色的权限管理

使用FISCO BCOS v2.5.0 与 WeBASE-Front v1.4.1 (及)以上版本将使用预编译合约中的ChainGovernance接口(本章节接口6.13),详情可参考FISCO BCOS基于角色的权限控制

包含链治理委员管理、链运维管理等功能

6.13.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
响应参数

1)数据格式

[
  {
    "address": "0xd031e61f6dc4dedd7d77f90128ed33caafbed0af",
    "enable_num": "2"
  }
]
6.13.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"
}
响应参数

1)数据格式

透传链上返回结果

{
    "code":0,
    "msg":"success"
}
6.13.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"
}
响应参数

1)数据格式

透传链上返回结果

{
    "code":0,
    "msg":"success"
}
6.13.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
响应参数

1)数据格式

成功时:直接返回权重值

2

失败时,如查询非委员用户的权重值:

{
    "code": -52001,
    "msg": "address not committee"
}
6.13.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
}
响应参数

1)数据格式

透传链上返回结果

{
    "code":0,
    "msg":"success"
}
6.13.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
响应参数

1)数据格式

直接返回threshold值

50
6.13.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
}
响应参数

1)数据格式

透传链上返回结果

{
    "code":0,
    "msg":"success"
}
6.13.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
响应参数

1)数据格式

[
  {
    "address": "0x304852a7cc6511e62c37b6e189850861e41282b0",
    "enable_num": "3"
  }
]
6.13.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"
}
响应参数

1)数据格式

透传链上返回结果

{
    "code":0,
    "msg":"success"
}
6.13.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"
}
响应参数

1)数据格式

透传链上返回结果

{
    "code":0,
    "msg":"success"
}
7. 链上事件订阅接口
7.1. 获取出块事件的订阅信息列表
接口描述

获取所有订阅的出块事件配置信息

将返回对应的id值, exchange, queue, routingKey等信息

接口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. 获取出块事件的订阅信息
接口描述

根据群组编号,应用编号获取该应用订阅的出块事件配置信息

将返回对应的id值, exchange, queue, routingKey等信息

接口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"
}
响应参数

1)数据格式

成功:

{
    "code": 0,
    "message": "success"
}
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"
}
响应参数

1)数据格式

成功则返回该app中剩余已订阅的合约Event事件通知:

{
    "code": 0,
    "message": "success",
    "data": []
}
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)数据格式

成功:

data中为List<org.fisco.bcos.web3j.tx.txdecode.LogResult>,可参考sdk

{
    "code": 0,
    "message": "success",
    "data": [{
        "logParams": [{
            "name": "name3",
            "type": "bool",
            "data": true,
            "indexed": true
        }, {
            "name": "name4",
            "type": "string",
            "data": " x   zu \u0014n\r'8   z1S   Y S\u0019ܸGg K",
            "indexed": true
        }, {
            "name": "name1",
            "type": "uint256",
            "data": 1,
            "indexed": false
        }, {
            "name": "name2",
            "type": "uint256",
            "data": 1,
            "indexed": false
        }],
        "log": {
            "logIndex": 0,
            "transactionIndex": 0,
            "transactionHash": "0x5c7aac536ed70aaad659096b05bd06c1fbbc51604ceb79c3d8cea0f450f3b391",
            "blockHash": "0x552524b1f6667d1fbb5d0ac72a12d59ecf982b5abc6a5cbe1c8d62ead7138e88",
            "blockNumber": 137,
            "address": "0x19fb54101fef551187d3a79ea1c87de8d0ce754e",
            "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
            "topics": ["0x060ceb821dc6345162b54f7d678480c561376a770c8c98db63f450e0f8a4a499", "0x0000000000000000000000000000000000000000000000000000000000000001", "0xe478c0fabc7a75e7146e0d2738af81af7a31538df5df59e05319dcb84767f84b"]
        }
    }
}
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与合约的合约信息
接口描述

根据合约地址、合约类型(abicontract)获取导入的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"}]
}
响应参数

1)数据格式

成功:

{
    "code": 0,
    "message": "success"
}
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"}]
}
响应参数

1)数据格式

成功:

{
    "code": 0,
    "message": "success"
}
8.5. 修改合约abi
接口描述

删除合约abi

接口URL

http://localhost:5002/WeBASE-Front/abi/{abiId}

调用方法

HTTP DELETE

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 abi编号 abiId Long

2)数据格式

{
    "abiId": 1
}
响应参数

1)数据格式

成功:

{
    "code": 0,
    "message": "success"
}
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

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -

2)数据格式

http://localhost:5002/WeBASE-Front/encrypt
响应参数

1)数据格式

a、成功:

{
    1 // 1: 国密版,0: 非国密
}
10.2. 查询WeBASE-Front版本
接口描述

获取WeBASE-Front的版本号

接口URL

http://localhost:5002/WeBASE-Front/version

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -

2)数据格式

http://localhost:5002/WeBASE-Front/version
响应参数

1)数据格式

a、成功:

v1.4.0
10.3. 查询前置连接的WeBASE-Sign版本
接口描述

获取WeBASE-Front的所连接的WeBASE-Sign的版本号

接口URL

http://localhost:5002/WeBASE-Front/version/sign

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -

2)数据格式

http://localhost:5002/WeBASE-Front/version/sign
响应参数

1)数据格式

a、成功:

v1.4.0
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

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -

2)数据格式

http://localhost:5002/WeBASE-Front/solc/list
响应参数

1)数据格式

a、成功:

{
    "code":0,
    "message":"success",
    "data":["v0.6.10.js","v0.6.10-gm.js"]
}
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
响应参数

1)数据格式

a、成功:

313233
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)参数表

2)数据格式

http://localhost:5002/WeBASE-Front/contractStore/getContractStoreList
响应参数

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. 附录
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 合约路径不能为空
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进行阅读

v1.4.3
  • 新增了合约仓库、在线工具、支持CNS
v1.4.2
  • 新增了合约EventLog查询功能
v1.4.1
新增链权限接口与web3接口
  • 新增ChainGovernance接口
  • 新增getBlockHeaderByHash与getBlockHeaderByNumber接口
v1.4.0
增加版本号接口
  • 增加返回 WeBASE-Front 和 WeBASE-Sign 版本号接口
v1.3.2
移除fastjson
  • 移除Fastjson,替换为Jackson 2.11.0。
  • 升级web3sdk为2.4.1,并升级springboot等依赖项
v1.3.1
新增动态群组接口
  • 新增动态群组接口,包含生成群组、启动/停止群组、删除/恢复群组、单个/批量查询群组状态等接口

注:动态群组操作指南可参考动态群组操作指南,接口详情可参考接口文档

新增导入已部署合约Abi功能、合约Abi解析功能
  • 前置的“合约管理”Tab中,新增导入合约abi功能,可以导入已部署的合约进行管理
  • 前置的“合约管理”Tab中,新增合约ABI编码功能,可用于构造交易input入参
新增导入.p12私钥用户
  • 私钥管理中,支持导入控制台所导出的.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的数据库中) _images/new_generate_pri.png使用sign生成私钥的流程

交易签名的流程 _images/new_tx_sign.png使用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
部署合约时不再自动注册CNS
  • /trans/handle接口中,contractAbi修改为必填,即需要传入合约abi或合约单个函数的abi。

具体修改可参考接口文档

v1.2.3
修复api中的合约Bin字段

修复了WeBASE-Front接口中contractBinbytecodeBin字段的bug

  • contractBin是指合约编译后的运行时二进制码(runtime-bin),多用于交易解析用
  • bytecodeBin是指合约编译的完整二进制码(bytecode bin),一般用于部署合约

将部分接口的contractBin字段修改为bytecodeBin字段,修改的接口包含contract/deployWithSign,共1个;

其余包含以上两个字段的接口,均在接口文档中丰富了字段说明,方便区分

支持链上事件订阅和通知

在某些业务场景中,应用层需要实时获取链上的事件,如出块事件、合约Event事件等。应用层通过WeBASE连接节点后,由于无法和节点直接建立长连接,难以实时获取链上的消息。

为了解决这个问题,应用层可通过WeBASE-Front订阅链上事件,当事件触发时,可通过RabbitMQ消息队列通知到应用层,架构如下:

_images/event_structure.png链上事件通知架构

启用消息队列的事件推送服务,需要以下几步操作:

  1. 安装RabbitMQ Server,启动mq服务,并确保RabbitMQ Server服务所在服务器的5672, 15672端口可访问;
  2. 启用RabbitMQ的rabbitmq_managerment功能,(在mq服务所在主机中运行rabbitmq-plugins enable rabbitmq_management);
  3. 配置application.ymlspring-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
Ubuntu环境安装Java

  # 安装默认Java版本(Java 8或以上)
  sudo apt install -y default-jdk
  # 查询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
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
...
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中如何使用导出的私钥

以上文中的私钥加载:

@Test
public void loadPrivateKeyTest() {
  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);
}

4. 支持链上事件订阅和通知

在某些业务场景中,应用层需要实时获取链上的事件,如出块事件、合约Event事件等。应用层通过WeBASE连接节点后,由于无法和节点直接建立长连接,难以实时获取链上的消息。

支持通过消息队列(Message Queue)来获取WeBASE-Front(v1.2.3+)的链上事件的消息推送

目前支持出块事件与智能合约Event事件的事件Push通知,大致流程为:

  1. WeBASE-Front连接到MQ-Server(目前支持RabbitMQ-Server);
  2. WeBASE-Front接收节点的事件Push后,如出块通知,WeBASE-Front将出块消息发送到消息队列中;
  3. 区块链应用连接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账户:

_images/add_user.png创建MQ账户

赋予MQ账户访问appId队列的read权限: _images/set_permission.png赋予read权限

创建以appId命名的队列

_images/add_queue.png创建appId队列

客户端订阅事件推送流程:
  • 客户端调用WeBASE-Front节点前置服务接口(/event/newBlockEventevent/contractEvent),注册事件监听;接口内容请查看接口文档-事件通知

用户调用注册事件接口之后,实际上WeBASE-Front将以appId+事件名+{randomString}的routingKey,将用户所拥有的的队列Queue绑定到对应的Exchange中:

_images/after_register.pngappId队列绑定到群组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. 配置文件解析
    1. 配置文件解析
参数 默认值 描述
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 可视化部署模块 可视化部署底层区块链服务以及节点的管理
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. 注意事项
  • Java推荐使用OracleJDKJDK配置指引
  • 在服务搭建的过程中,如碰到问题,请查看 常见问题解答
  • 安全温馨提示: 强烈建议设置复杂的数据库登录密码,且严格控制数据操作的权限和网络策略

通过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配置的encryptType0修改为1

部署时初始化数据库:

  • 执行dist/script/gm中的webase-gm.sh脚本进行初始化,而非dist/script中的webase.sh,;
3. 拉取代码

执行命令:

git clone https://github.com/WeBankFinTech/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
5.3 运行数据库脚本

执行命令:bash webase.sh ${dbIP} ${dbPort} 如:

bash webase.sh 127.0.0.1 3306
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-encryptType0改为1
  • 如果使用可视化部署,则将application.yml中constant-deployType0改为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.2 请求参数

1)入参表

2)入参示例

http://127.0.0.1:5001/WeBASE-Node-Manager/front/refresh
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.2 请求参数

1)入参表

2)入参示例

http://127.0.0.1:5001/WeBASE-Node-Manager/account/pictureCheckCode
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

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
}
6 服务器监控相关
6.1 获取节点监控信息
6.1.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:
/chain/mointorInfo/{nodeId}?beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}&gap={gap}
  • 请求方式:GET
  • 返回格式:JSON
6.1.2 请求参数

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
6.1.3 返回参数

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 获取服务器监控信息
6.2.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:
performance/ratio/{nodeId}?gap={gap}&beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}
  • 请求方式:GET
  • 返回格式:JSON
6.2.2 请求参数

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
6.2.3 返回参数

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连接邮件服务器;

6.3.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /mailServer/config/{serverId}
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.3.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 serverId Int 邮件服务的编号

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/mailServer/config/1
6.3.3 返回参数

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 获取全部邮件告警配置

返回所有的邮件告警的邮件服务配置

6.4.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /mailServer/config/list
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.4.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
- - - - -

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/mailServer/config/list
6.4.3 返回参数

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 更新邮件告警配置

更新邮件告警的配置内容;目前仅支持单个邮件服务器配置,不支持新增配置;

6.5.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /mailServer/config
  • 请求方式:PUT
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.5.2 请求参数

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
}
6.5.3 返回参数

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 发送测试邮件

使用当前的邮件服务配置,向指定的邮箱地址发送测试邮件,如果配置错误将发送失败;

注:需要确保配置正确才能使用后续的邮件告警功能;返回成功信息后,需要用户到自己的邮箱查看是否收到邮测试邮件;

6.6.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /alert/mail/test/{toMailAddress}
  • 请求方式:POST
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.6.2 请求参数

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
}
6.6.3 返回参数

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等;

6.7.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /alert/{ruleId}
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.7.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 ruleId Int 告警配置的编号

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/alert/1
6.7.3 返回参数

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 获取全部告警类型配置列表

返回所有的告警类型配置

6.8.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /alert/list
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.8.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
- - - - -

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/alert/list
6.8.3 返回参数

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 更新告警类型配置

更新告警类型配置的内容;目前仅支持更新原有的三个邮件告警的配置,不支持新增配置;

6.9.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /alert
  • 请求方式:PUT
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.9.2 请求参数

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
}
6.9.3 返回参数

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-开启;

6.9.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /alert/toggle
  • 请求方式:PUT
  • 请求头:Content-type: application/json
  • 返回格式:JSON
6.9.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 ruleId int 告警类型配置编号
2 enable int 是否启用该类型的告警:0-关闭,1-开启

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/alert/toggle
{
   "ruleId": 3,
   "enable": 1
}
6.9.3 返回参数

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": {}
}
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已移除)
11.4.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/user/privateKey/{userId}
  • 请求方式:GET
  • 返回格式:json
11.4.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 userId int 用户编号

2)入参示例

http://127.0.0.1:5001/WeBASE-Node-Manager/user/privateKey/4585
11.4.3 返回参数

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 查询用户列表
11.5.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/user/userList/{groupId}/{pageNumber}/{pageSize}?userParam={userName}
  • 请求方式:GET
  • 返回格式:JSON
11.5.2 请求参数

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
11.5.3 返回参数

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加密

11.6.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/user/import
  • 请求方式:POST
  • 请求头:Content-type: application/json
  • 返回格式:JSON
11.6.2 请求参数

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"
}
11.6.3 返回参数

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文件

11.7.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/user/importPem
  • 请求方式:POST
  • 请求头:Content-type: application/json
  • 返回格式:JSON
11.7.2 请求参数

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"
}
11.7.3 返回参数

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文件

11.8.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/user/importP12
  • 请求方式:POST
  • 请求头:Content-type: form-data
  • 返回格式:JSON
11.8.2 请求参数

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传参
11.8.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述

2)出参示例

  • 成功:
{
    "code": 0,
    "message": "success"
}
  • 失败:(p12文件的密码错误)
{
    "code": 201236,
    "message": "p12's password not match",
    "data": null
}
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 合约状态管理

合约部署者(一般由运维所部属)与链治理委员共同管理合约的状态,包含冻结/解冻合约、查询合约状态功能

13.23.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /precompiled/contract/status
  • 请求方式: POST
  • 请求头:Content-type: application/json
  • 返回格式:JSON
13.23.2 请求参数

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"
}
13.23.3 返回参数

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的证书

14.1.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /cert/list
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
14.1.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
- -

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/cert/list
14.1.3 返回参数

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 根据指纹获取证书接口

根据指纹获取单个证书

14.2.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /cert
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
14.2.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 fingerPrint String 证书指纹,证书唯一标识

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/cert?fingerPrint=814D51FB7CBAB33676FE73E8FBBFECB3D3B1301A
14.2.3 返回参数

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 导入证书接口

导入保存证书文件

14.3.1 传输协议规范
  • 网络传输协议:使用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"
}
14.3.3 返回参数

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 删除证书接口

根据证书指纹删除一个证书

14.4.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /cert
  • 请求方式:DELETE
  • 请求头:Content-type: application/json
  • 返回格式:JSON
14.4.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 fingerPrint String 证书指纹,证书的唯一标识

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/cert
{
    "fingerPrint": "F588C511F5471860120F7BE8127DE026ADD8378C"
}
14.4.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述
3 data String 成功删除证书的个数或错误信息

2)出参示例

  • 成功:
{
    "code": 0,
    "message": "success",
    "data": 1
}
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)数据格式

成功:

data中为List<org.fisco.bcos.web3j.tx.txdecode.LogResult>,可参考sdk

{
    "code": 0,
    "message": "success",
    "data": [{
        "logParams": [{
            "name": "name3",
            "type": "bool",
            "data": true,
            "indexed": true
        }, {
            "name": "name4",
            "type": "string",
            "data": " x   zu \u0014n\r'8   z1S   Y S\u0019ܸGg K",
            "indexed": true
        }, {
            "name": "name1",
            "type": "uint256",
            "data": 1,
            "indexed": false
        }, {
            "name": "name2",
            "type": "uint256",
            "data": 1,
            "indexed": false
        }],
        "log": {
            "logIndex": 0,
            "transactionIndex": 0,
            "transactionHash": "0x5c7aac536ed70aaad659096b05bd06c1fbbc51604ceb79c3d8cea0f450f3b391",
            "blockHash": "0x552524b1f6667d1fbb5d0ac72a12d59ecf982b5abc6a5cbe1c8d62ead7138e88",
            "blockNumber": 137,
            "address": "0x19fb54101fef551187d3a79ea1c87de8d0ce754e",
            "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
            "topics": ["0x060ceb821dc6345162b54f7d678480c561376a770c8c98db63f450e0f8a4a499", "0x0000000000000000000000000000000000000000000000000000000000000001", "0xe478c0fabc7a75e7146e0d2738af81af7a31538df5df59e05319dcb84767f84b"]
        }
    }
}
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与合约的合约信息
接口描述

根据合约地址、合约类型(abicontract)获取导入的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)入参表

序号 输入参数 类型 可为空 备注

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/deploy/chain/info
返回参数

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)入参表

序号 输入参数 类型 可为空 备注

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/deploy/delete
返回参数

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)入参表

序号 输入参数 类型 可为空 备注

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/deploy/type
返回参数

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)入参表

序号 输入参数 类型 可为空 备注

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/deploy/progress
返回参数

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)入参表

序号 输入参数 类型 可为空 备注

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/host/list
返回参数

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)入参表

序号 输入参数 类型 可为空 备注

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/host/ansible
返回参数

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 查询是否使用国密

获取WeBASE-Node-Manager是否使用国密版

17.1.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /encrypt
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
17.1.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 -- - -

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/encrypt
17.1.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述
3 data Int 1: 国密,0:非国密

2)出参示例

  • 成功:
{
    "code": 0,
    "message": "success",
    "data": 1 
}
17.2 查询WeBASE-Node-Manager的版本

获取WeBASE-Node-Manager服务的版本号

17.2.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /version
  • 请求方式:GET
  • 请求头:Content-type: application/json
  • 返回格式:JSON
17.2.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 -- - -

2)入参示例

http://localhost:5001/WeBASE-Node-Manager/version
17.2.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 - String 版本号

2)出参示例

  • 成功:
v1.4.0
附录
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 合约名称不能重复
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 Error getting docker image mode 获取镜像方式错误
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 版本已存在
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-Node-Manager升级的兼容性说明,请结合WeBASE-Node-Manager Changelog进行阅读

v1.4.3
  • 拆分可视化部署步骤为:添加主机、初始化主机、部署节点
  • 可视化部署支持同机部署节点、支持自动拉取镜像
  • 可视化部署使用ansible,并完善各个步骤的检测脚本
  • 支持注册CNS合约
数据表更新

字段更新:

  • tb_contract表中bytecodeBin的列名修改为bytecode_bin,并对应更新了conf/mapper/ContractMapper.xml文件
  • tb_host表中remark字段从varchar修改为text类型,移除了agency_idagency_namedocker_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_addressdeploy_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前要选择在下面两种模式中二选一:

  1. 添加前置方式
  2. 可视化部署方式

提示:如果要体验完整的可视化部署,可通过可视化部署的安装指引,通过一键部署或手动部署安装子系统进行搭建

数据库结构变更
  • 登录 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.2
移除fastjson
  • 移除Fastjson,替换为Jackson 2.11.0。
  • 升级web3sdk为2.4.1,并升级springboot等依赖项
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来管理私钥和对交易签名,可查看以下升级说明进行修改:

  1. 私钥用户数据表tb_user新增字段sign_user_idapp_id
  2. 将WeBASE-Node-Manager的私钥数据移植到WeBASE-Sign数据库

生成私钥的流程 _images/new_generate_pri1.png使用sign生成私钥的流程

交易签名的流程 _images/new_tx_sign1.png使用sign交易签名的流程

私钥用户数据表字段新增
  • 数据库中的tb_user新增了varchar类型的字段sign_user_idapp_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数据库)中

  1. 由于保存到数据库的私钥值是经过AES加密后存储的,因此,需保证WeBASE-Front和WeBASE-Sign application.yml中的constant-aesKey字段的值一样
  2. 在WeBASE-Node-Manager数据库中的tb_user表和tb_user_key_mapping表,获取所有WeBASE-Node-Manager的私钥数据,包括tb_user表中的sign_user_idapp_id(前文所插入的值),地址address与公钥publick_key,还有tb_user_key_mapping表中的私钥private_key
  3. 在WeBASE-Sign数据库中,将上文获得的所有私钥数据按对应字段,执行insert操作,插入到其tb_user表中;

升级操作说明

登陆mysql,进入到相应database中,以webasenodemanagerwebasesign的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 国密支持

  1. 初始化数据修改:数据表的tb_method默认数据需要替换为国密版默认数据,可参考项目中scripts/gm中的webase-dml-gm.sql中的第5项进行数据初始化;
兼容性说明:中英文支持,优化部分功能
  1. 初始化数据修改:数据表tb_alert_rule默认数据支持中英文告警,可结合项目中scripts/webase-dml.sql第6项进行数据更新;
  2. 数据表字段增加:数据表tb_front增加一列client_version,用于记录节点版本与是否为国密;
  3. 数据表字段增加:动态增加的数据表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

兼容性说明:增加邮件告警功能

  1. 数据表修改:增加了tb_mail_server_config邮箱服务器配置表(邮箱服务配置),tb_alert_rule告警规则表(告警类型配置),tb_alert_log告警日志表,可通过项目中scripts/webase-ddl.sql进行数据表初始化;
  2. 初始化数据修改:邮件告警功能的默认数据需要通过项目中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

兼容性说明:增加证书管理功能

  1. 数据表修改:增加证书管理功能:增加了tb_cert数据表,可通过项目中scripts/webase-ddl.sql进行数据表初始化;;
  2. 数据表修改:数据表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
Ubuntu环境安装Java

  # 安装默认Java版本(Java 8或以上)
  sudo apt install -y default-jdk
  # 查询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
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.enableVerificationCode true 验证码是否启用随机
constant.verificationCodeValue false 当不启用验证码的随机时,设置固定验证码(方便联调)
constant.ignoreCheckFront /account/login,/account/pictureCheckCode,/login,/user/privateKey,/front/new,/front/find,,/group/generate,/group/start 直接访问前置的URI
constant.resetGroupListInterval 15000 异步刷新所有群组连接的间隔,默认15s
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以上版本,支持群组和群组切换。具体功能有:

  1. 区块链数据概览,可以查看区块链的节点、区块、交易、合约信息。点击左上角交易信息和区块信息界面,可以跳转到区块或交易信息列表页,交易信息支持input解码和event解码。
  2. 节点管理,可以查看前置列表、节点列表、修改节点共识状态。可以查看链上的所有群组和节点,查看前置所在服务器状态相关信息,管理节点的共识状态。
  3. 合约管理,提供图形化合约IDE、查询已部署合约列表、合约CNS查询以及预编译合约的CRUD功能。编译、部署合约后该合约会被保存。
  4. 私钥管理,管理所有可以发交易的帐号,公钥用户是其他机构的帐号,无法在本机构发交易,可以通过手动绑定和自动同步获取。私钥用户为本机构发交易的用户。
  5. 系统管理,提供权限管理、系统配置管理、证书管理的功能。权限管理可以控制私钥用户的权限范围,证书管理可以查看链的相关证书。
  6. 系统监控,系统监控包含了节点监控、主机监控与异常告警。监控整条链所有机构所有用户发送交易行为,查看是否有异常用户和异常合约,并在异常状态下通过告警邮件通知运维管理员。
  7. 交易审计,主要监控整条链所有机构所有用户发送交易行为,查看是否有异常用户和异常合约。
  8. 订阅事件,查看前置已订阅的链上事件通知信息列表。
  9. 帐号管理,只有admin帐号才能查看此功能,可以新增帐号(登录此系统帐号)、修改密码、修改账户邮箱等等。
  10. 群组管理,动态管理群组,可以创建新群组、将节点加入已有群组、删除群组数据等
国密支持

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.1v0.6.10,可在合约IDE中的左上角进行版本切换

部署说明

1. 依赖环境
环境 版本
nginx nginx1.6或以上版本,安装请参考附录
2. 拉取代码

代码可以放在/data下面,执行命令:

git clone https://github.com/WeBankFinTech/WeBASE-Web.git

进入目录:

cd WeBASE-Web
3. 修改配置

在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;   # 前端文件路径(文件需要有权限访问)
            index  index.html index.htm;
            try_files $uri $uri/ /index.html =404;
        }
        location /static {    
            root   /data/WeBASE-Web/dist;   # 前端文件路径(文件需要有权限访问)
            autoindex on;
        }

        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;
        }
    }
4. 启动nginx

启动命令:

/usr/local/nginx/sbin/nginx # nginx在/usr/local目录下

检查nginx是否启动:

ps -ef | grep nginx
5. 访问页面
http://{deployIP}:{webPort}
示例:http://127.0.0.1:5000

备注:

  • 部署服务器IP和管理平台服务端口需对应修改,网络策略需开通
  • 默认账号密码:admin/Abcd1234
  • WeBASE管理平台使用说明请查看使用手册
6. 查看日志
进程日志:tail -f logs/access.log
错误日志:tail -f logs/eror.log

升级说明

WeBASE-Web升级说明,请结合WeBASE-Web ChangelogWeBASE管理平台使用手册进行阅读。

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 出现“登录错误”怎么排查问题

登录时出现“登录错误”,请一一排查:

  1. WeBASE-Node-Manager服务是否启动成功,
  2. WeBASE-Node-Manager的数据库是否正常,
  3. 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 交易审计异常交易和异常合约怎么消除
  • 将发送交易的账户在私钥管理中添加成公钥用户,那么该用户所发的交易将审计成正常交易;
  • 将部署该合约的账户在私钥管理中添加成公钥用户,那么该用户所部署的合约将审计成正常合约。
3. 二次开发

开发文档

交易服务

概要介绍

功能介绍

​ 本系统为交易上链代理子系统。主要接收无状态交易请求,缓存到数据库中,再异步上链。本系统可大幅提升吞吐量,解决区块链的tps瓶颈。

_images/architecture1.png架构图

主要功能:合约编译;交易请求处理,交易分为合约部署和普通的合约调用请求。

合约编译:上传合约文件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配置的encryptType0修改为1
  • 编译国密版智能合约在v1.3.1版本后,通过引入solcJ:0.4.25-rc1.jar,自动切换支持国密版智能合约的编译/部署/调用;(可自行切换solcJ-0.5.2)
2. 拉取代码

执行命令:

git clone https://github.com/WeBankFinTech/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下的ca.crtnode.crtnode.key文件拷贝到当前conf目录,供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...
6. 查看日志

在dist目录查看:

交易服务日志:tail -f log/transaction.log
web3连接日志:tail -f log/web3sdk.log

接口说明

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 合约文件 file zip 必须是zip压缩包,直接压缩.sol文件;压缩包中不包含文件夹

2)数据格式

压缩包文件

响应参数

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)参数表

2)数据格式

响应参数

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
}
4.2. 查询WeBASE-Transaction版本接口
接口描述

获取WeBASE-Transaction的版本号

接口URL

http://localhost:5003/WeBASE-Transaction/version

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -

2)数据格式

http://localhost:5003/WeBASE-Transaction/version
响应参数

1)数据格式

a、成功:

v1.4.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安装简单步骤,供快速查阅。更详细的步骤,请参考官网

① 安装包下载

官网下载对应版本的java安装包,并解压到服务器相关目录

mkdir /software
tar -zxvf openjdkXXX.tar.gz /software/
② 配置环境变量
  • 修改/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;
1.3. Zookeeper部署

此处给出简单步骤,供快速查阅。详情请参考官网

(1)从官网下载对应版本的安装包,并解压到相应目录

mkdir /software
tar -zxvf zookeeper-XXX.tar.gz /software/

(2)配置和启动

ZooKeeper的安装包括单机模式安装,以及集群模式安装。具体步骤请参考官网说明:

2. 常见问题
2.1 脚本没权限

执行shell脚本报错误”permission denied”或格式错误

赋权限:chmod + *.sh
转格式:dos2unix *.sh
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和国密公私钥用户,可对数据进行国密或非国密的签名

部署说明

1. 前提条件
环境 版本
Java jdk1.8或以上版本
数据库 MySQL-5.6或以上版本

备注:安装说明请参看 附录-1

2. 拉取代码

执行命令:

git clone https://github.com/WeBankFinTech/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...
6. 查看日志

在dist目录下查看:

tail -f log/WeBASE-Sign.log

接口说明

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: 国密

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)数据格式

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
}
3.2. 清除私钥用户缓存
接口描述

私钥用户的缓存用于缓存私钥数据到内存中,提高私钥签名效率;此接口可删除所有用户缓存信息

接口URL

http://localhost:5004/WeBASE-Sign/user/all

调用方法

HTTP DELETE

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - - - - - -

2)数据格式

http://localhost:5004/WeBASE-Sign/user/all
响应参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 返回码 code String 返回码信息请附录1
2 提示信息 message String

2)数据格式

a.请求正常返回结果

{
    "code": 0,
    "message": "success"
}
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 页大小,同时为空则返回全部

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. 其他接口
6.1. 查询WeBASE-Sign版本接口
接口描述

获取WeBASE-Sign的版本号

接口URL

http://localhost:5004/WeBASE-Sign/version

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
- - -

2)数据格式

http://localhost:5004/WeBASE-Sign/version
响应参数

1)数据格式

a、成功:

v1.4.0
附录
1. 返回码信息列表

Code message 描述
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 私钥格式错误

升级说明

WeBASE-Sign升级的兼容性说明,请结合WeBASE-Sign Changelog进行阅读

v1.4.3
  • 增加数据签名接口
v1.4.2
  • 使用新版java-sdk替换web3sdk
v1.4.0
增加版本号接口
  • 增加返回 WeBASE-Sign 版本号接口
修改AES加密默认Pattern
  • 默认Aes加密模式由ECB改为更安全的CBC,同时支持在yml配置中选择CBC与ECB
v1.3.2
移除fastjson
  • 移除Fastjson,替换为Jackson 2.11.0。
  • 升级web3sdk为2.4.1,并升级springboot等依赖项
v1.3.1
支持导入私钥
  • 新增/user/import接口,支持导入私钥,详情参考接口文档
性能优化
  • 新增Credential实例的缓存机制,优化签名性能
v1.3.0
私钥数据表字段更新
  • WeBASE-Sign的tb_user表新增两个字段: 私钥用户的唯一业务编号signUserId,和私钥用户所属应用编号appId

升级操作说明

如果WeBASE-Sign中有已存在的私钥数据,则在tb_user表新增列sign_user_idapp_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部署

此处给出简单步骤,供快速查阅。更详细的步骤,请参考官网

① 安装包下载

官网下载对应版本的java安装包,并解压到服务器相关目录

mkdir /software
tar -zxvf jdkXXX.tar.gz /software/
② 配置环境变量
  • 修改/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;
2. 常见问题
2.1 脚本没权限
  • 执行shell脚本报错误”permission denied”或格式错误
赋权限:chmod + *.sh
转格式:dos2unix *.sh

链管理服务子系统

概要介绍

​ 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

进入目录:

cd WeBASE-Chain-Manager
4. 编译代码

方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上

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
5.3 运行数据库脚本

执行命令:bash webase.sh ${dbIP} ${dbPort} 如:

bash webase.sh 127.0.0.1 3306
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.2 请求参数

1)入参表

2)入参示例

http://127.0.0.1:5005/WeBASE-Chain-Manager/chain/all
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.2 请求参数

1)入参表

2)入参示例

http://127.0.0.1:5005/WeBASE-Chain-Manager/group/update
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.2 请求参数

1)入参表

2)入参示例

http://127.0.0.1:5005/WeBASE-Chain-Manager/group/all/100001
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
Ubuntu环境安装Java

  # 安装默认Java版本(Java 8或以上)
  sudo apt install -y default-jdk
  # 查询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.1 脚本没权限
  • 执行shell脚本报错误”permission denied”或格式错误
赋权限:chmod + *.sh
转格式:dos2unix *.sh
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

进入目录:

cd WeBASE-Stat
4. 编译代码

方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上。

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和服务端口需对应修改,网络策略需开通
8. 查看日志

在dist目录查看:

全量日志:tail -f log/WeBASE-Stat.log
错误日志:tail -f log/WeBASE-Stat-error.log

接口说明

[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. 返回码信息列表
Code message 描述
0 success 正常
105000 system error 系统异常
205000 invalid front id 无效的前置编号
205001 front already exists 前置已存在
205002 request front fail, please check front 保存前置失败
205003 wrong host or port 地址或端口错误
205004 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
Ubuntu环境安装Java

  # 安装默认Java版本(Java 8或以上)
  sudo apt install -y default-jdk
  # 查询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.1 脚本没权限
  • 执行shell脚本报错误”permission denied”或格式错误
赋权限:chmod + *.sh
转格式:dos2unix *.sh
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
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.1 进入目录

返回WeBASE-Data目录并进入WeBASE-Data-Web目录。

cd 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.4 访问
http://{deployIP}:{webPort}
示例:http://127.0.0.1:5200
  • 部署服务器IP和服务端口需对应修改,网络策略需开通
5.5 查看日志
进程日志:tail -f logs/access.log
错误日志:tail -f logs/eror.log

使用手册

1. 简介

本文将用一个实例来说明数据监管服务的部署和使用。实例详情如下图:从下至上我们可以看到:

  1. 部署两条物理链,包括四个区块链应用(后面以存证链为例存证链)。
  2. 监管机构在每一套链中都有一个监管节点用于同步数据。
  3. 监管节点之上部署了一个WeBASE-Front(区块链节点前置),这个服务主要作用是代理节点,提供restful的接口。
  4. 在WeBASE-Front之上是WeBASE-Data-Collect(监管数据导出和分析服务),这个服务主要用于导出数据到DB和ES,用于分析。
  5. WeBASE-Data-Collect(监管数据导出和分析服务)之上是WeBASE-Data-Fetcher(监管数据查询服务),这个服务主要的功能是对外提供数据查询服务。
  6. WeBASE-Data-Web(数据监管平台)是一个网页服务,对外提供数据展示和交互UI。

_images/architecture.png

2. 平台搭建

平台搭建的具体详情请查看部署说明

3. 数据上链(mock数据,真实环境有数据不需要此步骤)

根据部署说明将数据监管平台搭建成功后,可以通过WeBASE-Front(节点前置服务)模拟存证交易(默认:http://localhost:5002/WeBASE-Front)。

_images/home.png

首先,创建测试用户,供交易使用

_images/user_add.png

_images/user_view.png

节点前置服务已内置存证合约,可以使用该存证合约将存证数据上链。过程包括:合约编译、合约部署、调用合约将存证数据上链。

合约编译:

_images/contract_compile.png

合约部署,部署时私钥地址选择创建的测试用户地址。存证合约部署时需要设置签名用户地址,可以使用测试用户地址作为参数。

_images/contract_deploy.png

合约调用,调用合约将存证数据上链。

_images/contract_call.png

4. 运维配置

WeBASE-Data-Collect服务搭建成功后,可使用网页浏览器访问管理平台配置页面(默认:http://localhost:5009/WeBASE-Data-Collect)。

4.1 新增区块链信息

首先在链管理页面新建链信息。可以选择国密或非国密。部署的存证链为非国密链,选择非国密。

_images/chain_new.png

4.2 添加节点前置

进入前置管理页面,右上角切换到存证链,然后添加对应节点前置信息,节点前置的类型需要与链的类型一致(国密或非国密)。

_images/front_add.png

_images/front_info.png

4.3 设置应用信息和节点机构信息

前置添加完成后,管理平台就会开始拉取群组信息和群组的区块信息。此时链管理下应该就有相关数据了。可以通过修改按钮设置应用信息(每个应用对应一个群组)。还可以设置链下节点机构信息。

应用信息:

_images/app_info_update.png

_images/app_info.png

节点机构信息,节点编号可以通过节点目录下个的node.nodeid文件获取,如:nodes/127.0.0.1/node0/conf/node.nodeid

_images/org_update.png

_images/org_info.png

4.4 合约管理

为了解析和审计区块数据,需要把相关的合约导入到管理平台。

管理平台提供支持导入已有合约(支持同时选择多个合约文件上传)。同时合约编辑器还提供新建目录,用目录的形式管理合约,主要是为了解决同名合约引用的问题。合约添加完成后,需要编译保存。

_images/contract_upload.png

将存证合约Evidence.sol、EvidenceFactory.sol上传编译,注意选择编译器版本(国密版本名称带有gm字样)

_images/contract_compile1.png

4.5 用户管理

为了解析和审计区块数据交易用户,需要把相关的用户地址导入到管理平台。将存证测试用户的地址导入。

_images/user_add1.png

_images/user_info.png

5. 平台使用

WeBASE-Data-Fetcher和WeBASE-Data-Web服务搭建成功后,可使用网页浏览器访问数据监管平台(默认:http://127.0.0.1:5200)。

5.1 搜索页

搜索页展示全局数据概览:链数量,应用数量,用户数量,智能合约数量,区块数量,交易数量。

_images/search_view.png

搜索支持关键字搜索和条件搜索。条件搜索包括区块搜索、交易搜索、用户搜索、合约搜索。

其中,交易搜索出的交易数据如果需要监管处理,可以通过介入处理按钮添加到监管告警列表。

如下搜索出存证上链的数据:

_images/search_key.png

_images/search_condition.png

5.2 区块链数据概览

区块链概览页展示链列表信息,以及链下应用和节点信息。

_images/app_info1.png

通过应用跳转到具体应用数据概览页面,页面展示了区块链应用的核心数据指标:用户数量,合约数量,区块数量,交易数量。关键监控指标:最近7天的交易量。

  • 节点信息列表:展示了节点的ID,所属机构,节点块高,节点view和运行状态;
  • 区块信息列表:展示了最近区块的概览信息,点击更多可以查看更多历史区块;
  • 交易信息列表:展示了最近交易的概览信息,点击更多可以查看更多历史交易;

_images/app_view.png

其中右下角的交易信息列表点击可跳入具体一条交易中查看交易详细信息:交易详细信息还包含了

  • 交易解析:可以将交易返回的交易回执数据进行解析并可视化;
  • Event解析:可以将交易返回的Event数据进行解析并可视化;

_images/trans_view.png

_images/event_view.png

5.3 关键字配置

可以在配置页设置关键字,后台服务会检测拉取解析后的数据是否包含关键字,包含关键字的数据信息会添加到监管告警信息列表。比如设置存证的关键字。

_images/keyword_add.png

_images/audit_info.png

5.4 监管信息处理
5.4.1 应用告警

如果需要监管整个应用信息,可以在区块链概览页通过应用列表里的介入处理按钮将应用信息添加到应用告警列表。处理后可通过确认按钮修改状态。如果需要将应用信息从应用告警移除,可以调用删除按钮。

_images/audit_app_add.png

_images/audit_app_handle.png

5.4.2 交易告警

交易告警包括搜索出的的交易数据告警和交易列表页的交易数据告警。处理后可通过确认按钮修改状态。如果需要将应用信息从应用告警移除,可以调用删除按钮。

关键字查询的交易:

_images/search_key.png

条件查询的交易:

_images/search_condition.png

交易列表页的交易:

_images/trans_list.png

交易告警信息处理:

_images/audit_trans_handle.png

接口说明

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)入参表

2)入参示例

http://localhost:5009/WeBASE-Data-Collect/chain/all
返回参数

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)入参表

2)入参示例

http://localhost:5009/WeBASE-Data-Collect/chain/togglePullData
返回参数

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)入参表

2)入参示例

http://localhost:5010/WeBASE-Data-Fetcher/chain/general
返回参数

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)入参表

2)入参示例

http://localhost:5010/WeBASE-Data-Fetcher/chain/all
返回参数

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
Ubuntu环境安装Java

  # 安装默认Java版本(Java 8或以上)
  sudo apt install -y default-jdk
  # 查询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官网

① 安装包下载

下载elasticsearchelasticsearch-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

如果需要设置用户名密码访问,则进行以下操作:

  1. 在配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启

    xpack.security.enabled: true
    xpack.license.self_generated.type: basic
    xpack.security.transport.ssl.enabled: true
    
  2. 设置用户名和密码,需要为4个用户分别设置密码(elastic,kibana,logstash_system,beats_system)

    bin/elasticsearch-setup-passwords interactive
    
  3. 如果需要修改密码,命令如下:

    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"
}
④ 停止

查询进程并kill:

ps -ef|grep elasticsearch
kill -9 pid
1.4. Zookeeper部署

此处给出简单步骤,供快速查阅。详情请参考官网

① 安装包下载

官网下载对应版本的安装包,并解压到相应目录

mkdir /software
tar -zxvf zookeeper-XXX.tar.gz /software/
② 配置和启动

ZooKeeper的安装包括单机模式安装,以及集群模式安装。具体步骤请参考官网说明:

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.1 脚本没权限
  • 执行shell脚本报错误”permission denied”或格式错误
赋权限:chmod + *.sh
转格式:dos2unix *.sh
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 日志扫描目录和级别

数据导出代码生成子系统

https://img.shields.io/badge/license-Apache%202-4EB1BA.svgLicense https://badges.gitter.im/WeBASE-Codegen-Monkey/WeBASE-Codegen-Monkey.svgGitter

道生一,一生二,二生三,三生万物。 万物负阴而抱阳,冲气以为和。 人之所恶,唯孤、寡、不谷,而王公以为称。 故物或损之而益,或益之而损。 人之所教,亦我而教人。 强梁者不得其死——吾将以为教父。 – 老子

目前本项目处于维护模式,新特性和新功能请移步: WeBankBlockchain-Data-Export

组件介绍

1. 数据导出组件

WeBASE-Collect-Bee是一个基于FISCO-BCOS平台的数据导出工具。

数据导出组件WeBASE-Collect-Bee的目的在于降低获取区块链数据的开发门槛,提升研发效率。研发人员几乎不需要编写任何代码,只需要进行简单配置,就可以把数据导出到指定的存储介质上,比如DB、ES、MQ、Hadoop等,并提供相关服务接口获取数据,以满足业务场景需求。

WeBASE-Collect-Bee可以导出区块链上的基础数据,如当前块高、交易总量等。

如果正确配置了FISCO-BCOS上运行的所有合约,WeBASE-Collect-Bee可以导出区块链上这些合约的业务数据,包括event、构造函数、合约地址、执行函数的信息等。

WeBASE-Collect-Bee提供了基于Restful的API,支持通过http的方式调用这些接口。

2. 代码自动生成组件

WeBASE-Collect-Bee易于使用,且功能强大;但是仍有一定的开发门槛。为了更进一步地提升研发效率,我们开发了WeBASE-Codegen-Monkey。只需要在一个配置文件中进行少量简单的配置,同时按照要求提供相关的智能合约信息;当前版本可支持自动生成WeBASE-Collect-Bee

3. 使用场景和解决方案

区块链的数据存储在区块链上,需要使用智能合约暴露的接口来进行调用。由于智能合约暴露的接口的限制,区块链上不适合进行复杂的数据查询、大数据分析和数据可视化等工作。因此,我们致力于提供一种智能化、自动化的数据导出和备份的解决方案。

3.1 案例 数据可视化后台系统
  • 背景

某互联网小贷公司基于FISCO-BCOS开发了区块链借条业务系统,客户之间的借贷合同信息和证明材料都会在脱敏后保存到区块链上。该公司的运营人员需要获得当前业务进展的实时信息和摘要信息。

  • 解决方案

该公司使用WeBASE-Codegen-Monkey迅速生成了WeBASE-Collect-Bee的代码,并根据实际需求进行了定制化开发,在一天之内投入到线上使用。导出到db的数据接入到了该公司的统一监控平台,该公司PM可以在业务后台系统上获得该业务的实时进展,该公司运维人员可以在公司运维监控室的大屏幕实时监控业务系统的状态。

3.2 案例 区块链业务数据对账系统
  • 背景

某公司基于FISCO-BCOS开发了区块链的业务系统,需要将本地数据与链上的数据进行对账。

  • 解决方案

该公司使用WeBASE-Codegen-Monkey迅速生成了WeBASE-Collect-Bee的代码,并根据实际需求进行了定制化开发。通过在智能合约中设计的各类event,相关的业务数据都被导出到数据库中;从而实现轻松对账的需求。

3.3 案例 区块链业务数据查询系统
  • 背景

某互联网公司基于FISCO-BCOS开发了区块链的业务系统,但是发现智能合约对业务报表的支持不佳。但是,公司的一线业务部门要求实时查看各类复杂的业务报表。

  • 解决方案

该公司使用WeBASE-Codegen-Monkey迅速生成了WeBASE-Collect-Bee的代码,并根据实际需求进行了定制化开发,区块链上的数据可以实时导出到数据库中。利用WeBASE-Collect-Bee自带的Restful API,该公司的报表系统实现了和区块链数据的对接,可以获得准实时的各类业务报表。

4. 特性介绍
4.1 自动生成数据导出组件

只需用户提供智能合约编译后的Java代码和相关的底层链、数据库的基本信息,WeBASE-Codegen-Monkey就能帮助你自动生成一个区块链数据导出的组件。理论上可支持主流的数据库;现阶段,实测支持将数据导出到Mysql数据库中。

4.2 支持自定义导出数据内容

可以支持导出区块链的基本信息、智能合约的函数、Event等信息。可以对导出的数据库表、字段进行定制。也可以修改导出数据字段的长度。

4.3 内置Restful API,提供常用的查询功能

自带常用的Restful API,支持查询块高、块信息、Event信息和函数信息等。

4.4 支持多数据源,支持读写分离和分库分表

为了应对海量数据的导出,WeBASE-Collect-Bee数据导出组件集成了sharding-jdbc,支持可配置的多数据源存储,读写分离和分库分表:数据可以存储到多个表中,也可以存储到多个库中。同时,内置的Restful API可以自动无感知地返回正常的数据。

4.5 支持多活部署,多节点自动导出

WeBASE-Collect-Bee数据导出组件支持多活部署,可自动进行分布式任务调度。

4.6 支持区块重置导出

WeBASE-Collect-Bee数据导出组件基于区块高度进行导出,并支持指定高度重新导出数据。

4.7 支持可视化的监控页面

WeBASE-Collect-Bee可与grafana深度集成,支持自动生成dashboard实例,让您的链上数据了如指掌。

4.8 提供可视化的互动API控制台

WeBASE-Collect-Bee集成了swagger插件,提供可视化互动API控制台。

_images/grafana_demo.png[效果图]

部署说明

1. 前置依赖

在使用本组件前,请确认系统环境已安装相关依赖软件,清单如下:

依赖软件 说明 备注
FISCO-BCOS >= 2.0, 1.x版本请参考V0.5版本
Bash 需支持Bash(理论上来说支持所有ksh、zsh等其他unix shell,但未测试)
Java JDK[1.8] JAVA安装可参考附录2
Git 下载的安装包使用Git Git安装可参考附录3
MySQL >= mysql-community-server[5.7] MySQL安装可参考附录4
zookeeper >= zookeeper[3.4] 只有在进行集群部署的时候需要安装,zookeeper安装可参考附录5
docker >= docker[18.0.0] 只有需要可视化监控页面的时候才需要安装,docker的安装可参考gitee docker安装手册
2. 部署步骤
2.1 获取安装包
2.1.1 下载安装包
#下载安装包
curl -LO https://github.com/WeBankFinTech/WeBASE-Codegen-Monkey/raw/master/src/main/install_scripts.tar.gz
#解压安装包
tar -zxf install_scripts.tar.gz 
cd install_scripts
2.1.2 进入安装路径

进入解压后的install_scripts文件夹目录,获得如下的目录结构,其中Evidence.java为合约示例。

├── install_scripts
│   ├── config
│   │   ├── contract
│   │   │   └── HelloWorld.java
│   │   └── resources
│   │       └── application.properties
│   │       └── web3j.def
│   └── generate_bee.sh
2.2 配置安装包
2.2.1 配置合约文件

找到你的业务工程(你要导出数据的那条区块链中,往区块链写数据的工程),复制合约产生的Java文件:请将Java文件复制到./config/contract目录下(请先删除目录结构中的合约示例HelloWorld.java文件)。

如果你的业务工程并非Java工程,那就先找到你所有的合约代码。不清楚如何将Solidity合约生成为Java文件,请参考: 利用控制台将合约代码转换为java代码

2.2.2 配置证书文件

将节点sdk目录下的相关的证书文件:请将你的配置文件复制到./config/resources目录下。配置文件包括:

  • ca.crt
    
  • node.crt
    
  • node.key
    
2.2.3 配置应用

修改application.properties文件:该文件包含了所有的配置信息。以下配置信息是必须要修改的,否则跑不起来:

# 节点的IP及通讯端口、组号。 
## NODE_NAME可以是任意字符和数字的组合,IP为节点运行的IP,PORT为节点运行的channel_port,默认为20200。
system.nodeStr=[NODE_NAME]@[IP]:[PORT]
## GROUP_ID必须与FISCO-BCOS中配置的groupId一致。
system.groupId=[GROUP_ID]
### 加密类型,根据FISCO BCOS链的加密类型配置,0-ECC, 1-gm。默认为非国密类型。
system.encryptType=0

# 数据库的信息,暂时只支持mysql; serverTimezone 用来设置时区
system.dbUrl=jdbc:mysql://[IP]:[PORT]/[database]?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
system.dbUser=[user_name]
system.dbPassword=[password]

# 合约Java文件的包名
system.contractPackName=[编译Solidity合约时指定的包名]

更多配置详情可参考附录1:配置参数

2.3 生成代码并运行程序
2.3.1 选择一:直接在本机运行
chmod +x generate_bee.sh
bash generate_bee.sh
## 还可以指定数据导出程序的版本,例如
## ./generate_bee.sh -v 1.3.0

当前目录下会生成WeBASE-Collect-Bee工程代码。数据导出组件将直接启动,对应的执行日志会打印到终端上。

请注意:请务必按照以上命令操作,切莫使用sudo命令来操作,否则会导致Gradlew没有权限,导致depot数据失败。

2.3.2 选择二:本机编译,复制执行包到其他服务器上运行
chmod +x generate_bee.sh
bash generate_bee.sh -e build
## 还可以指定数据导出程序的版本,例如
## ./generate_bee.sh -e build -v 1.3.0

当前目录下会生成WeBASE-Collect-Bee工程代码。请将此生成工程下的./WeBASE-Collect-Bee/WeBASE-Collect-Bee-core/dist文件夹复制到其他服务器上,并执行:

chmod +x *.sh
bash start.sh
tail -f *.log
2.3.3 选择三:本机编译,复制执行包到其他服务器,使用supervisor来启动。

使用supervisor来守护和管理进程,supervisor能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。 它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。 supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。 编译生成代码的部署同2.2.3.2

使用supervisor来安装与部署的步骤请参阅附录6

2.4 检查运行状态及退出
2.4.1 检查程序进程是否正常运行
ps -ef |grep WeBASE-Collect-Bee

如果看到如下信息,则代表进程执行正常:

app   21980 24843  0 15:23 pts/3    00:00:44 java -jar WeBASE-Collect-Bee0.3.0-SNAPSHOT.jar
2.4.2 检查程序是否已经正常执行

当你看到程序运行,并在最后出现以下字样时,则代表运行成功:

Hibernate: select blockheigh0_.pk_id as pk_id1_2_, blockheigh0_.block_height as block_he2_2_, blockheigh0_.event_name as event_na3_2_, blockheigh0_.depot_updatetime as depot_up4_2_ from block_height_info blockheigh0_ where blockheigh0_.event_name=?
Hibernate: select blockheigh0_.pk_id as pk_id1_2_, blockheigh0_.block_height as block_he2_2_, blockheigh0_.event_name as event_na3_2_, blockheigh0_.depot_updatetime as depot_up4_2_ from block_height_info blockheigh0_ where blockheigh0_.event_name=?
Hibernate: select blockheigh0_.pk_id as pk_id1_2_, blockheigh0_.block_height as block_he2_2_, blockheigh0_.event_name as event_na3_2_, blockheigh0_.depot_updatetime as depot_up4_2_ from block_height_info blockheigh0_ where blockheigh0_.event_name=?

还可以通过以下命令来查看区块的同步状态:

tail -f webasebee-core.log| grep "sync block"

当看到以下滚动的日志时,则代表区块同步状态正常,开始执行下载任务。

 $ tail -f webasebee-core.log| grep "sync block"
2019-05-05 14:41:07.348  INFO 60538 --- [main] c.w.w.c.service.CommonCrawlerService     : Try to sync block number 0 to 90 of 90
2019-05-05 14:41:07.358  INFO 60538 --- [main] c.w.w.c.service.BlockTaskPoolService     : Begin to prepare sync blocks from 0 to 90
2019-05-05 14:41:17.142  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 0 of 90 sync block succeed.
2019-05-05 14:41:17.391  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 1 of 90 sync block succeed.
2019-05-05 14:41:17.618  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 2 of 90 sync block succeed.
2019-05-05 14:41:18.072  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 3 of 90 sync block succeed.
2019-05-05 14:41:18.395  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 4 of 90 sync block succeed.
2019-05-05 14:41:18.796  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 5 of 90 sync block succeed.
2019-05-05 14:41:19.008  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 6 of 90 sync block succeed.
2019-05-05 14:41:19.439  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 7 of 90 sync block succeed.
2019-05-05 14:41:20.303  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 8 of 90 sync block succeed.
2019-05-05 14:41:20.512  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 9 of 90 sync block succeed.
2019-05-05 14:41:20.738  INFO 60538 --- [main] c.w.w.crawler.service.BlockSyncService   : Block 10 of 90 sync block succeed.
……
2.4.3 检查数据是否已经正常产生

你也可以通过DB来检查,登录你之前配置的数据库,看到自动创建完表的信息,以及表内开始出现数据内容,则代表一切进展顺利。如你可以执行以下命令:

# 请用你的配置信息替换掉[]里的配置,并记得删除[]
mysql -u[用户名] -p[密码] -e "use [数据库名]; select count(*) from block_detail_info"

如果查询结果非空,出现类似的如下记录,则代表导出数据已经开始运行:

+----------+
| count(*) |
+----------+
|      633 |
+----------+
2.4.4 停止导入程序
bash stop.sh

恭喜您,到以上步骤,您已经完成了数据导出组件的安装和部署。如果您还需要额外获得可视化的监控页面,请参考3.3章节。

2.4.5 注意事项

在生成的工程中,我们使用了Hibernate auto-ddl 的特性来自动创建数据库表,该特性仅供提供快速的演示,但请勿使用该特性上线;否则可能会造成生产系统的安全隐患。

你可以修改WeBASE-Collect-Bee/WeBASE-Collect/src/main/resources/appliction.properties:


spring.jpa.properties.hibernate.hbm2ddl.auto=none
3. 可视化监控程序安装和部署
3.1 安装软件

首先,请安装docker,docker的安装可参考docker安装手册 等docker安装成功后,请下载grafana:

docker pull grafana/grafana

如果你是使用sudo用户安装了docker,可能会提示『permission denied』的错误,建议执行:

sudo docker pull grafana/grafana
3.2 启动grafana
docker run   -d   -p 3000:3000   --name=grafana   -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource"   grafana/grafana

grafana将自动绑定3000端口并自动安装时钟和Json的插件。

3.3 登录grafana界面

直接使用浏览器访问:http://your_ip:3000/,请注意使用你机器的IP替换掉your_ip,默认的用户名和密码为admin/admin

3.4 添加MySQL数据源

在正常登录成功后,如图所示,选择左边栏设置按钮,点击『Data Sources』,选择『MySQL』数据源,随后按照提示的页面,配置 Host, Database, User 和 Password等。

_images/add_datasource.png[添加步骤]

3.5 导入Dashboard模板

WeBASE-Codegen-Monkey会自动生成数据的dashboard模板,数据的路径位于:WeBASE-Collect-Bee/WeBASE-Collect-Bee-core/src/main/scripts/grafana/default_dashboard.json,请点击左边栏『+』,选择『import』,点击绿色按钮『Upload.json File』,选择刚才的WeBASE-Collect-Bee/src/main/scripts/grafana/default_dashboard.json文件,最后,点击『import』按钮。

_images/import_json.png[导入步骤]

如果导入成功,dashboards下面会出现『FISCO-BCOS区块链监控视图』,您可以选择右上方的时间按钮来选择和设置时间范围及刷新时间等。您也可以选中具体的页面组件进行编辑,自由地移除或挪动组件的位置,达到更好的使用体验。

更多关于Grafana的自定义配置和开发文档,可参考Grafana官方文档

4. 开启可视化的API文档和功能性测试

WeBASE-Collect-Bee默认集成了swagger的插件,支持通过可视化的控制台来发送交易、生成报文、查看结果、调试交易等。

_images/swagger.png[swagger控制台]

**请注意,swagger插件仅推荐在开发或测试环境调试使用,在正式上生产环境时,请关闭此插件。 **

如果未在monkey工程中配置打开swagger选项,则默认关闭,需要在配置文件中打开。

打开方法:

打开config/resources/application.properties,添加:

button.swagger=on
4.1 查看API文档:

请在你的浏览器打开此地址:

http://your_ip:port/swagger-ui.html

例如,当你在本机运行了WeBASE-Collect-Bee,且未修改默认的5200端口,则可以访问此地址:

http://localhost:5200/swagger-ui.html

此时,你可以看到上述页面,可以看到页面主要包括了http请求页面和数据模型两部分。

4.2 使用swagger发送具体的交易:

选择点击对应的http请求集,可以点开相关的http请求。此时,你可以选择点击“try it out”,手动修改发送的Json报文,点击“Excute”按钮,即可发送并查收结果。

我们以查询区块信息为例,如下列图所示: _images/swag_test1.png[选择请求] _images/swag_test2.png[编辑报文] _images/swag_test3.png[查收结果]

存储模型

数据导出中间件会自动将数据导出到存储介质中,每一类数据都有特定的存储格式和模型,以MySQL为例。包括四类数据:区块数据、账户数据、事件数据和交易数据。

1. 区块数据存储模型

区块数据存储模型包括三个数据存储模型,分别为区块基本数据存储模型、区块详细数据存储模型及区块交易数据存储模型。

1.1 区块下载任务明细表

存储了所有区块的状态信息和下载情况,对应数据库表名称为block_task_pool,如下所示:

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) 块高
certainty int(11) 是否可能分叉 0- 是; 1-否
handle_item int(11) 处理分片序号,默认为0
sync_status int 2 0-待处理;1-处理中;2-已成功;3-处理失败;4-超时
depot_updatetime datetime 系统时间 记录插入/更新时间
1.2 区块详细数据存储模型

区块详细数据存储模型用于存储每个区块的详细数据,包括区块哈希、块高、出块时间、块上交易量,对应的数据库表名为block_detail_info,如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_hash varchar(255) Unique key & Index 区块哈希
block_height bigint(20) 区块高度
block_tiemstamp datetime index 出块时间
tx_count int(11) 当前区块交易量
depot_updatetime datetime 系统时间 记录插入/更新时间
status int(11) 区块状态 0-初始化 1-成功 2-失败
1.3 区块交易数据存储模型

区块交易数据存储模型用于存储每个区块中每个交易的基本信息,包括区块哈希、块高、出块时间、合约名称、方法名称、交易哈希、交易发起方地址、交易接收方地址,对应的数据库表名为block_tx_detail_info。如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_hash varchar(255) Unique key & Index 区块哈希
block_height bigint(20) 区块高度
block_tiemstamp datetime index 出块时间
contract_name varchar(255) 该笔交易的合约名称
method_name varchar(255) 该笔交易调用的function名称
tx_hash varchar(255) 交易哈希
tx_from varchar(255) 交易发起方地址
tx_to varchar(255) 交易接收方地址
depot_updatetime datetime 系统时间 记录插入/更新时间
2. 账户数据存储模型

账户数据存储模型用于存储区块链网络中所有账户信息,包括账户创建时所在块高、账户所在块的出块时间、账户地址(合约地址)、合约名称。对应的数据库表名为account_info。如下表所示。需要注意的是,如果通过嵌套合约隐式调用构造方法,则不会导出。比如A合约中通过关键字new一个B合约,则B合约不会导出。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) index 区块高度
block_tiemstamp datetime index 出块时间
contract_address varchar(255) index 合约/账户地址
contract_name varchar(255) 合约名称
depot_updatetime datetime 系统时间 记录插入/更新时间
3. 事件数据存储模型

事件数据存储模型是根据合约中的事件(Event)自动生成的。一个合约中有多少个事件就会生成多少个对应的事件数据存储表。

3.1 事件数据存储命名规则

由于事件数据存储模型是自动生成的,所以事件数据存储表名和表结构及字段命名采用统一的规则。以如下合约作为示例。

pragma solidity ^0.4.7;
contract UserInfo {
    bytes32 _userName;
    uint8 _sex;
    
    function UserInfo(bytes32 userName, uint8 sex) public {
        _userName = userName;
        _sex = sex;
    }
    
    event modifyUserNameEvent(bytes32 userName,uint8 sex);
    
    function modifyUserName(bytes32 userName) public returns(bytes32){
        _userName = userName;
        modifyUserNameEvent(_userName,_sex);
        return _userName;
    }
}
3.1.1 事件表命名规则

事件表命名规则为:合约名称_事件名称,并将合约名称和事件名称中的驼峰命名转化为小写加下划线方式。比如上述合约中合约名称为UserInfo,事件名称为modifyUserNameEvent,则表名称为user_info_modify_user_name_event。

3.1.2 事件字段命名规则

事件字段命名规则:事件字段驼峰命名转化为小写加下划线方式。仍以上述合约中modifyUserNameEvent为例,包含字段userName,则在user_info_modify_user_name_event表中对应的字段为user_name。

3.2 事件数据存储模型

事件数据存储模型除过存储该事件的相关信息外,还会存储和该事件相关的块和交易信息,如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) index 区块高度
block_tiemstamp datetime index 出块时间
contract_address varchar(255) 合约地址

| event-paralist | | | | 事件字段列表 | | tx_hash | varchar(255) | index | | 交易哈希 | | depot_updatetime | datetime | | 系统时间 | 记录插入/更新时间 |

以上述智能合约为例,对应的 如下:

字段 类型 字段设置 默认值 说明
user_name varchar(255) 用户名
sex int 性别
4. 交易数据存储模型

交易数据存储模型同事件数据存储模型类似,是根据合约中的方法(Function)自动生成的。一个合约中有多少个方法就会生成多少个对应的方法数据存储表。该方法指的是实际产生交易的方法(含构造方法),不包含事件(Event)方法和查询方法(constant关键字标注)。

4.1 交易数据存储命名规则

交易数据存储表名、表结构及字段命名规则同事件数据存储模型类似.

4.1.1 交易表命名规则

交易表命名规则为:合约名称_方法名称,并将合约名称和方法名称中的驼峰命名转化为小写加下划线方式。比如上述合约中合约名称为UserInfo,方法名称为modifyUserName,则表名称为user_info_modify_user_name_method;构造方法名称为UserInfo,那么对应的表名为user_info_user_info_method。

4.1.2 交易字段命名规则

交易字段命名规则也是将交易参数字段驼峰命名转化为小写加下划线,不再赘述。需要指出的是,对于一些没有参数的方法,交易数据存储模型没有办法存储,即通过无参方法产生的交易明细将无法通过数据导出工具获取到。

4.2 交易数据存储模型

交易数据存储模型除过存储该方法的相关信息外,还会存储和该方法相关的块和交易信息,如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) index 区块高度
block_tiemstamp datetime index 出块时间
function-paralist 函数入参字段列表
function-outputlist 函数输出字段列表,以output1开始,到outputn
tx_hash varchar(255) index 交易哈希
depot_updatetime datetime 系统时间 记录插入/更新时间

3.1中的合约为例,对应的 如下:

字段 类型 字段设置 默认值 说明
user_name varchar(255) 用户名
sex int 性别

常见问题

1. 为啥我的数据里自动生成的表里,只有block_task_pool和block_detail_info表有数据?

A: block_task_pool和block_detail_info表是链的基本数据,只要服务正常运行,这两个表肯定会有数据。首先,请检查连接的区块链的地址、端口是否正确。其次,你需要检查合约的版本。如果你升级了合约,但链上执行的合约都是老版本的合约,这个时候就无法获得数据。最后,需要检查合约中是否定义了Event、显式定义了构造函数;如果没有定义,是不会有Event和构造函数的表的。

2. 我在链上部署了多个项目的合约,其中的包名并不同,能在同一个工程里导出数据吗?

A:可以。只需要手动将编译生成的合约代码的包名改为同一个,然后在配置文件中将monitor.contractPackName配置为该包名,并按照之前的方式配置、重启,即可导出所有合约的数据。

3. 如果我的链上所执行的合约是低于V1.2.0版本的怎么办?还可以导出来吗?

A: 可以,但需要进行特殊的操作。 首先,找到你原有的历史合约,然后使用1.2.0版本的web3sdk进行编译得到V1.2.0版本的Java文件,合约代码转换为java代码,复制每个Java文件里的ABI字段。然后找到你用之前版本的web3sdk曾经编译的Java代码,注意请保证你安装的fisco-solc与之前的版本一致,将刚才V1.2.0版本Java文件中的ABI字段手工拷贝到之前Java代码中。最后将此定制的Java代码放入到配置文件夹中,按手册生成和执行。

4. 假如我的合约升级了怎么办,能否导出历史和更新后的合约数据?

A:可以。但是会被作为两个数据库表来进行存储,因为合约的数据结构等可能会改变。 操作方法:你也猜到了,我们建议建立版本号,将升级的合约与旧版本的合约Java文件,使用不同的命名,保存到配置文件下面。

5. 我已成功启动和部署服务,也看到Mysql里生成了各个函数的表,但是只有event表里有数据,函数表里没有?

A:这个问题是因为发送交易的文件和数据导出里放入的Java文件不同造成的。例如,交易是通过nodejs或webase-front来发送的,但是,Java文件是通过控制台编译生成的。解决方案:将发送交易处的java文件复制到数据导出工程中。如果没有Java文件,例如nodejs环境,可将生成的binary和abi值,手工拷贝并替换Java文件里的BINARY和ABI字段的值,并重新使用monkey工程来重新生成bee工程即可。

6. 是否支持合约函数和事件的重载?

A:暂不支持,建议修改命名。

7. 是否支持多群组的数据导出?

A:数据导出是基于单个群组的导出所设计的。如果有多群组数据导出的需求,建议部署多个实例并将数据导出到多个数据库实例中。 如果群组数量较多,或觉得操作太繁琐的话,可以参考FISCO BCOS社区开发者提供的开源解决方案,通过使用脚本方便多群组操作: Fisco-Data-Loader-Bootstrap

使用技术

框架 理由
SpringBoot - Java开发框架 易用而又强大,不多说了。
Gradle - 依赖属性管理 相比于Maven,Gradle更加简洁和强大。
Beetl - 模板引擎 Beetl在易用性和性能等维度上超越了知名的竞争对手。
incubator-shardingsphere - 分布式数据库中间件 很棒的关系型数据库中间件。
Elastic-Job-Lite - 分布式调度解决方案 轻量级无中心化解决方案,出自shardingsphere同一个团队。

附录

1. 配置参数说明

WeBASE-Codegen-Monkey用于生成WeBASE-Collect-Bee组件实例,在WeBASE-Codegen-Monkey组件中配置文件只有一个:application.properties。该配置文件覆盖了数据导出组件所需的所有配置,并提供了详细的说明和样例,开发者可根据需求进行灵活配置。

1.1 Springboot服务配置
配置项 是否必输 说明 举例 默认值
server.port N 启动WeBASE-Collect-Bee组件实例的服务端口 8082 5200
1.2 FISCO-BCOS节点配置

FISCO-BCOS节点配置用于配置WeBASE-Collect-Bee服务连接的区块链节点,使得WeBASE-Collect-Bee服务能够访问连接节点,并通过该节点获取区块链网络上的数据。

配置项 是否必输 说明 举例 默认值
system.nodeStr Y 连接区块链节点的nodeStr,nodeName@[IP]:[PORT], 其中prot为channel port node1@ip:8822 -
system.encryptType N 加密类型: 0-RSA, 1-gm 0 0
1.3 数据库配置

数据导出组件最终会把区块链网络上的数据导出到数据存储介质中,目前版本仅支持MySQL,所以需要进行数据库配置。

配置项 是否必输 说明 举例 默认值
system.dbUrl Y 访问数据的URL jdbc:mysql://[IP]:[PORT]/[DB]?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8 -
system.dbUser Y 数据库用户名 admin -
system.dbPassword Y 数据库密码 123456 -
system.contractName.[methodName or eventName].shardingNO N 合约数据分片数:数据库指定数据表的个数 system.Rule.NewruleEvent.shardingNO = 3 1
system.sys.[sysTableName].shardingNO N 系统数据分片数 system.sys.BlockTxDetailInfo.shardingNO=5 1
system.nameStyle N 数据库表名和字段命名规则,支持下划线命名和原始数据命名 system.nameStyle=rawCase underScoreCase
system.namePrefix N 数据库表字段命名前缀,默认为_ system.namePrefix=_ _
system.namePostfix N 数据库表字段命名后缀,默认为空 system.namePostfix=_
system.tablePrefix N 数据库表名命名前缀,默认为空 system.tablePrefix=_
system.tablePostfix N 数据库表名命名后缀,默认为空 system.tablePostfix=_
system.dbIdentifierSplit N 是否开启自动裁剪过长的数据库表名,默认为false system.dbIdentifierSplit=true false

其中sysTableName对应区块数据表和账户数据表,详情见 数据存储模型 章节。

1.4 FISCO-WeBASE-Collect-Bee工程配置
配置项 是否必输 说明 举例 默认值
system.group Y 同spring项目的group com.example -
system.contractPackName Y 编译智能合约所输入的包名 com.webank.blockchain.wecredit.contracts -
system.frequency N 所有method和event的抓取频率,默认几秒轮询一次 10 5
1.5 线程池配置

在单机部署下,必须配置线程池参数。数据导出配置用于配置数据导出的频率、线程数及启动多线程条件等。当system.multiLiving=true时,配置文件不会生成线程池相关配置。

配置项 是否必输 说明 举例 默认值
system.multiLiving Y 关闭多活开关 false false
system.crawlBatchUnit N 线程处理单元:多线程任务模式下单个线程一次任务执行完成的区块数 100 100
1.6 集群多活配置

在集群多活部署的方案中,必须设置集群多活的配置。集群必须通过zookeeper进行服务注册和任务分发。当system.multiLiving=false时,配置文件不会生成zookeeper相关配置。

配置项 是否必输 说明 举例 默认值
system.multiLiving Y 启动多活开关 true false
regcenter.serverList N 注册中心服务器列表 [ip1:2181;ip2:2181] -
regcenter.namespace N 注册中心命名空间 wecredit_bee -
1.7 其他高级配置
配置项 是否必输 说明 举例 默认值
monitor.[contractName].[methodName/eventName].generated=false N 是否抓取特定合约中特定method或event的数据 on/off on
monitor.[contractName].[eventName].ignoreParam=XXX,XXX N 忽略特定合约特定event的特定字段不进行抓取 xxx,xxx
length.[contractName].[methodName or eventName].paraName N 指定特定字段在数据库表中的长度 512
button.swagger N 是否打开swagger功能,请务必在生成环境关闭此开关 on/off on
2. Java安装
Ubuntu环境安装Java
# 安装默认Java版本(Java 8或以上)
sudo apt install -y default-jdk
# 查询Java版本
java -version 
CentOS环境安装Java
# 查询centos原有的Java版本
$ rpm -qa|grep java
# 删除查询到的Java版本
$ rpm -e --nodeps java版本
# 查询Java版本,没有出现版本号则删除完毕
$ java -version
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从openJDK官网(https://jdk.java.net/java-se-ri/8)或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-linux-x64.tar.gz
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 
3. Git安装

git:用于拉取最新代码

centos:

sudo yum -y install git

ubuntu:

sudo apt install git
4. Mysql安装

此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网

(1)安装MariaDB

  • 安装命令
sudo yum install -y mariadb*

(2)启停

启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop  mariadb.service

(3)设置开机启动

sudo systemctl enable mariadb.service

(4)初始化root用户

执行以下命令:
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;

安全温馨提示:

  • 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
  • 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号

(5)创建test用户并授权本地访问

mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;

(6)测试是否成功

  • 登录数据库
mysql -utest -p123456 -h localhost -P 3306
  • 创建数据库
mysql > create database webasebee;
mysql > use webasebee;

以上语句仅适用于开发环境,不能直接在实际生产中使用!!!以上设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号

5. zookeeper 安装

zookeeper 支持单机和集群部署,推荐使用集群部署的方式,请参考zookeeper官网的说明:

集群部署

单机部署

6. supervisor安装与部署
安装脚本
sudo yum -y install supervisor

会生成默认配置/etc/supervisord.conf和目录/etc/supervisord.d,如果没有则自行创建。

配置脚本

cd /etc/supervisord.d 修改/etc/supervisord.conf的[include]部分:

[include]
files = supervisord.d/*.ini
[supervisord]

在/etc/supervisord.d目录下配置以下启动配置文件webasebee_config1.ini(请注意配置文件里需要包含webasebee,否则会导致关闭任务命令失效),注意修改相关的路径。

[program:supervisor_webasebee]
directory =【你的程序路径】/WeBASE-Collect-Bee/dist ; 程序的启动目录
command = nohup java -jar 【你的安装包名,如WeBASE-Collect-Bee0.3.0-SNAPSHOT.jar】 & ; 启动命令,与命令行启动的命令是一样的
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 15        ; 启动 15 秒后没有异常退出,就当作已经正常启动了
autorestart = true   ; 程序异常退出后自动重启
startretries = 3     ; 启动失败自动重试次数,默认是 3
user = app          ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 150MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
stderr_logfile=【你的日志路径】/WeBASE-Collect-Bee/dist/log/webase_bee_error.log
stdout_logfile = 【你的日志路径】/WeBASE-Collect-Bee/dist/log/webase_bee_out.log  ;日志统一放在log目录下
[supervisord]
启动任务

supervisor支持supervisorctl和supervisord启动,可通过systemctl实现开机自启动。 我们建议采用supervisord的方式启动:

supervisord -c /etc/supervisord.d/webasebee_config1.ini
关闭任务
ps -ef|grep supervisord|grep webasebee| awk '{print $2}'|xargs kill -9
ps -ef|grep WeBASE-Collect-Bee|grep -v grep| awk '{print $2}'|xargs kill -9
7. 常见问题
7.1 脚本没权限
  • 执行shell脚本报错误”permission denied”或格式错误
赋权限:chmod + *.sh
转格式:dos2unix *.sh

数据导出子系统

https://img.shields.io/badge/license-Apache%202-4EB1BA.svgLicense https://badges.gitter.im/WeBASE-Collect-Bee/WeBASE-Collect-Bee.svgGitter

穿花度柳飞如箭, 粘絮寻香似落星。 小小微躯能负重, 器器薄翅会乘风。 – 吴承恩

目前本项目处于维护模式,新特性和新功能请移步: WeBankBlockchain-Data-Export

组件介绍

1. 组件介绍

WeBASE-Collect-Bee 是一个基于FISCO-BCOS平台的数据导出工具。

数据导出组件WeBASE-Collect-Bee的目的在于降低获取区块链数据的开发门槛,提升研发效率。研发人员几乎不需要编写任何代码,只需要进行简单配置,就可以把数据导出到Mysql数据库。

WeBASE-Collect-Bee可以导出区块链上的基础数据,如当前块高、交易总量等。如果正确配置了FISCO-BCOS上运行的所有合约,WeBASE-Collect-Bee可以导出区块链上这些合约的业务数据,包括event、构造函数、合约地址、执行函数的信息等。

数据导出组件支持多数据源、分库分表、读写分离、分布式部署。

WeBASE-Collect-Bee提供了基于Restful的API,支持通过http的方式调用这些接口。

WeBASE-Collect-Bee还集成了Swagger组件,提供了可视化的文档和测试控制台。

你可以通过WeBASE-Codegen-Monkey来自动生成本工程,只需要在一个配置文件中进行少量简单的配置,同时按照要求提供相关的智能合约信息;我们推荐这种方式。

2. 使用场景和解决方案

区块链的数据存储在区块链上,需要使用智能合约暴露的接口来进行调用。由于智能合约暴露的接口的限制,区块链上不适合进行复杂的数据查询、大数据分析和数据可视化等工作。因此,我们致力于提供一种智能化、自动化的数据导出和备份的解决方案。

2.1 案例 数据可视化后台系统
  • 背景

某互联网小贷公司基于FISCO-BCOS开发了区块链借条业务系统,客户之间的借贷合同信息和证明材料都会在脱敏后保存到区块链上。该公司的运营人员需要获得当前业务进展的实时信息和摘要信息。

  • 解决方案

该公司使用WeBASE-Codegen-Monkey迅速生成了WeBASE-Collect-Bee的代码,并根据实际需求进行了定制化开发,在一天之内投入到线上使用。导出到db的数据接入到了该公司的统一监控平台,该公司PM可以在业务后台系统上获得该业务的实时进展,该公司运维人员可以在公司运维监控室的大屏幕实时监控业务系统的状态。

2.2 案例 区块链业务数据对账系统
  • 背景

某公司基于FISCO-BCOS开发了区块链的业务系统,需要将本地数据与链上的数据进行对账。

  • 解决方案

该公司使用WeBASE-Codegen-Monkey迅速生成了WeBASE-Collect-Bee的代码,并根据实际需求进行了定制化开发。通过在智能合约中设计的各类event,相关的业务数据都被导出到数据库中;从而实现轻松对账的需求。

2.3 案例 区块链业务数据查询系统
  • 背景

某互联网公司基于FISCO-BCOS开发了区块链的业务系统,但是发现智能合约对业务报表的支持不佳。但是,公司的一线业务部门要求实时查看各类复杂的业务报表。

  • 解决方案

该公司使用WeBASE-Codegen-Monkey迅速生成了WeBASE-Collect-Bee的代码,并根据实际需求进行了定制化开发,区块链上的数据可以实时导出到数据库中。利用WeBASE-Collect-Bee自带的Restful API,该公司的报表系统实现了和区块链数据的对接,可以获得准实时的各类业务报表。

3. 特性介绍
3.1 可自动生成代码

可使用WeBASE-Codegen-Monkey生成的代码和配置文件,自动组装成数据导出工程实例

3.2 支持灵活的数据库策略

集成sharding-jdbc组件,支持多数据源、分库分表、读写分离

3.3 支持集群部署和分布式任务调度

集成elstic-job开源组件,支持灵活的分布式部署和任务调度

3.4 可定制化的数据导出策略

提供灵活的可配置的区块、交易、事件、账户等数据导出功能,过滤不需要的数据

3.5 提供丰富的Restful API查询接口

支持丰富的Restful API数据查询接口

3.6提供可视化的互动API控制台

集成swagger插件,提供可视化互动API控制台

3.7 支持可视化的监控页面

WeBASE-Collect-Bee可与grafana深度集成,支持自动生成dashboard实例,让您的链上数据了如指掌。

快速开始

1. 前置依赖

在使用本组件前,请确认系统环境已安装相关依赖软件,清单如下:

依赖软件 说明 备注
FISCO-BCOS >= 2.0, 1.x版本请参考V0.5版本
Bash 需支持Bash(理论上来说支持所有ksh、zsh等其他unix shell,但未测试)
Java JDK[1.8]
Git 下载的安装包使用Git
MySQL >= mysql-community-server[5.7]
zookeeper >= zookeeper[3.4] 只有在进行集群部署的时候需要安装
2 部署步骤
2.1 获取工程代码

请按照WeBASE-Codegen-Monkey的操作手册进行操作。

如果你已经按照WeBASE-Codegen-Monkey的操作手册进行操作,那么恭喜,你将获得一个完整WeBASE-Collect-Bee工程目录。

WeBASE-Collect-Bee的工程使用gradle进行构建,是一个使用gradle进行多工程构建的SpringBoot工程。

├── ChangeLog.md
├── LICENSE
├── README.md
├── WeBASE-Collect-Bee-common  
├── WeBASE-Collect-Bee-core
├── WeBASE-Collect-Bee-db
├── WeBASE-Collect-Bee-extractor
├── WeBASE-Collect-Bee-parser
├── build.gradle
├── gradle
├── gradlew
├── gradlew.bat
├── libs
├── settings.gradle
└── src

其中各个子工程的说明如下:

WeBASE-Collect-Bee-core是运行任务的主工程。

WeBASE-Collect-Bee-common 公共类库。

WeBASE-Collect-Bee-db 数据库相关的功能。

WeBASE-Collect-Bee-extractor 区块抽取相关的功能。

WeBASE-Collect-Bee-parser 区块解析相关的功能。

.
├── build.gradle
├── config
│   └── contract
├── dist
│   ├── WeBASE-Collect-Bee-WeBASE-Collect-Bee-core1.1.0.jar
│   ├── config
│   ├── monitor.sh
│   ├── start.sh
│   ├── stop.sh
│   └── webasebee-core.log
└── src
    ├── main
    └── test

其中build.gradle为gradle的构建文件,config/contract目录存放了合约编译为Java的文件,src/main/resources下面存放了配置文件,dist是项目编译后生成的目录。

自动生成的Java代码一般位于src/main/java/com/webank/webasebee/*/generated;而合约编译后的文件除了会被存放到config/contract文件夹下以外,还会按照原有的package名称放入到src/main/java的路径下。

2.2 配置工程(更多高级配置)

当完整地按照WeBASE-Codegen-Monkey的操作手册进行操作获得WeBASE-Collect-Bee工程后,会得到WeBASE-Collect-Bee工程,主要的基础配置都将会在配置中自动生成,无需额外配置。但是,基于已生成的配置文件,你可以继续按照需求进行深入的个性化高级配置,例如配置集群部署、分库分表、读写分离等等。

在得到WeBASE-Collect-Bee工程后,进入WeBASE-Collect-Bee-core的目录:

cd WeBASE-Collect-Bee/WeBASE-Collect-Bee-core

主要的配置文件位于src/main/resources目录下。其中,application.properties包含了除部分数据库配置外的全部配置。 application-sharding-tables.properties包含了数据库部分的配置。

注意: 当修改完配置文件后,需要重新编译代码,然后再执行,编译的命令如下:

bash gradlew clean bootJar
导出数据范围的配置

配置文件位于 WeBASE-Collect-Bee/WeBASE-Collect-Bee-core/src/main/resources/application.properties

配置项 是否必输 说明 举例 默认值
system.startBlockHeight N 设置导出数据的起始区块号,优先以此配置为准 1000 0
system.startDate N 设置导出数据的起始时间,例如设置导出2019年元旦开始上链的数据;如已配置startBlockHeight,以导出数据起始区块号为准。支持的数据格式包括:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd 或 HH:mm:ss 或 yyyy-MM-dd HH:mm 或 yyyy-MM-dd HH:mm:ss.SSS 2019-01-01 -
单节点部署的配置

在选择单节点配置后,以下配置会自动生成。 单节点任务调度的配置,分布式任务调度的配置默认位于 WeBASE-Collect-Bee/WeBASE-Collect-Bee-core/src/main/resources/application.properties

#### 当此参数为false时,进入单节点任务模式
system.multiLiving=false

#### 多线程下载的分片数量,当完成该分片所有的下载任务后,才会统一更新下载进度。
system.crawlBatchUnit=100
集群部署的配置

多节点任务调度的配置,分布式任务调度的配置默认位于 WeBASE-Collect-Bee/WeBASE-Collect-Bee-core/src/main/resources/application.properties

#### 当此参数为true时,进入多节点任务模式
system.multiLiving=true

#### zookeeper配置信息,ip和端口
regcenter.serverList=ip:port
#### zookeeper的命名空间
regcenter.namespace=namespace

#### prepareTaskJob任务:主要用于读取当前区块链块高,将未抓取过的块高存储到数据库中。
#### cron表达式,用于控制作业触发时间
prepareTaskJob.cron=0/5 * * * * ?
### 分片总数量
prepareTaskJob.shardingTotalCount=1
#### 分片序列号和参数用等号分隔,多个键值对用逗号分隔,分片序列号从0开始,不可大于或等于作业分片总数
prepareTaskJob.shardingItemParameters=0=A

#### dataflowJob任务: 主要用于执行区块下载任务
dataflowJob.cron=0/5 * * * * ?
### 分片总数量
dataflowJob.shardingTotalCount=3
#### 分片序列号和参数用等号分隔,多个键值对用逗号分隔,分片序列号从0开始,不可大于或等于作业分片总数
dataflowJob.shardingItemParameters=0=A,1=B,2=C

数据库配置解析,数据库的配置默认位于 WeBASE-Collect-Bee/WeBASE-Collect-Bee-core/src/main/resources/application-sharding-tables.properties

分库分表的配置

实践表明,当区块链上存在海量的数据时,导出到单个数据库或单个业务表会对运维造成巨大的压力,造成数据库性能的衰减。 一般来讲,单一数据库实例的数据的阈值在1TB之内,单一数据库表的数据的阈值在10G以内,是比较合理的范围。

如果数据量超过此阈值,建议对数据进行分片。将同一张表内的数据拆分到同个数据库的多张表。

spring.shardingsphere.datasource.names=ds
# 定义数据源ds属性        
spring.shardingsphere.datasource.ds.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.jdbc-url=jdbc:mysql://[ip]:3306/[db]?autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.ds.username=
spring.shardingsphere.datasource.ds.password=

#将block_detail_info取模5路由到5张表
spring.shardingsphere.sharding.tables.block_detail_info.actual-data-nodes=ds.block_detail_info_$->{0..4}
spring.shardingsphere.sharding.tables.block_detail_info.table-strategy.inline.sharding-column=block_height
spring.shardingsphere.sharding.tables.block_detail_info.table-strategy.inline.algorithm-expression=block_detail_info_$->{block_height % 5}
spring.shardingsphere.sharding.tables.block_detail_info.key-generator-column-name=pk_id

将同一张表内的数据拆分到多个数据库的多张表。


# 配置所有的数据源,如此处定义了ds,ds0,ds1 三个数据源,对应三个库
spring.shardingsphere.datasource.names=ds,ds0,ds1

# 设置默认的数据源
spring.shardingsphere.sharding.default-datasource-name=ds

# 定义数据源ds
spring.shardingsphere.datasource.ds.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.jdbc-url=jdbc:mysql://[ip]:3306/[db]?autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.ds.username=
spring.shardingsphere.datasource.ds.password=

# 定义数据源ds0
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://[ip]:3306/[db]?autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.ds0.username=
spring.shardingsphere.datasource.ds0.password=

# 定义数据源ds1
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://[ip]:3306/[db]?autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.ds1.username=
spring.shardingsphere.datasource.ds1.password=

# 定义数据库默认分片的数量,此处分为2,以block_height取模2来路由到ds0或ds1
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=block_height
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{block_height % 2}

# 定义block_detail_info的分表策略,以block_height取模2来路由到ds0的block_detail_info0或ds1的block_detail_info1
spring.shardingsphere.rules.sharding.tables.block_detail_info.actual-data-nodes=ds0.block_detail_info0,ds1.block_detail_info1
spring.shardingsphere.rules.sharding.tables.block_detail_info.table-strategy.inline.sharding-column=block_height
spring.shardingsphere.rules.sharding.tables.block_detail_info.table-strategy.inline.algorithm-expression=block_detail_info$->{block_height % 2}
spring.shardingsphere.rules.sharding.tables.block_detail_info.key-generator-column-name=pk_id

spring.shardingsphere.rules.sharding.tables.block_task_pool.actual-data-nodes=ds0.block_task_pool0,ds1.block_task_pool1
spring.shardingsphere.rules.sharding.tables.block_task_pool.table-strategy.inline.sharding-column=block_height
spring.shardingsphere.rules.sharding.tables.block_task_pool.table-strategy.inline.algorithm-expression=block_task_pool$->{block_height % 2}
spring.shardingsphere.rules.sharding.tables.block_task_pool.key-generator-column-name=pk_id

# 打印sql日志的开关
spring.shardingsphere.props.sql.show=true

数据库读写分离的配置:

数据库读写分离的主要设计目标是让用户无痛地使用主从数据库集群,就好像使用一个数据库一样。读写分离的特性支持往主库写入数据,往从库查询数据,从而减轻数据库的压力,提升服务的性能。

注意,本组件不会实现主库和从库的数据同步、主库和从库的数据同步延迟导致的数据不一致、主库双写或多写。

##### 配置一主两从的数据库

spring.shardingsphere.datasource.names=master,slave0,slave1

spring.shardingsphere.datasource.master.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/master
spring.shardingsphere.datasource.master.username=
spring.shardingsphere.datasource.master.password=

spring.shardingsphere.datasource.slave0.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://localhost:3306/slave0
spring.shardingsphere.datasource.slave0.username=
spring.shardingsphere.datasource.slave0.password=

spring.shardingsphere.datasource.slave1.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.url=jdbc:mysql://localhost:3306/slave1
spring.shardingsphere.datasource.slave1.username=
spring.shardingsphere.datasource.slave1.password=

spring.shardingsphere.masterslave.name=ms
spring.shardingsphere.masterslave.master-data-source-name=master
spring.shardingsphere.masterslave.slave-data-source-names=slave0,slave1

spring.shardingsphere.props.sql.show=true
数据库读写分离+分库分表的配置:

spring.shardingsphere.datasource.names=master,slave0
        
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://[ip]:3306/test0?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.master.username=
spring.shardingsphere.datasource.master.password=

spring.shardingsphere.datasource.slave0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.slave0.jdbc-url=jdbc:mysql://[ip]:3306/test1?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.slave0.username=
spring.shardingsphere.datasource.slave0.password=

spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=master
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=slave0

spring.shardingsphere.sharding.tables.activity_activity.actual-data-nodes=ds0.block_tx_detail_info$->{0..1}
spring.shardingsphere.sharding.tables.activity_activity.table-strategy.inline.sharding-column=block_height
spring.shardingsphere.sharding.tables.activity_activity.table-strategy.inline.algorithm-expression=block_tx_detail_info$->{block_height % 2}

2.3 编译代码并运行程序

但是如果你对WeBASE-Collect-Bee的工程配置或代码进行了深度定制,当修改完成后,可参考以下步骤进行编译和启动, 这样可以省去重新下载代码库和重新生成代码,而且避免了你的个性化改动被覆盖:

cd WeBASE-Collect-Bee
bash gradlew clean bootJar
cd WeBASE-Collect-Bee-core/dist
chmod +x *.jar
chmod +x *.sh
bash start.sh
tail -f *.log

# 停止进程
bash stop.sh

当然,你也可以使用supervisor来守护和管理进程,supervisor能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。 它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。 也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。 supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

supervisor的安装与部署可以参考 WeBASE-Codegen-Monkey 附录6的说明文档。

2.4 检查运行状态及退出
2.4.1 检查程序进程是否正常运行
ps -ef |grep WeBASE-Collect-Bee

如果看到如下信息,则代表进程执行正常:

app   21980 24843  0 15:23 pts/3    00:00:44 java -jar WeBASE-Collect-Bee1.0.2-SNAPSHOT.jar
2.4.2 检查程序是否已经正常执行

当你看到程序运行,并在最后出现以下字样时,则代表运行成功:

Hibernate: select blockheigh0_.pk_id as pk_id1_2_, blockheigh0_.block_height as block_he2_2_, blockheigh0_.event_name as event_na3_2_, blockheigh0_.depot_updatetime as depot_up4_2_ from block_height_info blockheigh0_ where blockheigh0_.event_name=?
Hibernate: select blockheigh0_.pk_id as pk_id1_2_, blockheigh0_.block_height as block_he2_2_, blockheigh0_.event_name as event_na3_2_, blockheigh0_.depot_updatetime as depot_up4_2_ from block_height_info blockheigh0_ where blockheigh0_.event_name=?
Hibernate: select blockheigh0_.pk_id as pk_id1_2_, blockheigh0_.block_height as block_he2_2_, blockheigh0_.event_name as event_na3_2_, blockheigh0_.depot_updatetime as depot_up4_2_ from block_height_info blockheigh0_ where blockheigh0_.event_name=?
2.4.3 检查数据是否已经正常产生

你也可以通过DB来检查,登录你之前配置的数据库,看到自动创建完表的信息,以及表内开始出现数据内容,则代表一切进展顺利。如你可以执行以下命令:

# 请用你的配置信息替换掉[]里的配置,并记得删除[]
mysql -u[用户名] -p[密码] -e "use [数据库名]; select count(*) from block_detail_info"

如果查询结果非空,出现类似的如下记录,则代表导出数据已经开始运行:

+----------+
| count(*) |
+----------+
|      633 |
+----------+
2.4.4 停止导入程序
bash stop.sh
2.5 监控数据导出

在WeBASE-Collect-Bee工程最终编译后,生成的dist目录会有个monitor.sh脚本. 执行该脚本可以用来监控数据导出服务是否正常启动或者数据导出是否正常工作。

2.5.1 个性化配置

打开monitor.sh,可以修改相关的个性化配置:

# WeBASE-Collect-Bee服务启动的IP地址
ip=127.0.0.1
# WeBASE-Collect-Bee服务启动的端口
port=8082
# 数据导出的进度落后于链高度的报警阈值;如当前进度落后当前链高度达到20个以上,输出报警日志。
threshold=20
# 当链高度增长,数据导出完成块高的报警阈值;如当前块高增长,但完成导出的区块数量增长小于等于1.
warn_number=1
2.5.2 使用

monitor.sh脚本可以直接执行.

./monitor.sh 

block height now is 47

download number is 48

Now have 0 blocks to depot

OK! to do blocks is lesss than 20

OK! done blocks from 48 to 48, and height is from 48 to 48
2.5.3 提示

OK! to do blocks is lesss than $threshold 区块导出总体进度正常. OK! done blocks from $prev_done to $b, and height is from $prev_height to $a 上个时间周期区块导出进度正常. ERROR! $todo_blocks:the block height is far behind. 区块总体下载进度异常. ERROR! Depot task stuck in trouble, done block is $prev_done to $b , but block height is from $prev_height to $a 上个时间周期数据导出进度异常. ERROR! Get block height error. 获取块高失败. ERROR! Get done block count error. 获取区块下载数量失败。

2.5.4 配置crontab

建议将monitor.sh添加到crontab中,设置为每分钟执行一次,并将输出重定向到日志文件。可以日常扫描日志中的ERROR!字段就能找出节点服务异常的时段, 也可以在节点挂掉情况下及时将节点重启。在crontab的配置可以参考如下:

*/1  * * * * /data/app/fisco-bcos/WeBASE-Collect-Bee/dist/monitor.sh >> /data/app/fisco-bcos/WeBASE-Collect-Bee/dist/monitor.log 2>&1

用户在实际中使用时将monitor.sh、monitor.log的路径修改即可。

3. 可视化监控程序安装和部署
3.1 安装软件

首先,请安装docker,docker的安装可参考docker安装手册

等docker安装成功后,请下载grafana:

docker pull grafana/grafana

如果你是使用sudo用户安装了docker,可能会提示『permission denied』的错误,建议执行:

sudo docker pull grafana/grafana
3.2 启动grafana
docker run   -d   -p 3000:3000   --name=grafana   -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource"   grafana/grafana

grafana将自动绑定3000端口并自动安装时钟和Json的插件。

3.3 登录grafana界面

直接使用浏览器访问: http://your_ip:3000/

请注意使用你机器的IP替换掉your_ip

默认的用户名和密码为admin/admin

3.4 添加MySQL数据源

在正常登录成功后,如图所示,选择左边栏设置按钮,点击『Data Sources』, 选择『MySQL』数据源

_images/add_datasource1.png[添加步骤]

随后按照提示的页面,配置 Host, Database, User 和 Password等。

3.5 导入Dashboard模板

WeBASE-Codegen-Monkey会自动生成数据的dashboard模板,数据的路径位于:WeBASE-Collect-Bee/src/main/scripts/grafana/default_dashboard.json

请点击左边栏『+』,选择『import』,点击绿色按钮『Upload .json File』,选择刚才的WeBASE-Collect-Bee/src/main/scripts/grafana/default_dashboard.json文件

_images/import_json1.png[导入步骤]

最后,点击『import』按钮。

如果导入成功,dashboards下面会出现『FISCO-BCOS区块链监控视图』

您可以选择右上方的时间按钮来选择和设置时间范围及刷新时间等。

您也可以选中具体的页面组件进行编辑,自由地移除或挪动组件的位置,达到更好的使用体验。

更多关于Grafana的自定义配置和开发文档,可参考 Grafana官方文档

4. 开启可视化的API文档和功能性测试

WeBASE-Collect-Bee默认集成了swagger的插件,支持通过可视化的控制台来发送交易、生成报文、查看结果、调试交易等。

_images/swagger1.png[swagger控制台]

请注意, swagger插件仅推荐在开发或测试环境调试使用,在正式上生产环境时,请关闭此插件

swagger可使用配置开启或关闭,配置文件修改及操作可参考2.2章节。

## 打开swagger
button.swagger=on
## 关闭swagger
button.swagger=off
4.1 查看API文档:

请在你的浏览器打开此地址:

http://your_ip:port/swagger-ui.html

例如,当你在本机运行了WeBASE-Collect-Bee,且未修改默认的5200端口,则可以访问此地址:

http://localhost:5200/swagger-ui.html

此时,你可以看到上述页面,可以看到页面主要包括了http请求页面和数据模型两部分。

4.2 使用swagger发送具体的交易:

选择点击对应的http请求集,可以点开相关的http请求。此时,你可以选择点击“try it out”,手动修改发送的Json报文,点击“Excute”按钮,即可发送并查收结果。

我们以查询区块信息为例,如下列图所示:

_images/swag_test11.png[选择请求] _images/swag_test21.png[编辑报文] _images/swag_test31.png[查收结果]

存储模型

数据导出中间件会自动将数据导出到存储介质中,每一类数据都有特定的存储格式和模型,以MySQL为例。包括四类数据:区块数据、账户数据、事件数据和交易数据。

1. 区块数据存储模型

区块数据存储模型包括三个数据存储模型,分别为区块基本数据存储模型、区块详细数据存储模型及区块交易数据存储模型。

1.1 区块下载任务明细表

存储了所有区块的状态信息和下载情况,对应数据库表名称为block_task_pool,如下所示:

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) 块高
certainty int(11) 是否可能分叉 0- 是; 1-否
handle_item int(11) 处理分片序号,默认为0
sync_status int 2 0-待处理;1-处理中;2-已成功;3-处理失败;4-超时
depot_updatetime datetime 系统时间 记录插入/更新时间
1.2 区块详细数据存储模型

区块详细数据存储模型用于存储每个区块的详细数据,包括区块哈希、块高、出块时间、块上交易量,对应的数据库表名为block_detail_info,如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_hash varchar(255) Unique key & Index 区块哈希
block_height bigint(20) 区块高度
block_tiemstamp datetime index 出块时间
tx_count int(11) 当前区块交易量
depot_updatetime datetime 系统时间 记录插入/更新时间
status int(11) 区块状态 0-初始化 1-成功 2-失败
1.3 区块交易数据存储模型

区块交易数据存储模型用于存储每个区块中每个交易的基本信息,包括区块哈希、块高、出块时间、合约名称、方法名称、交易哈希、交易发起方地址、交易接收方地址,对应的数据库表名为block_tx_detail_info。如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_hash varchar(255) Unique key & Index 区块哈希
block_height bigint(20) 区块高度
block_tiemstamp datetime index 出块时间
contract_name varchar(255) 该笔交易的合约名称
method_name varchar(255) 该笔交易调用的function名称
tx_hash varchar(255) 交易哈希
tx_from varchar(255) 交易发起方地址
tx_to varchar(255) 交易接收方地址
depot_updatetime datetime 系统时间 记录插入/更新时间
2. 账户数据存储模型

账户数据存储模型用于存储区块链网络中所有账户信息,包括账户创建时所在块高、账户所在块的出块时间、账户地址(合约地址)、合约名称。对应的数据库表名为account_info。如下表所示。需要注意的是,如果通过嵌套合约隐式调用构造方法,则不会导出。比如A合约中通过关键字new一个B合约,则B合约不会导出。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) index 区块高度
block_tiemstamp datetime index 出块时间
contract_address varchar(255) index 合约/账户地址
contract_name varchar(255) 合约名称
depot_updatetime datetime 系统时间 记录插入/更新时间
3. 事件数据存储模型

事件数据存储模型是根据合约中的事件(Event)自动生成的。一个合约中有多少个事件就会生成多少个对应的事件数据存储表。

3.1 事件数据存储命名规则

由于事件数据存储模型是自动生成的,所以事件数据存储表名和表结构及字段命名采用统一的规则。以如下合约作为示例。

pragma solidity ^0.4.7;
contract UserInfo {
    bytes32 _userName;
    uint8 _sex;
    
    function UserInfo(bytes32 userName, uint8 sex) public {
        _userName = userName;
        _sex = sex;
    }
    
    event modifyUserNameEvent(bytes32 userName,uint8 sex);
    
    function modifyUserName(bytes32 userName) public returns(bytes32){
        _userName = userName;
        modifyUserNameEvent(_userName,_sex);
        return _userName;
    }
}
3.1.1 事件表命名规则

事件表命名规则为:合约名称_事件名称,并将合约名称和事件名称中的驼峰命名转化为小写加下划线方式。比如上述合约中合约名称为UserInfo,事件名称为modifyUserNameEvent,则表名称为user_info_modify_user_name_event。

3.1.2 事件字段命名规则

事件字段命名规则:事件字段驼峰命名转化为小写加下划线方式。仍以上述合约中modifyUserNameEvent为例,包含字段userName,则在user_info_modify_user_name_event表中对应的字段为user_name。

3.2 事件数据存储模型

事件数据存储模型除过存储该事件的相关信息外,还会存储和该事件相关的块和交易信息,如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) index 区块高度
block_tiemstamp datetime index 出块时间
event-paralist 事件字段列表
tx_hash varchar(255) index 交易哈希
depot_updatetime datetime 系统时间 记录插入/更新时间

以上述智能合约为例,对应的 如下:

字段 类型 字段设置 默认值 说明
user_name varchar(255) 用户名
sex int 性别
4. 交易数据存储模型

交易数据存储模型同事件数据存储模型类似,是根据合约中的方法(Function)自动生成的。一个合约中有多少个方法就会生成多少个对应的方法数据存储表。该方法指的是实际产生交易的方法(含构造方法),不包含事件(Event)方法和查询方法(constant关键字标注)。

4.1 交易数据存储命名规则

交易数据存储表名、表结构及字段命名规则同事件数据存储模型类似。

4.1.1 交易表命名规则

交易表命名规则为:合约名称_方法名称,并将合约名称和方法名称中的驼峰命名转化为小写加下划线方式。比如上述合约中合约名称为UserInfo,方法名称为modifyUserName,则表名称为user_info_modify_user_name_method;构造方法名称为UserInfo,那么对应的表名为user_info_user_info_method。

4.1.2 交易字段命名规则

交易字段命名规则也是将交易参数字段驼峰命名转化为小写加下划线,不再赘述。需要指出的是,对于一些没有参数的方法,交易数据存储模型没有办法存储,即通过无参方法产生的交易明细将无法通过数据导出工具获取到。

4.2 交易数据存储模型

交易数据存储模型除过存储该方法的相关信息外,还会存储和该方法相关的块和交易信息,如下表所示。

字段 类型 字段设置 默认值 说明
pk_id bigint(20) Primary key & NOT NULL 自增 主键Id
block_height bigint(20) index 区块高度
block_tiemstamp datetime index 出块时间
tx_hash varchar(255) 合约地址
function-paralist 方法字段列表
tx_hash varchar(255) index 交易哈希
depot_updatetime datetime 系统时间 记录插入/更新时间

3.1中的合约为例,对应的 如下:

字段 类型 字段设置 默认值 说明
user_name varchar(255) 用户名
sex int 性别

使用WeBASE开发区块链应用

部署WeBASE

搭建WeBASE, 请参考快速部署

登录WeBASE管理平台进行配置

安装WeBASE完成后,需要将节点信息添加到WeBASE平台中,这样WeBASE才可和节点进行通信。需要添加的信息包含节点信息,生成用户的私钥等。如下图所示:

  • 节点信息: _images/frontInfo.png[节点]
  • 私钥用户: _images/keyUser.png[私钥用户]

开发智能合约

以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部署合约,并获取合约地址等信息, _images/contract1.png[合约]

应用层开发

  • 调用交易接口

请参考交易接口

从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管理平台查看数据概览,节点监控,查看交易解析,交易审计等管理功能。

  • 查看交易解析 _images/transHash.png[交易解析]

国内镜像和CDN加速攻略

本节为访问GitHub较慢的用户提供国内源码镜像与安装包下载地址,以及WeBASE文档加速访问介绍。

WeBASE及子系统源码及安装包

源码同步

WeBASE当前仓库源码位于https://github.com/WebankFinTech/WeBASE,每个新的版本发布会将代码合入master分支。

为了方便国内用户,我们同样在gitee上提供了镜像仓库https://gitee.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一键部署工具

wget https://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/v1.4.0/webase-deploy.zip

如果下载失败请尝试git clone https://github.com/WeBankFinTech/WeBASE.git,并使用WeBASE/deploy目录的部署脚本即可。

单独下载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_templateconf后,并将节点的sdk证书复制到conf目录后,即可启动。

修改配置的具体方法,可参考WeBASE-Front部署

cd dist
mv conf_template conf
// 此处需要复制ca.crt, node.crt, node.key
cp /fisco/nodes/127.0.0.1/sdk/* ./conf
bash start.sh

WeBASE贡献指南

欢迎,提前感谢你的帮助和支持!

如果你是第一次贡献,只需按照以下简单步骤操作即可。我们将以修改WeBASE-Node-Manager为例子给你介绍。

如果你的电脑上尚未安装 git, 请按照这个 安装指引 进行安装。

Fork本代码仓库

_images/fork.png

点击图示中的按钮去 Fork 这个代码仓库。 这个操作会将代码仓库复制到你的账户名下。

Clone代码仓库

_images/clone.png

接下来,将复制后的代码仓库克隆到你的电脑上。点击图示中的绿色按钮,接着点击复制到剪切板按钮(将代码仓库地址复制下来)

随后打开命令行窗口,敲入如下 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 "一个伟大改进"

将改动 Push 到 GitHub

使用 git push 命令发布代码

git push origin <分支的名称>

提出 Pull Request 将你的修改供他人审阅

前往 Github 你的代码仓库,你会看到一个 Compare & pull request 的按钮。点击该按钮。

_images/pull-request.png

接着再点击 Create pull request 按钮,正式提交 pull request。

_images/create-pull-request.png

提交的改动经过审核,会合入到仓库。合并后,你会收到电子邮件通知。