WeBASE 技术文档

_images/logo.jpg

Overview

什么是WeBASE

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

建立区块链应用开发标准

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

设计原则

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

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

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

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

整体架构

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

功能介绍

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

各子系统简介

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

安装部署

快速部署:通过一键脚本,可以搭建一个WeBASE的基础环境,可以方便用户体验核心功能。

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

快速部署

​ 一键部署可以快速搭建WeBASE环境。包括节点(FISCO-BCOS)、节点前置子系统(WeBASE-Front)、节点管理子系统(WeBASE-Node-Manager)、管理平台(WeBASE-Web)。用于快速体验WeBASE管理平台。

​ 部署脚本会拉取相关安装包进行部署(需保持网络畅通),重复部署可根据提示进行相关操作。

前提条件

环境 版本
Java jdk1.8.0_121
MySQL MySQL-5.6
Python 2.7
MySQL-python 1.2.5

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

拉取部署脚本

获取部署安装包:

wget https://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/WeBASEV1.0.0/webase-deploy.zip

解压安装包:

unzip webase-deploy.zip

进入目录:

cd webase-deploy

修改配置

① 可以使用以下命令修改,也可以直接修改文件(vi common.properties),没有变化的可以不修改

② 数据库需要提前安装(数据库安装请参看 数据库部署

③ 服务端口不能小于1024

数据库ip:sed -i "s%127.0.0.1%${your_db_ip}%g" common.properties
数据库端口:sed -i "s%3306%${your_db_port}%g" common.properties
数据库用户名:sed -i "s%dbUsername%${your_db_account}%g" common.properties
数据库密码:sed -i "s%dbPassword%${your_db_password}%g" common.properties
数据库名称:sed -i "s%db_mgr%${your_db_name}%g" common.properties

管理平台服务端口:sed -i "s%8080%${your_web_port}%g" common.properties
节点管理子系统服务端口:sed -i "s%8081%${your_mgr_port}%g" common.properties
节点前置子系统服务端口:sed -i "s%8082%${your_front_port}%g" common.properties

节点fisco版本:sed -i "s%2.0.0-rc2%${your_fisco_version}%g" common.properties
节点安装个数:sed -i "s%nodeCounts%${your_node_counts}%g" common.properties
节点p2p端口:sed -i "s%30300%${your_p2p_port}%g" common.properties
节点channel端口:sed -i "s%20200%${your_channel_port}%g" common.properties
节点rpc端口:sed -i "s%8545%${your_rpc_port}%g" common.properties
前置h2数据库名:sed -i "s%/db_front%${your_dist_dir}%g" common.properties
前置要监控的磁盘路径:sed -i "s%/data%${your_dist_dir}%g" common.properties

例子(将磁盘路径由/data改为/home):sed -i "s%/data%/home%g" common.properties

部署

部署所有服务:

python deploy.py startAll

停止所有服务:

python deploy.py stopAll

单独启停命令和说明可查看帮助:

python deploy.py help

备注: 部署过程出现问题可以查看 常见问题

访问

管理平台:

http://{deployIP}:{webPort}

节点前置控制台:

http://{deployIP}:{frontPort}/WeBASE-Front

备注: 部署服务器IP和相关服务端口需对应修改

日志路径

部署日志:log/
节点日志:nodes/127.0.0.1/node*/log/
web服务日志:webase-web/log/
mgr服务日志:webase-node-mgr/logs/
front服务日志:webase-front/log/

附录

Java环境部署

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

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

mkdir /software
tar -zxvf jdkXXX.tar.gz /software/

(2)配置环境变量

export JAVA_HOME=/software/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
数据库部署

此处以Centos/Fedora为例。

(1)切换到root

sudo -s

(2)安装mysql

yum install mysql*
#某些版本的linux,需要安装mariadb,mariadb是mysql的一个分支
yum install mariadb*

(3)启动mysql

service mysqld start
#若安装了mariadb,则使用下面的命令启动
systemctl start mariadb.service

(4)初始化数据库用户

初次登录

mysql -u root

给root设置密码和授权远程访问

mysql > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

安全温馨提示:

  1. 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
  2. 例子中的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号

授权test用户本地访问数据库

mysql > create user 'test'@'localhost' identified by '123456';

(5)测试连接

另开一个ssh测试本地用户test是否可以登录数据库

mysql -utest -p123456 -h 127.0.0.1 -P 3306

登陆成功后,执行以下sql语句,若出现错误,则用户授权不成功

mysql > show databases;
mysql > use test;

(6)创建数据库

登录数据库

mysql -utest -p123456 -h 127.0.0.1 -P 3306

创建数据库

mysql > create database db_mgr;
Python部署
  • CentOS

    sudo yum install -y python-requests
    
  • Ubuntu

    sudo apt-get install -y python-requests
    
MySQL-python部署
  • CentOS

    sudo yum install -y MySQL-python
    
  • Ubuntu

    sudo apt-get install -y python-pip
    sudo pip install MySQL-python
    

常见问题

数据库安装后登录报错

腾讯云centos mysql安装完成后,登录报错:Access denied for user ‘root’@’localhost’

① 编辑 /etc/my.cnf ,在[mysqld] 部分最后添加一行

skip-grant-tables

② 保存后重启mysql

service mysqld restart

③ 输入以下命令,回车后输入密码再回车登录mysql

mysql -uroot -p mysql
找不到MySQLdb
Traceback (most recent call last):
...
ImportError: No module named MySQLdb

答:MySQL-python安装请参看 附录

部署时编译包下载慢
...
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.112.19|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22793550 (22M) [application/octet-stream]
Saving to: ‘WeBASE-Front.zip’

 0% [                                                                                                                                ] 77,974      37.8KB/s    

答:部署过程会下载工程编译包,可能会因为网络原因导致过慢。此时,可以先手动下载( WeBASE-WebWeBASE-Node-ManagerWeBASE-Front),再上传至服务器webase-deploy目录,在部署过程中根据提示不再重新下载编译包。

部署时数据库访问报错
...
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)")

答:确认数据库用户名和密码

企业部署

1、企业部署

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

_images/Framework1.png

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

2、使用手册

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

WeBASE管理平台使用手册

概览

基本描述

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

主要功能

  1. 区块链数据概览
  2. 节点管理
  3. 合约管理
  4. 私钥管理
  5. 系统监控
  6. 交易审计
  7. 登陆账号管理

_images/overview.png

部署架构

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

_images/Framework.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、WeBASE管理平台

WeBASE管理台使用框架vue-cli,具体搭建流程参见《WeBASE管理平台安装说明》

系统初始化配置

服务搭建成功后,可使用网页浏览器访问nginx配置的WeBASE管理台IP和端口(例如XXX.XXX.XXX.XXX:XXXX),进入到管理平台页面。管理平台默认用户为admin,默认密码为Abcd1234(第一次登陆成功后会要求重置密码,请按照密码标准设置一个更加安全的密码)。

添加节点前置

未初始化节点前置的管理平台,会引导去节点管理页面添加节点前置。

_images/add_node_front.png

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

合约管理

1、添加合约

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

_images/add_contract.png

2、部署合约

编译后的合约可以部署。

_images/deploy.png

3、合约调用

_images/transaction.png

私钥管理

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

_images/user_transaction.png

各模块的详细介绍

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

区块链数据概览

数据概览页面,展示了区块链的核心数据指标:节点个数,区块数量,交易数量,通过管理台部署的合约数量。关键监控指标:历史15天的交易量。节点信息列表:展示了节点的ID,节点块高,节点view和运行状态。区块信息展示了最近5个块的概览信息,点击更多可以查看更多历史区块。交易信息展示了最近5个交易的概览信息,点击更多可以查看更多历史交易。

_images/overview.png

节点管理

节点管理主要提供了前置列表和节点列表的功能。用户可以通过新增节点前置,把新的节点前置添加到前置列表。系统会默认拉取这些前置所在的群组和各个群组的节点信息。

_images/node.png

合约管理

合约管理提供了一个图形化的合约IDE环境。这个IDE提供了一整套的合约管理工具:新建合约,保存合约,编译合约,部署合约,调用合约接口。

_images/contract.png

私钥管理

在合约管理界面,可以看到合约部署和交易调用功能。这里的私钥管理可以新建私钥用户,然后拿新建用户的私钥来做合约部署和合约交易的签名。

_images/key_manager.png

系统监控

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

_images/node_monitor.png

交易审计

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

交易审计主要指标:

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

_images/user_audit.png

登陆账号管理

提供管理台登陆账号的管理功能。管理台用户分为两种角色:普通用户和管理员用户。这两者的区别是,管理员拥有管理平台的读写权限,而普通用户只有查看权限。

_images/login_user_manager.png

WeBASE子系统

节点前置服务

概要介绍

1. 功能说明

WeBASE-Front是和FISCO-BCOS节点配合使用的一个子系统,此分支支持FISCO-BCOS 2.0以上版本,可通过HTTP请求和节点进行通信,集成了web3jsdk,对接口进行了封装和抽象,具备可视化控制台,可以在控制台上查看交易和区块详情,开发智能合约,管理私钥,并对节点健康度进行监控和统计。

_images/2.png

部署方式有两种:

  1. 可以front组件单独部署作为独立控制台使用,打开 http://{nodeIP}:8081/WeBASE-Front 即可访问控制台界面;
  2. 也可以结合WeBASE-Node-ManagerWeBASE-Web服务一起部署。

注意:WeBASE-Front需要跟节点同机部署。一台机器部署多个节点,建议只部署一个front服务即可。

部署说明

1. 前提条件
依赖软件 支持版本
Gradle Gradle4.9或更高版本(构建工具)
Java 1.8.0_181
FISCO-BCOS v2.0.x版本

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

2. 安装部署
2.1 拉取代码

执行命令:

