经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
Spring Boot 整合 Fisco Bcos(部署、调用区块链合约)
来源:cnblogs  作者:齐行超  时间:2022/1/17 10:49:48  对本文有异议

简介

在上一节,介绍了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完整代码:
  1. package com.qxc.demo_bcos.controller;
  2. import org.com.fisco.HelloWorld;
  3. import org.fisco.bcos.sdk.BcosSDK;
  4. import org.fisco.bcos.sdk.client.Client;
  5. import org.fisco.bcos.sdk.client.protocol.response.BlockNumber;
  6. import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
  7. import org.fisco.bcos.sdk.model.TransactionReceipt;
  8. import org.springframework.context.ApplicationContext;
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;
  10. import org.springframework.web.bind.annotation.*;
  11. /**
  12. * Bcos 演示案例:
  13. * 齐行超
  14. * 2022-01-04
  15. */
  16. @RestController
  17. public class BcosController {
  18. private BcosSDK bcosSDK;
  19. private Client client;
  20. private HelloWorld helloWorld;
  21. private void initSDK() throws Exception {
  22. System.out.println("-----init BcosSDK:------");
  23. @SuppressWarnings("resource")
  24. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:fisco-config.xml");
  25. System.out.println("-----init config ok------");
  26. bcosSDK = context.getBean(BcosSDK.class);
  27. System.out.println("-----init BcosSDK ok------");
  28. // 为群组1初始化client
  29. client = bcosSDK.getClient(Integer.valueOf(1));
  30. System.out.println("-----init client ok------");
  31. // 向群组1部署HelloWorld合约
  32. CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair();
  33. helloWorld = HelloWorld.deploy(client, cryptoKeyPair);
  34. System.out.println("-----deploy HelloWorld ok------");
  35. }
  36. @GetMapping("/test")
  37. public String test() {
  38. System.out.println("-----test------");
  39. return "this is bcos demo";
  40. }
  41. @GetMapping("/block")
  42. public String getBlockNumber() throws Exception {
  43. System.out.println("-----getBlockNumber------");
  44. if(bcosSDK == null){
  45. initSDK();
  46. }
  47. if(bcosSDK == null || client == null){
  48. System.out.println("-----init BcosSDK failed------");
  49. return "-----init BcosSDK failed----";
  50. }
  51. BlockNumber blockNumber = client.getBlockNumber();
  52. return "block number is : " + blockNumber.getBlockNumber().toString();
  53. }
  54. @GetMapping("/get")
  55. public String getHelloworld() throws Exception {
  56. System.out.println("-----getHelloworld------");
  57. if(bcosSDK == null){
  58. initSDK();
  59. }
  60. if(bcosSDK == null || helloWorld == null){
  61. System.out.println("-----init BcosSDK failed------");
  62. return "-----init BcosSDK failed----";
  63. }
  64. // 调用HelloWorld合约的get接口
  65. String getValue = helloWorld.get();
  66. System.out.println("-----call HelloWorld get success------:" + getValue);
  67. return getValue;
  68. }
  69. @GetMapping("/set")
  70. public String setHelloworld(@RequestParam(value="val",required = false,defaultValue = "default val")String val) throws Exception {
  71. System.out.println("-----setHelloworld------");
  72. if(bcosSDK == null){
  73. initSDK();
  74. }
  75. if(bcosSDK == null || helloWorld == null){
  76. System.out.println("-----init BcosSDK failed------");
  77. return "-----init BcosSDK failed----";
  78. }
  79. // 调用HelloWorld合约的set接口
  80. TransactionReceipt receipt = helloWorld.set(val);
  81. System.out.println("-----call HelloWorld get success------:" + receipt.getMessage());
  82. return "setHelloworld success";
  83. }
  84. }

代码中除了合约的调用,还有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 的使用还是很简单的,如果有问题大家可以直接查询官方技术文档,也欢迎留言讨论,咱们共同学习、共同进步,哈哈~~。

原文链接:http://www.cnblogs.com/qixingchao/p/15762978.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号