FISCO BCOS 搭建区块链,在SpringBoot中调用合约
一、搭建区块链
使用的是FISCO BCOS 和 WeBASE-Front来搭建区块链,详细教程:
https://blog.csdn.net/yueyue763184/article/details/128924144?spm=1001.2014.3001.5501
搭建好能达到下图效果即可:
二、部署智能合约与导出java文件、SDK证书下载
1.创建测试用户,导出pem文件
点击“测试用户”,即可“新增用户”。
点击“导出”,选择.pem文件。
2.编译部署智能合约,导出java文件和SDK证书下载
在“合约IDE”中准备智能合约,新建合约文件,合约名称是Asset。
pragma solidity ^0.4.25;contract Asset {address public issuer;mapping (address => uint) public balances;event Sent(address from, address to, uint amount);constructor() {issuer = msg.sender;}function issue(address receiver, uint amount) public {if (msg.sender != issuer) return;balances[receiver] += amount;}function send(address receiver, uint amount) public {if (balances[msg.sender] < amount) return;balances[msg.sender] -= amount;balances[receiver] += amount;emit Sent(msg.sender, receiver, amount);}}
合约IDE会自动保存的,点击“编译”、“部署”后即可得到合约地址contractAddress。
点击“导出java文件”,一般命名与合约名称相同为Asset;
点击“SDK证书下载”;
得到的文件如下:
三、在SpringBoot项目中调用智能合约
1.首先创建SpringBoot项目
2.在pom文件中导入相关依赖
<!-- web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- test -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
<!-- fisco bcos -->
<dependency><groupId>org.fisco-bcos.java-sdk</groupId><artifactId>fisco-bcos-java-sdk</artifactId><version>2.9.1</version>
</dependency>
3.将下载的相关文件导入对应的文件目录(sdk要先解压)
4.在application.yaml配置文件编写fisco的配置
注意:要将路径和合约地址换成自己的
fisco:nodeList: 192.168.119.138:20201groupId: 1certPath: src\main\resources\sdkcontractAddress:# Asset合约地址(一定要加引号 不然注解@Value会把按照16进制数字进行转换赋值)asset: "0xc6053e4f71cdcf14e31cc1031263cee4e1ac7768"# 测试用户地址account:# 测试用户秘钥地址accountAddress: src\main\resources\account# 测试用户文件地址accountFilePath: src\main\resources\account\buliangshuai_key_0x3a456344e952d0275e5e4af4766abb450d3b45ac.pem
说明:
fisco.nodeList:区块链节点的ip和端口;
fisco.groupId:组ID;
fisco.certPath:证书保存目录;
fisco.contractAddress.asset:合约地址;
fisco.contractAddress.account.accountAddress:测试用户地址;
fisco.contractAddress.account.accountFilePath:测试用户的pem文件地址;
5.编写sdk访问合约方法
在client包中创建2个类,一个是环境配置类ApplicationContext
package com.fisco.bcos.asset.client;import org.fisco.bcos.sdk.BcosSDK;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.config.ConfigOption;
import org.fisco.bcos.sdk.config.exceptions.ConfigException;
import org.fisco.bcos.sdk.config.model.ConfigProperty;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Description: 配置类*/
@Configuration
public class ApplicationContext {@Value("${fisco.nodeList}")private String nodeLists;@Value("${fisco.groupId}")private Integer groupId;@Value("${fisco.certPath}")private String certPath;@Value("${fisco.account.accountFilePath}")private String accountFilePath;@Bean(name = "configProperty")public ConfigProperty defaultConfigProperty() {ConfigProperty property = new ConfigProperty();// 配置cryptoMaterialMap<String, Object> cryptoMaterialMap = new HashMap<>();cryptoMaterialMap.put("certPath", certPath);property.setCryptoMaterial(cryptoMaterialMap);// 配置networkMap<String, Object> networkMap = new HashMap<>();String[] split = nodeLists.split(",");List<String> nodeList = Arrays.asList(split);networkMap.put("peers", nodeList);property.setNetwork(networkMap);// 配置accountMap<String, Object> accountMap = new HashMap<>();accountMap.put("keyStoreDir", "account");accountMap.put("accountAddress", "");accountMap.put("accountFileFormat", "pem");accountMap.put("password", "");accountMap.put("accountFilePath", accountFilePath);property.setAccount(accountMap);//配置 threadPoolMap<String, Object> threadPoolMap = new HashMap<>();threadPoolMap.put("channelProcessorThreadSize", "16");threadPoolMap.put("receiptProcessorThreadSize", "16");threadPoolMap.put("maxBlockingQueueSize", "102400");property.setThreadPool(threadPoolMap);return property;}@Bean(name = "configOption")public ConfigOption defaultConfigOption(ConfigProperty configProperty) throws ConfigException {return new ConfigOption(configProperty);}@Bean(name = "bcosSDK")public BcosSDK bcosSDK(ConfigOption configOption) {return new BcosSDK(configOption);}@Bean(name = "client")public Client getClient(BcosSDK bcosSDK) {// 为群组初始化clientClient client = bcosSDK.getClient(groupId);return client;}@Beanpublic CryptoKeyPair getCryptoKeyPair(Client client) {// 如果有密钥文件 那么每次读取的就不再是随机的CryptoSuite cryptoSuite = client.getCryptoSuite();CryptoKeyPair cryptoKeyPair = cryptoSuite.getCryptoKeyPair();return cryptoKeyPair;}
}
另一个是合约客户端类AssetClient
package com.fisco.bcos.asset.client;import com.fisco.bcos.asset.contract.Asset;
import org.fisco.bcos.sdk.BcosSDK;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.math.BigInteger;@Component
public class AssetClient {@Autowiredprivate BcosSDK bcosSDK;@Autowiredprivate Client client;@Autowiredprivate CryptoKeyPair cryptoKeyPair;@Value("${fisco.contractAddress.asset}")private String contractAddress;/*** 发布资产(条件:当前用户是Asset合约发布者)* @param receiver 接收者地址* @param amount 资产数量*/public void issueAsset(String receiver, BigInteger amount) {Asset asset = Asset.load(contractAddress, client, cryptoKeyPair);asset.issue(receiver, amount, new CallbackResponse());}/*** 发送资产(条件:发送者的账号Balance必须大于等于amount)* @param receiver 接收者地址* @param amount 资产数量*/public void sendAsset(String receiver, BigInteger amount) {Asset asset = Asset.load(contractAddress, client, cryptoKeyPair);asset.send(receiver, amount, new CallbackResponse());}private class CallbackResponse extends TransactionCallback {@Overridepublic void onResponse(TransactionReceipt transactionReceipt) {System.out.println("回调结果:");System.out.println(transactionReceipt.getContractAddress());System.out.println(transactionReceipt.getFrom());System.out.println(transactionReceipt.getGasUsed());System.out.println(transactionReceipt.getRemainGas());System.out.println(transactionReceipt.getStatus());System.out.println(transactionReceipt.getMessage());System.out.println(transactionReceipt.getStatusMsg());}}
}
6.编写测试类调用智能合约函数
首先编写测试类AssetClientTest
package com.fisco.bcos.asset.client;import com.fisco.bcos.asset.AssetDemo1Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.math.BigInteger;@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = AssetDemo1Application.class)
public class AssetClientTest {@Autowiredprivate AssetClient assetClient;@Testpublic void testIssueAsset() throws InterruptedException {String receiver = "0xc6053e4f71cdcf14e31cc1031263cee4e1ac7768";BigInteger amount = new BigInteger("10000");assetClient.issueAsset(receiver, amount);Thread.sleep(5000);System.out.println("发布成功!");}@Testpublic void testSendAsset() throws InterruptedException {String receiver = "0xc6053e4f71cdcf14e31cc1031263cee4e1ac7768";BigInteger amount = new BigInteger("50000");assetClient.sendAsset(receiver, amount);Thread.sleep(5000);System.out.println("发送成功!");}}
测试的步骤:
1)先后执行testIssueAsset
和testSendAsset
测试方法,该测试要保证服务器的20200、20201端口是开放的,命令如下:
firewall-cmd --zone=public --add-port=20201/tcp --permanent # 开放端口
firewall-cmd --zone=public --remove-port=20201/tcp --permanent #关闭端口
firewall-cmd --reload # 配置立即生效
firewall-cmd --zone=public --list-ports # 查看防火墙所有开放的端口
2)执行成功后,在节点控制台的“合约列表”中找到对应的合约,点击“合约调用”,选择balances方法;
结果如下:
以上就是在Fisco区块链上部署智能合约,并通过Java SDK调用智能合约函数的示例.
相关文章:
FISCO BCOS 搭建区块链,在SpringBoot中调用合约
一、搭建区块链 使用的是FISCO BCOS 和 WeBASE-Front来搭建区块链,详细教程: https://blog.csdn.net/yueyue763184/article/details/128924144?spm1001.2014.3001.5501 搭建好能达到下图效果即可: 二、部署智能合约与导出java文件、SDK证…...
面试官:int和Integer有什么区别?
回答思路: 原始数据类型和包装类介绍 主要区别(数据使用内存) 自动装箱、自动拆箱机制和实践原则 回答总结: int 是8种基本数据类型(byte、boolean、char、short、int、long、float、double)之一ÿ…...
MFC常用技巧
MFC常用技巧1、句柄MFC中如何获取窗口的句柄2、字符串CString转char*Unicode下char *转换为CString3、Visual C 64 位迁移的常见问题(数据类型、指针类型的长度问题)4、c - 将_beginthread返回的uintptr_t转换为HANDLE是否安全1、句柄 MFC中如何获取窗口…...
C++ —— 多态
目录 1.多态的概念 2.多态的定义及实现 2.1构成多态的两个硬性条件 2.2虚函数的重写 2.3override和final 3.抽象类 3.1接口继承和实现继承 4.多态原理 4.1虚函数表 4.2原理 4.3静态绑定和动态绑定 5.单继承和多继承体系的虚函数表 5.1单继承体系的虚函数表 5.2多继…...
java agent设计开发概要
agent开发设计 agent 开发的一些心得,适合熟悉agent或者有agent开发需求的同学 1 有个基础的agent,是java 标准的agent。这是agent代码入口 2 设计包结构, 基础agent agent下有plugin,加载plugin可以自己定义一个类加载器 plugin࿱…...
node.js笔记-模块化(commonJS规范),包与npm(Node Package Manager)
目录 模块化 node.js中模块的分类 模块的加载方式 模块作用域 向外共享模块作用域中的成员 向外共享成员 包与npm(Node package Manager) 什么是包? 包的来源 为什么需要包? 查找和下载包 npm下载和卸载包命令 配置np…...
Linux 磁盘坏块修复处理(错误:read error: Input/output error)
当磁盘出现坏块时,你对所关联的文件进行读取时,一般会出现 read error: Input/output error 这样的错误。 反过来讲,当你看到 read error: Input/output error 这种错误时,很大可能就是磁盘出现了坏块问题。 解决步骤:…...
API 面试四连杀:接口如何设计?安全如何保证?签名如何实现?防重如何实现?
下面我们就来讨论下常用的一些API设计的安全方法,可能不一定是最好的,有更牛逼的实现方式,但是这篇是我自己的经验分享. 一、token 简介 Token:访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证,减…...
操作系统题目收录(六)
1、某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为1us。在T时刻就绪队列中有3个进程P1P_1P1、P2P_2P2和P3P_3P3,其在就绪队列中的等待时间、需要的CPU时间和优先权如下表所示。若优先权值大的进程优先获…...
2023年十款开源测试开发工具推荐!
今天为大家奉献一篇测试开发工具集锦干货。在本篇文章中,将给大家推荐10款日常工作中经常用到的测试开发工具神器,涵盖了自动化测试、性能压测、流量复制、混沌测试、造数据等。 1、AutoMeter-API 自动化测试平台 AutoMeter 是一款针对分布式服务&…...
MySQL慢查询分析和性能优化
1 背景我们的业务服务随着功能规模扩大,用户量扩增,流量的不断的增长,经常会遇到一个问题,就是数据存储服务响应变慢。导致数据库服务变慢的诱因很多,而RD最重要的工作之一就是找到问题并解决问题。下面以MySQL为例子&…...
C++学习笔记(四)
组合、继承。委托(类与类之间的关系) 复合 queue类里有一个deque,那么他们的关系叫做复合。右上角的图表明复合的概念。上图的特例表明,queue中的功能都是通过调用c进行实现(adapter)。 复合关系下的构造和…...
【4】深度学习之Pytorch——如何使用张量处理时间序列数据集(共享自行车数据集)
表格数据 表格中的每一行都独立于其他行,他们的顺序页没有任何关系。并且,没有提供有关行之前和行之后的列编码信息。 表格类型的数据是指通过表格的形式表示的数据,它以行和列的方式组织数据。表格中的每一行代表一个数据项,每…...
mulesoft MCIA 破釜沉舟备考 2023.02.10.01
mulesoft MCIA 破釜沉舟备考 2023.02.10.01 1. What is a defining charcateristic of an integration-Platform-as-a-Service(iPaaS)?2. An application deployed to a runtime fabric environment with two cluster replicas is designed to periodically trigger of flow f…...
干货 | PCB拼板,那几条很讲究的规则!
拼板指的是将一张张小的PCB板让厂家直接给拼做成一整块。一、为什么要拼板呢,也就是说拼板的好处是什么?1.为了满足生产的需求。有些PCB板太小,不满足做夹具的要求,所以需要拼在一起进行生产。2.提高SMT贴片的焊接效率。只需要过一…...
笔试题-2023-思远半导体-数字IC设计【纯净题目版】
回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.20应聘岗位:数字IC设计工程师笔试时长:90min笔试平台:牛客网题目类型:填空题(2道),不定项选择题(3道),单选题(2道),问…...
canvas根据坐标点位画图形-canvas拖拽编辑单个图形形状
首先在选中图形的时候需要用鼠标右击来弹出选择框,实现第一个编辑节点功能 在components文件夹下新建右键菜单 RightMenu文件: <template><div v-show"show" class"right-menu" :style"top:this.ypx;left:this.xpx…...
JavaEE 初阶 — 确认应答机制
文章目录确认应答机制(安全机制)1 什么是后发先至问题1 如何解决后发先至问题确认应答机制(安全机制) 确认应答 是实现可靠传输的最核心机制。 这里指的 可靠传输 不是说 100% 可以把消息发给接收方,而是尽力而为&…...
0207 事件
事件监听事件监听版本事件类型事件概念事件在编程时系统内发生的动作或者发生的事情例子点击按钮鼠标经过拖拽鼠标事件监听(注册事件,绑定事件)让程序员检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应…...
SpringBoot整合Swagger
目录 一、swagger介绍 二、springboot集成swagger 1、创建一个springboot-web项目 2、导入相关依赖 3、编写一个Hellow工程 4、配置swagger --->config 5、启动springboot工程 6、配置swagger信息 7、配置swagger扫描接口 8、如何设置Swagger在生产环境中使用&…...
20230210英语学习
Why Do So Many Cats Have White ‘Socks’ on Their Paws? 为什么好多猫咪脚上都“穿着白袜子”? If you see a house cat, the odds are high that it will have white paws, a look that many owners affectionately call "socks."But socks are rar…...
【图像处理OpenCV(C++版)】——4.5 全局直方图均衡化
前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…...
2022年API安全研究报告
目录 导读 2022年API安全风险概况 2022年平均每月遭受攻击的API数量超21万...
【内网安全-横向移动】基于SMB协议-PsExec
目录 一、SMB协议 1、简述: 2、工具: 二、PsExec 1、简述: 2、使用: 1、常用参数: 2、情况: 3、插件 三、PsExec(impacket) 1、简述: 1、impacket࿱…...
whistle 一个神奇的前端调试工具(抓包\代理工具)
在进行前端开发过程中,我们常常需要对一些接口进行处理,以及当后端接口没有弄好需要我们mock一些假数据,针对这些场景,我们就可以使用whistle 来解决。首先,我们要知道能满足我们需求的工具有很多,例如&…...
node.js下载和vite项目创建以及可能遇到的错误
目录 一、node.js的下载 1、去官网下载 节点.js (nodejs.org) 2、下载过程 第一步: 第二步: 第三步: 第四步: 第五步: 二、vite项目的创建(使用的工具是Hbuilder x) 第一步: 出现报错…...
如何使用python画一个爱心
1 问题 如何使用python画一个爱心。 2 方法 桌面新建一个文本文档,文件后缀改为.py,输入相关代码ctrls保存,关闭,最后双击运行。 代码清单 1 from turtle import * def curvemove(): for i in range(200): right(1) …...
1 Flutter UI Container和 Text 和图片组件
一 Text 组件Text 文本组件的一些属性如下body: const Text("this is leonardo fibonacci",// 文本对齐的方式textAlign: TextAlign.center,// 文本方向textDirection: TextDirection.rtl,// 字体显示最大的行数maxLines: 2,// 文字超出屏幕之后的显示方式 ellipsi…...
【Hello Linux】 Linux基础命令(持续更新中)
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的基础命令 Linux基础命令ls指令lsls -als -dls -ils -sls -lls -nls -Fls -rls -tls -Rls -1总结思维导图pwd指令whoami指令…...
记录一下slf4j2打印一直不成功
整理一个之前的老项目问题,发现日志一直打印不出来,本地启动发现了第一个问题日志如下:此处可发现,jar包冲突问题,去掉冲突的jar包即可,此处不做过多赘述。然后发现了重新启动项目,发现jar包冲突…...
浙江做网站的公司有哪些/外贸营销系统
斜杠与反斜杠 2013-11-13 17:32 876人阅读 评论(0) 收藏 举报分类:C/C(121) 斜杠,slash:/反斜杠,backslash:\在Unix中,文件系统用斜杠(slash,/)分…...
自己做黑彩网站/百度快速优化软件排名
NestedScrollingParent:以下简称“NSP”,NestedScrollingChild:以下简称“NSC”,这两个接口是嵌套滑动的精髓,是我们实现嵌套滑动遵守的“规则”。 NOTE:本博文非详细原理篇,原理分析网上资料很…...
网易网站建设的目的/网站建设公司推荐
数学和计算机学院学生会体育部早操管理制度数学与计算机学院体育部早操管理制度书数学与计算机学院体育部二0一三年三月十五长江师范学院数学与计算机学院早操管理制度一、背景根据长江师范学院规定,大一新生在每周周二至周五出早操。做早操可以强身健体,…...
购物网站简介/百度联盟是什么
双亲委派的机制 在java虚拟机中,对class文件采取的加载方式是按需加载,当需要使用时才会将其class文件加载到内存中生成class对象,当加载时,采用的加载方式是双亲委派模式,即是说将请求由父类加载器处理,是…...
网上做效果图网站/合肥网络推广网络运营
有时候看到朋友在公众号里留言,微信公众号有个bug,新留言不提醒。当我看到留言时已经超过了回复时效不能回复了。我就整理了这篇,大家可以利用自带的搜索功能当智能机器人来用啦~~面试类面试中一个暴露能力等级的问题社招面试的架构分析分享一…...