天天看點

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

本篇文章介紹 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即可:

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

看一下該合約的代碼實作,隻包含了一個變量,以及該變量的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檔案的目錄結構):

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

這樣就算配置好了,接下來我們直接編碼調用合約就可以了~

4、合約調用的功能實作

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

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包:

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

5.2、發送到伺服器上運作:

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

5.3、在mac電腦上遠端通路服務端程式(也可在服務端通過curl自己通路自己):

測試get:

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

測試set:

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

再測試get:

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

測試塊高(我這邊反複set了幾次,塊高已累計到9了😁 ):

Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)

總結

至此,Spring Boot 整合 Fisco Bcos(部署、調用區塊鍊合約)的案例講解已結束。

Fisco Bcos 的使用還是很簡單的,如果有問題大家可以直接查詢官方技術文檔,也歡迎留言讨論,咱們共同學習、共同進步,哈哈~~。

繼續閱讀