git clone https://github.com/WeBankFinTech/WeBASE-Front.git
2.2 拷贝证书

拷贝节点sdk目录下的ca.crt、node.crt、node.key证书到项目的src/main/resources目录。

cp ~/nodes/127.0.0.1/sdk/*  ~/WeBASE-Front/src/main/resources
2.3 修改配置文件

然后修改application.yml配置文件。

spring:
  datasource:
    url: jdbc:h2:file:~/.h2/front_db;DB_CLOSE_ON_EXIT=FALSE   //默认H2库为~/.h2/front_db,可按需更改
    
constant:  
  transMaxWait: 30            //交易等待时间
  monitorDisk: /home          //要监控的硬盘目录 
  keyServer: 127.0.0.1:8082   // 配置密钥服务(可以是WeBASE-Bode-Manager服务)的IP和端口(front独立使用可不配) 

application.yml配置文件中sdk的配置采用默认配置,无需修改。如果想修改连接的节点和端口,设置如下:

 sdk: 
   ip: 127.0.0.1   //连接节点的ip,是本机ip,建议写成内网ip
   channelPort: 20200 // 连接节点的端口
2.4 编译

在代码的根目录WeBASE-Front执行构建命令:

  chmod +x ./gradlew
 ./gradlew build -x test

构建完成后,会在根目录WeBASE-Front下生成已编译的代码目录dist。 安装碰到问题,请参考 安装问题帮助

2.5 服务启停

进入到已编译的代码根目录:

cd dist
启动: sh start.sh
停止: sh stop.sh
检查: sh status.sh

备注:如果脚本执行错误,尝试以下命令:

赋权限:chmod + *.sh
转格式:dos2unix *.sh
2.6 查看日志

进入到已编译的代码根目录:

cd dist
前置服务日志:tail -f log/WeBASE-Front.log
web3连接日志:tail -f log/web3sdk.log
2.7 打开控制台

http://{nodeIP}:8081/WeBASE-Front

基于可视化控制台,可以查看节点数据概览,查看链上节点的运行情况,开发智能合约,管理私钥等。

接口文档

1. 合约接口
1.1. 发送abi接口
接口描述

根据abi内容判断合约是否已部署,未部署则生成对应abi文件

接口URL

http://localhost:8081/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

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. 合约部署接口
接口描述

将合约部署到当前节点

接口URL

http://localhost:8081/WeBASE-Front/contract/deploy

调用方法

HTTP POST

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 所属群组 groupId int
2 用户编号 user String 用户编号或者用户地址
3 合约名称 contractName String
4 合约abi abiInfo List
5 合约bin bytecodeBin String
6 构造函数参数 funcParam List

2)数据格式

{
"user":700001,
"contractName":"HelloWorld",
"abiInfo": [],
"bytecodeBin":"",
"funcParam":[]
}
响应参数

1)数据格式

{
"0x60aac015d5d41adc74217419ea77815ecb9a2192"
}
1.3. cns接口
接口描述

根据合约名及版本号查询合约地址

接口URL

http://localhost:8081/WeBASE-Front/contract/cns?groupId={groupId}&name={name}&version={version}

调用方法

HTTP POST

请求参数
  1. 参数表
序号 中文 参数名 类型 最大长度 必填 说明
1 所属群组 groupId int
2 合约名称 name String
3 合约版本 version String

2)数据格式 http://localhost:8081/WeBASE-Front/contract/cns?groupId=1&name=HelloWorld&version=2

响应参数

1)数据格式

{
"0x31b26e43651e9371c88af3d36c14cfd938baf4fd"
}
1.4. java转译接口
接口描述

将合约abi转成java文件

接口URL

http://localhost:8081/WeBASE-Front/contract/compile-java

调用方法

HTTP POST

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 合约名称 contractName String
2 合约abi abiInfo List
3 合约bin bytecodeBin String
4 所在目录 packageName String 生成java所在的包名
  1. 数据格式

{ “contractName”: “HeHe”, “abiInfo”: [], “contractBin”: “60806040526004361061004c576000357c0100000000000000000000029”, “packageName”: “com.webank” }

响应参数

1)参数表

java文件

2)数据格式

1.5. 保存合约接口
接口描述

支持前置的控制台保存合约信息

接口URL

http://localhost:8081/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
7 合约bin contractBin String
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 合约bin contractBin String
4 合约名称 contractName String
5 合约状态 contractStatus Integer 1未部署,2已部署
6 所属群组 groupId Integer
7 合约源码 contractSource String
8 合约abi contractAbi String
9 合约bin contractBin String
10 bytecodeBin bytecodeBin String
11 合约地址 contractAddress String
12 部署时间 deployTime String
13 修改时间 modifyTime String
14 创建时间 createTime String
15 备注 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:8081/WeBASE-Front/contract/{groupId}/{contractId}

调用方法

HTTP DELETE

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 所属群组 groupId int
2 合约编号 contractId int

2)数据格式 http://localhost:8081/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:8081/WeBASE-Front/contract/contractList

调用方法

HTTP POST

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 所属群组 groupId Integer
2 合约名称 contractName String
3 合约状态 contractStatus Integer 1未部署,2已部署
4 合约地址 contractAddress String
5 当前页码 pageNumber Integer 从0开始
6 每页记录数 pageSize Integer

2)数据格式

{
    "groupId": "1",
    "pageNumber": 0,
    "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 合约bin contractBin String
3.4 合约名称 contractName String
3.5 合约状态 contractStatus Integer 1未部署,2已部署
3.6 所属群组 groupId Integer
3.7 合约源码 contractSource String
3.8 合约abi contractAbi String
3.9 合约bin contractBin String
3.10 bytecodeBin bytecodeBin String
3.11 合约地址 contractAddress String
3.12 部署时间 deployTime String
3.13 修改时间 modifyTime String
3.14 创建时间 createTime String
3.15 备注 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
}
2. 私钥接口
2.1. 获取公私钥接口
接口描述

通过调用此接口获取公私钥对和对应账户信息

接口URL

http://localhost:8081/WeBASE-Front/privateKey?useAes={useAes}&userName={userName}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 是否需要加密私钥 useAes boolean
2 用户名 userName String

2)数据格式

http://localhost:8081/WeBASE-Front/privateKey?useAes=false&userName=test

响应参数

1)数据格式

{
"publicKey":"1c7073dc185af0644464b178da932846666a858bc492450e9e94c77203428ed54e2ce45679dbb36bfed714dbe055a215dc1aaf4a75faeddce6a62b39c0158e1e",
"privateKey":"008cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c",
"address":"0x2e8ff65fb1b2ce5b0c9476b8f8beb221445f42ee"
}
2.2. 导入私钥接口
接口描述

导入私钥信息,并返回对应的公钥及用户地址

接口URL

http://localhost:8081/WeBASE-Front/privateKey/import?privateKey={privateKey}&useAes={useAes}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 私钥信息 privateKey String
2 是否是加密私钥 useAes boolean 默认true

2)数据格式

http://localhost:8081/WeBASE-Front/privateKey/import?privateKey=

008cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c&useAes=false

响应参数

1)数据格式

{
"publicKey":"1c7073dc185af0644464b178da932846666a858bc492450e9e94c77203428ed54e2ce45679dbb36bfed714dbe055a215dc1aaf4a75faeddce6a62b39c0158e1e",
"privateKey":"008cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c",
"address":"0x2e8ff65fb1b2ce5b0c9476b8f8beb221445f42ee"
}
3. web3接口
3.1. 获取块高接口
接口描述

获取节点最新块高

接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/blockNumber

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式 http://localhost:8081/WeBASE-Front/1/web3/blockNumber

响应参数

1)数据格式

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

通过块高获取块信息

接口URL

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

调用方法

HTTP GET

请求参数
  1. 参数表
序号 中文 参数名 类型 最大长度 必填 说明
1 块高 blockNumber BigInteger

2)数据格式

http://localhost:8081/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:8081/WeBASE-Front/{groupId}/web3/blockByHash/{blockHash}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 区块hash blockByHash String

2)数据格式

http://localhost:8081/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:8081/WeBASE-Front/{groupId}/web3/blockTransCnt/{blockNumber}

调用方法

HTTP GET

请求参数
  1. 参数表
序号 中文 参数名 类型 最大长度 必填 说明
1 块高 blockNumber BigInteger

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/blockTransCnt/100

响应参数

1)数据格式

{
 1
}

}

3.5. 获取PbftView接口
接口描述

通过调用此接口获取PbftView

接口URL

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

调用方法

HTTP GET

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

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/pbftView

响应参数

1)数据格式

{
 160565
}
3.6. 获取交易回执接口
接口描述
根据交易hash获取交易回执
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/transactionReceipt/{transHash}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 交易hash transHash String

2)数据格式

http://localhost:8081/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"
}
3.7. 根据交易hash获取交易信息接口
接口描述
根据交易hash获取交易信息
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/transaction/{transHash}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 交易hash transHash String

2)数据格式

http://localhost:8081/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:8081/WeBASE-Front/{groupId}/web3/clientVersion

调用方法

HTTP GET

请求参数

1)参数表

无入参

  1. 数据格式 http://localhost:8081/WeBASE-Front/1/web3/clientVersion
响应参数

1)参数表

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:8081/WeBASE-Front/{groupId}/web3/code/{address}/{blockNumber}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 合约地址 address String
2 块高 blockNumber BigInteger
  1. 数据格式

http://localhost:8081/WeBASE-Front/1/web3/code/0x0000000000000000000000000000000000000000/1

响应参数

2)数据格式

{
0x
}
3.10. 获取总交易数
接口描述
获取总交易数量
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/transaction-total

调用方法

HTTP GET

请求参数

1)参数表

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/transCnt/0x0000000000000000000000000000000000000000/1

响应参数

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:8081/WeBASE-Front/{groupId}/web3/transByBlockHashAndIndex/{blockHash}/{transactionIndex}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 块hash blockHash String
2 交易位置 transactionIndex BigInteger

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/transByBlockHashAndIndex/0xf27ff42d4be65329a1e7b11365e190086d92f9836168d0379e92642786db7ade/0
响应参数

2)数据格式

{
    "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:8081/WeBASE-Front/{groupId}/web3/transByBlockNumberAndIndex/{blockNumber}/{transactionIndex}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 块高 blockNumber BigInteger
3 交易位置 transactionIndex BigInteger

2)数据格式

http://localhost:8081/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:8081/WeBASE-Front/{groupId}/web3/consensusStatus

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/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
        }
    ],
    {
        "prepareCache_blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "prepareCache_height": -1,
        "prepareCache_idx": "65535",
        "prepareCache_view": "9223372036854775807"
    },
    {
        "rawPrepareCache_blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "rawPrepareCache_height": -1,
        "rawPrepareCache_idx": "65535",
        "rawPrepareCache_view": "9223372036854775807"
    },
    {
        "committedPrepareCache_blockHash": "0x15cf36c1f15572c448f7d4295958972e6b876deef319c532b8f7d79fcbde072f",
        "committedPrepareCache_height": 125,
        "committedPrepareCache_idx": "1",
        "committedPrepareCache_view": "62209"
    },
    {
        "signCache_cachedSize": "0"
    },
    {
        "commitCache_cachedSize": "0"
    },
    {
        "viewChangeCache_cachedSize": "0"
    }
]
3.14. 获取节点状态列表接口
接口描述
返回节点的快高、pbftview及状态
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/nodeHeartBeat

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 节点Id nodeId String
2 节点块高 blockNumber bigInteger
3 节点pbftView pbftView bigInteger
4 节点状态 status int 1正常,2异常
5 上次状态修改时间 latestStatusUpdateTime String 跟上次状态变更时间间隔至少大于三秒才会重新检测节点状态

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/getNodeStatusList

响应参数

1)数据格式

{

"blockNumber": 1,

"pbftView": 1232

}
3.15. 获取群组列表接口
接口描述
返回群组列表
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/groupList

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/groupList

响应参数

1)数据格式

[
  "1",
  "2"
]
3.16. 获取观察及共识节点列表
接口描述
返回指定群组内的共识节点和观察节点列表
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/groupPeers

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/groupPeers

响应参数

1)数据格式

[
    "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
 "adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
 "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
 "dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
]
3.17. 获取群组内观察节点列表
接口描述
返回指定群组内的观察节点列表
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/observerList

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/observerList

响应参数

1)数据格式

[
    "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7a165010"
]
3.18. 获取群组最新的pbftview视图

top

接口描述
返回指定群组内的pbftview
接口URL

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

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/pbftView

响应参数

1)数据格式

859
3.19. 获取已连接的P2P节点信息
接口描述
返回指定群组内已连接的P2P节点信息
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/peers

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/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.20. 获取群组内正在处理的交易数
接口描述
获取群组内正在处理的交易数
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/pending-transactions-count

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/pending-transactions-count

响应参数

1)数据格式

0
3.21. 获取共识节点接口
接口描述
返回群组内共识节点列表
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/sealerList

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/sealerList

响应参数

1)数据格式

[
    "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
 "adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
 "552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
 "dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
]
3.22. 区块/交易
接口描述
如果输入块高就返回区块信息,如果输入交易hash就返回交易信息
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/search?input={inputValue}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 查询参数 inputValue int/String 如果输入块高就返回区块信息,如果输入交易hash就返回交易信息

2)数据格式

http://localhost:8081/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.23. 获取群组内同步状态信息
接口描述
获取群组内同步状态信息
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/syncStatus

调用方法

HTTP GET

请求参数

1)参数表

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

2)数据格式

http://localhost:8081/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.24. 获取交易信息接口
接口描述
根据交易hash查询交易信息
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/transaction/{transHash}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 交易hash transHash String

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/transaction/0x4145b921309fcaa92b05b782e0181d671b8e68fc6d61d939358ed558fa3489c9
响应参数

1)数据格式

{
    "hash": "0x4145b921309fcaa92b05b782e0181d671b8e68fc6d61d939358ed558fa3489c9",
    "nonce": 1.47418536037145E+75,
    "blockHash": "0x3875dbec6e0ad0790dc0a0e8535b7c286ef7cee4149e5b1494f5c65631a9e321",
    "blockNumber": 1,
    "transactionIndex": 0,
    "from": "0x33a41878e78fb26735bf425f9328990e3a1a89df",
    "to": "0x0000000000000000000000000000000000000000",
    "value": 0,
    "gasPrice": 1,
    "gas": 100000000,
    "input": "0x6080604052348015600f57600080fd5b5060868061001e6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806335b09a6e146044575b600080fd5b348015604f57600080fd5b5060566058565b005b5600a165627a7a723058204aacdb57d6f2ae0f7f6c89c28236bba0205631183fd99785de220481566e683f0029",
    "creates": null,
    "publicKey": null,
    "raw": null,
    "r": null,
    "s": null,
    "v": 0,
    "transactionIndexRaw": "0x0",
    "valueRaw": "0x0",
    "gasPriceRaw": "0x1",
    "blockNumberRaw": "0x1",
    "gasRaw": "0x5f5e100",
    "nonceRaw": "0x3425bfe0f36e343686ccbe34a4fe8b05e0e0257ea7ee87417a6d898f0eb43ec"
}
3.25. 获取交易回执接口
接口描述
根据交易hash查询交易回执
接口URL

http://localhost:8081/WeBASE-Front/{groupId}/web3/transactionReceipt/{transHash}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int
2 交易hash transHash String

2)数据格式

http://localhost:8081/WeBASE-Front/1/web3/transactionReceipt/0x4145b921309fcaa92b05b782e0181d671b8e68fc6d61d939358ed558fa3489c9
响应参数

1)数据格式

{
    "transactionHash": "0x4145b921309fcaa92b05b782e0181d671b8e68fc6d61d939358ed558fa3489c9",
    "transactionIndex": 0,
    "blockHash": "0x3875dbec6e0ad0790dc0a0e8535b7c286ef7cee4149e5b1494f5c65631a9e321",
    "blockNumber": 1,
    "cumulativeGasUsed": 0,
    "gasUsed": 88537,
    "contractAddress": "0x30905b39fa9f08822f342377d229d781ae8f9be6",
    "root": null,
    "status": "0x0",
    "from": "0x33a41878e78fb26735bf425f9328990e3a1a89df",
    "to": "0x0000000000000000000000000000000000000000",
    "output": "0x",
    "logs": [],
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "transactionIndexRaw": "0x0",
    "blockNumberRaw": "0x1",
    "statusOK": true,
    "cumulativeGasUsedRaw": null,
    "gasUsedRaw": "0x159d9"
}
4. 性能检测接口
4.1. 获取机器配置信息
接口描述

获取机器配置信息

接口URL

http://localhost:8081/WeBASE-Front/performance/config

调用方法

HTTP GET

请求参数

1)参数表

无入参

响应参数
4.2. 获取机器历史性能信息
接口描述

获取机器历史性能信息

接口URL

http://localhost:8081/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":[]}}}]}
}
5. 交易接口
5.1. 交易处理接口
接口描述

通过合约信息进行调用,前置根据调用的合约方法是否是“constant”方法区分返回信息,“constant”方法为查询,返回要查询的信息。非“constant”方法为发送数据上链,返回块hash、块高、交易hash等信息。

接口URL

http://localhost:8081/WeBASE-Front/trans/handle

调用方法

HTTP POST

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 用户编号 user Integer 用户编号或者用户名
2 合约名称 contractName String
3 合约地址 contractAddress String
4 方法名 funcName String
5 方法参数 funcParam List JSONArray,对应合约方法参数,多个参数以“,”分隔
6 群组ID groupId int
7 是否是加密私钥 useAes boolean

2)数据格式

{
"useAes ":false,
"user ":700001,
"contractName":"HelloWorld",
"contractAddress":"dasdfav23rf213vbcdvadf3bcdf2fc23rqde",
"funcName":"set",
"funcParam":["Hi,Welcome!"],
"groupId" :"1"
}

示例:curl -l -H “Content-type: application/json” -X POST -d ‘{“contractName”: “HelloWorld”, “funcName”: “set”, “funcParam”: [“Hi,Welcome!”], “userId”: 700001, “useAes”: false, “contractAddress”:”dasdfav23rf213vbcdvadf3bcdf2fc23rqde”,”groupId”: 1}’ http://10.0.0.1:8081/WeBASE-Front/trans/handle

响应参数
  1. 数据格式

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"
}
}
6. 附录
1. 返回码信息列表

code message 描述
0 success 成功
101001 system error 系统异常
101002 param valid fail 参数校验异常
201001 uuid cannot be empty 业务流水号不能为空
201002 userId cannot be empty 用户编号不能为空
201003 contractName cannot be empty 合约名不能为空
201004 version cannot be empty 合约版本不能为空
201005 funcName cannot be empty 方法名不能为空
201006 abiInfo cannot be empty abi内容不能为空
201007 contractBin cannot be empty 合约bin不能为空
201008 contract's current version has been deployed 该合约版本已部署
201009 contract is not deployed 合约未部署
201010 save abi error abi保存错误
201011 request 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 节点请求失败

附录

1. 安装问题
1.1 Java部署

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

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

mkdir /software
tar -zxvf jdkXXX.tar.gz /software/

(2)配置环境变量

export JAVA_HOME=/software/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
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
2. 常见问题
  • 1:执行shell脚本报下面错误permission denied:

    答:chmod +x 给文件增加权限

  • 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: 节点运行一段时间后新增了一个群组,front查不到新群组信息。

    答: 调用 http://{ip}:{port}/WeBASE-Front/8081/1/web3/refresh 方法,即可手动更新。

节点管理服务

概要介绍

1. 功能说明

WeBASE-Node-Manager可以是处理前端页面所有web请求,管理各个节点的状态,管理链上所有智能合约,对区块链的数据进行统计、分析,对异常交易的审计,私钥管理等,含有如下功能模块:

序号 模块 描述
1 前置管理模块 维护关联WeBASE-Front服务信息
2 交易信息模块 查看交易信息
3 帐号管理模块 维护系统登录账号信息
4 区块管理模块 查看区块信息
5 合约管理模块 维护合约信息
6 服务器监控 监控节点服务器状态
7 审计模块 查看异常合约及异常用户信息
8 群组信息模块 查看群组信息
9 节点管理模块 查看节点信息
10 角色管理模块 查看系统登录用户的角色信息
11 用户管理模块 维护密钥信息
12 合约方法管理模块 维护合约abi文件中所包含的的方法信息

部署说明

1.前提条件
序号 软件
1 FISCO-BCOS 2.0
2 WeBASE-Front 版本
3 MySQL5.5或5.6版本【更高版本需要更改MySQL配置,可参考install_FAQ.md 】
4 Java1.8.0_181
5 Gradle-4.10或以上版本
2.注意事项
  • 在服务搭建的过程中,如碰到问题,请查看 常见问题解答
  • 安全温馨提示: 强烈建议设置复杂的数据库登录密码,且严格控制数据操作的权限和网络策略。
3.拉取代码

执行命令:

git clone https://github.com/WeBankFinTech/WeBASE-Node-Manager.git
4.编译代码

进入代码根目录:

cd WeBASE-Node-Manager

在代码的根目录WeBASE-Node-Manager执行构建命令:

gradle build -x test
(没有安装Gradle  则使用 ./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

修改数据库连接信息:

修改数据库名称:sed -i "s/fisco-bcos-data/${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 服务配置修改

进入到已编译的代码配置文件目录:

cd dist/conf

修改服务配置:

修改当前服务(WeBASE-Node-Manager)端口:sed -i "s/8080/${your_server_port}/g" application.yml
修改数据库IP:sed -i "s/127.0.0.1/${your_db_ip}/g" application.yml
修改数据库端口:sed -i "s/3306/${your_db_port}/g" application.yml
修改数据库名称:sed -i "s/fisco-bcos-data/${your_db_name}/g" application.yml
修改数据库用户名:sed -i "s/defaultAccount/${your_db_account}/g" application.yml
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" application.yml
6.2 服务启停

进入到已编译的代码根目录:

cd dist

启动:

bash start.sh

停止:

bash stop.sh

状态检查:

bash serverStatus.sh
6.3 查看日志

进入到日志目录:

cd dist/logs

全量日志:tail -f WeBASE-Node-Manager.log 错误日志:tail -f 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:8080/WeBASE-Node-Manager/front/new

{
    "frontIp": "127.0.0.1",
    "frontPort": "8081",
    "agency": "abc"
}
1.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 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:8080/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 所属机构

2)出参示例

  • 成功:
{
    "code": 0,
    "message": "success",
    "data": [
        {
            "frontId": 500001,
            "frontIp": "10.107.105.18",
            "frontPort": 8081,
            "agency": "aa",
            "createTime": "2019-06-04 20:49:42",
            "modifyTime": "2019-06-04 20:49:42"
        }
    ],
    "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:8080/WeBASE-Node-Manager/front/{frontId}

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:8080/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:8080/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:8080/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:8080/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:8080/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:8080/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:8080/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:8080/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:8080/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:8080/WeBASE-Node-Manager/account/login?checkCode=aege

{
    "account": "admin",
    "accountPwd": "Abcd1234"
}
1.1.3 返回参数

1)出参表

序号 输出参数 类型 备注

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:8080/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:8080/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 查询合约列表
5.1.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /contract/contractList/{groupId}/{pageNumber}/{pageSize}
  • 请求方式:POST
  • 返回格式:JSON
5.1.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 groupId int 群组id
2 contractName String 合约名
3 contractAddress String 合约地址
4 pageSize int 每页记录数
5 pageNumber int 当前页码
6 contractStatus int 1未部署,2已部署

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/contract/contractList

5.1.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述
3 totalCount Int 总记录数
4 data List 列表
5.1 Oject 返回信息实体
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 合约源码
5.1.8 contractAbi String 编译合约生成的abi文件内容
5.1.9 contractBin String 合约binary
5.1.10 bytecodeBin String 合约bin
5.1.11 contractAddress String 合约地址
5.1.12 deployTime LocalDateTime 部署时间
5.1.13 contractVersion String 合约版本(会去除该字段)
5.1.14 description String 备注
5.1.15 createTime LocalDateTime 创建时间
5.1.16 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": "60806040526004361061004c576000398de7e4ddf5fdc9ccbcfd44565fed695cd960b0029",
            "bytecodeBin": "608060405234801561001057600080004d4c",
            "deployTime": "2019-06-11 18:11:33",
            "description": null,
            "createTime": "2019-06-05 16:40:40",
            "modifyTime": "2019-06-11 18:11:33"
        }
    ],
    "totalCount": 1
}
  • 失败:
{
    "code": 102000,
    "message": "system exception",
    "data": {}
}
5.2 查询合约信息
5.2.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /contract/{contractId}
  • 请求方式:GET
  • 返回格式:JSON
5.2.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 groupId int 群组id
2 contractId int 合约编号

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/contract/200001

5.2.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述
3 Oject 返回信息实体
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 合约binary
3.10 bytecodeBin String 合约bin
3.11 contractAddress String 合约地址
3.12 deployTime LocalDateTime 部署时间
3.13 contractVersion String 合约版本(会去除该字段)
3.14 description String 备注
3.15 createTime LocalDateTime 创建时间
3.16 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": "60806040526004361061004c576000398de7e4ddf5fdc9ccbcfd44565fed695cd960b0029",
        "bytecodeBin": "608060405234801561001057600080004d4c",
        "deployTime": "2019-06-11 18:11:33",
        "description": null,
        "createTime": "2019-06-05 16:40:40",
        "modifyTime": "2019-06-11 18:11:33"
    }
}
  • 失败:
{
    "code": 102000,
    "message": "system exception",
    "data": {}
}
5.3 部署合约
5.3.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/contract/deploy
  • 请求方式:POST
  • 请求头:Content-type: application/json
  • 返回格式:JSON
5.3.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 groupId Int 所属群组编号
2 contractName String 合约名称
3 contractSource String 合约源码
4 contractAbi String 编译合约生成的abi文件内容
5 contractBin String 合约binary
6 bytecodeBin String 合约bin
7 contractId String 合约名称
8 contractPath String 合约所在目录
9 user String 私钥用户
10 constructorParams List 构造函数入参

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/contract/deploy

{
    "groupId": "1",
    "contractBin": "60806040526004361061004c576000357c010000002269b80029",
    "bytecodeBin": "60806040523480156100105761146031c79ef057dd274c87bff322ea2269b80029",
    "contractAbi": "[]",
    "contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLICAJbmFtZSA9IG47CiAgICB9Cn0=",
    "user": 700006,
    "contractName": "HeHe",
    "contractId": 200008,
    "contractPath": "Hi",
    "constructorParams": ["a"]
}
5.3.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述
3 Oject 返回信息实体
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 合约binary
3.10 bytecodeBin String 合约bin
3.11 contractAddress String 合约地址
3.12 deployTime LocalDateTime 部署时间
3.13 contractVersion String 合约版本(会去除该字段)
3.14 description String 备注
3.15 createTime LocalDateTime 创建时间
3.16 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": "[]",
        "contractBin": "60806040526004361061004c576000357c010274c87bff322ea2269b80029",
        "bytecodeBin": "608060405234801561001057629",
        "contractAddress": "0xa2ea2280b3a08a3ae2e1785dff09561e13915fb2",
        "deployTime": "2019-06-11 18:58:33",
        "description": null,
        "createTime": null,
        "modifyTime": null
    }
}
  • 失败:
{
    "code": 102000,
    "message": "system exception",
    "data": {}
}
5.4 发送交易
5.4.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/contract/transaction
  • 请求方式:POST
  • 请求头:Content-type: application/json
  • 返回格式:JSON
5.4.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 groupId Int 所属群组编号
2 user Integer 私钥用户
3 contractName String 合约名称
4 contractId String 合约名称
5 funcName String 合约方法名
6 contractAddress String 合约地址(传合约名和版本时可为空)
7 funcParam List 合约方法入参

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/contract/transaction

{
    "groupId": "300001",
    "contractBin": "6060604052600f8dee08980029",
    "bytecodeBin": null,
    "contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":false,\"type\":\"function\"}]",
    "contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjfQ==",
    "userId": 700001,
    "contractId": 200033
}
.3 5.4返回参数

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的字符串查询合约
5.2.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /contract/findByPartOfBytecodeBin
  • 请求方式:GET
  • 返回格式:JSON
5.2.2 请求参数

1)入参表

序号 输入参数 类型 可为空 备注
1 groupId int 所属群组编号
2 partOfBytecodeBin String 包含合约bytecodeBin的的字符串

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/contract/findByPartOfBytecodeBin

{
    "groupId": "300001",
    "partOfBytecodeBin": "abc123455dev"
}
5.2.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述
3 Oject 返回信息实体
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 合约binary
3.8 bytecodeBin String 合约bin
3.9 contractAddress String 合约地址
3.10 deployTime LocalDateTime 部署时间
3.11 contractVersion String 合约版本
3.12 description String 备注
3.13 createTime LocalDateTime 创建时间
3.14 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,
        "createTime": "2019-04-15 21:14:40",
        "modifyTime": "2019-04-15 21:14:40"
    }
}
  • 失败:
{
    "code": 102000,
    "message": "system exception",
    "data": {}
}
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:8080/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 Oject 返回信息实体
3.1.1 metricType String 测量类型:blockHeight、pbftView
3.1.2 data Oject
3.1.2.1 lineDataList Oject
3.1.2.1.1 timestampList List\<String> 时间戳列表
3.1.2.1.2 valueList List\<Integer> 值列表
3.1.2.2 contrastDataList Oject
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:8080/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 Oject 返回信息实体
3.1.1 metricType String 测量类型: cpu、memory、disk、txbps、rxbps
3.1.2 data Oject
3.1.2.1 lineDataList Oject
3.1.2.1.1 timestampList List\<String> 时间戳列表
3.1.2.1.2 valueList List\<Integer> 值列表
3.1.2.2 contrastDataList Oject
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": {}
}
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:8080/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:8080/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:8080/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:8080/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:8080/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:8080/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 获取所有群组列表
8.2.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址: /group/all
  • 请求方式:GET
  • 返回格式:JSON
8.2.2 请求参数

1)入参表

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/group/all

8.2.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 groupName String 群组名称
4.1.3 latestBlock BigInteger 最新块高
4.1.4 transCount BigInteger 交易量
4.1.5 createTime LocalDateTime 落库时间
4.1.6 modifyTime LocalDateTime 修改时间

2)出参示例

  • 成功:
{
    "code": 0,
    "message": "success",
    "totalCount": 1,
    "data": [
        {
            "groupId": 300001,
            "groupName": "group1",
            "latestBlock": 133,
            "transCount": 133,
            "createTime": "2019-02-14 17:33:50",
            "modifyTime": "2019-03-15 09:36:17"
        }
    ]
}
  • 失败:
{
    "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:8080/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": {}
}
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:8080/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:8080/WeBASE-Node-Manager/node/nodeInfo/1

9.2.3 返回参数

1)出参表

序号 输出参数 类型 备注
1 code Int 返回码,0:成功 其它:失败
2 message String 描述
3 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:8080/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 所属群组

2)入参示例

http://127.0.0.1:8080//WeBASE-Node-Manager/user/userInfo

{
    "groupId": "300001",
    "description": "密钥拥有者",
    "userName": "user1"
}
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 createTime LocalDateTime 创建时间
3.10 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",
        "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 所属群组

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/user/userInfo

{
    "userName": "sdfasd",
    "publicKey": "0x4189fdacff55fb99172e015e1adb96dc77b0cae1619b1a41cc360777bee6682fcc9752d8aabf144fbf610a3057fd4b5",
    "groupId": "300001",
    "description": "sdfa"
}
1.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 createTime LocalDateTime 创建时间
3.10 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",
        "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:8080/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 createTime LocalDateTime 创建时间
3.10 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",
        "createTime": "2019-03-15 18:00:27",
        "modifyTime": "2019-03-15 18:00:27"
    }
}
  • 失败:
{
    "code": 102000,
    "message": "system exception",
    "data": {}
}
11.4 查询私钥
11.4.1 传输协议规范
  • 网络传输协议:使用HTTP协议
  • 请求地址:/user/privateKey/{userId}
  • 请求方式:GET
  • 返回格式:json
11.4.2 请求参数

1)入参表

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

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/user/privateKey/4585

1.1.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 查询参数(用户名或公钥地址)

2)入参示例

http://127.0.0.1:8080/WeBASE-Node-Manager/user/userList/300001/1/10?userParam=asdfvw

1.1.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 createTime LocalDateTime 创建时间
4.1.10 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",
            "createTime": "2019-03-15 18:00:27",
            "modifyTime": "2019-03-15 18:00:28"
        }
    ]
}
  • 失败:
{
    "code": 102000,
    "message": "system exception",
    "data": {}
}
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:8080/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:8080/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": {}
}

附录

1.问题及方案
一般问题
  • 问:执行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

2.配置文件解析
参数 默认值 描述
server.port 8080 当前服务端口
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/fisco-bcos-data 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,127.0.0.1,0.0.0.0 不支持的前置ip
constant.isBlockPullFromZero false 是否从0开始同步区块信息
constant.pullBlockSleepTime 200 拉完一个区块,睡眠时间(毫秒)
constant.pullBlockTaskFixedDelay 30000 拉区块任务执行完后,间隔多久开始下一次(毫秒)
constant.blockRetainMax 10000 表中区块保留的条数(开启constant.isDeleteInfo时有效)
constant.cookieMaxAge 1800 登录cookie有效时长(妙)
constant.isUseSecurity true 是否启用登录鉴权
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 审计异常数据被允许最大值,到达后会停止审计

WeBASE管理平台

概要介绍

本项目是区块链中间件平台WeBASE管理平台,使用框架vue-cli

兼容浏览器IE9及以上,360浏览器兼容版(IE9内核),360浏览器极速版,chrome浏览器。

本代码仅支持FISCO-BCOS 2.0以上版本,支持群组和群组切换。具体功能有:

  1. 区块链概览,可以查看区块链信息。点击左上角交易信息和区块信息界面,可以跳转到区块或交易信息列表页,交易信息支持input解码和event解码。
  2. 前置管理,可以新增前置,新增前置成功后,可以拉取改链的所有群组和节点。点击ip可以查看该前置所在服务器状态相关信息。
  3. 合约管理,合约IDE支持本地编写,编译合约。部署合约后该合约会被保存,在历史合约中,可以查看该合约。
  4. 私钥管理,管理所有可以发交易的帐号,公钥用户是其他机构的帐号,无法在本机构发交易,可以通过手动绑定和自动同步获取。私钥用户为本机构发交易的用户。
  5. 联盟治理,主要监控整条链所有机构所有用户发送交易行为,查看是否有异常用户和异常合约。
  6. 帐号管理,只有admin帐号才能查看此功能,可以新增帐号(登录此系统帐号),修改密码等等。

部署说明

1. 依赖环境
环境 版本
nginx nginx1.6或以上版本

nginx安装请参考附录

2. 拉取代码

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

git clone https://github.com/WeBankFinTech/webase-web.git

在代码库中docs文件下有nginx配置文件,直接可以拿来替换安装的nginx的配置文件nginx.conf; 然后修改nginx.conf;

进入nginx配置文件(这里nginx安装在/usr/local下面,如果这里没找到,可以到/etc下寻找,如有权限问题,请加上sudo)

    cd /usr/local/nginx/conf

1、 修改web服务端口(端口需要开通策略且不能被占用)

    sed -i "s/3002/${your_server_port}/g" nginx.conf

例如:

    sed -i "s/3002/8080/g" nginx.conf   你修改的服务端口是8080

2、 修改服务ip

    sed -i "s/10.0.0.1/${your_server_ip}/g" nginx.conf

例如:

    sed -i "s/10.0.0.1/192.168.0.1/g" nginx.conf

你修改的服务ip是192.168.0.1,也可以修改成域名

3、 修改静态文件路径

    sed -i "s/\/data\/webase-web\/dist/${your_file_route}/g" nginx.conf

4、 修改mgr服务ip和端口

    sed -i "s/10.0.0.1:8083/${your_mgrServer_ipPort}/g" nginx.conf

按照上面的步骤执行后,可以直接跳过这一步骤,直接启动nginx。若服务器已有nginx可按照以下修改,增加一条server

    upstream node_mgr_server{
        server 10.0.0.1:8083; #步骤三 节点管理服务地址及端口
    }
    server {
        listen       3002 default_server;   #步骤一 前端端口(端口需要开通策略且不能被占用)
        server_name  10.0.0.1;         #步骤一 前端地址,可配置为域名
        location / {
                root    /data/webase-web/dist;   #步骤二 前端文件路径(文件需要有权限访问)
                index  index.html index.htm;
                try_files $uri $uri/ /index.html =404;
                }

        # Load configuration files for the default server block.
        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;
                }
        }
3. 启动nginx

1、启动nginx。 启动命令:

/usr/local/nginx/sbin/nginx    (nginx下载在/usr/local目录下)

检查nginx是否启动成功

    ps -ef | grep nginx

观察进程是否起来

启动报错重点排查:日志路径是否正确(error.log和access.log),nginx有没有添加用户权限。

2、打开页面,页面url是nginx配置的前端ip和端口。 例如:上面配置文件的url为 http://10.0.0.1:3002

3、打开页面后,请找运维提供帐号和密码登录(默认账号密码:admin/Abcd1234)。

附录

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 为什么输入正确的验证码显示验证码错误

登录验证码有效时间为一分钟,一分钟后验证码失效,登录会出现“验证码错误” 。

2.3 交易解码解不出来

将发送该交易的合约上传到合约管理,并编译。

2.4 交易审计异常交易和异常合约怎么消除

将发送交易的账户在私钥管理中添加成公钥用户,那么该用户所发的交易将审计成正常交易; 将部署该合约的账户在私钥管理中添加成公钥用户,那么该用户所部署的合约将审计成正常合约。

3. 二次开发

开发文档

交易服务

概要介绍

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

架构图

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

合约编译:上传合约文件zip压缩包(压缩包里的每个合约的文件名要和合约名一致,合约引用需使用“./xxx.sol”),返回合约编译信息。

合约部署:交易服务子系统会将合约部署请求信息缓存到数据库,通过轮询服务向节点发送交易请求,确保合约成功部署。

合约调用:分为无状态交易上链(非constant方法)和交易结果查询(constant方法)。 无状态交易上链是交易服务子系统会将交易请求信息缓存到数据库,通过轮询服务向节点发送交易请求,确保交易成功上链。 交易结果查询是交易服务子系统会同步向节点发送交易请求,返回结果。

交易上链数据签名支持以下两种模式:

  • 本地配置私钥签名
  • 本地随机私钥签名

本工程支持单机部署,也支持分布式任务多活部署(使用分布式任务的话需部署zookeeper)。

部署说明

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

备注:安装说明请参看 附录-1,不使用分布式任务可以不部署ZooKeeper。

2. 拉取代码

执行命令:

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

进入目录:

cd WeBASE-Transaction
3. 编译代码

使用以下方式编译构建,如果出现问题可以查看 附录-2
方式一:如果服务器已安装Gradle,且版本为gradle-4.10或以上

gradle build -x test

方式二:如果服务器未安装Gradle,或者版本不是gradle-4.10或以上,使用gradlew编译

./gradlew build -x test

构建完成后,会在根目录WeBASE-Transaction下生成已编译的代码目录dist。

4. 修改配置

(1)进入目录:

cd dist/conf

将节点sdk目录下的以下文件复制到当前目录: ca.crt、node.crt、node.key

(2)以下有注释的地方根据实际情况修改:

vi application.yml
server: 
  # 本工程服务端口,端口被占用则修改
  port: 8082
  context-path: /webase-transaction

spring: 
  datasource: 
    # 数据库连接信息
    url: jdbc:mysql://127.0.0.1:3306/db_transaction?useUnicode=true&characterEncoding=utf8
    # 数据库用户名
    username: dbUsername
    # 数据库密码
    password: dbPassword
    driver-class-name: com.mysql.jdbc.Driver

sdk:
  # 机构名
  orgName: webank
  timeout: 10000
  # 群组信息,可配置多群组和多节点
  groupConfig:
    allChannelConnections:
    - groupId: 1
      connectionsStr:
      - 127.0.0.1:20200
      - 127.0.0.1:20201
    - groupId: 2
      connectionsStr:
      - 127.0.0.1:20200
      - 127.0.0.1:20201

constant: 
  # 本地配置私钥进行签名,使用这种模式则对应修改
  privateKey: edf02a4a69b14ee6b1650a95de71d5f50496ef62ae4213026bd8d6651d030995
  cronTrans: 0/1 * * * * ?
  requestCountMax: 6
  selectCount: 10
  intervalTime: 600
  sleepTime: 50
  # 使用分布式任务部署多活(true-是,false-否)
  ifDistributedTask: false

job:
  regCenter:  
    # 部署多活的话需配置zookeeper,支持集群
    serverLists: 127.0.0.1:2181
    namespace: elasticjob-trans
  dataflow:  
    # 分片数(如多活3个的话可分成3片)
    shardingTotalCount: 3
5. 服务启停

进入到已编译的代码根目录:

cd dist
启动:sh start.sh
停止:sh stop.sh
检查:sh status.sh

备注:如果脚本执行错误,尝试以下命令:

赋权限:chmod + *.sh
转格式:dos2unix *.sh
6. 查看日志

在已编译的代码根目录dist查看:

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

接口说明

1. 合约接口
1.1. 合约编译接口
接口描述

调用此接口编译合约。上传合约文件zip压缩包(压缩包里的每个合约的文件名要和合约名一致,合约引用需使用“./xxx.sol”),返回合约编译信息。

接口URL

http://localhost:8082/webase-transaction/contract/compile

调用方法

HTTP POST

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 合约文件 file zip 必须是zip压缩包

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. 合约部署接口
接口描述

调用此接口发送合约部署相关信息,交易服务子系统会将合约部署请求信息缓存到数据库,通过轮询服务向节点发送交易请求,确保合约成功部署。

接口URL

http://localhost:8082/webase-transaction/contract/deploy

调用方法

HTTP POST

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int 16
2 部署业务流水号 uuidDeploy String 64
3 签名类型 signType int 2 0-本地配置私钥签名,1-本地随机私钥签名,2-云端签名
4 合约Bin contractBin String
5 合约Abi contractAbi List\<Object> JSON数组
6 构造方法参数 funcParam List\<Object> JSON数组

2)数据格式

{
  "groupId":1,
  "uuidDeploy":"XXX",
  "signType":0,
  "contractBin":"0xXXXXX",
  "contractAbi":[],
  "funcParam":["hello"]
}
响应参数

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:8082/webase-transaction/contract/address/{groupId}/{uuidDeploy}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int 16
2 部署业务流水号 uuidDeploy String 64

2)数据格式

http://127.0.0.1:8082/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:8082/webase-transaction/contract/event/{groupId}/{uuidDeploy}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int 16
2 部署业务流水号 uuidDeploy String 64

2)数据格式

http://127.0.0.1:8082/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
}
2. keystore接口
2.1. 查询账户地址接口
接口描述

查询本地配置私钥对应的账户地址 。

接口URL

http://localhost:8082/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不能为空。

接口URL

http://localhost:8082/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-云端签名
5 合约地址 contractAddress String
6 合约Abi contractAbi List\<Object> JSON数组
7 调用方法名 funcName String
8 方法参数 funcParam List\<Object> JSON数组

2)数据格式

{
  "groupId":1,
  "uuidStateless":"XXX",
  "uuidDeploy":"XXX",
  "signType":0,
  "contractAddress":"0xXXXXX",
  "contractAbi":[],
  "funcName":"set",
  "funcParam":["hello"]
}
响应参数

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不能为空。

接口URL

http://localhost:8082/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:8082/webase-transaction/trans/event/{groupId}/{uuidStateless}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int 16
2 交易业务流水号 uuidStateless String 64

2)数据格式

http://127.0.0.1:8082/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:8082/webase-transaction/trans/output/{groupId}/{uuidStateless}

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 群组编号 groupId int 16
2 交易业务流水号 uuidStateless String 64

2)数据格式

http://127.0.0.1:8082/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
}
附录
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 exist 交易不存在
303019 request group id has not been configured 请求的群组编号未配置

附录

1. 安装问题
1.1 Java部署

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

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

mkdir /software
tar -zxvf jdkXXX.tar.gz /software/

(2)配置环境变量

export JAVA_HOME=/software/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
1.2. 数据库部署

此处以Centos/Fedora为例。

(1)切换到root

sudo -s

(2)安装mysql

yum install mysql*
#某些版本的linux,需要安装mariadb,mariadb是mysql的一个分支
yum install mariadb*

(3)启动mysql

service mysqld start
#若安装了mariadb,则使用下面的命令启动
systemctl start mariadb.service

(4)初始化数据库用户

初次登录

mysql -u root

给root设置密码和授权远程访问

mysql > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

安全温馨提示:

  1. 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
  2. 例子中的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号

授权test用户本地访问数据库

mysql > create user 'test'@'localhost' identified by 'test1234';

(5)测试连接

另开一个ssh测试本地用户test是否可以登录数据库

mysql -utest -ptest1234 -h 127.0.0.1 -P 3306

登陆成功后,执行以下sql语句,若出现错误,则用户授权不成功

mysql > show databases;
mysql > use test;

(6)创建数据库

登录数据库

mysql -utest -ptest1234 -h 127.0.0.1 -P 3306

创建数据库

mysql > create database db_transaction;
1.3. Zookeeper部署

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

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

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

(2)配置和启动

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

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

执行shell脚本报错误permission denied。

答:使用 “chmod +x 文件” 给文件增加权限

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'

签名服务

概要介绍

1. 功能说明

本工程为签名服务子系统。功能:管理公私钥、对数据进行签名。

2. 前提条件
环境 版本
Java jdk1.8.0_121
数据库 MySQL-5.6
备注:安装说明请参看附录。

部署说明

1.1 拉取代码

执行命令:

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

进入目录:

cd WeBASE-Sign
1.2 编译代码

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

gradle build -x test

方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译

./gradlew build -x test

构建完成后,会在根目录WeBASE-Sign下生成已编译的代码目录dist。

1.3 修改配置

(1)进入编译的代码目录:

cd dist

(2)以下有注释的地方根据实际情况修改:

vi conf/application.yml
server: 
  # 本工程服务端口,端口被占用则修改
  port: 8085
  context-path: /WeBASE-Sign

spring: 
  datasource: 
    # 数据库连接信息
    url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8
    # 数据库用户名
    username: dbUsername
    # 数据库密码
    password: dbPassword
    driver-class-name: com.mysql.jdbc.Driver
    
constant: 
  # aes加密key(16位)
  aesKey: EfdsW23D23d3df43
1.4 服务启停
启动:sh start.sh
停止:sh stop.sh
检查:sh status.sh

备注:如果脚本执行错误,尝试以下命令:

赋权限:chmod + *.sh
转格式:dos2unix *.sh
1.5 查看日志
tail -f log/WeBASE-Sign.log

接口文档

1. 新增用户接口
接口描述

新增用户。

接口URL

http://localhost:8085/WeBASE-Sign/user/newUser

响应参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 返回码 code String 返回码信息请附录1
2 提示信息 message String
3 返回数据 data Object
3.1 用户编号 userId Integer
3.2 私钥信息 privateKey String
3.3 账户地址 address String
3.4 公钥 publicKey String
3.5 描述 description String

2)数据格式

a.请求正常返回结果

{
    "code": 0,
    "message": "success",
    "data": {
        "userId": 100011,
        "address": "0xaf7f9ad9560aa7cde37c693ba373707ab31d7823",
        "publicKey": "0x6efc55a03436057c4181160c195581e4f6b8a2135ea1030a326d5339a4f4a2a9bf2d603e020c77fa5b52af109f18955747bd0bcfa249955707d3932b544a9c65",
        "privateKey": "d3d8583b27bc5be0bca0ffb9d53db5a3324585148cd88e629a0b1084d2755bc8",
        "description": null
    }
}

b.异常返回结果示例(信息详情请参看附录1)

{
  "code": 103001,
  "message": "system error",
  "data": null
}
2. 查询用户接口
接口描述

根据用户名查询用户信息。

接口URL

http://localhost:8085/WeBASE-Sign/user/{userAddress}/userInfo

调用方法

HTTP GET

请求参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 用户地址 userAddress String 32

2)数据格式

http://localhost:8085/WeBASE-Sign/user/0xaf7f9ad9560aa7cde37c693ba373707ab31d7823/userInfo

响应参数

1)参数表

序号 中文 参数名 类型 最大长度 必填 说明
1 返回码 code String 返回码信息请附录1
2 提示信息 message String
3 返回数据 data Object
3.1 用户编号 userId Integer
3.2 用户私钥 privateKey String
3.3 账户地址 address String 链上地址
3.4 公钥 publicKey String
3.5 描述 description String

2)数据格式

a.请求正常返回结果

{
    "code": 0,
    "message": "success",
    "data": {
        "userId": 100011,
        "address": "0xaf7f9ad9560aa7cde37c693ba373707ab31d7823",
        "publicKey": "0x6efc55a03436057c4181160c195581e4f6b8a2135ea1030a326d5339a4f4a2a9bf2d603e020c77fa5b52af109f18955747bd0bcfa249955707d3932b544a9c65",
        "privateKey": "d3d8583b27bc5be0bca0ffb9d53db5a3324585148cd88e629a0b1084d2755bc8",
        "description": null
    }
}

b.异常返回结果示例(信息详情请参看附录1)

{
  "code": 103001,
  "message": "system error",
  "data": null
}
附录
返回码信息列表
Code message 描述
0 success 正常
103001 system error 系统异常
203003 param valid fail 参数校验异常
303001 user is already exists 用户已存在
303002 user does not exist 用户不存在
303003 privateKey is null 用户私钥为空
303004 privateKey decode fail 私钥解码失败
303006 address is null 用户地址为空

附录

Java环境部署

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

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

mkdir /software
tar -zxvf jdkXXX.tar.gz /software/

(2)配置环境变量

export JAVA_HOME=/software/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
数据库部署

此处以Centos/Fedora为例。

(1)切换到root

sudo -s

(2)安装MySQL

yum install mysql*
#某些版本的linux,需要安装mariadb,mariadb是MySQL的一个分支
yum install mariadb*

(3)启动MySQL

service mysqld start
#若安装了mariadb,则使用下面的命令启动
systemctl start mariadb.service

(4)初始化数据库用户

初次登录

mysql -u root

给root设置密码和授权远程访问

mysql > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

安全温馨提示:

  1. 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
  2. 例子中的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号

授权test用户本地访问数据库

mysql > create user 'test'@'localhost' identified by 'test1234';

(5)测试连接

另开一个ssh测试本地用户test是否可以登录数据库

mysql -utest -ptest1234 -h 127.0.0.1 -P 3306

登陆成功后,执行以下sql语句,若出现错误,则用户授权不成功

mysql > show databases;
mysql > use test;

(6)创建数据库

登录数据库

mysql -utest -ptest1234 -h 127.0.0.1 -P 3306

创建数据库

mysql > create database testdb;

数据导出代码生成子系统

License Gitter

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

组件介绍

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数据导出组件支持可配置的多数据源存储,读写分离和分库分表:数据可以存储到多个表中,也可以存储到多个库中。同时,内置的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控制台。

[效果图]

部署说明

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的安装可参考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
            └── Evidence.java
        └── resources
            └── application.properties
    └── generate_bee.sh
2.2 配置安装包
2.2.1 配置合约文件

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

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

请注意: 请勿使用数据库SQL语言的保留字来定义合约内部的变量、函数名定义,否则会导致数据库无法成功建表。如定义一个变量名为key或定义一个函数为select或delete等。但是,如果你不幸地发现你的合约命名中已经有了这些关键词;那么,针对这种情况,我们为你考虑了数据库建表字段的转义配置的规则;你可以为数据库建表字段配置前缀和后缀,如配置『_』的前缀,那么你建立的”select”字段将会自动被转为”_select”,以规避这种尴尬的问题。详细的配置方法请参考附录1.3 数据库配置。

2.2.2 配置密钥文件

复制密钥相关的配置文件:请将你的配置文件复制到./config/resources目录下。配置文件包括:

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

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

# 节点的IP及通讯端口、组号。NODE_NAME可以是任意字符和数字的组合
system.nodeStr=[NODE_NAME]@[IP]:[PORT]
system.groupId=[GROUP_ID]
# 最新版本的FISCO-BCOS平台中的NODE_NAME可以为任意值。
# 数据库的信息,暂时只支持mysql;serverTimezone用来设置时区
system.dbUrl=jdbc:mysql://[IP]:[PORT]/[database]?useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8
system.dbUser=[user_name]
system.dbPassword=[password]
# 合约Java文件的包名
monitor.contractPackName=[编译Solidity合约时指定的包名]

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

2.3 生成代码并运行程序
2.3.1 选择一:直接在本机运行
chmod +x generate_bee.sh
sh generate_bee.sh

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

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

2.3.2 选择二:本机编译,复制执行包到其他服务器上运行
chmod +x generate_bee.sh
sh generate_bee.sh build

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

chmod +x *.jar
nohup java -jar *.jar >/dev/null 2>&1 &
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.log| grep "sync block"

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

$ tail -f webasebee.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 停止导入程序
ps -ef |grep WeBASE-Collect-Bee |grep -v grep|awk '{print $2}' |xargs kill -9

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

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

[添加步骤]

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文件,最后,点击『import』按钮。

[导入步骤]

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

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

4. 开启可视化的功能性测试

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

[swagger控制台]

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

4.1 打开swagger页面

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

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

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

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

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

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

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

我们以查询区块信息为例,如下列图所示:

[选择请求] [编辑报文] [查收结果]

存储模型

数据导出中间件会自动将数据导出到存储介质中,每一类数据都有特定的存储格式和模型,以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(225) Unique key & Index 区块哈希
block_height bigint(20) 区块高度
block_tiemstamp datetime index 出块时间
tx_count int(11) 当前区块交易量
depot_updatetime datetime 系统时间 记录插入/更新时间
1.3 区块交易数据存储模型

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

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

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

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

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

4.1 交易数据存储命名规则

交易数据存储表名、表结构及字段命名规则同事件数据存储模型类似,以3.3.1中的合约为例进行说明。

4.1.1 交易表命名规则

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

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 方法字段列表
tx_hash varchar(225) 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文件,使用不同的命名,保存到配置文件下面。

使用技术

框架 理由
SpringBoot - 快速应用开发框架 易用而又强大,我们也同样推荐你使用。
Gradle - 依赖属性管理 相比于Maven,Gradle更加简洁和强大。
Beetl - 模板引擎 Beetl在易用性和性能等维度上超越了知名的竞争对手。
incubator-shardingsphere - 分布式数据库中间件 很棒的关系型数据库中间件,目前已经进入Apache孵化器。
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 8080
1.2 FISCO-BCOS节点配置

FISCO-BCOS节点配置用于配置WeBASE-Collect-Bee服务连接的区块链节点,使得WeBASE-Collect-Bee服务能够访问连接节点,并通过该节点获取区块链网络上的数据。

配置项 是否必输 说明 举例 默认值
system.orgId N 组织机构ID,用于区分不同的机构 10000 FB001
system.nodeStr Y 连接区块链节点的nodeStr,nodeName@[IP]:[PORT], 其中prot为channel port node1@106.12.31.123:8822 -
1.3 数据库配置

数据导出组件最终会把区块链网络上的数据导出到数据存储介质中,目前版本仅支持MySQL,所以需要进行数据库配置。

配置项 是否必输 说明 举例 默认值
system.dbUrl Y 访问数据的URL jdbc:mysql://[IP]:[PORT]/[DB]?useSSL=false&serverTimezone=GMT%2b8&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=_

其中sysTableName对应区块数据表和账户数据表,详情见 数据存储模型 章节。

1.4 FISCO-WeBASE-Collect-Bee工程配置
配置项 是否必输 说明 举例 默认值
system.group Y 同spring项目的group com.example -
system.contractPackName Y 编译智能合约所输入的包名 com.webank.blockchain.wecredit.contracts -
monitor.default.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 注册中心服务器列表 [12.00.10.1:2181;12.00.10.2: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
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/Fedora为例。

(1)切换到root

sudo -s

(2)安装mysql

yum install mysql*
#某些版本的linux,需要安装mariadb,mariadb是mysql的一个分支
yum install mariadb*

(3)启动mysql

service mysqld start
#若安装了mariadb,则使用下面的命令启动
service mariadb start

(4)初始化root用户

mysql -u root

注意,以下语句仅适用于开发环境,不能直接在实际生产中使用!!! 以下操作仅供参考,请勿直接拷贝,请自定义设置复杂密码。

/*授权test用户本地访问数据库*/
create user 'test'@'localhost' identified by 'test1234';

