zoukankan      html  css  js  c++  java
  • Spring Boot 整合 Fisco Bcos(部署、调用区块链合约)

    简介

    在上一节,介绍了Spring Boot 整合 Fisco BCOS的最最基础的案例(SpringBoot成功连接Fisco BCOS,并访问其节点网络 --> 文章链接)。

    本节,咱们继续介绍Spring Boot 整合 Fisco BCOS的最最重要的技术点:部署、调用区块链合约(基于上一节的工程案例)。

    主要流程

    --> 1、合约开发(省略,因为是案例演示,直接使用 Fisco BCOS自带的 HelloWorld合约即可,默认已包含的get、set方法)
    --> 2、合约编译(需要编译成java文件,才能在Spring Boot工程中使用)
    --> 3、Spring Boot配置合约(将编译好的合约文件,配置到Spring Boot工程中)
    --> 4、合约调用的功能实现
    --> 5、功能测试

    1、合约开发

    Fisco BCOS 默认自带了一些合约参考案例,我们就不用自己开发了(原因是比较懒,能不做的就要坚持不做),直接使用HelloWorld.sol即可:

    看一下该合约的代码实现,只包含了一个变量,以及该变量的get、set方法(现阶段不用考虑solidity语法,相信有过编程经验的同学都能看得懂):

    2、合约编译

    合约HelloWorld.sol想在SpringBoot中使用,需要先将合约文件进行编译,得到.java文件。
    编译合约,最简单的方式是通过 Fisco BCOS提供的Console控制台程序进行编译,
    官方文档:--> 请参考:第四步. 准备智能合约
    比较简单,此处不再复述。

    注意:如果是自己开发的合约,需要先将合约拷贝到 ~/fisco/console/contracts/solidity目录下,再执行编译合约的命令。
    编译成功后,可以在/contracts/sdk/java/org/com/fisco/目录中找到编译后的java文件 :

    其中,HelloWorld.java 就是我们需要的文件。

    3、Spring Boot配置合约

    将HelloWorld.java拷贝到SpringBoot工程中,注意:在应用中所放的位置要与我们设定的包名相同(即:编译后存放java文件的目录结构):

    这样就算配置好了,接下来我们直接编码调用合约就可以了~

    4、合约调用的功能实现

    BcosController完整代码:
    package com.qxc.demo_bcos.controller;
    
    import org.com.fisco.HelloWorld;
    import org.fisco.bcos.sdk.BcosSDK;
    import org.fisco.bcos.sdk.client.Client;
    import org.fisco.bcos.sdk.client.protocol.response.BlockNumber;
    import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
    import org.fisco.bcos.sdk.model.TransactionReceipt;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.web.bind.annotation.*;
    
    /**
     * Bcos 演示案例:
     * 齐行超
     * 2022-01-04
     */
    @RestController
    public class BcosController {
        private BcosSDK bcosSDK;
        private Client client;
        private HelloWorld helloWorld;
    
        private void initSDK() throws Exception {
            System.out.println("-----init BcosSDK:------");
            @SuppressWarnings("resource")
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:fisco-config.xml");
            System.out.println("-----init config ok------");
            bcosSDK = context.getBean(BcosSDK.class);
            System.out.println("-----init BcosSDK ok------");
            // 为群组1初始化client
            client = bcosSDK.getClient(Integer.valueOf(1));
            System.out.println("-----init client ok------");
            // 向群组1部署HelloWorld合约
            CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair();
            helloWorld = HelloWorld.deploy(client, cryptoKeyPair);
            System.out.println("-----deploy HelloWorld ok------");
        }
    
        @GetMapping("/test")
        public String test() {
            System.out.println("-----test------");
            return "this is bcos demo";
        }
    
        @GetMapping("/block")
        public String getBlockNumber() throws Exception {
            System.out.println("-----getBlockNumber------");
            if(bcosSDK == null){
                initSDK();
            }
            if(bcosSDK == null || client == null){
                System.out.println("-----init BcosSDK failed------");
                return "-----init BcosSDK failed----";
            }
            BlockNumber blockNumber = client.getBlockNumber();
            return "block number is : " + blockNumber.getBlockNumber().toString();
        }
    
        @GetMapping("/get")
        public String getHelloworld() throws Exception {
            System.out.println("-----getHelloworld------");
            if(bcosSDK == null){
                initSDK();
            }
            if(bcosSDK == null || helloWorld == null){
                System.out.println("-----init BcosSDK failed------");
                return "-----init BcosSDK failed----";
            }
            // 调用HelloWorld合约的get接口
            String getValue = helloWorld.get();
            System.out.println("-----call HelloWorld get success------:" + getValue);
            return getValue;
        }
    
        @GetMapping("/set")
        public String setHelloworld(@RequestParam(value="val",required = false,defaultValue = "default val")String val) throws Exception {
            System.out.println("-----setHelloworld------");
            if(bcosSDK == null){
                initSDK();
            }
            if(bcosSDK == null || helloWorld == null){
                System.out.println("-----init BcosSDK failed------");
                return "-----init BcosSDK failed----";
            }
            // 调用HelloWorld合约的set接口
            TransactionReceipt receipt = helloWorld.set(val);
            System.out.println("-----call HelloWorld get success------:" + receipt.getMessage());
            return "setHelloworld success";
        }
    }
    
    

    代码中除了合约的调用,还有BCOS SDK初始化等功能,对应的技术讲解请在上一节中查看,本节不再复述哈--> 文章链接

    5、功能测试

    我这边有两台电脑:
    电脑1:本地的Mac电脑,没有区块链环境,只是用于SpringBoot工程的开发;
    电脑2:阿里云上的CentOS服务器,配置了区块链环境,合约部署、编译、SpringBoot工程的jar包运行都是在该电脑上;

    大家可根据自己的电脑环境,对比着进行功能测试即可。

    5.1、编译SpringBoot工程,生成jar包:

    5.2、发送到服务器上运行:

    5.3、在mac电脑上远程访问服务端程序(也可在服务端通过curl自己访问自己):

    测试get:

    测试set:

    再测试get:

    测试块高(我这边反复set了几次,块高已累计到9了 ):

    总结

    至此,Spring Boot 整合 Fisco Bcos(部署、调用区块链合约)的案例讲解已结束。
    Fisco Bcos 的使用还是很简单的,如果有问题大家可以直接查询官方技术文档,也欢迎留言讨论,咱们共同学习、共同进步,哈哈~~。

  • 相关阅读:
    行业基本面量化之商业银行
    [茶思]另类数据及其在投资中的应用
    [茶思]机器学习与宏观基本面方法在债券定价中的应用
    [宏观追踪]美国2020年2月
    [饭想]可转债市场的发展趋势
    [读论文]谷歌搜索量与个人投资者交易行为
    [读论文]基金评级及其激励
    [读论文]懒价格
    [宏观追踪]中国2020年2月
    虚拟机nat-网络认知-更正(vmware 的nat规则设置完网关,虚拟机设置自己网络就完事了。物理机相当于双网卡 物理和vmware8,8只是为了物理机xshell连接虚拟机,禁用了虚拟机照样上网)
  • 原文地址:https://www.cnblogs.com/qixingchao/p/15762978.html
Copyright © 2011-2022 走看看