使用spring boot连接Fisco Bcos,在Fisco Bcos的官方提供了Java-Sdk工具用于连接
Java SDK 提供了访问 FISCO BCOS 节点的Java API,支持节点状态查询、部署和调用合约等功能,基于Java SDK可开发区块链应用,目前支持FISCO BCOS 2.0+。
fisco bcos环境的搭建这里就略过了,可上官方文档上进行查看:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest
webase-front 环境的搭建: https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/developer.html
spring boot环境搭建这里也略过, 可以进行百度.
这里使用的IDEA
请确保有fisco bcos环境和spring boot环境才进行下一步:
首先式pom.xml对项目依赖的引用
注: 我的fisco bcos安装在fisco中
//sprin boot项目必须要用到依赖,里面包含jdk版,字符编码和spring boot各种三方工具
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.4.2version>
parent>
//指定java版本
<properties>
<java.version>11java.version>
properties>
这里的spring boot的spring-boot-starter-parent 依赖版本不要过高,否则会报java 版本的错误,尽量选2.4.2,这个版本是肯定可以的
引用三方工具的依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.fisco-bcosgroupId>
<artifactId>solcJartifactId>
<version>0.4.25.1version>
dependency>
//使用到连接fisco bcos java sdk工具
<dependency>
<groupId>org.fisco-bcos.java-sdkgroupId>
<artifactId>fisco-bcos-java-sdkartifactId>
<version>2.7.2version>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.1.1version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.20version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<scope>testscope>
dependency>
dependencies>
先把fisoc bcos的密钥复制到resource下的conf文件
fisco bcos密钥文件地址为: nodes/{ip}/sdk/*
下的所有文件,复制完成后就可以进行下一步
当然也可以通过webase-front 得到密钥文件:
打开浏览器输入webase-front 的url地址: http://ip:5002/WEBASE-Front
在 合约管理 >>> 合约IDE >> 随便打开一个自己写好的智能合约>> SDK证书下载>>选择文件下载位置, 就可以了
引入完成后,就可以写application.yml配置文件
server:
port: 5023
fisco:
cryptoMaterial:
certPath: "conf"
network:
peers:
#改自己ip
- "8.142.75.*:20200"
amop:
# - publicKeys: [ "conf/amop/consumer_public_key_1.pem" ]
# topicName: "PrivateTopic1"
# - password: "123456"
# privateKey: "conf/amop/consumer_private_key.p12"
# topicName: "PrivateTopic2"
account:
keyStoreDir: "account"
# accountFilePath: "conf"
accountFileFormat: "pem"
# accountAddress: "0x"
# password: ""
threadPool:
# channelProcessorThreadSize: "16"
# receiptProcessorThreadSize: "16"
maxBlockingQueueSize: "102400"
读取application中配置好的数据,使用实体类接收,需要用到的注解:
@ConfigurationProperties(prefix = "fisco")
,用于读取application中fisco中配置的数据
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "fisco")
public class FiscoCnfig {
private Map<String, Object> cryptoMaterial;
public Map<String, List<String>> network;
public List<AmopTopic> amop;
public Map<String, Object> account;
public Map<String, Object> threadPool;
}
初始化BcosSDK这个工具类
@Slf4j
@Data
@Component
public class FiscoBcos {
@Autowired
private FiscoCnfig fiscoConfig;
private BcosSDK bcosSDK;
@PostConstruct
public void init() {
ConfigProperty configProperty = loadProperty();
try {
ConfigOption configOption = new ConfigOption(configProperty, CryptoType.ECDSA_TYPE);
bcosSDK = new BcosSDK(configOption);
} catch (ConfigException e) {
log.error("init error: {}", e);
}
}
private ConfigProperty loadProperty() {
ConfigProperty configProperty = new ConfigProperty();
configProperty.setCryptoMaterial(fiscoConfig.getCryptoMaterial());
configProperty.setAccount(fiscoConfig.getAccount());
Map network = fiscoConfig.getNetwork();
configProperty.setNetwork(network);
configProperty.setAmop(fiscoConfig.getAmop());
configProperty.setThreadPool(fiscoConfig.getThreadPool());
return configProperty;
}
}
控制器器类的编写, 在浏览器上显示出区块链的块高
@RestController
public class fiscoController {
@Autowired
private FiscoBcos fiscoBcos;
@RequestMapping("block")
public String Number(){
BcosSDK bcosSDK = fiscoBcos.getBcosSDK();
Client client = bcosSDK.getClient(Integer.valueOf(1));
BlockNumber blockNumber = client.getBlockNumber();
return blockNumber.getBlockNumber().toString();
}
}
接下来就来写springboot项目的启动类,
@SpringBootApplication
public class FiscoApplication {
public static void main(String[] args) {
SpringApplication.run(FiscoApplication.class, args);
}
}
启动spring boot项目后,在浏览器的地址上输入:http:localhost:5023/block就可以看到你区块链上当前块高了
1.编写合约和部署合约
编写智能合约
请确保合约在fisco bcos文件下的 fisco/console/contracts/solidity
目录下
pragma solidity ^0.4.24;
contract structs{
struct Student {
uint256 id;
string name; //姓名
}
Student[] public students;
uint256 public nextId = 1;
//添加一个学生
function addStudent(string memory name)public{
Student memory student = Student({
id: nextId,
name: name
});
students.push(student);
nextId ++;
}
//查找学生
function find(uint256 id)private view returns(uint256){
for(uint256 i = 0; i < students.length; i++){
if(students[i].id == id){
return i;
}
}
revert("User not found");
}
//找到学生基本信息
function read(uint256 id)public view returns(string name){
uint256 i = find(id);
name = students[i].name;
return (name);
}
//删除一个学生
function removeStudent(uint256 id_)public{
uint256 i = find(id_);
delete students[i];
}
//修改一个学生
function update(uint256 id_, string name_)public{
uint256 i = find(id_);
students[i].name = name_;
}
}
部署智能合约
启动fisco bcos的控制台:* 请确保4个节点启动成功
请确保合约在fisco bcos文件下的 fisco/console/contracts/solidity
目录下
进入fisco bcos控制台部署智能合约,
[group:1]> deploy structs
transaction hash: 0x**********************
contract address: 0x************1
[group:1]> call structs 0x************1 addStudent "你好"
transaction hash: 0x**************************************
---------------------------------------------------------------------------------------------
transaction status: 0x0
description: transaction executed successfully
---------------------------------------------------------------------------------------------
Output
Receipt message: Success
Return message: Success
---------------------------------------------------------------------------------------------
Event logs
Event: {}
这里我们只需要拿到 contract address 里的值
2.将写好的智能合约编译成java 文件
.sol
的智能合约需要编译成ABI和BIN文件才能部署至区块链网络上。有了这两个文件即可凭借Java SDK进行合约部署和调用。但这种调用方式相对繁琐,需要用户根据合约ABI来传参和解析结果。为此,控制台提供的编译工具不仅可以编译出ABI和BIN文件,还可以自动生成一个与编译的智能合约同名的合约Java类。这个Java类是根据ABI生成的,帮助用户解析好了参数,提供同名的方法。当应用需要部署和调用合约时,可以调用该合约类的对应方法,传入指定参数即可。使用这个合约Java类来开发应用,可以极大简化用户的代码。:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html
这里有两种方法1.在webase-front
2.通过提供的sol2java.sh将智能合约编译成java文件
一. 打开浏览器输入webase-front 的url地址: http://ip:5002/WEBASE-Front
在 合约管理 >>> 合约IDE >> 随便打开一个自己写好的智能合约>> 导出java文件>>然后填写自己的包名, 就可以了
二.使用fisco bcos提供sol2java.sh将智能合约编译成java文件:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html
请注意webase-front部署的合约在fisco bcos控制台中不能使用,如果是在webase-front部署的合约请到fisco bcos控制台中再部署一次
将编译后的文件放到spring boot项目中src 目录中,webase-front导入的话请注意包名.
3.开始编写使用合约的代码
由于将智能合约编译好java文件,可以稍微看一下这个java文件
这里由智能合约里的一些方法:如智能中有read(uint256 id)对应的java文件中也有这个方法,还有些额外的方法,常用的有deploy()部署和laod()加载
import com.fisco.demo.Bcos.FiscoBcos;
import com.fisco.demo.solidity.Structs;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigInteger;
@RestController
public class fiscoController {
@Autowired
private FiscoBcos fiscoBcos;
@RequestMapping("block")
public String Number() throws ContractException {
// BcosSDK bcosSDK = fiscoBcos.getBcosSDK();
// Client client = bcosSDK.getClient(Integer.valueOf(1));
// BlockNumber blockNumber = client.getBlockNumber();
Client client = fiscoBcos.getClient();
CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair();
Structs structs = Structs.load("0x3ac7be911135837e73198e3e054a26fac0e0ed41",
client, cryptoKeyPair);
BigInteger id = new BigInteger("1");
String name = structs.read(id);
return name;
}
}
启动运行spring boot项目,打开浏览器输入url: http://ip:5023/block 就可以看到浏览器中出现 你好 了
下一节更为简单的一种方法: 使用webase-front 提供的api接口来进行对区块链的连接