(5)用SQL语句给root分配密码

GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY 'test1234' WITH GRANT OPTION;

**注意,以上语句仅适用于开发环境,不能直接在实际生产中使用!!!以上设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号 **

(6)测试是否成功

另开一个ssh测试用户是否可以登陆,并成功授权,登陆数据库
mysql -utest -ptest@2107 -h 127.0.0.1 -P 3306
登陆成功后,执行sql语句,若出现错误,则用户授权不成功
show databases;
use test;
select * from tb_txnByDay;
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

数据导出子系统

License Gitter

穿花度柳飞如箭, 粘絮寻香似落星。 小小微躯能负重, 器器薄翅会乘风。 – 吴承恩

组件介绍

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,该公司的报表系统实现了和区块链数据的对接,可以获得准实时的各类业务报表。

4. 特性介绍
4.1 可自动生成代码

可使用WeBASE-Codegen-Monkey生成的代码和配置文件,自动组装成数据导出工程实例

4.2 支持灵活的数据库策略

集成sharding-jdbc组件,支持多数据源、分库分表、读写分离

4.3 支持集群部署和分布式任务调度

集成elstic-job开源组件,支持灵活的分布式部署和任务调度

4.4 可定制化的数据导出策略

提供灵活的可配置的区块、交易、事件、账户等数据导出功能,过滤不需要的数据

