Spring?Boot?整合?Fisco?Bcos部署、調(diào)用區(qū)塊鏈合約的案例
本篇文章介紹 Spring Boot 整合 Fisco Bcos 的相關(guān)技術(shù)(合約的調(diào)用)
簡(jiǎn)介
在上一節(jié),介紹了Spring Boot 整合 Fisco BCOS的最最基礎(chǔ)的案例(SpringBoot成功連接Fisco BCOS,并訪問其節(jié)點(diǎn)網(wǎng)絡(luò) --> 文章鏈接)。
本節(jié),咱們繼續(xù)介紹Spring Boot 整合 Fisco BCOS的最最重要的技術(shù)點(diǎn):部署、調(diào)用區(qū)塊鏈合約(基于上一節(jié)的工程案例)。
主要流程
--> 1、合約開發(fā)(省略,因?yàn)槭前咐菔?,直接使?Fisco BCOS自帶的 HelloWorld合約即可,默認(rèn)已包含的get、set方法)
--> 2、合約編譯(需要編譯成java文件,才能在Spring Boot工程中使用)
--> 3、Spring Boot配置合約(將編譯好的合約文件,配置到Spring Boot工程中)
--> 4、合約調(diào)用的功能實(shí)現(xiàn)
--> 5、功能測(cè)試
1、合約開發(fā)
Fisco BCOS 默認(rèn)自帶了一些合約參考案例,我們就不用自己開發(fā)了(原因是比較懶,能不做的就要堅(jiān)持不做??),直接使用HelloWorld.sol即可:

看一下該合約的代碼實(shí)現(xiàn),只包含了一個(gè)變量,以及該變量的get、set方法(現(xiàn)階段不用考慮solidity語法,相信有過編程經(jīng)驗(yàn)的同學(xué)都能看得懂):

2、合約編譯
合約HelloWorld.sol想在SpringBoot中使用,需要先將合約文件進(jìn)行編譯,得到.java文件。
編譯合約,最簡(jiǎn)單的方式是通過 Fisco BCOS提供的Console控制臺(tái)程序進(jìn)行編譯,
官方文檔:--> 請(qǐng)參考:第四步. 準(zhǔn)備智能合約
比較簡(jiǎn)單,此處不再?gòu)?fù)述。
注意:如果是自己開發(fā)的合約,需要先將合約拷貝到 ~/fisco/console/contracts/solidity目錄下,再執(zhí)行編譯合約的命令。
編譯成功后,可以在/contracts/sdk/java/org/com/fisco/目錄中找到編譯后的java文件 :

其中,HelloWorld.java 就是我們需要的文件。
3、Spring Boot配置合約
將HelloWorld.java拷貝到SpringBoot工程中,注意:在應(yīng)用中所放的位置要與我們?cè)O(shè)定的包名相同(即:編譯后存放java文件的目錄結(jié)構(gòu)):

這樣就算配置好了,接下來我們直接編碼調(diào)用合約就可以了~
4、合約調(diào)用的功能實(shí)現(xiàn)

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----";
}
// 調(diào)用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----";
}
// 調(diào)用HelloWorld合約的set接口
TransactionReceipt receipt = helloWorld.set(val);
System.out.println("-----call HelloWorld get success------:" + receipt.getMessage());
return "setHelloworld success";
}
}
代碼中除了合約的調(diào)用,還有BCOS SDK初始化等功能,對(duì)應(yīng)的技術(shù)講解請(qǐng)?jiān)谏弦还?jié)中查看,本節(jié)不再?gòu)?fù)述哈--> 文章鏈接。
5、功能測(cè)試
我這邊有兩臺(tái)電腦:
電腦1:本地的Mac電腦,沒有區(qū)塊鏈環(huán)境,只是用于SpringBoot工程的開發(fā);
電腦2:阿里云上的CentOS服務(wù)器,配置了區(qū)塊鏈環(huán)境,合約部署、編譯、SpringBoot工程的jar包運(yùn)行都是在該電腦上;
大家可根據(jù)自己的電腦環(huán)境,對(duì)比著進(jìn)行功能測(cè)試即可。
5.1、編譯SpringBoot工程,生成jar包:

5.2、發(fā)送到服務(wù)器上運(yùn)行:

5.3、在mac電腦上遠(yuǎn)程訪問服務(wù)端程序(也可在服務(wù)端通過curl自己訪問自己):
測(cè)試get:

測(cè)試set:

再測(cè)試get:

測(cè)試塊高(我這邊反復(fù)set了幾次,塊高已累計(jì)到9了?? ):

總結(jié)
至此,Spring Boot 整合 Fisco Bcos(部署、調(diào)用區(qū)塊鏈合約)的案例講解已結(jié)束。
Fisco Bcos 的使用還是很簡(jiǎn)單的,如果有問題大家可以直接查詢官方技術(shù)文檔,也歡迎留言討論,咱們共同學(xué)習(xí)、共同進(jìn)步,哈哈~~。
到此這篇關(guān)于Spring Boot 整合 Fisco Bcos(部署、調(diào)用區(qū)塊鏈合約)的文章就介紹到這了,更多相關(guān)Spring Boot 整合 Fisco Bcos內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何解決使用restTemplate進(jìn)行feign調(diào)用new HttpEntity<>報(bào)錯(cuò)問題
這篇文章主要介紹了如何解決使用restTemplate進(jìn)行feign調(diào)用new HttpEntity<>報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Spring實(shí)戰(zhàn)之調(diào)用實(shí)例工廠方法創(chuàng)建Bean操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之調(diào)用實(shí)例工廠方法創(chuàng)建Bean操作,結(jié)合實(shí)例形式分析了實(shí)例工廠方法創(chuàng)建Bean相關(guān)配置、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11
IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程)
這篇文章主要介紹了IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程),需要的朋友可以參考下2021-04-04
@JsonProperty和@JSONField注解的區(qū)別解析(最新)
Jackson是一款優(yōu)秀的JSON解析庫(kù),添加了依賴之后就可以使用對(duì)應(yīng)的注解,讓我們能夠自由的將Java對(duì)象和JSON做轉(zhuǎn)換,這篇文章主要介紹了@JsonProperty和@JSONField注解的區(qū)別,需要的朋友可以參考下2024-04-04
Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案
這篇文章主要介紹了Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解
這篇文章主要為大家介紹了java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理的方法
JSR-303 是 JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做 Bean Validation,官方參考實(shí)現(xiàn)是Hibernate Validator,這篇文章主要介紹了springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理,需要的朋友可以參考下2022-09-09
解決IDEA2020.1.2IDEA打不開的問題(最新分享)
由于idea安裝多了某個(gè)jar,點(diǎn)擊出現(xiàn)讀條后閃退情況,接下來通過本文給大家分享解決IDEA2020.1.2IDEA打不開的問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨小編一起看看吧2020-07-07
Java接口的作用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java接口的作用,涉及到接口的規(guī)范相關(guān)知識(shí),需要的的朋友參考下2017-04-04

