springboot整合fisco

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.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接口来进行对区块链的连接

你可能感兴趣的:(区块链,区块链,java,spring,boot)