4.5 提供丰富的Restful API查询接口

支持丰富的Restful API数据查询接口

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

集成swagger插件,提供可视化互动API控制台

4.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进行构建,是一个SpringBoot工程。

-build.gradle
-config/contract
-src/main
         -resources
         		application-sharding-tables.properties
         		application.properties
         		ca.crt
         		node.crt
         		node.key
         -java

其中build.gradle为gradle的构建文件,config/contract目录存放了合约编译为Java的文件,src/main/resources下面存放了配置文件。

自动生成的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的目录:

cd WeBASE-Collect-Bee

主要的配置文件位于src/main/resources目录下。其中,application.properties包含了除部分数据库配置外的全部配置。 application-sharding-tables.properties包含了数据库部分的配置。

注意: 当修改完配置文件后,需要重新编译代码,然后再执行,编译的命令如下:

sh gradlew clean bootJar
导出数据范围的配置

配置文件位于 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 -
单节点部署的配置

在选择单节点配置后,以下配置会自动生成。 单节点任务调度的配置,分布式任务调度的配置默认位于 src/main/resources/application.properties

#### 当此参数为false时,进入单节点任务模式
system.multiLiving=false

#### 多线程下载的分片数量,当完成该分片所有的下载任务后,才会统一更新下载进度。
system.crawlBatchUnit=100
集群部署的配置

