WeBankBlockchain-SmartDev 技术文档¶
什么是 WeBankBlockchain-SmartDev?
区块链技术在经历了十余年的发展历程以后,渐呈“燎原之势”,不断在各行业落地生根。但同时,从技术角度看,区块链应用开发仍然有着较高的门槛,存在不少痛点,在应用开发各个环节上的用户体验有待提升。
WeBankBlockchain-SmartDev应用开发组件的初衷是全方位助力开发者高效、敏捷地开发区块链应用。SmartDev包含了一套开放、轻量的开发组件集,覆盖智能合约的开发、调试、应用开发等环节,开发者可根据自己的情况自由选择相应的开发工具,提升开发效率。
设计目标
- 轻量解耦 所有的开发组件都是可独立使用。
- 一站式 覆盖了智能合约的研发、编译、区块链应用开发,旨在全方位助力区块链应用开发的所有环节。
- 简洁易用 致力于提供简洁的使用体验,让用户轻松上手。
组件简介
- SmartDev-Contract 智能合约库
solidity智能合约代码库。包含基础类型、数据结构、通用功能、上层业务等智能合约库。用户可根据实际需求进行参考、复用。
- SmartDev-SCGP (Solidity Compiler Gradle Plugin) 智能合约编译插件
将solidity智能合约代码编译为Java代码的gradle插件,可以编译项目中的智能合约,生成对应的Java文件,并自动拷贝到对应包目录下。
- SmartDev-Scaffold 应用开发脚手架
基于配置的智能合约文件,自动生成应用项目的脚手架代码,包含了智能合约所对应的实体类、服务类等内容,帮助用户只需要修改和编写较少量的代码,即可实现一个应用,大大简化了智能合约开发。
重要
FISCO-BCOS 2.0与3.0对比、JDK版本、WeBankBlockChain-SmartDev及其他子系统的 兼容版本说明
智能合约库¶
简介
智能合约库包含了基础类型、数据结构、通用功能、上层业务等智能合约库。用户可根据实际需求进行参考、复用。
包含功能
- 基础类型层
- 数据结构层
- 常用工具层
- 通用功能层
- 上层业务层
组件介绍¶
背景¶
智能合约与区块链的结合,被认为是“区块链2.0”的核心技术特征,极大地扩展了区块链的业务场景。solidity是首个区块链与智能合约技术融合所出现的主流的智能合约编程语言,拥有广泛的影响力。
但是,现有的solidity生态还不成熟,用户体验一般,集中体现为:语法特性简陋、类库支持匮乏、debug功能薄弱、实现安全的智能合约代码成本和难度高…… 这些痛点限制了solidity语言进一步地推广,也限制了区块链DAPP的落地。
为了帮助solidity开发者提升开发体验,避免重复造轮子,旨在提供一个通用、强大、安全、灵活的智能合约库,我们开发并开源了WeBankBlockchain-SmartDev-Contract。欢迎开发者朋友体验并参与共建,一起打造一个更好用的工具库。
简介¶
WeBankBlockchain-SmartDev-Contract智能合约库包含了基础类型、数据结构、通用功能、上层业务等智能合约库。用户可根据实际需求进行参考、复用。
代码结构¶
智能合约库涵盖了从基础类型到上层业务的常见代码,用户可根据实际需要进行参考、复用。智能合约库的结构如下:
快速开始¶
环境要求¶
依赖软件 | 说明 | 备注 |
---|---|---|
Solidity | 0.4.25 | |
Git | 下载需要使用Git |
重要
FISCO-BCOS 2.0与3.0对比、JDK版本、WeBankBlockChain-SmartDev及其他子系统的 兼容版本说明
如何获取¶
通过github下载源码:
curl -LO https://github.com/WeBankBlockchain/SmartDev-Contract/releases/download/V1.2.0-alpha/WeBankBlockchain-SmartDev-Contract.V1.2.0-alpha.zip
下载成功后,手动或用命令行解压压缩包:
unzip SmartDev-Contract*.zip
注解
- 如果因为网络问题导致长时间无法下载,请尝试:git clone https://gitee.com/WeBankBlockchain/SmartDev-Contract.git
具体使用方式请参考下文章节中的详细的API。
智能合约详细说明¶
基础类型层¶
库 | 功能 | 说明 | API |
---|---|---|---|
LibSafeMathForUint256Utils | 数学运算 | 加减乘除、幂、最大值最小值、平均值等 | API |
LibSafeMathForFloatUtils | 浮点数运算 | 提供了浮点型的相关计算操作,且保证数据的正确性和安全性,包括加法、减法、乘法、除法等操作 | API |
LibConverter | 整型转换操作 | 和各数据类型之间的转换等 | API |
LibString | 字符串操作 | 取长度、判断起始终止、查找子父、求子串、拼接、比较、大小写转换等 | API |
LibAddress | 地址操作 | 和各数据类型之间的转换;合约地址判断等 | API |
LibArrayForUint256Utils | 数组操作 | 排序、查找、去重、拼接等 | API |
Lib2DArrayForUint256 | 数组操作 | 提供了Uint256二维数组的相关操作,包括增加新元素,删除元素,修改值,查找值,合并扩展数组等操作 | API |
LibBits | 位操作 | 提供了位操作方法,例如按位非、移位、取前/后n位等方法 | API |
数据结构层¶
库 | 功能 | 说明 | API |
---|---|---|---|
LibMaxHeapUint256 | 堆 | 最大堆相关操作,取最值、插入、删除等 | API |
LibMinHeapUint256 | 堆 | 最小堆相关操作,取最值、插入、删除等 | API |
LibStack | 栈 | 提供栈相关操作,如进栈、出栈等 | API |
LibQueue | 队列 | 单向队列相关操作,入队、出队等 | API |
LibDeque | 队列 | 双向队列相关操作,入队、出队等 | API |
LibAddressSet | address类型集合 | 集合操作,增删改查等 | API |
LibBytes32Set | bytes32类型集合 | 提供了存储Bytes32类型的Set数据结构,支持包括add, remove, contains, getAll等 | API |
LibBytesMap | 映射 | 映射操作,存、取、移除等 | API |
LibLinkedList | 双向链表 | 链表相关操作 | API |
LibSingleList | 单向链表 | 包括链表更新、查询、迭代等 | API |
DataTable | 模拟数据库表的实现 | 提供了模拟row、table等实现 | API |
Map | 模拟映射的实现 | 提供了基于bytes32主键、自定义类型值的可迭代、可查询的映射 | API |
LibMerkleTree | 默克尔树实现 | 提供了默克尔树的生成和验证方法 | API |
通用功能层¶
库 | 功能 | 说明 | API |
---|---|---|---|
Table | CRUD合约 | 提供CRUD体验 | CRUD |
Crypto | 密码学 | 国密哈希、验签、VRF等 | API |
LibCryptoHash | 内置密码相关的函数 | keccak256、sha3、ripemd160等 | API |
LibDecode | 验签 | 验证签名等功能等 | API |
proxy | 代理模式 | 代理执行即代理模式的实现 | API |
internalFunction | 内置相关的函数 | 包括block,tx相关等 | API |
常用工具层¶
库 | 功能 | 说明 | API |
---|---|---|---|
DateTimeContract | 时间戳解析 | 基于时间戳计算当前的日期 | API |
DGHV | 同态加密 | 一种基于智能合约的全同态加密方法 | API |
FiatShamirZK | 同态加密 | 一种零知识证明协议方法 | API |
RBAC | 基于角色的权限管理 | RBAC | API |
RoleOperation | 角色操作 | RoleOperation | API |
whiteList | 白名单操作 | 白名单管理的实现 | API |
MathAdvance | 数学运算 | 开方,平方,对数,幂 | API |
LibAscii | asc码转换 | asc码转换 | API |
上层业务层¶
库 | 功能 | 说明 | 文档 |
---|---|---|---|
Evidence | 存证 | 存证场景相关操作,上传、审批、修改、删除等 | API |
evidence_plus | 存证 | 存证合约 Plus 版本 | API |
MarriageEvidence | 婚姻证明 | 结婚证书合约实例 | API |
redpacket | 发红包 | 红包发放的场景 | API |
SimplePoint | 积分 | 简单的积分场景 | API |
RewardPoint | 积分 | 积分场景相关操作,发行、转移等 | API |
bill | 金融票据 | 可以发布票据、对票据进行背书、验证背书、拒绝背书等操作 | API |
CarbonFrugalEvidence | 共享充电积分能量存证合约 | 积分场景相关操作,发行、转移等 | API |
Traceability | 商品溯源 | 实现商品溯源的案例 | API |
BookShares | 股权簿记系统 | 实现公司股权簿记的案例 | API |
Chattel | 金融动产 | 实现金融动产案例 | API |
SharedBikes | 共享单车 | 实现共享单车的案例 | API |
GovOffice | 政府办公 | 实现政府办公的案例 | API |
智能合约编译插件¶
简介
合约编译插件用于将工程中的solidity编译为java合约。用户在完成简单的配置后,在项目工程下运行该插件,插件会自动从合约目录读取solidity文件并编译为java合约,自动拷贝到业务工程下的对应包中。整个过程既不需要安装控制台,也省去了拷贝动作。
组件介绍¶
背景¶
在开发Java智能合约应用时,需要首先将solidity智能合约代码转换为Java合约代码。通常,开发者需要通过sol2java.sh等控制台工具,将solidity合约生成出调用该合约java工具类。
上述步骤的体验与用户开发Java智能合约的应用体验割裂。为此,我们提供了WeBankBlockchain-SmartDev-SCGP智能合约编译插件,通过这种gradle插件的方式,在编译阶段即可实现solidity编译Java工具类的功能,省去了手动安装控制台、拷贝文件、了解shell脚本的步骤,大大简化了应用开发流程。
简介¶
WeBankBlockchain-SmartDev-SCGP智能合约编译插件是一款gradle插件。可以编译项目中的solidity智能合约,生成对应的Java文件,并自动拷贝到对应包目录下。
使用方式对比¶
对于同样基于gradle来构建的应用开发项目,在原先基于控制台的编译方式下,用户不仅需要安装控制台这一组件,编译流程也相对繁复,需要拷贝solidity文件到控制台,编译合约后,还需要将java合约拷贝到本地。
但如果采用合约编译插件,在完成轻量级的一次性配置后,用户只需在项目工程下运行该插件,插件即会自动从合约目录读取solidity文件并编译为java合约,并会自动拷贝到业务工程下的对应包中。整个过程既不需要安装控制台,也省去了拷贝动作。流程对比如下:
实现原理解析¶
Solc程序提取¶
在SolcJ jar包中存放了Solc的可执行文件包,需要从中提取中对应平台的二进制程序包。
下文以windows系统为例,Solc.exe用于将智能合约编译为abi和bin。Solc.exe目前被存放在SolcJ jar包中。而且对于国密,还有一个国密的solcJ-gm jar包。这些jar包被内嵌在插件中。现在需要把两个solc.exe都拷贝出来。
具体的提前过程如下:
- 通过java的类加载器读取solcJ jar包二进制输入流。
- 将该solcJ jar包拷贝到本地文件系统中。
- 通过java自带的jar api打开本地solcJ jar包
- 将solc.exe拷贝到本地文件系统中。
- 对于国密版jar包,也重复上述流程。
Solc编译¶
Solc程序执行需要指定智能合约的输入目录,还有编译产物的输出目录。这两样信息需要从插件的配置里取得。
- 读取项目工程中build.gradle中指定的智能合约输入目录,如果该项未配置,则取默认值src/main/contracts
- 读取项目工程中的输出目录,如果未配置,则取默认值src/main
- 将上述信息拼接成solc命令行启动命令
- 通过java自带命令,启动solc进程
- 各个合约的编译输出物将被拷贝到输出路径,例如abi会被存放在src/main/abi目录下,bin会被存放在src/main/bin目录下。
Java拼接¶
Java合约用于部署、调用智能合约。为部署合约,一个java合约包含合约的二进制数据(bin);为调用合约,java合约需要包含各种方法,这些方法对应abi中记录的合约方法和参数。现在需要根据abi和bin来生成java合约。
- 读取项目工程中build.gradle中指定的java包名,如果该项未配置,则报错
- 读取先前的abi和bin数据到内存
- 创建一个空的java文件,文件名取自abi,例如HelloWorld.abi,就生成HelloWorld.java
- 类生成。其包名为先前配置中的包名。然后拼接public class HelloWorld,
- 字段生成。生成字段BINARY和SMBINARY,分别对应合约的bin、国密bin文件。
- 方法生成。读取abi,根据每一个合约方法的名字和参数,在java中生成对应的method。
快速开始¶
前置依赖¶
依赖软件 | 说明 | 备注 |
---|---|---|
Java | >= JDK[1.8] | |
Solidity | >= 0.4.25 | |
Git | 下载安装包需要使用Git | |
Gradle | >=6.0.1 |
重要
FISCO-BCOS 2.0与3.0对比、JDK版本、WeBankBlockChain-SmartDev及其他子系统的 兼容版本说明
插件配置¶
业务方需要在build.gradle中按如下方式引入插件。这段代码直接放在build.gradle首部:
buildscript {
repositories {
mavenCentral()
maven { url "http://maven.aliyun.com/nexus/content/groups/public/"}
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
mavenLocal()
}
dependencies {
classpath 'com.webank:solc-gradle-plugin:1.0.2-SNAPSHOT'
//默认编译0.8.11.0版本,如果想编译0.4.25版本,请添加下述依赖
//classpath 'org.fisco-bcos:solcJ:0.4.25.0'
//默认编译0.8.11.0版本,如果想编译0.6.10.0版本,请添加下述依赖
//classpath 'org.fisco-bcos:solcJ:0.6.10.0'
//默认编译0.8.11.0版本,如果想编译0.5.2.0版本,请添加下述依赖
//classpath 'org.fisco-bcos:solcJ:0.5.2.0'
}
}
apply plugin: 'solc-gradle-plugin'
然后如下进行配置。如果要生成java合约,还需要通过pkg选项配置java合约所属包名
solc{
pkg = 'org.example.contracts'
}
插件的完整配置如下:
配置项 | 必选 | 说明 |
---|---|---|
pkg | 如果指定onlyAbiBin为false,则必须设置。否则无需设置 | java合约包名 |
contracts | 否 | 智能合约文件路径,默认为src/main/contracts |
output | 否 | 编译输出路径,默认为src/main |
onlyAbiBin | 否 | 是否只输出abi和bin默认false |
selector | 否 | 默认为空,选择所有合约;若选择指定合约,可填所需合约文件名称,按逗号分隔,例如A.sol,B.sol |
编译合约¶
进入java工程:
cd solc-plugin-example
执行编译:
gradle solc
编译过后,会发现abi、bin、smbin、java合约已经被拷贝到项目中src/main中:
- abi:编译生成的abi
- bin:二进制文件,包含国密
- java:java合约
常见问题¶
solc-gradle-plugin找不到¶
如果业务工程中遇到下述错误:
Plugin id 'solc-gradle-plugin' not found
可尝试刷新依赖:
gradle solc --refresh-dependencies
如果还是失败,可从源码安装。
下载代码:
git clone https://github.com/WeBankBlockchain/SmartDev-SCGP.git
或
git clone https://gitee.com/WeBankBlockchain/SmartDev-SCGP.git
安装插件:
cd SmartDev-SCGP
gradle install
出现类似下面字样即为成功:
应用开发脚手架¶
简介
应用开发脚手架用于一键式生成DAPP应用开发工程,从而降低应用开发的难度。用户将自己的合约导入脚手架,即可生成对应的SpringBoot工程,里面已经包含了DAO层代码。用户可基于该模板快速开发自己的Dapp。
组件介绍¶
背景¶
完整的区块链应用开发,除了智能合约开发外,后台开发也不可或缺。
后台开发又包括项目建立、引入依赖、配置代码编写、模型类编写、服务类编写、业务逻辑编写等步骤,具体的步骤可参考开发智能合约应用。这些步骤相对繁琐,影响了开发的效率。例如,我们要为每个合约函数去编写交易构造与推送的代码;甚至,要为每个合约函数的入参编写相应模型类。
分析上述过程,以上步骤存在一定的规律性,可通过脚手架的方式降低重复的工作量,帮助开发者快速、敏捷地开发智能合约应用。因此,我们提供了智能合约脚手架,用于一键式生成DAPP应用开发工程,从而降低应用开发的难度。用户将自己的合约导入脚手架,即可生成对应的应用开发模板工程,包含了对应的POJO类、服务类等,用户可基于此直接开发dapp web项目。
简介¶
智能合约脚手架用于一键式生成DAPP应用开发工程,从而降低应用开发的难度。用户将自己的合约导入脚手架,即可生成对应的应用开发工程,里面已经包含了DAO(Data Access Object)代码,用户可基于此直接开发dapp项目。
生成原理¶
合约函数参数BO类的生成¶
智能合约的ABI记录了每个函数的输入参数,而脚手架希望为每个函数的参数生成一个Java POJO类,这个POJO类的字段对应该函数的参数列表。
生成的步骤如下:
- 读取合约ABI文件,遍历里面的每一个函数,包含函数名、函数参数等信息。
- 针对当前遍历到的函数,如果该函数不需要参数,则无需生成java类;如果需要参数,则取ABI中的参数信息并进行下一步
- 通过javapoet框架创建一个空类,类名遵照[合约名]+[函数名]+InputBO的规则,例如HelloWorldSetInputBO。
- 遍历参数列表,每个参数转换为java类的字段,其中字段名采用参数名;字段类型由参数类型按固定规则转换而来,该规则用于将每个参数的类型信息(基于solidity语言)转换为java类型,例如uint256转换为BigInteger。
合约Service类的生成¶
Solidity每一个合约,均希望产生一个Java Service类,用户像使用DAO类一样使用这个类,完成与区块链的交互。这个Service类的例子:
public class HelloWorldService {
public static final String ABI = org.example.demo.contracts.HelloWorld.ABI;
public static final String BINARY = org.example.demo.contracts.HelloWorld.BINARY;
public static final String SM_BINARY = org.example.demo.contracts.HelloWorld.BINARY;
private String address;
private Client client;
AssembleTransactionProcessor txProcessor;
public HelloWorldService(String address, Client client) throws Exception {
this.client = client;
this.txProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(this.client, this.client.getCryptoSuite().getCryptoKeyPair());
this.address = address;
}
public HelloWorldService(Client client) throws Exception {
this.client = client;
this.txProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor(this.client, this.client.getCryptoSuite().getCryptoKeyPair());
this.address = this.txProcessor.deployAndGetResponse(ABI,this.client.getCryptoType()==0?BINARY:SM_BINARY).getContractAddress();
}
public TransactionResponse set(HelloWorldSetInputBO input) throws Exception {
return this.txProcessor.sendTransactionAndGetResponse(this.address, ABI, "set", input.toArgs());
}
public CallResponse get() throws Exception {
return this.txProcessor.sendCall(this.client.getCryptoSuite().getCryptoKeyPair().getAddress(), this.address, ABI, "get", Arrays.asList());
}
}
实现的步骤如下:
- 使用javapoet框架生成空Service类,它的名称为[合约名]+Service,例如HelloWorldService
- 创建Service类的字段。通过向javapoet类中填入这些字段的类型、名称的信息。
- 创建构造方法。通过向javapoet类中填入构造函数中所需语句即可。
- 创建静态方法。通过向javapoet类中填入构造函数中所需语句即可。
- 创建合约调用方法。先遍历合约ABI的每个函数,向javapoet写入方法定义,其中:
a) 方法名与合约函数同名
b) 方法参数类型采用第一节中生成的BO类名
c) 如果该函数的不包含view、pure、constant修饰符,则方法体填入
this.txProcessor.sendTransactionAndGetResponse
。 否则,方法体填入:this.txProcessor.sendCall
。
快速开始¶
前置依赖¶
在使用本组件前,请确认已安装相关依赖软件,清单如下:
依赖软件 | 说明 | 备注 |
---|---|---|
Java | >= JDK[1.8] | 64bit |
Solidity | 0.4.25.1 0.5.2.0 0.6.10.0 0.8.11.0 | |
Git | 下载安装包需要使用Git | |
Gradle | 大于6 小于7 | 使用gradle7会报错 |
Maven | 如果要生成maven工程则需要 |
重要
FISCO-BCOS 2.0与3.0对比、JDK版本、WeBankBlockChain-SmartDev及其他子系统的 兼容版本说明
下载脚手架¶
从github获取脚手架:
git clone https://github.com/WeBankBlockchain/SmartDev-Scaffold.git
切换到V3分支,以便适配最新的fisco bcos:
git checkout origin/V3
注解
- 如果因为网络问题导致长时间无法下载,请尝试:git clone https://gitee.com/WeBankBlockchain/SmartDev-Scaffold.git
进入目录:
cd SmartDev-Scaffold/tools
tools目录包含了执行环境,其结构为:
├── tools
│ ├── contracts
│ ├──|── HelloWorld.sol
│ ├── config.ini
│ ├── run.sh
│ ├── run.bat
其中:
- contracts目录用于存放solidity合约文件,脚手架后续会读取该目录下的合约以生成对应的业务工程。请删除该目录下的默认合约,并将自己的业务合约拷贝到该目录下。
- config.ini是启动相关配置。
- run.sh和run.bat分别是unix和windows下的启动脚本。
配置脚手架¶
合约配置¶
请删除contracts目录下的默认合约,并将自己的业务合约拷贝到该目录下。
生成配置¶
可以在config.ini中做生成配置,如下:
### 项目名称
artifact=demo
### 组名称
group=org.example
### 所支持的合约列表,默认为空表示选择所有合约
selector=
### solidity编译器版本,可选0.4.25.1, 0.5.2.0, 0.6.10.0, 0.8.11.0
compiler=0.8.11.0
### 工程生成类型,可以设置为gradle或maven
type=gradle
### gradle版本,支持5.6.1、gradle 6各版本。暂不支持gradle7。如果您选择了maven项目,系统会自动忽略此选项
gradleVersion=6.3
关于selector,如果需要只为指定合约进行编译输出,可以输入所需要的合约列表,按逗号分隔。例如下述代码中,只为AccountController,RoleController这两个合约:
selector=AccountController,RoleController
运行脚手架¶
可以直接启动脚本(unix系统为例)
chmod +x run.sh
bash run.sh
运行成功后,会在tools目录下得到一个基于SpringBoot的项目工程:
├─contracts
├─run.sh
├─run.bat
└─demo
其中生成项目的具体内容如下(以gradle项目为例)
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── settings.gradle
└── src
├── main
│ ├── contracts
│ │ └── HelloWorld.sol
│ ├── java
│ │ └── org
│ │ └── example
│ │ └── demo
│ │ ├── Application.java
│ │ ├── config
│ │ │ ├── BcosConfig.java
│ │ │ ├── ContractConfig.java
│ │ │ ├── SdkBeanConfig.java
│ │ │ └── SystemConfig.java
│ │ ├── constants
│ │ │ ├── ContractConstants.java
│ │ ├── model
│ │ │ ├── CommonResponse.java
│ │ │ └── bo
│ │ │ └── HelloWorldSetInputBO.java
│ │ ├── service
│ │ │ └── HelloWorldService.java
│ └── resources
│ ├── abi
│ │ └── HelloWorld.abi
│ ├── application.properties
│ ├── bin
│ │ ├── ecc
│ │ │ └── HelloWorld.bin
│ │ └── sm
│ │ └── HelloWorld.bin
│ └── conf
└── test
└── java
├── org
│ └── example
│ └── demo
│ └── Demos.java
└── org.example.demo
其中:
- config目录包含Bean配置类
- service目录中包含了智能合约访问的Service类,一个类对应一个合约。
- bo目录包含了合约函数输入参数的封装POJO类。
- src/main/resource/conf目录用于存放证书信息
- Demos.java包含了私钥生成、部署合约等示例代码
如果您生成了maven项目,则不会有gradle相关内容,而会包含pom、mvnw、mvnw.cmd等文件。
DAPP开发¶
这里介绍DAPP开发过程,以前面生成的demo项目工程为例。
部署合约¶
使用控制台部署HelloWorld合约
证书拷贝¶
请将配置文件拷贝到生成工程的conf目录或src/main/resources/conf目录下。
配置连接节点¶
请修改application.properties,该文件包含如下信息:
### Java sdk configuration
cryptoMaterial.certPath=conf
network.peers[0]=127.0.0.1:20200
#network.peers[1]=127.0.0.1:20201
### System configuration
system.groupId=1
system.hexPrivateKey=
### Contract configuration
contract.helloWorldAddress=
### Springboot configuration
server.port=8080
server.session.timeout=60
banner.charset=UTF-8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
其中:
- java sdk configuration配置部分与javasdk配置一致。
- 其中需要用户将network.peers[0]=127.0.0.1:20200更换成实际的链节点监听地址。
- System configuration包含群组、私钥等配置。
- system.hexPrivateKey是16进制的私钥明文。如果为空,会采用上述java sdk配置对应的私钥,若上述sdk也未配置,则随机生成一个
- Contract confguration包含合约配置,用户需要更换成前面部署过的合约地址。
补全业务¶
一个完整的DAPP应包含至少三层架构,本示例补全一个Controller。 在org.example.controller下新建一个Controller类,如下:
package org.example.demo.controller;
import org.example.demo.model.bo.HelloWorldSetInputBO;
import org.example.demo.service.HelloWorldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("hello")
public class HelloController {
@Autowired
private HelloWorldService service;
@GetMapping("set")
public String set(@RequestParam("n") String n) throws Exception{
HelloWorldSetInputBO input = new HelloWorldSetInputBO(n);
return service.set(input).getTransactionReceipt().getTransactionHash();
}
@GetMapping("get")
public String get() throws Exception{
return service.get().getValues();
}
}
运行jar包¶
如果您生成的是gradle项目,则执行:
cd demo
gradle bootJar
cd dist
如果您生成的是maven项目,则执行:
cd demo
mvn package
cd target
会生成demo-exec.jar,可执行此jar包:
java -jar demo-exec.jar
随后,可在浏览器内输入:
http://127.0.0.1:8080/hello/set?n=hello
返回示例:
0x1c8b283daef12b38632e8a6b8fe4d798e053feb5128d9eaf2be77c324645763b
http://127.0.0.1:8080/hello/get
返回示例:
["hello"]
其他¶
当用户基于生成的项目进行开发时,若需要修改合约,可在项目工程目录下直接编译合约:
cd [demo directory]
gradle solc
新的abi、bin会被刷新到src/main/resources目录下,但相关Service类和BO类并不会被重新生成,需要用户自行修改。
注意,由于目前没有maven编译插件,因此maven工程暂不支持这一步。
更多开源项目¶
更多项目
附录¶
重要
FISCO-BCOS 2.0与3.0对比、JDK版本、WeBankBlockChain-SmartDev及其他子系统的 兼容版本说明
Java安装¶
Ubuntu环境安装Java¶
# 安装默认Java版本(Java 8或以上)
sudo apt install -y default-jdk
# 查询Java版本
java -version
CentOS环境安装Java¶
# 查询centos原有的Java版本
$ rpm -qa|grep java
# 删除查询到的Java版本
$ rpm -e --nodeps java版本
# 查询Java版本,没有出现版本号则删除完毕
$ java -version
# 创建新的文件夹,安装Java 8或以上的版本,将下载的jdk放在software目录
# 从openJDK官网(https://jdk.java.net/java-se-ri/8)或Oracle官网(https://www.oracle.com/technetwork/java/javase/downloads/index.html)选择Java 8或以上的版本下载,例如下载jdk-8u201-linux-x64.tar.gz
$ mkdir /software
# 解压jdk
$ tar -zxvf jdk-8u201-linux-x64.tar.gz
# 配置Java环境,编辑/etc/profile文件
$ vim /etc/profile
# 打开以后将下面三句输入到文件里面并退出
export JAVA_HOME=/software/jdk-8u201-linux-x64.tar.gz
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 生效profile
$ source /etc/profile
# 查询Java版本,出现的版本是自己下载的版本,则安装成功。
java -version