WeBASE 技术文档¶

WeBASE(WeBank Blockchain Application Software Extension) 是在区块链应用和FISCO BCOS节点之间搭建的一套通用组件。
什么是WeBASE¶
WeBASE(WeBank Blockchain Application Software Extension) 是在区块链应用和FISCO-BCOS节点之间搭建的一套通用组件。围绕交易、合约、密钥管理,数据,可视化管理来设计各个模块,开发者可以根据业务所需,选择子系统进行部署。WeBASE屏蔽了区块链底层的复杂度,降低开发者的门槛,大幅提高区块链应用的开发效率,包含节点前置、节点管理、交易链路,数据导出,Web管理平台等子系统。
建立区块链应用开发标准¶
WeBASE将区块链应用开发标准化,按照部署、配置、开发智能合约、开发应用层、在线运维管理五个步骤即可完成一个区块链应用的开发,详细开发流程请参阅 使用WeBASE开发区块链应用
设计原则¶
按需部署 WeBASE抽象应用开发的诸多共性模块,形成各类服务组件,开发者根据需要部署所需组件。
微服务 WeBASE采用微服务架构,基于Spring Boot框架,提供RESTful风格接口。
零耦合 WeBASE所有子系统独立存在,均可独立部署,独立提供服务。
可定制 前端页面往往带有自身的业务属性,因此WeBASE采用前后端分离的技术,便于开发者基于后端接口定制自己的前端页面。
整体架构¶
完整的部署架构如下,其中WeBASE-Front需要和区块链节点同机部署。
功能介绍¶
从可视化,智能合约,交易,数据四个维度设计各个中间件,各模块主要功能如下
各子系统简介¶
节点前置服务
集成FISCO BCOS JavaSDK,提供RESTful风格的接口,客户端可以使用http的形式和节点进行交互,内置内存数据库,采集节点健康度数据。内置web控制台,实现节点的可视化操作。
节点管理服务
处理前端页面所有web请求,管理各个节点的状态,管理链上所有智能合约,对区块链的数据进行统计、分析,对异常交易的审计,私钥管理等。
WeBASE管理平台 可视化操作平台,可基于此平台查看节点信息,开发智能合约等。
交易服务
接收交易请求,缓存交易到数据库中,异步上链,可大幅提升吞吐量,解决区块链的tps瓶颈。
私钥托管和签名服务 托管用户私钥,提供云端签名。
链管理服务子系统 支持管理多条链和动态群组管理功能,支持国密链、非国密链。
数据统计服务子系统 以前置为基础,拉取CPU、内存、IO、群组大小、群组gas、群组网络流量的数据,记录数据库。
数据监管服务 以前置为基础,导出区块链数据并解析,提供一个可视化的监管视图。可以查询交易属于哪条链,哪个用户,哪个合约,保证链上数据可查可管。
各子系统的技术文档可到WeBASE子系统文档中查看
版本及兼容¶
支持FISCO-BCOS 2.X.X系列版本¶
WeBASE v1.5.3¶
WeBASE v1.5.3 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.8.0版本。
WeBASE v1.5.2¶
WeBASE v1.5.2 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.2版本。
WeBASE v1.5.1¶
WeBASE v1.5.1 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.2版本。
WeBASE v1.5.0¶
WeBASE v1.5.0 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.2版本。
WeBASE v1.4.3¶
WeBASE v1.4.3 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.1版本。
WeBASE v1.4.2¶
WeBASE v1.4.2 版本支持 FISCO-BCOS 2.4.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.7.0版本。
WeBASE v1.4.1¶
WeBASE v1.4.1 版本支持 FISCO-BCOS 2.5.x及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.6.0版本。
WeBASE v1.4.0¶
WeBASE v1.4.0 版本支持 FISCO-BCOS 2.4.x, 2.5.x版本,推荐使用2.4.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用 FISCO BCOS 2.4.1+版本。
WeBASE v1.3.2¶
WeBASE v1.3.2版本支持FISCO-BCOS 2.4.x版本,暂未支持2.5.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.4.1+版本。
WeBASE v1.3.1¶
WeBASE v1.3.1版本支持FISCO-BCOS 2.4.x版本,暂未支持2.5.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.4.0+版本。
WeBASE v1.3.0¶
WeBASE v1.3.0版本支持FISCO-BCOS 2.0.0 - 2.4.x版本,暂未支持2.5.x版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.3.0+版本。
WeBASE v1.2.4¶
WeBASE v1.2.4版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.3.0版本。
WeBASE v1.2.3¶
WeBASE v1.2.3版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.2.0版本。
WeBASE v1.2.2¶
WeBASE v1.2.2版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0及以上版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.2.0版本。
WeBASE v1.2.1¶
WeBASE v1.2.1版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0,FISCO-BCOS v2.1.0。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.1.0版本。
WeBASE v1.2.0¶
WeBASE v1.2.0版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0,FISCO-BCOS v2.1.0。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.1.0版本。
WeBASE V1.1.0¶
WeBASE V1.1.0版本支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3,FISCO-BCOS 2.0.0,FISCO-BCOS v2.1.0。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.1.0版本。
WeBASE V1.0.0¶
支持FISCO-BCOS 2.0.0-rc1,FISCO-BCOS 2.0.0-rc2,FISCO-BCOS 2.0.0-rc3。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS 推荐使用FISCO BCOS 2.0.0-rc3版本。
支持FISCO-BCOS 1.3.X系列版本¶
WeBASE V0.5.X版本支持FISCO-BCOS 1.3.X系列版本。WeBASE 子系统推荐使用下表的版本搭配,FISCO-BCOS推荐使用FISCO BCOS 1.3.8 Release。
服务搭建详见Release tag代码里的README.md
快速入门搭建¶
在区块链应用开发阶段建议用户使用快速入门搭建。在快速入门搭建模式,开发者只需要搭建节点和节点前置服务(WeBASE-Front),就可以通过WeBASE-Front的合约编辑器进行合约的编辑,编译,部署,调试。
节点搭建¶
节点搭建的方法建议使用build_chain。
节点前置服务搭建¶
前提条件
依赖软件 | 支持版本 |
---|---|
Java | JDK 8 至JDK 14 |
备注:部署出现问题请查看问题记录。
下载安装包
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.3/webase-front.zip
解压
unzip webase-front.zip && cd webase-front
拷贝sdk证书文件(build_chain的时候生成的)
将节点所在目录
nodes/${ip}/sdk
下的所有文件拷贝到当前conf
目录,供SDK与节点建立连接时使用拷贝命令可使用
cp -r nodes/${ip}/sdk/* ./conf/
证书为以下两种之一:
非国密:
ca.crt
、sdk.crt
、sdk.key
国密:
sm_ca.crt
、sm_sdk.crt
、sm_sdk.key
、sm_ensdk.crt
、sm_ensdk.key
修改配置
vi conf/application.yml
sdk: useSmSsl: false # sdk连接节点是否使用国密ssl peers: ['127.0.0.1:20200','127.0.0.1:20201'] # 节点ip和rpc端口
服务启停
返回根目录,服务启停命令:
启动: bash start.sh 停止: bash stop.sh 检查: bash status.sh
启动成功将出现如下日志:
...
Application() - main run success...
状态检查¶
成功部署后,可以根据以下步骤确认各个子服务是否启动成功
1. 检查各子系统进程¶
通过ps
命令,检查节点与节点前置的进程是否存在
- 包含:节点进程
nodeXX
,节点前置进程webase.front
检查方法如下,若无输出,则代表进程未启动,需要到webase-front/log
中查看日志的错误信息,并根据错误提示或根据WeBASE-Front常见问题进行错误排查
检查节点进程
$ ps -ef | grep node
输出如下,此处部署了两个节点node0, node1
root 29977 1 1 17:24 pts/2 00:02:20 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
root 29979 1 1 17:24 pts/2 00:02:23 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini
检查节点前置webase-front的进程
$ ps -ef | grep webase.front
输出如下
root 31805 1 0 17:24 pts/2 00:01:30 /usr/local/jdk/bin/java -Djdk.tls.namedGroups=secp256k1 ... conf/:apps/*:lib/* com.webank.webase.front.Application
2. 检查进程端口¶
通过netstat
命令,检查节点与节点前置的端口监听情况
检查方法如下,若无输出,则代表进程端口监听异常,需要到webase-front/log
中查看日志的错误信息,并根据错误提示或根据WeBASE-Front常见问题进行错误排查
检查节点channel端口(默认为20200)是否已监听
$ netstat -anlp | grep 20200
输出如下
tcp 0 0 0.0.0.0:20200 0.0.0.0:* LISTEN 29069/fisco-bcos
检查webase-front端口(默认为5002)是否已监听
$ netstat -anlp | grep 5002
输出如下
tcp6 0 0 :::5002 :::* LISTEN 2909/java
3. 检查服务日志¶
日志中若出现报错信息,可根据信息提示判断服务是否异常,也可以参考并根据错误提示或根据WeBASE-Front常见问题进行错误排查
- 如果节点进程已启用且端口已监听,可跳过本章节
- 如果节点前置异常,如检查不到进程或端口监听,则需要
webase-front/log
中查看日志的错误信息 - 如果检查步骤出现检查不到进程或端口监听等异常,或者前置服务无法访问,可以按以下顺序逐步检查日志:
- 检查
webase-front/log
中查看节点前置日志的错误信息,如果无错误,且日志最后出现application run success
字样则代表运行成功 - 检查
nodes/127.0.0.1/nodeXXX/log
中的节点日志
- 检查
查看运行成功日志:webase-front运行成功后会打印日志main run success
,可以通过搜索此关键字来确认服务正常运行。
如,检查webase-front日志,其他webase服务可进行类似操作
$ cd webase-front
$ grep -B 3 "main run success" log/WeBASE-Front.log
输出如下:
2020-12-09 15:47:25.355 [main] INFO ScheduledAnnotationBeanPostProcessor() - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
2020-12-09 15:47:25.378 [main] INFO TomcatEmbeddedServletContainer() - Tomcat started on port(s): 5002 (http)
2020-12-09 15:47:25.383 [main] INFO Application() - Started Application in 6.983 seconds (JVM running for 7.768)
2020-12-09 15:47:25.383 [main] INFO Application() - main run success...
启动失败或无法使用时,欢迎到WeBASE-Front提交Issue或到技术社区共同探讨
- 提交Issue或讨论问题时,可以在issue中配上自己的环境配置,操作步骤,错误现象,错误日志等信息,方便社区用户快速定位问题
访问¶
访问 http://{deployIP}:{frontPort}/WeBASE-Front,示例:
```
http://localhost:5002/WeBASE-Front
```
注:若服务启动后无异常,但仍然无法访问,可以检查服务器的网络安全策略:
- 开放节点前置端口:如果希望通过浏览器(Chrome Safari或Firefox)直接访问webase-front节点前置的页面,则需要开放节点前置端口
frontPort
(默认5002)
一键部署¶
一键部署可以在 同机 快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。
一键部署会搭建:节点(FISCO-BCOS 3.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。其中,节点的搭建是可选的,可以通过配置来选择使用已有链或者搭建新链。一键部署架构如下:

前提条件¶
环境 | 版本 |
---|---|
Java | JDK 8 至JDK 14 |
MySQL | MySQL-5.6及以上 |
Python | Python3.6及以上 |
PyMySQL |
检查环境¶
平台要求¶
推荐使用CentOS 7.2+, Ubuntu 16.04及以上版本, 一键部署脚本将自动安装openssl, curl, wget, git, nginx, dos2unix
相关依赖项。
其余系统可能导致安装依赖失败,可自行安装openssl, curl, wget, git, nginx, dos2unix
依赖项后重试
检查Python¶
使用Python3.6或以上版本:
python --version
# python3时
python3 --version
如已安装python3,也可通过python3 --version
查看,在运行脚本时,使用python3
命令即可
- Python3安装部署可参考Python部署
PyMySQL部署(Python3.6+)¶
Python3.6及以上版本,需安装PyMySQL
依赖包
CentOS
sudo yum -y install python36-pip sudo pip3 install PyMySQL
Ubuntu
sudo apt-get install -y python3-pip sudo pip3 install PyMySQL
CentOS或Ubuntu不支持pip命令的话,可以使用以下方式:
git clone https://github.com/PyMySQL/PyMySQL
cd PyMySQL/
python3 setup.py install
检查服务器网络策略¶
网络策略检查:
- 开放WeBASE管理平台端口:检查webase-web管理平台页面的端口
webPort
(默认为5000)在服务器的网络安全组中是否设置为开放。如,云服务厂商如腾讯云,查看安全组设置,为webase-web开放5000端口。若端口未开放,将导致浏览器无法访问WeBASE服务页面 - 开放节点前置端口:如果希望通过浏览器直接访问webase-front节点前置的页面,则需要开放节点前置端口
frontPort
(默认5002);由于节点前置直连节点,不建议对公网开放节点前置端口,建议按需开放
拉取部署脚本¶
获取部署安装包:
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.3/webase-deploy.zip
解压安装包:
unzip webase-deploy.zip
进入目录:
cd webase-deploy
修改配置¶
① mysql数据库需提前安装,已安装直接配置即可,还未安装请参看数据库部署;
② 修改配置文件(vi common.properties
);
③ 一键部署支持使用已有链或者搭建新链。通过参数if.exist.fisco
配置是否使用已有链,以下配置二选一即可:
当配置
yes
时,需配置已有链的sdk证书路径sdk.dir
。路径下存放sdk证书,包含以下两种之一:非国密:
ca.crt
、sdk.crt
、sdk.key
国密:
sm_ca.crt
、sm_sdk.crt
、sm_sdk.key
、sm_ensdk.crt
、sm_ensdk.key
当配置
no
时,需配置节点fisco版本和节点安装个数,未修改时搭建的新链默认两个群组
如果不使用一键部署搭建新链,可以参考FISCO BCOS官方文档搭建 FISCO BCOS部署流程;
④ 服务端口不能小于1024
[common]
# WeBASE子系统的最新版本(v2.0.0或以上版本)
webase.web.version=v2.0.0-rc1
webase.mgr.version=v2.0.0-rc1
webase.sign.version=v2.0.0-rc1
webase.front.version=v2.0.0-rc1
# 节点管理子系统mysql数据库配置
mysql.ip=localhost
mysql.port=3306
mysql.user=dbUsername
mysql.password=dbPassword
mysql.database=webasenodemanager
# 签名服务子系统mysql数据库配置
sign.mysql.ip=localhost
sign.mysql.port=3306
sign.mysql.user=dbUsername
sign.mysql.password=dbPassword
sign.mysql.database=webasesign
# 节点前置子系统h2数据库名
front.h2.name=webasefront
# WeBASE管理平台服务端口
web.port=5000
# 节点管理子系统服务端口
mgr.port=5001
# 节点前置子系统端口
front.port=5002
# 签名服务子系统端口
sign.port=5004
# SDK连接加密类型 (0: ECDSA SSL, 1: 国密SSL)
encrypt.type=0
# 是否使用已有的链(yes/no)
if.exist.fisco=no
# 搭建新链时需配置[if.exist.fisco=no]
# 节点监听Ip
node.listenIp=127.0.0.1
# 节点p2p端口
node.p2pPort=30300
# 节点rpc端口
node.rpcPort=20200
# FISCO-BCOS版本(v3.0.0或以上版本)
fisco.version=3.0.0
# 搭建节点个数(默认两个)
node.counts=nodeCounts
# 使用已有链时需配置[if.exist.fisco=yes]
# 已有链节点rpc端口列表
node.rpcPeers=['127.0.0.1:20200','127.0.0.1:20201']
# sdk目录,需包含已有链SSL所需的证书(如: ca.crt,sdk.crt,sdk.key)
sdk.dir=/data/app/nodes/127.0.0.1/sdk
部署¶
- 执行installAll命令,部署服务将自动部署FISCO BCOS节点,并部署 WeBASE 中间件服务,包括签名服务(sign)、节点前置(front)、节点管理服务(node-mgr)、节点管理前端(web)
备注:
- 部署脚本会拉取相关安装包进行部署,需保持网络畅通
- 首次部署需要下载编译包和初始化数据库,重复部署时可以根据提示不重复操作
- 部署过程中出现报错时,可根据错误提示进行操作,或根据本文档中的常见问题进行排查
- 不要用sudo执行脚本,例如
sudo python3 deploy.py installAll
(sudo会导致无法获取当前用户的环境变量如JAVA_HOME)
# 部署并启动所有服务
python3 deploy.py installAll
部署完成后可以看到deploy has completed
的日志:
$ python3 deploy.py installAll
...
============================================================
_ _ ______ ___ _____ _____
| | | | | ___ \/ _ \/ ___| ___|
| | | | ___| |_/ / /_\ \ `--.| |__
| |/\| |/ _ | ___ | _ |`--. | __|
\ /\ | __| |_/ | | | /\__/ | |___
\/ \/ \___\____/\_| |_\____/\____/
...
...
============================================================
============== deploy has completed ==============
============================================================
============== webase-web version v... ========
============== webase-node-mgr version v... ========
============== webase-sign version v... ========
============== webase-front version v... ========
============================================================
- 服务部署后,需要对各服务进行启停操作,可以使用以下命令:
# 一键部署
部署并启动所有服务 python3 deploy.py installAll
停止一键部署的所有服务 python3 deploy.py stopAll
启动一键部署的所有服务 python3 deploy.py startAll
# 各子服务启停
启动FISCO-BCOS节点: python3 deploy.py startNode
停止FISCO-BCOS节点: python3 deploy.py stopNode
启动WeBASE-Web: python3 deploy.py startWeb
停止WeBASE-Web: python3 deploy.py stopWeb
启动WeBASE-Node-Manager: python3 deploy.py startManager
停止WeBASE-Node-Manager: python3 deploy.py stopManager
启动WeBASE-Sign: python3 deploy.py startSign
停止WeBASE-Sign: python3 deploy.py stopSign
启动WeBASE-Front: python3 deploy.py startFront
停止WeBASE-Front: python3 deploy.py stopFront
状态检查¶
成功部署后,可以根据以下步骤确认各个子服务是否启动成功
检查各子系统进程¶
通过ps
命令,检查各子系统的进程是否存在
- 包含:节点进程
nodeXX
,节点前置进程webase.front
,节点管理服务进程webase.node.mgr
,节点管理平台webase-web
的nginx
进程,以及签名服务进程webase.sign
检查方法如下,若无输出,则代表进程未启动,需要到该子系统的日志中检查日志错误信息,并根据错误提示或本文档的常见问题进行排查
- 检查节点进程,此处部署了两个节点node0, node1
$ ps -ef | grep node
输出如下
root 29977 1 1 17:24 pts/2 00:02:20 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
root 29979 1 1 17:24 pts/2 00:02:23 /root/fisco/webase/webase-deploy/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini
- 检查节点前置webase-front的进程
$ ps -ef | grep webase.front
输出如下
root 31805 1 0 17:24 pts/2 00:01:30 /usr/local/jdk/bin/java -Djdk.tls.namedGroups=secp256k1 ... conf/:apps/*:lib/* com.webank.webase.front.Application
- 检查节点管理服务webase-node-manager的进程
$ ps -ef | grep webase.node.mgr
输出如下
root 4696 1 0 17:26 pts/2 00:00:40 /usr/local/jdk/bin/java -Djdk.tls.namedGroups=secp256k1 ... conf/:apps/*:lib/* com.webank.webase.node.mgr.Application
- 检查webase-web对应的nginx进程
$ ps -ef | grep nginx
输出如下
root 5141 1 0 Dec08 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /root/fisco/webase/webase-deploy/comm/nginx.conf
- 检查签名服务webase-sign的进程
$ ps -ef | grep webase.sign
输出如下
root 30718 1 0 17:24 pts/2 00:00:19 /usr/local/jdk/bin/java ... conf/:apps/*:lib/* com.webank.webase.sign.Application
检查进程端口¶
通过netstat
命令,检查各子系统进程的端口监听情况。
检查方法如下,若无输出,则代表进程端口监听异常,需要到该子系统的日志中检查日志错误信息,并根据错误提示或本文档的常见问题进行排查
- 检查节点channel端口(默认为20200)是否已监听
$ netstat -anlp | grep 20200
输出如下
tcp 0 0 0.0.0.0:20200 0.0.0.0:* LISTEN 29069/fisco-bcos
- 检查webase-front端口(默认为5002)是否已监听
$ netstat -anlp | grep 5002
输出如下
tcp6 0 0 :::5002 :::* LISTEN 2909/java
- 检查webase-node-mgr端口(默认为5001)是否已监听
$ netstat -anlp | grep 5001
输出如下
tcp6 0 0 :::5001 :::* LISTEN 14049/java
- 检查webase-web端口(默认为5000)在nginx是否已监听
$ netstat -anlp | grep 5000
输出如下
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 3498/nginx: master
- 检查webase-sign端口(默认为5004)是否已监听
$ netstat -anlp | grep 5004
输出如下
tcp6 0 0 :::5004 :::* LISTEN 25271/java
检查服务日志¶
各子服务的日志路径如下:¶
|-- webase-deploy # 一键部署目录
|--|-- log # 部署日志目录
|--|-- webase-web # 管理平台目录
|--|--|-- log # 管理平台日志目录
|--|-- webase-node-mgr # 节点管理服务目录
|--|--|-- log # 节点管理服务日志目录
|--|-- webase-sign # 签名服务目录
|--|--|-- log # 签名服务日志目录
|--|-- webase-front # 节点前置服务目录
|--|--|-- log # 节点前置服务日志目录
|--|-- nodes # 一件部署搭链节点目录
|--|--|-- 127.0.0.1
|--|--|--|-- node0 # 具体节点目录
|--|--|--|--|-- log # 节点日志目录
备注:当前节点日志路径为一键部署搭链的路径,使用已有链请在相关路径查看日志
日志目录中包含{XXX}.log
全量日志文件和{XXX}-error.log
错误日志文件
- 通过日志定位错误问题时,可以结合
.log
全量日志和-error.log
错误日志两种日志信息进行排查。,如查询WeBASE-Front日志,则打开WeBASE-Front-error.log
可以快速找到错误信息,根据错误查看WeBASE-Front.log
的相关内容,可以看到错误日志前后的普通日志信息
检查服务日志有无错误信息¶
- 如果各个子服务的进程已启用且端口已监听,可直接访问下一章节访问WeBASE
- 如果上述检查步骤出现异常,如检查不到进程或端口监听,则需要按日志路径进入异常子服务的日志目录,检查该服务的日志
- 如果检查步骤均无异常,但服务仍无法访问,可以分别检查部署日志
deployLog
,节点前置日志frontLog
, 节点管理服务日志nodeMgrLog
进行排查:- 检查webase-deploy/log中的部署日志,是否在部署时出现错误
- 检查webase-deploy/webase-front/log中的节点前置日志,如果最后出现
application run success
字样则代表运行成功 - 检查webase-deploy/webase-node-mgr/log或webase-deploy/webase-sign/log中的日志
- 检查webase-deploy/nodes/127.0.0.1/nodeXXX/log中的节点日志
搜索日志¶
通过查看日志可以检查服务的运行状态,我们可以进入各子服务的日志路径,通过grep
检查日志文件,以此判断服务是否正常运行
- 查看运行成功日志:WeBASE子服务运行成功后均会打印日志
main run success
,可以通过搜索此关键字来确认服务正常运行。
如,检查webase-front日志,其他WeBASE服务可进行类似操作
$ cd webase-front
$ grep -B 3 "main run success" log/WeBASE-Front.log
输出如下:
2020-12-09 15:47:25.355 [main] INFO ScheduledAnnotationBeanPostProcessor() - No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
2020-12-09 15:47:25.378 [main] INFO TomcatEmbeddedServletContainer() - Tomcat started on port(s): 5002 (http)
2020-12-09 15:47:25.383 [main] INFO Application() - Started Application in 6.983 seconds (JVM running for 7.768)
2020-12-09 15:47:25.383 [main] INFO Application() - main run success...
- 查看报错日志:出现异常时,可以搜索关键字
ERROR
进行检查
如,检查webase-front错误日志,其他WeBASE服务可进行类似操作
$ cd webase-front
$ grep "ERROR" log/WeBASE-Front.log
输出如下
2020-12-09 09:10:42.138 [http-nio-5002-exec-1] ERROR ExceptionsHandler() - catch frontException: no active connection available network exception requset send failed! please check the log file content for reasons.
2020-12-09 09:10:42.145 [http-nio-5002-exec-4] ERROR Web3ApiService() - getBlockNumber fail.
如果出现错误日志,根据错误提示或本文档的常见问题进行排查
启动失败或无法使用时,欢迎到WeBASE提交Issue或到技术社区共同探讨。
- 提交Issue或讨论问题时,可以在issue中配上自己的环境配置,操作步骤,错误现象,错误日志等信息,方便社区用户快速定位问题
访问¶
WeBASE管理平台:
- 一键部署完成后,打开浏览器(Chrome Safari或Firefox)访问
http://{deployIP}:{webPort}
示例:http://localhost:5000
备注:
- 部署服务器IP和管理平台服务端口需对应修改,网络策略需开通
- 使用云服务厂商的服务器时,需要开通网络安全组的对应端口。如开放webase使用的5000端口
- WeBASE管理平台使用说明请查看使用手册(获取WeBASE管理平台默认账号和密码,并初始化系统配置)
- 默认账号为
admin
,默认密码为Abcd1234
。首次登陆要求重置密码 - 添加节点前置WeBASE-Front到WeBASE管理平台;一键部署时,节点前置与节点管理服务默认是同机部署,添加前置则填写IP为
127.0.0.1
,默认端口为5002
。参考上文中common.properties
的配置项front.port={frontPort}
- 默认账号为
- 检查节点前置是否启动,可以通过访问
http://{frontIp}:{frontPort}/WeBASE-Front
(默认端口5002);访问前,确保服务端已对本地机器开放端口,如开放front的5002端口。(不建议节点前置的端口对公网开放访问权限,应对部分机器IP按需开放)
附录¶
1. Java环境部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,推荐JDK8-JDK13版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/java/technologies/downloads/#java8)选择Java 8或以上的版本下载,例如下载jdk-8u301-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u301-linux-x64.tar.gz
#修改解压后文件的文件名
$mv jdk1.8.0_301 jdk-8u301
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u301 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
2. 数据库部署¶
① CentOS安装MariaDB¶
此处以CentOS 7(x86_64)安装MariaDB 10.2为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。MariaDB 10.2版本对应Mysql 5.7。其他安装方式请参考MySQL官网。
- CentOS 7 默认MariaDB为5.5版本,安装10.2版本需要按下文进行10.2版本的配置。
- 若使用CentOS 8则直接使用
sudo yum install -y mariadb*
即可安装MariaDB 10.3,并跳到下文的 启停 章节即可。
使用vi
或vim
创建新文件/etc/yum.repos.d/mariadb.repo
,并写入下文的文件内容(参考MariaDB中科大镜像源修改进行配置)
- 创建repo文件
sudo vi /etc/yum.repos.d/mariadb.repo
- 文件内容,此处使用的是中科大镜像源
# MariaDB 10.2 CentOS repository list - created 2021-07-12 07:37 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
- 更新yum源缓存数据
yum clean all
yum makecache all
- 安装
MariaDB 10.2
- 如果已存在使用
sudo yum install -y mariadb*
命令安装的MariaDB,其版本默认为5.5版本,对应Mysql版本为5.5。新版本MariaDB无法兼容升级,需要先卸载旧版本的MariaDB,卸载前需要备份数据库内容,卸载命令可参考yum remove mariadb
sudo yum install MariaDB-server MariaDB-client -y
若安装时遇到错误“Failed to connect to 2001:da8:d800:95::110: Network is unreachable”
,将源地址中的 mirrors.ustc.edu.cn
替换为 ipv4.mirrors.ustc.edu.cn
以强制使用 IPv4:
sudo sed -i 's#//mirrors.ustc.edu.cn#//ipv4.mirrors.ustc.edu.cn#g' /etc/yum.repos.d/mariadb
详情参考MariaDB官网安装。
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasenodemanager;
④ Ubuntu安装mysql数据库¶
- 以root用户执行命令
apt-get install software-properties-common
sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty universe'
sudo apt-get update
sudo apt install mysql-server-5.6
sudo apt install mysql-client-5.6
- 执行mysql –version命令,若显示如下则安装成功
mysql Ver 14.14 Distrib 5.6.16, for debian-linux-gnu (x86_64) using EditLine wrapper
3. Python部署¶
python版本要求使用python3.x, 推荐使用python3.6及以上版本
CentOS
sudo yum install -y python36 sudo yum install -y python36-pip
Ubuntu
// 添加仓库,回车继续 sudo add-apt-repository ppa:deadsnakes/ppa // 安装python 3.6 sudo apt-get install -y python3.6 sudo apt-get install -y python3-pip
常见问题¶
1. Python命令出错¶
- SyntaxError报错
File "deploy.py", line 62
print helpMsg
^
SyntaxError: Missing parentheses in call to "print". Did you mean print(helpMsg)?
- 找不到fallback关键字
File "/home/ubuntu/webase-deploy/comm/utils.py", line 127, in getCommProperties
value = cf.get('common', paramsKey,fallback=None)
TypeError: get() got an unexpected keyword argument 'fallback'
答:检查Python版本,推荐使用python3.6及以上版本
2. 使用Python3时找不到pymysql¶
Traceback (most recent call last):
...
ImportError: No module named 'pymysql'
答:需要安装PyMySQL,安装请参看 pymysql
3. 部署时某个组件失败,重新部署提示端口被占用问题¶
答:因为有个别组件是启动成功的,需先执行“python deploy.py stopAll”将其停止,再执行“python deploy.py installAll”部署全部。
4. 管理平台启动时Nginx报错¶
...
============== WeBASE-Web start... ==============
Traceback (most recent call last):
...
Exception: execute cmd error ,cmd : sudo /usr/local/nginx/sbin/nginx -c /data/app/webase-deploy/comm/nginx.conf, status is 256 ,output is nginx: [emerg] open() "/etc/nginx/mime.types" failed (2: No such file or directory) in /data/app/webase-deploy/comm/nginx.conf:13
答:缺少/etc/nginx/mime.types文件,建议重装nginx。
5. 部署时数据库访问报错¶
...
checking database connection
Traceback (most recent call last):
File "/data/temp/webase-deploy/comm/mysql.py", line 21, in dbConnect
conn = mdb.connect(host=mysql_ip, port=mysql_port, user=mysql_user, passwd=mysql_password, charset='utf8')
File "/usr/lib64/python2.7/site-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 193, in __init__
super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
答:确认数据库用户名和密码
6. 节点sdk目录不存在¶
...
======= FISCO-BCOS sdk dir:/data/app/nodes/127.0.0.1/sdk is not exist. please check! =======
答:确认节点安装目录下有没有sdk目录(企业部署工具搭建的链可能没有),如果没有,需手动创建”mkdir sdk”,并将节点sdk证书(ca.crt、sdk.key、sdk.crt)复制到该sdk目录,再重新部署。如果使用国密SSL,则在sdk目录里存放国密sdk证书(sm_ca.crt、sm_sdk.crt、sm_sdk.key、sm_ensdk.crt、sm_ensdk.key)。
7. 前置启动报错“nested exception is javax.net.ssl.SSLException”¶
...
nested exception is javax.net.ssl.SSLException: Failed to initialize the client-side SSLContext: Input stream not contain valid certificates.
答:CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK/Java-SDK无法正常连接区块链节点,因此在使用CentOS操作系统时,推荐使用OracleJDK。
8.前置启动报错“Processing bcos message timeout”¶
...
[main] ERROR SpringApplication() - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractController': Unsatisfied dependency expressed through field 'contractService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractService': Unsatisfied dependency expressed through field 'web3jMap'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'web3j' defined in class path resource [com/webank/webase/front/config/Web3Config.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.HashMap]: Factory method 'web3j' threw exception; nested exception is java.io.IOException: Processing bcos message timeout
...
答:一些OpenJDK版本缺少相关包,导致节点连接异常。推荐使用OracleJDK。
9. 服务进程起来了,服务不正常¶
...
======= WeBASE-Node-Manager starting . Please check through the log file (default path:./webase-node-mgr/log/). =======
答:查看日志,确认问题原因。确认后修改重启,如果重启提示服务进程在运行,先执行“python deploy.py stopAll”将其停止,再执行“python deploy.py startAll”重启。
10. WeBASE-Web登录页面的验证码加载不出来¶
答:检查WeBASE-Node-Manager后台服务是否已启动成功。若启动成功,检查后台日志:
进入
webase-node-mgr
目录下,执行bash status.sh
检查服务是否启动,如果服务没有启动,运行bash start.sh
启动服务;如果服务已经启动,按照如下修改日志级别
webase-node-mgr/conf/application.yml
#log config logging: level: com.webank.webase.node.mgr: debug
webase-node-mgr/conf/log/log4j2.xml
<Loggers> <Root level="debug"> <AppenderRef ref="asyncInfo"/> <AppenderRef ref="asyncErrorLog"/> </Root> </Loggers>
修改日志level后,重启服务
bash stop.sh && bash start.sh
重启服务后,检查日志文件
log/WeBASE-Node-Manager.log
。- 检查是否有异常信息。如果有异常信息,根据具体的异常信息检查环境配置,或者通过搜索引擎进行排查。
11. WeBASE 国内镜像与CDN加速服务¶
答:WeBASE CDN 加速服务提供 WeBASE 各子系统安装包的下载服务,可参考国内镜像和CDN加速攻略
欢迎给WeBASE的文档提交 Pull Request 补充更多的 Q&A
企业部署¶
国内镜像和CDN加速攻略¶
本节为访问GitHub较慢的用户提供国内源码镜像与安装包下载地址,以及WeBASE文档加速访问介绍。
WeBASE及子系统源码及安装包¶
源码同步¶
WeBASE当前仓库源码位于https://github.com/WebankFinTech/WeBASE,每个新的版本发布会将代码合入master分支。
为了方便国内用户,我们同样在gitee上提供了镜像仓库https://giteee.com/Webank/WeBASE,每次新版本发布后,镜像仓库会同步GitHub上官方仓库的更新,如果从GitHub下载失败,请尝试使用Gitee镜像仓库。
WeBASE各子系统的Github代码仓库则是https://github.com/WebankFinTech/
+ WeBASE-XXX
,对应的gitee仓库则是https://gitee.com/WeBank/
+ WeBASE-XXX
如WeBASE-Front的Github代码仓库为https://github.com/WebankFinTech/WeBASE-Front
,Gitee代码仓库为https://gitee.com/WeBank/WeBASE-Front
一键部署与安装包¶
WeBASE每个新版本发布后,会在WeBASELargefilesGitHub的Releases中提供对应的WeBASE一键部署工具和对应安装包。
其中WeBASELargefiles提供webase-deploy一键部署工具(即WeBASE源码中/deploy
文件夹),以及webase-front.zip, webase-node-mgr.zip, webase-sign.zip, webase-web.zip子系统的安装包。
同时提供以下国内镜像,可加速下载安装包:
https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/{release_version}/webase-{subsystem}.zip
其中{release_version}
为v1.x.x
格式,{subsystem}
则是子系统名字。
支持下载sign, front, node-mgr, web
子系统的zip安装包(全小写),暂不支持webase-transaction的安装包下载。
注:可视化部署中通过国内镜像手动下载docker镜像,文件名则是docker-fisco-webase.tar
或国密版docker-fisco-webase-gm.tar
WeBASE文档镜像¶
WeBASE文档使用readthedocs管理,全部开源于https://webasedoc.readthedocs.io/zh_CN/latest/index.html,同样提供国内镜像文档https://fintech.webank.com/developer/docs/webase/index.html,由于网站资源更新周期安排,国内镜像文档更新会比readthedocs有所延迟。
每个版本发布会为上个版本的文档打Tag,新版本的文档会合入主干分支,文档由于会持续改进,所以是下个版本发布才打上个版本的tag。readthedocs文档支持下载PDF格式,方便用户使用。
举例:使用国内镜像进行一键部署¶
本节WeBASE 1.5.0为例进行一键部署,一键部署会默认使用国内镜像下载安装包,下面仅演示关键步骤,具体操作可参考WeBASE一键部署
下载WeBASE一键部署工具¶
# 使用CDN下载
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/webase-deploy.zip
# 使用github下载
wget https://github.com/WeBankFinTech/WeBASELargeFiles/releases/download/v1.5.0/webase-deploy.zip
单独下载WeBASE子系统的安装包¶
WeBASE一键部署(webase-deploy)会自动下载子系统安装包,用户也可以手动下载安装包或编译源码得到安装包,并复制到webase-deploy目录下。
如需手动下载某一子系统的安装包,可以直接通过wget
或者curl -O
命令直接获取安装包。比如:
- 获取WeBASE-Node-Manager v1.4.1的安装包
webase-node-mgr.zip
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.4.1/webase-node-mgr.zip
// 或
curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.4.1/webase-node-mgr.zip
单独下载WeBASE的solc JS文件¶
WeBASE提供FISCO BCOS中使用的v0.4.25, v0.5.2, v0.6.10三个版本的solc JS编译文件,对应的国密版本则在版本号后加上-gm
后缀
如需手动下载某一版本的的安装包,可以直接通过wget
或者curl -O
命令直接获取安装包。比如:
- 获取v0.4.25的国密版本solc JS编译文件
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.4.25-gm.js
// 或
curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.4.25-gm.js
若通过源码编译获取安装包并用于一键部署工具,需要进行文件夹的重命名,参考下一章节。
举例:使用国内源码镜像编译WeBASE-Front¶
本节以WeBASE-Front子系统为例,从gitee镜像下载源码并编译,编译后的配置方法,请参考各子系统的安装部署文档。
下载源码¶
git clone https://gitee.com/WeBank/WeBASE-Front.git
编译源码¶
依据WeBASE-Front节点前置安装文档的环境要求进行配置,如jdk(oracle jdk8及以上),配置gradle(4.10或以上)或直接使用gradlew脚本进行编译
// java版本
java -version
// 进入源码目录
cd WeBASE-Front
// 已有gradle时,使用gradle
gradle build -x test
// 不配置gradle,直接使用gradlew
chmod +x ./gradlew && ./gradlew build -x test
修改配置¶
编译完成后,将在当前目录得到dist
文件夹
重命名dist包中的conf_template
为conf
后,并将节点的sdk证书复制到conf
目录后,即可启动。
修改配置的具体方法,可参考WeBASE-Front部署
cd dist
mv conf_template conf
// 此处需要复制ca.crt, node.crt, node.key
cp -rf /fisco/nodes/127.0.0.1/sdk/* ./conf
bash start.sh
WeBASE管理平台使用手册¶
概览¶
基本描述¶
WeBASE管理平台是由四个WeBASE子系统组成的一套管理FISCO-BCOS联盟链的工具集。
部署架构¶
这套管理工具主要由:节点前置,签名服务,节点管理,WeBASE管理平台四个WeBASE子系统构成。WeBASE四个服务的部署架构如下图:节点前置需要和区块链节点部署在同一台机器;节点管理和WeBASE管理平台可以同机部署,也可以分开部署。

使用前提¶
群组搭建¶
区块链浏览器展示的数据是从区块链上同步下来的。为了同步数据需要初始化配置(添加群组信息和节点信息),故在同步数据展示前需要用户先搭建好区块链群组。FISCO-BCOS 2.0提供了多种便捷的群组搭建方式。
- 如果是开发者进行开发调试,建议使用build_chain。
- 如果是开发企业级应用,建议使用企业部署工具FISCO-BCOS generator。
两者的主要区别在于build_chain为了使体验更好,搭建速度更快,辅助生成了群组内各个节点的私钥;但企业部署工具出于安全的考虑不辅助生成私钥,需要用户自己生成并设置。
WeBASE管理平台搭建¶
WeBASE管理平台分为四个部分:节点前置,签名服务,节点管理,WeBASE管理台。
当前版本我们提供了三种搭建方式:一键搭建、纯手动搭建各子系统、可视化部署。
2、手动搭建¶
2.1、签名服务搭建¶
签名服务使用Spring Boot的JAVA后台服务,具体搭建流程参见《签名服务安装说明》。
2.2、节点前置搭建¶
节点前置使用Spring Boot的JAVA后台服务,具体搭建流程参见《节点前置安装说明》。
2.3、节点管理搭建¶
节点管理使用Spring Boot的JAVA后台服务,具体搭建流程参见《节点管理安装说明》。
2.4、WeBASE管理平台¶
WeBASE管理台使用框架vue-cli
,具体搭建流程参见《WeBASE管理平台安装说明》。
3、可视化部署¶
可视化部署的具体使用方法搭建流程参见《WeBASE 可视化部署》。
可视化部署是指通过 WeBASE 管理平台的Web页面上通过可视化的操作,快速在多台主机上完成FISCO-BCOS 底层节点和 WeBASE-Front 前置的部署操作。
可视化部署分为部署子系统和搭链两个步骤:
- 步骤一:部署子系统依赖服务,包括管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、签名服务(WeBASE-Sign)。依赖服务可以通过 一键搭建 或 手动搭建 完成。
- 使用一键搭建的
installWeBASE
命令,一键部署依赖服务 - 手动搭建部署依赖服务,参考上文的各子系统搭建指引
- 使用一键搭建的
- 步骤二:使用WeBASE-Web界面搭链,部署 FISCO-BCOS 底层节点 和 节点前置服务(WeBASE-Front)
系统初始化配置¶
服务搭建成功后,可使用网页浏览器访问nginx配置的WeBASE管理台IP和端口(例如127.0.0.1:5000
),进入到管理平台页面。
管理平台默认用户为admin
,默认密码为Abcd1234
(第一次登陆成功后会要求重置密码,请按照密码标准设置一个更加安全的密码)。
添加节点前置¶
未初始化节点前置的管理平台,会引导去节点管理页面添加节点前置。
- 节点前置服务需要填写前置的IP与端口(默认为
127.0.0.1
和5002
),机构名则根据实际自定义填写
前置添加完成后,管理平台就会开始拉取群组信息和群组的区块信息。此时数据概览页面应该就有数据了。为了解析和审计区块数据,需要把相关的合约和用户导入到管理平台。具体看下面两个小节。
合约管理¶
1、添加合约¶
管理平台提供两种添加合约的方式,一个是新建一个合约,一个是导入已有合约。同时合约编辑器还提供新建目录。用目录的形式管理合约,主要是为了解决同名合约引用的问题。合约添加完成后,需要编译保存。
3、合约调用¶
在合约部署成功后,可以在合约IDE页面的右上角点击发交易,向合约发送交易进行合约调用。
交易发送成功后,将返回交易回执。可以在数据概览-交易列表-更多中根据transactionHash搜索交易,通过交易解析和Event解析查看可视化的交易回执信息。具体操作方法参考下文的区块链数据概览章节中的交易解析与Event解析。
私钥管理¶
私钥管理提供了新建私钥用户和导入公钥用户两种用户导入方式。第一种方式主要用于新建用户(私钥托管在签名服务中),在管理平台的合约管理中部署和调用合约。第二种方式主要用于把交易和用户关联起来。
各模块的详细介绍¶
本小节概要介绍管理平台的各个模块,方便大家对WeBASE管理平台套件有一个整体的认识。这套工具集主要提供的管理功能有:
区块链数据概览¶
数据概览页面,展示了区块链的核心数据指标:节点个数,区块数量,交易数量,通过管理台部署的合约数量。关键监控指标:历史15天的交易量。
- 节点信息列表:展示了节点的ID,节点块高,节点view和运行状态;
- 区块信息列表:展示了最近5个块的概览信息,点击更多可以查看更多历史区块;
- 交易信息列表:展示了最近5个交易的概览信息,点击更多可以查看更多历史交易;
其中右下角的交易信息列表点击可跳入具体一条交易中查看交易详细信息:交易详细信息还包含了
- 交易解析:可以将交易返回的交易回执数据进行解析并可视化;
- Event解析:可以将交易返回的Event数据进行解析并可视化;
未解析的raw数据如下图所示:
进行交易解析后如下图所示:
同样的,Event数据解析后可以看到:
节点管理¶
节点管理主要提供了前置列表、节点列表、修改节点共识状态的功能。
用户可以通过新增节点前置,把新的节点前置添加到前置列表。系统会默认拉取这些前置所在的群组和各个群组的节点信息。在节点列表中,用户可以修改节点的共识状态:共识节点、观察节点、游离节点。其中修改为游离节点相当于将节点移出群组,停止节点前务必先将节点设置为游离节点,否则将触发节点异常。
前置列表与节点管理:
- 前置列表:可以查看节点前置状态,导出前置的SDK证书zip包
- 节点管理:显示所有的共识/观察节点(无论运行或停止),以及正在运行的游离节点
修改节点共识状态:
合约管理¶
合约管理提供了一个图形化的合约IDE环境、已部署的合约列表、合约CNS查询以及预编译合约的CRUD功能。
图形化合约IDE提供了一整套的合约管理工具:新建合约,保存合约,编译合约,部署合约,调用合约接口,根据合约导出Java项目脚手架。其中,新建合约可以通过编辑键入合约内容,也可以上传合约文件;编译合约后才可以部署合约;部署合约成功后,可以通过发送交易调用合约接口。具体操作步骤可以参考上一章节中系统初始化配置介绍。
合约IDE:
合约列表:包含WeBASE已登记合约与链上已部署的合约
已登记合约:包含通过IDE部署的合约、导入ABI的合约
链上全量合约:包含通过其他平台部署到链上的合约与WeBASE已登记的合约(链上合约只有合约地址),可通过导入按钮,填入合约ABI导入到本地
ABI编码:支持对ABI的方法与入参进行编码
CNS查询:CNS(Contract Name Service)是通过提供链上合约名称与合约地址映射关系的记录及相应的查询功能,方便调用者通过记忆简单的合约名来实现对链上合约的调用。详情可查看FISCO-BCOS文档的 CNS方案
注册CNS后,CNS可以根据合约名和合约版本号查询CNS信息(合约名和合约版本号用英文冒号连接)。若缺失合约版本号,则返回所有符合合约名的合约信息。
- 需要在合约管理页面部署合约时勾选CNS,或合约列表页面中点击CNS注册,即可完成注册
CRUD:CRUD通过在Solidity合约中支持分布式存储预编译合约,可以实现将Solidity合约中数据存储在FISCO BCOS平台AMDB的表结构中,实现合约逻辑与数据存储的分离。CRUD可以在FISCO-BCOS链上创建数据表,并对表进行增删改查操作,具体CRUD操作教程查看FISCO-BCOS控制台CRUD命令
EventLog查看:支持输入合约地址和ABI、区块范围和Event名,即可查询并同步返回
EventLog
私钥管理¶
私钥管理包含新建私钥用户和新建公钥用户两个功能。在合约管理界面,可以看到合约部署和交易调用功能。这里的私钥管理可以新建私钥用户,私钥将托管在签名服务中,然后通过签名服务对合约部署和合约调用进行签名。注:外部账户可通过新建公钥账户导入,主要用于把交易和用户关联起来。
私钥管理:包含WeBASE本地已登记的私钥用户与链上全量私钥用户。
已登记私钥:包含本地创建的私钥与导入的私钥
链上全量私钥:包含链上私钥和本地已登记的私钥,可通过导入按钮,作为公钥用户导入到本地
添加私钥用户:
导入私钥:支持导入.txt/.pem/.p12格式及明文的私钥,其中.txt私钥可由WeBASE-Front导出,.pem/.p12私钥可由console控制台导出。如果需要导入自定义私钥,可根据节点前置导出的.txt私钥,编辑其中的privateKey字段内容。
导出私钥:可以选中导出.txt/.pem/.p12/WeID等格式的私钥,其中WeID格式私钥为十进制明文私钥,txt则是十六进制明文私钥;在代码中加载私钥可以参考节点前置-私钥加载
系统管理¶
系统管理目前支持权限管理、系统配置管理、证书管理的功能。
权限管理
基于FISCO BCOS 2.5.0及以上版本的基于角色的权限管理:支持链委员会管理和运维管理员管理:
- 链委员会管理:链委员会的修改操作均需要通过多个委员投票完成,链委员拥有投票权,可以增删节点、修改链配置、添加撤销运维、冻结解冻合约、对用户表的写权限控制;
- 修改委员会成员(新增/撤销委员)、修改委员投票阈值、修改委员投票权重值等操作均需要通过投票进行修改;
- 投票阈值为投票生效的阈值,有效投票权重数/委员总权重数>生效阈值投票才能生效,阈值为开区间,即:投票权重比例必须大于阈值(不包含等于);
- 每次投票操作,如果是委员投票,则记录操作内容和投票委员,不重复计票;
- 投票设置过期时间,根据块高,blockLimit的10倍(即10000),固定不可改;
- 用户不能同时成为链委员和运维管理员;
- 运维管理: 运维由链委员直接赋予(无需通过投票赋予),运维可以部署合约、创建表、管理合约版本、冻结解冻本账号部署的合约;
注:链委员会为空时,不作链委员会权限限制,所有用户拥有委员权限,可以自由给自身或其他用户添加链委员权限;设置了第一个链委员后,非链委员用户无权限;请妥善保管链委员的私钥!
运维管理员为空时,所有用户拥有运维权限;同理,设置了第一个运维管理员后,非运维用户无权限;
FISCO-BCOS基于角色的权限管理机制详情可以参考文档使用手册-基于角色的权限控制,具体的设计原理可以参考文档 系统设计-基于角色的权限控制
链委员会管理:
运维管理员管理:
基于FISCO BCOS 2.0.0 - 2.4.x版本的基于表的权限管理:支持链权限管理和普通权限(四种)管理:
- 链权限管理为分配权限的链管理员,可以使用权限分配功能,非链管理员账户无权限分配功能;
- 普通权限管理包含四种权限: 部署合约和创建用户表权限, 节点管理权限, CNS管理权限, 系统参数管理权限;
注:链管理员为空时,不作权限限制,所有用户拥有权限,可以自由给自身或其他用户添加权限;设置了第一个链管理员后,非管理员用户无权限分配功能;请谨慎设置第一个链管理员;
普通权限管理员为空时,所有用户拥有特定功能,如:节点管理员为空时,所有用户可以管理节点状态,设置了第一个节点管理员后,非节点管理员不可管理节点状态;
FISCO-BCOS基于表的权限管理机制详情可以参考文档FISCO-BCOS基于表的权限控制
链权限管理:
普通权限管理:
系统配置管理:系统属性包含FISCO-BCOS链的tx_count_limit和tx_gas_limit两种属性值的配置。注:一般不建议随意修改tx_count_limit和tx_gas_limit,如下情况可修改这些参数:
- 机器网络或CPU等硬件性能有限:调小tx_count_limit,降低业务压力;
- 业务逻辑太复杂,执行区块时gas不足:调大tx_gas_limit。
配置管理:
配置系统属性值:
证书管理:支持导入和查看证书信息,包括查看Front对应节点的链证书、机构证书、节点证书,可查看证书内容、证书有效期、证书链关系等信息;
- 证书链关系可通过比对父证书指纹与证书指纹查找;
- 平台将默认加载所有Front的证书,需要在Webase-Front配置文件中配置nodePath节点路径;
FISCO-BCOS证书说明可以参考FISCO-BCOS使用手册的证书说明
证书列表:
- 支持导出SDK证书:v1.5.0后支持导出节点前置的SDK证书zip包,可用于连接节点
导入证书:
应用管理¶
应用管理是WeBASE管理台提供的一种第三方应用接入功能。WeBASE作为底层运维平台,已经有了底层运维基础能力。各个应用可以利用这些基础能力来开发自己的运维管理台。这些可以利用的基础能力主要包括四个方面:1、链信息和链运维(权限,配置等);2、合约;3、链的私钥账号;4、管理账号(登录态)。
这样的主要好处是:
- 各应用的进程管理还是自我管理,避免WeBASE过于笨重
- WeBASE提供的是规范,方便其他应用参考打通应用与WeBASE的联系
- 如果有扩展,WeBASE也方便提供API来实现
- 不破坏各应用自身的完整性
管理台新增了应用管理菜单。新增应用有两种方式,一种是选择已有应用模板——目前仅支持WeID;另外一种是自定应用:
新增应用后,会生成应用相关的注册信息,为应用分配的appKey
(应用Key)和appSecret
(应用密码,应用自己保存,不要暴露),WeBASE的IP
为内网IP,访问不了的话需对应修改:
第三方应用未向WeBASE进行注册时,WeBASE管理台不可以通过应用链接跳转到应用服务:
第三方应用接入时,使用注册信息向WeBASE进行注册,调用相关OPEN API。第三方应用接入请参考【应用接入说明】。以下以 WeIdentity 可视化页面接入为例:
选择 WeID + WeBASE集成模式,从WeBASE复制注册信息:
点击下一步时,WeID会向WeBASE进行注册并调用相关API,从WeBASE获取群组、节点、证书等相关信息:
可以选择自动创建公私钥,或选择从WeBASE同步公私钥用户:
部署WeID之后,WeID会将合约相关信息通过API导入WeBASE:
第三方应用向WeBASE进行注册后,在WeBASE管理台可以通过应用链接跳转到应用服务:
注册后WeBASE将和应用间保持心跳。如果应用状态变成不能访问,则应用链接会置灰,变成不可跳转。
系统监控¶
系统监控包含了监控与异常告警两部分;
监控主要包括节点监控和主机监控,可以选择节点、时间范围等条件进行筛选查看:
- 节点监控主要有区块高度,pbftview,待打包交易;
- 主机监控主要有主机的CPU,内存,网络和硬盘IO;
节点监控:
主机监控:
异常告警部分主要包括邮件服务配置和告警类型配置:
邮件服务配置:
如何配置邮件服务可查看本文档末尾的附录-配置邮件服务指南
可配置邮件告警所用到的邮件服务器相关参数,包含邮件协议类型protocol、邮件服务器地址host、服务使用端口port、用户邮箱地址username、用户邮箱授权码password;鉴权选项包含Authentication验证开关authentication(默认开启);
- 邮件告警的邮箱协议类型默认使用SMTP协议,使用25默认端口,默认使用username/password进行用户验证,目前仅支持通过TLS/SSL连接邮件服务器;
- 目前仅支持更新原有的邮件服务器配置,不支持新增配置;
使用测试功能前,需要到“告警类型配置”中,在左上角**开启邮件服务总开关**;
注:邮件告警功能需要确保邮件服务器配置正确;务必使用测试
按键,向指定的邮箱地址发送测试邮件并查收邮件。如果配置错误,将发送测试邮件失败,指定邮箱将收不到测试邮件;
邮件服务配置测试:
以当前表单中输入的配置值发送测试邮件(无论是否已保存,都以表单中当前的值为配置发送测试邮件);需要提前开启邮件服务开关;
告警类型配置(告警邮件配置):
包含了告警类型的配置,告警日志的查看;可配置告警类型的参数值,包含告警邮件标题ruleName,告警邮件内容alertContent,告警邮件发送时间间隔alertIntervalSeconds(单位:秒),上次告警时间lastAlertTime,目标告警邮箱地址userList,是否启用该类型的邮件告警enable,告警等级alertLevel等;
- 包含了节点状态告警、审计告警、证书有效期告警三种;
- 目前仅支持更新原有的三个邮件告警的配置,不支持新增配置;
- 需要先在左上角开启邮件服务才可以开启各个类型的邮件告警以及发送测试邮件;
包含了不同告警类型的配置,左上角可以开启邮件服务(作为告警邮件的全局开关),点击告警标题可查看详细配置内容;
下方则是告警日志的内容,可查看告警邮件的具体内容;告警项已处理后,可以点击确认键确认已消除异常;
其中在WeBASE-Node-Manager的配置文件application.yml的constant可以配置定时任务定时监控节点状态、审计状态、证书有效期的频率,监控到异常状态时将触发邮件告警,发送告警邮件到联系人邮箱,同时按配置的间隔时间定时重复发送告警邮件,直到异常状态消除;
注:定时任务的频率为检查系统是否异常的频率,而配置不同的告警类型中的告警时间间隔是发送告警邮件的频率,如,设置检查频率为1h,配置的告警频率为6h,那么,系统会每小时检查一次系统状态,若出现异常,在定时任务检查到异常时,距离上次告警邮件超过6小时,则会发送一次告警邮件。
点击修改可以修改配置项的值,启用/禁用不同类型的告警,修改配置后不需要重启即可生效;
注:修改告警内容时,大括号{}
以及里面的变量名不可去除,否则无法正常发送告警邮件。
交易审计¶
联盟链中各个机构按照联盟链委员会制定的规章在链上共享和流转数据。这些规章往往是字面的,大家是否遵守缺乏监管和审计。因此为了规范大家的使用方式,避免链的计算资源和存储资源被某些机构滥用,急需一套服务来辅助监管和审计链上的行为。交易审计就是结合上面的区块链数据,私钥管理和合约管理三者的数据,以区块链数据为原材料,以私钥管理和合约管理为依据做的一个综合性的数据分析功能。交易审计提供可视化的去中心化合约部署和交易监控、审计功能,方便识别链资源被滥用的情况,为联盟链治理提供依据。
交易审计主要指标:
主要指标 | 指标描述 |
---|---|
用户交易总量数量统计 | 监控链上各个外部交易账号的每日交易量 |
用户子类交易数量统计 | 监控链上各个外部交易账号的每种类型的每日交易量 |
异常交易用户监控 | 监控链上出现的异常交易用户(没在区块链中间件平台登记的交易用户) |
异常合约部署监控 | 监控链上合约部署情况,非白名单合约(没在区块链中间件平台登记的合约)记录 |
用户交易审计:可以指定用户、时间范围、交易接口进行筛选查看交易
异常用户审计:
异常合约审计:
订阅事件¶
订阅事件管理:可查看前置中已订阅的链上事件通知,包括出块事件列表和合约Event事件列表。详情请参考节点前置-链上事件订阅和通知
出块事件列表:
出块事件列表
合约Event事件列表:
合约Event事件列表
账号管理¶
账号管理提供管理台登陆账号的管理功能。管理台用户分为三种角色:
普通用户,只有查看权限;
管理员用户,拥有管理平台的读写权限;
开发者用户,拥有开发者自身的合约和私钥用户的读写权限,数据概览权限;
开发者模式默认关闭。如需开启此功能,可以在WeBASE-Node-Manager配置文件application.yml中修改developerModeEnable为true,然后重启服务。
注:此处账号与私钥管理的私钥用户为两种不同的概念,账号用于管理台权限控制,私钥用户为区块链账户。
账号管理:
添加登陆账号并指定账号类型:
群组管理¶
群组管理提供动态管理群组的功能,包含:生成群组(生成群组配置文件到单个或多个节点)、启动群组、停止群组、移除群组(标记为移除)、恢复群组、删除群组数据等操作
群组管理入口位于右上角切换群组的下拉窗口中:
进入群组管理后,可以看到群组列表中有“运行”、“维护中”、“异常”的三种状态。
- 正常运行的群组为“运行”;
- 群组中所有节点(节点前置)已停止了群组,会显示为“维护中”,此时只需要将节点的群组重新启动即可恢复正常;
- 本地群组数据与链上数据冲突时,会显示为“异常”:
- 若本地群组的区块数据与链上区块数据存在冲突,如搭建了新的链而后台数据库没有重置,或者群组的所有前置处于异常状态,则会显示群组为异常;
- 如果同一个群组编号的不同节点之间创世块的配置不同,即群组同名,但各节点的群组创世块不同,也会标记该群组为异常。在群组显示异常时,需要用户检查前置状态,如重建链了,可通过删除群组数据重新拉取来恢复正常,如创世块冲突,则需要删除冲突的节点前置;
删除群组数据,将删除后台数据库中保存的群组数据,不会删除链数据。
如果未停止所有节点的群组就删除群组,会在删除后重新拉取数据
下面介绍如何进行动态群组管理,包含在多个节点中批量生成群组、节点加入已有群组:
批量生成群组
选中节点后,生成群组将自动创建群组、启动群组、并通过创世块配置将节点设置为共识节点
如下图,可以选中需要创建新群组的节点,点击确认后即可完成创建
节点加入已有群组
点击群组状态/修改群组,可以查看群组中各个节点的状态;也可以在该页面启动/停止/删除/恢复节点的群组,或添加节点到已有群组
不属于当前群组的节点中会显示“添加”,可以将节点加入该群组;
该操作实际上包含三个步骤,创建与启动是加入的同时自动完成的,用户需要确保新节点加入新群组的共识节点/观察节点
- 加入群组操作会在该节点的conf目录下生成群组创世块文件,并启动群组
- 创世块文件的配置需和加入群组的原有配置完全一致,可通过群组列表中导出配置后导入配置,或到群组中节点conf目录下查看群组的时间戳与共识节点列表
- 创建并启动群组后,需要将节点加入到新群组的共识节点/观察节点:
- 若本地有新群组的节点前置,则可以通过切换到相应群组的“节点管理”中设置新节点为共识节点;
- 如果本地没有新群组的节点前置,则需要到已加入该群组的节点的控制台或节点管理平台将新节点加入到共识节点/观察节点
加入新群组的共识节点/观察节点说明,或直接继续添加节点到新群组
填写已有群组的创世块文件配置,包含时间戳与共识节点NodeId列表,如下图:
注,创世块是群组的标志。新节点加入群组需保证创世块的nodeIdList
完全一致,例:若已有群组的共识节点列表只有node0,当node1加入该群组时,创世块配置的共识节点列表仍填写只有node0的列表,然后再通过节点管理将新节点node1动态添加到该群组。如果错填成包含node0和node1的共识节点列表,那么将生成一个和当前群组同名,但创世块完全不同的新群组。而群组管理会监控到同名群组的创世块存在冲突,标志群组为“异常”。
节点加入新群组后,如果节点未添加到共识节点/观察节点,所属群组一列将显示为横杠;已加入的节点该列会显示具体的群组编号
在右上角切换到新群组后,在“节点管理”页面中可以将游离的新节点加入到共识节点/观察节点中
详情使用说明可以参考本文档附录-动态群组管理使用指南
数据监控大屏¶
数据监控大屏页面的入口位于WeBASE管理台的左上角,点击“数据大屏”即可进入数据监控大屏,适用于企业级控制中心需要全局监控链状态数据的场景。
- 数据大屏每次仅展示单个群组的数据,并定时访问后台刷新数据。
在“节点管理”中,可以点击节点列表中的“备注”按钮,为数据大屏中的节点配置IP地址、机构名与城市。
在右上角的“群组管理”中,可以点击群组列表的“备注”按钮,为数据大屏中的群组配置群组应用名(标题)
升级兼容说明¶
v.1.5.0后,通过一键部署的WeBASE可以使用一键升级中提供的一键脚本对已有的WeBASE进行升级
WeBASE-Front升级至最新版,可查看节点前置升级说明,请结合WeBASE-Front Changelog进行阅读
WeBASE-Node-Manager升级至最新版,可查看节点管理服务升级说明,请结合WeBASE-Node-Manager Changelog进行阅读
WeBASE-Sign升级至最新版,可查看签名服务升级说明,请结合WeBASE-Sign Changelog进行阅读
附录¶
配置邮件服务指南¶
请先阅读本文档中管理平台使用手册的各模块的详细介绍-系统监控-邮件服务配置
问:邮件服务怎么用?
答:在后台搭建邮件服务(邮箱服务器),用于后台监控到系统异常情况时,发送告警邮件到指定邮箱,方便运维;
下面介绍具体的使用方法:
邮件服务所使用的邮箱服务器:
- 企业可使用自行搭建的邮箱服务器;
- 普通用户可以使用QQ邮箱、网易邮箱等第三方邮箱;
开通邮箱服务¶
163邮箱开通邮箱服务:
- 登陆邮箱后,在邮箱的
设置
中找到包含SMTP
的设置项;
- 勾选
IMAP/SMTP
和POP3/SMTP
,初次开启时,会提醒用户设置授权码,并进行手机安全验证; - 设置授权码后,勾选
IMAP
,POP3
,SMTP
开启全部服务;
QQ邮箱开通邮箱服务:
- 登陆邮箱后,在邮箱的
设置账户
中找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
项;
- 开启
POP3/SMTP服务
和IMAP/SMTP服务
并按照指引进行手机安全验证并设置授权码,;
配置邮件服务¶
记下所设置的授权码,授权码即邮件服务中用到的“密码”,按照本文档各模块介绍-系统监控进行配置:
第一步,进入“告警类型配置”中,点击左上角“启用告警”以开启邮件服务开关
第二步,进入“邮件告警配置”,配置邮件服务
- 因为Node-Manager仅使用邮箱服务器的发件服务,因此协议类型填写
smtp
(IMAP/POP3均为收件服务协议); - 邮箱服务器填写
smtp.xx.com
,端口号默认为25
即可启用邮件服务;如需使用其他端口如465则需要开放WeBASE-Node-Manager所在服务器的相应端口限制; - 用户名填写邮箱地址,密码填写上文设置的授权码;
配置完成后,点击“测试”后,输入接收测试邮件的邮箱地址,测试成功即可“保存”邮件服务的配置;
注意事项¶
“邮件告警配置”中填写的端口默认为25,在不同服务器环境和不同邮箱所需的端口号有所差异,如果需要开启SSL进行邮箱安全验证则需要开通服务器防火墙相应的端口号。
目前已知的包含:
- SMTP协议:默认使用25端口(非SSL),SSL默认465端口(SSL)或587端口(TLS)
- POP3/IMAP协议:因为邮箱服务使用的是发邮件功能,未用到POP3或IMAP收件协议,此处仅作端口说明:其中POP3默认110端口(非SSL)和995端口(SSL),IMAP默认143端口(非SSL)和993端口(SSL)
- 126邮箱的SSL端口除了587,还可尝试994;在阿里云下25端口被禁用,请尝试587端口或其他端口;
动态群组管理使用指南¶
v1.3.1新增的动态群组功能支持用户在可视化页面中动态管理群组,包括创建多个节点的群组、节点加入已有群组等功能。群组模块介绍可参考本文档群组管理
注:动态群组管理要求各节点间已建立了P2P连接
群组管理入口
群组管理页面
下面我们使用2个节点管理平台,4个节点前置,每个管理台包含两个前置来展示:
管理台1中包含前置A和B,管理台2中包含前置C和D:
管理台1:
管理台2:
群组管理与群组配置文件¶
动态创建群组包含三个基本操作:创建群组、启动群组、节点加入群组共识
注:节点的动态群组操作是针对单个节点进行的,即,如果创建一个新群组包含4个节点,则需要对4个节点分别调用“创建”、“启动”命令;如果需要查询群组中各节点的群组状态,也需要对4个节点轮询获取群组状态。
WeBASE已对这一步骤进行了封装,自动批量调用各个节点前置的“创建”、“启动”和“查询群组状态”的接口。
操作群组的状态转换如下图:
创建群组:
- 创建群组实际上是调用节点的
generateGroup
JSON RPC接口,传入参数timestamp
和sealers
(WeBASE中为nodeList
),并在节点的conf目录下生成群组配置文件group.x.genesis
和group.x.ini
- 其中
group.x.genesis
是群组的创世块配置,包含timestamp
和sealers
,,该配置一旦启动群组之后就不能再修改,否则引起群组异常。详情可以参考文档FISCO BCOS-配置文件与配置项
启动群组:
- 启动群组是将节点的群组状态标记为“RUNNING”
- 启动后,节点进程将读取上文的
group.x.genesis
中的sealers
项,将sealers
中的所有节点设置为共识节点,开始共识
例如:
- 如果需要动态创建一个4节点的群组时,需要设置4个节点均为共识节点,可以在
sealers
中加入所有共识节点,然后启动各个节点的群组即可。 - 但是,如果创建群组时只将其中2个节点设置为
sealers
,那么,另外2个节点需要加入该群组时,调用创建群组接口时,需要传入相同的sealers
,即传入相同的群组原配置中的2个节点,创建群组并启动后,需要通过“节点管理”(addSealer/addObserver
接口)将新节点加入共识。不可修改该群组的sealers
配置,否则将引起群组异常。
下面我们通过单个管理台批量创建群组和多个管理台创建群组并加入群组这两个例子来了解动态群组管理的操作步骤与注意事项
单个节点管理台-批量创建群组¶
此处采用单个节点管理台,两个节点前置,动态创建一个2节点的群组group333
我们在管理台1中将在节点A和节点B中生成群组group333
具体操作如下:
批量创建群组指的是向group.x.genesis-sealers
中包含的所有节点前置发起创建群组的请求(群组的创世块配置如下所示),这要求所有节点的前置在同一个管理台里,才能一次性对所有节点发起创建群组的请求。
若节点分布在多个管理台中,则参考下一小节。
{
// timestamp
"groupTimestamp": "1591013023063",
// 群组333共识节点列表
"nodeIdList": [
// node A
"31e2b051abc27b49aff8846a4037e8bdb45acd6ff98fdad42f7b8a9c4887fffcc99edbf4eeafff656f00df07f44ae3609463a7ddc3ba8481f88b43424007fafe",
// node B
"c867302e786a790663c5cf6fdbbff96570d00a3500b23c9ddd2dd63ada07b85fbc6f4549a9f05cad60bcf7a6199caa95781fd40a25e9098a2c728b90d88938f8"
]
}
选中管理台的两个节点后,将分别对这两个节点发起创建群组、启动群组的请求
创建成功后,可以看到节点A和节点B的group333已处于running状态,且两个节点已经参与新群组group333共识了(橙色区域);
但是可以看到节点列表中还有两个外部节点;节点A、B的群组编号中显示了号码,则代表该群组属于群组的共识节点/观察节点,否则显示”-“代表是游离节点,仅有P2P连接;
下一步,我们将处于管理台2的节点C和节点D也加入到这个群组333中来,因此我们进入下一小节,多个管理台之间创建群组,最终实现如下图的状态:
多个节点管理台-创建群组并加入群组¶
此处例子使用两个节点管理台,而更复杂情况可以以此类推。
我们在上面通过管理台1创建了一个由节点A和节点B组成的新群组group333,现在我们把管理台2的节点C和节点D加入到管理台1中创建的群组group333,实现下图的效果,节点C/D的group333处于running状态,且加入group333的共识
具体操作如下:
在管理台1中,进入群组管理,导出群组group333的配置内容
返回到管理台2的界面中,点击“加入已有群组按钮”
加入群组时,用户需要再加入群组后,手动将群组的新节点添加为共识/观察节点;
点击加入已有群组后,导入群组group333的配置;也可以直接键入群组编号、群组时间戳、创世块共识节点列表
选中需要加入该群组的节点后,点击确定;
创建成功后,可以看到群组列表新增了一个group333,节点C/D的group333处于running状态
点开可以查看新群组的节点,可以看到节点C和节点D的“群组编号”为空,即未参与群组共识
注:加入群组后,需要手动将新节点加入到群组的共识/观察节点,节点才会参与新群组的共识。
因此,下面我们把节点C和节点D加入到新群组的共识/观察节点列表
由于管理台2中没有已属于群组共识/观察节点的节点,因此需要进入管理台1,切换右上角到群组group333,然后将新加入群组的节点C和节点D修改为共识节点/观察节点。 (修改节点类型需要管理员权限私钥,如果未启用首个管理员,则任意私钥即可修改)
全部修改为观察节点后
点击进入群组管理中,查看群组的节点状态,节点C和节点D的“群组编号”已显示333,代表修改成功了
即如下图所示,节点C/D都已加入群组group333的共识
至此,四个节点A/B/C/D成功通过动态群组管理加入到新群组group333中并参与共识了
其他情况¶
- 案例1:管理台2中先创建含有节点C的群组group9后,然后将节点D加入group9;
如果管理台2中的节点C已在新群组group9中,需要将节点D加入该群组,当前群组拓扑如下
可以通过点击群组列表中的群组,点击“添加”,按照与上文类似的提示即可添加成功。
此时节点D的group9状态为running
添加完成后,右上角切换到对应的群组group9,到“节点管理”页,将该节点设置为共识/观察节点(需要创建私钥用户来发交易),即完成加入群组的操作
节点D加入群组group9成功
修改节点D的节点类型为观察节点
点开群组管理中的group9查看节点状态,可以看到节点C和节点D的群组编号已经显示为”9”,说明节点D已成功加入群组group9
至此,节点C/D的群组group9如下图所示,都处于running状态,且都已参与群组group9的共识
- 案例2:管理台1中先创建共识节点包含四个节点A/B/C/D的群组group10后,在管理台2将节点C/D直接加入group10,省略加入为共识/观察节点步骤;
如果一次性创建一个4节点的新群组group4,需要把4个节点的前置都加入到同一个节点管理台,此时,由于nodeList
中已经设置了4个节点均为共识节点,只需要分别到两个管理台中,通过“加入已有群组”中填入一致的配置,即可创建群组,并可以省去上文的“加入群组共识”这一步了
如下图所示,先将创建一个群组group10,在共识节点列表写入所有节点的nodeId。可以看到group10包含了所有节点,但是节点C/D的群组尚不存在
我们通过管理台1中的“加入已有群组”来自定义共识节点列表,在节点列表中包含所有的4个节点A/B/C/D,然后生成群组group10
{
"groupId": 10
"groupTimestamp": "1591079269841",
"nodeIdList": [
"a95ff41839bd9f4576138833a36c4e48e0268dda6ab77ecca468c4f50454ca4faf6609cc7c8126c439380d1df462c098369eea8feff4c9e22e35bfc830818d3d",
"16f6882456e7f05ca90cbe3ca1dbdb49ca84702ccfd0cebb5894624ec475d5ae7b504a136aca2559fdf4e4c27dce7c72a674d0dd3ae339ba6a3a0906a0072aa8",
"31e2b051abc27b49aff8846a4037e8bdb45acd6ff98fdad42f7b8a9c4887fffcc99edbf4eeafff656f00df07f44ae3609463a7ddc3ba8481f88b43424007fafe",
"c867302e786a790663c5cf6fdbbff96570d00a3500b23c9ddd2dd63ada07b85fbc6f4549a9f05cad60bcf7a6199caa95781fd40a25e9098a2c728b90d88938f8"
]
}
我们点开群组列表中的群组group10,可以看到4个节点的群组编号已经显示了”10”,说明4个节点都已经在群组group10的共识节点了。
注:如果采用PBFT共识,此时节点C/D已加入了群组group10,但仍未加入共识,将不满足3F+1>N
的共识准则,导致群组共识异常。将节点C/D创建群组后即可消除异常
下一步我们只需要按照上文所说的,导出当前群组group10的配置文件,在管理台2中导入配置,选中剩余的节点C和节点D,点击确定
进入管理台2,点击“加入已有群组”
加入完成后
操作完成后,如下图所示,节点C/D的群组group10也生成并出于running状态了,至此,我们就顺利完成创建群组group10的所有操作了!
合约Java项目脚手架¶
在合约IDE的右上角支持导出已编译合约的Java项目脚手架,在导出时,填入项目名、选择节点前置(脚手架将使用该前置的SDK证书)、选择一个或多个私钥用户后,选中一个或多个合约(未编译的合约选中后将尝试自动编译),点击确定即可导出。
比如,我们使用合约仓库中的Asset积分合约模板导出,得到合约对应的Java项目脚手架如下图所示,service
中包含了各个合约的Service类与Service实例管理类、config
中包含了初始化FISCO-BCOS JAVA-SDK与初始化合约地址、私钥用户等的配置,raw
中包含了未封装的合约Java类,model
中将包含合约Service中所用到的入参实体类。
脚手架中提供了gradle-wrapper构建工具,在linux环境下为例,可以直接执行下面的命令构建一个安装包dist
(已安装gradle 5.6以上版本,也可以直接使用gradle
命令构建)。
$ chmod +x ./gradlew
$ ./gradlew build -x test
# 得到一个dist包
$ ls
build build.gradle dist gradle gradlew gradlew.bat settings.gradle src
由于通过WeBASE导出的该脚手架自动在conf/application.propertiest
中自动配置了节点的IP和channelPort,并自动配置了节点的SDK证书
因此,我们可以进入dist
安装包中,直接执行jar文件即可启动项目连接到节点中
$ cd dist
$ ls
abi application.properties bin conf demo-exec.jar
# 执行jar包
$ java -jar demo-exec.jar
若执行jar时,提示java.io.IOException: Stream closed错误,可忽略该错误
脚手架使用过程Q&A¶
使用maven时编译报错¶
Q1:从webase 导出java工程默认是gradle 打包目录结构,可以替换成maven版本。eclipse运行的时候报如下错误
image
A1:造成该原因是代码编辑器问题,默认导出是IDEA的,需要引入相关的依赖
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.5.21</version>
</dependency>
如何指定合约调用方¶
Q2:WEBASE导出的Java工程,有些合约方法是需要手动指定调用方的(指定私钥),比如合约有个sign方法,在生成的Java工程的raw包下的Service中 sign 方法如下
public TransactionReceipt sign(String _certificateNumber) {
final Function function = new Function(
FUNC_SIGN,
Arrays.<Type>asList(new Utf8String(_certificateNumber)),
Collections.<TypeReference<?>>emptyList());
return executeTransaction(function);
}
但是sign方法的调用方却需要手动指定,如何指定?
A1:可以根据导出的Java工程raw包下的合约service 的构造器,构造一个传入调用方私钥的对象然后调用,部分代码如下
// 1. 获取用户私钥信息,调用WEBASE-SDK 的newUser方法会得到用户私钥信息,存入业务表。得到的privateKey 是base64编码格式
UserInfoEntity dbUser = userInfoDao.selectById(userId);
String privateKey = dbUser.getPrivateKey();
// 2. 将上步的私钥base64转16进制
String hexPrivateKey = new String(Base64.getDecoder().decode(privateKey));
// 3. 加载私钥方法获取CryptoKeyPair对象,以非国密为例
CryptoKeyPair loadAccountFromHexPrivateKey = loadAccountFromHexPrivateKey(CryptoType.ECDSA_TYPE, hexPrivateKey);
// 4. 传入私钥对象来构造一个MarriageEvidence对象,并调用sign方法
MarriageEvidence marriageEvidence = new MarriageEvidence(template.getContractAddress(), client, loadAccountFromHexPrivateKey);
TransactionReceipt sign = marriageEvidence.sign(req.getCertificateNumber());
private CryptoKeyPair loadAccountFromHexPrivateKey(int cryptoType, String hexPrivateKey) {
// 根据cryptoType创建cryptoSuite,cryptoType目前支持:
// 1. CryptoType.ECDSA_TYPE: 用于创建非国密类型的CryptoSuite
// 2. CryptoType.SM_TYPE: 用于创建国密类型的CryptoSuite
CryptoSuite cryptoSuite = new CryptoSuite(cryptoType);
// 从十六进制私钥字符串hexPrivateKey加载私钥对象
return cryptoSuite.getKeyPairFactory().createKeyPair(hexPrivateKey);
}
WeBASE合约仓库¶
合约仓库内置于WeBASE-Front与WeBASE管理平台中。其中提供常用的工具合约和推荐应用合约模板,用户可将合约导入到自己目录进行引入。
合约仓库贡献者¶
贡献者名称 | github账号 | 贡献工程 |
---|---|---|
刘明臻 | https://github.com/mingzhenliu | 存证合约仓库 |
肖东 | https://github.com/xiaomdong | 代理合约仓库 |
工具合约¶
Address¶
Address library
Address contract usage methods can refer to the Points contract warehouse。
- Detect whether the address is a contract
- Detect if the address is 0x0
String library¶
String library
Provides common string-related operations, including copying, finding, replacing, and so on。
Roles¶
Role permissions control contracts
SafeMath¶
SafeMath library
A secure mathematical library that provides a safe addition, subtract, and divide。The use of secure mathematical contracts can refer to the Points contract warehouse。
table¶
table library
BCOS CRUD uses the base library, which you can reference by re-contract calling CRUD.Table contract usage methods can be described by referring to the assat example in the bcos document https://fisco-bcos-documentation.readthedocs.io.
存证合约模板¶
简介¶
Evidence 示例合约,使用分层的智能合约结构:
- 工厂合约(EvidenceSignersData.sol),由存证各方事前约定,存储存证生效条件,并管理存证的生成。
- 存证合约(Evidence.sol),由工厂合约生成,存储存证id,hash和各方签名(每张存证一个合约)。
使用步骤:¶
- 部署EvidenceSignersData合约,并在构造函数中指定存证生效条件(需要哪些机构进行认证确认)。
- 存证时通过newEvidence接口在区块链上创建具体存证合约。
- 解析newEvidence调用返回的receipt,将解析出来的存证合约地址保存在应用系统。
- 仲裁等认证机构利用存证合约地址调用addSignatures来对存证进行确认。
- 取证时利用存证合约地址调用getEvidence接口进行取证。
积分合约模板¶
简介¶
BAC001 是一套区块链积分合约,可以积分相关的增发,销毁,暂停合约,黑白名单等权限控制。
四个基本元素¶
description
此积分的具体描述
shortName
积分简称
minUnit
积分最小单位
totalAmount
积分总数量
五个基本行为:¶
发行
调用合约的 deploy 方法,传入你初始化的四个元素即可,即在区块链上发行了你指定总量和名称的积分。
- 其中 minUnit 和 totalAmount 不能为负数或小数
转账
调用 send 方法即可实现转账,之后调用 balance 方法可以查看自己的积分余额
增发
调用 issue 方法特定地址增发积分, 并可以通过 addIssuer 增加有权限增发积分的人,也可以通过renounceIssuer 方法移除增发权限
销毁
调用 destory 以及 destoryFrom 销毁自己地址下积分和特定地址下的积分
暂停
遇到紧急状况,你可以调用 suspend 方法,暂停合约,这样任何人都不能调用 send 函数。故障修复后,可以调用 unSuspend 方法解除暂停。也可以通过 addSuspender 和 renounceSuspender 相应增加和移除暂停者权限
使用样例伪码¶
// 示例中Alice和Bob都为一个外部账号地址。
// 部署合约,即初始化积分,示例初始化信息如下:
// 积分描述:car points
// 积分简称 TTT
// 最小转账单位 1
// 发行总量10000000
// 默认合约部署者为第一个发行者
BAC001 bac001 = BAC001.deploy(web3j, credentials,
contractGasProvider, "car points", "TTT", BigInteger.valueOf(1), BigInteger.valueOf(1000000)).send();
String contractAddress = bac001.getContractAddress();
// 增加积分发行者
bac001.addIssuer(Alice).send();
// 增发积分
bac001.issue(Alice, new BigInteger("10000"),"increase 10000 asset ").send();
// 积分转账,以及积分转账备注 Owner -> Alice
bac001.send(Alice,new BigInteger("10000"),"dinner Points").send();
// 查询积分余额
assertEquals( bac001.balance(Alice).send().toString(),"30000");
接口说明¶
totalAmount()
返回积分总量
- 这里的积分总量需要计算最小转账单位,所以实际返回值为 totalAmount * 10minUnit
balance(address owner)
返回owner的帐户的积分余额
send(address to, uint256 value , string data)
将数量为value的积分转入地址 to 并触发 transfer 事件, data 是转账备注
- suspend 状态下无法进行此操作
- 请避免 to 为自身进行操作
sendFrom(address from,address to,uint256 value,string data))
将地址 from 中的 value 数量的积分转入地址 to ,并触发 transfer 事件,data 是转账备注。
- 方法的调用者可以不为 from, 此时需要预先进行 approve 授权
- from 不能为调用者自身地址,否则会报错
- suspend 状态下无法执行此操作
safeSendFrom(address from, address to, uint256 value, string data)
安全的将地址 from 中的 value 数量的积分转入地址 to ( to如果是合约地址,必须实现接收接口 BAC001Holder 才可以接收转账) ,并触发 transfer 事件,data 是转账备注
- suspend 状态下无法执行此操作
safeBatchSend( address[] to, uint256[] values, string data)
批量将自己账户下的积分转给 to 数组的地址, to 和 values 的个数要一致
- suspend 状态下无法执行此操作
approve(address spender,uint256 value)
允许 spender 从自己账户提取限额 value 的积分
- 此方法配合 sendfrom / safesendfrom 一起使用
- 重复授权时,最终授权额度为最后一次授权的值
allowance(address owner,address spender)
返回 spender 可从 owner 提取的积分数量上限
- 此方法配合 approve 一起使用
increaseAllowance(address spender, uint256 addedValue)
允许 spender 提取的积分上限在原有基础上增加 addedValue
- 此方法配合 approve 使用
decreaseAllowance(address spender, uint256 subtractedValue)
允许 spender 提取的积分上限在原有基础上减少 subtractedValue
- 此方法配合 approve 使用
minUnit()
积分最小单位
shortName()
积分简称
description()
积分描述
destory(uint256 value, string data)
减少自己的积分,data 是转账备注
- 调用时,value 值需要小于等于目前自己的积分总量
destroyFrom(address from, uint256 value, string data)
减少地址 from 积分,data 是转账备注
- 调用此方法时,需要配合 approve 进行使用
issue(address to, uint256 value,string data)
给地址 to 增加数量为 value 的积分,data 是转账备注
isIssuer(address account)
检查 account 是否有增加积分的权限
addIssuer(address account)
使地址 account 拥有增加积分的权限
renounceIssuer()
移除增加积分的权限
suspend()
暂停合约
- suspend 后无法进行 send / safesendfrom / sendfrom / safeBatchSend / approves 操作
unSuspend()
重启合约
suspended
判断合约是否处于暂停状态
isSuspender(address account)
是否有暂停合约权限
- 配合 suspend 方法一起使用
addSuspender(address account)
增加暂停权限者
- 配合 suspend 方法一起使用
renounceSuspender()
移除暂停权限
- 配合 suspend / addSuspender 方法使用
使用WeBASE开发区块链应用¶
登录WeBASE管理平台进行配置¶
安装WeBASE完成后,需要将节点信息添加到WeBASE平台中,这样WeBASE才可和节点进行通信。需要添加的信息包含节点信息,生成用户的私钥等。如下图所示:
- 节点信息:
[节点]
- 私钥用户:
[私钥用户]
开发智能合约¶
以HelloWorld.sol为例
pragma solidity ^0.4.2;
contract HelloWorld{
string name;
function HelloWorld(){
name = "Hello, World!";
}
function get()constant returns(string){
return name;
}
function set(string n){
name = n;
}
}
- 通过智能合约IDE部署合约,并获取合约地址等信息,
[合约]
应用层开发¶
- 调用交易接口
请参考交易接口
从IDE中的输出信息,拷贝合约地址,合约名,方法名等信息,同时获取用户的公钥地址信息,调用交易接口。 具体代码请参考 HelloWorld范例
- 主要代码
application.yml
transactionUrl: http://127.0.0.1:5002/WeBASE-Front/trans/handle
groupId: 1
userAddress: "0x4f08eac5af5e77b7006d11bee94adba2f721def8"
useAes: true
contract.name: HelloWorld
contract.address: "0xca597170829f4ad5054b618425a56e0be23cbc55"
contract.funcName: set
contract.funcParam: "[\"abc\"]"
- TransactionService.java
@Slf4j
@Data
@Service
public class TransactionService {
@Autowired
private RestTemplate rest;
@Value("${transactionUrl}")
private String url;
@Value("${userAddress}")
private String user;
@Value("${groupId}")
private int groupId;
@Value("${useAes}")
private Boolean useAes;
@Value("${contract.name}")
private String contractName;
@Value("${contract.address}")
private String contractAddress;
@Value("${contract.funcName}")
private String funcName;
@Value("${contract.funcParam}")
private String funcParam;
public void sendTransaction() {
try {
TransactionParam transParam = new TransactionParam();
transParam.setGroupId(groupId);
transParam.setContractAddress(contractAddress);
transParam.setUseAes(useAes);
transParam.setUser(user);
transParam.setContractName(contractName);
transParam.setFuncName(funcName);
transParam.setFuncParam(JSONArray.parseArray(funcParam));
log.info("transaction param:{}", JSON.toJSONString(transParam));
Object rsp = rest.postForObject(url, transParam, Object.class);
String rspStr = "null";
if (Objects.nonNull(rsp)) {
rspStr = JSON.toJSONString(rsp);
}
log.info("transaction result:{}", rspStr);
} catch (Exception ex) {
log.error("fail sendTransaction", ex);
}
System.exit(1);
}
}
节点前置服务¶
概要介绍¶
使用说明¶
WeBASE-Front是和FISCO-BCOS节点配合使用的一个子系统。此分支支持FISCO-BCOS 2.0以上版本,集成web3sdk,对接口进行了封装,可通过HTTP请求和节点进行通信。另外,具备可视化控制台,可以在控制台上开发智能合约,部署合约和发送交易,并查看交易和区块详情。还可以管理私钥,对节点健康度进行监控和统计。
WeBASE-Front使用方式有以下三种:
1、单独部署作为独立控制台使用,请参考部署说明。
2、结合WeBASE-Node-Manager和WeBASE-Web服务一起部署使用,请参考WeBASE安装部署。
3、结合WeBASE-Sign服务一起部署使用,调用WeBASE-Sign进行数据签名,再发送上链。此方式在方式1的基础上再部署WeBASE-Sign服务,然后需调用合约部署(结合WeBASE-Sign)接口、交易处理(结合WeBASE-Sign)接口进行合约部署和调用(需要在yml中配置sign的地址)。
部署说明¶
1. 前提条件¶
依赖软件 | 支持版本 |
---|---|
Java | Java 1.8或以上版本 |
FISCO-BCOS | v2.0.0及以上版本 |
备注: Java推荐使用OracleJDK,可参考JDK配置指引(CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK无法正常连接区块链节点)
solidity v0.6.10支持¶
WeBASE-Front v1.4.2已支持solidity v0.5.1
和v0.6.10
2. 拉取代码¶
执行命令:
git clone https://github.com/WeBankBlockchain/WeBASE-Front.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Front.git
进入目录:
cd WeBASE-Front
git checkout lab
3. 编译代码¶
使用以下方式编译构建,如果出现问题可以查看 常见问题解答 :
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Front下生成已编译的代码目录dist。
4. 修改配置¶
(1)进入dist目录
cd dist
dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp -r conf_template conf
(2)进入conf目录:
cd conf
注意: 将节点所在目录nodes/${ip}/sdk
下的所有文件拷贝到当前conf
目录,供SDK与节点建立连接时使用(SDK根据application.yml中的useSmSsl
判断是否使用国密SSL)
- 链的
sdk
目录在非国密时,包含ca.crt, sdk.crt, sdk.key
,在国密时,包含sm_ca.crt
,sm_sdk.crt
,sm_sdk.key
,sm_ensdk.crt
,sm_ensdk.key
- 拷贝命令可使用
cp nodes/${ip}/sdk/* ./conf/
(3)修改配置(根据实际情况修改):
如果在企业部署中使用WeBASE-Front,必须配置下文中的keyServer
,用于连接WeBASE-Sign服务
vi application.yml
spring:
datasource:
url: jdbc:h2:file:./h2/webasefront;DB_CLOSE_ON_EXIT=FALSE // 默认H2库为webasefront,建议修改数据库存放路径
...
server:
port: 5003 // 服务端口
context-path: /WeBASE-Front
sdk:
...
ip: 127.0.0.1 // 连接节点的监听ip
channelPort: 20200 // 连接节点的链上链下端口
certPath: conf // sdk证书的目录,默认为conf
constant:
keyServer: 127.0.0.1:5004 // 密钥服务的IP和端口(WeBASE-Node-Manager服务或者WeBASE-Sign服务,不同服务支持的接口不同),如果作为独立控制台使用可以不配置
aesKey: EfdsW23D23d3df43 // aes加密key(16位) 如启用,各互联的子系统的加密key需保持一致
transMaxWait: 30 // 交易最大等待时间
...
5. 服务启停¶
返回到dist目录执行:
启动: bash start.sh
停止: bash stop.sh
检查: bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启提示服务进程在运行,则先执行stop.sh,再执行start.sh。
启动成功将出现如下日志:
...
Application() - main run success...
6. 访问控制台¶
http://{deployIP}:{frontPort}/WeBASE-Front
示例:http://localhost:5002/WeBASE-Front
- 部署服务器IP和服务端口需对应修改,网络策略需开通
- 基于可视化控制台,可以开发智能合约,部署合约和发送交易,并查看交易和区块详情。还可以管理私钥,对节点健康度进行监控和统计
7. 查看日志¶
在dist目录查看:
前置服务全量日志:tail -f log/WeBASE-Front.log
前置服务错误日志:tail -f log/WeBASE-Front.log
web3连接日志:tail -f log/web3sdk.log
接口说明¶
1. 合约接口¶
1.1. 发送abi接口¶
接口描述¶
根据abi内容判断合约是否已部署,未部署则生成对应abi文件
接口URL¶
http://localhost:5002/WeBASE-Front/contract/abiInfo
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | address | String | 是 | ||
4 | 合约abi | abiInfo | List | 是 | abi文件里面的内容,是一个JSONArray | |
5 | 合约bin | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin) | |
6 | 所在目录 | packageName | String | 是 | 生成java所在的包名 |
2)数据格式
{
"abiInfo": [
{
"anonymous": true,
"constant": true,
"inputs": [
{
"components": [
null
],
"dynamic": true,
"indexed": true,
"internalType": "string",
"name": "string",
"type": "string",
"typeAsString": "string"
}
],
"methodSignatureAsString": "string",
"name": "string",
"outputs": [
{
"components": [
null
],
"dynamic": true,
"indexed": true,
"internalType": "string",
"name": "string",
"type": "string",
"typeAsString": "string"
}
],
"payable": true,
"stateMutability": "string",
"type": "string"
}
],
"address": "string",
"contractBin": "string",
"contractName": "string",
"groupId": "string",
"packageName": "string"
}
1.2. 合约部署接口(结合WeBASE-Sign)¶
接口描述¶
将合约部署到当前节点。此接口需结合WeBASE-Sign使用,通过调用WeBASE-Sign服务的签名接口让相关用户对数据进行签名,拿回签名数据再发送上链。需要调用此接口时,工程配置文件application.yml中的配置”keyServer”需配置WeBASE-Sign服务的ip和端口,并保证WeBASE-Sign服务正常和存在相关用户。
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义 constructor(uint n,bool b) -> [1,true] constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过本地私钥(测试用户)部署合约的接口(非WeBASE-Sign签名交易),可查看其他接口-合约部署接口(本地签名)
接口URL¶
http://localhost:5002/WeBASE-Front/contract/deployWithSign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 用户编号 | signUserId | String | 是 | WeBASE-Sign中的用户编号,通过webase-sign创建私钥获取 | |
3 | 合约名称 | contractName | String | 否 | ||
4 | 合约abi | abiInfo | List | 是 | 合约编译后生成的abi内容 | |
5 | 合约bytecodeBin | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 | |
6 | 构造函数参数 | funcParam | List | 否 | 合约构造函数所需参数,JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] | |
7 | 合约版本 | version | String | 否 | 用于指定合约在CNS中的版本 | |
8 | 合约bin | contractBin | String | 是 | ||
9 | 合约id | contractId | Long | 是 | 合约唯一id | |
10 | 合约路径 | contractPath | String | 是 | ||
11 | 合约来源 | contractSource | String | 是 | ||
12 | 是否aes | useAes | Boolean | 是 | ||
13 | 用户 | user | String | 是 |
2)数据格式
{
"abiInfo": [
{}
],
"bytecodeBin": "string",
"contractBin": "string",
"contractId": 0,
"contractName": "string",
"contractPath": "string",
"contractSource": "string",
"funcParam": [
{}
],
"groupId": "string",
"signUserId": "string",
"useAes": true,
"user": "string",
"version": "string"
}
示例:
curl -X POST "http://localhost:5002/WeBASE-Front/contract/deployWithSign" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"abiInfo\":[{\t\t\"constant\": true,\t\t\"inputs\": [],\t\t\"name\": \"get\",\t\t\"outputs\": [{\t\t\t\"name\": \"\",\t\t\t\"type\": \"string\"\t\t}],\t\t\"payable\": false,\t\t\"stateMutability\": \"view\",\t\t\"type\": \"function\"\t}, {\t\t\"constant\": false,\t\t\"inputs\": [{\t\t\t\"name\": \"n\",\t\t\t\"type\": \"string\"\t\t}],\t\t\"name\": \"set\",\t\t\"outputs\": [],\t\t\"payable\": false,\t\t\"stateMutability\": \"nonpayable\",\t\t\"type\": \"function\"\t}, {\t\t\"inputs\": [],\t\t\"payable\": false,\t\t\"stateMutability\": \"nonpayable\",\t\t\"type\": \"constructor\"\t}, {\t\t\"anonymous\": false,\t\t\"inputs\": [{\t\t\t\"indexed\": false,\t\t\t\"name\": \"\",\t\t\t\"type\": \"string\"\t\t}],\t\t\"name\": \"Test\",\t\t\"type\": \"event\"\t}],\"bytecodeBin\": \"608060405234801561001057600080fd5b506040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061005c929190610062565b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b610373806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b80600090805190602001906102029291906102a2565b507f89737d892c26516d1f01db9c083272cfafd004b0c31c32b9b39dbe07037fca24816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026557808201518184015260208101905061024a565b50505050905090810190601f1680156102925780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a723058202a7dede15aee7c8148afdeb9f48a479ded2e2b0588f8ec9953145fe7cb15b52b0029\", \"groupId\": "group", \"signUserId\": \"ed54e13b0abf4c69b788bd83b8e3515e\"}"
1.3. 合约部署接口(本地签名)¶
接口描述¶
此接口为WeBASE-Front使用本地私钥(页面中的测试用户)进行签名
将合约部署到当前节点。
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义 constructor(uint n,bool b) -> [1,true] constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过WeBASE-Sign部署合约的接口(非本地私钥签名交易),可查看合约接口-合约部署接口(结合WeBASE-Sign)
接口URL¶
http://localhost:5002/WeBASE-Front/contract/deploy
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 用户地址 | user | String | 是 | 用户地址,可通过/privateKey 接口创建 |
|
3 | 合约名称 | contractName | String | 否 | ||
4 | 合约abi | abiInfo | List | 是 | 合约编译后生成的abi文件内容 | |
5 | 合约bytecodeBin | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 | |
6 | 构造函数参数 | funcParam | List | 否 | 合约构造函数所需参数,JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] | |
7 | 合约bin | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin) | |
8 | 合约id | contractId | Long | 是 | ||
9 | 合约路径 | contractPath | String | 是 | ||
10 | 合约来源 | contractSource | String | 是 | ||
11 | 用户编号 | signUserId | String | 是 | WeBASE-Sign中的用户编号,通过webase-sign创建私钥获取 | |
12 | 是否aes | useAes | Boolean | 是 | true表示使用aes,false表示不使用aes | |
13 | 用户 | user | String | 是 |
2)数据格式
{
"abiInfo": [
{}
],
"bytecodeBin": "string",
"contractBin": "string",
"contractId": 0,
"contractName": "string",
"contractPath": "string",
"contractSource": "string",
"funcParam": [
{}
],
"groupId": "string",
"signUserId": "string",
"useAes": true,
"user": "string",
"version": "string"
}
示例:
curl -X POST "http://127.0.0.1:5002/WeBASE-Front/contract/deploy" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"abiInfo\": [{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}], \"bytecodeBin\": \"608060405234801561001057600080fd5b506040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061005c929190610062565b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6102d7806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b8060009080519060200190610202929190610206565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a72305820748030e2b07f36768ce36d28f7d8dac238065a349c87ffd036d6009b2dcc10950029\", \"funcParam\": [ ], \"groupId\": 1, \"user\": \"0xe11dda6939ef947f9ef78f626e5c4fe0cbcbce1e\"}"
1.4. java转译接口¶
接口描述¶
将合约abi转成java文件
接口URL¶
http://localhost:5002/WeBASE-Front/contract/compile-java
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
2 | 合约abi | abiInfo | List | 是 | 合约编译后生成的abi文件内容 | |
3 | 合约bin | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin) | |
4 | 所在目录 | packageName | String | 是 | 生成java所在的包名 | |
5 | 地址 | address | String | 是 | ||
6 | 所属群组 | groupId | String | 是 |
2)数据格式
{
"abiInfo": [
{
"anonymous": true,
"constant": true,
"inputs": [
{
"components": [
null
],
"dynamic": true,
"indexed": true,
"internalType": "string",
"name": "string",
"type": "string",
"typeAsString": "string"
}
],
"methodSignatureAsString": "string",
"name": "string",
"outputs": [
{
"components": [
null
],
"dynamic": true,
"indexed": true,
"internalType": "string",
"name": "string",
"type": "string",
"typeAsString": "string"
}
],
"payable": true,
"stateMutability": "string",
"type": "string"
}
],
"address": "string",
"contractBin": "string",
"contractName": "string",
"groupId": "string",
"packageName": "string"
}
响应参数¶
1)数据格式 返回Java合约类源码
package com.webank;
import java.util.Arrays;
...
@SuppressWarnings("unchecked")
public class HelloWorld extends Contract {
public static final String[] BINARY_ARRAY = {""};
public static final String BINARY = org.fisco.bcos.sdk.utils.StringUtils.joinAll("", BINARY_ARRAY);
public static final String[] SM_BINARY_ARRAY = {""};
public static final String SM_BINARY = org.fisco.bcos.sdk.utils.StringUtils.joinAll("", SM_BINARY_ARRAY);
public static final String[] ABI_ARRAY = {"[{\"name\":\"get\",\"type\":\"function\",\"constant\":true,\"payable\":false,\"anonymous\":false,\"stateMutability\":\"view\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"indexed\":false,\"components\":null,\"typeAsString\":\"string\"}],\"methodSignatureAsString\":\"get()\"},{\"name\":\"set\",\"type\":\"function\",\"constant\":false,\"payable\":false,\"anonymous\":false,\"stateMutability\":\"nonpayable\",\"inputs\":[{\"name\":\"n\",\"type\":\"string\",\"indexed\":false,\"components\":null,\"typeAsString\":\"string\"}],\"outputs\":[],\"methodSignatureAsString\":\"set(string)\"},{\"name\":null,\"type\":\"constructor\",\"constant\":false,\"payable\":false,\"anonymous\":false,\"stateMutability\":\"nonpayable\",\"inputs\":[],\"outputs\":null,\"methodSignatureAsString\":\"null()\"}]"};
public static final String ABI = org.fisco.bcos.sdk.utils.StringUtils.joinAll("", ABI_ARRAY);
public static final String FUNC_GET = "get";
public static final String FUNC_SET = "set";
protected HelloWorld(String contractAddress, Client client, CryptoKeyPair credential) {
super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
}
public static String getBinary(CryptoSuite cryptoSuite) {
return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
}
public String get() throws ContractException {
final Function function = new Function(FUNC_GET,
Arrays.<Type>asList(),
Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}));
return executeCallWithSingleValueReturn(function, String.class);
}
public TransactionReceipt set(String n) {
final Function function = new Function(
FUNC_SET,
Arrays.<Type>asList(new org.fisco.bcos.sdk.abi.datatypes.Utf8String(n)),
Collections.<TypeReference<?>>emptyList());
return executeTransaction(function);
}
public void set(String n, TransactionCallback callback) {
final Function function = new Function(
FUNC_SET,
Arrays.<Type>asList(new org.fisco.bcos.sdk.abi.datatypes.Utf8String(n)),
Collections.<TypeReference<?>>emptyList());
asyncExecuteTransaction(function, callback);
}
public String getSignedTransactionForSet(String n) {
final Function function = new Function(
FUNC_SET,
Arrays.<Type>asList(new org.fisco.bcos.sdk.abi.datatypes.Utf8String(n)),
Collections.<TypeReference<?>>emptyList());
return createSignedTransaction(function);
}
public Tuple1<String> getSetInput(TransactionReceipt transactionReceipt) {
String data = transactionReceipt.getInput().substring(10);
final Function function = new Function(FUNC_SET,
Arrays.<Type>asList(),
Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}));
List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
return new Tuple1<String>(
(String) results.get(0).getValue()
);
}
public static HelloWorld load(String contractAddress, Client client, CryptoKeyPair credential) {
return new HelloWorld(contractAddress, client, credential);
}
public static HelloWorld deploy(Client client, CryptoKeyPair credential) throws ContractException {
return deploy(HelloWorld.class, client, credential, getBinary(client.getCryptoSuite()), "");
}
}
1.5. 保存合约接口¶
接口描述¶
支持前置的控制台保存合约信息
接口URL¶
http://localhost:5002/WeBASE-Front/contract/save
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | string | 是 | ||
2 | 合约编号 | contractId | Long | 否 | ||
3 | 合约名称 | contractName | String | 是 | ||
4 | 合约所在目录 | contractPath | String | 是 | ||
5 | 合约abi | contractAbi | String | 否 | 可保存合约ABI | |
6 | 合约bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 | |
7 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 | |
8 | 合约源码 | contractSource | String | 否 | ||
9 | 合约地址 | contractAddress | String | 否 | ||
10 | 合约版本 | version | String | 否 |
2)数据格式
{
"bytecodeBin": "string",
"contractAbi": "string",
"contractAddress": "string",
"contractBin": "string",
"contractId": 0,
"contractName": "string",
"contractPath": "string",
"contractSource": "string",
"groupId": "string",
"version": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约编号 | id | Integer | 是 | ||
2 | 所在目录 | contractPath | String | 是 | ||
3 | 合约名称 | contractName | String | 是 | ||
4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 | |
5 | 所属群组 | groupId | String | 是 | ||
6 | 合约源码 | contractSource | String | 否 | ||
7 | 合约abi | contractAbi | String | 否 | 合约编译后生成的abi文件内容 | |
8 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 | |
9 | 合约bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 | |
10 | 合约地址 | contractAddress | String | 否 | ||
11 | 部署时间 | deployTime | String | 否 | ||
12 | 修改时间 | modifyTime | String | 是 | ||
13 | 创建时间 | createTime | String | 是 | ||
14 | 备注 | description | String | 否 | ||
15 | 合约版本 | version | String | 否 |
2)数据格式
{
"id": 1,
"contractPath": "/",
"contractName": "HelloWorld",
"contractStatus": 1,
"groupId": 1,
"contractSource": "cHJhZ21hIHNvbGlkaXR5ID49MC40LjI0IDwwLjYuMTE7Cgpjb250cmFjdCBIZWxsb1dvcmxkIHsKICAgIHN0cmluZyBuYW1lOwoKICAgIGNvbnN0cnVjdG9yKCkgcHVibGljIHsKICAgICAgICBuYW1lID0gIkhlbGxvLCBXb3JsZCEiOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldCgpIHB1YmxpYyB2aWV3IHJldHVybnMgKHN0cmluZyBtZW1vcnkpIHsKICAgICAgICByZXR1cm4gbmFtZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG1lbW9yeSBuKSBwdWJsaWMgewogICAgICAgIG5hbWUgPSBuOwogICAgfQp9",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"contractBin": "60806040526004361061004c5760003569b80029",
"bytecodeBin": "608060405234801561001057600080fd5b506029",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 11:48:51",
"modifyTime": "2019-06-10 15:31:29"
}
1.6. 删除合约接口¶
接口描述¶
支持前置的控制台通过群组编号和合约编号删除未部署的合约信息
接口URL¶
http://localhost:5002/WeBASE-Front/contract/{groupId}/{contractId}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | int | 是 | ||
2 | 合约编号 | contractId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/group/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
1.7. 分页查询合约列表¶
接口描述¶
支持前置的控制台分页查询合约列表
接口URL¶
http://localhost:5002/WeBASE-Front/contract/contractList
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约名称 | contractName | String | 否 | ||
3 | 合约状态 | contractStatus | Integer | 否 | 1未部署,2已部署 | |
4 | 合约地址 | contractAddress | String | 否 | ||
5 | 当前页码 | pageNumber | Integer | 是 | 从1开始 | |
6 | 每页记录数 | pageSize | Integer | 是 | ||
7 | 合约路径 | contractPath | String | 否 |
2)数据格式
{
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"contractStatus": 0,
"groupId": "string",
"pageNumber": 0,
"pageSize": 0
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | Integer | 是 | |
3.6 | 合约源码 | contractSource | String | 否 | |
3.7 | 合约abi | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
3.8 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.9 | bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 |
3.10 | 合约地址 | contractAddress | String | 否 | |
3.11 | 部署时间 | deployTime | String | 否 | |
3.12 | 修改时间 | modifyTime | String | 是 | |
3.13 | 创建时间 | createTime | String | 是 | |
3.14 | 备注 | description | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 2,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": 1,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAbi": "",
"contractBin": "",
"bytecodeBin": null,
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
],
"totalCount": 1
}
1.8. 合约是否被修改接口¶
接口描述¶
校验已部署的合约是否被修改了,返回true或false
接口URL¶
http://localhost:5002/WeBASE-Front/contract/ifChanged/{groupId}/{contractId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约编号 | contractId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/ifChanged/group/10
1.9. 后台编译合约¶
接口描述¶
通过后台的solcJ对solidity合约进行编译,返回合约的BIN与ABI
接口URL¶
http://localhost:5002/WeBASE-Front/contract/contractCompile
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
2 | 合约源码 | solidityBase64 | String | 是 | 经过Base64编码的合约源码内容 | |
3 | 群组编号 | groupId | String |
2)数据格式
{
"contractName": "string",
"groupId": "string",
"solidityBase64": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
3 | 合约bin | bytecodeBin | String | 是 | ||
4 | 合约abi | contractAbi | String | 是 |
2)数据格式
{
"contractName": "HelloWorld",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"bytecodeBin": "608060405234801561001057600080fd5b506040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061005c929190610062565b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6102d7806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b8060009080519060200190610202929190610206565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a72305820c4fdd0260810422a091a99fbd64edc672c6e498b69b9947f3e3066c074522dfa0029",
"errors": ""
}
1.10. 多合约编译¶
接口描述¶
接口参数为合约文件压缩成zip并Base64编码后的字符串。合约文件需要放在同级目录压缩,涉及引用请使用”./XXX.sol”。可参考测试类ContractControllerTest的testMultiContractCompile()方法。国密和非国密编译的bytecodeBin不一样,以下以国密为例。
接口URL¶
http://localhost:5002/WeBASE-Front/contract/multiContractCompile
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约源码 | contractZipBase64 | String | 是 | 合约文件压缩成zip,并Base64编码 | |
2 | 所属群组 | groupId | String | 是 |
2)数据格式
{
"contractZipBase64": "string",
"groupId": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约名称 | contractName | String | 是 | ||
2 | 合约bin | bytecodeBin | String | 是 | ||
3 | 合约abi | contractAbi | String | 是 | ||
4 | 合约内容 | contractSource | String | 否 | 单个合约内容Base64编码 |
2)数据格式
[
{
"contractName": "HelloWorld",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsNCmNvbnRyYWN0IEhlbGxvV29ybGR7DQogICAgc3RyaW5nIG5hbWU7DQogICAgZXZlbnQgU2V0TmFtZShzdHJpbmcgbmFtZSk7DQogICAgZnVuY3Rpb24gZ2V0KCljb25zdGFudCByZXR1cm5zKHN0cmluZyl7DQogICAgICAgIHJldHVybiBuYW1lOw0KICAgIH0NCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG4pew0KICAgICAgICBlbWl0IFNldE5hbWUobik7DQogICAgICAgIG5hbWU9bjsNCiAgICB9DQp9",
"bytecodeBin": "608060405234801561001057600080fd5b50610373806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b7f05432a43e07f36a8b98100b9cb3631e02f8e796b0a06813610ce8942e972fb81816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024e578082015181840152602081019050610233565b50505050905090810190601f16801561027b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1806000908051906020019061029e9291906102a2565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102e357805160ff1916838001178555610311565b82800160010185558215610311579182015b828111156103105782518255916020019190600101906102f5565b5b50905061031e9190610322565b5090565b61034491905b80821115610340576000816000905550600101610328565b5090565b905600a165627a7a72305820cff924cb0783dc84e2e107aae1fd09e1e04154b80834c9267a4eaa630997b2b90029"
}
]
1.11. 获取全量合约列表(不包含abi/bin)¶
接口描述¶
根据群组编号和合约状态获取全量合约
接口URL¶
http://localhost:5002/WeBASE-Front/contract/contractList/all/light?groupId={groupId}&contractStatus={contractStatus}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/contractList/all/light?groupId=1&contractStatus=2
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | Integer | 是 | |
3.6 | 合约地址 | contractAddress | String | 否 | |
3.7 | 部署时间 | deployTime | String | 否 | |
3.8 | 修改时间 | modifyTime | String | 是 | |
3.9 | 创建时间 | createTime | String | 是 | |
3.10 | 备注 | description | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 2,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": "group",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
],
"totalCount": 1
}
1.12. 根据id获取单个合约¶
接口描述¶
根据合约id获取单个合约
接口URL¶
http://localhost:5002/WeBASE-Front/contract/findOne/{contractId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约编号 | contractId | Integer | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/findOne/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | String | 是 | |
3.6 | 合约源码 | contractSource | String | 否 | |
3.7 | 合约abi | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
3.8 | 合约bin | contractBin | String | 否 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.9 | bytecodeBin | bytecodeBin | String | 否 | 合约编译的bytecode(bin),用于部署合约 |
3.10 | 合约地址 | contractAddress | String | 否 | |
3.11 | 部署时间 | deployTime | String | 否 | |
3.12 | 修改时间 | modifyTime | String | 是 | |
3.13 | 创建时间 | createTime | String | 是 | |
3.14 | 备注 | description | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId": "group",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAbi": "",
"contractBin": "",
"bytecodeBin": null,
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
]
}
1.13. 获取合约路径列表¶
接口描述¶
获取合约路径列表
接口URL¶
http://localhost:5002/WeBASE-Front/contract/findPathList/{groupId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/findPathList/group
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回数据 | data | List | 否 | |
1.1 | 群组编号 | groupId | String | 是 | |
1.2 | 所在目录 | contractPath | String | 是 | |
1.3 | 修改时间 | modifyTime | String | 是 | |
1.4 | 创建时间 | createTime | String | 是 |
2)数据格式
[
{
"groupId": "group",
"contractPath": "/",
"createTime": null,
"modifyTime": "2021-07-29 14:34:52"
},
{
"groupId": "group",
"contractPath": "Asset",
"createTime": null,
"modifyTime": "2021-07-27 10:43:59"
},
{
"groupId": "group",
"contractPath": "template",
"createTime": "2021-07-20 11:31:18",
"modifyTime": "2021-07-20 11:31:18"
}
]
1.14. 保存合约路径¶
接口描述¶
保存合约路径
接口URL¶
http://localhost:5002/WeBASE-Front/contract/addContractPath
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
1 | 合约路径 | contractPath | String | 是 | 若为空字符串,则保存/ 根目录路径 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/addContractPath
{
"contractPath": "string",
"groupId": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | |
2 | 所在目录 | contractPath | String | 是 | |
3 | 修改时间 | modifyTime | String | 是 | |
4 | 创建时间 | createTime | String | 是 |
2)数据格式
{
"groupId": "group",
"contractPath": "test",
"createTime": "2021-07-29 14:26:54",
"modifyTime": "2021-07-29 14:26:54"
}
1.15. 删除合约路径¶
接口描述¶
删除合约路径(不删除目录下合约)
接口URL¶
http://localhost:5002/WeBASE-Front/contract/deletePath/{groupId}/{contractPath}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约路径 | contractPath | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/deletePath/group/test
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data |
2)数据格式
{
"code": 0,
"data": {},
"message": "success"
}
1.16. 根据合约路径批量删除合约¶
接口描述¶
根据合约路径批量删除合约
接口URL¶
http://localhost:5002/WeBASE-Front/contract/batch/{groupId}/{contractPath}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
1 | 合约路径 | contractPath | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/batch/group/test
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"data": {},
"message": "success"
}
1.17. 注册cns接口¶
接口描述¶
注册cns
接口URL¶
http://localhost:5002/WeBASE-Front/contract/registerCns
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约名称 | contractName | String | 是 | ||
3 | cns名称 | cnsName | String | 是 | ||
4 | 合约地址 | contractAddress | String | 是 | ||
5 | 合约abi | abiInfo | List | 是 | abi文件里面的内容,是一个JSONArray | |
6 | cns版本 | version | String | 是 | ||
7 | 是否保存 | saveEnabled | bool | 是 | 前置控制台调用时传true,其他调用传false | |
8 | 用户地址 | userAddress | String | 否 | saveEnabled为true时必填 | |
9 | 合约路径 | contractPath | String | 否 | saveEnabled为true时必填 | |
10 | 签名用户编号 | signUserId | String | 否 | saveEnabled为false时必填 |
2)数据格式
{
"abiInfo": [
{
"anonymous": true,
"constant": true,
"inputs": [
{
"components": [
null
],
"dynamic": true,
"indexed": true,
"internalType": "string",
"name": "string",
"type": "string",
"typeAsString": "string"
}
],
"methodSignatureAsString": "string",
"name": "string",
"outputs": [
{
"components": [
null
],
"dynamic": true,
"indexed": true,
"internalType": "string",
"name": "string",
"type": "string",
"typeAsString": "string"
}
],
"payable": true,
"stateMutability": "string",
"type": "string"
}
],
"cnsName": "string",
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"groupId": "string",
"saveEnabled": true,
"signUserId": "string",
"userAddress": "string",
"version": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
}
1.18. 根据合约地址获取cns信息¶
接口描述¶
根据合约地址获取cns信息,返回改合约地址最新的cns信息
接口URL¶
http://localhost:5002/WeBASE-Front/contract/findCns
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约地址 | contractAddress | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contract/findCns
{
"groupId": "group",
"contractAddress": "0xe46c1a681811ee78079b48a956ead6d9dd10bf6a"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | List | 否 | |
3.1 | 群组编号 | groupId | Integer | 是 | |
3.2 | 合约路径 | contractPath | String | 是 | |
3.3 | 合约名 | contractName | String | 是 | |
3.4 | cns名 | cnsName | String | 是 | |
3.5 | cns版本 | version | String | 是 | |
3.6 | 合约地址 | contractAddress | String | 是 | |
3.7 | 合约Abi | contractAbi | String | 是 | |
3.8 | 修改时间 | modifyTime | String | 是 | |
3.9 | 创建时间 | createTime | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
"data": {
"groupId": "group",
"contractPath": "/",
"contractName": "Hello",
"cnsName": "Hello",
"version": "v0.4",
"contractAddress": "0xcaff8fdf1d461b91c7c8f0ff2af2f79a80bc189e",
"contractAbi":"[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"type\":\"function\",\"payable\":false,\"stateMutability\":\"view\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"name\":\"set\",\"outputs\":[],\"type\":\"function\",\"payable\":false,\"stateMutability\":\"nonpayable\"},{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"type0\":null,\"indexed\":false}],\"name\":\"SetName\",\"outputs\":null,\"type\":\"event\",\"payable\":false,\"stateMutability\":null}]",
"createTime": "2020-12-30 16:32:28",
"modifyTime": "2020-12-30 16:32:28"
}
}
2. 密钥接口¶
2.1. 创建私钥接口¶
接口描述¶
通过调用此接口获取公私钥对和对应账户信息
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey?type={type}&userName={userName}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥类型 | type | int | 否 | 0-本地用户;1-本地随机;2-外部用户;默认为2 | |
2 | 用户名 | userName | String | 是 | 用户名 | |
3 | 签名服务用户编号 | signUserId | String | 64 | 否 | WeBASE-Sign中的用户编号,一般设为UUID值;类型为2-外部用户时,必填; |
4 | 应用编号 | appId | String | 64 | 否 | 记录私钥所属应用,可根据业务设置;类型为2-外部用户时,必填 |
5 | 是否返回私钥 | returnPrivateKey | Boolean | 否 | 类型为2-外部用户时,选填;默认为false | |
6 | 群组编号 | groupId | String |
2)数据格式
// 本地用户
http://localhost:5002/WeBASE-Front/privateKey?type=0&userName=test
// 外部用户
http://localhost:5002/WeBASE-Front/privateKey?type=2&signUserId=0x123&appId=2
响应参数¶
1)数据格式 本地用户时:
{
"groupId": "group",
"address": "0x2007e1430f41f75c850464307c0994472bd92ee0",
"publicKey": "0x9bd35211855f9f8de22d8a8da7f30d35d62ab2c3d36ea5162008fcbb9faff4d83809f7033deb20049bf51e081105076ec7a09a847f852530f81e978b1eda0392",
"privateKey": "42caa160cadcb635381b980ddd981171c862d3105981fe92d6db330f30615f21",
"userName": "test",
"type": 0,
"signUserId": null, // 本地用户则为空
"appId": null // 本地用户则为空
}
外部用户时(来自WeBASE-Sign):
{
"groupId": "group",
"address": "0xef5afe7d9a7516cd36b5b2471a3fbb05d3e8a846",
"publicKey": "0461e78631ab8428c1be815a4543da8684db13cd2d9a0593e053184dbd29d08f38131e060bc8d1a1ef5f4290b26acca8cefbc16150155e57f4ea81dbed57cea0e8",
"privateKey": null, // 默认不返回
"userName": null, //外部用户则为空
"type": 2,
"signUserId": "0x123",
"appId": "1"
}
2.2. 导入私钥接口¶
接口描述¶
导入私钥信息,并返回对应的公钥及用户地址
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/import?privateKey={privateKey}&userName={userName}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥信息 | privateKey | String | 是 | ||
2 | 用户名 | userName | String | 是 | ||
3 | 群组编号 | groupId | String |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/import?privateKey=8cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c&userName=lili
响应参数¶
1)数据格式
{
"address": "0x2e8ff65fb1b2ce5b0c9476b8f8beb221445f42ee",
"publicKey": "0x1c7073dc185af0644464b178da932846666a858bc492450e9e94c77203428ed54e2ce45679dbb36bfed714dbe055a215dc1aaf4a75faeddce6a62b39c0158e1e",
"privateKey": "8cf98bd0f37fb0984ab43ed6fc2dcdf58811522af7e4a3bedbe84636a79a501c",
"userName": "lili",
"type": 0,
"appId": "string",
"signUserId": "string"
}
2.3. 获取本地公私钥列表接口¶
接口描述¶
返回本地公私钥信息列表
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/localKeyStores
调用方法¶
HTTP GET
响应参数¶
1)数据格式
[
{
"address": "string",
"appId": "string",
"privateKey": "string",
"publicKey": "string",
"signUserId": "string",
"type": 0,
"userName": "string"
}
]
2.4. 删除公私钥接口¶
接口描述¶
支持前置的控制台通过用户地址删除公私钥信息
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/{address}
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户地址 | address | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/0x2e8ff65fb1b2ce5b0c9476b8f8beb221445f42ee
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.5. 导入.pem私钥用户¶
接口描述¶
导入.pem格式的私钥
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/importPem
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | pem文件内容 | pemContent | String | 是 | 必须以-----BEGIN PRIVATE KEY-----\n 开头,以\n-----END PRIVATE KEY-----\n 结尾的格式 |
|
2 | 用户名 | userName | String | 是 | ||
3 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/importPem
{
"groupId": "string",
"pemContent": "string",
"userName": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.6. 导入.p12私钥用户¶
接口描述¶
导入.p12格式的私钥
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/importP12
调用方法¶
HTTP POST | Content-type: form-data
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | p12文件 | p12File | MultipartFile | 是 | ||
2 | p12文件密码 | p12Password | String | 否 | 使用base64编码的密码;缺省时默认为"",即空密码;p12无密码时,可传入空值或不传;不包含中文 | |
3 | 用户名 | userName | String | 是 | ||
4 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/importP12
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.7. 导入私钥到WeBASE-Sign¶
接口描述¶
导入私钥到WeBASE-Sign,其中privateKey经过Base64加密
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/importWithSign
调用方法¶
HTTP POST | Content-type: application/json
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | WeBASE-Sign中的用户编号,一般设为UUID值 |
2 | 应用编号 | appId | String | 64 | 是 | 记录私钥所属应用,可根据业务设置 |
3 | 私钥 | privateKey | String | 是 | 经过Base64加密后的内容 | |
4 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/importWithSign
{
"appId": "string",
"groupId": "string",
"privateKey": "string",
"signUserId": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": null
}
2.8. 对哈希签名¶
接口描述¶
计算HASH和签名值
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/signMessageHash
调用方法¶
HTTP POST | Content-type: application/json
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | Sign用户Id | signUserId | String | 64 | 是 | 在webase-sign创建的私钥的id |
2 | Hash值 | messageHash | String | 是 | ||
3 | 群组编号 | groupId | String | 是 |
2)数据格式
{
"groupId": "string",
"messageHash": "string",
"signUserId": "string"
}
响应参数¶
1)数据格式
{
"v": 0,
"r": "0x2a76a45bcf1113615f796cc01b23c57f81f20ce79500080bb34c7994ed04de06",
"s": "0x4f111eb37720e2618d8906368c825fd3cbe89b2781cb678efafb42399594a580",
"p": "0x4405f9d5d6ccff709b6543bc8ac24cbb649d3267a66db19ab8f85f3b884a8505f086c581490e7e50558879abde9c4d07fc2daab92f81c0eb4b805af3c8895cfc"
}
2.9. 导出pem私钥¶
接口描述¶
从本地或WeBASE-Sign导出pem私钥文件
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/exportPem
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | Sign用户编号 | signUserId | String | 64 | 否 | 非空时,导出sign的私钥 |
2 | 用户地址 | userAddress | String | 否 | 若signUserId为空,则地址不能为空,导出本地私钥 | |
3 | 群组编号 | groupId | String | 是 | ||
4 | p12文件密码 | p12Password | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/exportPem
{
"groupId": "string",
"p12Password": "string",
"signUserId": "string",
"userAddress": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中,使用pcks12方式接收 |
2)数据格式
headers: content-disposition: attachment;filename*=UTF-8''111_0x0421975cf4a5b27148f65de11cd9d8559a1bbbd9.pem
{
-----BEGIN PRIVATE KEY-----
MIGNAgEAMBAGByqGSM49AgEGBSuBBAAKBHYwdAIBAQQg91Aha3x2UdpN2Sg5C5Wh
7Y8YwIYC5NTNtfQT1yp7hKWgBwYFK4EEAAqhRANCAAQ9SEdu1kLpLXVmayqax7N+
Pf/ATWx5jJIJIiQF6/BIiuORZrZb/M04FlxtGyVuQjQjbYVgyjNDUilj14OlZhXo
-----END PRIVATE KEY-----
}
2.10. 导出p12私钥¶
接口描述¶
从本地或WeBASE-Sign导出p12私钥文件
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/exportP12
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | Sign用户编号 | signUserId | String | 64 | 否 | 非空时,导出sign的私钥 |
2 | 用户地址 | userAddress | String | 否 | 若signUserId为空,则地址不能为空,导出本地私钥 | |
3 | 群组编号 | groupId | String | 是 | ||
4 | p12文件密码 | p12Password | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/exportP12
{
"groupId": "string",
"p12Password": "string",
"signUserId": "string",
"userAddress": "string"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中,使用pcks12方式接收 |
2)数据格式
headers: content-disposition: attachment;filename*=UTF-8''111_0x0421975cf4a5b27148f65de11cd9d8559a1bbbd9.p12
{
// 二进制流
}
2.11. 获取WeBASE-Sign私钥用户信息¶
接口描述¶
从WeBASE-Sign获取私钥信息
接口URL¶
http://localhost:5002/WeBASE-Front/privateKey/userInfoWithSign
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | Sign用户编号 | signUserId | String | 64 | 是 | WeBASE-Sign中用户编号 |
2 | 是否导出秘钥 | returnPrivateKey | Boolean | 否 | 默认为false;true时将导出WeBASE-Sign对应私钥 |
2)数据格式
http://localhost:5002/WeBASE-Front/privateKey/userInfoWithSign?signUserId=d1edf538748b4d899f251b5d746ec62f&returnPrivateKey=false
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | WeBASE-Sign中的用户编号,一般为UUID值 | |
2 | 应用编号 | appId | String | 记录私钥所属应用 | |
3 | 私钥原文 | privateKey | String | 若returnPrivateKey 则不返回(要求WeBASE-Sign设置允许导出私钥配置) |
|
4 | 私钥地址 | address | String | ||
5 | 公钥 | publicKey | String | ||
6 | 私钥类型 | encryptType | int | 0-ECDSA, 1-SM2国密 | |
7 | 描述 | description | String |
2)数据格式
{
"signUserId": "d1edf538748b4d899f251b5d746ec62f",
"appId": "1",
"address": "0x2b6e2f9d25bdeeca395bd743099ef50097043aaa",
"publicKey": "044ddb8e92cf9dd96c1767b5e9c7e55e749304e88e28a8ec4fb7059c3388590ce83f2786510898464dfeb79771656a506e91cca6bd88c4291d5b9e284542651546",
"privateKey": "",
"description": null,
"encryptType": 1
}
3. web3接口¶
3.1. 获取块高接口¶
接口描述¶
获取节点最新块高
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/blockNumber
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/blockNumber
3.2. 根据块高获取块信息接口¶
接口描述¶
通过块高获取块信息
接口URL¶
http://localhost:5002/WeBASE-Front/group/web3/blockByNumber/{blockNumber}
调用方法¶
HTTP GET
请求参数¶
- 参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 块高 | blockNumber | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/blockByNumber/2
响应参数¶
1)数据格式
{
"number": 2,
"hash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"parentHash": "0x489ee0c00527879f7e2470bde7b62e9ea30fadb242bcbd9ba582d0dee4958e2f",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"transactionsRoot": "0xade02313d3200f38dfc18cdc368241cf4c1cb7e72011edf847ec216efa43a99e",
"receiptsRoot": "0xb7c4b856c9335bd345c0b022057567a2223218e7a7dab822981467b29ac1e326",
"dbHash": "0x8cbc3f2c0e35a71738909e3b388efa6697084b05badd3a3bd3c64f0575c78c15",
"stateRoot": "0x8cbc3f2c0e35a71738909e3b388efa6697084b05badd3a3bd3c64f0575c78c15",
"sealer": "0x2",
"sealerList": [
"06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7",
"95efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39",
"fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d"
],
"extraData": [],
"gasLimit": "0",
"gasUsed": "0",
"timestamp": "1619424150450",
"signatureList": [
{
"index": "0x1",
"signature": "0xa05b5d220e41051fa80f212884d9cdda3a8973a4ac2d2dc74e42db32b459e5f595a61e30266f0e8bf7edb065ff107c6af5e6349f9ae518146dc686406ebbade165bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7"
},
{
"index": "0x3",
"signature": "0x48bb622e24b18f4eb601137d44b5d86e2c287be3aa849dce1768e87e75308ba69391e62f90d76bf84b9b6eb1509d11409f9b784bc7b052458a4596b81961fac8fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d"
},
{
"index": "0x2",
"signature": "0x3a3cc8c20c5cdbb6431ec1f749d94662670e87442debef119a4e6469ccb16a60a152d32754ab833efa513839b076c2aa1ceb7e536db3734b740e9192b10ee38695efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39"
}
],
"transactions": [
{
"blockHash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"blockNumber": 2,
"from": "0x9d75e0ee66cfef16897b601624b60413d988ae7d",
"gas": "0x419ce0",
"hash": "0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429",
"input": "0x608060405234801561001057600080fd5b506103e3806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d1461005c5780633590b49f146100ec57806362e8d6ce14610155575b600080fd5b34801561006857600080fd5b5061007161016c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b1578082015181840152602081019050610096565b50505050905090810190601f1680156100de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100f857600080fd5b50610153600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061020e565b005b34801561016157600080fd5b5061016a6102c4565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102045780601f106101d957610100808354040283529160200191610204565b820191906000526020600020905b8154815290600101906020018083116101e757829003601f168201915b5050505050905090565b7f5715c9562eaf8d524d564edb392acddefc81d8133e2fc3b8125a260b1b413fda816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a180600090805190602001906102c0929190610312565b5050565b6040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061030f929190610312565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061035357805160ff1916838001178555610381565b82800160010185558215610381579182015b82811115610380578251825591602001919060010190610365565b5b50905061038e9190610392565b5090565b6103b491905b808211156103b0576000816000905550600101610398565b5090565b905600a165627a7a72305820f3088deb3d14c6893440e4769f2389e9335e04faa10e6de5b4c93af15d1a34e80029",
"nonce": "0x3460c30bd3e4e88a31d6d033b3a172859bf003258e9606fd63fb0d91f91f4e6",
"to": "0x0000000000000000000000000000000000000000",
"transactionIndex": "0x0",
"value": "0x0",
"gasPrice": "0x51f4d5c00",
"blockLimit": "0x1f5",
"chainId": "0x1",
"groupId": "0x1",
"extraData": "0x",
"signature": {
"r": "0x3416723318505669cca91689b213ff08ffb96d538210a0f691cfcfa9d529462b",
"s": "0xd3642f19c228e2e86689de9efc19ecbb68378a6bb7c219984431e93d60c89124",
"v": "0xc7935c199b680452eb37911856282b9c820322fd5fdec8a06b48cc3df4e8ed7d3d66a5adcc134cca609146ec0aed12827c35df07eed96042763c0926cf4223b7",
"signature": "0x3416723318505669cca91689b213ff08ffb96d538210a0f691cfcfa9d529462bd3642f19c228e2e86689de9efc19ecbb68378a6bb7c219984431e93d60c89124c7935c199b680452eb37911856282b9c820322fd5fdec8a06b48cc3df4e8ed7d3d66a5adcc134cca609146ec0aed12827c35df07eed96042763c0926cf4223b7"
}
}
]
}
3.3. 根据块hash获取块信息接口¶
接口描述¶
通过块hash获取块信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/blockByHash/{blockHash}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 区块hash | blockByHash | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/blockByHash/0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625
响应参数¶
1)数据格式
{{
"number": 2,
"hash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"parentHash": "0x489ee0c00527879f7e2470bde7b62e9ea30fadb242bcbd9ba582d0dee4958e2f",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"transactionsRoot": "0xade02313d3200f38dfc18cdc368241cf4c1cb7e72011edf847ec216efa43a99e",
"receiptsRoot": "0xb7c4b856c9335bd345c0b022057567a2223218e7a7dab822981467b29ac1e326",
"dbHash": "0x8cbc3f2c0e35a71738909e3b388efa6697084b05badd3a3bd3c64f0575c78c15",
"stateRoot": "0x8cbc3f2c0e35a71738909e3b388efa6697084b05badd3a3bd3c64f0575c78c15",
"sealer": "0x2",
"sealerList": [
"06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7",
"95efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39",
"fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d"
],
"extraData": [],
"gasLimit": "0",
"gasUsed": "0",
"timestamp": "1619424150450",
"signatureList": [
{
"index": "0x1",
"signature": "0xa05b5d220e41051fa80f212884d9cdda3a8973a4ac2d2dc74e42db32b459e5f595a61e30266f0e8bf7edb065ff107c6af5e6349f9ae518146dc686406ebbade165bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7"
},
{
"index": "0x3",
"signature": "0x48bb622e24b18f4eb601137d44b5d86e2c287be3aa849dce1768e87e75308ba69391e62f90d76bf84b9b6eb1509d11409f9b784bc7b052458a4596b81961fac8fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d"
},
{
"index": "0x2",
"signature": "0x3a3cc8c20c5cdbb6431ec1f749d94662670e87442debef119a4e6469ccb16a60a152d32754ab833efa513839b076c2aa1ceb7e536db3734b740e9192b10ee38695efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39"
}
],
"transactions": [
{
"blockHash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"blockNumber": 2,
"from": "0x9d75e0ee66cfef16897b601624b60413d988ae7d",
"gas": "0x419ce0",
"hash": "0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429",
"input": "0x608060405234801561001057600080fd5b506103e3806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d1461005c5780633590b49f146100ec57806362e8d6ce14610155575b600080fd5b34801561006857600080fd5b5061007161016c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b1578082015181840152602081019050610096565b50505050905090810190601f1680156100de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100f857600080fd5b50610153600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061020e565b005b34801561016157600080fd5b5061016a6102c4565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102045780601f106101d957610100808354040283529160200191610204565b820191906000526020600020905b8154815290600101906020018083116101e757829003601f168201915b5050505050905090565b7f5715c9562eaf8d524d564edb392acddefc81d8133e2fc3b8125a260b1b413fda816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a180600090805190602001906102c0929190610312565b5050565b6040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061030f929190610312565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061035357805160ff1916838001178555610381565b82800160010185558215610381579182015b82811115610380578251825591602001919060010190610365565b5b50905061038e9190610392565b5090565b6103b491905b808211156103b0576000816000905550600101610398565b5090565b905600a165627a7a72305820f3088deb3d14c6893440e4769f2389e9335e04faa10e6de5b4c93af15d1a34e80029",
"nonce": "0x3460c30bd3e4e88a31d6d033b3a172859bf003258e9606fd63fb0d91f91f4e6",
"to": "0x0000000000000000000000000000000000000000",
"transactionIndex": "0x0",
"value": "0x0",
"gasPrice": "0x51f4d5c00",
"blockLimit": "0x1f5",
"chainId": "0x1",
"groupId": "0x1",
"extraData": "0x",
"signature": {
"r": "0x3416723318505669cca91689b213ff08ffb96d538210a0f691cfcfa9d529462b",
"s": "0xd3642f19c228e2e86689de9efc19ecbb68378a6bb7c219984431e93d60c89124",
"v": "0xc7935c199b680452eb37911856282b9c820322fd5fdec8a06b48cc3df4e8ed7d3d66a5adcc134cca609146ec0aed12827c35df07eed96042763c0926cf4223b7",
"signature": "0x3416723318505669cca91689b213ff08ffb96d538210a0f691cfcfa9d529462bd3642f19c228e2e86689de9efc19ecbb68378a6bb7c219984431e93d60c89124c7935c199b680452eb37911856282b9c820322fd5fdec8a06b48cc3df4e8ed7d3d66a5adcc134cca609146ec0aed12827c35df07eed96042763c0926cf4223b7"
}
}
]
}
3.4. 获取块中交易个数接口¶
接口描述¶
根据块高获取该块中的交易个数
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/blockTransCnt/{blockNumber}
调用方法¶
HTTP GET
请求参数¶
- 参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 块高 | blockNumber | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/blockTransCnt/100
3.5. 获取PbftView接口¶
接口描述¶
通过调用此接口获取PbftView
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/pbftView
调用方法¶
HTTP GET
请求参数¶
- 参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/pbftView
3.6. 获取交易回执接口¶
接口描述¶
根据交易hash获取交易回执
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transactionReceipt/{transHash}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 交易hash | transHash | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/transactionReceipt/0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429
响应参数¶
2)数据格式
{
"transactionHash": "0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429",
"transactionIndex": "0x0",
"root": "0x8cbc3f2c0e35a71738909e3b388efa6697084b05badd3a3bd3c64f0575c78c15",
"blockNumber": "2",
"blockHash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"from": "0x9d75e0ee66cfef16897b601624b60413d988ae7d",
"to": "0x0000000000000000000000000000000000000000",
"gasUsed": "316449",
"contractAddress": "0xa8af0ee580d8af674a60341030ddbc45431bc235",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"status": "0x0",
"statusMsg": "None",
"input": "0x608060405234801561001057600080fd5b506103e3806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d1461005c5780633590b49f146100ec57806362e8d6ce14610155575b600080fd5b34801561006857600080fd5b5061007161016c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b1578082015181840152602081019050610096565b50505050905090810190601f1680156100de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100f857600080fd5b50610153600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061020e565b005b34801561016157600080fd5b5061016a6102c4565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102045780601f106101d957610100808354040283529160200191610204565b820191906000526020600020905b8154815290600101906020018083116101e757829003601f168201915b5050505050905090565b7f5715c9562eaf8d524d564edb392acddefc81d8133e2fc3b8125a260b1b413fda816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a180600090805190602001906102c0929190610312565b5050565b6040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061030f929190610312565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061035357805160ff1916838001178555610381565b82800160010185558215610381579182015b82811115610380578251825591602001919060010190610365565b5b50905061038e9190610392565b5090565b6103b491905b808211156103b0576000816000905550600101610398565b5090565b905600a165627a7a72305820f3088deb3d14c6893440e4769f2389e9335e04faa10e6de5b4c93af15d1a34e80029",
"output": "0x",
"txProof": null,
"receiptProof": null,
"message": null,
"statusOK": true
}
3.7. 根据交易hash获取交易信息接口¶
接口描述¶
根据交易hash获取交易信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transaction/{transHash}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 交易hash | transHash | String | 是 | ||
3 | withProof | boolean |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/transaction/0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429
响应参数¶
1)数据格式
{
"blockHash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"blockNumber": 2,
"from": "0x9d75e0ee66cfef16897b601624b60413d988ae7d",
"gas": "4300000",
"hash": "0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429",
"input": "0x608060405234801561001057600080fd5b506103e3806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d1461005c5780633590b49f146100ec57806362e8d6ce14610155575b600080fd5b34801561006857600080fd5b5061007161016c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b1578082015181840152602081019050610096565b50505050905090810190601f1680156100de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100f857600080fd5b50610153600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061020e565b005b34801561016157600080fd5b5061016a6102c4565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102045780601f106101d957610100808354040283529160200191610204565b820191906000526020600020905b8154815290600101906020018083116101e757829003601f168201915b5050505050905090565b7f5715c9562eaf8d524d564edb392acddefc81d8133e2fc3b8125a260b1b413fda816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a180600090805190602001906102c0929190610312565b5050565b6040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061030f929190610312565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061035357805160ff1916838001178555610381565b82800160010185558215610381579182015b82811115610380578251825591602001919060010190610365565b5b50905061038e9190610392565b5090565b6103b491905b808211156103b0576000816000905550600101610398565b5090565b905600a165627a7a72305820f3088deb3d14c6893440e4769f2389e9335e04faa10e6de5b4c93af15d1a34e80029",
"nonce": "0x3460c30bd3e4e88a31d6d033b3a172859bf003258e9606fd63fb0d91f91f4e6",
"to": "0x0000000000000000000000000000000000000000",
"transactionIndex": "0x0",
"value": "0x0",
"gasPrice": "22000000000",
"blockLimit": "0x1f5",
"chainId": "0x1",
"groupId": "1",
"extraData": "0x",
"signature": {
"r": "0x3416723318505669cca91689b213ff08ffb96d538210a0f691cfcfa9d529462b",
"s": "0xd3642f19c228e2e86689de9efc19ecbb68378a6bb7c219984431e93d60c89124",
"v": "0xc7935c199b680452eb37911856282b9c820322fd5fdec8a06b48cc3df4e8ed7d3d66a5adcc134cca609146ec0aed12827c35df07eed96042763c0926cf4223b7",
"signature": "0x3416723318505669cca91689b213ff08ffb96d538210a0f691cfcfa9d529462bd3642f19c228e2e86689de9efc19ecbb68378a6bb7c219984431e93d60c89124c7935c199b680452eb37911856282b9c820322fd5fdec8a06b48cc3df4e8ed7d3d66a5adcc134cca609146ec0aed12827c35df07eed96042763c0926cf4223b7"
}
}
3.8. 获取合约二进制代码接口¶
接口描述¶
获取指定块高区块指定合约地址的二进制代码
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/code/{address}/{blockNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 合约地址 | address | String | 是 | ||
3 | 块高 | blockNumber | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/code/0x0000000000000000000000000000000000000000/1
3.9. 获取总交易数¶
接口描述¶
获取总交易数量
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transaction-total
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/1/web3/transaction-total
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 总交易数 | txSum | int | 是 | ||
2 | 块高 | blockNumber | int | 是 | ||
3 | blockNumberRaw | String | 是 | |||
4 | txSumRaw | String | 是 |
2)数据格式
{
"txSum": 125,
"blockNumber": 125,
"blockNumberRaw": "0x7d",
"txSumRaw": "0x7d"
}
3.10. 获取群组内的共识状态信息接口¶
接口描述¶
返回指定群组内的共识状态信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/consensusStatus
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/consensusStatus
响应参数¶
1)数据格式
{
"baseConsensusInfo": {
"nodeNum": "4",
"consensusedBlockNumber": "233",
"highestblockNumber": "232",
"groupId": "1",
"protocolId": "65544",
"accountType": "1",
"cfgErr": "false",
"omitEmptyBlock": "true",
"nodeId": "fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d",
"allowFutureBlocks": "true",
"connectedNodes": "3",
"currentView": "102303",
"toView": "102303",
"leaderFailed": "false",
"highestblockHash": "0x7f0885a7188bd5c1b3f8c182e00be0e63a3b1653b12752cf8501ddac995e6efc",
"leaderId": null,
"leaderIdx": null,
"node_index": "3",
"node index": null,
"max_faulty_leader": "1",
"sealer.": [
"06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7",
"95efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39",
"fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d"
]
},
"viewInfos": [
{
"nodeId": "06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"view": "102300"
},
{
"nodeId": "65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7",
"view": "102301"
},
{
"nodeId": "95efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39",
"view": "102302"
},
{
"nodeId": "fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d",
"view": "102303"
}
]
}
3.11. 获取群组列表接口¶
接口描述¶
返回群组列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/groupList
调用方法¶
HTTP GET
3.12. 获取观察及共识节点列表¶
接口描述¶
返回指定群组内的共识节点和观察节点列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/groupPeers
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/groupPeers
响应参数¶
1)数据格式
[
"d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
"552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
]
3.13. 获取群组内观察节点列表¶
接口描述¶
返回指定群组内的观察节点列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/observerList
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/observerList
响应参数¶
1)数据格式
[ "d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7a165010"
]
3.14. 获取已连接的P2P节点信息¶
接口描述¶
返回指定群组内已连接的P2P节点信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/peers
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/peers
响应参数¶
1)数据格式
{
"blockNumber": 0,
"endPoint": "string",
"genesisHash": "string",
"groupNodeIDInfo": [
{
"group": "string",
"nodeIDList": [
"string"
]
}
],
"latestHash": "string",
"nodeID": "string",
"p2pNodeID": "string",
"peers": [
{
"endPoint": "string",
"groupNodeIDInfo": [
{
"group": "string",
"nodeIDList": [
"string"
]
}
],
"p2pNodeID": "string"
}
]
}
3.15. 获取群组内正在处理的交易数¶
接口描述¶
获取群组内正在处理的交易数
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/pending-transactions-count
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/pending-transactions-count
3.16. 获取共识节点接口¶
接口描述¶
返回群组内共识节点列表
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/sealerList
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/sealerList
响应参数¶
1)数据格式
[
"d822165959a0ed217df6541f1a7dd38b79336ff571dd5f8f85ad76f3e7ec097e1eabd8b03e4a757fd5a9fb0eea905aded56aaf44df83c34b73acb9ab7ac65010",
"adfa2f9116d7ff68e0deb75307fa1595d636bf097ad1de4fb55cff00e4fef40b453abb30388aa2112bf5cd4c987afe2e047250f7049791aa1ee7091c9e2ab7bb",
"552398be0eef124c000e632b0b76a48c52b6cfbd547d92c15527c2d1df15fab2bcded48353db22526c3540e4ab2027630722889f20a4a614bb11a7887a85941b",
"dde0bbf5eb3a731e6da861586e98e088e16e6fdd9afae2f2c213cead20a4f5eaa3910042b70d62266d2350d98a43c1f235c8e0da384448384893857873abdb75"
]
3.17 区块/交易¶
接口描述¶
如果输入块高就返回区块信息,如果输入交易hash就返回交易信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/search?input={inputValue}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 查询参数 | inputValue | int/String | 是 | 如果输入块高就返回区块信息,如果输入交易hash就返回交易信息 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/search?input=123
响应参数¶
1)数据格式
{
"number": 123,
"hash": "0xa12a4a8d26a15fcff6f67acf94a3fb2c08d4476806009be40fe4026fd622419d",
"parentHash": "0x898c6b1657d4eb26307b39f248e471498975eb820671c7540fa516e6c7b411e8",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"transactionsRoot": "0xa94acacd692cf3b23e19b429ce89c2016020b2264854fd609ba2b16f0c7d5f73",
"receiptsRoot": "0x9529b51c1f7ddd178ffd4a65d146b50cfc0beb405a808677dfddd694cf555a09",
"dbHash": "0x3047354b6776fd1f02911f2c4fc4aa1b215b3df53cc7504a71b5f3bfe12eca3a",
"stateRoot": "0x3047354b6776fd1f02911f2c4fc4aa1b215b3df53cc7504a71b5f3bfe12eca3a",
"sealer": "0x1",
"sealerList": [
"06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7",
"95efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39",
"fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d"
],
"extraData": [],
"gasLimit": "0",
"gasUsed": "0",
"timestamp": "1621928850887",
"signatureList": [
{
"index": "0x3",
"signature": "0x8549a8adddb9ff2d8d472b7a65ca414a7f10519f59e11244b9e92fed2e30f29cc272938a695ebb1ead579bdaed401b6aa31395890139abe406518471efa55d6afe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d"
},
{
"index": "0x1",
"signature": "0x0ff480d6c3fe5908c554653376492cba23cfc938bc0847298c9c8b4c140b417be1990d25c0239f9b18e24276e864e1f2ac4beab47ddf5277a767bb7c93e143ed65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7"
},
{
"index": "0x2",
"signature": "0x50aa1513c390e5e61221418aa46f8dd45e3ce6e8c0a6fa5aa75650517560589590172b1e6cc64e9ba7ab45c964ff925524cecf6c2be0a28ea11426febb69305195efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39"
}
],
"transactions": [
{
"blockHash": "0xa12a4a8d26a15fcff6f67acf94a3fb2c08d4476806009be40fe4026fd622419d",
"blockNumber": 123,
"from": "0x1cd8126354aa951dc8ed083ed91fd31fad1f50d8",
"gas": "0x5f5e100",
"hash": "0xbe858390cf0bd94f9d17c6ab5e04a7d354f9482f2568f067bdc2529a0af324db",
"input": "0x25e85d16000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000803935656661666135313937373936653765646636343731393164653833663432353964376362623036306634626163353836386265343734303337663439313434643538316331356438616566396230376437386631383034316135663433633363323633353265626266353538336364323330373033353863386662613339",
"nonce": "0x1479caf2ff5f1a6121beac93c85b59c36280ffe6a7f124cbc3d232021fa3307",
"to": "0x0000000000000000000000000000000000001003",
"transactionIndex": "0x0",
"value": "0x0",
"gasPrice": "0x1",
"blockLimit": "0x26e",
"chainId": "0x1",
"groupId": "0x1",
"extraData": "0x",
"signature": {
"r": "0x36edc104cc5c2c5c992f9804bd3415378f93c18ebc9cdeb7794c08b1c95fd7ad",
"s": "0xed555fe3a192acc5ea01951f7286f93cff3471e84731a2942968a2fd9a9a14bc",
"v": "0xd3a0fac51c66adf23bfccc6bb3aaa3d3623040912963ceb818ca2d8b1fb649c64bce64d99a8d9a39158b2c713101dbca10a478131dcae7e42d156e0e69455652",
"signature": "0x36edc104cc5c2c5c992f9804bd3415378f93c18ebc9cdeb7794c08b1c95fd7aded555fe3a192acc5ea01951f7286f93cff3471e84731a2942968a2fd9a9a14bcd3a0fac51c66adf23bfccc6bb3aaa3d3623040912963ceb818ca2d8b1fb649c64bce64d99a8d9a39158b2c713101dbca10a478131dcae7e42d156e0e69455652"
}
}
]
}
3.18. 获取群组内同步状态信息¶
接口描述¶
获取群组内同步状态信息
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/syncStatus
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/syncStatus
响应参数¶
1)数据格式
{
"isSyncing": "false",
"protocolId": "65545",
"genesisHash": "1caec77e0ff42af4f045af2ba5503c775c33430085b246374cdd23d1c9191173",
"nodeId": "fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d",
"blockNumber": "232",
"latestHash": "7f0885a7188bd5c1b3f8c182e00be0e63a3b1653b12752cf8501ddac995e6efc",
"knownHighestNumber": "232",
"txPoolSize": "0",
"peers": [
{
"nodeId": "06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"genesisHash": "1caec77e0ff42af4f045af2ba5503c775c33430085b246374cdd23d1c9191173",
"blockNumber": "232",
"latestHash": "7f0885a7188bd5c1b3f8c182e00be0e63a3b1653b12752cf8501ddac995e6efc"
},
{
"nodeId": "65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7",
"genesisHash": "1caec77e0ff42af4f045af2ba5503c775c33430085b246374cdd23d1c9191173",
"blockNumber": "232",
"latestHash": "7f0885a7188bd5c1b3f8c182e00be0e63a3b1653b12752cf8501ddac995e6efc"
},
{
"nodeId": "95efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39",
"genesisHash": "1caec77e0ff42af4f045af2ba5503c775c33430085b246374cdd23d1c9191173",
"blockNumber": "232",
"latestHash": "7f0885a7188bd5c1b3f8c182e00be0e63a3b1653b12752cf8501ddac995e6efc"
}
],
"knownLatestHash": "7f0885a7188bd5c1b3f8c182e00be0e63a3b1653b12752cf8501ddac995e6efc"
}
3.19. 刷新前置¶
接口描述¶
刷新前置的群组列表,功能与groupList
类似
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/refresh
调用方法¶
HTTP GET
响应参数¶
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.20. 获取区块的时间戳与交易量¶
接口描述¶
根据块高获取区块的时间戳与区块中的交易数
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/blockStat/{blockNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组id | groupId | String | 是 | 操作的群组编号 | |
2 | 块高 | blockNumber | BigInteger | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/blockStat/5
3.21. 批量获取区块内交易回执接口¶
接口描述¶
根据块高批量获取区块交易回执
接口URL¶
http://localhost:5002/WeBASE-Front/{groupId}/web3/transactionReceipt/{transHash}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组编号 | groupId | String | 是 | ||
2 | 交易哈希 | transHash | String | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/transReceipt/batchByNumber/{blockNumber}?start={start}&count={count}
响应参数¶
2)数据格式
{
"blockNumber": "string",
"contractAddress": "string",
"from": "string",
"gasUsed": "string",
"hash": "string",
"input": "string",
"logEntries": [
{
"address": "string",
"blockNumber": "string",
"data": "string",
"topic": [
"string"
]
}
],
"message": "string",
"output": "string",
"receiptProof": [
{
"left": [
"string"
],
"right": [
"string"
]
}
],
"status": 0,
"statusOK": true,
"to": "string",
"transactionHash": "string",
"transactionProof": [
{
"left": [
"string"
],
"right": [
"string"
]
}
],
"version": "string"
}
4.链上信息接口¶
4.1. 查询链上信息¶
接口描述¶
获取链上信息
接口URL¶
http://localhost:5002/WeBASE-Front/chain
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 开始日期 | beginDate | LocalDateTime | 是 | ||
2 | 结束日期 | endDate | LocalDateTime | 是 | ||
3 | 对比开始日期 | contrastBeginDate | LocalDateTime | 否 | ||
4 | 对比结束日期 | contrastEndDate | LocalDateTime | 否 | ||
5 | 间隔 | gap | int | 否 | 默认为1 | |
6 | 群组编号 | groupId | String | 是 | 默认为1 |
2)入参示例
localhost:5002/WeBASE-Front/chain?beginDate=2019-03-13T00:00:00&endDate=2019-03-13T14:34:22&contrastBeginDate=2019-03-13T00:00:00&contrastEndDate=2019-03-13T14:34:22&gap=60&groupId=group
响应参数¶
1)参数表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | data | Array | 否 | 返回信息列表 |
1.1 | Object | 返回信息实体 | ||
1.1.1 | metricType | String | 否 | 测量类型:blockHeight(块高)、pbftView(pbft视图)、pendingCount(待处理交易数量) |
1.1.2 | data | Object | 否 | |
1.1.2.1 | lineDataList | Object | 否 | 指定时间的数据 |
1.1.2.1.1 | timestampList | List |
否 | 时间戳列表 |
1.1.2.1.2 | valueList | List |
否 | 值列表 |
1.1.2.2 | contrastDataList | Object | 否 | 比对时间的数据 |
1.1.2.2.1 | timestampList | List |
否 | 时间戳列表 |
1.1.2.2.2 | valueList | List |
否 | 值列表 |
2)出参示例
[
{
"metricType": "blockHeight",
"data": {
"lineDataList": {
"timestampList": [
1552406401042,
1552406701001
],
"valueList": [
747309,
747309
]
},
"contrastDataList": {
"timestampList": [
1552320005000,
1552320301001
],
"valueList": [
null,
747309
]
}
}
},
{
"metricType": "pbftView",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [
118457,
157604
]
},
"contrastDataList": {
"timestampList": null,
"valueList": [
null,
33298
]
}
}
}
]
4.2. 分页查询链上信息¶
接口描述¶
获取链上信息
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 开始日期 | beginDate | String | 是 | ||
2 | 结束日期 | endDate | String | 是 | ||
3 | 分页页数 | pageNumber | int | 否 | ||
4 | 分页大小 | pageSize | int | 否 | ||
5 | 群组编号 | groupId | String | 是 | 默认为1 |
2)入参示例
localhost:5002/WeBASE-Front/chain/pagingQuery?groupId=1&pageNumber=1&pageSize=10
响应参数¶
{
"code": 0,
"message": "success",
"data": [],
"totalCount": 0
}
5. 交易接口¶
5.1. 交易处理接口(结合WeBASE-Sign)¶
接口描述¶
通过此接口对合约进行调用,前置根据调用的合约方法是否是“constant”方法区分返回信息,“constant”方法为查询,返回要查询的信息。非“constant”方法为发送数据上链,返回块hash、块高、交易hash等信息。
当合约方法为非“constant”方法,要发送数据上链时,此接口需结合WeBASE-Sign使用。通过调用WeBASE-Sign服务的签名接口让相关用户对数据进行签名,拿回签名数据再发送上链。需要调用此接口时,工程配置文件application.yml中的配置”keyServer”需配置WeBASE-Sign服务的ip和端口,并保证WeBASE-Sign服务正常和存在相关用户。
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过本地私钥(测试用户)交易处理接口(非WeBASE-Sign签名交易),可查看其他接口-交易处理接口(本地签名)
接口URL¶
http://localhost:5002/WeBASE-Front/trans/handleWithSign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | WeBASE-Sign用户编号(查询方法可不传) |
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | ||
4 | 方法名 | funcName | String | 是 | ||
5 | 合约编译后生成的abi文件内容 | contractAbi | List | 是 | 合约中单个函数的ABI,若不存在同名函数可以传入整个合约ABI,格式:JSONArray | |
6 | 方法参数 | funcParam | List | 否 | JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] | |
7 | 群组ID | groupId | String | 是 | 默认为1 | |
8 | 是否使用cns调用 | useCns | bool | 是 | ||
9 | cns名称 | cnsName | String | 否 | CNS名称,useCns为true时不能为空 | |
10 | cns版本 | version | String | 否 | CNS版本,useCns为true时不能为空 | |
11 | 合约路径 | contractPath | String | 否 |
2)数据格式
{
"cnsName": "string",
"contractAbi": [
{}
],
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"funcName": "string",
"funcParam": [
{}
],
"groupId": "string",
"signUserId": "string",
"useCns": true,
"version": "string"
}
示例:
curl -X POST "http://localhost:5002/WeBASE-Front/trans/handleWithSign" -H "accept: */*" -H "Content-Type: application/json" -d "{\"groupId\":\"1\",\"signUserId\":\"f4975519b0274e6ca8283650a7e1bc07\",\"contractName\":\"HelloWorld\",\"contractPath\":\"/\",\"version\":\"\",\"funcName\":\"set\",\"funcParam\":[\"333\"],\"contractAddress\":\"0xe10441d9179cf0424aae808b51bc85dcbbfe1447\",\"contractAbi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"funcId\":2}],\"useAes\":false,\"useCns\":false,\"cnsName\":\"\"}"
响应参数¶
a、正确查询交易返回值信息
{"Hi,Welcome!"}
b、正确发送数据上链返回值信息(交易收据)
{
"transactionHash": "0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429",
"transactionIndex": "0x0",
"root": "0x8cbc3f2c0e35a71738909e3b388efa6697084b05badd3a3bd3c64f0575c78c15",
"blockNumber": "2",
"blockHash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"from": "0x9d75e0ee66cfef16897b601624b60413d988ae7d",
"to": "0x0000000000000000000000000000000000000000",
"gasUsed": "316449",
"contractAddress": "0xa8af0ee580d8af674a60341030ddbc45431bc235",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"status": "0x0",
"statusMsg": "None",
"input": "0x608060405234801561001057600080fd5b506103e3806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d1461005c5780633590b49f146100ec57806362e8d6ce14610155575b600080fd5b34801561006857600080fd5b5061007161016c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b1578082015181840152602081019050610096565b50505050905090810190601f1680156100de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100f857600080fd5b50610153600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061020e565b005b34801561016157600080fd5b5061016a6102c4565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102045780601f106101d957610100808354040283529160200191610204565b820191906000526020600020905b8154815290600101906020018083116101e757829003601f168201915b5050505050905090565b7f5715c9562eaf8d524d564edb392acddefc81d8133e2fc3b8125a260b1b413fda816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a180600090805190602001906102c0929190610312565b5050565b6040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061030f929190610312565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061035357805160ff1916838001178555610381565b82800160010185558215610381579182015b82811115610380578251825591602001919060010190610365565b5b50905061038e9190610392565b5090565b6103b491905b808211156103b0576000816000905550600101610398565b5090565b905600a165627a7a72305820f3088deb3d14c6893440e4769f2389e9335e04faa10e6de5b4c93af15d1a34e80029",
"output": "0x",
"txProof": null,
"receiptProof": null,
"message": null,
"statusOK": true
}
5.2. 交易处理接口(本地签名)¶
接口描述¶
此接口为WeBASE-Front使用本地私钥(页面中的测试用户)进行签名
通过合约信息进行调用,前置根据调用的合约方法是否是“constant”方法区分返回信息,“constant”方法为查询,返回要查询的信息。非“constant”方法为发送数据上链,返回块hash、块高、交易hash等信息。
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
查看WeBASE-Front通过WeBASE-Sign交易处理的接口(非本地私钥签名交易),可查看合约接口-交易处理接口(结合WeBASE-Sign)
接口URL¶
http://localhost:5002/WeBASE-Front/trans/handle
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户地址 | user | String | 是 | 用户地址,可通过/privateKey 接口创建 |
|
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | ||
4 | 方法名 | funcName | String | 是 | ||
5 | 合约编译后生成的abi文件内容 | contractAbi | List | 是 | 合约中单个函数的ABI,若不存在同名函数可以传入整个合约ABI,格式:JSONArray | |
6 | 方法参数 | funcParam | List | 否 | JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]],根据所调用的合约方法判断是否必填 | |
7 | 群组ID | groupId | String | 是 | ||
8 | 合约路径 | contractPath | int | 否 | ||
9 | 是否使用cns调用 | useCns | boolean | 是 | ||
10 | cns名称 | cnsName | String | 否 | CNS名称,useCns为true时不能为空 | |
11 | cns版本 | version | String | 否 | CNS版本,useCns为true时不能为空 | |
12 | 是否使用aes | useAes | boolean | 是 |
2)数据格式
{
"cnsName": "string",
"contractAbi": [
{}
],
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"funcName": "string",
"funcParam": [
{}
],
"groupId": "string",
"useAes": true,
"useCns": true,
"user": "string",
"version": "string"
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{\"groupId\":\"1\",\"user\":\"0x7bfa3539c8761978f0a2a1f7f240bde97819fb03\",\"contractName\":\"HelloWorld\",\"contractPath\":\"/\",\"version\":\"\",\"funcName\":\"set\",\"funcParam\":[\"333\"],\"contractAddress\":\"0xe10441d9179cf0424aae808b51bc85dcbbfe1447\",\"contractAbi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"funcId\":2}],\"useAes\":false,\"useCns\":false,\"cnsName\":\"\"}' http://10.0.0.1:5002/WeBASE-Front/trans/handle
传入合约abi:
{
"groupId": "group",
"user": "0x7bfa3539c8761978f0a2a1f7f240bde97819fb03",
"contractName": "HelloWorld",
"contractPath": "/",
"version": "",
"funcName": "set",
"funcParam": ["333"],
"contractAddress": "0xe10441d9179cf0424aae808b51bc85dcbbfe1447",
"contractAbi": [{
"inputs": [{
"internalType": "string",
"name": "n",
"type": "string"
}],
"name": "set",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function",
"funcId": 2
}],
"useAes": false,
"useCns": false,
"cnsName": ""
}
响应参数¶
a、正确查询交易返回值信息
{"Hi,Welcome!"}
b、正确发送数据上链返回值信息(交易收据)
{
"transactionHash": "0x69ced0162a0c3892e4eaa3091b831ac3aaeb772c062746b20891ceaf8a4fb429",
"transactionIndex": "0x0",
"root": "0x8cbc3f2c0e35a71738909e3b388efa6697084b05badd3a3bd3c64f0575c78c15",
"blockNumber": "2",
"blockHash": "0xf58f4f43b3761f4863ad366c4a7e2a812ed68df9f7bcad6b502fd544665e7625",
"from": "0x9d75e0ee66cfef16897b601624b60413d988ae7d",
"to": "0x0000000000000000000000000000000000000000",
"gasUsed": "316449",
"contractAddress": "0xa8af0ee580d8af674a60341030ddbc45431bc235",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"status": "0x0",
"statusMsg": "None",
"input": "0x608060405234801561001057600080fd5b506103e3806100206000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d1461005c5780633590b49f146100ec57806362e8d6ce14610155575b600080fd5b34801561006857600080fd5b5061007161016c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b1578082015181840152602081019050610096565b50505050905090810190601f1680156100de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100f857600080fd5b50610153600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061020e565b005b34801561016157600080fd5b5061016a6102c4565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102045780601f106101d957610100808354040283529160200191610204565b820191906000526020600020905b8154815290600101906020018083116101e757829003601f168201915b5050505050905090565b7f5715c9562eaf8d524d564edb392acddefc81d8133e2fc3b8125a260b1b413fda816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a180600090805190602001906102c0929190610312565b5050565b6040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061030f929190610312565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061035357805160ff1916838001178555610381565b82800160010185558215610381579182015b82811115610380578251825591602001919060010190610365565b5b50905061038e9190610392565b5090565b6103b491905b808211156103b0576000816000905550600101610398565b5090565b905600a165627a7a72305820f3088deb3d14c6893440e4769f2389e9335e04faa10e6de5b4c93af15d1a34e80029",
"output": "0x",
"txProof": null,
"receiptProof": null,
"message": null,
"statusOK": true
}
5.3. 已签名交易发送¶
接口描述¶
发送已签名的交易上链,返回交易收据;可结合/trans/convertRawTxStr/local
或/trans/convertRawTxStr/withSign
接口组装已签名的交易
接口URL¶
http://localhost:5002/WeBASE-Front/trans/signed-transaction
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 已签名交易编码值 | signedStr | String | 是 | /trans/convertRawTxStr/local 或/trans/convertRawTxStr/withSign 接口组装已签名的交易 |
|
2 | 是否同步发送 | sync | bool | 是 | ||
2 | 群组ID | groupId | String | 是 |
2)数据格式
{
"groupId": "string",
"signedStr": "string",
"sync": true
}
响应参数¶
1)数据格式
{
"transactionHash": "0xd1234cdb673447b654874d05d4ed98be89f3cb7c5a6c12bc51e1274a03af029c",
"transactionIndex": "0x0",
"root": "0xeecf2b6bbb028e38e704ca88fe1d9f5e3d43197b32c3336d3273d86fb3a135f0",
"blockNumber": "0xa9",
"blockHash": "0x906bdf0747ba68c03e6cf73463db62fdbd8ab8debc149f890475775d7c6a8af7",
"from": "0x7bfa3539c8761978f0a2a1f7f240bde97819fb03",
"to": "0xe10441d9179cf0424aae808b51bc85dcbbfe1447",
"gasUsed": "0x710b",
"contractAddress": "0x0000000000000000000000000000000000000000",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"status": "0x0",
"statusMsg": "None",
"input": "0x3590b49f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033333330000000000000000000000000000000000000000000000000000000000",
"output": "0x",
"txProof": null,
"receiptProof": null,
"message": "Success",
"statusOK": true
}
5.4. 已编码查询交易发送¶
接口描述¶
发送已编码的查询交易,返回合约的返回值;其中encodeStr
字段可通过/trans/encodeFunction
接口获取合约函数的编码值
接口URL¶
http://localhost:5002/WeBASE-Front/trans/query-transaction
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约函数编码值 | encodeStr | String | 是 | 可通过/trans/encodeFunction 接口获取合约函数的编码值 |
|
2 | 合约地址 | contractAddress | String | 是 | ||
3 | 群组ID | groupId | String | 是 | ||
4 | 合约名 | funcName | String | 是 | ||
5 | 合约abi | contractAbi | String | 是 | ||
6 | 用户地址 | userAddress | String | 否 |
2)数据格式
{
"contractAbi": "string",
"contractAddress": "string",
"encodeStr": "string",
"funcName": "string",
"groupId": "string",
"userAddress": "string"
}
5.5. Hash计算¶
接口描述¶
计算HASH和签名值
接口URL¶
http://localhost:5002/WeBASE-Front/trans/signMessageHash
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户地址 | user | String | 是 | 用户地址,可通过/privateKey 接口创建 |
|
2 | Hash值 | hash | String | 是 | ||
3 | 群组id | groupId | String | 是 | ||
4 | 签名用户id | signUserId | String | 是 |
2)数据格式
{
"groupId": "string",
"hash": "string",
"signUserId": "string",
"user": "string"
}
响应参数¶
1)数据格式
{
"v": 0,
"r": "0x2a76a45bcf1113615f796cc01b23c57f81f20ce79500080bb34c7994ed04de06",
"s": "0x4f111eb37720e2618d8906368c825fd3cbe89b2781cb678efafb42399594a580",
"p": "0x4405f9d5d6ccff709b6543bc8ac24cbb649d3267a66db19ab8f85f3b884a8505f086c581490e7e50558879abde9c4d07fc2daab92f81c0eb4b805af3c8895cfc"
}
5.6. 获取签名后的交易体编码值(结合WeBASE-Sign)¶
接口描述¶
构造交易体RawTransaction并将交易体编码,通过传入的signUserId
签名服务的用户ID,使用对应的私钥对交易提进行签名后,返回已签名的交易体编码值(十六进制字符串)
签名后的交易的编码值可以直接通过/trans/signed-transaction
接口提交到链上
接口URL¶
http://localhost:5002/WeBASE-Front/trans/convertRawTxStr/withSign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | WeBASE-Sign用户编号,若为空则返回未签名交易提编码值 |
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | ||
4 | 方法名 | funcName | String | 是 | ||
5 | 合约编译后生成的abi文件内容 | contractAbi | List | 是 | 合约中单个函数的ABI,若不存在同名函数可以传入整个合约ABI,格式:JSONArray | |
6 | 方法参数 | funcParam | List | 否 | JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]] | |
7 | 群组ID | groupId | String | 是 | ||
8 | 是否使用cns调用 | useCns | bool | 是 | ||
9 | cns名称 | cnsName | String | 否 | CNS名称,useCns为true时不能为空 | |
10 | cns版本 | version | String | 否 | CNS版本,useCns为true时不能为空 | |
11 | 合约路径 | contractPath | String | 否 |
2)数据格式
{
"cnsName": "string",
"contractAbi": [
{}
],
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"funcName": "string",
"funcParam": [
{}
],
"groupId": "string",
"signUserId": "string",
"useCns": true,
"version": "string"
}
响应参数¶
0xf9012da002c1442b6ce974291ec317db9859e8310de46f6636d105f19fee67f10ac60b2f018405f5e10082029e94e10441d9179cf0424aae808b51bc85dcbbfe144780b8643590b49f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033333330000000000000000000000000000000000000000000000000000000000010180b8407d3efe268051e49350d877eaba7bbe6369a44263aec6e47fcba2ac1aff849261e833361bc67befbf4566894478c011dcae3e06818a381401751d1bf8bceecedaa01605fb8fcb546b0dc79e1da004a8323b151d1f569e10cae85a3f62bad5d7150fa0d77282eb650e0f52956693177717eb31cfddcada0681973a6aed9c46f3d8eb4d
5.7. 获取签名后的交易体编码值(本地签名)¶
接口描述¶
构造交易体RawTransaction并将交易体编码,并通过传入的user
地址的私钥对交易提进行签名后,返回已签名的交易体编码值(十六进制字符串)
签名后的交易的编码值可以直接通过/trans/signed-transaction
接口提交到链上
接口URL¶
http://localhost:5002/WeBASE-Front/trans/convertRawTxStr/local
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户地址 | user | String | 是 | 用户地址,可通过/privateKey 接口创建。若user为空,则返回未签名交易编码值 |
|
2 | 合约名称 | contractName | String | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | ||
4 | 方法名 | funcName | String | 是 | ||
5 | 合约编译后生成的abi文件内容 | contractAbi | List | 是 | 合约中单个函数的ABI,若不存在同名函数可以传入整个合约ABI,格式:JSONArray | |
6 | 方法参数 | funcParam | List | 否 | JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]],根据所调用的合约方法判断是否必填 | |
7 | 群组ID | groupId | String | 是 | ||
8 | 合约路径 | contractPath | int | 否 | ||
9 | 是否使用cns调用 | useCns | bool | 是 | ||
10 | cns名称 | cnsName | String | 否 | CNS名称,useCns为true时不能为空 | |
11 | cns版本 | version | String | 否 | CNS版本,useCns为true时不能为空 | |
12 | 是否使用aes | useAes | bool | 是 |
2)数据格式
{
"cnsName": "string",
"contractAbi": [
{}
],
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"funcName": "string",
"funcParam": [
{}
],
"groupId": "string",
"useAes": true,
"useCns": true,
"user": "string",
"version": "string"
}
示例:
{
"cnsName": "string",
"contractAbi": [
{}
],
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"funcName": "string",
"funcParam": [
{}
],
"groupId": "string",
"useAes": true,
"useCns": true,
"user": "string",
"version": "string"
}
响应参数¶
1)数据格式
0xf9012da001071041dddc1b3c553b48c0fbefecc07f3812f5ce4004d47708f1c3342844db018405f5e10082029d94e10441d9179cf0424aae808b51bc85dcbbfe144780b8643590b49f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033333330000000000000000000000000000000000000000000000000000000000010180b84083bb5313e3dd7825b8b3e32d73aa8aedf9f9a8fcf435e5c37edfe4645c1af4211c12e1368024336a576f26ed624407da0b94e0bc5760514543c0b7a38fa03a7da0972843d0879ffdbdae733e8707896a532e5e1a3c7262cb84db657dd34f09111ba0786106465fe0fd2383588693cafef8934df62b188c6bb5a74eb6b9f23adaba32
5.8. 获取合约函数的编码值¶
接口描述¶
构造合约函数的编码值,适用于查询交易,合约函数的编码值可以直接通过/trans/query-transaction
接口提交到链上
接口URL¶
http://localhost:5002/WeBASE-Front/trans/encodeFunction
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 方法名 | funcName | String | 是 | ||
2 | 合约编译后生成的abi文件内容 | contractAbi | List | 是 | 合约中单个函数的ABI,若不存在同名函数可以传入整个合约ABI,格式:JSONArray | |
3 | 方法参数 | funcParam | List | 是 | JSON数组,多个参数以逗号分隔(参数为数组时同理),如:["str1",["arr1","arr2"]],根据所调用的合约方法判断是否必填,为空则使用[] 空数组代替 |
|
4 | 群组编号 | groupId | String |
2)数据格式
{
"contractAbi": [
{}
],
"funcName": "string",
"funcParam": [
{}
],
"groupId": "string"
}
示例:
6. 系统管理接口¶
使用FISCO BCOS v2.5.0 与 WeBASE-Front v1.4.1 (及)以上版本将使用预编译合约中的ChainGovernance接口(从本章节接口6.13开始),详情可参考FISCO BCOS基于角色的权限控制
6.1. 查询系统配置接口¶
接口描述¶
根据群组id获取系统配置SystemConfig的list列表,目前只支持tx_count_limit, tx_gas_limit两个参数。
接口URL¶
http://localhost:5002/WeBASE-Front/sys/config/list?groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | String | 是 | 节点所属群组ID | |
2 | 分页大小 | pageSize | int | 是 | 默认为10 | |
3 | 分页页码 | pageNumber | int | 是 | 默认为1 |
2)数据格式
http://localhost:5002/WeBASE-Front/sys/config/list?groupId=1&pageSize=5&pageNumber=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 6,
"groupId": 1,
"fromAddress": "0x",
"configKey": "tx_gas_limit",
"configValue": "300000000"
},
{
"id": 5,
"groupId": 1,
"fromAddress": "0xd0b56b4ce0e8ce5e064f896d9ad1c16b2603f285",
"configKey": "tx_count_limit",
"configValue": "10002"
}
],
"totalCount": 2
}
6.2. 设置系统配置接口¶
接口描述¶
系统配置管理员设置系统配置,目前只支持tx_count_limit, tx_gas_limit两个参数。
接口URL¶
http://localhost:5002/WeBASE-Front/sys/config
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | String | 是 | 节点所属群组ID | |
2 | 管理员地址 | fromAddress | String | 是 | ||
3 | 配置的键 | configKey | String | 是 | 目前类型两种(tx_count_limit, tx_gas_limit,用户可自定义key如tx_gas_price | |
4 | 配置的值 | configValue | String | 是 | tx_gas_limit范围为 [100000, 2147483647] | |
5 | 签名用户Id | signUserId | String | 是 |
2)数据格式
{
"configKey": "string",
"configValue": "string",
"fromAddress": "string",
"groupId": "string",
"signUserId": "string"
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"groupId": 1, "fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1", "configKey": "tx_count_limit", "configValue": "1001"}' http://10.0.0.1:5002/WeBASE-Front/sys/config
响应参数¶
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": -50000,
"message": "permission denied"
}
6.3. 查询节点接口(节点管理)¶
接口URL¶
http://localhost:5002/WeBASE-Front/precompiled/consensus/list?groupId={groupId}&pageSize={pageSize}&pageNumber={pageNumber}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | String | 是 | 节点所属群组ID | |
2 | 分页大小 | pageSize | int | 是 | 默认为10 | |
3 | 分页页码 | pageNumber | int | 是 | 默认为1 |
2)数据格式
http://localhost:5002/WeBASE-Front/precompiled/consensus/list?groupId=group&pageSize=5&pageNumber=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"nodeId": "13e0f2b94cbce924cc3737385a38587939e809fb786c4fc34a6ba3ea97693bccfa173b352ac41f1dbb97e9e4910ccbec1df38ad4020cef3b2044e833188adad9",
"nodeType": "sealer"
},
{
"nodeId": "bce4b2269c25c2cdba30155396bfe90af08c3c08cff205213477683117e4243ebe26588479519e636a5d5d93545cab778435cacacc41993f28f58f60fa5ceb72",
"nodeType": "sealer"
},
{
"nodeId": "e815cc5637cb8c3274c83215c680822e4a0110d0a8315fcf03e43e8e3944edd758c8b173c4e0076f599aa1f853fa207d47cc95d201ae8d0206b71ad5aa8c3f59",
"nodeType": "sealer"
}
],
"totalCount": 3
}
6.4. 设置节点共识状态接口(节点管理)¶
接口描述¶
节点管理相关接口,可用于节点三种共识状态的切换。分别是共识节点sealer, 观察节点observer, 游离节点remove
接口URL¶
http://localhost:5002/WeBASE-Front/precompiled/consensus
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组ID | groupId | String | 是 | 节点所属群组ID | |
2 | 管理员地址 | fromAddress | String | 是 | ||
3 | 节点类型 | nodeType | String | 是 | 节点类型:observer,sealer,remove | |
4 | 节点ID | nodeId | String | 是 | 节点id,从节点根目录/conf/node.id获取 | |
5 | 签名用户Id | signUserId | String | 是 | ||
6 | 权重 | weight | int | 否 |
2)数据格式
{
"fromAddress": "string",
"groupId": "string",
"nodeId": "string",
"nodeType": "string",
"signUserId": "string",
"weight": 0
}
示例:
curl -l -H "Content-type: application/json" -X POST -d '{"groupId": 1, "fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1", "configKey": "tx_count_limit", "configValue": "1001"}' http://10.0.0.1:5002/WeBASE-Front/sys/config
响应参数¶
a、成功:
{
"code": 0,
"message": "success"
}
b、失败:
{
"code": -50000,
"message": "permission denied"
}
7. Abi管理接口¶
7.1. 获取Abi信息¶
接口描述¶
根据abiId获取abi信息
接口URL¶
http://localhost:5002/WeBASE-Front/abi/{abiId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | abi编号 | abiId | Long | 是 | abi编号 |
2)数据格式
http://localhost:5002/WeBASE-Front/abi/{abiId}
响应参数¶
1)数据格式
a、成功:
{
"code": 0,
"message": "success",
"data": {
"abiId": 1,
"groupId": 1,
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357...",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
}
7.2. 获取Abi信息分页列表¶
接口描述¶
获取abi信息的列表
接口URL¶
http://localhost:5002/WeBASE-Front/abi/list/{groupId}/{pageNumber}/{pageSize}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组id | groupId | String | 是 | 群组编号 | |
2 | 页码 | pageNumber | int | 是 | ||
3 | 页大小 | pageSize | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/abi/list/{groupId}/{pageNumber}/{pageSize}
响应参数¶
1)数据格式
a、成功:
{
"code": 0,
"message": "success",
"data": [
{
"abiId": 1,
"groupId": 1,
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463fffff...29",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
],
"totalCount": 1
}
7.3. 导入已部署合约的abi¶
接口描述¶
将其他平台已部署的合约导入到本平台进行管理
接口URL¶
http://localhost:5002/WeBASE-Front/abi
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约地址 | contractAddress | String | 是 | 合约地址 | |
3 | 合约名 | contractName | String | 是 | ||
4 | 合约abi | contractAbi | List | 是 | 合约的ABI | |
5 | abi编号 | abiId | Long |
2)数据格式
{
"abiId": 0,
"contractAbi": [
{}
],
"contractAddress": "string",
"contractName": "string",
"groupId": "string"
}
7.4. 修改已导入的合约abi¶
接口描述¶
更新已导入的合约abi内容
接口URL¶
http://localhost:5002/WeBASE-Front/abi
调用方法¶
HTTP PUT
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | abi编号 | abiId | Long | 是 | ||
2 | 所属群组 | groupId | String | 是 | ||
3 | 合约地址 | contractAddress | String | 是 | 合约地址 | |
4 | 合约名 | contractName | String | 是 | ||
5 | 合约abi | contractAbi | List | 是 | 合约的ABI |
2)数据格式
{
"abiId": 0,
"contractAbi": [
{}
],
"contractAddress": "string",
"contractName": "string",
"groupId": "string"
}
8. 其他接口¶
8.1. 查询是否使用国密¶
接口描述¶
获取WeBASE-Front的encryptType
,即是否使用国密版;
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 群组Id | groupId | String |
2)数据格式
http://localhost:5002/WeBASE-Front/group/web3/encrypt
8.2. 查询WeBASE-Front版本¶
接口描述¶
获取WeBASE-Front的版本号
接口URL¶
http://localhost:5002/WeBASE-Front/version
调用方法¶
HTTP GET
8.3. 查询前置连接的WeBASE-Sign版本¶
接口描述¶
获取WeBASE-Front的所连接的WeBASE-Sign的版本号
接口URL¶
http://localhost:5002/WeBASE-Front/version/sign
调用方法¶
HTTP GET
8.4. 查询前置包含的solidity v0.6.10文件¶
接口描述¶
获取WeBASE-Front的本地conf/solcjs
中包含的solidity 0.6.10的js文件列表
如需要使用solidity 0.6.10,则需要手动下载CDN中solidity的v0.6.10.js(国密v0.6.10-gm.js),并在WeBASE-Front的conf文件夹中创建solcjs文件夹,并将js文件复制到该文件夹。
注:使用webase-front.zip安装包直接部署则不需要手动放置js文件
接口URL¶
http://localhost:5002/WeBASE-Front/solc/list
调用方法¶
HTTP GET
9. 合约仓库¶
9.1. 获取合约仓库列表¶
接口描述¶
返回合约仓库信息列表
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractStoreList
调用方法¶
HTTP GET
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"storeId": 1,
"storeName": "工具箱",
"storeName_en": "Toolbox",
"storeType": "1",
"storeIcon": "toolboxId",
"storeDesc": "工具箱中有常用的工具合约",
"storeDetail": "工具箱中有常用的工具合约",
"storeDesc_en": "Toolbox Contract suite",
"storeDetail_en": "Toolbox Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"storeId": 2,
"storeName": "存证应用",
"storeName_en": "Evidence",
"storeType": "2",
"storeIcon": "evidenceId",
"storeDesc": "一套区块链存证合约",
"storeDetail": "一套区块链存证合约",
"storeDesc_en": "Evidence Contract suite",
"storeDetail_en": "Evidence Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"storeId": 3,
"storeName": "积分应用",
"storeName_en": "Points",
"storeType": "3",
"storeIcon": "pointsId",
"storeDesc": "一套积分合约",
"storeDetail": "一套积分合约",
"storeDesc_en": "Points Contract suite",
"storeDetail_en": "Points Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
9.2. 根据仓库编号获取仓库信息¶
接口描述¶
返回合约仓库信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/{storeId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 仓库编号 | storeId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractStoreById/1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"storeId": 1,
"storeName": "工具箱",
"storeName_en": "Toolbox",
"storeType": "1",
"storeIcon": "toolboxId",
"storeDesc": "工具箱中有常用的工具合约",
"storeDetail": "工具箱中有常用的工具合约",
"storeDesc_en": "Toolbox Contract suite",
"storeDetail_en": "Toolbox Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
9.3. 根据仓库编号获取合约文件夹信息¶
接口描述¶
返回合约文件夹信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/{storeId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 仓库编号 | storeId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getFolderItemListByStoreId/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"contractFolderId": 2,
"storeId": 2,
"contractFolderName": "Evidence",
"contractFolderDesc": "Evidence",
"contractFolderDetail": "Evidence",
"contractFolderDesc_en": "Evidence",
"contractFolderDetail_en": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
9.4. 根据合约文件夹编号获取合约文件夹信息¶
接口描述¶
返回合约文件夹信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/{contractFolderId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约文件夹编号 | contractFolderId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractFolderById/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"contractFolderId": 2,
"storeId": 2,
"contractFolderName": "Evidence",
"contractFolderDesc": "Evidence",
"contractFolderDetail": "Evidence",
"contractFolderDesc_en": "Evidence",
"contractFolderDetail_en": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
9.5. 根据文件夹编号获取合约列表¶
接口描述¶
返回合约信息列表
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractItemByFolderId/{folderId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 文件夹编号 | folderId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractItemByFolderId/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 4,
"contractFolderId": 2,
"contractName": "Evidence",
"contractDesc": "Evidence",
"contractSrc": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YUFCSXsgZnVuY3Rpb24gdmVyaWZ5KGFkZHJlc3MgYWRkcilwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhib29sKXt9CmZ1bmN0aW9uIGdldFNpZ25lcih1aW50IGluZGV4KXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3Mpe30gCmZ1bmN0aW9uIGdldFNpZ25lcnNTaXplKCkgcHVibGljIGNvbnN0YW50IHJldHVybnModWludCl7fQp9Cgpjb250cmFjdCBFdmlkZW5jZXsKICAgIAogICAgc3RyaW5nIGV2aWRlbmNlOwogICAgc3RyaW5nIGV2aWRlbmNlSW5mbzsKICAgIHN0cmluZyBldmlkZW5jZUlkOwogICAgdWludDhbXSBfdjsKICAgIGJ5dGVzMzJbXSBfcjsKICAgIGJ5dGVzMzJbXSBfczsKICAgIGFkZHJlc3NbXSBzaWduZXJzOwogICAgYWRkcmVzcyBwdWJsaWMgc2lnbmVyc0FkZHI7CiAgICAKICAgICAgICBldmVudCBhZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IG5ld1NpZ25hdHVyZXNFdmVudChzdHJpbmcgZXZpLCBzdHJpbmcgaW5mbywgc3RyaW5nIGlkLCB1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcyxhZGRyZXNzIGFkZHIpOwogICAgICAgIGV2ZW50IGVycm9yTmV3U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLGFkZHJlc3MgYWRkcik7CiAgICAgICAgZXZlbnQgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsYWRkcmVzcyBhZGRyKTsKICAgICAgICBldmVudCBhZGRSZXBlYXRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsIGFkZHJlc3MgYWRkcik7CgogICAgZnVuY3Rpb24gQ2FsbFZlcmlmeShhZGRyZXNzIGFkZHIpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpIHsKICAgICAgICByZXR1cm4gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikudmVyaWZ5KGFkZHIpOwogICAgfQoKICAgICAgIGZ1bmN0aW9uIEV2aWRlbmNlKHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLCBhZGRyZXNzIGFkZHIsIGFkZHJlc3Mgc2VuZGVyKSBwdWJsaWMgewogICAgICAgc2lnbmVyc0FkZHIgPSBhZGRyOwogICAgICAgaWYoQ2FsbFZlcmlmeShzZW5kZXIpKQogICAgICAgewogICAgICAgICAgIGV2aWRlbmNlID0gZXZpOwogICAgICAgICAgIGV2aWRlbmNlSW5mbyA9IGluZm87CiAgICAgICAgICAgZXZpZGVuY2VJZCA9IGlkOwogICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgX3IucHVzaChyKTsKICAgICAgICAgICBfcy5wdXNoKHMpOwogICAgICAgICAgIHNpZ25lcnMucHVzaChzZW5kZXIpOwogICAgICAgICAgIG5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgICBlcnJvck5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RXZpZGVuY2VJbmZvKCkgcHVibGljIGNvbnN0YW50IHJldHVybnMoc3RyaW5nKXsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlSW5mbzsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRFdmlkZW5jZSgpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ4W10sYnl0ZXMzMltdLGJ5dGVzMzJbXSxhZGRyZXNzW10pewogICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICByZXR1cm4oZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsX3YsX3IsX3Msc2lnbmVyTGlzdCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkU2lnbmF0dXJlcyh1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcykgcHVibGljIHJldHVybnMoYm9vbCkgewogICAgICAgIGZvcih1aW50IGk9IDAgO2k8c2lnbmVycy5sZW5ndGggO2krKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKG1zZy5zZW5kZXIgPT0gc2lnbmVyc1tpXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoIF92W2ldID09IHYgJiYgX3JbaV0gPT0gciAmJiBfc1tpXSA9PSBzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZFJlcGVhdFNpZ25hdHVyZXNFdmVudChldmlkZW5jZSxldmlkZW5jZUluZm8sZXZpZGVuY2VJZCx2LHIscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgIGlmKENhbGxWZXJpZnkobXNnLnNlbmRlcikpCiAgICAgICB7CiAgICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgIF9yLnB1c2gocik7CiAgICAgICAgICAgIF9zLnB1c2gocyk7CiAgICAgICAgICAgIHNpZ25lcnMucHVzaChtc2cuc2VuZGVyKTsKICAgICAgICAgICAgYWRkU2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSW5mbyxldmlkZW5jZUlkLHYscixzKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgICAgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRTaWduZXJzKClwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhhZGRyZXNzW10pCiAgICB7CiAgICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNpZ25lckxpc3Q7CiAgICB9Cn0=",
"contractDesc_en": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"contractId": 5,
"contractFolderId": 2,
"contractName": "EvidenceSignersData",
"contractDesc": "EvidenceSignersData",
"contractSrc": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKaW1wb3J0ICJFdmlkZW5jZS5zb2wiOwoKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YXsKICAgICAgICBhZGRyZXNzW10gc2lnbmVyczsKCQlldmVudCBuZXdFdmlkZW5jZUV2ZW50KGFkZHJlc3MgYWRkcik7CiAgICAgICAgZnVuY3Rpb24gbmV3RXZpZGVuY2Uoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sc3RyaW5nIGlkLHVpbnQ4IHYsIGJ5dGVzMzIgcixieXRlczMyIHMpcHVibGljIHJldHVybnMoYWRkcmVzcykKICAgICAgICB7CiAgICAgICAgICAgIEV2aWRlbmNlIGV2aWRlbmNlID0gbmV3IEV2aWRlbmNlKGV2aSwgaW5mbywgaWQsIHYsIHIsIHMsIHRoaXMsIG1zZy5zZW5kZXIpOwogICAgICAgICAgICBuZXdFdmlkZW5jZUV2ZW50KGV2aWRlbmNlKTsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gRXZpZGVuY2VTaWduZXJzRGF0YShhZGRyZXNzW10gZXZpZGVuY2VTaWduZXJzKXB1YmxpY3sKICAgICAgICAgICAgZm9yKHVpbnQgaT0wOyBpPGV2aWRlbmNlU2lnbmVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBzaWduZXJzLnB1c2goZXZpZGVuY2VTaWduZXJzW2ldKTsKCQkJfQoJCX0KCiAgICBmdW5jdGlvbiB2ZXJpZnkoYWRkcmVzcyBhZGRyKXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpewogICAgZm9yKHVpbnQgaT0wOyBpPHNpZ25lcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoYWRkciA9PSBzaWduZXJzW2ldKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyKHVpbnQgaW5kZXgpcHVibGljIGNvbnN0YW50IHJldHVybnMoYWRkcmVzcyl7CiAgICAgICAgdWludCBsaXN0U2l6ZSA9IHNpZ25lcnMubGVuZ3RoOwogICAgICAgIGlmKGluZGV4IDwgbGlzdFNpemUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc2lnbmVyc1tpbmRleF07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyc1NpemUoKSBwdWJsaWMgY29uc3RhbnQgcmV0dXJucyh1aW50KXsKICAgICAgICByZXR1cm4gc2lnbmVycy5sZW5ndGg7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVycygpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3NbXSl7CiAgICAgICAgcmV0dXJuIHNpZ25lcnM7CiAgICB9Cgp9",
"contractDesc_en": "EvidenceSignersData",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
9.6. 根据合约编号获取合约信息¶
接口描述¶
返回合约信息
接口URL¶
http://localhost:5002/WeBASE-Front/contractStore/getContractItemById/{contractId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约编号 | contractId | int | 是 |
2)数据格式
http://localhost:5002/WeBASE-Front/contractStore/getContractItemById/2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"contractId": 2,
"contractFolderId": 1,
"contractName": "LibSafeMathForUint256Utils",
"contractDesc": "LibSafeMathForUint256Utils",
"contractSrc": "LyoKICogQ29weXJpZ2h0IDIwMTQtMjAxOSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKiAqLwoKcHJhZ21hIHNvbGlkaXR5IF4wLjQuMjU7CgpsaWJyYXJ5IExpYlNhZmVNYXRoRm9yVWludDI1NlV0aWxzIHsKCiAgICBmdW5jdGlvbiBhZGQodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHVpbnQyNTYgYyA9IGEgKyBiOwogICAgICAgIHJlcXVpcmUoYyA+PSBhLCAiU2FmZU1hdGhGb3JVaW50MjU2OiBhZGRpdGlvbiBvdmVyZmxvdyIpOwogICAgICAgIHJldHVybiBjOwogICAgfQoKICAgIGZ1bmN0aW9uIHN1Yih1aW50MjU2IGEsIHVpbnQyNTYgYikgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50MjU2KSB7CiAgICAgICAgcmVxdWlyZShiIDw9IGEsICJTYWZlTWF0aEZvclVpbnQyNTY6IHN1YnRyYWN0aW9uIG92ZXJmbG93Iik7CiAgICAgICAgdWludDI1NiBjID0gYSAtIGI7CiAgICAgICAgcmV0dXJuIGM7CiAgICB9CgogICAgZnVuY3Rpb24gbXVsKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICBpZiAoYSA9PSAwIHx8IGIgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHVpbnQyNTYgYyA9IGEgKiBiOwogICAgICAgIHJlcXVpcmUoYyAvIGEgPT0gYiwgIlNhZmVNYXRoRm9yVWludDI1NjogbXVsdGlwbGljYXRpb24gb3ZlcmZsb3ciKTsKICAgICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXYodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJlcXVpcmUoYiA+IDAsICJTYWZlTWF0aEZvclVpbnQyNTY6IGRpdmlzaW9uIGJ5IHplcm8iKTsKICAgICAgICB1aW50MjU2IGMgPSBhIC8gYjsKICAgICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBtb2QodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJlcXVpcmUoYiAhPSAwLCAiU2FmZU1hdGhGb3JVaW50MjU2OiBtb2R1bG8gYnkgemVybyIpOwogICAgICAgIHJldHVybiBhICUgYjsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3dlcih1aW50MjU2IGEsIHVpbnQyNTYgYikgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50MjU2KXsKCiAgICAgICAgaWYoYSA9PSAwKSByZXR1cm4gMDsKICAgICAgICBpZihiID09IDApIHJldHVybiAxOwoKICAgICAgICB1aW50MjU2IGMgPSAxOwogICAgICAgIGZvcih1aW50MjU2IGkgPSAwOyBpIDwgYjsgaSsrKXsKICAgICAgICAgICAgYyA9IG11bChjLCBhKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbWF4KHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gYSA+PSBiID8gYSA6IGI7CiAgICB9CgogICAgZnVuY3Rpb24gbWluKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKICAgIH0KCiAgICBmdW5jdGlvbiBhdmVyYWdlKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gKGEgLyAyKSArIChiIC8gMikgKyAoKGEgJSAyICsgYiAlIDIpIC8gMik7CiAgICB9Cn0K",
"contractDesc_en": "LibSafeMathForUint256Utils",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
10. 证书管理¶
10.1. 查询节点证书接口¶
接口描述¶
获取Front对应节点的Fisco证书和sdk证书(包含链证书、机构证书和节点证书)的内容;
需要在项目配置文件中constant-nodePath
配置Front连接节点的绝对路径;
注:
接口只返回了证书的文本(Base64编码),未包含开头与结尾以及换行的格式文本; 如需将文本保存为一个证书文件,需要加上开头“—–BEGIN CERTIFICATE—–\n”和结尾“\n—–END CERTIFICATE—–\n”;
接口URL¶
http://localhost:5002/WeBASE-Front/cert
调用方法¶
HTTP GET
响应参数¶
1)数据格式
a、成功:
{
"node": "MIICOTCCASGgAwIBAgIJAKHsAYI3TsAOMA0GCSqGSIb3DQEBCwUAMDgxEDAOBgNV\nBAMMB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5j\neTAeFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDIxDDAKBgNVBAMMA3Nk\nazETMBEGA1UECgwKZmlzY28tYmNvczENMAsGA1UECwwEbm9kZTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABJ79rSKIb97xZwByW58xH6tzoNKNLaKG7J5wxAEgAb03O2h4\nMkEMLtf/LB7tELOiyCiIEhLScprb1LjvDDt2RDGjGjAYMAkGA1UdEwQCMAAwCwYD\nVR0PBAQDAgXgMA0GCSqGSIb3DQEBCwUAA4IBAQC0u2lfclRmCszBTi2rtvMibZec\noalRC0sQPBPRb7UQhGCodxmsAT3dBUf+s4wLLrmN/cnNhq5HVObbWxzfu7gn3+IN\nyQEeqdbGdzlu1EDcaMgAz6p2W3+FG/tmx/yrNza29cYekWRL44OT5LOUPEKrJ4bJ\neOBRY4QlwZPFmM0QgP7DoKxHXldRopkmvqT4pbW51hWvPgj7KrdqwbVWzuWQuI3i\n3j3O96XZJsaDZ0+IGa5093+TsTNPfWUZzp5Kg+EyNR6Ea1evuMDNq9NAqqcd5bX9\nO9kgkb8+llO8I5ZhdnN0BuhGvv9wpsa9hW8BImOLzUBwfSVYouGCkoqlVq9X",
"chain": "MIIDPTCCAiWgAwIBAgIJAMfvnu4d5fHdMA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNV\nBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAe\nFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDUxDjAMBgNVBAMMBWNoYWlu\nMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMGsKT/S60cxvFS4tBLyfT0QKPLW1g3ZgMND\n03hrWp1FAnvE9htsDEgqvNLD5hKWaYcUhjQMq0WttiP/vPxkwwJkZhzWhXpdSxMR\nqKVX4BppnkT0ICm84jYSyJdNFjKvfWlBIptIfFuTUDMT+XqF/Ct756JksiUwKZRW\neRAVcYzFM4u4ZuKeaept/8Bv8Z/RlJzGI57qj5BELeA0meUagq2WoCgJrPyvbO0b\nLwogFWS4kEjv20IIdj3fTqeJlooEXtPnuegunSMQB6aIh2im74FfJ3sHuOjQDFuC\nb5ZUiyUHG6IOGCqs+Grk+/VYI16Mx+8OoGBD5koTpK8B+/aedsUCAwEAAaNQME4w\nHQYDVR0OBBYEFLTg2FsUFekx9XjIi01BrDpo0aPIMB8GA1UdIwQYMBaAFLTg2FsU\nFekx9XjIi01BrDpo0aPIMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB\nAJmuMLhWSld8G6i3Vw21TN/d2rSRg3hNqOyycPYtdVK1YXEj4Xm91qgL8An3Kui8\njSq1S9+PstGvyh14YUw43Y1VtEPGpNVTvDtkxQ/8rs1sGHbqUxshgFMbqruxp7WH\ns0fxgn5COHEnRC4jQn02wZAk8pIjFVZLkhqdIYBtC35buHr17mXNL0S4H5cJxzPN\nk3XtKBqXedkTrEsDhR/bZ6qDDq0BcduhtKiYVPiVw9z3moLuwDb0QDM59zCexpcz\nb/w7K4lIxWqpD5tbpKSmj/3v5TCqez0Mim8/j4q29bP913KQrngnVCdCezOsPWIH\nDDoihgeRQHuz1VuGGZ259Hc=",
"agency": "MIIDADCCAeigAwIBAgIJAJUF2Dp1a9U6MA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNV\nBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAe\nFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDgxEDAOBgNVBAMMB2FnZW5j\neUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBANBT4CTciIYdSeEabgJzif+CFB0y3GzG\ny+XQYtWK+TtdJWduXqhnnZiYAZs7OPGEu79Yx/bEpjEXsu2cXH0D6BHZk+wvuxG6\nezXWq5MYjCw3fQiSRWkDYoxzWgulkRyYROF1xoZeNGQssReFmCgP+pcQwRxjcq8z\nIA9iT61YxyW5nrS7xnra9uZq/EE3tsJ0ae3ax6zixCT66aV49S27cMcisS+XKP/q\nEVPxhO7SUjnzZY69MgZzNSFxCzIbapnlmYAOS26vIT0taSkoKXmIsYssga45XPwI\n7YBVCc/34kHzW9xrNjyyThMWOgDsuBqZN9xvapGSQ82Lsh7ObN0dZVUCAwEAAaMQ\nMA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAu3aHxJnCZnICpHbQ\nv1Lc5tiXtAYE9aEP5cxb/cO14xY8dS+t0wiLIvyrE2aTcgImzr4BYNBm1XDt5suc\nMpzha1oJytGv79M9/WnI/BKmgUqTaaXOV2Ux2yPX9SadNcsD9/IbrV0b/hlsPd6M\nK8w7ndowvBgopei+A1NQY6jTDUKif4RxD4u5HZFWUu7pByNLFaydU4qBKVkucXOq\nxmWoupL5XrDk5o490kiz/Zgufqtb4w6oUr3lrQASAbFB3lID/P1ipi0DwX7kZwVX\nECDLYvr+eX6GbTClzn0JGuzqV4OoRo1rrRv+0tp1aLZKpCYn0Lhf6s1iw/kCeM2O\nnP9l2Q=="
}
b、失败:
{
"code": 201231,
"message": "Cert file not found, please check cert path in config",
"data": "FileNotFound, node cert(node.crt) path prefix error"
}
10.2. 获取明文SDK证书与私钥¶
接口描述¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的内容
接口URL¶
http://localhost:5002/WeBASE-Front/cert/sdk
调用方法¶
HTTP GET
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | Map |
Map | 是 | key为文件名,value为文件内容 |
1)数据格式
a、成功:
{
"sdk.key": "-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgxqr/d/VgQ0fAr/KvyAeW\nJ6bD1tqxZ5gYOdfIJiK7WOmhRANCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wr\npyoiQkMy1qI5/3Sj4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhP\n-----END PRIVATE KEY-----\n",
"ca.crt": "-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n",
"sdk.crt": "-----BEGIN CERTIFICATE-----\nMIIBeDCCAR+gAwIBAgIJAJoEtSMUsa8HMAoGCCqGSM49BAMCMDgxEDAOBgNVBAMM\nB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTAg\nFw0yMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowMTEMMAoGA1UEAwwDc2Rr\nMRMwEQYDVQQKDApmaXNjby1iY29zMQwwCgYDVQQLDANzZGswVjAQBgcqhkjOPQIB\nBgUrgQQACgNCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wrpyoiQkMy1qI5/3Sj\n4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhPoxowGDAJBgNVHRMEAjAAMAsGA1Ud\nDwQEAwIF4DAKBggqhkjOPQQDAgNHADBEAiANbeRFiiS6mH+vcAOwV3wXd9YW/B2a\n+vrHMm6NwtliRAIgRH4gSF0XLmpVOEO21bJFDGWm9siIX0cnj0R3kNGZcB4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBcTCCARegAwIBAgIJANrOZ+FrVNpIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAeFw0y\nMTA0MDYxMjMwNDBaFw0zMTA0MDQxMjMwNDBaMDgxEDAOBgNVBAMMB2FnZW5jeUEx\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABIqMDvvzvTq8WW1UtJrnnsifw9/OrPsMc9CrrYBsWdwOGhdx\nfNTJA1ss+vngjrhAmWHczvbh+E1WOlDGzpCumeqjEDAOMAwGA1UdEwQFMAMBAf8w\nCgYIKoZIzj0EAwIDSAAwRQIhALsAbAQ9BDeofk4VYzYx2ZAHB1HviDp9ndvXAkLN\nsfHZAiAjViK97dDr3gxP/qHg0e8BG9ptEv7Do8caOPj33F+yOQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n"
}
10.3. 获取SDK证书与私钥压缩包¶
接口描述¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的zip压缩包
接口URL¶
http://localhost:5002/WeBASE-Front/cert/sdk/zip
调用方法¶
HTTP GET
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中 |
1)数据格式
a、成功:
headers: content-disposition: attachment;filename*=UTF-8''conf.zip
{
// 二进制流
}
11. 附录¶
1. 返回码信息列表¶
code | message | 描述 |
---|---|---|
0 | success | 成功 |
101001 | system error | 系统异常 |
101002 | param valid fail | 参数校验异常 |
101003 | web3jMap of groupId is null, please call /{groupId}/web3/refresh to refresh | 连接当前群组失败,请调用/{groupId}/web3/refresh刷新群组 |
101004 | groupList error for no group, web3jMap is empty | 群组列表为空,请检查节点共识状态 |
201001 | groupId cannot be empty | 群组编号不能为空 |
201002 | user cannot be empty | 用户地址不能为空 |
201003 | useAes cannot be empty | 是否为加密私钥不能为空 |
201004 | version cannot be empty | 合约版本不能为空 |
201005 | funcName cannot be empty | 方法名不能为空 |
201006 | abiInfo cannot be empty | abi内容不能为空 |
201007 | bytecodeBin cannot be empty | 合约bin不能为空 |
201008 | contract's current version has been deployed | 该合约版本已部署 |
201009 | contract is not deployed | 合约未部署 |
201010 | save abi error | abi保存错误 |
201011 | contract funcParam is error | 请求的方法参数错误 |
201012 | requst blockNumber is greater than latest | 请求块高大于最新块高 |
201013 | get abi from chain error | 获取合约abi错误 |
201014 | contract deploy error | 合约部署错误 |
201015 | user's privateKey is null | 用户私钥为空 |
201016 | file is not exist | 文件不存在 |
201017 | failed to get node config | 获取节点配置失败 |
201018 | blockNumber and pbftView unchanged | 块高和view没有变化 |
201019 | request function is error | 请求的方法错误 |
201020 | transaction query from chain failed | 交易查询失败 |
201021 | transaction send to chain failed | 交易上链失败 |
201022 | node request failed | 节点请求失败 |
201023 | contract already exists | 合约已经存在 |
201024 | contract name cannot be repeated | 合约名不能重复 |
201025 | invalid contract id | 无效的合约编号 |
201026 | contract has been deployed | 合约已部署 |
201027 | send abiInfo fail | 发送abi失败 |
201028 | bytecodeBin is null | 合约bin为空 |
201029 | contractAddress is null | 合约地址为空 |
201030 | contractAddress invalid | 合约地址无效 |
201031 | privateKey decode fail | 私钥编码失败 |
201032 | not found config of keyServer | 密钥服务未配置 |
201033 | data request sign error | 数据请求签名异常 |
201034 | groupId not exist | 群组编号不存在 |
201035 | version and address cannot all be null | 合约版本和地址不能同时为空 |
201036 | compile fail | 合约编译失败 |
201037 | user name is null | 用户名为空 |
201038 | user name already exists | 用户名已存在 |
201039 | private key already exists | 私钥已存在 |
201040 | private key not exists | 私钥不存在 |
201041 | external user's appId and signUserId cannot be empty | 外部用户的appId和signUserId不能为空 |
201042 | There is no sol files in source | solidity文件不存在 |
201043 | invalid group operate type | 群组操作类型不正确 |
201044 | invalid data type | 不正确的数据类型 |
201045 | encode string can not be empty | 已签名的参数内容不能为空 |
201046 | transaction failed | 交易上链失败 |
201050 | Fail to parse json | 链上返回值反序列化失败 |
201051 | get consensus status fail | 交易上链失败 |
201101 | groupId cannot be empty | 群组编号不能为空 |
201102 | tableName cannot be empty | 表名不能为空 |
201103 | permissionType cannot be empty | 权限类型不能为空 |
201104 | permissionType not exists | 权限类型不存在 |
201105 | from address cannot be empty | 管理员地址不能为空 |
201106 | contract name cannot be empty | 合约名不能为空 |
201107 | system config key cannot be empty | 系统配置key值不能为空 |
201108 | system config value cannot be empty | 系统配置value值不能为空 |
201109 | node id cannot be empty | 节点id不能为空 |
201110 | node type cannot be empty | 节点类型(共识状态不能为空) |
201111 | Permission state cannot be all empty | 更新的用户权限状态不能为空 |
201112 | contract address cannot be empty | 合约地址不能为空 |
201113 | contract handle type cannot be empty | 合约操作类型不能为空 |
201114 | grantAddress cannot be empty | 赋值的地址不能为空 |
201115 | invalid contract handle type | 不正确的合约操作类型 |
201116 | contract status handle fail | 合约状态修改失败 |
201120 | group operate fail | 群组操作失败 |
201121 | node internal error | 节点内部错误 |
201122 | group already exists | 群组已存在 |
201123 | group already running | 群组已运行 |
201124 | group already stopped | 群组已停止 |
201125 | group already deleted | 群组已删除 |
201126 | group not found | 未找到群组 |
201127 | group operate param error | 群组操作入参错误 |
201128 | group peers not connected | 群组内节点未连接 |
201129 | group genesis conf already exists | 群组创世块文件已存在 |
201130 | group config.ini already exists | 群组的配置文件已存在 |
201131 | group genesis conf not found | 未找到群组创世块文件 |
201132 | group config.ini not found | 未找到群组的配置文件 |
201133 | group is stopping | 群组正在停止 |
201134 | group not deleted | 群组未删除 |
201151 | Unsupported contract param type to encoded | 不支持编码的合约参数类型 |
201152 | Unsupported contract param type to decoded | 不支持解码的合约参数类型 |
201153 | unable to create instance of type, check input params | 无法创建该合约参数类型的实例,请检查入参 |
201154 | contract path is exists. | 合约路径已存在 |
201155 | contract path cannot be empty | 合约路径不能为空 |
201156 | Write front's sdk cert and key fail | 导出SDK证书私钥文件失败,写入文件失败 |
201157 | Write private key file fail | 导出私钥文件失败,写入文件失败 |
201200 | params not fit | 参数不符合要求 |
201201 | address is invalid | 账户地址不正确 |
201202 | permission denied, please check chain administrator permission | 权限不足,请检查用户 |
201208 | unsupported for this system config key | 不支持设置该系统配置 |
201209 | provide value by positive integer mode, from 100000 to 2147483647 | 请输入正值或[100000, 2147483647]范围的值 |
201210 | set system config value fail for params error or permission denied | 设置系统配置失败,请检查权限 |
201211 | query system config value list fail | 获取系统配置列表失败 |
201216 | node id is invalid | 节点id错误 |
201217 | invalid node type: sealer, observer, remove | 节点类型(共识状态)错误:sealer, observer, remove |
201218 | set node consensus type fail, check permission or node's group config file | 节点类型(共识状态)修改失败,请检查权限或节点群组配置文件 |
201221 | Contract version should only contains 'A-Z' or 'a-z' or '0-9' or dot mark | CNS合约版本号应只包含大小写字母、数字和"." |
201222 | version of contract is out of length | 合约版本号过长 |
201223 | cns register fail | cns注册失败 |
201224 | version not exists | 版本不存在 |
201225 | cns name cannot be empty | cns名不能为空 |
201226 | sql syntax error | sql语句错误 |
201227 | crud sql fail | 执行sql语句失败 |
201228 | table not exists | 操作的表格不存在 |
201231 | Cert file not found, please check cert path in config | 配置文件中的证书地址错误,未找到证书文件 |
201232 | Pem file format error, must surrounded by -----XXXXX PRIVATE KEY----- | pem证书格式错误,必须以"-----XXXXX PRIVATE KEY-----"开头结尾 |
201233 | Pem file content error | pem证书内容错误 |
201235 | p12's password cannot be chinese | p12证书密码不能是中文 |
201236 | p12's password not match | p12证书密码错误 |
201237 | P12 file content error | p12证书内容错误 |
201241 | Exchange or message queue not exists, please check mq server or mq configuration | 交换机或消息队列不存在,请检查mq-server运行状态及其配置 |
201242 | Database error: data already exists in db | 数据库错误:该数据记录已存在于数据库中 |
201243 | Block range error, from/toBlock must greater than 0, toBlock must be greater than fromBlock | 合约Event区块范围错误,from大于0,to大于from |
201244 | Database error: data not exists in db, please check your params | 该数据记录不存在,请检查参数 |
201245 | Only support letter and digit, please check your params | 仅支持使用数字字母与下划线,请检查参数 |
201246 | Register contractEvent failed, please check your param | 订阅合约事件失败,请检查参数格式 |
201247 | Unregister event failed, please check mq server exchange | 取消订阅事件失败,请检查参数格式 |
201248 | Contract abi invalid, please check abi | 合约ABI格式错误,请检查入参 |
201255 | contract address already exists | 合约地址已存在 |
201256 | abi info of this id not exists | abi不存在 |
201301 | threshold must be greater than zero | 链阈值必须大于0 |
201302 | committee weight must be greater than zero | 链委员权重必须大于0 |
201303 | chain governance address cannot be blank | 链管理委员/运维地址不能为空 |
201311 | get event callback fail for time out | 获取event回调超时 |
201312 | get event callback error | 获取event回调失败 |
201501 | sdk create key pair fail and return null | sdk创建私钥对失败并返回Null |
201502 | pem/p12 manager get key pair error for input params | pem/p12证书获取私钥对失败,检查入参 |
201503 | pem/p12 manager get key pair error for bc dependency error | pem/p12证书获取私钥对失败,检查bc依赖包版本 |
201504 | sign service return error | 签名服务并返回异常 |
201510 | transaction receipt status return error | 交易回执状态码非0x0,交易执行失败 |
201511 | contract abi parse json error | 合约ABI转JSON失败 |
201512 | call contract error for io exception | 调用合约的交易上链失败 |
201513 | get transaction receipt fail for exec | 获取交易回执失败,返回执行错误 |
201514 | get transaction receipt fail for time out | 获取交易回执失败,链上链下请求超时 |
201515 | transaction receipt fail and parse output fail | 转化交易回执中output输出值失败 |
201516 | transaction receipt fail and output is null | 交易回执output为空 |
201517 | call contract constant method fail | 合约状态异常,调用合约constant方法失败 |
201518 | get message's hash fail | 获取哈希失败 |
201521 | get list of manager on chain fail | 获取链上管理员列表失败 |
201522 | table key length error | 用户表的键值长度大于最大值255 |
201523 | crud's param parse json error | CRUD方法的入参转Entry/Condition失败,请检查入参 |
201524 | precompiled common transfer to json fail | 预编译错误码转JSON失败 |
2. Precompiled Service说明¶
对预编译合约接口的使用有疑惑,可以查看FISCO BCOS的PreCompiledService API说明
查看预编译合约的solidity接口代码,可以查看FISCO BCOS的web3sdk precompile模块,如crud/TableFactory.sol:
pragma solidity ^0.4.2;
contract TableFactory {
function createTable(string tableName, string key, string valueField) public returns (int);
}
查看FISCO BCOS中实现的precompild合约列表、地址分配及源码:
地址 | 功能 | 源码(libprecompiled目录) |
---|---|---|
0x1000 | 系统参数管理 | SystemConfigPrecompiled.cpp |
0x1001 | 表工厂合约 | TableFactoryPrecompiled.cpp |
0x1002 | CRUD合约 | CRUDPrecompiled.cpp |
0x1003 | 共识节点管理 | ConsensusPrecompiled.cpp |
0x1004 | CNS功能 | CNSPrecompiled.cpp |
0x1005 | 存储表权限管理 | AuthorityPrecompiled.cpp |
0x1006 | 并行合约配置 | ParallelConfigPrecompiled.cpp |
Precompiled Service API 错误码
错误码 | 消息内容 | 备注 |
---|---|---|
0 | success | |
-50000 | permission denied | |
-50001 | table name already exist | |
-50100 | unknow function call | |
-50101 | table does not exist | |
-51000 | table name and address already exist | |
-51001 | table name and address does not exist | |
-51100 | invalid node ID | SDK错误码 |
-51101 | the last sealer cannot be removed | |
-51102 | the node is not reachable | SDK错误码 |
-51103 | the node is not a group peer | SDK错误码 |
-51104 | the node is already in the sealer list | SDK错误码 |
-51105 | the node is already in the observer list | SDK错误码 |
-51200 | contract name and version already exist | SDK错误码 |
-51201 | version string length exceeds the maximum limit | SDK错误码 |
-51300 | invalid configuration entry | |
-51500 | contract name and version already exist | |
-51501 | condition parse error | |
-51502 | condition operation undefined | |
-51600 | invalid ciphers | |
-51700 | group sig failed | |
-51800 | ring sig failed | |
-51900 | contract frozen | |
-51901 | contract available | |
-51902 | contract repeat authorization | |
-51903 | invalid contract address | |
-51904 | table not exist | |
-51905 | no authorized | |
-52000 | committee member exist | |
-52001 | committee member not exist | |
-52002 | invalid request permission denied | |
-52003 | invalid threshold | |
-52004 | operator can't be committee member | |
-52005 | committee member can't be operator | |
-52006 | operator exist | |
-52007 | operator not exist | |
-52008 | account not exist | |
-52009 | invalid account address | |
-52010 | account already available | |
-52011 | account frozen | |
-52012 | current value is expected value |
3.调用接口遇到问题&解决方式¶
Q1:合约方法入参byte32类型, java 通过HTTP+JSON调用,对应java bean 该如何对应数据类型? 报错
{
"code":201153,
"data":null,
"errorMessage":"unable to create instance of type:org.fisco.bcos.sdk.abi.datatypes.generated.Bytes32"
}
A1:java bean对应还是由String 存储,而非byte[]。 java工程引用如下依赖
<dependency>
<groupId>org.fisco-bcos.java-sdk</groupId>
<artifactId>fisco-bcos-java-sdk</artifactId>
<version>2.7.2</version>
</dependency>
java 代码处理
String username = "hello";
Bytes32 bytes32 = CommonUtils.utf8StringToBytes32(username);
String bytes32Str = Numeric.toHexString(bytes32.getValue());
注意:Numeric 工具类是fisco-bcos-java-sdk 自带的,CommonUtils 是WEBASE Front 里面的
升级说明¶
WeBASE-Front升级的兼容性说明,请结合WeBASE-Front Changelog进行阅读
WeBASE-Front升级的必须步骤:
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 采用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 bash stop.sh && bash start.sh
重启
各个版本的具体修改可参考下文
v2.0.0-rc1¶
附录¶
1. 安装问题¶
1.1 Java部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
2. 常见问题¶
1:执行shell脚本报错误”permission denied”或格式错误
赋权限:chmod + *.sh 转格式:dos2unix *.sh
2:eclipse环境编译源码失败,错误提示如下:
...
/data/temp/WeBASE-Front/src/main/java/com/webank/webase/front/performance/PerformanceService.java:167: error: cannot find symbol
log.info("begin sync performance");
^
symbol: variable log
location: class PerformanceService
Note: /data/temp/WeBASE-Front/src/main/java/com/webank/webase/front/contract/CommonContract.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
100 errors
> Task :compileJava FAILED
FAILURE: Build failed with an exception.
...
答:问题是不能编译Lombok注解 ,修改build.gradle文件,将以下代码的注释加上
//annotationProcessor 'org.projectlombok:lombok:1.18.6'
3:节点运行一段时间后新增了一个群组,前置查不到新群组的信息。
答:调用 http://{ip}:{port}/WeBASE-Front/1/web3/refresh 方法,即可手动更新。
4:升级1.0.2版本时,数据库报错:
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "TYPE"; SQL statement: alter table key_store_info add column type integer not null [23502-197] at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) ~[h2-1.4.197.jar:1.4.197] at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.197.jar:1.4.197] at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.197.jar:1.4.197]
答:将H2数据库删除(在h2目录下),或者配置新数据库名,在 application.yml 文件中的配置如下:
spring: datasource: url: jdbc:h2:file:./h2/webasefront;DB_CLOSE_ON_EXIT=FALSE // 默认H2库为webasefront ...
5:日志报以下错误信息:
2019-08-08 17:29:05.505 [pool-11-thread-1] ERROR TaskUtils$LoggingErrorHandler() - Unexpected error occurred in scheduled task. org.hyperic.sigar.SigarFileNotFoundException: 没有那个文件或目录 at org.hyperic.sigar.FileSystemUsage.gather(Native Method) ~[sigar-1.6.4.jar:?] at org.hyperic.sigar.FileSystemUsage.fetch(FileSystemUsage.java:30) ~[sigar-1.6.4.jar:?] at org.hyperic.sigar.Sigar.getFileSystemUsage(Sigar.java:667) ~[sigar-1.6.4.jar:?]
答:监控目录不存在,需配置节点所在磁盘目录,在 application.yml 文件中的配置如下:
... constant: monitorDisk: / // 要监控的磁盘目录,配置节点所在目录(如:/home) ...
6:启动报错“nested exception is javax.net.ssl.SSLException”:
...
nested exception is javax.net.ssl.SSLException: Failed to initialize the client-side SSLContext: Input stream not contain valid certificates.
答:CentOS的yum仓库的OpenJDK缺少JCE(Java Cryptography Extension),导致Web3SDK/Java-SDK无法正常连接区块链节点,因此在使用CentOS操作系统时,推荐使用OracleJDK。
- 7:启动报错“Processing bcos message timeout”
...
[main] ERROR SpringApplication() - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractController': Unsatisfied dependency expressed through field 'contractService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'contractService': Unsatisfied dependency expressed through field 'web3jMap'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'web3j' defined in class path resource [com/webank/webase/front/config/Web3Config.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.HashMap]: Factory method 'web3j' threw exception; nested exception is java.io.IOException: Processing bcos message timeout
...
答:一些OpenJDK版本缺少相关包,导致节点连接异常。推荐使用OracleJDK。
- 8:启动失败,日志却没有异常
===============================================================================================
Starting Server com.webank.webase.front.Application Port 5002 ................................[Failed]. Please view log file (default path:./log/).
Because port 5002 not up in 20 seconds.Script finally killed the process.
===============================================================================================
答:确认机器是否满足硬件要求。机器性能过低会导致服务端口一定时间内没起来,脚本会自动杀掉进程。可以尝试手动修改dist目录下的start.sh脚本,将启动等待时间设置久一点(默认600,单位:秒),然后启动。
...
startWaitTime=600
...
- 9:启动报错SSLContext: null
答:确保conf/
目录下包含sdk证书;
若使用的是v1.5.0以前的版本,则需要保证ca.crt, node.crt, node.key
;其中node.crt, node.key为sdk.crt, sdk.key复制并重命名得到;若使用v1.5.0及以上版本,则需要复制链的sdk目录下的所有文件(ca.crt, sdk.crt, sdk.key及gm文件夹)到前置服务的conf
目录
3. 使用说明¶
测试用户管理¶
3.1. 导入私钥¶
支持txt文件和pem文件导入测试用户的私钥信息
导入.txt私钥内容格式示例:
{
"address":"0x06f81c8e1cb59b5df2cdeb87a212d17fba79aad7",
"publicKey":"0x4b1041710a4427dc1c0d542c8f0fd312d92b0d03a989f512d1f8d3cafb851967f3592df0035e01fa63b2626165d0f5cffab15792161aa0360b8dfba2f3a7cf59",
"privateKey":"71f1479d9051e8d6b141a3b3ef9c01a7756da823a0af280c6bf62d18ee0cc978", // 十六进制
"userName":"111",
"type":0 // type为0,不可修改
}
其中用户类型为0代表用户为WeBASE-Front的本地私钥用户,导入的私钥均为该类型;
导入.pem私钥内容示例:
-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgC8TbvFSMA9y3CghFt51/
XmExewlioX99veYHOV7dTvOhRANCAASZtMhCTcaedNP+H7iljbTIqXOFM6qm5aVs
fM/yuDBK2MRfFbfnOYVTNKyOSnmkY+xBfCR8Q86wcsQm9NZpkmFK
-----END PRIVATE KEY-----
其中pem文件开头的-----BEGIN PRIVATE KEY-----\n
和结尾的\n-----END PRIVATE KEY-----\n
格式不可更改,否则将读取pem文件失败
3.2. 导出私钥¶
目前仅支持导出测试用户的txt格式私钥
Java中如何使用导出的私钥
以上文中的私钥加载:
基于javasdk的私钥加载:
@Test
public void testCrypto() {
// 1-国密,0-ECDSA
CryptoSuite cryptoSuite = new CryptoSuite(1);
CryptoKeyPair keyPair = cryptoSuite.createKeyPair("e843a542a7a8240f9c9e418b9517c2c8f4dc041a11a44e614a3b026c3588c188");
System.out.println("privateKey: " + keyPair.getHexPrivateKey());
System.out.println("address: " + keyPair.getAddress());
System.out.println("publicKey: " + keyPair.getHexPublicKey());
}
基于web3sdk的私钥加载:
@Test
public void loadPrivateKeyTest() {
CryptoSuite
String privateKey = "71f1479d9051e8d6b141a3b3ef9c01a7756da823a0af280c6bf62d18ee0cc978";
Credentials credentials = GenCredential.create(privateKey);
// private key 实例
BigInteger privateKeyInstance = credentials.getEcKeyPair().getPrivateKey();
System.out.println(Numeric.toHexStringNoPrefix(privateKeyInstance));
// public key 实例
BigInteger publicKeyInstance = credentials.getEcKeyPair().getPublicKey();
System.out.println(Numeric.toHexString(publicKeyInstance));
// address 地址
String address = credentials.getAddress();
System.out.println(address);
}
访问h2数据库¶
WeBASE-Front采用 JPA + H2数据库 的方式保存数据
- 源码查看各个数据表的内容:需要通过查看WeBASE-Front源码的各个包中带有
@Entity
注解的entity实体类;如,查看私钥数据表KeyStoreInfo
则查看该文件com.webank.webase.front.keystore.entity.KeyStoreInfo.java
- 通过H2控制台连接H2数据库:
- 同机H2访问:可以通过浏览器打开
localhost:5002/WeBASE-Front/console
,以默认配置为例填入连接参数JDBC URL
应填入file:../h2/webasefront;
,与前置服务的application.yml中配置的spring.datasource.url
对应- 若未设置用户名与密码,则默认用户名为
sa
,密码为空
- 服务端H2访问:
- 修改前置服务的application.yml中的
spring.h2.console.settings.web-allow-others
设为true
,允许远端访问H2控制台 - 重启前置服务
- 访问
{ip}:{port}/WeBASE-Front/console
,参数填入方法同上
- 修改前置服务的application.yml中的
使用swagger¶
节点前置搭配了swagger,可用于直接调试接口,通过访问 {ip}:5002/WeBASE-Front/swagger-ui.html
即可访问前置的swagger页面
在swagger页面中选中一个接口后,点击“Try it out”既可以开始调用了,输入框将提示入参的格式
两阶段交易¶
在v1.5.2后,WeBASE-Front中丰富了组装交易的接口,包括了本地签名组装交易接口/trans/convertRawTxStr/local
和通过WeBASE-Sign组装交易接口/trans/convertRawTxStr/withSign
,下面以本地签名举例(接口的具体入参可参考对应接口文档)。
本地签名组装交易需要填入的参数包含合约地址、函数名及函数入参、群组ID和WeBASE-Front的私钥用户地址等,如下所示
{
"user":"0x2db346f9d24324a4b0eac7fb7f3379a2422704db",
"contractName":"HelloWorld",
"contractAddress":"dasdfav23rf213vbcdvadf3bcdf2fc23rqde",
"funcName":"set",
"contractAbi":[{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStorageCell","outputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"setVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"storageHash","type":"string"},{"name":"storageInfo","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}],
"funcParam":["Hi,Welcome!"],
"groupId" :"1",
"useCns": false
}
调用组装交易接口后,接口将返回签名后的交易体编码值(在测试接口时,可以通过节点前置的Swagger直接发起请求):
0xf9012da001071041dddc1b3c553b48c0fbefecc07f3812f5ce4004d47708f1c3342844db018405f5e10082029d94e10441d9179cf0424aae808b51bc85dcbbfe144780b8643590b49f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033333330000000000000000000000000000000000000000000000000000000000010180b84083bb5313e3dd7825b8b3e32d73aa8aedf9f9a8fcf435e5c37edfe4645c1af4211c12e1368024336a576f26ed624407da0b94e0bc5760514543c0b7a38fa03a7da0972843d0879ffdbdae733e8707896a532e5e1a3c7262cb84db657dd34f09111ba0786106465fe0fd2383588693cafef8934df62b188c6bb5a74eb6b9f23adaba32
通过已签名交易发送接口/trans/signed-transaction
将交易编码值发到链上,接口将返回交易回执,可根据交易回执的status
判断交易是否成功
**注:**若发起的是查询交易,除了上述接口的两阶段调用方法之外,还可以使用合约函数的编码值接口/trans/encodeFunction
获取encodedFunction
值。
根据入参要求调用已编码查询交易发送接口/trans/query-transaction
,即可发送查询交易,接口将返回查询的返回值。
4. 支持链上事件订阅和通知¶
在某些业务场景中,应用层需要实时获取链上的事件,如出块事件、合约Event事件等。应用层通过WeBASE连接节点后,由于无法和节点直接建立长连接,难以实时获取链上的消息。
支持通过消息队列(Message Queue)来获取WeBASE-Front(v1.2.3+)的链上事件的消息推送
目前支持出块事件与智能合约Event事件的事件Push通知,大致流程为:
- WeBASE-Front连接到MQ-Server(目前支持RabbitMQ-Server);
- WeBASE-Front接收节点的事件Push后,如出块通知,WeBASE-Front将出块消息发送到消息队列中;
- 区块链应用连接MQ-Server,获取消息队列中待消费的消息,即可获得事件通知;
下面介绍如何搭建RabbitMQ的消息队列服务与WeBASE-Front的配置方法
4.1 RabbitMQ消息队列事件通知¶
安装RabbitMQ服务并启用管理功能¶
启用消息队列的事件推送服务,需要
- 安装RabbitMQ Server
参考RabbitMQ官网的下载与安装教程,安装并启动RabbitMQ-Server服务
注:RabbitMQ依赖Erlang环境,可根据官网教程安装Erlang
- 启动mq服务,并确保RabbitMQ Server服务所在主机的
5672
,15672
端口可访问; - 启用RabbitMQ的
rabbitmq_managerment
功能
启用该功能可通过访问localhost:15672
页面,可视化管理MQ的队列与用户;否则,需要通过rabbitmqctl命令行工具管理;
启用方法:服务启动后,在mq所在主机运行以下命令,命令行显示启用成功即可:
rabbitmq-plugins enable rabbitmq_management
添加RabbitMQ管理员账户¶
若启用了rabbitmq_managerment
的功能,可在浏览器访问mq服务所在主机的ip:15672
端口,如访问本机localhost:15672
通过默认用户guest
(密码也为guest
)登录管理页,在Web页面上方的Admin
项中,选择add user
,新增tag为Administrator
的管理员用户
注:
可通过RabbitMQ的命令行工具,添加管理员账户(Administrator
),具体可参考rabbitmqctl文档
guest用户不支持远程登录Web管理页,如需远程登录管理页面,需要通过rabbitmqctl新增一个管理员用户
WeBASE-Front的配置¶
通过配置applcation.yml中spring-rabbitmq
项,WeBASE-Front即可连接到RabbitMQ-Server,将出块通知与合约Event通知推送到消息队列中:
需要配置mq服务所在主机与管理员账户密码
spring:
datasource:
...
jpa:
...
h2:
...
rabbitmq:
host: 127.0.0.1 # rabbitmq部署所在主机的ip
port: 5672 # rabbitmq默认连接端口
username: defaultAccount # 要求具有Administrator权限的用户,本地连接rabbitmq可用guest账户
password: defaultPassword
virtual-host: defaultVirtualHost # 消息队列和Exchange所在虚拟节点,默认为空或"/"
publisher-confirm: true # 消息发布确认开启
ssl:
enabled: false # 是否启用ssl连接,默认false
客户端(区块链应用/消息消费者)使用说明¶
- 申请账号:客户端用户提供自己客户端应用编号appId,向mq-server运维管理员申请MQ服务的账号(可设置账户名和密码、virtual host)。
- 创建队列与赋予权限:运维管理员创建账号后,管理员以用户提供的客户端应用的
appId
为名字,创建一个该账户专属的队列,然后赋予该账户read其专属队列的权限( permission-read中设置)。 - 客户端连接到MQ:用户根据运维管理员提供的MQ账户名和密码、virtual host、消息交换机名(exchangeName),将自己的区块链应用连接到相应队列中,获取消息推送。
下面简单展示运维管理员通过RabbitMQ的Web工具管理MQ服务:
创建MQ账户:
创建MQ账户
赋予MQ账户访问appId队列的read权限:
赋予read权限
创建以appId命名的队列
创建appId队列
- 客户端调用WeBASE-Front节点前置服务接口(
/event/newBlockEvent
和event/contractEvent
),注册事件监听;接口内容请查看接口文档-事件通知
用户调用注册事件接口之后,实际上WeBASE-Front将以appId+事件名+{randomString}
的routingKey,将用户所拥有的的队列Queue绑定到对应的Exchange中:
appId队列绑定到群组Exchange
- 用户在客户端以用户名密码连接到对应的virtual host,监听自己队列的消息,接收到消息后解析处理;
客户端获取事件通知过程需如上进行配置,可参考WeBASE-Event-Client的消费者客户端的代码实现(Dev分支)
消费者客户端核心代码逻辑为:
@RabbitListener(queues = "${spring.rabbitmq.username}")
public void receive(Channel channel, Message message) throws IOException {
log.info("++++++++ mq message body: {}, queue:{}", new String(message.getBody()),
message.getMessageProperties());
try {
String bodyStr = new String(message.getBody());
JSONObject json = JSONObject.parseObject(bodyStr);
...
// 处理json消息体
} catch (Exception e) {
log.error("++++++++ mq 消息消费失败:id:{} Exception: {}", message.getMessageProperties().getDeliveryTag(), e);
...
}
...
}
5. 配置文件解析¶
- 配置文件解析
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5002 | 当前服务端口 |
server.context-path | /WeBASE-Front | 当前服务访问目录 |
server.connection-timeout | 30000 | 服务连接超时时间ms |
server.tomcat.max-threads | 200 | tomcat最大线程数 |
server.tomcat.max-connections | 10000 | tomcat最大连接数 |
sdk.useSmSsl | false | SSL连接是否使用国密SM |
sdk.certPath | conf | SDK证书所在目录(相对目录或绝对路径) |
sdk.peers | ['127.0.0.1:20200','127.0.0.1:20201'] | RPC节点的IP:PORT列表 |
sdk.threadPoolSize | 50 | SDK线程池的线程数 |
logging.config | classpath:log4j2.xml | logging配置文件的位置 |
constant.keyServer | 127.0.0.1:5004 | webase-sign服务的IP:Port(单个) |
constant.transMaxWait | 30 | 交易最大等待时间(s) |
constant.aesKey | EfdsW23D23d3df43 | webase服务的aes秘钥 |
constant.http_read_timeOut | 100000 | 访问服务的读取超时(ms) |
constant.http_connect_timeOut | 100000 | 访问服务的连接超时(ms) |
constant.eventRegisterTaskFixedDelay | 5000 | 事件推送注册的频率(ms) |
constant.syncEventMapTaskFixedDelay | 60000 | 事件推送内存的同步频率(ms) |
constant.syncStatLogTime | 5000 | 节点日志监控频率(ms) |
constant.syncStatLogCountLimit | 10000 | 节点日志监控数据最大值 |
constant.statLogEnabled | false | 是否启用节点日志监控 |
constant.eventCallbackWait | 4 | 获取event log的超时时间(秒) |
节点管理服务¶
概要介绍¶
1. 功能说明¶
WeBASE-Node-Manager可以是处理前端页面所有web请求,管理各个节点的状态,管理链上所有智能合约,对区块链的数据进行统计、分析,对异常交易的审计,私钥管理等,含有如下功能模块:
序号 | 模块 | 描述 |
---|---|---|
1 | 前置管理模块 | 维护关联WeBASE-Front服务信息 |
2 | 交易信息模块 | 查看交易信息 |
3 | 帐号管理模块 | 维护系统登录账号信息 |
4 | 区块管理模块 | 查看区块信息 |
5 | 合约管理模块 | 维护合约信息 |
6 | 服务器监控 | 监控节点服务器状态与邮件告警 |
7 | 审计模块 | 查看异常合约及异常用户信息 |
8 | 群组信息模块 | 查看群组信息 |
9 | 节点管理模块 | 查看节点信息 |
10 | 角色管理模块 | 查看系统登录用户的角色信息 |
11 | 用户管理模块 | 维护密钥信息 |
12 | 合约方法管理模块 | 维护合约abi文件中所包含的的方法信息 |
13 | 系统管理模块 | 预编译API,包含权限管理,节点管理,CNS管理等信息 |
14 | 证书管理模块 | 查看sdk证书、节点证书等信息 |
15 | 订阅事件模块 | 查看已订阅的链上事件通知信息 |
安装详情可查看下一章节的WeBASE-Node-Manager部署说明
部署说明¶
2. 注意事项¶
通过WeBASE-Sign私钥管理 WeBASE-Node-Manager v1.3.0及以上版本将通过WeBASE-Sign进行私钥管理,即使用WeBASE-Node-Manager v1.3.0+的版本需要同步安装WeBASE-Sign v1.3.0,详情可参考升级文档进行阅读
国密支持:
WeBASE-Node-Manager v1.2.2+已支持 国密版FISCO-BCOS,与WeBASE-Front v1.2.2+配合使用
开启WeBASE-Node-Manager的国密开关:
- 将配置文件
application.yml
中的sdk.encryptType
从0
修改为1
;
3. 拉取代码¶
执行命令:
git clone https://github.com/WeBankBlockchain/WeBASE-Node-Manager.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Node-Manager.git
进入目录:
cd WeBASE-Node-Manager
git checkout lab
4. 编译代码¶
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Node-Manager下生成已编译的代码目录dist。
5. 数据库初始化¶
5.1 新建数据库¶
#登录MySQL:
mysql -u ${your_db_account} -p${your_db_password} 例如:mysql -u root -p123456
#新建数据库:
CREATE DATABASE IF NOT EXISTS {your_db_name} DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
5.2 修改脚本配置¶
进入数据库脚本目录
cd dist/script
修改数据库连接信息:
修改数据库名称:sed -i "s/webasenodemanager/${your_db_name}/g" webase.sh
修改数据库用户名:sed -i "s/defaultAccount/${your_db_account}/g" webase.sh
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" webase.sh
例如:将数据库用户名修改为root,则执行:
sed -i "s/defaultAccount/root/g" webase.sh
6. 服务配置及启停¶
6.1 服务配置修改¶
(1)回到dist目录,dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改服务配置:
修改服务端口:sed -i "s/5001/${your_server_port}/g" conf/application.yml
修改数据库IP:sed -i "s/127.0.0.1/${your_db_ip}/g" conf/application.yml
修改数据库端口:sed -i "s/3306/${your_db_port}/g" conf/application.yml
修改数据库名称:sed -i "s/webasenodemanager/${your_db_name}/g" conf/application.yml
修改数据库用户:sed -i "s/defaultAccount/${your_db_account}/g" conf/application.yml
修改数据库密码:sed -i "s/defaultPassword/${your_db_password}/g" conf/application.yml
备注:
- 如果使用国密版本,则将application.yml中
sdk.encryptType
由0
改为1
6.2 服务启停¶
在dist目录下执行:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
6.3 查看日志¶
在dist目录查看:
全量日志:tail -f log/WeBASE-Node-Manager.log
错误日志:tail -f log/WeBASE-Node-Manager-error.log
接口说明¶
1 前置管理模块¶
1.1 新增节点前置信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /front/new
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | frontIp | string | 是 | 前置ip |
2 | frontPort | int | 是 | 前置服务端口 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/front/new
{
"frontIp": "127.0.0.1",
"frontPort": "5002"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 节点信息对象 | |
3.1 | frontId | int | 否 | 前置编号 |
3.2 | frontIp | string | 否 | 前置ip |
3.3 | frontPort | int | 否 | 前置端口 |
3.4 | agency | string | 否 | 所属机构 |
3.5 | createTime | LocalDateTime | 否 | 落库时间 |
3.6 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.7 | nodeId | int | 否 | 节点Id |
3.8 | groupList | List |
否 | 群组列表 |
3.9 | clientVersion | String | 否 | 客户端版本 |
3.10 | supportVersion | String | 否 | 支持版本 |
3.11 | signVersion | String | 否 | 签发版本 |
3.12 | status | int | 否 | 当前节点状态 |
3.13 | runType | Byte | 否 | 运行类型 |
3.14 | agencyId | int | 否 | 所属机构Id |
3.15 | agencyName | int | 否 | 所属机构名称 |
3.16 | hostId | int | 否 | 主机ID |
3.17 | hostIndex | int | 否 | 主机索引 |
3.18 | imageTag | String | 否 | |
3.19 | containerName | String | 否 | 容器名称 |
3.20 | jsonrpcPort | int | 否 | json远程调用端口 |
3.21 | p2pPort | int | 否 | P2P端口 |
3.22 | channelPort | int | 否 | 通道端口 |
3.23 | chainId | int | 否 | 链Id |
3.24 | chainName | String | 否 | 链名称 |
3.25 | frontVersion | String | 否 | 前置版本 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"frontId": 6,
"nodeId": "6e24cc5a21a41eab08636f8bbde0c93dd4a9ce4f16fa7fbaed0174872716dd1463d3ce822340d0f51badd2e43c9c106adffd740dbae3adcba7843959609322fd",
"frontIp": "127.0.0.1",
"frontPort": 5022,
"agency": null,
"groupList": null,
"clientVersion": null,
"supportVersion": null,
"frontVersion": "v2.0.0-rc1",
"signVersion": "v2.0.0-lab",
"createTime": null,
"modifyTime": null,
"status": 1,
"runType": 0,
"agencyId": null,
"agencyName": null,
"hostId": null,
"hostIndex": null,
"imageTag": null,
"containerName": null,
"jsonrpcPort": null,
"p2pPort": null,
"channelPort": null,
"chainId": 0,
"chainName": "default"
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.2 获取所有前置列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/find?frontId={frontId}&groupId={groupId}&frontStatus={frontStatus}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | frontId | Int | 否 | 前置编号 |
2 | groupId | String | 否 | 所属群组编号 |
2 | frontStatus | Int | 否 | 前置状态 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/front/find
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 节点信息对象 | ||
4.1.1 | frontId | int | 否 | 前置编号 |
4.1.2 | frontIp | string | 否 | 前置ip |
4.1.3 | frontPort | int | 否 | 前置端口 |
4.1.4 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.5 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.6 | agency | string | 否 | 备注所属机构 |
4.1.7 | frontVersion | string | 否 | 前置的后台版本,如: v1.4.0 |
4.1.8 | signVersion | string | 否 | 前置所连接签名服务的后台版本,如: v1.4.0 |
4.1.9 | clientVersion | string | 否 | 链节点的版本,如: 2.5.0 gm |
4.1.10 | supportVersion | string | 否 | 链节点所支持的最高版本, 如: 2.5.0, (此处仅显示支持的最高版本,不显示是否为国密。若从2.4.0升级到2.5.0,此处将返回2.4.0) |
4.1.11 | status | int | 否 | 前置服务状态:0,未创建;1,停止;2,启动; |
4.1.12 | runType | int | 否 | 运行方式:0,命令行;1,Docker |
4.1.13 | agencyId | int | 否 | 所属机构 ID |
4.1.14 | agencyName | string | 否 | 所属机构名称 |
4.1.15 | hostId | int | 否 | 所属主机 |
4.1.16 | hostIndex | int | 否 | 一台主机可能有多个节点。表示在主机中的编号,从 0 开始编号 |
4.1.17 | imageTag | string | 否 | 运行的镜像版本标签 |
4.1.18 | containerName | string | 否 | Docker 启动的容器名称 |
4.1.19 | jsonrpcPort | int | 否 | jsonrpc 端口 |
4.1.20 | p2pPort | int | 否 | p2p 端口 |
4.1.21 | channelPort | int | 否 | channel 端口 |
4.1.22 | chainId | int | 否 | 所属链 ID |
4.1.23 | chainName | string | 否 | 所属链名称 |
4.1.24 | nodeId | string | 否 | 节点ID |
4.1.25 | groupList | List |
否 | 群组列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"frontId": 2,
"nodeId": "5e4624ac3929babcba542088c0029d6a055f42e03f28b3c9f2c591c2fd0c0ce8c6f1f8bef92131f3acdcee3a4d5698fb30602981e8ff480ed41186828d365abc",
"frontIp": "127.0.0.1",
"frontPort": 5002,
"agency": null,
"groupList": null,
"clientVersion": null,
"supportVersion": null,
"frontVersion": "string",
"signVersion": "String",
"createTime": "2021-12-01 12:49:32",
"modifyTime": "2021-12-01 12:49:32",
"status": 1,
"runType": 0,
"agencyId": null,
"agencyName": null,
"hostId": null,
"hostIndex": null,
"imageTag": null,
"containerName": null,
"jsonrpcPort": null,
"p2pPort": null,
"channelPort": null,
"chainId": 0,
"chainName": "default"
}],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.3 删除前置信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/{frontId}
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | frontId | int | 是 | 前置编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/front/500001
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
1.4 刷新前置信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/front/refresh
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
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 查询交易信息列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:
/transaction/transList/{groupId}/{pageNumber}/{pageSize}?transactionHash={transactionHash}&blockNumber={blockNumber}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | transactionHash | String | 否 | 交易hash |
3 | blockNumber | BigInteger | 否 | 块高 |
4 | pageSize | int | 是 | 每页记录数 |
5 | pageNumber | int | 是 | 当前页码 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/transaction/transList/group/1/10?transactionHash=0x303daa78ebe9e6f5a6d9761a8eab4bf5a0ed0b06c28764488e4716de42e1df01
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 交易信息列表 |
4.1 | Object | 交易信息对象 | ||
4.1.1 | transHash | String | 否 | 交易hash |
4.1.2 | blockNumber | BigInteger | 否 | 所属块高 |
4.1.3 | statisticsFlag | Int | 否 | 是否已经统计 |
4.1.4 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.5 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.6 | transFrom | String | 否 | 交易发起方 |
4.1.7 | transTo | String | 否 | 交易接收方 |
4.1.8 | blockTimestamp | String | 否 | 区块时间戳 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"transHash": "0x158c20a61d5ee01f64f2fb2b7f752f834b6a64c1687ac2bfc541dcd8b261301c",
"transFrom": "0x",
"transTo": "92E730F449bbCE3af96dE1Fb9c9c44672DDccb66",
"blockNumber": 204,
"blockTimestamp": "2021-12-02 10:12:21",
"statisticsFlag": 1,
"createTime": "2021-12-02 10:12:37",
"modifyTime": "2021-12-02 10:12:37"
}
],
"totalCount": 204
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
2.2 查询交易回执¶
2.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/transaction/transactionReceipt/{groupId}/{transHash}
- 请求方式:GET
- 返回格式:JSON
2.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | transHash | String | 是 | 交易hash |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/transaction/transactionReceipt/group/0x158c20a61d5ee01f64f2fb2b7f752f834b6a64c1687ac2bfc541dcd8b261301c
2.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 交易信息对象 | ||
3.1 | transactionHash | String | 否 | 交易hash |
3.2 | version | String | 否 | 版本号 |
3.3 | blockNumber | String | 否 | 所属块高 |
3.4 | message | String | 否 | |
3.5 | gasUsed | String | 否 | 交易消耗的gas |
3.6 | contractAddress | String | 否 | 合约地址 |
3.7 | status | int | 否 | 交易的状态值 |
3.8 | from | String | 否 | 交易发起者 |
3.9 | to | String | 否 | 交易目标 |
3.10 | output | String | 否 | 交易输出内容 |
3.11 | statusOk | boolean | 否 | |
3.12 | hash | String | 否 | |
3.13 | logEntries | List |
否 | 日志 |
3.14 | input | String | 否 | |
3.15 | transactionProof | List |
否 | |
3.16 | receiptProof | List |
否 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"version": "0",
"contractAddress": "",
"gasUsed": "29999998452",
"status": 0,
"blockNumber": "204",
"output": "0x",
"transactionHash": "0x158c20a61d5ee01f64f2fb2b7f752f834b6a64c1687ac2bfc541dcd8b261301c",
"logEntries": [],
"input": "0x1e26fd330000000000000000000000000000000000000000000000000000000000000001",
"from": "0x9097678eb34daeebb6e3528ed4f8715cdc5e4c09",
"to": "92E730F449bbCE3af96dE1Fb9c9c44672DDccb66",
"transactionProof": null,
"receiptProof": null,
"message": null,
"statusOK": true,
"hash": "0xf8f0fa250662d5403415600696fbeaba65035cf5d3642cb9787fc958d4d859cc"
},
"attachment": null
}
- 失败:
{
"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 | String | 是 | 所属群组编号 |
2 | transHash | String | 是 | 交易hash |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/transaction/transInfo/group/0x158c20a61d5ee01f64f2fb2b7f752f834b6a64c1687ac2bfc541dcd8b261301c
2.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 交易信息对象 | ||
3.1 | hash | String | 否 | 交易hash |
3.2 | from | String | 否 | 交易发起者 |
3.3 | to | String | 否 | 交易目标 |
3.4 | nonce | String | 否 | |
3.5 | input | String | 否 | |
3.6 | version | int | 否 | 版本 |
3.7 | blockLimit | Long | 否 | 区块限制 |
3.8 | chainID | String | 否 | 链ID |
3.9 | groupID | String | 否 | 群组编号 |
3.10 | signature | String | 否 | |
3.11 | importTime | Long | 否 | |
3.12 | transactionProof | List |
否 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"version": 0,
"hash": "0x158c20a61d5ee01f64f2fb2b7f752f834b6a64c1687ac2bfc541dcd8b261301c",
"nonce": "242209552661748908689249931886835523971363412991803060052851540572747331123",
"blockLimit": 703,
"to": "92E730F449bbCE3af96dE1Fb9c9c44672DDccb66",
"from": "0x9097678eb34daeebb6e3528ed4f8715cdc5e4c09",
"input": "0x1e26fd330000000000000000000000000000000000000000000000000000000000000001",
"chainID": "chain",
"groupID": "group",
"signature": "0x9a43124ac99a39783b1765d0c3ab96de5e7766db44ce06119fde0a5f7357e05628cb9098c220ec7323fcf5bf84ddae2feb69bb350270fccee7323c7d8f536dff00",
"importTime": 0,
"transactionProof": null
},
"attachment": null
}
- 失败:
{
"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 | 是 | 所属角色 |
4 | String | 是 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/accountInfo
{
"account": "testAccount",
"accountPwd": "3f21a8490cef2bfb60a9702e9d2ddb7a805c9bd1a263557dfd51a7d0e9dfa93e",
"roleId": 100001,
"email": "string"
}
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 | 是 | 所属角色 |
4 | String | 是 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/accountInfo
{
"account": "testAccount",
"accountPwd": "82ca84cf0d2ae423c09a214cee2bd5a7ac65c230c07d1859b9c43b30c3a9fc80",
"roleId": 100001,
"email": "string"
}
3.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
3.1 | account | String | 否 | 帐号 |
3.2 | roleId | Integer | 否 | 所属角色 |
3.3 | roleName | String | 否 | 角色名称 |
3.4 | roleNameZh | String | 否 | 角色中文名 |
3.5 | loginFailTime | Integer | 是 | 登录失败次数 |
3.6 | accountStatus | Integer | 否 | 帐号状态 |
3.7 | description | String | 是 | 备注 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"account": "testAccount",
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"loginFailTime": 0,
"accountStatus": 1,
"description": null,
"createTime": "2019-03-04 15:11:44",
"modifyTime": "2019-03-04 15:11:44"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.3 删除帐号¶
3.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/{account}
- 请求方式:DELETE
- 返回格式:JSON
3.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | account | String | 是 | 帐号名称 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/testAccount
3.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"data": {},
"message": "Success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.4 查询帐号列表¶
3.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/accountList/{pageNumber}/{pageSize}?account={account}
- 请求方式:GET
- 返回格式:JSON
3.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | pageSize | Int | 是 | 每页记录数 |
2 | pageNumber | Int | 是 | 当前页码 |
3 | account | String | 否 | 帐号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/accountList/1/10?account=
3.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 信息列表 |
4.1 | Object | 信息对象 | ||
4.1.1 | account | String | 否 | 帐号 |
4.1.2 | roleId | Integer | 否 | 所属角色 |
4.1.3 | roleName | String | 否 | 角色名称 |
4.1.4 | roleNameZh | String | 否 | 角色中文名 |
4.1.5 | loginFailTime | Integer | 是 | 登录失败次数 |
4.1.6 | accountStatus | Integer | 否 | 帐号状态 |
4.1.7 | description | String | 是 | 备注 |
4.1.8 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.9 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"account": "testAccount",
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"loginFailTime": 0,
"accountStatus": 1,
"description": null,
"createTime": "2019-03-04 15:11:44",
"modifyTime": "2019-03-04 15:18:47"
},
{
"account": "admin",
"roleId": 100000,
"roleName": "admin",
"roleNameZh": "管理员",
"loginFailTime": 0,
"accountStatus": 2,
"description": null,
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-02-14 17:45:53"
}
],
"totalCount": 2
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.5 更新当前密码¶
3.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/passwordUpdate
- 请求方式:put
- 请求头:Content-type: application/json
- 返回格式:JSON
3.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | oldAccountPwd | String | 是 | 旧密码(sha256) |
2 | newAccountPwd | String | 是 | 新密码(sha256) |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/passwordUpdate
{
"oldAccountPwd": "dfdfgdg490cef2bfb60a9702erd2ddb7a805c9bd1arrrewefd51a7d0etttfa93e ",
"newAccountPwd": "3f21a8490cef2bfb60a9702e9d2ddb7a805c9bd1a263557dfd51a7d0e9dfa93e"
}
3.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.6 获取登录验证码¶
3.6.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/pictureCheckCode
- 请求方式:get
- 请求头:Content-type: application/json
- 返回格式:JSON
3.6.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 图片信息实体 |
3.1 | base64Image | String | 否 | 图片的base64 |
3.2 | token | String | 否 | token(登录接口需要用到此值) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"base64Image": "iVBORw0KGgoAAAANSUhEUgAAAJsAAAA8CAIAAAD+Gl+NAAAC3ElEQVR42u3cO04DMRAG4DkER6CFhoNwCgoq6DgQh0DiVJR0oUCKovWuPU977P2trZK1s/GnGb8g9PN7wbXSRReUtQpEIYoCURSIokAUBaIQTV2+P798r3mfnJbB69nXvmAnjdHm9+8ZgruNjI31mUQrvWPpPpeuH+43n2g9FOJyrOJmiMpQ+4fC0cdVniED6hzj6NjMdv3cZvJHjCpz70DazJY+oh2mBptmH+7um5eo/ff3F+mVENJHVDrMeEUGB1W0mFGgLrhnVI9OL1QdZ58wzTnVIMcA3X3FXTQP6tjJ7dFuBjnm29JgXlGXbazoubcs63K23JgSxu/MQXXpKd1IWS6XQ42b7ZOoH/lIZfp9ff7YXCuJHvX709sj87Jb1kQ5Ichp/XpPySmlra9hvCJAl3vr77qg8kO/h2idU4eaRJTTCXzRo9QtSuOkBuOjckQVriWqC7MIldnX6jD1OfF25NwNUP679X50n+4qljH2rMBJvNYY5QefDrWspZ4xRSxjOqMyh1I+arhoqbVbS4HK5IzebejAKUIlS/AlRL0OJ1OgShcwyvVotKjjLGmD2vSOXptGc3J63iSaBFUUx+oDmVSilf4/nWieMHURLRWsomrUnhvcOVEdRW8tyIIkuj9OtKmVUDSC01NUh9ozr2ZDdU+5jRPvIFHmEsUy3eVMeqP37jtwVk7uyCgkrcU5VtOFcsW1/2F4kCjnCLZxPqqI1Hot/mmMPVKDNgXdRflnMso9I07Aqc/abl+PWMOsispvmaRZVL3ru3vmF7EkdT+NWUq0kr5FO4Vl3U31iB0GL865UAV/Czj8X/tOUoxdhN9hyChqqQ7RpTghClEUiKJAFKIQBSpEF0aFKETX7cRsW1q6JyEoHh0qZABWfDqdnDPi5rGPSqflHLK06OBKiM7O1e0DRH1EIETn2HY4bMxffp31F5MHRmeQq3EW5vPrN2eOTq8h2X0u/d/aH4oBfftm+5EiAAAAAElFTkSuQmCC",
"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIzOGM0NjlhNC1kMTg3LTQyZDQtYWM1YS02OWU0OWM5MjMxNTkiLCJpYXQiOjE1NjAyNDY3MzksInN1YiI6ImU1RnoiLCJleHAiOjE1NjAyNDY3OTl9.FJYRZJSAhFjvO_P4AjMO6bnoOZJiu-AOSdO9ikb-30M"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
3.7 登录接口¶
3.7.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/account/login?checkCode={checkCode}
- 请求方式:get
- 请求头:Content-type: application/json;token:{token}
- 返回格式:JSON
3.7.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | checkCode | String | 是 | 登录验证码 |
2 | account | String | 是 | 帐号 |
3 | accountPwd | String | 是 | 密码 |
4 | token | String | 是 | 随验证码返回的token |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/account/login?checkCode=aege
{
"account": "admin",
"accountPwd": "Abcd1234"
}
1.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 图片信息实体 |
3.1 | account | String | 否 | 账户 |
3.2 | roleName | String | 否 | 角色 |
3.3 | accountStatus | Int | 否 | 状态 |
2)出参示例
- 成功:
{
"code": 0,
"data": {
"accountStatus": 2,
"roleName": "admin",
"account": "admin"
},
"message": "success"
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4 区块管理模块¶
4.1 查询区块列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/block/blockList/{groupId}/{pageNumber}/{pageSize}}?pkHash={pkHash}&blockNumber={blockNumber}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 当前所属链 |
2 | pageSize | Int | 是 | 每页记录数 |
3 | pageNumber | Int | 是 | 当前页码 |
4 | pkHash | String | 否 | 区块hash |
5 | blockNumber | BigInteger | 否 | 块高 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/block/blockList/group/1/10?pkHash=
返回参数¶
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": "0xa6a8e4154fc9c5dbd19922fcb7a77e4018f7004c5681d9d5faf1e3f5723c2053",
"blockNumber": 206,
"blockTimestamp": "2021-12-02 14:43:51",
"transCount": 1,
"sealerIndex": 0,
"sealer": "2d5053131f5c0a906fec99380ae797b505e697e1ec0e1f2b59a85ae7f28cb3313986e4e627090d8fdff0c545b82e475f00e616f28fd2b4ce0fb43c74bef7c2ab",
"createTime": "2021-12-02 14:44:16",
"modifyTime": "2021-12-02 14:44:16"
},
......
],
"totalCount": 207
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
4.2 根据块高查询区块信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/block/blockByNumber/{groupId}/{blockNumber}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 当前所属链 |
2 | pageNumber | Int | 是 | 当前页码 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/block/blockByNumber/group/1
返回参数¶
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": 1,
"version": 0,
"hash": "0x60d1eacd2a279c343c74b673ad30fc6c6a528fb8434b90cc276cc239bf998835",
"logsBloom": null,
"receiptsRoot": "0x96e73cf059095f36cd0fed8bd3ce15550de892eae269598b7ba9e1721c8d05a9",
"stateRoot": "0xd212274a9fdaf3c59a9733f0607b510456d5f395ae0a19c391cd277ff54c2872",
"sealer": 0,
"sealerList": [
"0x2d5053131f5c0a906fec99380ae797b505e697e1ec0e1f2b59a85ae7f28cb3313986e4e627090d8fdff0c545b82e475f00e616f28fd2b4ce0fb43c74bef7c2ab",
"0x44f760aa2f9058d2dd85a578197d2bfdeac7ef8db1dec39386854e1d66bce4077ce3cae1e4779658b3ebcf929c12e6f7a9c646b60084038c73aeeb9a9b376dab"
],
"extraData": "0x",
"gasUsed": "6677",
"timestamp": 1637909172326,
"parentInfo": [
{
"blockNumber": 0,
"blockHash": "0xe093202d1b18d96ac52700c37af54cd370f06d5062d31232baa3d9ac324d6a57"
}
],
"signatureList": [
{
"signature": "0x1695e0ae6ca37a5fd3d6dfd5c4f18223ec509caa89a485f58cc2675b9147538d1bd381ff5e1b07169639ad1865d18b9b9d1c01335a1edd6d251ff4a1dcef6d4700",
"sealerIndex": 0
},
{
"signature": "0x8d05b9be2cd01006e249b96c10261e560bf4994144e3808c64186b67001f70675a7d00244d4bc78b6c2369206d9675ed64e37c89c168c113afe4706db9bb0b1801",
"sealerIndex": 1
}
],
"consensusWeights": [
1,
1
],
"transactions": [
{
"version": 0,
"hash": "0x29fc394aab9f6b850cf670e4ffcfa07f749d65a96fdaf4a1734d08078716df2a",
"nonce": "628963865034161222069339779084488493077824905060891430374114608099078683365",
"blockLimit": 500,
"to": "",
"from": "0x",
"input": "0x608060405234801561001057600080fd5b50610148806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635f76f6ab146100515780636d4ce63c14610080575b600080fd5b34801561005d57600080fd5b5061007e6004803603810190808035151590602001909291905050506100af565b005b34801561008c57600080fd5b50610095610106565b604051808215151515815260200191505060405180910390f35b7f36091dfff76478d9ae2479602161a4e2cab3189920dc3bd12ee0e9e37a35cdc481604051808215151515815260200191505060405180910390a1806000806101000a81548160ff02191690831515021790555050565b60008060009054906101000a900460ff169050905600a165627a7a72305820e29d1a7d9ff77427603f50bd778c7194a67eb5d3e043498f1e666f95f47f8f090029",
"chainID": "chain",
"groupID": "group",
"signature": "0x01ca79d793e424fa2cd54ef8b8967cfdae72b7560d9ff9236bff5d833946571573b87172963acda9a88f119d932d7c76ae4ac2f29badf3e135c3b6f0eefd948e00",
"importTime": 0,
"transactionProof": null
}
],
"txsRoot": "0xc329ee0d01e17507035ef1e507a77484f0191744f9d28ad252ed33c9147cfa05"
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5 合约管理模块¶
5.1 查询合约列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/contractList/
- 请求方式:POST
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2 | contractName | String | 否 | 合约名 |
3 | contractAddress | String | 否 | 合约地址 |
4 | pageSize | int | 是 | 每页记录数 |
5 | pageNumber | int | 是 | 当前页码 |
6 | contractStatus | int | 否 | 1未部署,2已部署 |
7 | account | String | 否 | 关联账户 |
8 | contractPath | String | 否 | 合约路径 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/contractList
{
"account": "string",
"contractAddress": "string",
"contractName": "string",
"contractPath": "string",
"contractStatus": 0,
"groupId": "string",
"pageNumber": 0,
"pageSize": 0
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 列表 |
5.1 | Object | 返回信息实体 | ||
5.1.1 | contractId | int | 否 | 合约编号 |
5.1.2 | contractPath | String | 否 | 合约所在目录 |
5.1.3 | contractName | String | 否 | 合约名称 |
5.1.4 | groupId | String | 否 | 所属群组编号 |
5.1.5 | contractStatus | int | 否 | 1未部署,2已部署 |
5.1.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
5.1.7 | contractSource | String | 否 | 合约源码base64 |
5.1.8 | contractAbi | String | 是 | 合约编译后生成的abi文件内容 |
5.1.9 | contractBin | String | 是 | 合约编译后生成的bin,可用于交易解析 |
5.1.10 | bytecodeBin | String | 是 | 合约编译后生成的bytecodeBin,可用于合约部署 |
5.1.11 | contractAddress | String | 是 | 合约地址 |
5.1.12 | deployTime | LocalDateTime | 是 | 部署时间 |
5.1.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
5.1.14 | description | String | 是 | 备注 |
5.1.15 | account | String | 是 | 关联账户 |
5.1.16 | createTime | LocalDateTime | 否 | 创建时间 |
5.1.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 200002,
"contractPath": "hellos",
"contractVersion": null,
"contractName": "hellos",
"contractStatus": 2,
"groupId": "group",
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXgICAJbmFtZSA9IG47CiAgICB9Cn0=",
"contractAbi": "[\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"contractBin": "608060405234801561001057600080004d4c",
"bytecodeBin": "60806040526004361061004c576000398de7e4ddf5fdc9ccbcfd44565fed695cd960b0029",
"deployTime": "2019-06-11 18:11:33",
"description": null,
"account": "admin",
"createTime": "2019-06-05 16:40:40",
"modifyTime": "2019-06-11 18:11:33"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.2 查询合约信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/{contractId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | contractId | int | 是 | 合约编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/200001
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | groupId | String | 否 | 所属群组编号 |
3.5 | contractStatus | int | 否 | 1未部署,2已部署 |
3.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.7 | contractSource | String | 否 | 合约源码 |
3.8 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.9 | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.10 | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 |
3.11 | contractAddress | String | 是 | 合约地址 |
3.12 | deployTime | LocalDateTime | 是 | 部署时间 |
3.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
3.14 | description | String | 是 | 备注 |
3.15 | account | String | 是 | 关联账户 |
3.16 | createTime | LocalDateTime | 否 | 创建时间 |
3.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 200002,
"contractPath": "hellos",
"contractVersion": null,
"contractName": "hellos",
"contractStatus": 2,
"groupId": "group",
"contractType": 0,
"contractSource": "cHJhZ21hIHNvbGlkaXgICAJbmFtZSA9IG47CiAgICB9Cn0=",
"contractAbi": "[\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"bytecodeBin": "60806040526004361061004c576000398de7e4ddf5fdc9ccbcfd44565fed695cd960b0029",
"contractBin": "608060405234801561001057600080004d4c",
"deployTime": "2019-06-11 18:11:33",
"description": null,
"account": "admin",
"createTime": "2019-06-05 16:40:40",
"modifyTime": "2019-06-11 18:11:33"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.3 部署合约¶
构造方法参数(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
constructor(string s) -> ["aa,bb\"cc"] // 双引号要转义
constructor(uint n,bool b) -> [1,true]
constructor(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/deploy
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | contractName | String | 是 | 合约名称 |
3 | contractSource | String | 是 | 合约源码 |
4 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
5 | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
6 | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 |
7 | contractId | String | 是 | 合约名称 |
8 | contractPath | String | 是 | 合约所在目录 |
9 | user | String | 是 | WeBASE的私钥用户的地址 |
10 | account | String | 是 | 关联账户 |
11 | constructorParams | List | 否 | 构造函数入参,根据合约构造函数决定 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/deploy
{
"groupId": "group",
"contractBin": "60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b8060009080519060200190610202929190610206565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a72305820456bd30e517ce9633735d32413043bf33a2453c7f56e682b13e6125452d689dc0029",
"bytecodeBin": "608060405234801561001057600080fd5b506040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061005c929190610062565b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6102d7806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063299f7f9d146100515780633590b49f146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b8060009080519060200190610202929190610206565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a72305820456bd30e517ce9633735d32413043bf33a2453c7f56e682b13e6125452d689dc0029",
"contractAbi": "[{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]",
"contractSource": "cHJhZ21hIHNvbGlkaXR5ID49MC40LjI0IDwwLjYuMTE7Cgpjb250cmFjdCBIZWxsb1dvcmxkIHsKICAgIHN0cmluZyBuYW1lOwoKICAgIGNvbnN0cnVjdG9yKCkgcHVibGljIHsKICAgICAgICBuYW1lID0gIkhlbGxvLCBXb3JsZCEiOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldCgpIHB1YmxpYyB2aWV3IHJldHVybnMgKHN0cmluZyBtZW1vcnkpIHsKICAgICAgICByZXR1cm4gbmFtZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXQoc3RyaW5nIG1lbW9yeSBuKSBwdWJsaWMgewogICAgICAgIG5hbWUgPSBuOwogICAgfQp9",
"user": "0xdccae56cef725605d0fa1e00fd553074a74091c5",
"contractName": "HelloWorld",
"contractId": 200306,
"contractPath": "/",
"account": "admin"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | groupId | String | 否 | 所属群组编号 |
3.5 | contractStatus | int | 否 | 1未部署,2已部署 |
3.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) (已弃用字段) |
3.7 | contractSource | String | 否 | 合约源码 |
3.8 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.9 | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.10 | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 |
3.11 | contractAddress | String | 是 | 合约地址 |
3.12 | deployTime | LocalDateTime | 是 | 部署时间 |
3.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
3.14 | description | String | 是 | 备注 |
3.15 | account | String | 是 | 关联账户 |
3.16 | createTime | LocalDateTime | 否 | 创建时间 |
3.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 200008,
"contractPath": "Hi",
"contractVersion": null,
"contractName": "HeHe",
"contractStatus": 2,
"groupId": "group",
"contractType": null,
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuM0=",
"contractAbi": "[]",
"bytecodeBin": "60806040526004361061004c576000357c010274c87bff322ea2269b80029",
"contractBin": "608060405234801561001057629",
"contractAddress": "0xa2ea2280b3a08a3ae2e1785dff09561e13915fb2",
"deployTime": "2019-06-11 18:58:33",
"description": null,
"account": "admin",
"createTime": null,
"modifyTime": null,
"deployAddress": "0xb783d7c2cd45d8c678093d5f6f1d61855e260e67",
"deployUserName": "frank"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.4 发送交易¶
方法入参(funcParam)为JSON数组,多个参数以逗号分隔(参数为数组时同理),示例:
function set(string s) -> ["aa,bb\"cc"] // 双引号要转义
function set(uint n,bool b) -> [1,true]
function set(bytes b,address[] a) -> ["0x1a",["0x7939E26070BE44E6c4Fc759Ce55C6C8b166d94BE","0xce867fD9afa64175bb50A4Aa0c17fC7C4A3C67D9"]]
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/transaction
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | user | String | 是 | 私钥用户的地址 |
3 | contractName | String | 是 | 合约名称 |
4 | contractId | Int | 是 | 合约编号 |
5 | funcName | String | 是 | 合约方法名 |
6 | contractAddress | String | 否 | 合约地址 |
7 | funcParam | List | 否 | 合约方法入参 |
8 | contractAbi | List | 是 | 合约abi/合约单个函数的abi |
9 | useCns | bool | 否 | 是否使用cns调用,默认为false |
10 | cnsName | String | 否 | CNS名称,useCns为true时不能为空 |
11 | version | String | 否 | CNS合约版本,useCns为true时不能为空 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/transaction
{
"groupId": "group",
"user":"0xdccae56cef725605d0fa1e00fd553074a74091c5",
"contractName":"HelloWorld",
"funcName":"set",
"funcParam":["gwes"],
"contractAbi": [{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}],
"contractId":200306,
"contractAddress":"0x4d1cbcc47b2558d818b9672df67f22f9a9645c87"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"value": 0,
"bitSize": 16,
"typeAsString": "int16"
}],
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.5 根据包含bytecodeBin的字符串查询合约¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /contract/findByPartOfBytecodeBin
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | partOfBytecodeBin | String | 是 | 包含合约bytecodeBin的的字符串 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/findByPartOfBytecodeBin
{
"groupId": "group",
"partOfBytecodeBin": "abc123455dev"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | String | 否 | 所属群组编号 |
3.4 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.5 | contractSource | String | 否 | 合约源码 |
3.6 | contractAbi | String | 是 | 编译合约生成的abi文件内容 |
3.7 | contractBin | String | 是 | 合约编译的runtime-bytecode(runtime-bin),用于交易解析 |
3.8 | bytecodeBin | String | 是 | 合约编译的bytecode(bin),用于部署合约 |
3.9 | contractAddress | String | 是 | 合约地址 |
3.10 | deployTime | LocalDateTime | 是 | 部署时间 |
3.11 | contractVersion | String | 否 | 合约版本 |
3.12 | description | String | 是 | 备注 |
3.13 | account | String | 是 | 关联账户 |
3.14 | createTime | LocalDateTime | 否 | 创建时间 |
3.15 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"contractId": 200002,
"contractName": "Ok",
"groupId": 2,
"chainIndex": null,
"contractType": 0,
"contractSource": "cHJhZ21hIDQoNCg0KfQ==",
"contractAbi": "[]",
"contractBin": "60606040526000357c01000000000029",
"bytecodeBin": "123455",
"contractAddress": "0x19146d3a2f138aacb97ac52dd45dd7ba7cb3e04a",
"deployTime": null,
"contractVersion": "v6.0",
"description": null,
"account": "admin",
"createTime": "2019-04-15 21:14:40",
"modifyTime": "2019-04-15 21:14:40"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
5.6. 保存合约接口¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/save
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | contractId | int | 否 | 合约编号,传入contractId表示更新,否则新增 |
3 | contractName | String | 是 | 合约名称 |
4 | contractPath | String | 是 | 合约所在目录 |
5 | contractSource | String | 否 | 合约源码的base64 |
6 | contractAbi | String | 否 | 合约编译后生成的abi文件内容 |
7 | contractBin | String | 否 | 合约编译后生成的bin,可用于交易解析 |
8 | bytecodeBin | String | 否 | 合约编译后生成的bytecodeBin,可用于合约部署 |
9 | account | String | 否 | 关联账户,新建时不能为空 |
10 | contractAddress | String | 否 | 合约地址 |
2)入参示例
{
"groupId": "group",
"contractName": "HeHe",
"contractPath": "/",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjsn0=",
"contractAbi": “[]”
"contractBin": "60806040526004361061004c576000357c0100000000000000000000000029",
"bytecodeBin": "6080604052348015610010572269b80029",
"contractId": 1,
"account": "admin",
"contractAddress": "string"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | contractId | int | 否 | 合约编号 |
3.2 | contractPath | String | 否 | 合约所在目录 |
3.3 | contractName | String | 否 | 合约名称 |
3.4 | groupId | String | 否 | 所属群组编号 |
3.5 | contractStatus | int | 否 | 1未部署,2已部署 |
3.6 | contractType | Int | 否 | 合约类型(0-普通合约,1-系统合约) |
3.7 | contractSource | String | 否 | 合约源码base64 |
3.8 | contractAbi | String | 是 | 合约编译后生成的abi文件内容 |
3.9 | contractBin | String | 是 | 合约编译后生成的bin,可用于交易解析 |
3.10 | bytecodeBin | String | 是 | 合约编译后生成的bytecodeBin,可用于合约部署 |
3.11 | contractAddress | String | 是 | 合约地址 |
3.12 | deployTime | LocalDateTime | 是 | 部署时间 |
3.13 | contractVersion | String | 否 | 合约版本(会去除该字段) |
3.14 | description | String | 是 | 备注 |
3.15 | account | String | 是 | 关联账户 |
3.16 | createTime | LocalDateTime | 否 | 创建时间 |
3.17 | modifyTime | LocalDateTime | 是 | 修改时间 |
5.7 获取Abi信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /abi/{abiId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | abiId | Long | 是 | abi编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/abi/1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | abiId | int | 否 | 合约编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | Int | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"abiId": 1,
"groupId": 1,
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357...",
"account": "admin",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
}
5.8 获取Abi信息分页列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /abi/list/{groupId}/{pageNumber}/{pageSize}?account={account}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组编号 |
2 | pageNumber | int | 是 | 页码,从1开始 |
3 | pageSize | int | 是 | 页大小 |
4 | account | String | 否 | 所属账号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/abi/list/group/1/5?account=
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | abiId | int | 否 | 合约编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | String | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"abiId": 1,
"groupId": "group",
"account": "admin",
"contractName": "TTT",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"setSender\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint256[2]\"}],\"name\":\"EventList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetSender\",\"type\":\"event\"}]",
"contractBin": "608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463fffff...29",
"createTime": "2020-05-18 10:59:02",
"modifyTime": "2020-05-18 10:59:02"
}
],
"totalCount": 1
}
5.9. 导入已部署合约的abi¶
将其他平台已部署的合约导入到本平台进行管理
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/abi
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | contractAddress | String | 是 | 合约地址 |
3 | contractName | String | 是 | 合约名称 |
4 | contractAbi | List | 是 | 合约编译后生成的abi文件内容 |
5 | account | String | 是 | 所属账号 |
6 | abiId | int | 是 | 合约编号 |
2)入参示例
{
"groupId": "group",
"abiId": 1,
"account": "admin",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractName": "HelloWorld",
"contractAbi": [{
"constant": false,
"inputs": [{
"name": "n",
"type": "string"
}],
"name": "set",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}, {
"constant": true,
"inputs": [],
"name": "get",
"outputs": [{
"name": "",
"type": "string"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
}, {
"anonymous": false,
"inputs": [{
"indexed": false,
"name": "name",
"type": "string"
}],
"name": "SetName",
"type": "event"
}]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
5.10. 修改已部署合约的abi¶
将其他平台已部署的合约导入到本平台进行管理
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/abi
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | abiId | long | 是 | abi编号 |
2 | groupId | String | 是 | 所属群组编号 |
3 | contractAddress | String | 是 | 合约地址 |
4 | contractName | String | 是 | 合约名称 |
5 | contractAbi | List | 是 | 合约编译后生成的abi文件内容 |
6 | account | String | 是 |
2)入参示例
{
"abiId": 1,
"groupId": "group",
"contractAddress": "0x3214227e87bccca63893317febadd0b51ade735e",
"contractName": "HelloWorld",
"contractAbi": [{"constant":false,"inputs":[{"name":"n","type":"string"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"}],"name":"SetName","type":"event"}]
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(空) |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
5.11. 获取全量合约列表(不包含abi/bin)¶
接口描述¶
根据群组编号和合约状态获取全量合约
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/contractList/all/light?groupId={groupId}&contractStatus={contractStatus}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/contractList/all/light?groupId=group&contractStatus=2
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | Object | 否 | |
3.1 | 合约编号 | id | Integer | 是 | |
3.2 | 所在目录 | contractPath | String | 是 | |
3.3 | 合约名称 | contractName | String | 是 | |
3.4 | 合约状态 | contractStatus | Integer | 是 | 1未部署,2已部署 |
3.5 | 所属群组 | groupId | Integer | 是 | |
3.6 | 合约地址 | contractAddress | String | 否 | |
3.7 | 部署时间 | deployTime | String | 否 | |
3.8 | 修改时间 | modifyTime | String | 是 | |
3.9 | 创建时间 | createTime | String | 是 | |
3.10 | 备注 | description | String | 否 | |
3.11 | 部署用户地址 | deployAddress | String | 否 | |
3.12 | 部署用户姓名 | deployUserName | String | 否 |
2)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 2,
"contractPath": "/",
"contractName": "HeHe",
"contractStatus": 1,
"groupId":"group",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IICB9Cn0=",
"contractAddress": null,
"deployTime": null,
"description": null,
"createTime": "2019-06-10 16:42:50",
"modifyTime": "2019-06-10 16:42:52"
}
],
"totalCount": 1
}
5.12. 保存合约路径¶
接口描述¶
保存合约路径
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/contractPath
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约路径 | contractPath | String | 是 | ||
3 | 账户 | account | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/contractPath
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 返回数据 | data | int | 否 | 增加数 |
2)数据格式
{
"code": 0,
"message": "success",
"data": 1
}
5.13. 删除合约路径并批量删除合约¶
接口描述¶
删除合约路径并批量删除合约
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/batch/path
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约路径 | contractPath | String | 是 | ||
3 | 账户 | account | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/batch/path
{
"groupId": "group",
"contractPath": test
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 |
2)数据格式
{
"code": 0,
"message": "success"
}
5.14 获取合约与导入ABI列表(分页)¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /abi/list/all/{groupId}/{pageNumber}/{pageSize}?account={account}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组编号 |
2 | pageNumber | int | 是 | 页码,从1开始 |
3 | pageSize | int | 是 | 页大小 |
4 | account | String | 否 | 所属账号 |
5 | contractName | String | 否 | |
6 | contractAddress | String | 否 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/abi/list/all/group/1/5
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回数据 | ||
3.0 | contractId | int | 合约编号(contractId为空时,说明合约为外部导入的) | |
3.1 | abiId | int | 否 | 合约abi编号 |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | String | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
3.10 | contractPath | String | 是 | 合约路径 |
3.11 | contractStatus | int | 是 | 合约状态 |
3.12 | deployAddress | String | 否 | 部署用户地址 |
3.13 | deployUserName | String | 否 | 部署用户名 |
3.14 | contractVersion | String | 否 | 合约版本 |
3.15 | contractType | int | 否 | 合约类型 |
3.16 | contractSource | String | 否 | 合约来源 |
3.17 | bytecodeBin | String | 否 | 字节码bin |
3.18 | deployTime | String | 否 | 部署时间 |
3.19 | description | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 200032,
"contractPath": "/",
"contractVersion": null,
"contractName": "AAA",
"account": "admin",
"contractStatus": 2,
"groupId": "group",
"contractType": 0,
"contractSource": null,
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"int256\"}],\"name\":\"test\",\"type\":\"event\"}]",
"contractBin": "60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634ed3885e146100515780636d4ce63c146100ba575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061014a565b005b3480156100c657600080fd5b506100cf61019c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010f5780820151818401526020810190506100f4565b50505050905090810190601f16801561013c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f9b22c05d8738838d85bfcacfb2975e59c4f830d5977978bc4e3807f38d08b40e607b6040518082815260200191505060405180910390a1806000908051906020019061019892919061023e565b5050565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102345780601f1061020957610100808354040283529160200191610234565b820191906000526020600020905b81548152906001019060200180831161021757829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061027f57805160ff19168380011785556102ad565b828001600101855582156102ad579182015b828111156102ac578251825591602001919060010190610291565b5b5090506102ba91906102be565b5090565b6102e091905b808211156102dc5760008160009055506001016102c4565b5090565b905600a165627a7a72305820af1790f550db8574896d26e14c0d9b1e24ac7d740ceb8514606e649c7688a3fe0029",
"bytecodeBin": "608060405234801561001057600080fd5b5061030f806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634ed3885e146100515780636d4ce63c146100ba575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061014a565b005b3480156100c657600080fd5b506100cf61019c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010f5780820151818401526020810190506100f4565b50505050905090810190601f16801561013c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f9b22c05d8738838d85bfcacfb2975e59c4f830d5977978bc4e3807f38d08b40e607b6040518082815260200191505060405180910390a1806000908051906020019061019892919061023e565b5050565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102345780601f1061020957610100808354040283529160200191610234565b820191906000526020600020905b81548152906001019060200180831161021757829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061027f57805160ff19168380011785556102ad565b828001600101855582156102ad579182015b828111156102ac578251825591602001919060010190610291565b5b5090506102ba91906102be565b5090565b6102e091905b808211156102dc5760008160009055506001016102c4565b5090565b905600a165627a7a72305820af1790f550db8574896d26e14c0d9b1e24ac7d740ceb8514606e649c7688a3fe0029",
"contractAddress": "0xab9F30F9827e1C16Bf62d557c3626AeAd9E85502",
"deployTime": "2021-12-06 11:31:34",
"description": null,
"createTime": "2021-12-06 11:31:34",
"modifyTime": "2021-12-06 11:31:34",
"deployAddress": "0x9097678eb34daeebb6e3528ed4f8715cdc5e4c09",
"deployUserName": "new_test",
"abiId": 26
},
...
],
"totalCount": 2
}
5.15. 导入合约仓库到IDE¶
接口描述¶
保存多个合约
传输协议规范¶
- 网络传输协议:HTTP协议
- 请求地址:/contract/copy
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约IDE路径 | contractPath | String | 是 | 默认为"/" | |
3 | 合约所属用户 | account | String | 是 | ||
4 | 合约内容 | contractItems | List | 是 | RepCopyContractItem的List | |
4.1 | 合约名称 | contractName | String | 是 | ||
4.2 | 合约源码 | contractSource | String | 是 | Base64编码 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/copy
{
"contractItems": [{
"contractName": "Evidence",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YUFCSXsgZnVuY3Rpb24gdmVyaWZ5KGFkZHJlc3MgYWRkcilwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhib29sKXt9CmZ1bmN0aW9uIGdldFNpZ25lcih1aW50IGluZGV4KXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3Mpe30gCmZ1bmN0aW9uIGdldFNpZ25lcnNTaXplKCkgcHVibGljIGNvbnN0YW50IHJldHVybnModWludCl7fQp9Cgpjb250cmFjdCBFdmlkZW5jZXsKICAgIAogICAgc3RyaW5nIGV2aWRlbmNlOwogICAgc3RyaW5nIGV2aWRlbmNlSW5mbzsKICAgIHN0cmluZyBldmlkZW5jZUlkOwogICAgdWludDhbXSBfdjsKICAgIGJ5dGVzMzJbXSBfcjsKICAgIGJ5dGVzMzJbXSBfczsKICAgIGFkZHJlc3NbXSBzaWduZXJzOwogICAgYWRkcmVzcyBwdWJsaWMgc2lnbmVyc0FkZHI7CiAgICAKICAgICAgICBldmVudCBhZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IG5ld1NpZ25hdHVyZXNFdmVudChzdHJpbmcgZXZpLCBzdHJpbmcgaW5mbywgc3RyaW5nIGlkLCB1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcyxhZGRyZXNzIGFkZHIpOwogICAgICAgIGV2ZW50IGVycm9yTmV3U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLGFkZHJlc3MgYWRkcik7CiAgICAgICAgZXZlbnQgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsYWRkcmVzcyBhZGRyKTsKICAgICAgICBldmVudCBhZGRSZXBlYXRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsIGFkZHJlc3MgYWRkcik7CgogICAgZnVuY3Rpb24gQ2FsbFZlcmlmeShhZGRyZXNzIGFkZHIpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpIHsKICAgICAgICByZXR1cm4gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikudmVyaWZ5KGFkZHIpOwogICAgfQoKICAgICAgIGZ1bmN0aW9uIEV2aWRlbmNlKHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLCBhZGRyZXNzIGFkZHIsIGFkZHJlc3Mgc2VuZGVyKSBwdWJsaWMgewogICAgICAgc2lnbmVyc0FkZHIgPSBhZGRyOwogICAgICAgaWYoQ2FsbFZlcmlmeShzZW5kZXIpKQogICAgICAgewogICAgICAgICAgIGV2aWRlbmNlID0gZXZpOwogICAgICAgICAgIGV2aWRlbmNlSW5mbyA9IGluZm87CiAgICAgICAgICAgZXZpZGVuY2VJZCA9IGlkOwogICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgX3IucHVzaChyKTsKICAgICAgICAgICBfcy5wdXNoKHMpOwogICAgICAgICAgIHNpZ25lcnMucHVzaChzZW5kZXIpOwogICAgICAgICAgIG5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgICBlcnJvck5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RXZpZGVuY2VJbmZvKCkgcHVibGljIGNvbnN0YW50IHJldHVybnMoc3RyaW5nKXsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlSW5mbzsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRFdmlkZW5jZSgpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ4W10sYnl0ZXMzMltdLGJ5dGVzMzJbXSxhZGRyZXNzW10pewogICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICByZXR1cm4oZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsX3YsX3IsX3Msc2lnbmVyTGlzdCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkU2lnbmF0dXJlcyh1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcykgcHVibGljIHJldHVybnMoYm9vbCkgewogICAgICAgIGZvcih1aW50IGk9IDAgO2k8c2lnbmVycy5sZW5ndGggO2krKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKG1zZy5zZW5kZXIgPT0gc2lnbmVyc1tpXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoIF92W2ldID09IHYgJiYgX3JbaV0gPT0gciAmJiBfc1tpXSA9PSBzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZFJlcGVhdFNpZ25hdHVyZXNFdmVudChldmlkZW5jZSxldmlkZW5jZUluZm8sZXZpZGVuY2VJZCx2LHIscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgIGlmKENhbGxWZXJpZnkobXNnLnNlbmRlcikpCiAgICAgICB7CiAgICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgIF9yLnB1c2gocik7CiAgICAgICAgICAgIF9zLnB1c2gocyk7CiAgICAgICAgICAgIHNpZ25lcnMucHVzaChtc2cuc2VuZGVyKTsKICAgICAgICAgICAgYWRkU2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSW5mbyxldmlkZW5jZUlkLHYscixzKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgICAgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRTaWduZXJzKClwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhhZGRyZXNzW10pCiAgICB7CiAgICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNpZ25lckxpc3Q7CiAgICB9Cn0="
}, {
"contractName": "EvidenceSignersData",
"contractSource": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKaW1wb3J0ICJFdmlkZW5jZS5zb2wiOwoKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YXsKICAgICAgICBhZGRyZXNzW10gc2lnbmVyczsKCQlldmVudCBuZXdFdmlkZW5jZUV2ZW50KGFkZHJlc3MgYWRkcik7CiAgICAgICAgZnVuY3Rpb24gbmV3RXZpZGVuY2Uoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sc3RyaW5nIGlkLHVpbnQ4IHYsIGJ5dGVzMzIgcixieXRlczMyIHMpcHVibGljIHJldHVybnMoYWRkcmVzcykKICAgICAgICB7CiAgICAgICAgICAgIEV2aWRlbmNlIGV2aWRlbmNlID0gbmV3IEV2aWRlbmNlKGV2aSwgaW5mbywgaWQsIHYsIHIsIHMsIHRoaXMsIG1zZy5zZW5kZXIpOwogICAgICAgICAgICBuZXdFdmlkZW5jZUV2ZW50KGV2aWRlbmNlKTsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gRXZpZGVuY2VTaWduZXJzRGF0YShhZGRyZXNzW10gZXZpZGVuY2VTaWduZXJzKXB1YmxpY3sKICAgICAgICAgICAgZm9yKHVpbnQgaT0wOyBpPGV2aWRlbmNlU2lnbmVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBzaWduZXJzLnB1c2goZXZpZGVuY2VTaWduZXJzW2ldKTsKCQkJfQoJCX0KCiAgICBmdW5jdGlvbiB2ZXJpZnkoYWRkcmVzcyBhZGRyKXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpewogICAgZm9yKHVpbnQgaT0wOyBpPHNpZ25lcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoYWRkciA9PSBzaWduZXJzW2ldKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyKHVpbnQgaW5kZXgpcHVibGljIGNvbnN0YW50IHJldHVybnMoYWRkcmVzcyl7CiAgICAgICAgdWludCBsaXN0U2l6ZSA9IHNpZ25lcnMubGVuZ3RoOwogICAgICAgIGlmKGluZGV4IDwgbGlzdFNpemUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc2lnbmVyc1tpbmRleF07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyc1NpemUoKSBwdWJsaWMgY29uc3RhbnQgcmV0dXJucyh1aW50KXsKICAgICAgICByZXR1cm4gc2lnbmVycy5sZW5ndGg7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVycygpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3NbXSl7CiAgICAgICAgcmV0dXJuIHNpZ25lcnM7CiAgICB9Cgp9"
}],
"contractPath": "Evidence1",
"groupId": "1",
"account": "mars"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请参看附录1 |
2 | 提示信息 | message | String | 是 | |
3 | 数据 | data | Int | 否 | copy合约数 |
2)数据格式
{
"code": 0,
"message": "success",
"data": 2
}
5.16. 获取合约仓库列表¶
接口描述¶
返回合约仓库信息列表
接口URL¶
http://localhost:5001/WeBASE-Node-Manager/warehouse/list
调用方法¶
HTTP GET
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"warehouseName": "工具箱",
"warehouseNameEn": "Toolbox",
"type": "1",
"warehouseIcon": "toolboxId",
"description": "工具箱中有常用的工具合约",
"warehouseDetail": "工具箱中有常用的工具合约",
"descriptionEn": "Toolbox Contract suite",
"warehouseDetailEn": "Toolbox Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"id": 2,
"warehouseName": "存证应用",
"warehouseNameEn": "Evidence",
"type": "2",
"warehouseIcon": "evidenceId",
"description": "一套区块链存证合约",
"warehouseDetail": "一套区块链存证合约",
"descriptionEn": "Evidence Contract suite",
"warehouseDetailEn": "Evidence Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"id": 3,
"warehouseName": "积分应用",
"warehouseNameEn": "Points",
"type": "3",
"warehouseIcon": "pointsId",
"description": "一套积分合约",
"warehouseDetail": "一套积分合约",
"descriptionEn": "Points Contract suite",
"warehouseDetailEn": "Points Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
5.17. 根据仓库编号获取仓库信息¶
接口描述¶
返回合约仓库信息
接口URL¶
http://localhost:5001/WeBASE-Node-Manager/warehouse?warehouseId={warehouseId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 仓库编号 | warehouseId | int | 是 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/warehouse?warehouseId=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"warehouseName": "工具箱",
"warehouseNameEn": "Toolbox",
"type": "1",
"warehouseIcon": "toolboxId",
"description": "工具箱中有常用的工具合约",
"warehouseDetail": "工具箱中有常用的工具合约",
"descriptionEn": "Toolbox Contract suite",
"warehouseDetailEn": "Toolbox Contract suite",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
5.18. 根据仓库编号获取合约文件夹信息¶
接口描述¶
返回合约文件夹信息
接口URL¶
http://localhost:5001/WeBASE-Node-Manager/warehouse/folder/list?warehouseId={warehouseId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 仓库编号 | warehouseId | int | 是 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/warehouse/folder/list?warehouseId=1
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"id": 2,
"folderName": "Evidence",
"folderDesc": "Evidence",
"folderDetail": "Evidence",
"folderDescEn": "Evidence",
"folderDetailEn": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
5.19. 根据合约文件夹编号获取合约文件夹信息¶
接口描述¶
返回合约文件夹信息
接口URL¶
http://localhost:5001/WeBASE-Node-Manager/warehouse/folder?folderId={folderId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约文件夹编号 | folderId | int | 是 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/warehouse/folder?folderId=2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"id": 2,
"folderName": "Evidence",
"folderDesc": "Evidence",
"folderDetail": "Evidence",
"folderDescEn": "Evidence",
"folderDetailEn": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
5.20. 根据文件夹编号获取合约列表¶
接口描述¶
返回合约信息列表
接口URL¶
http://localhost:5001/WeBASE-Node-Manager/warehouse/item/list?folderId={folderId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 文件夹编号 | folderId | int | 是 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/warehouse/item/list?folderId=2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": [
{
"contractId": 4,
"contractFolderId": 2,
"contractName": "Evidence",
"contractDesc": "Evidence",
"contractSrc": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YUFCSXsgZnVuY3Rpb24gdmVyaWZ5KGFkZHJlc3MgYWRkcilwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhib29sKXt9CmZ1bmN0aW9uIGdldFNpZ25lcih1aW50IGluZGV4KXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3Mpe30gCmZ1bmN0aW9uIGdldFNpZ25lcnNTaXplKCkgcHVibGljIGNvbnN0YW50IHJldHVybnModWludCl7fQp9Cgpjb250cmFjdCBFdmlkZW5jZXsKICAgIAogICAgc3RyaW5nIGV2aWRlbmNlOwogICAgc3RyaW5nIGV2aWRlbmNlSW5mbzsKICAgIHN0cmluZyBldmlkZW5jZUlkOwogICAgdWludDhbXSBfdjsKICAgIGJ5dGVzMzJbXSBfcjsKICAgIGJ5dGVzMzJbXSBfczsKICAgIGFkZHJlc3NbXSBzaWduZXJzOwogICAgYWRkcmVzcyBwdWJsaWMgc2lnbmVyc0FkZHI7CiAgICAKICAgICAgICBldmVudCBhZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IG5ld1NpZ25hdHVyZXNFdmVudChzdHJpbmcgZXZpLCBzdHJpbmcgaW5mbywgc3RyaW5nIGlkLCB1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcyxhZGRyZXNzIGFkZHIpOwogICAgICAgIGV2ZW50IGVycm9yTmV3U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLGFkZHJlc3MgYWRkcik7CiAgICAgICAgZXZlbnQgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsYWRkcmVzcyBhZGRyKTsKICAgICAgICBldmVudCBhZGRSZXBlYXRTaWduYXR1cmVzRXZlbnQoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMpOwogICAgICAgIGV2ZW50IGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KHN0cmluZyBldmksIHN0cmluZyBpZCwgdWludDggdiwgYnl0ZXMzMiByLCBieXRlczMyIHMsIGFkZHJlc3MgYWRkcik7CgogICAgZnVuY3Rpb24gQ2FsbFZlcmlmeShhZGRyZXNzIGFkZHIpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpIHsKICAgICAgICByZXR1cm4gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikudmVyaWZ5KGFkZHIpOwogICAgfQoKICAgICAgIGZ1bmN0aW9uIEV2aWRlbmNlKHN0cmluZyBldmksIHN0cmluZyBpbmZvLCBzdHJpbmcgaWQsIHVpbnQ4IHYsIGJ5dGVzMzIgciwgYnl0ZXMzMiBzLCBhZGRyZXNzIGFkZHIsIGFkZHJlc3Mgc2VuZGVyKSBwdWJsaWMgewogICAgICAgc2lnbmVyc0FkZHIgPSBhZGRyOwogICAgICAgaWYoQ2FsbFZlcmlmeShzZW5kZXIpKQogICAgICAgewogICAgICAgICAgIGV2aWRlbmNlID0gZXZpOwogICAgICAgICAgIGV2aWRlbmNlSW5mbyA9IGluZm87CiAgICAgICAgICAgZXZpZGVuY2VJZCA9IGlkOwogICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgX3IucHVzaChyKTsKICAgICAgICAgICBfcy5wdXNoKHMpOwogICAgICAgICAgIHNpZ25lcnMucHVzaChzZW5kZXIpOwogICAgICAgICAgIG5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgICBlcnJvck5ld1NpZ25hdHVyZXNFdmVudChldmksaW5mbyxpZCx2LHIscyxhZGRyKTsKICAgICAgIH0KICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RXZpZGVuY2VJbmZvKCkgcHVibGljIGNvbnN0YW50IHJldHVybnMoc3RyaW5nKXsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlSW5mbzsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRFdmlkZW5jZSgpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKHN0cmluZyxzdHJpbmcsc3RyaW5nLHVpbnQ4W10sYnl0ZXMzMltdLGJ5dGVzMzJbXSxhZGRyZXNzW10pewogICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICByZXR1cm4oZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsX3YsX3IsX3Msc2lnbmVyTGlzdCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkU2lnbmF0dXJlcyh1aW50OCB2LCBieXRlczMyIHIsIGJ5dGVzMzIgcykgcHVibGljIHJldHVybnMoYm9vbCkgewogICAgICAgIGZvcih1aW50IGk9IDAgO2k8c2lnbmVycy5sZW5ndGggO2krKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKG1zZy5zZW5kZXIgPT0gc2lnbmVyc1tpXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoIF92W2ldID09IHYgJiYgX3JbaV0gPT0gciAmJiBfc1tpXSA9PSBzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFkZFJlcGVhdFNpZ25hdHVyZXNFdmVudChldmlkZW5jZSxldmlkZW5jZUluZm8sZXZpZGVuY2VJZCx2LHIscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVwZWF0U2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgIGlmKENhbGxWZXJpZnkobXNnLnNlbmRlcikpCiAgICAgICB7CiAgICAgICAgICAgIF92LnB1c2godik7CiAgICAgICAgICAgIF9yLnB1c2gocik7CiAgICAgICAgICAgIF9zLnB1c2gocyk7CiAgICAgICAgICAgIHNpZ25lcnMucHVzaChtc2cuc2VuZGVyKTsKICAgICAgICAgICAgYWRkU2lnbmF0dXJlc0V2ZW50KGV2aWRlbmNlLGV2aWRlbmNlSW5mbyxldmlkZW5jZUlkLHYscixzKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgICAgZXJyb3JBZGRTaWduYXR1cmVzRXZlbnQoZXZpZGVuY2UsZXZpZGVuY2VJbmZvLGV2aWRlbmNlSWQsdixyLHMsbXNnLnNlbmRlcik7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBnZXRTaWduZXJzKClwdWJsaWMgY29uc3RhbnQgcmV0dXJucyhhZGRyZXNzW10pCiAgICB7CiAgICAgICAgIHVpbnQgbGVuZ3RoID0gRXZpZGVuY2VTaWduZXJzRGF0YUFCSShzaWduZXJzQWRkcikuZ2V0U2lnbmVyc1NpemUoKTsKICAgICAgICAgYWRkcmVzc1tdIG1lbW9yeSBzaWduZXJMaXN0ID0gbmV3IGFkZHJlc3NbXShsZW5ndGgpOwogICAgICAgICBmb3IodWludCBpPSAwIDtpPGxlbmd0aCA7aSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBzaWduZXJMaXN0W2ldID0gKEV2aWRlbmNlU2lnbmVyc0RhdGFBQkkoc2lnbmVyc0FkZHIpLmdldFNpZ25lcihpKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNpZ25lckxpc3Q7CiAgICB9Cn0=",
"contractDescEn": "Evidence",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
},
{
"contractId": 5,
"contractFolderId": 2,
"contractName": "EvidenceSignersData",
"contractDesc": "EvidenceSignersData",
"contractSrc": "cHJhZ21hIHNvbGlkaXR5IF4wLjQuNDsKaW1wb3J0ICJFdmlkZW5jZS5zb2wiOwoKY29udHJhY3QgRXZpZGVuY2VTaWduZXJzRGF0YXsKICAgICAgICBhZGRyZXNzW10gc2lnbmVyczsKCQlldmVudCBuZXdFdmlkZW5jZUV2ZW50KGFkZHJlc3MgYWRkcik7CiAgICAgICAgZnVuY3Rpb24gbmV3RXZpZGVuY2Uoc3RyaW5nIGV2aSwgc3RyaW5nIGluZm8sc3RyaW5nIGlkLHVpbnQ4IHYsIGJ5dGVzMzIgcixieXRlczMyIHMpcHVibGljIHJldHVybnMoYWRkcmVzcykKICAgICAgICB7CiAgICAgICAgICAgIEV2aWRlbmNlIGV2aWRlbmNlID0gbmV3IEV2aWRlbmNlKGV2aSwgaW5mbywgaWQsIHYsIHIsIHMsIHRoaXMsIG1zZy5zZW5kZXIpOwogICAgICAgICAgICBuZXdFdmlkZW5jZUV2ZW50KGV2aWRlbmNlKTsKICAgICAgICAgICAgcmV0dXJuIGV2aWRlbmNlOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gRXZpZGVuY2VTaWduZXJzRGF0YShhZGRyZXNzW10gZXZpZGVuY2VTaWduZXJzKXB1YmxpY3sKICAgICAgICAgICAgZm9yKHVpbnQgaT0wOyBpPGV2aWRlbmNlU2lnbmVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBzaWduZXJzLnB1c2goZXZpZGVuY2VTaWduZXJzW2ldKTsKCQkJfQoJCX0KCiAgICBmdW5jdGlvbiB2ZXJpZnkoYWRkcmVzcyBhZGRyKXB1YmxpYyBjb25zdGFudCByZXR1cm5zKGJvb2wpewogICAgZm9yKHVpbnQgaT0wOyBpPHNpZ25lcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoYWRkciA9PSBzaWduZXJzW2ldKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyKHVpbnQgaW5kZXgpcHVibGljIGNvbnN0YW50IHJldHVybnMoYWRkcmVzcyl7CiAgICAgICAgdWludCBsaXN0U2l6ZSA9IHNpZ25lcnMubGVuZ3RoOwogICAgICAgIGlmKGluZGV4IDwgbGlzdFNpemUpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc2lnbmVyc1tpbmRleF07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVyc1NpemUoKSBwdWJsaWMgY29uc3RhbnQgcmV0dXJucyh1aW50KXsKICAgICAgICByZXR1cm4gc2lnbmVycy5sZW5ndGg7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2lnbmVycygpIHB1YmxpYyBjb25zdGFudCByZXR1cm5zKGFkZHJlc3NbXSl7CiAgICAgICAgcmV0dXJuIHNpZ25lcnM7CiAgICB9Cgp9",
"contractDescEn": "EvidenceSignersData",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
]
}
5.21. 根据合约编号获取合约信息¶
接口描述¶
返回合约信息
接口URL¶
http://localhost:5001/WeBASE-Node-Manager/warehouse/item?contractId={contractId}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 合约编号 | contractId | int | 是 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/warehouse/item?contractId=2
响应参数¶
1)数据格式
{
"code": 0,
"message": "success",
"data": {
"contractId": 2,
"contractFolderId": 1,
"contractName": "LibSafeMathForUint256Utils",
"contractDesc": "LibSafeMathForUint256Utils",
"contractSrc": "LyoKICogQ29weXJpZ2h0IDIwMTQtMjAxOSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKiAqLwoKcHJhZ21hIHNvbGlkaXR5IF4wLjQuMjU7CgpsaWJyYXJ5IExpYlNhZmVNYXRoRm9yVWludDI1NlV0aWxzIHsKCiAgICBmdW5jdGlvbiBhZGQodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHVpbnQyNTYgYyA9IGEgKyBiOwogICAgICAgIHJlcXVpcmUoYyA+PSBhLCAiU2FmZU1hdGhGb3JVaW50MjU2OiBhZGRpdGlvbiBvdmVyZmxvdyIpOwogICAgICAgIHJldHVybiBjOwogICAgfQoKICAgIGZ1bmN0aW9uIHN1Yih1aW50MjU2IGEsIHVpbnQyNTYgYikgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50MjU2KSB7CiAgICAgICAgcmVxdWlyZShiIDw9IGEsICJTYWZlTWF0aEZvclVpbnQyNTY6IHN1YnRyYWN0aW9uIG92ZXJmbG93Iik7CiAgICAgICAgdWludDI1NiBjID0gYSAtIGI7CiAgICAgICAgcmV0dXJuIGM7CiAgICB9CgogICAgZnVuY3Rpb24gbXVsKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICBpZiAoYSA9PSAwIHx8IGIgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHVpbnQyNTYgYyA9IGEgKiBiOwogICAgICAgIHJlcXVpcmUoYyAvIGEgPT0gYiwgIlNhZmVNYXRoRm9yVWludDI1NjogbXVsdGlwbGljYXRpb24gb3ZlcmZsb3ciKTsKICAgICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXYodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJlcXVpcmUoYiA+IDAsICJTYWZlTWF0aEZvclVpbnQyNTY6IGRpdmlzaW9uIGJ5IHplcm8iKTsKICAgICAgICB1aW50MjU2IGMgPSBhIC8gYjsKICAgICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBtb2QodWludDI1NiBhLCB1aW50MjU2IGIpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJlcXVpcmUoYiAhPSAwLCAiU2FmZU1hdGhGb3JVaW50MjU2OiBtb2R1bG8gYnkgemVybyIpOwogICAgICAgIHJldHVybiBhICUgYjsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3dlcih1aW50MjU2IGEsIHVpbnQyNTYgYikgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50MjU2KXsKCiAgICAgICAgaWYoYSA9PSAwKSByZXR1cm4gMDsKICAgICAgICBpZihiID09IDApIHJldHVybiAxOwoKICAgICAgICB1aW50MjU2IGMgPSAxOwogICAgICAgIGZvcih1aW50MjU2IGkgPSAwOyBpIDwgYjsgaSsrKXsKICAgICAgICAgICAgYyA9IG11bChjLCBhKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbWF4KHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gYSA+PSBiID8gYSA6IGI7CiAgICB9CgogICAgZnVuY3Rpb24gbWluKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKICAgIH0KCiAgICBmdW5jdGlvbiBhdmVyYWdlKHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gKGEgLyAyKSArIChiIC8gMikgKyAoKGEgJSAyICsgYiAlIDIpIC8gMik7CiAgICB9Cn0K",
"contractDescEn": "LibSafeMathForUint256Utils",
"createTime": "2021-01-20 18:02:10",
"modifyTime": "2021-01-20 18:02:10"
}
}
5.22. 查询合约管理者列表¶
根据群组ID和合约地址,返回在WeBASE拥有私钥的合约部署者或链委员(若链委员非空)私钥用户
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/contract/listManager/{groupId}/{contractAddress}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2 | contractAddress | String | 否 | 合约地址 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/contract/listManager/group/0xab9F30F9827e1C16Bf62d557c3626AeAd9E85502
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 是 | 用户列表 |
4.1 | Object | 用户信息对象 | ||
4.1.1 | userId | int | 否 | 用户编号 |
4.1.2 | userName | string | 否 | 用户名称 |
4.1.3 | groupId | int | 否 | 所属群组编号 |
4.1.4 | description | String | 是 | 备注 |
4.1.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
4.1.6 | publicKey | String | 否 | 公钥信息 |
4.1.7 | address | String | 是 | 在链上位置的hash |
4.1.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
4.1.9 | account | string | 否 | 关联账户 |
4.1.10 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.12 | signUserId | String | 否 | 用户在WeBASE-Sign中的编号 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userId": 700003,
"userName": "new_test",
"account": "test",
"groupId": "group",
"publicKey": "04b27022e80712f4def30d008a390cbe3503100ef54236bea3d4ca9a7fe95c8aafc2a401dd344605fa8d6b52533b289e8af9a75b992ac006a6a0ec8c0ef0b300eb",
"privateKey": null,
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0x9097678eb34daeebb6e3528ed4f8715cdc5e4c09",
"signUserId": "05281cdc3c894a2da852af6b2ad3d919",
"appId": "group",
"hasPk": 1,
"description": "",
"createTime": "2021-11-30 16:18:03",
"modifyTime": "2021-11-30 16:18:03"
}
],
"attachment": null
}
- 失败:
{
"code": 202542,
"message": "No private key of contract manager address in webase"
}
6 服务器监控相关¶
6.1 发送测试邮件¶
使用当前的邮件服务配置,向指定的邮箱地址发送测试邮件,如果配置错误将发送失败;
注:需要确保配置正确才能使用后续的邮件告警功能;返回成功信息后,需要用户到自己的邮箱查看是否收到邮测试邮件;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/mail/test/{toMailAddress}
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | {toMailAddress} | String | 是 | 接收测试邮件的邮箱地址 |
2 | host | String | 否 | 邮件服务的地址 |
3 | port | int | 是否 | 邮件服务使用的端口,默认25 |
4 | protocol | String | 否 | 邮件服务的协议类型,默认使用smtp |
5 | defaultEncoding | String | 否 | 邮件服务的邮件编码格式,默认为UTF-8编码 |
6 | username | String | 是 | 邮件服务的用户邮箱地址,authentication开启时为必填 |
7 | password | String | 是 | 邮件服务的用户邮箱授权码,authentication开启时为必填 |
8 | authentication | int | 是 | 开启鉴权验证,默认开启(使用username/password验证)0-关闭,1-开启 |
9 | starttlsEnable | int | 否 | 开启优先使用STARTTLS,默认开启 0-关闭,1-开启 |
10 | starttlsRequired | int | 否 | 开启必须使用STARTTLS,默认关闭,开启时需要配置socketFactoryPort, socketFactoryClass, socketFactoryFallback 0-关闭,1-开启 |
11 | socketFactoryPort | String | 否 | TLS/SSL的Socket端口,默认465 |
12 | socketFactoryClass | String | 否 | TLS/SSL的Socket工厂类 |
13 | socketFactoryFallback | int | 否 | 开启Socket的Fallback函数,默认关闭 0-关闭,1-开启 |
14 | timeout | int | 否 | 读超时时间值,默认5000ms |
15 | connectionTimeout | int | 否 | 连接超时时间值,默认5000ms |
16 | writeTimeout | int | 否是 | 写超时时间值,默认5000ms |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/mail/test/yourmail@qq.com
{
"host": "smtp.qq.com",
"port": 25,
"username": "yourmail@qq.com",
"password": "yourpassword",
"protocol": "smtp",
"defaultEncoding": "UTF-8",
"authentication": 1,
"starttlsEnable": 1,
"starttlsRequired": 0,
"socketFactoryPort": 465,
"socketFactoryClass": "javax.net.ssl.SSLSocketFactory",
"socketFactoryFallback": 0,
"timeout": 5000,
"connectionTimeout": 5000,
"writeTimeout": 5000
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 错误时返回错误原因 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null
}
- 失败:
{
"code": 202080,
"message": "Send mail error, please check mail server configuration.",
"data": "Failed messages: javax.mail.SendFailedException: No recipient addresses"
}
6.2 获取告警类型配置¶
获取单个告警配置的内容;告警类型配置是对不同告警类型下的不同内容,包含告警邮件标题ruleName
,告警邮件内容alertContent
,告警邮件发送时间间隔alertIntervalSeconds
,上次告警时间lastAlertTime
,目标告警邮箱地址列表userList
,是否启用该类型的邮件告警enable
,告警等级alertLevel
等;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/{ruleId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | ruleId | Int | 是 | 告警配置的编号 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 成功时返回 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | ruleId | Int | 否 | 告警类型配置的编号 |
3.1.2 | ruleName | String | 否 | 告警类型的名字/告警邮件标题 |
3.1.3 | enable | Int | 否 | 是否开启该告警:0-关闭,1-开启 |
3.1.4 | alertType | Int | 否 | 告警类型:1-节点状态告警,2-审计告警,3-证书有效期 |
3.1.5 | alertLevel | Int | 否 | 告警等级:1-高,2-中,3-低 |
3.1.6 | alertIntervalSeconds | Long | 否 | 告警邮件发送时间间隔 |
3.1.7 | alertContent | String | 否 | 告警邮件内容,其中包含{}括起来的变量 |
3.1.8 | contentParamList | String | 否 | 告警邮件内容中变量的列表,由List<String> 序列化为String |
3.1.9 | description | String | 否 | 告警描述 |
3.1.10 | userList | Int | 否 | 目标告警邮箱地址列表,由List<String> 序列化为String |
3.1.11 | lastAlertTime | LocalDateTime | 否 | 上次告警时间 |
3.1.12 | isAllUser | Int | 否 | 发送给所有用户:0-关闭,1-开启 |
3.1.13 | createTime | LocalDateTime | 否 | 创建时间 |
3.1.14 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ruleId": 1,
"ruleName": "节点异常告警",
"enable": 0,
"alertType": 1,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "{nodeId}节点异常,请到\"节点管理\"页面查看具体信息",
"contentParamList": "[\"{nodeId}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
}
6.3 获取全部告警类型配置列表¶
返回所有的告警类型配置
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
- | - | - | - | - |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/list
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | ruleId | Int | 否 | 告警类型配置的编号 |
3.1.2 | ruleName | String | 否 | 告警类型的名字/告警邮件标题 |
3.1.3 | enable | Int | 否 | 是否开启该告警:0-关闭,1-开启 |
3.1.4 | alertType | Int | 否 | 告警类型:1-节点状态告警,2-审计告警,3-证书有效期 |
3.1.5 | alertLevel | Int | 否 | 告警等级:1-高,2-中,3-低 |
3.1.6 | alertIntervalSeconds | Long | 否 | 告警邮件发送时间间隔 |
3.1.7 | alertContent | String | 否 | 告警邮件内容,其中包含{}括起来的变量 |
3.1.8 | contentParamList | String | 否 | 告警邮件内容中变量的列表,由List<String> 序列化为String |
3.1.9 | description | String | 否 | 告警描述 |
3.1.10 | userList | Int | 否 | 目标告警邮箱地址列表,由List<String> 序列化为String |
3.1.11 | lastAlertTime | LocalDateTime | 否 | 上次告警时间 |
3.1.12 | isAllUser | Int | 否 | 发送给所有用户:0-关闭,1-开启 |
3.1.13 | createTime | LocalDateTime | 否 | 创建时间 |
3.1.14 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"ruleId": 1,
"ruleName": "节点异常告警",
"enable": 0,
"alertType": 1,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "{nodeId}节点异常,请到\"节点管理\"页面查看具体信息",
"contentParamList": "[\"{nodeId}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
},
{
"ruleId": 2,
"ruleName": "审计异常",
"enable": 0,
"alertType": 2,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "审计异常:{auditType},请到\"交易审计\"页面查看具体信息",
"contentParamList": "[\"{auditType}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
},
{
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 0,
"alertType": 3,
"alertLevel": 1,
"alertIntervalSeconds": 3600,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"contentParamList": "[\"{time}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-10-29 20:02:30",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
]
}
6.4 更新告警类型配置¶
更新告警类型配置的内容;目前仅支持更新原有的三个邮件告警的配置,不支持新增配置;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | ruleId | int | 是 | 告警类型配置编号 |
2 | ruleName | String | 否 | 告警邮件的标题 |
3 | enable | int | 是 | 是否启用该类型的告警:0-关闭,1-开启 |
4 | alertType | int | 否 | 告警类型:1-节点状态告警,2-审计告警,3-证书有效期告警 |
6 | alertIntervalSeconds | int | 否 | 告警邮件的发送间隔时间(秒),默认3600s |
7 | alertContent | String | 否 | 告警邮件的内容,其中大括号{} 及里面的英文变量不可去除 |
8 | userList | String | 是 | 接收告警邮件的邮箱列表,以List<String> 序列化得到的字符串 |
9 | alertLevel | Int | 否 | 告警等级:1-高,2-中,3-低 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/mailServer/config
{
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 0,
"alertType": 3,
"alertIntervalSeconds": 1800,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"userList": "[\"targetmail@qq.com\"]",
"alertLevel": 1
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回邮件服务配置的具体内容 |
3.1 | Object | 否 | 参数含义参考上文GET接口出参表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 0,
"alertType": 3,
"alertLevel": 1,
"alertIntervalSeconds": 1800,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"contentParamList": "[\"{time}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-11-07 10:35:03",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6.5 开启/关闭 告警类型¶
修改告警类型配置中的enable
,0-关闭,1-开启;
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /alert/toggle
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | ruleId | int | 是 | 告警类型配置编号 |
2 | enable | int | 是 | 是否启用该类型的告警:0-关闭,1-开启 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/alert/toggle
{
"ruleId": 3,
"enable": 1
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回邮件服务配置的具体内容 |
3.1 | Object | 否 | 参数含义参考上文GET接口出参表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ruleId": 3,
"ruleName": "证书有效期告警",
"enable": 1,
"alertType": 3,
"alertLevel": 1,
"alertIntervalSeconds": 1800,
"alertContent": "证书将在{time}过期,请到\"证书管理\"页面查看具体信息",
"contentParamList": "[\"{time}\"]",
"description": null,
"createTime": "2019-10-29 20:02:30",
"modifyTime": "2019-11-07 10:35:03",
"isAllUser": 0,
"userList": "[\"targetmail@qq.com\"]",
"lastAlertTime": null
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
6.6 获取出块监控信息¶
获取出块周期、块大小、平均TPS的监控数据
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/stat?groupId={groupId}&beginDate={beginDate}&endDate={endDate}&contrastBeginDate={contrastBeginDate}&contrastEndDate={contrastEndDate}&gap={gap}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | nodeId | int | 是 | 群组id |
2 | beginDate | long | 是 | 显示时间(开始) 时间戳 |
3 | endDate | long | 是 | 显示时间(结束)时间戳 |
4 | contrastBeginDate | long | 否 | 对比时间(开始)时间戳 |
5 | contrastEndDate | long | 否 | 对比时间(结束)时间戳 |
6 | gap | Int | 否 | 数据粒度,默认是1 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/stat?groupId=1&gap=60eginDate=1617811200000&endDate=1617871955000&contrastBeginDate=&contrastEndDate=
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | int | 否 | 返回码 |
2 | message | String | 否 | 描述信息 |
3 | data | Array | 否 | 返回信息列表 |
3.1 | Object | 返回信息实体 | ||
3.1.1 | metricType | String | 否 | 测量类型:blockSize, blockCycle, tps |
3.1.2 | data | Object | 否 | |
3.1.2.1 | lineDataList | Object | 否 | |
3.1.2.1.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.1.2 | valueList | List\<Integer> | 否 | 值列表 |
3.1.2.2 | contrastDataList | Object | 否 | |
3.1.2.2.1 | timestampList | List\<String> | 否 | 时间戳列表 |
3.1.2.2.2 | valueList | List\<Integer> | 否 | 值列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"metricType": "blockSize",
"data": {
"lineDataList": {
"timestampList": [1617866162706, 1617866462706, 1617866762706, 1617867062706, 1617867362706, 1617867662706, 1617867962706, 1617868262706, 1617868562706, 1617868862706, 1617869162706, 1617869462706, 1617869762706, 1617870062706, 1617870362706, 1617870664184, 1617870964184],
"valueList": [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
},
"contrastDataList": {
"timestampList": [],
"valueList": []
}
}
}, {
"metricType": "blockCycle",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}, {
"metricType": "tps",
"data": {
"lineDataList": {
"timestampList": null,
"valueList": [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
},
"contrastDataList": {
"timestampList": null,
"valueList": []
}
}
}],
"attachment": null
}
7 审计相关模块¶
7.1 获取用户交易监管信息列表¶
7.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/monitor/userList/{groupId}
- 请求方式:GET
- 返回格式:JSON
7.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 所属群组编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/userList/300001
7.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 是 | 信息列表 |
3.1 | Object | 是 | 监管信息对象 | |
3.1.1 | userName | String | 是 | 用户名称 |
3.1.2 | userType | Int | 是 | 用户类型(0-正常,1-异常) |
3.1.3 | groupId | Int | 是 | 所属群组 |
3.1.4 | contractName | String | 是 | 合约名称 |
3.1.5 | contractAddress | String | 是 | 合约地址 |
3.1.6 | interfaceName | String | 是 | 合约接口名 |
3.1.7 | transType | Int | 是 | 交易类型(0-合约部署,1-接口调用) |
3.1.8 | transUnusualType | Int | 是 | 交易异常类型 (0-正常,1-异常合约,2-异常接口) |
3.1.9 | transCount | Int | 是 | 交易量 |
3.1.10 | transHashs | String | 是 | 交易hashs(最多5个) |
3.1.11 | transHashLastest | String | 是 | 最新交易hash |
3.1.12 | createTime | LocalDateTime | 是 | 落库时间 |
3.1.13 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userName": "SYSTEMUSER",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
},
{
"userName": "asdf",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
7.2 获取合约方法监管信息列表¶
7.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/monitor/interfaceList/{groupId}?userName={userName}
- 请求方式:GET
- 返回格式:JSON
7.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | userName | String | 否 | 用户名 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/interfaceList/300001
7.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 是 | 信息列表 |
3.1 | Object | 是 | 监管信息对象 | |
3.1.1 | userName | String | 是 | 用户名称 |
3.1.2 | userType | Int | 是 | 用户类型(0-正常,1-异常) |
3.1.3 | groupId | Int | 是 | 所属群组 |
3.1.4 | contractName | String | 是 | 合约名称 |
3.1.5 | contractAddress | String | 是 | 合约地址 |
3.1.6 | interfaceName | String | 是 | 合约接口名 |
3.1.7 | transType | Int | 是 | 交易类型(0-合约部署,1-接口调用) |
3.1.8 | transUnusualType | Int | 是 | 交易异常类型 (0-正常,1-异常合约,2-异常接口) |
3.1.9 | transCount | Int | 是 | 交易量 |
3.1.10 | transHashs | String | 是 | 交易hashs(最多5个) |
3.1.11 | transHashLastest | String | 是 | 最新交易hash |
3.1.12 | createTime | LocalDateTime | 是 | 落库时间 |
3.1.13 | modifyTime | LocalDateTime | 是 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userName": "SYSTEMUSER",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
},
{
"userName": "asdf",
"userType": 0,
"groupId": null,
"contractName": null,
"contractAddress": null,
"interfaceName": null,
"transType": null,
"transUnusualType": null,
"transCount": null,
"transHashs": null,
"transHashLastest": null,
"createTime": null,
"modifyTime": null
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
7.3 获取交易hash监管信息列表¶
7.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /monitor/transList/{groupId}
- 请求方式:GET
- 返回格式:JSON
7.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | userName | String | 否 | 用户名 |
3 | startDate | String | 是 | 开始时间 |
4 | endDate | String | 是 | 结束时间 |
5 | interfaceName | String | 否 | 接口名称 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/transList/300001?userName=0x5d97f8d41638a7b1b669b70b307bab6d49df8e2c&interfaceName=0x4ed3885e
7.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 否 | 返回结果实体 |
3.1 | groupId | String | 否 | 所属群组编号 |
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 | stirng | 是 | 所属群组编号 |
2 | userName | String | 否 | 用户名 |
3 | pageNumber | int | 是 | 当前页码 |
4 | pageSize | int | 是 | 页面大小 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/unusualUserList/300001/1/10?userName=
7.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 返回信息列表 |
4.1 | object | 是 | 返回信息实体 | |
4.1.1 | userName | String | 是 | 用户名 |
4.1.2 | transCount | int | 是 | 交易数 |
4.1.3 | hashs | String | 是 | 交易hash |
4.1.4 | time | LocalDateTime | 是 | 时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"userName": "0x08b52f85638a925929cf62a3ac77c67415012c24",
"transCount": 1,
"hashs": "0x43b50faa3f007c22cf5dd710c3561c5cde516e01a55b5b4acffd7d94cf61fc57",
"time": "2019-03-13 22:28:29"
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
7.5 获取异常合约信息列表¶
7.5.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/unusualContractList/{groupId}/{pageNumber}/{pageSize}?contractAddress={contractAddress}
- 请求方式:GET
- 返回格式:JSON
7.5.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组编号 |
2 | contractAddress | String | 否 | 合约地址 |
3 | pageNumber | int | 是 | 当前页码 |
4 | pageSize | int | 是 | 页面大小 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/monitor/unusualContractList/300001/1/10?contractAddress=
7.5.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 返回信息列表 |
4.1 | object | 是 | 返回信息实体 | |
4.1.1 | contractName | String | 是 | 合约名称 |
4.1.2 | contractAddress | String | 是 | 合约地址 |
4.1.3 | transCount | int | 是 | 交易数 |
4.1.4 | hashs | String | 是 | 交易hash |
4.1.5 | time | LocalDateTime | 是 | 时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"contractName": "0x00000000",
"contractAddress": "0x0000000000000000000000000000000000000000",
"transCount": 3,
"hashs": "0xc87e306db85740895369cc2a849984fe544a6e9b0ecdbd2d898fc0756a02a4ce",
"time": "2019-03-13 15:41:56"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8 群组信息模块¶
8.1 获取群组概况¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/general/{groupId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 群组id |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/general/group
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 否 | 返回信息实体 |
3.1 | groupId | string | 否 | 群组id |
3.2 | nodeCount | int | 否 | 节点数量 |
3.3 | contractCount | int | 否 | 已部署智能合约数量 |
3.4 | transactionCount | int | 否 | 交易数量 |
3.5 | latestBlock | int | 否 | 当前块高 |
3.6 | orgCount | int | 否 | 组织数量 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"groupId": "group",
"orgCount": 0,
"nodeCount": 2,
"contractCount": 51,
"transactionCount": 249,
"latestBlock": 249
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.2 获取所有群组列表¶
默认只返回groupStatus为1的群组ID,可传入groupStatus筛选群组 (1-normal, 2-maintaining, 3-conflict-genesisi, 4-conflict-data)
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/all
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
无
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/all
http://127.0.0.1:5001/WeBASE-Node-Manager/group/all/{groupStatus}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Integer | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 组织信息对象 | ||
4.1.1 | groupId | String | 否 | 群组编号 |
4.1.2 | groupName | String | 否 | 群组名称 |
4.1.3 | groupStatus | Integer | 否 | 群组状态:1-正常, 2-维护中, 3-脏数据, 4-创世块冲突 |
4.1.4 | nodeCount | Integer | 否 | 群组节点数 |
4.1.5 | latestBlock | BigInteger | 否 | 最新块高 |
4.1.6 | transCount | BigInteger | 否 | 交易量 |
4.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.9 | description | String | 否 | 群组描述 |
4.1.10 | groupType | Integer | 否 | 群组类别:1-同步,2-动态创建 |
4.1.11 | encryptType | Integer | 否 | 加密类型 |
4.1.12 | groupTimestamp | String | 否 | 群组时间戳 |
4.1.13 | nodeIdList | String | 否 | 节点ID列表 |
4.1.14 | chainId | Integer | 否 | 链ID |
4.1.15 | chainName | String | 否 | 链名称 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"groupId": "group",
"groupName": "group",
"groupStatus": 1,
"nodeCount": 2,
"latestBlock": 0,
"transCount": 0,
"createTime": "2021-12-06 11:21:55",
"modifyTime": "2021-12-06 17:12:06",
"description": "synchronous",
"groupType": 1,
"encryptType": 0,
"groupTimestamp": null,
"nodeIdList": null,
"chainId": 0,
"chainName": ""
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.3 查询每日交易数据¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/transDaily/{groupId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 群组id |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/transDaily/group
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | list | 否 | 返回信息列表 |
3.1 | object | 返回信息实体 | ||
4.1 | day | string | 否 | 日期YYYY-MM-DD |
4.2 | groupId | String | 否 | 群组编号 |
4.3 | transCount | int | 否 | 交易数量 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"day": "2021-11-29",
"groupId": "group",
"transCount": 75
},
...
],
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.4 刷新群组列表¶
刷新节点管理服务的群组列表,检查本地群组数据与链上群组数据是否有冲突,检查多个节点之间的创世块是否一致,并从链上拉取最新的群组列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/update
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | - | - | - | - |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/update
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | list | 否 | 返回信息列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {}
}
8.5 获取所有群组列表(包含异常群组)¶
返回所有群组,包含正常运行、维护中、脏数据冲突、创世块冲突4种状态的群组
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/all/invalidIncluded
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表 | 序号 | 输入参数 | 类型 | 必填 | 备注 | |——|————-|—————|——–|——————————-| | 1 | pageSize | Integer | 是 | 每页记录数 | | 2 | pageNumber | Integer | 是 | 当前页码 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/all/invalidIncluded/{pageNumber}/{pageSize}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Integer | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 组织信息对象 | ||
4.1.1 | groupId | Integer | 否 | 群组编号 |
4.1.2 | groupName | String | 否 | 群组名称 |
4.1.3 | groupStatus | Integer | 否 | 群组状态:1-正常, 2-维护中, 3-脏数据, 4-创世块冲突 |
4.1.4 | nodeCount | Integer | 否 | 群组节点数 |
4.1.5 | latestBlock | BigInteger | 否 | 最新块高 |
4.1.6 | transCount | BigInteger | 否 | 交易量 |
4.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
4.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
4.1.9 | description | String | 否 | 群组描述 |
4.1.10 | groupType | Integer | 否 | 群组类别:1-同步,2-动态创建 |
4.1.11 | encryptType | Integer | 否 | 加密类型 |
4.1.12 | groupTimestamp | String | 否 | 群组时间戳 |
4.1.13 | nodeIdList | String | 否 | 节点Id列表 |
4.1.14 | chainId | Integer | 否 | 链Id |
4.1.15 | chainName | String | 否 | 链名称 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"groupId": "group",
"groupName": "group",
"groupStatus": 1,
"nodeCount": 2,
"latestBlock": 0,
"transCount": 0,
"createTime": "2021-12-06 11:21:55",
"modifyTime": "2021-12-06 17:12:06",
"description": "synchronous",
"groupType": 1,
"encryptType": 0,
"groupTimestamp": null,
"nodeIdList": null,
"chainId": 0,
"chainName": ""
}
],
"totalCount": 1
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
8.6 删除群组所有数据¶
删除指定群组编号的群组的所有数据,包含节点数据、交易数据、交易审计数据等等。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/{groupId}
- 请求方式:DELETE
- 返回格式:JSON
请求参数¶
1)入参表 | 序号 | 输入参数 | 类型 | 必填 | 备注 | |——|————-|—————|——–|——————————-| | 1 | groupId | String | 是 | 群组编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/{groupId}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | |||
4 | attachment |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": null,
"attachment": null
}
- 失败:
{
"code": 202006,
"message": "invalid group id"
}
8.7 配置群组备注信息¶
配置群组的备注信息,用于数据大屏中大标题的展示。(默认备注为”synchronous”)
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/description
- 请求方式:PUT
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组ID |
1 | description | String | 否 | 群组备注 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/description
{ “description”: “溯源存证应用”, “groupId”: “group” }
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 1,
"attachment": null
}
8.8 获取单个群组详细信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/group/detail/{groupId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 群组ID |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/group/detail/{groupId}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 组织列表 |
3.1 | Object | 组织信息对象 | ||
3.1.1 | groupId | String | 否 | 群组编号 |
3.1.2 | groupName | String | 否 | 群组名称 |
3.1.3 | groupStatus | Integer | 否 | 群组状态:1-正常, 2-维护中, 3-脏数据, 3-创世块冲突 |
3.1.4 | nodeCount | Integer | 否 | 群组节点数 |
3.1.5 | latestBlock | BigInteger | 否 | 最新块高 |
3.1.6 | transCount | BigInteger | 否 | 交易量 |
3.1.7 | createTime | LocalDateTime | 否 | 落库时间 |
3.1.8 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.1.9 | description | String | 否 | 群组描述 |
3.1.10 | groupType | Integer | 否 | 群组类别:1-同步,2-动态创建 |
3.1.11 | groupTimestamp | String | 否 | 群组时间戳 |
3.1.12 | nodeIdList | String | 否 | 节点Id列表 |
3.1.13 | chainId | Integer | 否 | 链Id |
3.1.14 | chainName | String | 否 | 链名称 |
3.1.15 | encryptType | Integer | 否 | 加密类型 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"groupId": 1,
"groupName": "group1",
"groupStatus": 1,
"nodeCount": 4,
"latestBlock": 0,
"transCount": 0,
"createTime": "2021-07-29 14:44:59",
"modifyTime": "2021-09-29 16:42:05",
"description": "溯源存证应用",
"groupType": 1,
"groupTimestamp": null,
"nodeIdList": null,
"chainId": 0,
"chainName": "default",
"encryptType": 0
},
"attachment": null
}
9 节点管理模块¶
9.1 查询节点列表¶
查询WeBASE本地保存的节点列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/nodeList/{groupId}/{pageNumber}/{pageSize}?nodeName={nodeName}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2 | pageSize | Int | 是 | 每页记录数 |
3 | pageNumber | Int | 是 | 当前页码 |
4 | nodeName | String | 否 | 节点名称 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/node/nodeList/300001/1/10?nodeName=
返回参数¶
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 | 否 | 修改时间 |
4.1.12 | city | String | 否 | 节点所在城市 |
4.1.13 | agency | String | 否 | 节点所属机构 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 1,
"data": [
{
"nodeId": "06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"nodeName": "1_06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97",
"groupId": 1,
"nodeIp": "127.0.0.1",
"p2pPort": null,
"description": null,
"blockNumber": 589,
"pbftView": 11,
"nodeActive": 1,
"createTime": "2021-07-29 14:44:59",
"modifyTime": "2021-09-29 16:17:38",
"city": "430500",
"agency": "GZ"
},
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
9.2 查询节点信息¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/nodeInfo/{groupId}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/node/nodeInfo/1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 节点信息对象 | |
3.1 | nodeId | int | 否 | 节点编号 |
3.2 | nodeName | string | 否 | 节点名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | nodeActive | int | 否 | 状态 |
3.5 | nodeIp | string | 否 | 节点ip |
3.6 | P2pPort | int | 否 | 节点p2p端口 |
3.7 | description | String | 否 | 备注 |
3.8 | blockNumber | BigInteger | 否 | 节点块高 |
3.9 | pbftView | BigInteger | 否 | Pbft view |
3.10 | createTime | LocalDateTime | 否 | 落库时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.12 | city | String | 否 | 节点所在城市 |
3.13 | agency | String | 否 | 节点所属机构 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"nodeId": "06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f",
"nodeName": "1_06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97",
"groupId": "group",
"nodeIp": "127.0.0.1",
"p2pPort": null,
"description": null,
"blockNumber": 589,
"pbftView": 11,
"nodeActive": 1,
"createTime": "2021-07-29 14:44:59",
"modifyTime": "2021-09-29 16:17:38",
"city": "430500",
"agency": "GZ"
},
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
9.3 查询群组下的节点ID列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/nodeIdList/{groupId}/{pageNumber}/{pageSize}
- 请求方式:GET
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 群组id |
2 | pageNumber | int | 是 | |
3 | pageSize | int | 是 | |
4 | nodeName | string | 是 |
2)入参示例
**
http://127.0.0.1:5001/WeBASE-Node-Manager/node/nodeIdList/group
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List |
是 | 节点ID列表 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
"fe57d7b39ed104b4fb2770ae5aad7946bfd377d0eb91ab92a383447e834c3257dec56686551d08178f2d5f40d9fad615293e46c9f5fc23cf187258e121213b1d",
"65bc44d398d99d95a9d404aa16e4bfbc2f9ebb40f20439ddef8575a139dc3a80310cfc98a035bd59a67cc5f659f519e3e99b855f3d27f21a889c23a14036d0c7",
"95efafa5197796e7edf647191de83f4259d7cbb060f4bac5868be474037f49144d581c15d8aef9b07d78f18041a5f43c3c26352ebbf5583cd23070358c8fba39",
"06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f"
],
"attachment": null
}
9.4 配置节点备注信息¶
可配置节点的IP、机构、城市信息,可用于数据监控大屏展示
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/description
- 请求方式:PUT
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | nodeId | String | 是 | 节点ID |
2 | nodeIp | String | 否 | 节点备注IP |
3 | agency | String | 否 | 节点备注机构名 |
4 | city | String | 否 | 节点备注城市 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/node/description
{ “agency”: “org1”, “city”: “GZ”, “nodeId”: “06269e130f8220ebaa78e67832df0de6b4c5ee3f1b14e64ab2bae26510a4bcf997454b35067c1685d4343e6ad84b45c3b8690a858f2831a9247a97a27166ce1f”, “nodeIp”: “127.0.0.1” }
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
9.5 查询节点的城市列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/node/city/list
- 请求方式:GET
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 是 | |
3.1 | city | String | 是 | 城市名 |
3.2 | count | Int | 是 | 节点数 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"city": "110100", // 此处为城市ID
"count": 2
},
{
"city": "430500",
"count": 1
},
{
"city": "440300",
"count": 1
}
],
"attachment": null
}
10 角色管理模块¶
10.1 查询角色列表¶
10.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:role/roleList
- 请求方式:GET
- 返回格式:JSON
10.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | roleId | int | 是 | 角色id |
2 | roleName | String | 否 | 角色名称 |
3 | pageSize | int | 是 | 每页记录数 |
4 | pageNumber | int | 是 | 当前页码 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/role/roleList?groupId=300001&pageNumber=&pageSize=&roleId=&roleName=
10.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | totalCount | Int | 否 | 总记录数 |
4 | data | List | 否 | 组织列表 |
4.1 | Object | 组织信息对象 | ||
4.1.1 | roleId | Int | 否 | 角色编号 |
4.1.2 | roleName | String | 否 | 角色名称 |
4.1.3 | roleNameZh | String | 否 | 角色中文名称 |
4.1.4 | roleStatus | Int | 否 | 状态(1-正常2-无效) 默认1 |
4.1.5 | description | String | 否 | 备注 |
4.1.6 | createTime | LocalDateTime | 否 | 创建时间 |
4.1.7 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"totalCount": 2,
"data": [
{
"roleId": 100000,
"roleName": "admin",
"roleNameZh": "管理员",
"roleStatus": 1,
"description": null,
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-02-14 17:33:50"
},
{
"roleId": 100001,
"roleName": "visitor",
"roleNameZh": "访客",
"roleStatus": 1,
"description": null,
"createTime": "2019-02-14 17:33:50",
"modifyTime": "2019-02-14 17:33:50"
}
]
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11 用户管理模块¶
11.1 新增私钥用户¶
11.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/userInfo
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
11.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | userName | string | 是 | 用户名称 |
2 | description | string | 否 | 备注 |
3 | groupId | String | 是 | 所属群组 |
4 | account | string | 是 | 关联账户 |
5 | userType | int | 是 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/userInfo
{
"account": "admin",
"description": "string",
"groupId": "group",
"userName": "frank",
"userType": 0
}
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 | String | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.12 | chainIndex | int | 否 | 链索引 |
3.13 | userType | int | 否 | 用户类型 |
3.14 | signUserId | String | 否 | 签名用户Id |
3.15 | appId | String | 否 | 应用Id |
3.16 | privateKey | String | 否 | 私钥信息 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700006,
"userName": "frank",
"account": "admin",
"groupId": "group",
"publicKey": "04aa23e6fcc6099c622d7cc9da0ab30019c6a349bfd71d69c83f7cf65a00a5ff9ed5e6fa0ab12c21cc46f0af0aed361a2854777b3b5cd2d13f6ade78bd41fe5b16",
"privateKey": null,
"userStatus": 1,
"chainIndex": null,
"userType": 0,
"address": "0xd24488a4d51661694f0c31f2cc688d1670f51d29",
"signUserId": "c5a76d781e124c7db7279af39819ed2f",
"appId": "group",
"hasPk": 1,
"description": "string",
"createTime": "2021-12-06 17:53:53",
"modifyTime": "2021-12-06 17:53:53"
},
"attachment": null
}
- 失败:
{
"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 | String | 是 | 所属群组 |
4 | account | string | 是 | 关联账户 |
5 | publicKey | String | 是 | |
6 | userType | int | 是 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/userInfo
{
"account": "admin",
"description": "string",
"groupId": "group",
"publicKey": "04aa23e6fcc6099c622d7cc9da0ab30019c6a349bfd71d69c83f7cf65a00a5ff9ed5e6fa0ab12c21cc46f0af0aed361a2854777b3b5cd2d13f6ade78bd41fe5b16",
"userName": "alex",
"userType": 0
}
11.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | string | 否 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700007,
"userName": "asdfvw",
"groupId": 300001,
"publicKey": "0x4189fdacff55fb99172e015e1adb96dc77b0cae1619b1a41cc360777bee6682fcc9752d8aabf144fbf610a3057fd4b5",
"userStatus": 1,
"userType": 1,
"address": "0x40ec3c20b5178401ae14ad8ce9c9f94fa5ebb86a",
"hasPk": 1,
"description": "sda",
"account": "admin",
"createTime": "2019-03-15 18:00:27",
"modifyTime": "2019-03-15 18:00:27"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11.3 修改用户备注¶
11.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/userInfo
- 请求方式:PUT
- 请求头:Content-type: application/json
- 返回格式:JSON
11.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | userId | int | 是 | 用户编号 |
2 | description | String | 否 | 备注 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/userInfo
{
"userId": "700006",
"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 | String | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | String | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.12 | chainIndex | int | 否 | |
3.13 | userType | int | 否 | 用户类型 |
3.14 | signUserId | String | 否 | 签名用户Id |
3.15 | appId | String | 否 | |
3.16 | privateKey | String | 否 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700006,
"userName": "frank",
"account": "admin",
"groupId": "group",
"publicKey": "04aa23e6fcc6099c622d7cc9da0ab30019c6a349bfd71d69c83f7cf65a00a5ff9ed5e6fa0ab12c21cc46f0af0aed361a2854777b3b5cd2d13f6ade78bd41fe5b16",
"privateKey": null,
"userStatus": 1,
"chainIndex": null,
"userType": 0,
"address": "0xd24488a4d51661694f0c31f2cc688d1670f51d29",
"signUserId": "c5a76d781e124c7db7279af39819ed2f",
"appId": "group",
"hasPk": 1,
"description": "string",
"createTime": "2021-12-06 17:53:53",
"modifyTime": "2021-12-06 19:13:17"
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
11.4 导入私钥用户¶
可在页面导入WeBASE-Front所导出的私钥txt文件
其中私钥字段用Base64加密
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/import
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | privateKey | string | 是 | Base64加密后的私钥内容 |
2 | userName | string | 是 | 用户名称 |
3 | description | string | 否 | 备注 |
4 | groupId | String | 是 | 所属群组 |
5 | account | string | 是 | 关联账户 |
6 | userId | int | 是 | 用户Id |
7 | userType | int | 是 | 用户类型 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/import
{
"privateKey": "OGFmNWIzMzNmYTc3MGFhY2UwNjdjYTY3ZDRmMzE4MzU4OWRmOThkMjVjYzEzZGFlMGJmODhkYjhlYzVhMDcxYw==",
"groupId": "group",
"description": "密钥拥有者",
"userName": "user1",
"account": "admin",
"userId": 0,
"userType": 0
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 201031,
"message": "privateKey decode fail",
"data": null
}
11.5 导入.pem私钥¶
可导入控制台所生成的私钥.pem文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/importPem
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | pemContent | string | 是 | pem文件的内容,必须以-----BEGIN PRIVATE KEY-----\n 开头,以\n-----END PRIVATE KEY-----\n 结尾的格式 |
2 | userName | string | 是 | 用户名称 |
3 | description | string | 否 | 备注 |
4 | groupId | String | 是 | 所属群组 |
5 | account | string | 是 | 关联账户 |
6 | userType | int | 是 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/importPem
{
"pemContent":"-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgC8TbvFSMA9y3CghFt51/\nXmExewlioX99veYHOV7dTvOhRANCAASZtMhCTcaedNP+H7iljbTIqXOFM6qm5aVs\nfM/yuDBK2MRfFbfnOYVTNKyOSnmkY+xBfCR8Q86wcsQm9NZpkmFK\n-----END PRIVATE KEY-----\n",
"groupId": "group",
"description": "密钥拥有者",
"userName": "user2",
"account": "admin",
"userType": 0
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": 201232,
"message": "Pem file format error, must surrounded by -----XXXXX PRIVATE KEY-----"",
"data": null
}
11.6 导入.p12私钥¶
可导入控制台生成的私钥.p12文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/importP12
- 请求方式:POST
- 请求头:Content-type: form-data
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | p12File | MultipartFile | 是 | .p12文件 |
2 | p12Password | string | 否 | 使用base64编码的密码;.p12文件的密码,缺省时默认为"",即空密码;p12无密码时,可传入空值或不传;不包含中文 |
3 | userName | string | 是 | 用户名称 |
4 | description | string | 否 | 备注 |
5 | groupId | String | 是 | 所属群组 |
6 | account | string | 是 | 关联账户 |
7 | roleId | int | 否 | 角色ID |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/importP12
使用form-data传参
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:(p12文件的密码错误)
{
"code": 201236,
"message": "p12's password not match",
"data": null
}
11.7 导出明文私钥¶
可在页面导出WeBASE-Front所导出的私钥txt文件
其中私钥字段用Base64加密
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/export/{userId}
- 请求方式:POST
- 请求头:Content-type: form-data
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | userId | int | 是 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/export/300001
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 否 | 用户编号 |
3.2 | userName | string | 否 | 用户名称 |
3.3 | groupId | String | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 否 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 否 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 否 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.12 | privateKey | String | 否 | 私钥,用base64编码 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"userId": 700003,
"userName": "frank",
"account": "admin",
"groupId": "group",
"publicKey": "04d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85aa9f34ffdc815e0d7a8b64537e17bd81579238c5dd9a86d526b051b13f4062327",
"privateKey": "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYw==",
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0xdbc23ae43a150ff8884b02cea117b22d1c3b9796",
"signUserId": "b751efc5d0cc4e12b90908b1f2670258",
"appId": "group",
"hasPk": 1,
"description": "",
"createTime": "2021-04-06 21:24:12",
"modifyTime": "2021-04-06 21:24:12"
},
"attachment": null
}
11.8 导出.pem私钥¶
导出pem格式的私钥文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/exportPem
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2 | signUserId | string | 是 | 用户的signUserId |
3 | p12Password | String | 否 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/exportPem
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
- | - | InputStream | 否 | 返回文件的二进制流 |
2)出参示例
- 成功:
-----BEGIN PRIVATE KEY-----
MIGNAgEAMBAGByqGSM49AgEGBSuBBAAKBHYwdAIBAQQgnAXS1DYA90nML3Kge4Qd
IgMXiQ9cojmRgyjo1BLYXOqgBwYFK4EEAAqhRANCAATLPOzgUzNbo6UeCAjYv2++
FwlBmT1Sa7goXELaazyJEJLbAlAFGB6qvjdA9m2nx5+rTmfGoSuQK9T2hC/vWJfq
-----END PRIVATE KEY-----
11.9 导出.p12私钥¶
导出pem格式的私钥文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/user/exportP12
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 群组id |
2 | signUserId | string | 是 | 用户的signUserId |
3 | p12Password | string | 是 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/user/exportP12
12 合约方法管理模块¶
12.1 新增合约方法¶
12.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/method/add
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
12.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 所属群组 |
2 | methodList | List | 是 | 方法列表 |
2.1 | Object | 是 | 方法实体 | |
2.1.1 | abiInfo | String | 是 | 合约abi信息 |
2.1.2 | methodId | String | 是 | 方法编号 |
2.1.3 | methodType | String | 是 | 方法类型 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/method/add
{
"groupId": "string",
"methodList": [
{
"abiInfo": "string",
"methodId": "string",
"methodType": "string"
}
]
}
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 | String | 是 | 所属群组 |
2 | methodId | String | 是 | 方法编号 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/method/findById/group/add
1.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 否 | 方法实体 | |
3.1 | abiInfo | String | 否 | 合约abi信息 |
3.2 | methodId | String | 否 | 方法编号 |
3.3 | methodType | String | 否 | 方法类型 |
3.4 | createTime | LocalDateTime | 否 | 创建时间 |
3.5 | modifyTime | LocalDateTime | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"methodId": "methodIasdfdttttt",
"groupId": 2,
"abiInfo": "fsdabiTestfd232222",
"methodType": "function",
"createTime": "2019-04-16 16:59:27",
"modifyTime": "2019-04-16 16:59:27"
}
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
13 系统管理模块¶
系统管理中的权限管理接口
- 使用FISCO BCOS v2.5.0 与 WeBASE-Node-Manager v1.4.1 (及)以上版本将使用预编译合约中的ChainGovernance接口(本章节接口13.14开始),详情可参考FISCO BCOS基于角色的权限控制
- 使用低于FISCO BCOS v2.5.0 与 WeBASE-Node-Manager v1.4.1版本,则使用接口13.1至13.4接口
13.1获取系统配置¶
根据群组id获取系统配置SystemConfig的list列表,目前只支持tx_count_limit, tx_gas_limit两个参数。
13.1.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /sys/config/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.1.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2 | pageSize | int | 是 | |
3 | pageNumber | int | 是 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/sys/config/list?groupId=1&pageSize=10&pageNumber=1
13.1.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | 数组 | 否 | list包含数据库存储的配置key与对应value |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 6,
"groupId": 1,
"fromAddress": "0x",
"configKey": "tx_gas_limit",
"configValue": "300000000"
},
{
"id": 5,
"groupId": 1,
"fromAddress": "0xd0b56b4ce0e8ce5e064f896d9ad1c16b2603f285",
"configKey": "tx_count_limit",
"configValue": "10002"
}
],
"totalCount": 2
}
13.2 设置系统配置¶
系统配置管理员设置系统配置,目前只支持tx_count_limit, tx_gas_limit两个参数。
13.2.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /sys/config
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.2.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2 | fromAddress | String | 是 | 管理员自己的地址 |
3 | configKey | String | 是 | 目前类型两种(tx_count_limit, tx_gas_limit,用户可自定义key如tx_gas_price |
4 | configValue | String | 是 | |
5 | signUserId | String | 是 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/sys/config
{
"groupId": "group",
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"configKey": "tx_count_limit",
"configValue": "1001",
"signUserId": "string"
}
13.2.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success"
}
- 失败:
{
"code": -50000,
"message": "permission denied"
}
13.3 获取节点列表(节点管理)¶
获取节点的list列表,包含节点id,节点共识状态。
注:接口返回所有的共识/观察节点(无论运行或停止),以及正在运行的游离节点
13.3.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/consensus/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
13.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组id |
2 | pageSize | int | 是 | |
3 | pageNumber | int | 是 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/consensus/list?groupId=1&pageSize=10&pageNumber=1
13.3.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"nodeId": "13e0f2b94cbce924cc3737385a38587939e809fb786c4fc34a6ba3ea97693bccfa173b352ac41f1dbb97e9e4910ccbec1df38ad4020cef3b2044e833188adad9",
"nodeType": "sealer"
},
{
"nodeId": "bce4b2269c25c2cdba30155396bfe90af08c3c08cff205213477683117e4243ebe26588479519e636a5d5d93545cab778435cacacc41993f28f58f60fa5ceb72",
"nodeType": "sealer"
},
{
"nodeId": "e815cc5637cb8c3274c83215c680822e4a0110d0a8315fcf03e43e8e3944edd758c8b173c4e0076f599aa1f853fa207d47cc95d201ae8d0206b71ad5aa8c3f59",
"nodeType": "sealer"
}
],
"totalCount": 3
}
13.4 设置节点共识状态接口(节点管理)¶
节点管理相关接口,可用于节点三种共识状态的切换。分别是共识节点sealer, 观察节点observer, 游离节点remove
13.4.1 传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /precompiled/consensus
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
13.4.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 否 | 群组id |
2 | fromAddress | String | 否 | 管理员的地址 |
3 | nodeType | String | 否 | 节点类型:observer,sealer,remove |
4 | nodeId | String | 否 | 节点id |
5 | signUserId | String | 是 | 签名用户ID |
6 | weight | int | 是 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/precompiled/consensus
{
"groupId": "group",
"fromAddress": "0xd5bba8fe456fce310f529edecef902e4b63129b1",
"nodeType": "remove",
"nodeId": "224e6ee23e8a02d371298b9aec828f77cc2711da3a981684896715a3711885a3177b3cf7906bf9d1b84e597fad1e0049511139332c04edfe3daddba5ed60cffa",
"signUserId": "string",
"weight": 0
}
13.4.3 返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 | |
2)出参示例
- 成功:
[
{
"code": 0,
"message": "success"
}
]
- 失败:
{
"code": -51000,
"message": "nodeId already exist"
}
14 证书管理模块¶
14.1 获取证书列表接口¶
获取证书的list列表,返回的列表包含证书指纹、证书内容、证书名字、证书的父证书、证书对应nodeid(节点证书)、证书有效期
注:首次启动项目会自动拉取每一个Front的证书
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert/list
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回证书相关信息的列表 |
3 | Object | 否 | 单个证书相关信息 | |
3.1 | fingerPrint | String | 否 | 证书的指纹 |
3.1 | certName | String | 否 | 证书名字 |
3.1 | content | String | 否 | 证书文件的内容 |
3.1 | certType | String | 否 | 证书类型:chain, agency, node, sdk等,国密版中node证书分为加密ennode证书与签名gmnode证书 |
3.1 | publicKey | String | 否 | 证书对应nodeid(仅限节点证书公钥) |
3.1 | address | String | 否 | 证书对应地址(仅限节点证书公钥) |
3.1 | father | String | 否 | 证书的父证书指纹 |
3.1 | validityFrom | Date | 否 | 证书有效期开始时间 |
3.1 | validityTo | Date | 否 | 证书有效期结束时间 |
3.1 | createTime | LocalDateTime | 否 | 导入创建时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"fingerPrint": "814D51FB7CBAB33676FE73E8FBBFECB3D3B1301A",
"certName": "sdk",
"content": "-----BEGIN CERTIFICATE-----\nMIICOTCCASGgAwIBAgIJAKHsAYI3TsAOMA0GCSqGSIb3DQEBCwUAMDgxEDAOBgNV\nBAMMB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5j\neTAeFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDIxDDAKBgNVBAMMA3Nk\nazETMBEGA1UECgwKZmlzY28tYmNvczENMAsGA1UECwwEbm9kZTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABJ79rSKIb97xZwByW58xH6tzoNKNLaKG7J5wxAEgAb03O2h4\nMkEMLtf/LB7tELOiyCiIEhLScprb1LjvDDt2RDGjGjAYMAkGA1UdEwQCMAAwCwYD\nVR0PBAQDAgXgMA0GCSqGSIb3DQEBCwUAA4IBAQC0u2lfclRmCszBTi2rtvMibZec\noalRC0sQPBPRb7UQhGCodxmsAT3dBUf+s4wLLrmN/cnNhq5HVObbWxzfu7gn3+IN\nyQEeqdbGdzlu1EDcaMgAz6p2W3+FG/tmx/yrNza29cYekWRL44OT5LOUPEKrJ4bJ\neOBRY4QlwZPFmM0QgP7DoKxHXldRopkmvqT4pbW51hWvPgj7KrdqwbVWzuWQuI3i\n3j3O96XZJsaDZ0+IGa5093+TsTNPfWUZzp5Kg+EyNR6Ea1evuMDNq9NAqqcd5bX9\nO9kgkb8+llO8I5ZhdnN0BuhGvv9wpsa9hW8BImOLzUBwfSVYouGCkoqlVq9X\n-----END CERTIFICATE-----\n",
"certType": "node",
"publicKey": "9efdad22886fdef16700725b9f311fab73a0d28d2da286ec9e70c4012001bd373b687832410c2ed7ff2c1eed10b3a2c828881212d2729adbd4b8ef0c3b764431",
"address": "5cb81b06ef0734fff99929c5deae4a5b25e800cc",
"father": "EEBAAB2F674D05CF1EAD70367B4D2A928D894EF8",
"validityFrom": 1562860800000,
"validityTo": 1878220800000,
"createTime": 1569686400000
}
],
"totalCount": 1
}
14.2 根据指纹获取证书接口¶
根据指纹获取单个证书
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | fingerPrint | String | 是 | 证书指纹,证书唯一标识 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/cert?fingerPrint=814D51FB7CBAB33676FE73E8FBBFECB3D3B1301A
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 成功时返回 |
3 | Object | 否 | 单个证书相关信息 | |
3.1 | fingerPrint | String | 否 | 证书的指纹 |
3.1 | certName | String | 否 | 证书名字 |
3.1 | content | String | 否 | 证书文件的内容 |
3.1 | certType | String | 否 | 证书类型:chain, agency, node, sdk等,国密版node证书分为加密ennode证书与签名gmnode证书 |
3.1 | publicKey | String | 否 | 证书对应nodeid(仅限节点证书公钥) |
3.1 | address | String | 否 | 证书对应地址(仅限节点证书公钥) |
3.1 | father | String | 否 | 证书的父证书指纹 |
3.1 | validityFrom | Date | 否 | 证书有效期开始时间 |
3.1 | validityTo | Date | 否 | 证书有效期结束时间 |
3.1 | createTime | LocalDateTime | 否 | 导入创建时间 |
2)出参示例
- 成功:’
{
"code": 0,
"message": "success",
"data": {
"fingerPrint": "EEBAAB2F674D05CF1EAD70367B4D2A928D894EF8",
"certName": "agencyA",
"content": "-----BEGIN CERTIFICATE-----\nMIIDADCCAeigAwIBAgIJAJUF2Dp1a9U6MA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNV\nBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAe\nFw0xOTA3MTIwMjA2MTZaFw0yOTA3MDkwMjA2MTZaMDgxEDAOBgNVBAMMB2FnZW5j\neUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBANBT4CTciIYdSeEabgJzif+CFB0y3GzG\ny+XQYtWK+TtdJWduXqhnnZiYAZs7OPGEu79Yx/bEpjEXsu2cXH0D6BHZk+wvuxG6\nezXWq5MYjCw3fQiSRWkDYoxzWgulkRyYROF1xoZeNGQssReFmCgP+pcQwRxjcq8z\nIA9iT61YxyW5nrS7xnra9uZq/EE3tsJ0ae3ax6zixCT66aV49S27cMcisS+XKP/q\nEVPxhO7SUjnzZY69MgZzNSFxCzIbapnlmYAOS26vIT0taSkoKXmIsYssga45XPwI\n7YBVCc/34kHzW9xrNjyyThMWOgDsuBqZN9xvapGSQ82Lsh7ObN0dZVUCAwEAAaMQ\nMA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAu3aHxJnCZnICpHbQ\nv1Lc5tiXtAYE9aEP5cxb/cO14xY8dS+t0wiLIvyrE2aTcgImzr4BYNBm1XDt5suc\nMpzha1oJytGv79M9/WnI/BKmgUqTaaXOV2Ux2yPX9SadNcsD9/IbrV0b/hlsPd6M\nK8w7ndowvBgopei+A1NQY6jTDUKif4RxD4u5HZFWUu7pByNLFaydU4qBKVkucXOq\nxmWoupL5XrDk5o490kiz/Zgufqtb4w6oUr3lrQASAbFB3lID/P1ipi0DwX7kZwVX\nECDLYvr+eX6GbTClzn0JGuzqV4OoRo1rrRv+0tp1aLZKpCYn0Lhf6s1iw/kCeM2O\nnP9l2Q==\n-----END CERTIFICATE-----\n",
"certType": "agency",
"publicKey": "",
"address": "",
"father": "",
"validityFrom": 1562860800000,
"validityTo": 1878220800000,
"createTime": 1569686400000
}
}
14.3 导入证书接口¶
导入保存证书文件
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
14.3.2 请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | content | String | 是 | 证书文件的内容,需保留开头与结尾以及证书原有的回车\n的格式文本;证书中包含多个证书亦可 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/cert
{
"content": "-----BEGIN CERTIFICATE-----\nMIICOzCCASOgAwIBAgIJANJZtoFLZsGcMA0GCSqGSIb3DQEBCwUAMDgxEDAOBgNVBAMMB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTAeFw0xOTA5MDUwNzQ3NDdaFw0yOTA5MDIwNzQ3NDdaMDQxDjAMBgNVBAMMBW5vZGUzMRMwEQYDVQQKDApmaXNjby1iY29zMQ0wCwYDVQQLDARub2RlMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE9CwTicQwi5Gx1gckJ0ibZbcIoL13IHyLK7z4xuzkAi+PbgI9M3vKDuMzZ73IFKCYOwzfhvqM8ksFonpBZqT0NqMaMBgwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQELBQADggEBAIv+PE8bQlxxVDxfUlevf3jJeaK97U5tmP8Tx1pesblzcMWTC8OxfUtYP0zy4CQL0zo6OjmSn4FYvTyDUSVqj5BXXDXiZQwtWxnPgLD75tqSTlFcR2jB+amhmzWQ7mXgfepvL+RV+1OL8WXJy7Xl01fL0nCwHaWCCwaBg+KnUgbc9YXhhyH8X8aqDDpjz9oYpZcbLITGI0V8lvr1EU3NII6LudgGp/xNolQDBOYZX1E0XtUwMUp6Az2xbmSH/7S3sXJCwgHZrtoiKkcFLbss1TDk/UdUya4n/dz4BcH3OzR2MvMHenA8kh4yaofJNsJeXFqPHAbI5+yUVK2+VK2hI0o=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDPTCCAiWgAwIBAgIJAKUGxOHHqV05MA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNVBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAeFw0xOTA5MDUwNzI2MTJaFw0yOTA5MDIwNzI2MTJaMDUxDjAMBgNVBAMMBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM9LlTwIAKp36uB8sjoai2O3R+3KPMN9xAt8/k5+B943CUPF/RDxZ8/7Q2v6Z+t+1v3Dc81aszMr/8YyyCQWh0I3EdWyInsocZ2pBkjymetyE5VOSd+p7I8qc9PpHJKZjy2M9J5bePVjHJxleHP2u6I4QctjZoE8PJnZYT5Q0On0MJATpY856vHbF3Amvxj9dmeLKjF62T/KtyDKlyPTETXOFGMiLerWusXZxFgj0K0xhuXaNkbJI6AdhQnywgn755ugfBDzi24rfsk/BkUf5DVitfWePh4C7zaCZIeTTr8whV3twE2BTv4LENdidxCVUHN1JBvZNGyHaH4gIbwtsZcCAwEAAaNQME4wHQYDVR0OBBYEFNTCWbm1EzCYIXyoF7j3l6IXX3BoMB8GA1UdIwQYMBaAFNTCWbm1EzCYIXyoF7j3l6IXX3BoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAIjYTyxP5ikaGYdwYzQZdF4aqx+7UL3Wo/6LNJa8w2m+pAvC3ILIBcvpDe6lH3cMOz2HwCzFkKlT8Ji1HwsKPywx/9fmO60RvEoPIBanziqONLb8HDUT0QHz3jgCTj46URM6hXIEhFwg4KekpzvqaLPRHHtoCrcebUAmySOlNvlwkSnxJnufp0zFpdNu+kSl1/r21ZRMeu/hNaUb1gOzP06NOB7NodOQ5MR7ItVXyN9rl3fABP3rUFIJ+Z11WmSldaCRCQMlEOkdD8LGFYVj4Q5fx06hcJlPd2arnxALWrZUl2cs+K+MW9qQUUKAQ+7FirdRRk6ZfZtlpHMdlTfAVWA=\n-----END CERTIFICATE-----\n"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 成功保存证书的个数或错误信息 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 2
}
- 失败:
{
"code": 202060,
"message": "cert handle error",
"data": "Could not parse certificate: java.io.IOException: Empty input"
}
14.4 删除证书接口¶
根据证书指纹删除一个证书
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert
- 请求方式:DELETE
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | fingerPrint | String | 是 | 证书指纹,证书的唯一标识 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/cert
{
"fingerPrint": "F588C511F5471860120F7BE8127DE026ADD8378C"
}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | String | 否 | 成功删除证书的个数或错误信息 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 1
}
14.5. 获取明文SDK证书与私钥¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的内容
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert/sdk//{frontId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | frontId | Int | 是 | 前置编号 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/cert/sdk/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | Map |
Map | 是 | key为文件名,value为文件内容 |
1)数据格式
a、成功:
{
"sdk.key": "-----BEGIN PRIVATE KEY-----\nMIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgxqr/d/VgQ0fAr/KvyAeW\nJ6bD1tqxZ5gYOdfIJiK7WOmhRANCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wr\npyoiQkMy1qI5/3Sj4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhP\n-----END PRIVATE KEY-----\n",
"ca.crt": "-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n",
"sdk.crt": "-----BEGIN CERTIFICATE-----\nMIIBeDCCAR+gAwIBAgIJAJoEtSMUsa8HMAoGCCqGSM49BAMCMDgxEDAOBgNVBAMM\nB2FnZW5jeUExEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTAg\nFw0yMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowMTEMMAoGA1UEAwwDc2Rr\nMRMwEQYDVQQKDApmaXNjby1iY29zMQwwCgYDVQQLDANzZGswVjAQBgcqhkjOPQIB\nBgUrgQQACgNCAAT3g/OsuSAD2I/dKLWnZTbMGQ8l9WnkD/wrpyoiQkMy1qI5/3Sj\n4WFKGcVu9vhsd0nLoP+y1QttYKM0m5QGcuhPoxowGDAJBgNVHRMEAjAAMAsGA1Ud\nDwQEAwIF4DAKBggqhkjOPQQDAgNHADBEAiANbeRFiiS6mH+vcAOwV3wXd9YW/B2a\n+vrHMm6NwtliRAIgRH4gSF0XLmpVOEO21bJFDGWm9siIX0cnj0R3kNGZcB4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBcTCCARegAwIBAgIJANrOZ+FrVNpIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAeFw0y\nMTA0MDYxMjMwNDBaFw0zMTA0MDQxMjMwNDBaMDgxEDAOBgNVBAMMB2FnZW5jeUEx\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTBWMBAGByqGSM49\nAgEGBSuBBAAKA0IABIqMDvvzvTq8WW1UtJrnnsifw9/OrPsMc9CrrYBsWdwOGhdx\nfNTJA1ss+vngjrhAmWHczvbh+E1WOlDGzpCumeqjEDAOMAwGA1UdEwQFMAMBAf8w\nCgYIKoZIzj0EAwIDSAAwRQIhALsAbAQ9BDeofk4VYzYx2ZAHB1HviDp9ndvXAkLN\nsfHZAiAjViK97dDr3gxP/qHg0e8BG9ptEv7Do8caOPj33F+yOQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBsDCCAVagAwIBAgIJAPwQ7ISyofOIMAoGCCqGSM49BAMCMDUxDjAMBgNVBAMM\nBWNoYWluMRMwEQYDVQQKDApmaXNjby1iY29zMQ4wDAYDVQQLDAVjaGFpbjAgFw0y\nMTA0MDYxMjMwNDBaGA8yMTIxMDMxMzEyMzA0MFowNTEOMAwGA1UEAwwFY2hhaW4x\nEzARBgNVBAoMCmZpc2NvLWJjb3MxDjAMBgNVBAsMBWNoYWluMFYwEAYHKoZIzj0C\nAQYFK4EEAAoDQgAE6UcrK7ukGBVvBmWYwgIloM38ibqtxF2zBnM9zgU4bujjJU1Y\nCZsHGKVGuNstSOZYfYulnTtFUoHhUEyhddvql6NQME4wHQYDVR0OBBYEFBBSyZi8\nk/Hz/Q2SAin5bMnE1nOFMB8GA1UdIwQYMBaAFBBSyZi8k/Hz/Q2SAin5bMnE1nOF\nMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgEpuPZypVImOtDty9p50X\njeD4wdgzHXpd3CDPui4CnZYCIQC4n+r97cCB51dPb+WjDNV5C18S2uI8LlNVj+xL\ndSweAg==\n-----END CERTIFICATE-----\n"
}
14.6. 获取SDK证书与私钥压缩包¶
获取Front使用的sdk证书(包含链证书、sdk证书和sdk私钥)的zip压缩包
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /cert/sdk/zip/{frontId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | frontId | Int | 是 | 前置编号 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/cert/sdk/zip/1
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 必填 | 说明 |
---|---|---|---|---|---|
1 | 文件名 | ResponseEntity.header | String | 是 | 文件名在header中 |
2 | 文件流 | body | InputStream | 是 | 文件的流在body中 |
1)数据格式
a、成功:
headers: content-disposition: attachment;filename*=UTF-8''conf.zip
{
// 二进制流
}
15 订阅事件管理¶
15.1 获取已订阅的出块事件列表¶
获取所有前置中已订阅的节点出块事件列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /event/newBlockEvent/list/{groupId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组编号 |
2 | pageNumber | Integer | 是 | 页码,从1开始 |
3 | pageSize | Integer | 是 | 页容量 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/event/newBlockEvent/list/{groupId}/{pageNumber}/{pageSize}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | newBlockEvent info |
3.1 | frontInfo | String | 否 | 前置对应IP |
3.1 | id | String | 否 | 订阅信息的id |
3.1 | eventType | Integer | 否 | 事件通知类型,1: newBlockEvent, 2: contractEvent, 3: others |
3.1 | appId | String | 否 | 事件通知对应的应用Id |
3.1 | groupId | Integer | 否 | 群组编号 |
3.1 | exchangeName | String | 否 | exchange名 |
3.1 | queueName | String | 否 | 队列名 |
3.1 | routingKey | String | 否 | 路由键值 |
3.1 | createTime | String | 否 | 订阅信息创建时间 |
4 | totalCount | Integer | 否 | 1: 国密,0:非国密 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontInfo": "127.0.0.1",
"id": "8aba82b570f22a750170f22bcab90000",
"eventType": 1,
"appId": "app2",
"groupId": 1,
"exchangeName": "group001",
"queueName": "user1",
"routingKey": "app2_block_b63",
"createTime": "2020-03-19 17:42:01"
}
],
"totalCount": 1
}
15.2 获取已订阅的合约Event事件列表¶
获取所有前置中已订阅的合约Event事件列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /event/contractEvent/list/{groupId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | String | 是 | 群组编号 |
2 | pageNumber | Integer | 是 | 页码,从1开始 |
3 | pageSize | Integer | 是 | 页容量 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/event/contractEvent/list/{groupId}/{pageNumber}/{pageSize}
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | newBlockEvent info |
3.1 | frontInfo | String | 否 | 前置对应IP |
3.1 | id | String | 否 | 订阅信息的id |
3.1 | eventType | Integer | 否 | 事件通知类型,1: newBlockEvent, 2: contractEvent, 3: others |
3.1 | appId | String | 否 | 事件通知对应的应用Id |
3.1 | groupId | Integer | 否 | 群组编号 |
3.1 | exchangeName | String | 否 | exchange名 |
3.1 | queueName | String | 否 | 队列名 |
3.1 | routingKey | String | 否 | 路由键值 |
3.1 | createTime | String | 否 | 起始区块范围 |
3.1 | fromBlock | String | 否 | 末区块范围 |
3.1 | toBlock | String | 否 | 订阅信息创建时间 |
3.1 | contractAddress | String | 否 | 订阅的合约地址 |
3.1 | contractAbi | String | 否 | 对应合约ABI |
3.1 | topicList | String | 否 | 订阅的合约Event |
4 | totalCount | Integer | 否 | 1: 国密,0:非国密 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"frontInfo": "127.0.0.1",
"id": "8aba82b5708095af01708095e4f70001",
"eventType": 2,
"appId": "app1",
"groupId": 1,
"exchangeName": "group001",
"queueName": "user1",
"routingKey": "user1_event_app1",
"fromBlock": "latest",
"toBlock": "latest",
"contractAddress": "0x657201d59ec41d1dc278a67916f751f86ca672f7",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"n\",\"type\":\"string\"}],\"name\":\"set\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"SetName\",\"type\":\"event\"}]",
"topicList": "SetName(string)",
"createTime": "2020-02-26 16:21:12"
}
],
"totalCount": 1
}
15.3. 获取历史区块EventLog¶
接口描述¶
同步获取历史区块中的EventLog
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /event/eventLogs/list
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约地址 | contractAddress | String | 是 | 已部署合约 | |
3 | 合约ABI | contractAbi | List | 是 | ||
2 | Topic参数 | topics | EventTopicParam | 是 | EventTopicParam包含{String eventName,IndexedParamType indexed1,IndexedParamType indexed2,IndexedParamType indexed3} ,其中IndexedParamType包含{String type,String value} 。eventName为包含参数类型的event名,如SetEvent(uint256,string) ,IndexedParamType中type为indexed参数的类型,value为eventlog需要过滤的参数值 |
|
2 | 开始区块 | fromBlock | Integer | 是 | 始块高 | |
2 | 末区块 | toBlock | Integer | 是 | 末块高 |
2)数据格式
http://localhost:5001/WeBASE-Node-Manager/event/eventLogs/list
{
"groupId": "group",
"contractAbi": [],
"contractAddress": "0x19fb54101fef551187d3a79ea1c87de8d0ce754e",
"fromBlock": 1,
"toBlock": 1,
"topics": {
"eventName": "SetName",
"indexed1": {
"type": "bool",
"value": true
},
"indexed2": {
"type": "string",
"value": null
}
}
}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [{
"log": {
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0x67c8d9a1bc62586b9feb0c8b1127bf0030f649771db3e3d0d99cd99209851ed8",
"blockHash": "0x0ca880c70a3f24dc5e6052cca4dbb50d9aa0ec973474e07d82e2f5281c54e582",
"blockNumber": 71,
"address": "0xd5d4fcf2a46831510f095bfb447bc945f99309f7",
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033132330000000000000000000000000000000000000000000000000000000000",
"topics": ["0x4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02"]
}, // `org.fisco.bcos.sdk.model.EventLog`,可参考java sdk
"data": ["123"]
}, {
"log": {
"logIndex": 0,
"transactionIndex": 0,
"transactionHash": "0x7c27078b372cee951dd102edcbbeab6b3b799212e4337d6bfac7f723e487a1fb",
"blockHash": "0x47f8456a656f226d5a4a7206790ae864ae4fb645bca625b87cf0378ecca7e742",
"blockNumber": 72,
"address": "0xd5d4fcf2a46831510f095bfb447bc945f99309f7",
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033333330000000000000000000000000000000000000000000000000000000000",
"topics": ["0x4df9dcd34ae35f40f2c756fd8ac83210ed0b76d065543ee73d868aec7c7fcf02"]
},
"data": ["333"]
}],
"totalCount": 1
}
15.4. 获取ABI与合约所有合约信息¶
接口描述¶
获取导入的ABI与IDE中已部署合约所有合约的地址、合约名字信息
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/event/listAddress/{groupId}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/event/listAddress/{groupId}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": [{
"type": "contract",
"contractAddress": "0x88156d500422a542435616e5a1e9d2df44c7fc70",
"contractName": "Hello3"
}, {
"type": "contract",
"contractAddress": "0xc2b3b552258b6016f80a070c1aa91bf9e3c48c53",
"contractName": "Hello3"
}, {
"type": "abi",
"contractAddress": "0x7a754bb46418c93b4cec7dcc6fef0676ae6a1e32",
"contractName": "Hello3"
}]
}
15.5. 根据地址获取ABI与合约的合约信息¶
接口描述¶
根据合约地址、合约类型(abi
或contract
)获取导入的ABI与IDE中已部署合约的合约地址、合约名字信息
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址:/event/contractInfo/{groupId}/{type}/{contractAddress}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 所属群组 | groupId | String | 是 | ||
2 | 合约类型 | type | String | 是 | 包含contract (IDE部署)和abi (ABI管理导入)两种类型 |
|
3 | 合约地址 | contractAddress | String | 是 |
2)数据格式
http://127.0.0.1:5001/WeBASE-Node-Manager/event/contractInfo/{groupId}/{type}/{contractAddress}
响应参数¶
1)数据格式
成功:
{
"code": 0,
"message": "success",
"data": {
"abiId": 1,
"groupId": "group",
"contractName": "Hello3",
"contractAddress": "0x7a754bb46418c93b4cec7dcc6fef0676ae6a1e32",
"contractAbi": "",
"contractBin": "",
"createTime": "2020-11-06 15:12:51",
"modifyTime": "2020-11-06 15:12:51"
}
}
16 配置接口¶
16.1 查询是否使用国密¶
获取WeBASE-Node-Manager是否使用国密版
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/encrypt
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Int | 否 | 1: 国密,0:非国密 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": 1
}
16.2 查询WeBASE-Node-Manager的版本¶
获取WeBASE-Node-Manager服务的版本号
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/version
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
16.3 获取服务ip和端口¶
返回本服务ip和端口。
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/ipPort
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | Object | 信息对象 | |
3.1 | ip | string | 否 | 服务IP |
3.2 | port | int | 否 | 服务端口 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": {
"ip": "127.0.0.1",
"port": 5001
},
"attachment": null
}
- 失败:
{
"code": 102000,
"message": "system exception",
"data": {}
}
16.4 查询已部署合约是否支持修改¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/isDeployedModifyEnable
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | boolean | 否 | true: 支持,false:不支持 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": true
}
16.5 获取配置列表¶
查询后台保存的配置列表
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /config/list
- 请求方式:POST
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | type | Integer | 是 | 获取配置类型。1:Docker 镜像列表 |
2)入参示例
http://127.0.0.1:5001/WeBASE-Node-Manager/config/list?type=1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Integer | 否 | 返回码,0:成功;其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | List | 否 | 镜像列表 | |
3.1 | id | Integer | 否 | 镜像编号 |
3.1 | configName | String | 否 | 配置名称 |
3.1 | configType | Integer | 否 | 配置类型,1: Docker 镜像列表 |
3.1 | configValue | String | 否 | 镜像版本 |
3.1 | createTime | Long | 否 | 创建时间 |
3.1 | modifyTime | Long | 否 | 修改时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"configName": "docker 镜像版本",
"configType": 1,
"configValue": "v2.5.0",
"createTime": 1590577419000,
"modifyTime": 1590577419000
}
]
}
17. 链上全量数据接口¶
17.1 查询链上全量私钥用户列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /external/account/list/all/{groupId}/{pageNumber}/{pageSize}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 群组id |
2 | pageNumber | int | 是 | 页码 |
3 | pageSize | int | 是 | 页大小 |
4 | account | int | 否 | 所属用户(已登记私钥) |
5 | type | int | 是 | 1-全量,2-本地已登记,3-本地未登记,默认为1 |
6 | address | string | 否 | 搜索用户地址 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/external/account/list/all/1/1/10
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | data | object | 是 | 返回信息实体(成功时不为空) |
3.1 | userId | int | 是 | 用户编号(若仅存于链上则为null) |
3.2 | userName | string | 是 | 用户名称 |
3.3 | groupId | int | 否 | 所属群组编号 |
3.4 | description | String | 是 | 备注 |
3.5 | userStatus | int | 是 | 状态(1-正常 2-停用) 默认1 |
3.6 | publicKey | String | 是 | 公钥信息 |
3.7 | address | String | 是 | 在链上位置的hash |
3.8 | hasPk | Int | 否 | 是否拥有私钥信息(1-拥有,2-不拥有) |
3.9 | account | string | 是 | 关联账户 |
3.10 | createTime | LocalDateTime | 否 | 创建时间 |
3.11 | modifyTime | LocalDateTime | 否 | 修改时间 |
3.12 | extAccountId | int | 否 | 链上用户编号 |
3.13 | transCount | int | 否 | 用户交易量 |
3.14 | hashs | String | 否 | 用户交易hash(5个) |
3.14 | signUserId | String | 是 | 用户的sign用户编号 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"userId": null,
"userName": null,
"account": null,
"groupId": 1,
"publicKey": null,
"privateKey": null,
"userStatus": null,
"chainIndex": null,
"userType": null,
"address": "0x11523906f9c6d4bbf2bf7ab2ff1049e7bdf2fbf6",
"signUserId": null,
"appId": null,
"hasPk": null,
"description": null,
"createTime": "2021-04-07 16:34:42",
"modifyTime": "2021-04-07 16:34:42",
"extAccountId": 4,
"transCount": 1,
"hashs": "0x6889e8ea793d6326026b2a32bab023183ccc7846d3bcb9bd1001e1f08fb892c5"
},{
"userId": 700001,
"userName": "2222",
"account": "mars",
"groupId": 1,
"publicKey": "04299feb42f324521464c9503220efaeaae99093d92ef08e6f9c1f76e761c2a57422c5fe4dc721e049dfdc05ff8e9b64f59471235ad5e5f4fc07e653f2cd22314e",
"privateKey": null,
"userStatus": 1,
"chainIndex": null,
"userType": 1,
"address": "0x6bc1eeb7d1bb3f1d8195336843bd938d51e594ee",
"signUserId": "0c01b17d67734e95b1e8d5c55e78b4d8",
"appId": "1",
"hasPk": 1,
"description": "",
"createTime": "2021-04-06 21:14:04",
"modifyTime": "2021-04-06 21:14:04",
"extAccountId": 1,
"transCount": null,
"hashs": null
}],
"totalCount": 2
}
17.2 查询链上全量合约列表¶
传输协议规范¶
- 网络传输协议:使用HTTP协议
- 请求地址: /external/contract/list/all/{groupId}/{pageNumber}/{pageSize}?type={type}
- 请求方式:GET
- 请求头:Content-type: application/json
- 返回格式:JSON
请求参数¶
1)入参表
序号 | 输入参数 | 类型 | 必填 | 备注 |
---|---|---|---|---|
1 | groupId | string | 是 | 群组id |
2 | pageNumber | int | 是 | 页码 |
3 | pageSize | int | 是 | 页大小 |
4 | account | int | 否 | 所属用户(已登记私钥) |
5 | type | int | 是 | 1-全量,2-本地已登记,3-本地未登记,默认为1 |
6 | contractAddress | string | 否 | 搜索合约地址 |
2)入参示例
http://localhost:5001/WeBASE-Node-Manager/external/contract/list/all/1/1/10?type=1
返回参数¶
1)出参表
序号 | 输出参数 | 类型 | 备注 | |
---|---|---|---|---|
1 | code | Int | 否 | 返回码,0:成功 其它:失败 |
2 | message | String | 否 | 描述 |
3 | Object | 返回信息实体 | ||
3.1 | abiId | int | 是 | 合约编号(若未登记,则为空) |
3.2 | contractName | String | 否 | 合约名称 |
3.3 | groupId | Int | 否 | 所属群组编号 |
3.4 | contractAddress | String | 否 | 合约地址 |
3.5 | contractAbi | String | 是 | 导入的abi文件内容 |
3.6 | contractBin | String | 是 | 合约runtime-bytecode(runtime-bin) |
3.7 | account | String | 否 | 所属账号 |
3.8 | createTime | LocalDateTime | 否 | 创建时间 |
3.9 | modifyTime | LocalDateTime | 是 | 修改时间 |
3.10 | extContractId | int | 否 | 链上合约编号 |
3.11 | transCount | int | 否 | 合约交易量 |
3.12 | hashs | String | 否 | 合约交易hash(5个) |
3.13 | deployTxHash | String | 是 | 部署合约的交易hash |
3.14 | deployAddress | String | 是 | 部署合约的用户地址 |
3.15 | deployTime | Date | 是 | 合约的部署时间 |
2)出参示例
- 成功:
{
"code": 0,
"message": "success",
"data": [{
"abiId": 6,
"groupId": 1,
"account": "admin",
"contractName": "SpecificIssuerController",
"contractAddress": "0xce1d576181e1d68899a3f2b86c8e274657c07fea",
"contractAbi": "[{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"addIssuer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isSpecificTypeIssuer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"extraValue\",\"type\":\"bytes32\"}],\"name\":\"addExtraValue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"registerIssuerType\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"getExtraValue\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"}],\"name\":\"isIssuerTypeExist\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"removeIssuer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"typeName\",\"type\":\"bytes32\"},{\"name\":\"startPos\",\"type\":\"uint256\"},{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"getSpecificTypeIssuerList\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"specificIssuerDataAddress\",\"type\":\"address\"},{\"name\":\"roleControllerAddress\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"operation\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"retCode\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"typeName\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"SpecificIssuerRetLog\",\"type\":\"event\"}]",
"contractBin": "",
"createTime": "2021-04-06 21:34:38",
"modifyTime": "2021-04-06 21:34:38",
"extContractId": 800014,
"deployAddress": "0x222d68876bed5a33c8efe04c6fc9783031c22cd1",
"deployTxHash": "0xd04b35d7741f0568546de4fc29a880fa0f3727beef544497ca5816fa8793fa13",
"deployTime": 1617716070000,
"transCount": 0,
"hashs": null
},{
"abiId": null,
"groupId": 1,
"account": null,
"contractName": null,
"contractAddress": "0x5e103407b2a06b32bad0fc578e1888036a3e26a8",
"contractAbi": null,
"contractBin": "",
"createTime": null,
"modifyTime": null,
"extContractId": 800007,
"deployAddress": "0x222d68876bed5a33c8efe04c6fc9783031c22cd1",
"deployTxHash": "0x4c6f026e72b69e9ed1f3685f24bc055f5ef1bdde4778ee684a96d25deba6b34b",
"deployTime": 1617716065000,
"transCount": 1,
"hashs": "0x4c6f026e72b69e9ed1f3685f24bc055f5ef1bdde4778ee684a96d25deba6b34b"
}],
"totalCount": 2
}
附录¶
1. 返回码信息列表¶
X01XXX
为WeBASE-Front节点前置错误码,X02XXX
为WeBASE-Node-Manager节点管理服务错误码,X03XXX
为WeBASE-Sign签名服务错误码。
code | message | 描述 |
---|---|---|
0 | success | 成功 |
102001 | system error | 系统异常 |
102002 | system exception: please check front | 系统异常,请检查前置状态 |
102003 | No group belongs to this groupId(node not belongs to this group) | 当前节点不属于当前群组 |
202000 | invalid front id | 不正确的前置ID(添加节点前置失败) |
202001 | database exception | 数据库异常 |
202002 | not found any front for this group | 找不到此群组的任何前置 |
202003 | not support this ip | 不支持该ip |
202004 | front already exists | 前置已经存在 |
202005 | group id cannot be empty | 群组不能为空 |
202006 | invalid group id | 无效的网络编号 |
202007 | checkCode is null | 校验码为空 |
202008 | invalid checkCode | 无效的校验码 |
202009 | save front fail | 保存前置失败 |
202010 | request front fail | 请求前置失败 |
202011 | abiInfo cannot be empty | abi信息不能为空 |
202012 | user id cannot be empty | 用户编号不能为空 |
202013 | invalid user | 无效的用户编号 |
202014 | user already exists | 用户信息已经存在 |
202015 | contract already exists | 合约信息已经存在 |
202017 | invalid contract id | 无效的合约编号 |
202018 | invalid param info | 无效的入参信息 |
202019 | contract name cannot be repeated | 合约名称不能重复 |
202020 | deployed contract cannot be modified | 已部署合约不支持修改 |
202023 | contract has not deploy | 合约尚未部署 |
202026 | account info already exists | 该帐号已经存在 |
202027 | account info not exists | 该帐号不存在 |
202028 | account name empty | 帐号名称不能为空 |
202029 | invalid account name | 无效的账号名称 |
202030 | password error | 密码错误 |
202031 | role id cannot be empty | 角色编号不能为空 |
202032 | invalid role id | 无效的角色编号 |
202033 | invalid contract address | 无效的合约地址 |
202034 | login fail | 登录失败 |
202035 | contract has been deployed | 该合约已经部署 |
202036 | publicKey cannot be empty | 公钥不能为空 |
202037 | associated account cannot be empty | 关联账号不能为空 |
202040 | contract deploy not success | 合约部署失败 |
202045 | the new password cannot be same as old | 新旧密码不能一致 |
202050 | publicKey's length is 130,address's length is 42 | 公钥长度为130,公钥地址长度为42 |
202051 | wrong host or port | 错误的主机或端口 |
202052 | invalid token | 无效的token |
202053 | token expire | token过期 |
202054 | Available front url is empty, check front status | 合约尚未部署 |
202060 | cert handle error | 证书句柄错误 |
202061 | store cert error | 存储证书错误 |
202062 | cert format error, must start with -----BEGIN CERTIFICATE-----\n, end with end | 证书格式错误,必须由 --BEGIN CERTIFICATE-- 包 |
202063 | saving front's cert error | 保存前置证书错误 |
202070 | Mail server config error | 邮件服务器配置错误。 |
202071 | Mail server config param empty/not match | 邮件服务器配置参数为空/不匹配 |
202072 | Mail server config error, db's server config is empty | 邮件服务器配置错误,数据库的服务器配置为空 |
202076 | Alert rule error | 警报规则错误。 |
202077 | Alert rule param not match | 警报规则参数不匹配。 |
202080 | Send mail error, please check mail server configuration | 发送邮件错误,请检查邮件服务器配置。 |
202081 | Send mail error, please enable mail server before send | 发送邮件错误,请在发送前启用邮件服务器。 |
202086 | Alert log error | 警报日志错误。 |
202087 | Alert log param: status/logId is empty | 警报日志参数:status/logId为空。 |
202090 | Update guomi methodId error | 更新国密methodId错误 |
202091 | Front's encrypt type not matches with nodemgr | Front的加密类型与nodemgr不匹配 |
202096 | contract address already exists | 合约地址已存在 |
202097 | abi info of this id not exists | 此ID的ABI信息不存在 |
202098 | Contract abi invalid, please check abi | 合约ABI无效,请检查ABI |
202099 | Abi Id cannot be empty | 此ID的ABI信息为空 |
202100 | contractAddress is null | 合约地址为空 |
202110 | User's signUserId not exist | 用户的signUserId不存在 |
202111 | Fail to parse json | 解析json错误 |
202121 | Cert file not found, please check cert path in config | 找不到证书文件,请检查配置中的证书路径 |
202122 | Pem file format error, must surrounded by -----XXXXX PRIVATE KEY----- | Pem文件格式错误,必须包含-----XXXXX PRIVATE KEY----- |
202123 | Pem file content error | Pem文件内容错误 |
202124 | p12's password cannot be chinese | P12的密码不能为中文 |
202125 | p12's password not match | P12的密码错误 |
202126 | P12 file content error | P12文件内容错误 |
202300 | Group id already exists | 群组id已存在 |
202301 | Node's front not exists | 节点前置不存在 |
202310 | govern vote record not exist | 投票记录不存在 |
202311 | permission denied on chain | 链上权限被禁止 |
202321 | path contains deployed contract, please delete one by one | 路径中包含已部署的合约,请逐个删除未部署的合约 |
202322 | contract path cannot be blank(use "/" instead) | 合约地址不能为空(默认请使用"/") |
202323 | privateKey decode fail | 私钥解码失败 |
202324 | password decode fail | 密码/授权码解码失败 |
202401 | No configured of docker registry url. | 没有配置 Docker 镜像更新 URL 地址 |
202402 | Fetch image tag from docker registry error. | 从 Docker 源更新镜像版本失败 |
202403 | Fetch Docker image tag list error, unknown config type. | 查询 Docker 镜像版本失败(未知类型) |
202404 | Save chain's configuration to file error. | 保存链配置信息文件失败 |
202405 | Docker image tag invalid. | 错误的镜像版本 |
202406 | Configuration of host is empty. | 主机配置参数为空 |
202407 | Chain exists, deploy failed. | 链已存在,部署失败 |
202408 | Save chain data to DB error. | 插入链信息到数据库失败 |
202409 | Chain root dir exist, please move it manually. | 主机节点的链安装目录(default_chains)已存在,请手动移除 |
202410 | Execute build_chain.sh script error. | 执行 build_chain.sh 链生成脚本失败 |
202411 | Host, agency, group configuration error. | 主机,机构,群组配置信息错误 |
202412 | Host ip and num error. | 主机 IP,节点数量配置错误 |
202413 | Agency name invalid, only [a-zA-Z0-9_] is valid. | 机构名称格式错误,只能包含大小写字母,数字,下划线 |
202414 | Group id error, only positive integer is valid. | 群组编号格式错误,必须为正整数 |
202415 | Login to host /ip/ through SSH error. Please check SSH configuration. | SSH登录主机/ip/失败,请检查 SSH 配置 |
202416 | Save agency data into DB error. | 插入新机构信息到数据库失败 |
202417 | Save group data into DB error. | 插入新群组信息到数据库失败 |
202418 | Save host data into DB error. | 插入主机信息到数据库失败 |
202419 | Save front data into DB error. | 插入前置信息到数据库失败 |
202420 | Save node data into DB error. | 插入节点信息到数据库失败 |
202421 | Save node and front mapping data into DB error. | 插入前置和群组映射关系到数据库失败 |
202422 | Parse node index from directory error. | 从目录获取节点序号失败 |
202423 | A single host IP only belongs to one agency. | 一个 IP 主机,只能属于一个机构 |
202424 | Unknown error during deploying. | 部署时发生未知错误 |
202425 | SSH login through username and password is unsupported yet. | 不支持使用 SSH 密码登录主机 |
202426 | Chain has no agency. | 当前链没有所属机构 |
202427 | No deployed chain | 链不存在 |
202428 | IP format error. | IP 格式错误 |
202429 | Agency name cannot be blank when IP is new. | 主机 IP 是新 IP 时,机构名称不能为空 |
202430 | Agency name already exists. | 存在同名机构 |
202431 | Add new node error. | 新增节点错误 |
202432 | No valid chain certification. | 链证书无效 |
202433 | Generate agency private key and crt file error. | 生成机构私钥和证书失败 |
202434 | Host without agency error." | 主机所属机构为空 |
202435 | Node num should be positive integer, and less then 10. | 主机数量格式错误,正整数,并且小于 10 |
202436 | Generate sdk | 生成主机 SDK 私钥和证书失败 |
202437 | Generate node private key and crt files error. | 生成新节点私钥和证书失败 |
202438 | Copy SDK files error. | 拷贝 SDK 证书和私钥失败 |
202439 | Upload SDK files error. | 上传 SDK 证书和私钥失败 |
202440 | Upload node config files error. | 上传节点证书和私钥失败 |
202441 | Copy group config files from original node error. | 从旧节点复制群组配置文件失败 |
202442 | Delete tmp directory of agency error. | 删除机构临时目录失败 |
202443 | Delete tmp directory of SDK error. | 删除 SDK 临时目录失败 |
202444 | Delete tmp directory of node error. | 删除节点临时目录失败 |
202445 | Unknown nodeid. | 未知节点编号(nodeid) |
202446 | Stop node error. | 停止节点失败(停止容器) |
202447 | Start node error. | 启动节点失败(启动容器) |
202448 | Both new image tag and old are the same. | 链升级的新版本和链的现有版本相同 |
202449 | Upgrade chain to new image tag error. | 链升级失败 |
202450 | Delete node failed, node is still in group. | 节点仍属于群组,删除失败 |
202451 | Parse node's config files error. | 读取节点配置文件失败 |
202452 | Delete node's config error. | 删除节点配置文件失败 |
202453 | Stop node before deleting. | 节点正在运行,删除失败,请先停止节点 |
202454 | Update p2p part of related nodes error. | 更新关联节点 P2P 配置失败 |
202455 | Delete chain error. | 删除链失败 |
202456 | Node is still a sealer or observer, delete failed. | 节点处于观察或共识状态,删除失败 |
202457 | Fetch node list from host's configuration files | 从主机配置文件获取节点列表失败 |
202458 | Generate application.yml for front error | 生成前置 application.yml 配置文件失败 |
202459 | Init host with shell script error. | 通过脚本初始化主机失败 |
202460 | Sync files error. | 传输文件失败 |
202461 | Control container through Docker api error. | Docker 容器操作失败 |
202462 | Two nodes at least. | 至少两个节点。 |
202463 | Group need two sealers at least. | 群组至少需要两个共识节点。 |
202464 | WebaseSignAddess configuration error in Application.yml | application.yml中的webaseSignAddess配置错误 |
202465 | webaseSignAddress cannot be 127.0.0.1 or localhost in application.yml file | sign的地址不能为127.0.0.1或localhost |
202466 | Please pull the Docker image manually in host /ip/ | 主机/ip/请手动拉取 Docker 镜像 |
202467 | Max 4 nodes on a single host | 单个主机最多部署 4 个节点 |
202468 | Host of WeBASE-Node-Manager's ip is already existed. | WeBASE-Node-Manager所在主机的IP已存在 |
202469 | Check docker installed and running of host | 检测主机Docker已安装且已启动未通过 |
202470 | Check host memory not enough for nodes(s) | 检测主机安装节点所需空余内存未通过 |
202471 | Check host cpu core count not enough for node(s) | 检测主机安装节点所需CPU核核心数未通过 |
202472 | Host check had been interrupt | 主机检测过程被中断 |
202473 | Host check fail for inpurt param | 主机检测入参错误 |
202475 | Fail to generate chain and front config locally | 本地生成链与前置配置失败 |
202476 | Not all host init success | 部分主机在检测时未通过 |
202477 | Ipconf's node port config error | Ipconf入参格式中节点端口格式错误 |
202478 | Ipconf not match with deploy info list | Ipconf与主机节点信息不匹配 |
202479 | Delete host fail for host contains node(front) | 无法删除主机,主机中仍包含节点 |
202480 | Ansible not installed! | Node-Manager所在主机未安装Ansible |
202481 | Ansible fetch not support fetch directory | Ansible不支持Fetch目录 |
202482 | Ansible ping cannot reach target ip | Ansible无法ping连通目标IP |
202483 | Ansible init host of image and scp config not all success | 主机初始化镜像与传输配置未全部成功 |
202484 | Ansible pull docker hub fail | Ansible拉取Docker hub镜像失败 |
202485 | Ansible pull docker cdn fail | Ansible拉取CDN镜像失败 |
202486 | Ansible run docker command fail | Ansible执行Docker命令失败 |
202487 | Ansible exec command error | Ansible执行命令失败 |
202488 | Ansible exec scp(copy) error | Ansible执行scp复制到远端失败 |
202489 | Ansible exec scp(fetch) error | Ansible执行scp拉取文件失败 |
202491 | Ansible check image exist error for param | Ansible检测Docker镜像存在的入参错误 |
202492 | Ansible check docker container exist error for param | Ansible检测Docker容器存在的入参错误 |
202493 | Check host not pass, please check host remark | 检测主机未通过,请通过主机的remark查看错误信息 |
202494 | Check host port is in use, please check host remark | 主机的端口已被占用,请通过主机的remark查看错误信息 |
202495 | Host already exist | 主机已存在 |
202496 | Host root dir access denied | 主机的安装目录无权限访问 |
202497 | Host not exist or already been deleted | 主机不存在或已被删除 |
202501 | contract path is exists. | 合约路径已存在 |
202502 | version cannot be empty | 版本不能为空 |
202503 | cns name cannot be empty | cns名不能为空 |
202504 | version already exists | 版本已存在 |
202511 | Front's sdk cert and key not found | 未找到前置的SDK证书与私钥 |
202512 | Write front's sdk cert and key fail | 导出SDK证书私钥文件失败,无法写入文件 |
202513 | Write private key file fail | 导出私钥文件失败,无法写入文件 |
202514 | group genesis conf not found | 群组的创世块文件不存在,无法添加为共识节点 |
202516 | app name exists | 应用名称已存在 |
202517 | app name not exists | 应用名称不存在 |
202518 | app id not exists | 应用编号不存在 |
202519 | link format invalid | 链接格式错误 |
202534 | contract path not exists | 合约路径不存在 |
302000 | user not logged in | 未登录的用户 |
302001 | Access denied | 没有权限 |
402000 | param exception | 参数错误 |
2. Precompiled Service说明¶
对预编译合约接口的使用有疑惑,可以查看FISCO BCOS的PreCompiledService API说明
查看预编译合约的solidity接口代码,可以查看FISCO BCOS的web3sdk precompile模块,如crud/TableFactory.sol:
pragma solidity ^0.4.2;
contract TableFactory {
function createTable(string tableName, string key, string valueField) public returns (int);
}
查看FISCO BCOS中实现的precompild合约列表、地址分配及源码:
地址 | 功能 | 源码(libprecompiled目录) |
---|---|---|
0x1000 | 系统参数管理 | SystemConfigPrecompiled.cpp |
0x1001 | 表工厂合约 | TableFactoryPrecompiled.cpp |
0x1002 | CRUD合约 | CRUDPrecompiled.cpp |
0x1003 | 共识节点管理 | ConsensusPrecompiled.cpp |
0x1004 | CNS功能 | CNSPrecompiled.cpp |
0x1005 | 存储表权限管理 | AuthorityPrecompiled.cpp |
0x1006 | 并行合约配置 | ParallelConfigPrecompiled.cpp |
Precompiled Service API 错误码
错误码 | 消息内容 | 备注 |
---|---|---|
0 | success | |
-50000 | permission denied | |
-50001 | table name already exist | |
-50100 | unknow function call | |
-50101 | table does not exist | |
-51000 | table name and address already exist | |
-51001 | table name and address does not exist | |
-51100 | invalid node ID | SDK错误码 |
-51101 | the last sealer cannot be removed | |
-51102 | the node is not reachable | SDK错误码 |
-51103 | the node is not a group peer | SDK错误码 |
-51104 | the node is already in the sealer list | SDK错误码 |
-51105 | the node is already in the observer list | SDK错误码 |
-51200 | contract name and version already exist | SDK错误码 |
-51201 | version string length exceeds the maximum limit | SDK错误码 |
-51300 | invalid configuration entry | |
-51500 | contract name and version already exist | |
-51501 | condition parse error | |
-51502 | condition operation undefined | |
-51600 | invalid ciphers | |
-51700 | group sig failed | |
-51800 | ring sig failed | |
-51900 | contract frozen | |
-51901 | contract available | |
-51902 | contract repeat authorization | |
-51903 | invalid contract address | |
-51904 | table not exist | |
-51905 | no authorized | |
-52000 | committee member exist | |
-52001 | committee member not exist | |
-52002 | invalid request permission denied | |
-52003 | invalid threshold | |
-52004 | operator can't be committee member | |
-52005 | committee member can't be operator | |
-52006 | operator exist | |
-52007 | operator not exist | |
-52008 | account not exist | |
-52009 | invalid account address | |
-52010 | account already available | |
-52011 | account frozen | |
-52012 | current value is expected value |
升级说明¶
WeBASE-Node-Manager升级的兼容性说明,请结合WeBASE-Node-Manager Changelog进行阅读
WeBASE-Node-Manager升级的必须步骤:
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 使用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 - 查看节点管理服务升级文档中对应版本是否需要修改数据表,若不需要升级则跳过
3.1 若需要升级数据表,首先使用
mysqldump
命令备份数据库 3.2 按照升级文档指引,操作数据表 bash stop.sh && bash start.sh
重启
各个版本的具体修改可参考下文
v2.0.0-rc1¶
附录¶
1. 安装问题¶
1.1 Java部署¶
CentOS环境安装Java¶
注意:CentOS下OpenJDK无法正常工作,需要安装OracleJDK下载链接。
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并保存退出
export JAVA_HOME=/software/jdk-8u201 #这是一个文件目录,非文件
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version
2. 常见问题及方案¶
一般问题¶
- 问:执行shell脚本报下面错误:
[app@VM_96_107_centos deployInputParam]$ bash start.sh
start.sh: line 2: $'\r': command not found
start.sh: line 8: $'\r': command not found
start.sh: line 9: $'\r': command not found
start.sh: line 10: $'\r': command not found
答:这是编码问题,在脚本的目录下执行转码命令:
dos2unix *.sh
数据库问题¶
- 问:服务访问数据库抛出异常:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
答:检查数据库的网络策略是否开通
下面以centos7为例:
查看防火墙是否开放3306端口: firewall-cmd --query-port=3306/tcp
防火墙永久开放3306端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新启动防火墙:firewall-cmd --reload
- 问:执行数据库初始化脚本抛出异常:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (110)
答:MySQL没有开通该帐号的远程访问权限,登录MySQL,执行如下命令,其中TestUser改为你的帐号
GRANT ALL PRIVILEGES ON *.* TO 'TestUser'@'%' IDENTIFIED BY '此处为TestUser的密码’' WITH GRANT OPTION;
WeBASE-Node-Manager服务搭建问题¶
- 问:执行构建命令
gradle build -x test
抛出异常:
A problem occurred evaluating root project 'WeBASE-Node-Manager'.
Could not find method compileOnly() for arguments [[org.projectlombok:lombok:1.18.2]] on root project 'WeBASE-Node-Manager'.
答:
方法1、已安装的Gradle版本过低,升级Gradle版本到4.10以上即可。
方法2、直接使用命令:./gradlew build -x test
,如果提示gradlew为非可执行文件,执行chmod +x ./gradlew
再次执行build操作即可。
全量交易/全量合约/交易审计出现系统异常问题¶
- 问:在WeBASE页面进入合约管理/合约列表/全量或者交易审计/异常用户界面时,发生
WeBASE-Node-Manager
系统异常:
答:检查日志发现报错是由于数据库版本过高,需要禁用only_full_group_by。
登陆数据库 mysql -u root -p
返回:Enter password:
需要输入配置数据库时设置的密码。
然后查询数据库开启的规则:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
返回如下:
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY
需要关闭其中的ONLY_FULL_GROUP_BY规则:
set @@GLOBAL.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set @@SESSION.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
引号中为之前查询规则结果中除了ONLY_FULL_GROUP_BY以外的规则
若设置时报错,只需将引号中报错的规则删去并重新执行命令即可,然后重启WeBASE便可解决异常。
启动问题¶
- 问:启动Node-Manager进程后,后台日志显示
not found any front
:
答:此处为正常提示,表示后台没有可访问的节点前置。通过WeBASE-Web连接Node-Manager后台服务后,添加节点前置即可。
节点管理服务忘记密码¶
登录到WeBASE-Node-Manager中配置的Mysql数据库(默认为webasenodemanager)后,在tb_account_info
中插入一条新的管理员账号test
,密码Abcd1234
INSERT INTO tb_account_info (account,account_pwd,role_id,create_time,modify_time)values('test', '$2a$10$F/aEB1iEx/FvVh0fMn6L/uyy.PkpTy8Kd9EdbqLGo7Bw7eCivpq.m',100000,now(),now());
关闭鉴权调用(联调)¶
在application.yml
中配置constant.isUseSecurity
为false
即可禁用WeBASE-Node-Manager的登录鉴权。
- 免鉴权后,默认使用的是管理员用户admin(管理员用户可以看到所有用户的数据),可以跳过登陆页面,直接访问WeBASE-Web节点管理台的主页,如
http://localhost:5000/#/home
。 - 若需要指定用户进行接口调用,可以在请求的
headers
中增加Account
字段,其值设置为节点管理服务的用户名,如获取开发者用户developer1
对应数据(开发者用户只能看到自己所创建的数据)。
3. 配置文件解析¶
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5001 | 当前服务端口 |
server.servlet.context-path | /WeBASE-Node-Manager | 当前服务访问路径 |
mybatis.typeAliasesPackage | com.webank.webase.node.mgr | mapper类扫描路径 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasenodemanager | mysql连接地址 |
spring.datasource.username | defaultAccount | mysql账号 |
spring.datasource.password | defaultPassword | mysql密码 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目录 |
logging.level | com.webank.webase.node.mgr: info | 日志扫描目录和级别 |
constant.isDeleteInfo | true | 是否定时删除数据(区块、交易hash、审计数据);true-是,false-否 |
constant.transRetainMax | 10000 | 表中交易hash保留的条数(开启constant.isDeleteInfo时有效) |
constant.deleteInfoCron | "0 0/1 * * * ?" | 定时删除数据的频率,默认一分钟 |
constant.statisticsTransDailyCron | "0 0/1 * * * ?" | 统计交易记录的执行频率,默认一分钟 |
constant.resetGroupListCycle | 600000 | 刷新群组列表任务执行完后,下一个开始间隔(毫秒) |
constant.groupInvalidGrayscaleValue | 1M | 群组失效灰度期长度,灰度期过后,如果还没查到失效状态的群组,就删除(y:年, M:月, d:天, h:小时, m:分钟, n:永远有效) |
constant.notSupportFrontIp | localhost | 不支持的前置ip |
constant.isBlockPullFromZero | false | 是否从0开始同步区块信息(true-是,false-最新块开始同步) |
constant.pullBlockInitCnts | 1000 | 最新块的前1000个块之后开始同步(constant.isBlockPullFromZero=false时有效) |
constant.pullBlockSleepTime | 200 | 拉完一个区块,睡眠时间(毫秒) |
constant.pullBlockTaskFixedDelay | 30000 | 拉区块任务执行完后,间隔多久开始下一次(毫秒) |
constant.blockRetainMax | 10000 | 表中区块保留的条数(开启constant.isDeleteInfo时有效) |
constant.verificationCodeMaxAge | 300 | y验证码有效时长(秒) |
constant.authTokenMaxAge | 1800 | 登录token有效时长(秒) |
constant.isUseSecurity | true | 是否启用登录鉴权,若false则默认使用admin权限免登陆鉴权 |
constant.frontUrl | http://%1s:%2d/WeBASE-Front/%3s | 前置服务的请求路径 |
constant.httpTimeOut | 5000 | http请求超时时间(毫秒) |
constant.contractDeployTimeOut | 30000 | 合约部署超时时间(毫秒) |
constant.maxRequestFail | 3 | 请求前置(frot)被允许失败次数,达到配置值后,将会停止往该路径发送请求 |
constant.sleepWhenHttpMaxFail | 60000 | 请求失败次数过多,熔断时间长度(毫秒) |
constant.transMonitorTaskFixedRate | 60000 | 交易审计开始执行后,下一个任务开始时间(毫秒) |
constant.analysisSleepTime | 200 | 审计完一条交易hash后,睡眠时间(毫秒) |
constant.monitorInfoRetainMax | 10000 | 表中审计数据保留的条数(开启constant.isDeleteInfo时有效) |
constant.isMonitorIgnoreUser | false | 审计逻辑是否忽略私钥用户 |
constant.isMonitorIgnoreContract | false | 审计逻辑是否忽略合约 |
constant.monitorUnusualMaxCount | 20 | 审计异常数据被允许最大值,到达后会停止审计 |
constant.auditMonitorTaskFixedDelay | 300000 | 监控审计数据任务的运行间隔时间,异常时将发送告警邮件(毫秒)(注:此处为检查频率,告警配置中是告警频率) |
constant.nodeStatusMonitorTaskFixedDelay | 60000 | 监控节点状态任务的运行间隔时间,异常时将发送告警邮件(毫秒)(注:此处为检查频率,告警配置中是告警频率) |
constant.certMonitorTaskFixedDelay | 300000 | 监控证书任务的运行间隔时间,有效期结束7天前时将发送告警邮件(毫秒) (注:此处为检查频率,告警配置中是告警频率) |
constant.developerModeEnable | false | 是否启用开发者模式(管理员、用户并增加开发者角色) |
constant.deployedModifyEnable | true | 是否允许重复部署合约 |
constant.enableVerificationCode | true | 验证码是否启用随机 |
constant.verificationCodeValue | "8888" | 当不启用验证码的随机时,设置固定验证码(方便联调) |
constant.ignoreCheckFront | /account/login,/account/pictureCheckCode,/login,/user/privateKey/*,/config/encrypt,/config/version,/front/refresh,/api/ | 直接访问前置的URI |
constant.resetGroupListInterval | 15000 | 异步刷新所有群组连接的间隔,默认15s |
constant.appRequestTimeOut | 300000 | 接入应用的请求间隔(ms) |
constant.appStatusCheckCycle | 3000 | 接入应用的状态检查频率(ms) |
constant.statBlockRetainMax | 100000 | 区块监控数据的最大存储量 |
constant.statBlockFixedDelay | 5000 | 区块监控数据的频率(ms) |
constant.statBlockPageSize | 10 | 区块监控数据拉取的单次请求量 |
constant.enableExternalFromBlock | true | 是否启用全量用户与全量合约采集 |
sdk.encryptType | 0 | sdk的加密类型,0:标准,1:国密;需要与链和Front的类型一致 |
executor | 异步拉取区块、刷新群组状态、监控群组数据的线程池配置 | |
executor.corePoolSize | 3 | 异步任务的核心线程数 |
executor.maxPoolSize | 10 | 异步任务的最大线程数 |
executor.queueSize | 50 | 异步任务的队列容量 |
executor.threadNamePrefix | node-mgr-async- | 异步拉取区块、刷新群组状态、监控群组数据的线程名字前缀 |
scheduler | 拉取区块、刷新群组状态、监控群组数据、交易解析、定时删除区块等定时任务的线程池配置 | |
scheduler.poolSize | 50 | 定时任务的线程池大小 |
scheduler.threadNamePrefix | node-mgr-task- | 定时任务的线程名字前缀 |
scheduler.awaitTerminationSeconds | 600 | 定时任务的线程等待超时时长(秒) |
scheduler.waitForTasksToCompleteOnShutdown | true | 定时任务完成后再停止线程 |
WeBASE管理平台¶
概要介绍¶
功能说明¶
本项目是区块链中间件平台WeBASE管理平台,使用框架vue-cli
。
支持FISCO-BCOS 2.0以上版本,支持群组和群组切换。具体功能有:
- 区块链数据概览,可以查看区块链的节点、区块、交易、合约信息。点击左上角交易信息和区块信息界面,可以跳转到区块或交易信息列表页,交易信息支持input解码和event解码。
- 节点管理,可以查看前置列表、节点列表、修改节点共识状态。可以查看链上的所有群组和节点,查看前置所在服务器状态相关信息,管理节点的共识状态。
- 合约管理,提供图形化合约IDE、查询已部署合约列表、合约CNS查询以及预编译合约的CRUD功能。编译、部署合约后该合约会被保存。
- 私钥管理,管理所有可以发交易的帐号,公钥用户是其他机构的帐号,无法在本机构发交易,可以通过手动绑定和自动同步获取。私钥用户为本机构发交易的用户。
- 系统管理,提供权限管理、系统配置管理、证书管理的功能。权限管理可以控制私钥用户的权限范围,证书管理可以查看链的相关证书。
- 系统监控,系统监控包含了节点监控、主机监控与异常告警。监控整条链所有机构所有用户发送交易行为,查看是否有异常用户和异常合约,并在异常状态下通过告警邮件通知运维管理员。
- 交易审计,主要监控整条链所有机构所有用户发送交易行为,查看是否有异常用户和异常合约。
- 订阅事件,查看前置已订阅的链上事件通知信息列表。
- 帐号管理,只有admin帐号才能查看此功能,可以新增帐号(登录此系统帐号)、修改密码、修改账户邮箱等等。
- 群组管理,动态管理群组,可以创建新群组、将节点加入已有群组、删除群组数据等
国密支持¶
WeBASE-Web v1.2.2+已支持国密功能,使用WeBASE-Node-Manager v1.2.2,使用WeBASE-Front v1.2.2及以上版本
WeBASE-Web将根据WeBASE-Node-Manager的版本,自动在国密与非国密之间切换,合约编译、合约部署、调用合约、发送交易等功能均已支持国密。
solidity v0.5.1和v0.6.10支持¶
WeBASE-Web v1.4.2+已支持solidity v0.5.1
和v0.6.10
,可在合约IDE中的左上角进行版本切换
部署说明¶
2. 拉取代码¶
代码可以放在/data下面,执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Web.git
# 若网络问题导致长时间无法下载,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Web.git
进入目录:
cd WeBASE-Web
2.1 下载solc-bin¶
执行脚本get_solc_js.sh会自动下载solc-bin,即下面v0.4.25.js等文件。
在WeBASE-Web/
目录中直接执行脚本get_solc_js.sh((脚本与dist
文件夹同级))
bash ./get_solc_js.sh
等待脚本执行完成
- 如果执行不成功,请使用下面的命令:
注意:当且仅当get_solc_js.sh脚本执行失败才需要执行下面的命令
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.4.25.js -o ./dist/static/js/v0.4.25.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.4.25-gm.js -o ./dist/static/js/v0.4.25-gm.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.5.2.js -o ./dist/static/js/v0.5.2.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.5.2-gm.js -o ./dist/static/js/v0.5.2-gm.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.6.10.js -o ./dist/static/js/v0.6.10.js
curl -#L https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/download/solidity/wasm/v0.6.10-gm.js -o ./dist/static/js/v0.6.10-gm.js
执行完后检查dist/static/js是否下载完这些js文件。
3. 拉取移动端代码¶
WeBASE新增了h5的移动端页面,支持手机浏览器访问。代码和WeBASE-Web放在同级目录
拉取代码
git clone https://github.com/WeBankFinTech/WeBASE-Web-Mobile.git
# 若网络问题导致长时间无法下载,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Web-Mobile.git
4. 修改配置¶
在docs目录下有配置文件nginx.conf,修改完后替换安装的nginx的配置文件nginx.conf(这里nginx安装配置文件在/usr/local/nginx/conf下面,如果这里没找到,可以到/etc下寻找,如有权限问题,请加上sudo)。
- 修改配置:
# 修改服务器ip,也可以使用域名
sed -i "s%127.0.0.1%${your_ip}%g" docs/nginx.conf
# 修改WeBASE-Web服务端口(端口需要开通策略且不能被占用)
sed -i "s%5000%${your_port}%g" docs/nginx.conf
# 修改静态文件路径(文件需要有权限访问)
sed -i "s%/data/WeBASE-Web/dist%${your_file_dir}%g" docs/nginx.conf
# 节点管理服务ip和端口
sed -i "s%10.0.0.1:5001%${your_node_manager}%g" docs/nginx.conf
- 复制配置文件nginx.conf到默认配置目录中
- 也可以直接通过
nginx -c docs/nginx.conf
命令加载docs/nginx.conf配置
cp -rf docs/nginx.conf /usr/local/nginx/conf
备注: 如果服务器已有nginx,可在原配置文件nginx.conf增加一个server:
upstream node_mgr_server{
server 10.0.0.1:5001; # 节点管理服务ip和端口
}
server {
listen 5000 default_server; # 前端端口(端口需要开通策略且不能被占用)
server_name 127.0.0.1; # 服务器ip,也可配置为域名
location / {
root /data/WeBASE-Web/dist; # 前端文件路径(文件需要有权限访问)
# 下面是移动端nginx配置
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
{
root /data/WeBASE-Web-Mobile/dist;
}
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
include /etc/nginx/default.d/*.conf;
location /mgr {
proxy_pass http://node_mgr_server/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
5. 启动nginx¶
启动命令:
/usr/local/nginx/sbin/nginx # nginx在/usr/local目录下
检查nginx是否启动:
ps -ef | grep nginx
6. 访问页面¶
http://{deployIP}:{webPort}
示例:http://127.0.0.1:5000
备注:
- 部署服务器IP和管理平台服务端口需对应修改,网络策略需开通
- 默认账号密码:admin/Abcd1234
- WeBASE管理平台使用说明请查看使用手册
7. 查看日志¶
进程日志:tail -f logs/access.log
错误日志:tail -f logs/eror.log
升级说明¶
WeBASE-Web升级说明,请结合WeBASE-Web Changelog和WeBASE管理平台使用手册进行阅读。
WeBASE-Web升级的必须步骤: 0. 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 采用新的安装包,替换旧的
webase-web
目录,无需重启nginx
各个版本的具体修改可参考下文
v1.5.3¶
- 新增WeBASE-Web docker镜像,
webasepro/webase-web:v1.5.3
- 新增数据监控大屏
- 新增导出私钥功能,导出格式为p12
- 新增公钥用户绑定私钥功能
- 新增系统管理中的共识超时时间配置
- 合约仓库新增代理合约模板、溯源合约模板
- 优化合约IDE回退问题,仅回退到后台记录版本
- 修复合约IDE页面事件bus重复问题
- 修复全量合约/全量用户搜索问题
- 修复合约IDE创建文件夹未自动刷新问题
- 修复交易回执解析中int类型显示为string的显示问题
v1.5.2¶
- 优化合约Java项目导出功能,支持批量编译合约,支持多用户与channel端口检查
- 合约仓库新增Asset资产合约
- 优化交易弹窗,支持无私钥用户时直接创建私钥
- 支持开发者导出私钥、支持合约IDE绑定合约地址
v1.5.1¶
- 新增导出合约Java工程脚手架
- 新增合约仓库
- 新增全量用户/合约通过地址搜索功能
- 合约IDE编译器js切换至WASM版本,并采用Worker加载方式,修复部分chrome浏览器加载失败问题
- 修复手机版登陆态过期未跳转到登录页
- 修复无法删除合约目录问题
- 修复合约IDE中合约调用参数为字符串时不能输入空格
v1.5.0¶
- 新增应用管理,支持WeIdentity模板和自定义应用接入
- 新增节点监控的链上TPS、出块周期、块大小的统计
- 新增合约列表中的已登记合约与链上全量合约视图、新增私钥用户列表中的已登记私钥与链上全量私钥视图
- 支持导出Txt/Pem/P12/WeID私钥文件、支持导出前置的SDK证书
- 新增适配移动端的WeBASE管理台
其中移动端管理台需要启用新的nginx.conf,新增了移动端自动重路由、移除auto-index、增加gzip压缩
- 需要将已有的webase-node-mgr的ip port及webase-web的port配置到新的nginx.conf文件中,使用nginx重载配置文件
新增内容如下
- 需要启用移动端时,则需要下载移动端的webase-web-mobile.zip安装包并解压,即
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.0/webase-web-mobile.zip
,并解压unzip webase-web-mobile.zip
- 在nginx.conf中的
location /
中的phone_page_url
替换为webase-web-mobile
解压后的路径(已有的root web_page_url
无需修改) - 最后使用
nginx -s reload
重载新的nginx配置文件
location / {
# default pc page url
root web_page_url;
# if using phone
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
{
root phone_page_url;
}
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
- 需要启用gzip时,在nginx.conf中的
server
中添加以下内容
server {
...
# zip solidity js file
gzip on;
gzip_min_length 10k;
gzip_buffers 32 4k;
gzip_http_version 1.0;
gzip_comp_level 1;
gzip_proxied any;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
}
v1.4.1¶
新增FISCO BCOS v2.5.0及以上版本的基于角色的权限管理功能,新增了开发者模式
- 新的权限管理基于角色,可参考FISCO BCOS权限控制文档
- 开发者模式:新增了用户角色developer,可进行查询交易,合约部署调用等功能,无法使用管理员的系统管理与监控等功能。
v1.4.0¶
v1.4.0 主要在兼容原有手动部署底层服务,手动添加 WeBASE-Front 前置服务的基础上,新增了可视化部署底层服务,以及节点的动态管理功能。
- 增加左下展示版本号,包括链版本和兼容版本。如果是国密版本,链版本号会带有
gm
后缀,兼容版本仅代表兼容的节点版本,不带有gm
后缀。
提示
- 如果要体验可视化部署,请参考可视化部署部署新环境然后部署新链;
v1.3.1¶
v1.3.1主要新增了动态群组管理、合约ABI导入、合约ABI编码器、支持导入私钥等功能,详情升级说明如下:
- 新增动态群组管理,包含生成群组、启动/停止群组、删除/恢复群组、查询节点群组状态等功能,操作说明可参考动态群组管理使用指南
- 新增导入已部署合约ABI功能,支持导入已部署合约,进行合约调用
- 新增合约Abi编码器,可通过ABI构建交易参数
- 新增导入.p12/.pem/.txt私钥功能;其中.txt与节点前置导出私钥格式一致,.p12/.pem与控制台导出私钥格式一致;
附录¶
1 安装nginx¶
1.1 下载nginx依赖¶
在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。如果没有,请执行命令
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
执行命令时注意权限问题,如遇到,请加上sudo
1.2 下载nginx¶
nginx下载地址:https://nginx.org/download/(下载最新稳定版本即可) 或者使用命令:
wget http://nginx.org/download/nginx-1.9.9.tar.gz (版本号可换)
将下载的包移动到/usr/local/下
1.3 安装nginx¶
1.3.1 解压¶
tar -zxvf nginx-1.9.9.tar.gz
1.3.2 进入nginx目录¶
cd nginx-1.9.9
1.3.3 配置¶
./configure --prefix=/usr/local/nginx
1.3.4 make¶
make
make install
1.3.5 测试是否安装成功¶
使用命令:
/usr/local/nginx/sbin/nginx –t
正常情况的信息输出:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
1.3.6 nginx几个常见命令¶
/usr/local/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/nginx/sbin/nginx -s stop # 停止 Nginx
ps -ef | grep nginx # 查看nginx进程
2 常见问题¶
2.1 出现“登录错误”怎么排查问题¶
登录时出现“登录错误”,请一一排查:
- WeBASE-Node-Manager服务是否启动成功,
- WeBASE-Node-Manager的数据库是否正常,
- nginx代理是否存在错误。
2.2 登录页面的验证码加载不出来¶
进入
webase-node-mgr
目录下,执行bash status.sh
检查服务是否启动,如果服务没有启动,运行bash start.sh
启动服务;如果服务已经启动,按照如下修改日志级别
webase-node-mgr/conf/application.yml
#log config logging: level: com.webank.webase.node.mgr: debug
webase-node-mgr/conf/log/log4j2.xml
<Loggers> <Root level="debug"> <AppenderRef ref="asyncInfo"/> <AppenderRef ref="asyncErrorLog"/> </Root> </Loggers>
重启服务
bash stop.sh && bash start.sh
重启服务后,检查日志文件
log/WeBASE-Node-Manager.log
。- 检查是否有异常信息。如果有异常信息,根据具体的异常信息检查环境配置,或者通过搜索引擎进行排查。
2.3 为什么输入正确的验证码显示验证码错误¶
登录验证码有效时间为五分钟,五分钟后验证码失效,登录会出现“验证码错误” 。
2.4 交易解码解不出来¶
将该交易所属的合约上传到合约管理,并编译一次,下一笔调用合约的交易触发后即可成功解码。
2.5 交易审计异常交易和异常合约怎么消除¶
- 将发送交易的账户在私钥管理中添加成公钥用户,那么该用户所发的交易将审计成正常交易;
- 将部署该合约的账户在私钥管理中添加成公钥用户,那么该用户所部署的合约将审计成正常合约。
签名服务¶
概要介绍¶
功能介绍¶
本系统为签名服务子系统。功能:管理公私钥、对数据进行签名。
国密支持¶
WeBASE-Sign v1.2.2+已支持 国密版FISCO-BCOS,使用WeBASE v1.2.2及以上版本
本系统同时支持国密与非国密,分别提供了ECDSA与国密两类接口,可生成/管理ECDSA和国密公私钥用户,可对数据进行国密或非国密的签名
部署说明¶
2. 拉取代码¶
执行命令:
git clone https://github.com/WeBankFinTech/WeBASE-Sign.git
# 若因网络问题导致长时间下载失败,可尝试以下命令
git clone https://gitee.com/WeBank/WeBASE-Sign.git
进入目录:
cd WeBASE-Sign
3. 编译代码¶
方式一:如果服务器已安装Gradle,且版本为Gradle-4.10或以上
gradle build -x test
方式二:如果服务器未安装Gradle,或者版本不是Gradle-4.10或以上,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
构建完成后,会在根目录WeBASE-Sign下生成已编译的代码目录dist。
4. 数据库初始化¶
#登录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. 修改配置¶
(1)进入dist目录
cd dist
dist目录提供了一份配置模板conf_template:
根据配置模板生成一份实际配置conf。初次部署可直接拷贝。
例如:cp conf_template conf -r
(2)修改配置(根据实际情况修改):
vi conf/application.yml
server:
# 本工程服务端口,端口被占用则修改
port: 5004
context-path: /WeBASE-Sign
spring:
datasource:
# 数据库连接信息
url: jdbc:mysql://127.0.0.1:3306/webasesign?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8
# 数据库用户名
username: "dbUsername"
# 数据库密码
password: "dbPassword"
driver-class-name: com.mysql.cj.jdbc.Driver
constant:
# aes加密key(16位),如启用,各互联的子系统的加密key需保持一致
aesKey: EfdsW23D23d3df43
5. 服务启停¶
在dist目录下执行:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh
备注:服务进程起来后,需通过日志确认是否正常启动,出现以下内容表示正常;如果服务出现异常,确认修改配置后,重启提示服务进程在运行,则先执行stop.sh,再执行start.sh。
...
Application() - main run success...
接口说明¶
1. 新增用户接口¶
1.1. 新增ECDSA/国密用户接口¶
接口描述¶
根据传入的encryptType
值,新增ECDSA或国密公私钥用户。
接口URL¶
http://localhost:5004/WeBASE-Sign/user/newUser?signUserId={signUserId}&appId={appId}&encryptType={encryptType}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2 | 应用编号 | appId | String | 64 | 是 | 用于标志用户的应用编号,仅支持数字字母下划线 |
3 | 加密类型 | encryptType | Integer | 否 | 默认为0,0: ECDSA, 1: 国密 | |
4 | 是否返回私钥 | returnPrivateKey | boolean | 否 | 默认false,true时返回aes加密的私钥 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/newUser?signUserId={signUserId}&appId={appId}&encryptType=0
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 是 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi |
2)数据格式
a.请求正常返回结果
ECDSA用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "",
"description": null,
"encryptType": 0
}
}
国密用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_222",
"appId": "group_02",
"address": "0x0bc3465986845864fc1646dedf2dd892c0fe11be",
"publicKey": "0xd09d4efe3c127898186c197ae6004a9b40d7c7805fc7e31f7c4a835a4b9cf4148155cbd6dfcf3e5fd84acf1ea55c26b5a9b05d118b456738be2becf0e667c0d6",
"privateKey": "",
"description": null,
"encryptType": 1
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303001,
"message": "user of this sign user id is already exists",
"data": null
}
1.2. 导入私钥用户接口¶
接口描述¶
导入私钥到Sign,与新增私钥类似
接口URL¶
http://localhost:5004/WeBASE-Sign/user/newUser
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 私钥 | privateKey | String | 是 | 通过Base64加密后的私钥内容(编码前私钥为BigInteger的HexString十六进制字符串) | |
2 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
3 | 应用编号 | appId | String | 64 | 是 | 用于标志用户的应用编号,仅支持数字字母下划线 |
4 | 加密类型 | encryptType | Integer | 否 | 默认为0,0: ECDSA, 1: 国密 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/newUser
{
//privateKey编码前原文为: 3d1a470b2e7ae9d536c69af1cc5edf7830ece5b6a97df0e9441bab9f7a77b131
"privateKey": "M2QxYTQ3MGIyZTdhZTlkNTM2YzY5YWYxY2M1ZWRmNzgzMGVjZTViNmE5N2RmMGU5NDQxYmFiOWY3YTc3YjEzMQ==",
"signUserId": "user_222",
"appId": "app_222",
"encryptType": 0
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 否 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi |
2)数据格式
a.请求正常返回结果
ECDSA用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "", //不返回私钥
"description": null,
"encryptType": 0
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303001,
"message": "user of this sign user id is already exists",
"data": null
}
2. 查询用户接口¶
2.1 根据userId查询用户¶
接口描述¶
根据用户编号查询用户信息。
接口URL¶
http://localhost:5004/WeBASE-Sign/user/{signUserId}/userInfo
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2 | 是否返回私钥 | returnPrivateKey | boolean | 否 | 默认false,true时返回aes加密的私钥 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/{signUserId}/userInfo
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 是 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi |
2)数据格式
a.请求正常返回结果
ECDSA用户:
{
"code": 0,
"message": "success",
"data": {
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "",
"description": null,
"encryptType": 0
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303002,
"message": "user does not exist",
"data": null
}
3. 私钥用户管理接口¶
3.1. 停用私钥用户¶
接口描述¶
通过修改私钥用户的status
状态值来停用私钥用户;停用后,其他接口将不返回被停用的私钥用户
接口URL¶
http://localhost:5004/WeBASE-Sign/user
调用方法¶
HTTP DELETE
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user
{
"signUserId": "user_111"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success"
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 303002,
"message": "user does not exist",
"data": null
}
4. 用户列表接口¶
4.1. 根据appId查询用户列表(分页)¶
接口描述¶
根据传入的appId
值,查询所有所有属于该appId的用户信息列表。
接口URL¶
http://localhost:5004/WeBASE-Sign/user/list/{appId}/{pageNumber}/{pageSize}
调用方法¶
HTTP GET
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 应用编号 | appId | String | 是 | 用于标志用户的应用编号 | |
2 | 页码 | pageNumber | Integer | 是 | 页码,同时为空则返回全部 | |
3 | 页大小 | pageSize | Integer | 是 | 页大小,同时为空则返回全部 | |
4 | 是否返回私钥 | returnPrivateKey | boolean | 否 | 默认false,true时返回aes加密的私钥 |
2)数据格式
http://localhost:5004/WeBASE-Sign/user/list/group_01/1/5
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | List | 是 | ||
3.1 | 用户编号 | signUserId | String | 是 | ||
3.2 | 应用编号 | appId | String | 是 | ||
3.3 | 私钥信息 | privateKey | String | 是 | ||
3.4 | 账户地址 | address | String | 是 | ||
3.5 | 公钥 | publicKey | toHexString | 是 | ||
3.6 | 描述 | description | String | 是 | ||
3.7 | 加密类型 | encryptType | Integer | 是 | 0: ECDSA, 1: guomi | |
4 | 总量 | totalCount | Long | 否 | 数据总量 |
2)数据格式
a.请求正常返回结果
ECDSA用户列表:
{
"code": 0,
"message": "success",
"data": [
{
"signUserId": "user_111",
"appId": "group_01",
"address": "0x2df87ff79e8c85a318c00c82ee76e2581fbab0a8",
"publicKey": "0x1befc9824623dfc2f1541d2fc1df4bc445d9dd26816b0884e24628881d5bb572bf7dfd69520d540adc2d16d295df954d9c34bef4381dbc207942fcbf43c7d622",
"privateKey": "",
"description": null,
"encryptType": 0
}
],
"totalCount": 1
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 103001,
"message": "system error",
"data": null
}
5. 数据签名接口¶
5.1. ECDSA/国密数据签名接口¶
接口描述¶
指定用户通过ECDSA/国密SM2对数据进行签名。
接口URL¶
http://localhost:5004/WeBASE-Sign/sign
调用方法¶
HTTP POST
请求参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 用户编号 | signUserId | String | 64 | 是 | 私钥用户的唯一业务编号,仅支持数字字母下划线 |
2 | 请求数据 | encodedDataStr | String | 是 | 十六进制String类型,使用java-sdk的Numeric.toHexString(byte[] input)方法将编码数据转换成HexString |
2)数据格式
http://localhost:5004/WeBASE-Sign/sign
{
"signUserId": "user_111",
"encodedDataStr": "0xba001"
}
响应参数¶
1)参数表
序号 | 中文 | 参数名 | 类型 | 最大长度 | 必填 | 说明 |
---|---|---|---|---|---|---|
1 | 返回码 | code | String | 是 | 返回码信息请附录1 | |
2 | 提示信息 | message | String | 是 | ||
3 | 返回数据 | data | Object | 是 | ||
3.1 | 签名数据 | signDataStr | String | 是 |
2)数据格式
a.请求正常返回结果
{
"code": 0,
"message": "success",
"data": {
"signDataStr": "1c3f59a48593b66de4c57fe99f9c429811aa2dc9b495823cd99faa3e72b4a4d02e04bb7c3da6390a17adc00b0e740293c6306229a26a0c0cf2974581880d19e57b"
}
}
b.异常返回结果示例(信息详情请参看附录1)
{
"code": 203009,
"message": "encoded data string must be hex string",
"data": null
}
6. 其他接口¶
附录¶
1. 返回码信息列表¶
Code | message | 描述 |
---|---|---|
0 | success | 正常 |
103001 | system error | 系统异常 |
103002 | param valid fail | 参数校验失败 |
203003 | param exception | 参数校验异常 |
203004 | sign user id cannot be blank | signUserId不可为空 |
203005 | invalid sign user id, only support letter and digit | signUserId不正确,仅支持数字字母下划线 |
203006 | app id cannot be blank | appId不可为空 |
203007 | app id invalid, only support letter and digit | appId不正确,仅支持数字字母下划线 |
203008 | encrypt type should be 0 (ecdsa) or 1 (guomi) | encryptType仅支持0或1 |
203009 | encoded data string must be hex string | encodedDataStr仅支持十六进制String |
303001 | user is already exists | 用户已存在 |
303002 | user does not exist | 用户不存在 |
303003 | privateKey is null | 用户私钥为空 |
303004 | privateKey decode fail | 私钥解码失败 |
303005 | privateKey format error | 私钥格式错误 |
303006 | privateKey not support transfer | 私钥不支持传输 |
升级说明¶
WeBASE-Sign升级的兼容性说明,请结合WeBASE-Sign Changelog进行阅读
WeBASE-Sign升级的必须步骤:
- 备份已有文件或数据,下载新的安装包(可参考安装包下载)
- 使用新的安装包,并将旧版本yml已有配置添加到新版本yml中;可通过
diff aFile bFile
命令对比新旧yml的差异 - 查看签名服务升级文档中对应版本是否需要修改数据表,若不需要升级则跳过
3.1 若需要升级数据表,首先使用
mysqldump
命令备份数据库 3.2 按照升级文档指引,操作数据表 bash stop.sh && bash start.sh
重启
各个版本的具体修改可参考下文
v2.0.0-rc1¶
附录¶
1. 安装问题¶
1.1 Java部署¶
此处给出简单步骤,供快速查阅。更详细的步骤,请参考官网。
② 配置环境变量¶
- 修改/etc/profile
sudo vi /etc/profile
- 在/etc/profile末尾添加以下信息
JAVA_HOME=/nemo/jdk1.8.0_181
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH==.:$JAVA_HOME/lib
export JAVA_HOME CLASSPATH PATH
- 重载/etc/profile
source /etc/profile
③ 查看版本¶
java -version
1.2. 数据库部署¶
此处以Centos安装MariaDB为例。MariaDB数据库是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。MariaDB完全兼容 MySQL,包括API和命令行。其他安装方式请参考MySQL官网。
① 安装MariaDB¶
- 安装命令
sudo yum install -y mariadb*
- 启停
启动:sudo systemctl start mariadb.service
停止:sudo systemctl stop mariadb.service
- 设置开机启动
sudo systemctl enable mariadb.service
- 初始化
执行以下命令:
sudo mysql_secure_installation
以下根据提示输入:
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
② 授权访问和添加用户¶
- 使用root用户登录,密码为初始化设置的密码
mysql -uroot -p -h localhost -P 3306
- 授权root用户远程访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
- 创建test用户并授权本地访问
mysql > GRANT ALL PRIVILEGES ON *.* TO 'test'@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql > flush PRIVILEGES;
安全温馨提示:
- 例子中给出的数据库密码(123456)仅为样例,强烈建议设置成复杂密码
- 例子中root用户的远程授权设置会使数据库在所有网络上都可以访问,请按具体的网络拓扑和权限控制情况,设置网络和权限帐号
③ 测试连接和创建数据库¶
- 登录数据库
mysql -utest -p123456 -h localhost -P 3306
- 创建数据库
mysql > create database webasesign;
3. 配置文件解析¶
- 配置文件解析
参数 | 默认值 | 描述 |
---|---|---|
server.port | 5004 | 当前服务端口 |
server.context-path | /WeBASE-Sign | 当前服务访问目录 |
server.tomcat.max-threads | 200 | tomcat最大线程数 |
server.tomcat.max-connections | 10000 | tomcat最大连接数 |
spring.cache.type | simple | Spring缓存模式 |
spring.datasource.driver-class-name | com.mysql.cj.jdbc.Driver | mysql驱动 |
spring.datasource.url | jdbc:mysql://127.0.0.1:3306/webasesign | mysql连接地址 |
spring.datasource.username | dbUsername | mysql账号 |
spring.datasource.password | dbPassword | mysql密码 |
mybatis.mapperLocations | classpath:mapper/*.xml | mybatis的xml路径 |
logging.config | classpath:log/log4j2.xml | 日志配置文件目录 |
constant.aesKey | EfdsW23D23d3df43 | webase服务的aes秘钥 |
constant.aesPattern | CBC | AES加密模式 |
constant.keepAliveRequests | 100 | 访问服务的请求存活数 |
constant.syncUsrCacheTaskFixedDelay | 10000 | 同步缓存的私钥间隔时间(ms) |
constant.supportPrivateKeyTransfer | true | 是否允许导出私钥 |
WeBASE社区文章¶
区块链教程 | 使用WeBASE进行“两阶段交易”¶
作者:黎宁
作为一个友好的、功能丰富的区块链中间件平台, WeBASE致力于提高区块链开发者的运维与管理效率。在新近发布的 WeBASE v1.5.2 中,一大优化是提供了获取交易编码的接口,更方便用户使用”两阶段交易”。
“两阶段交易”是什么?“两阶段交易”是指分成两个步骤发送交易,即对交易编码并签名、将交易提交到链上这两个阶段:
- 第一阶段:构造并获取交易编码值,并通过私钥对交易编码值签名;
- 第二阶段:发送交易,也就是将已签名的编码值发送到链上。
在WeBASE v1.5.2中,我们在WeBASE-Front节点前置服务中增加了获取交易编码值的功能。该接口可以返回未签名的交易编码值,也可以返回通过WeBASE-Front本地私钥或WeBASE-Sign私钥签名后的交易编码值。获得已签名的编码值后,用户直接调用前置服务的提交交易接口即可完成“两阶段交易”。
以下演示,我们通过WeBASE-Front节点前置服务接口获取交易编码值,并通过FISCO-BCOS Java-SDK对编码值进行签名,最后通过接口提交交易来加深对“两阶段交易”的了解。
|前期准备¶
部署HelloWorld合约¶
在发起交易之前,首先要确保在链上部署一个可调用的合约。这里以WeBASE-Front “合约仓库-工具合约”中的 “HelloWorld” 合约为例,部署一份 HelloWorld 合约。 我们在 WeBASE-Front 的合约IDE中编译一份 HelloWorld 合约并完成部署操作,如下图所示:
获得合约地址、合约ABI等信息后,我们根据 WeBASE-Front 的接口文档指引,调用获取交易编码接口。
查看接口文档¶
两阶段交易中,第一步交易编码并签名可以通过 WeBASE-Front 的 /trans/convertRawTxStr/withSign
接口构造一个已签名的交易体,接口文档简介如下:
值得一提的是,调用 /trans/convertRawTxStr/withSign
接口时:
- 如果传入了 signUserId 非空,则返回的交易体编码值是通过signUserId对应私钥签名后的交易体编码值。
- 如果传入的 signUserId 为空,则返回的是未签名的交易体编码值,开发者也可以通过JAVA-SDK用私钥对该值签名。
获取已签名的交易编码值后,就可以进行第二步的提交交易操作了。
在 WeBASE-Front 中,我们可以通过 /trans/signed-transaction
接口,将已签名的交易体编码值,完成交易上链并获得交易回执。
上述各个接口的调用方法都可以在 WeBASE-Front 的接口文档中找到(https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Front/interface.html)。
|结合WeBASE-Front接口进行“两阶段交易”¶
获取交易编码值¶
下面以 WeBASE-Sign 签名的获取交易编码接口( /trans/convertRawTxStr/withSign
)为例,获取未签名的交易编码值。
我们可以访问 WeBASE-Front 的 Swagger 进行接口调用(如,http://localhost:5002/WeBASE-Front/swagger-ui.html),找到Swagger接口列表中的”transaction interface”交易接口一栏,点开 /trans/convertRawTxStr/withSign 即可。
在文章开头我们提到,“两阶段交易”的第一阶段是交易编码并通过私钥对编码值签名。
因此,我们调用接口时传入的 “signUserId” 为空字符串,接口将返回未签名的交易编码值,稍后我们再通过 Java-SDK 手动对编码值签名。在调用 /trans/convertRawTxStr/local 接口时同理,user地址字段为空字符串时也会返回未签名的交易编码值。
我们以调用HelloWorld合约的 “set” 方法为例,按接口文档填入对应参数。
首先,点开Swagger中的 /trans/convertRawTxStr/withSign 接口,再填入参数包括合约ABI、合约地址、函数名及函数入参、群组ID和WeBASE-Sign的私钥用户ID signUserId,点击”Try it out”输入参数,删除不必要的字段。注意,其中signUserId为空字符串。
点击”Execute”即可发起调用,获得未签名的交易编码值。接口返回值为:
拿到未签名的交易编码值之后,我们接下来通过 Java-SDK 对编码值进行签名。
对交易编码值签名¶
下面我们使用 FISCO-BCOS Java-SDK 加载私钥,对上文获取的未签名交易编码值进行签名操作,并根据 RawTransaction 交易体再次编码,得到最终签名后的交易编码值。
public void testSign(TransactionEncoderService encoderService, RawTransaction rawTransaction) {
// 未签名的交易编码值
String encodedTransaction = "0xf8a9a001b41b2cc71fe0bf0450f1fa4d820209b6686a8f226d217be0bc51cd9fc4a020018405f5e100820204941f2dfecfd75b883b51762aef6326d3ae9ad5230180b8644ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033132330000000000000000000000000000000000000000000000000000000000010180";
// 私钥
String privateKey = "0x123";
// ECDSA 加密套件
CryptoSuite cryptoSuite = new CryptoSuite(CryptoType.ECDSA_TYPE);
// 对待签名的编码值作哈运算
String hashMessageStr = cryptoSuite.hash(encodedTransaction);
System.out.println("hashMessageStr: " + hashMessageStr);
// 创建私钥对
CryptoKeyPair myKeyPair = cryptoSuite.createKeyPair(privateKey);
// 对交易编码值签名
SignatureResult signedTx = cryptoSuite.sign(hashMessageStr, myKeyPair);
// 获得最终签名后的交易编码值
byte[] signedTransaction = encoderService.encode(rawTransaction, signedTx);
// 转十六进制字符串
String signedTransactionStr = Numeric.toHexString(signedTransaction);
System.out.println("signedTransactionStr: " + signedTransactionStr);
}
提交交易¶
有了已签名的交易编码值后,我们可以调用 /trans/signed-transaction
接口,将该交易发到链上,获得交易回执。这里我们继续使用 Swagger 调用该接口。
提交请求后,接口返回了交易的回执。可以根据交易回执判断交易是否执行成功。
当看到返回的交易回执中显示 status 为 0x0,也就意味着交易执行成功了。
|交易编码接口源码解析¶
WeBASE-Front 源码中,位于 transaction 包里的 TransService 包含了对交易编码并签名的具体代码。
获取交易编码值¶
我们找到 createRawTxEncoded() 方法,该方法通过合约函数的ABI,合约函数的函数名 funcName 和合约函数入参 funcParam 等参数构造了 Function 实例,并通过FunctionEncoder 将 Function 实例进行编码得到字符串 encodedFunction(代码中的 cryptoSuite 是国密或非国密的加密套件,可用于计算哈希、创建私钥对、签名等)。
// 构造Function实例
Function function = new Function(funcName, contractFunction.getFinalInputs(),
contractFunction.getFinalOutputs());
// 编码Function
FunctionEncoder functionEncoder = new FunctionEncoder(cryptoSuite);
String encodedFunction = functionEncoder.encode(function);
下面使用 convertRawTx2Str() 方法,该方法主要负责构造 RawTransaction 交易体。
构造 RawTransaction 需要传入一个随机数和从节点获取当前的 BlockLimit 值(避免重复提交交易)、合约地址和上文获得的 encodedFunction 等参数。
// 构造交易体
BigInteger randomId = new BigInteger(250, new SecureRandom());
BigInteger blockLimit = web3j.getBlockLimit();
RawTransaction rawTransaction =
RawTransaction.createTransaction(randomId, Constants.GAS_PRICE,
Constants.GAS_LIMIT, blockLimit, contractAddress, BigInteger.ZERO, encodedFunction,
new BigInteger(Constants.chainId), BigInteger.valueOf(groupId), "");
// 编码交易体RawTransaction
TransactionEncoderService encoderService = new TransactionEncoderService(cryptoSuite);
byte[] encodedTransaction = encoderService.encode(rawTransaction, null);
对交易编码值签名¶
对交易编码值签名前,WeBASE-Front 中会根据传入的 user 字段和 isLocal 字段判断:
- 如果 user 字段为空,则将 encodedTransaction 转为十六进制后返回。该值就是第一阶段未签名的交易编码值。
- 如果 user 字段非空, isLocal 字段为 true,则 user 为 WeBASE-Front 本地的用户私钥,通过本地私钥对交易编码值 encodedTransaction 签名。注意,签名前还需对 encodedTransaction 进行一次哈希运算后再签名。
- 如果 user 字段非空, isLocal 字段为 false,则 user 为 WeBASE-Sign 托管私钥的signUserId,通过签名服务对交易体编码值 encodedTransaction 签名。注意,此处签名前没有对 encodedTransaction 进行哈希,而是直接转为十六进制发到签名服务,签名服务拿到该值后再做哈希运算并签名返回结果。
下面展示的代码为 isLocal 字段为 false,user 字段非空,其值为 signUserId 的交易编码值签名逻辑。
我们将交易编码值 encodedTransaction 转十六进制后,传到签名服务进行签名,得到了 String 格式的签名结果 signDataStr ,将签名结果反序列化,得到了签名结果 SignatureResult。同时,通过 TransactionEncoderService 将签名结果和上文构造的 RawTransaction 实例进行编码,最终可得到十六进制的已签名的交易编码值 signResultStr 。
// encodedTransaction转十六进制
String hashMessageStr = Numeric.toHexString(encodedTransaction);
// 通过WeBASE-Sign签名
EncodeInfo encodeInfo = new EncodeInfo(user, hashMessageStr);
String signDataStr = keyStoreService.getSignData(encodeInfo);
// 反序列化签名结果
SignatureResult signData = CommonUtils.stringToSignatureData(signDataStr, cryptoSuite.cryptoTypeConfig);
// 加入签名结果,再次编码
byte[] signedMessage = encoderService.encode(rawTransaction, userSignResult);
// 转为十六进制
String signResultStr = Numeric.toHexString(signedMessage);
至此,获取交易编码,对交易编码签名交易体,并对编码值签名的过程就完成了。
值得一提的是,提交交易后获得的交易哈希 TransHash 值是通过对签名交易体编码值进行哈希计算得到的,有了交易哈希,也可以在提交交易后,直接根据交易哈希到链上查询交易回执。
// 通过CryptoSuite实例计算signResultStr的交易哈希值
String transHash = cryptoSuite.hash(signResultStr);
WeBASE贡献指南¶
欢迎,提前感谢你的帮助和支持!
如果你是第一次贡献,只需按照以下简单步骤操作即可。我们将以修改WeBASE-Node-Manager为例子给你介绍。
如果你的电脑上尚未安装 git, 请按照这个 安装指引 进行安装。
Clone代码仓库¶
接下来,将复制后的代码仓库克隆到你的电脑上。点击图示中的绿色按钮,接着点击复制到剪切板按钮(将代码仓库地址复制下来)
随后打开命令行窗口,敲入如下 git 命令:
git clone "刚才复制的 url 链接"
“刚才复制的 url 链接”(去掉双引号)就是复制到你账户名下的代码仓库地址。获取这链接地址的方法请见上一步。
git clone https://github.com/"你的 Github 用户名"/WeBASE-Node-Manager.git
‘你的 Github 用户名’ 指的就是你的 Github 用户名。这一步,你将复制你账户名下的 WeBASE-Node-Manager 这个代码仓库克隆到你的本地电脑上。
代码修改¶
cd WeBASE-Node-Manager
vim XXX
Commit修改¶
git commit -am "一个伟大改进"
提出 Pull Request 将你的修改供他人审阅¶
前往 Github 你的代码仓库,你会看到一个 Compare & pull request
的按钮。点击该按钮。
接着再点击 Create pull request
按钮,正式提交 pull request。
提交的改动经过审核,会合入到仓库。合并后,你会收到电子邮件通知。
更多开源项目¶
All the project addresses participated and established by WeBank Blockchain are collected.
汇集了微众银行参与和建立的所有区块链项目地址。
FISCO-BCOS 适用于金融行业的区块链底层平台¶
git地址:https://github.com/FISCO-BCOS
gitee地址:https://gitee.com/FISCO-BCOS
文档地址: https://fisco-bcos-documentation.readthedocs.io/
WeBASE 区块链中间件平台¶
git地址:https://github.com/WeBankBlockchain/WeBASE
gitee地址:https://gitee.com/WeBank/WeBASE
文档地址:https://webasedoc.readthedocs.io/
Liquid 智能合约编程语言软件¶
git地址:https://github.com/WeBankBlockchain/liquid
gitee地址:https://gitee.com/WeBankBlockchain/liquid
文档地址: https://liquid-doc.readthedocs.io/