多节点任务调度的配置,分布式任务调度的配置默认位于 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

数据库配置解析,数据库的配置默认位于 src/main/resources/application-sharding-tables.properties

分库分表的配置

实践表明,当区块链上存在海量的数据时,导出到单个数据库或单个业务表会对运维造成巨大的压力,造成数据库性能的衰减。 一般来讲,单一数据库实例的数据的阈值在1TB之内,单一数据库表的数据的阈值在10G以内,是比较合理的范围。

如果数据量超过此阈值,建议对数据进行分片。将同一张表内的数据拆分到多个或同个数据库的多张表。


#### 定义多个数据源
sharding.jdbc.datasource.names=ds0,ds1

#### 数据源ds0的默认配置
sharding.jdbc.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds0.url=jdbc:mysql://localhost:3306/ds0
sharding.jdbc.datasource.ds0.username=
sharding.jdbc.datasource.ds0.password=

#### 数据源ds1的默认配置
sharding.jdbc.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1
sharding.jdbc.datasource.ds1.username=
sharding.jdbc.datasource.ds1.password=

#### 数据库默认分库分表的列字段
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=user_id
#### 数据库默认分库分表的算法
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}

#### 数据库表block_tx_detail_info的配置,以下配置即为数据自动分为5个分片,以block_height%5来进行路由,pk-id为自增值
sharding.jdbc.config.sharding.tables.block_tx_detail_info.actual-data-nodes=ds.block_tx_detail_info_$->{0..4}
sharding.jdbc.config.sharding.tables.block_tx_detail_info.table-strategy.inline.sharding-column=block_height
sharding.jdbc.config.sharding.tables.block_tx_detail_info.table-strategy.inline.algorithm-expression=block_tx_detail_info_$->{block_height % 5}
sharding.jdbc.config.sharding.tables.block_tx_detail_info.key-generator-column-name=pk_id

