Spring Boot连接Fisco Bcos区块链

使用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.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.2</version>
</parent>
//指定java版本
<properties><java.version>11</java.version>
</properties>

这里的spring boot的spring-boot-starter-parent 依赖版本不要过高,否则会报java 版本的错误,尽量选2.4.2,这个版本是肯定可以的

引用三方工具的依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.fisco-bcos</groupId><artifactId>solcJ</artifactId><version>0.4.25.1</version></dependency>//使用到连接fisco bcos java sdk工具<dependency><groupId>org.fisco-bcos.java-sdk</groupId><artifactId>fisco-bcos-java-sdk</artifactId><version>2.7.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.1.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></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 {@Autowiredprivate FiscoCnfig fiscoConfig;private BcosSDK bcosSDK;@PostConstructpublic 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 {@Autowiredprivate 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;@RestControllerpublic class fiscoController {@Autowiredprivate 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接口来进行对区块链的连接

springboot整合fisco相关推荐

  1. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

  2. es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch

    ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...

  3. springboot整合shiro使用shiro-spring-boot-web-starter

    此文章仅仅说明在springboot整合shiro时的一些坑,并不是教程 增加依赖 <!-- 集成shiro依赖 --> <dependency><groupId> ...

  4. db2 springboot 整合_springboot的yml配置文件通过db2的方式整合mysql的教程

    springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件 先配置MySQL,代码如下 spring: datasour ...

  5. 九、springboot整合rabbitMQ

    springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...

  6. 八、springboot整合Spring Security

    springboot整合Spring Security 简介 Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架.它是保护基于Spring的应用程序的事实标准. Spr ...

  7. 六、springboot整合swagger

    六.springboot整合swagger 简介 swagger 提供最强大,最易用的工具,以充分利用OpenAPI规范. 官网 : https://swagger.io/ 准备工作 pom.xml ...

  8. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

  9. SpringBoot整合RabbitMQ-整合演示

    本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客. 学习路径:https://www.imooc. ...

最新文章

  1. Usage and Idioms——Categories
  2. springmvc3.2+spring+hibernate4全注解方式整合(一)
  3. neutron DVR
  4. TCP之超时重传机制
  5. 从volatile说到i++的线程安全问题
  6. linux——grep 文本过滤器
  7. 奥委会主席巴赫与马云对谈:阿里巴巴能将奥运精神带进科技时代
  8. linux cp和rm命令
  9. MATLAB-1:入门基础
  10. “大龄”程序员的出路
  11. 鸿蒙轻内核M核源码分析:中断Hwi
  12. 推特安卓版漏洞可导致攻击者访问用户私信
  13. c1flexGrid 在单元格中显示图片, 及行号
  14. C语言的结构变量定义规则,嵌入式学习笔记:c语言结构体的定义和使用
  15. 【操作系统】斐讯K2 PSG1218 A2 版本22.6.512.75 刷breed+老毛子固件
  16. Html学习手册(W3CSchool.chm)
  17. 庚子年十月初九——十月十五
  18. contest8 CF614 div2 oox?? oooox ooooo
  19. android rom 刷数据吗,安卓手机如何刷入rom包 安卓机刷入rom包方法
  20. 掌握 Windows 命令行界面:常用 DOS 命令简介

热门文章

  1. 单灶开孔尺寸是多少_燃气灶开孔尺寸是多少?
  2. OMAP3630 Linux I2C总线驱动分析
  3. VBS创建二进制文件的两种方法
  4. Fap-------一款基于.netcore3.0的企业级快速开发框架
  5. 数据透视表数据空白_更改数据透视表中的空白标签
  6. Struts spring ibatis的集成(连载一)---转
  7. 项目管理十大知识领域(九)--- 项目风险管理(过程、输入、工具和技术、输出)
  8. PHP中使用mpdf导出PDF文件以及生成PDF的方法
  9. 刚学会开车时的一些基本注意点,注意事项
  10. 小程序网络错误,切换4G流量,或者切换wifi随机出现