#### 如果需要对更多的数据库表进行分片,请按上面的例子进行修改、配置
数据库读写分离的配置:

数据库读写分离的主要设计目标是让用户无痛地使用主从数据库集群,就好像使用一个数据库一样。读写分离的特性支持往主库写入数据,往从库查询数据,从而减轻数据库的压力,提升服务的性能。

注意,本组件不会实现主库和从库的数据同步、主库和从库的数据同步延迟导致的数据不一致、主库双写或多写。

##### 配置一主两从的数据库

sharding.jdbc.datasource.names=master,slave0,slave1

sharding.jdbc.datasource.master.type=org.apache.commons.dbcp.BasicDataSource
sharding.jdbc.datasource.master.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.master.url=jdbc:mysql://localhost:3306/master
sharding.jdbc.datasource.master.username=
sharding.jdbc.datasource.master.password=

sharding.jdbc.datasource.slave0.type=org.apache.commons.dbcp.BasicDataSource
sharding.jdbc.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.slave0.url=jdbc:mysql://localhost:3306/slave0
sharding.jdbc.datasource.slave0.username=
sharding.jdbc.datasource.slave0.password=

sharding.jdbc.datasource.slave1.type=org.apache.commons.dbcp.BasicDataSource
sharding.jdbc.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.slave1.url=jdbc:mysql://localhost:3306/slave1
sharding.jdbc.datasource.slave1.username=
sharding.jdbc.datasource.slave1.password=

sharding.jdbc.config.masterslave.name=ms
sharding.jdbc.config.masterslave.master-data-source-name=master
sharding.jdbc.config.masterslave.slave-data-source-names=slave0,slave1

sharding.jdbc.config.props.sql.show=true
数据库读写分离+分库分表的配置:

sharding.jdbc.datasource.names=master,slave0
        
sharding.jdbc.datasource.master.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.master.jdbc-url=jdbc:mysql://106.12.31.94:3306/test0?useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8
sharding.jdbc.datasource.master.username=
sharding.jdbc.datasource.master.password=

sharding.jdbc.datasource.slave0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.slave0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.slave0.jdbc-url=jdbc:mysql://106.12.31.94:3306/test1?useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8
sharding.jdbc.datasource.slave0.username=
sharding.jdbc.datasource.slave0.password=

sharding.jdbc.config.sharding.master-slave-rules.ds0.master-data-source-name=master
sharding.jdbc.config.sharding.master-slave-rules.ds0.slave-data-source-names=slave0

sharding.jdbc.config.sharding.tables.activity_activity.actual-data-nodes=ds0.block_tx_detail_info$->{0..1}
sharding.jdbc.config.sharding.tables.activity_activity.table-strategy.inline.sharding-column=block_height
sharding.jdbc.config.sharding.tables.activity_activity.table-strategy.inline.algorithm-expression=block_tx_detail_info$->{block_height % 2}

sharding.jdbc.config.props.sql.show=true
2.3 编译代码并运行程序

如果你已经按照WeBASE-Codegen-Monkey的操作手册进行操作,那么可跳过此章节。

但是如果你对配置或代码进行了深度定制,可参考以下步骤:

sh gradlew clean bootJar
sh generate_bee.sh build 
cd dist
chmod +x *.jar
nohup java -jar *.jar >/dev/null 2>&1 &
tail -f *.log

当然,你也可以使用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-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=?
2.4.3 检查数据是否已经正常产生

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

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

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

+----------+
| count(*) |
+----------+
|      633 |
+----------+
2.4.4 停止导入程序
ps -ef |grep WeBASE-Collect-Bee |grep -v grep|awk '{print $2}' |xargs kill -9
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』数据源

[添加步骤]

随后按照提示的页面,配置 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文件

[导入步骤]

最后,点击『import』按钮。

如果导入成功,dashboards下面会出现『FISCO-BCOS区块链监控视图』

您可以选择右上方的时间按钮来选择和设置时间范围及刷新时间等。

您也可以选中具体的页面组件进行编辑,自由地移除或挪动组件的位置,达到更好的使用体验。

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

4. 开启可视化的功能性测试

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

[swagger控制台]

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

4.1 打开swagger页面:

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

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

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

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

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

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

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

我们以查询区块信息为例,如下列图所示:

[选择请求] [编辑报文] [查收结果]

存储模型

数据导出中间件会自动将数据导出到存储介质中,每一类数据都有特定的存储格式和模型,以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(225) Unique key & Index 区块哈希
block_height bigint(20) 区块高度
block_tiemstamp datetime index 出块时间
tx_count int(11) 当前区块交易量
depot_updatetime datetime 系统时间 记录插入/更新时间
1.3 区块交易数据存储模型

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

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

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

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

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

4.1 交易数据存储命名规则

交易数据存储表名、表结构及字段命名规则同事件数据存储模型类似,以3.3.1中的合约为例进行说明。

4.1.1 交易表命名规则

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

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 方法字段列表
tx_hash varchar(225) index 交易哈希
depot_updatetime datetime 系统时间 记录插入/更新时间

3.1中的合约为例,对应的 如下:

字段 类型 字段设置 默认值 说明
user_name varchar(255) 用户名
sex int 性别

使用WeBASE开发区块链应用

部署WeBASE

搭建WeBASE, 请参考快速部署

登录WeBASE管理平台进行配置

安装WeBASE完成后,需要将节点信息添加到WeBASE平台中,这样WeBASE才可和节点进行通信。需要添加的信息包含节点信息,生成用户的私钥等。如下图所示:

  • 节点信息: [节点]
  • 私钥用户: [私钥用户]

开发智能合约

以HelloWorld.sol为例

pragma solidity ^0.4.2;

contract HelloWorld{
    string name;

    function HelloWorld(){
       name = "Hello, World!";
    }

    function get()constant returns(string){
        return name;
    }

    function set(string n){
     name = n;
    }
}
  • 通过智能合约IDE部署合约,并获取合约地址等信息, [合约]

应用层开发

  • 调用交易接口

请参考交易接口

从IDE中的输出信息,拷贝合约地址,合约名,方法名等信息,同时获取用户的公钥信息,调用交易接口。 具体代码请参考 HelloWorld范例

  • 主要代码
application.yml

transactionUrl: http://127.0.0.1:8082/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管理平台查看数据概览,节点监控,查看交易解析,交易审计等管理功能。

  • 查看交易解析 [交易解析]

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 -m "一个伟大改进"

将改动 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

提交的改动经过审核,会合入到仓库。合并后,你会收到电子邮件通知。

版本及兼容

支持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