FISCO BCOS 搭建区块链,在SpringBoot中调用合约

2023-10-30

一、搭建区块链

使用的是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:20201
  groupId: 1
  certPath: src\main\resources\sdk
  contractAddress:
    # 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();
        // 配置cryptoMaterial
        Map<String, Object> cryptoMaterialMap = new HashMap<>();
        cryptoMaterialMap.put("certPath", certPath);
        property.setCryptoMaterial(cryptoMaterialMap);

        // 配置network
        Map<String, Object> networkMap = new HashMap<>();
        String[] split = nodeLists.split(",");
        List<String> nodeList = Arrays.asList(split);
        networkMap.put("peers", nodeList);
        property.setNetwork(networkMap);

        // 配置account
        Map<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);

        //配置 threadPool
        Map<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) {
        // 为群组初始化client
        Client client = bcosSDK.getClient(groupId);
        return client;
    }

    @Bean
    public 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 {
    @Autowired
    private BcosSDK bcosSDK;
    @Autowired
    private Client client;
    @Autowired
    private 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 {

        @Override
        public 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 {
    @Autowired
    private AssetClient assetClient;

    @Test
    public void testIssueAsset() throws InterruptedException {
        String receiver = "0xc6053e4f71cdcf14e31cc1031263cee4e1ac7768";
        BigInteger amount = new BigInteger("10000");
        assetClient.issueAsset(receiver, amount);
        Thread.sleep(5000);
        System.out.println("发布成功!");
    }

    @Test
    public void testSendAsset() throws InterruptedException {
        String receiver = "0xc6053e4f71cdcf14e31cc1031263cee4e1ac7768";
        BigInteger amount = new BigInteger("50000");
        assetClient.sendAsset(receiver, amount);
        Thread.sleep(5000);
        System.out.println("发送成功!");
    }

}

测试的步骤:

           1)先后执行testIssueAssettestSendAsset测试方法,该测试要保证服务器的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调用智能合约函数的示例.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FISCO BCOS 搭建区块链,在SpringBoot中调用合约 的相关文章

  • 使用 Jersey Client 忽略自签名 ssl 证书 [重复]

    这个问题在这里已经有答案了 我正在使用 Jersey 客户端库对 jboss 上运行的其余服务运行测试 我使用自签名证书在服务器上正确设置了 https 在本地主机上运行 但是 每当我使用 https url 运行测试时 都会收到以下错误
  • Java 多头中的斐波那契计算显示负值

    我的斐波那契计算器工作正常 但当数字增加时 结果会出现负值 就像它是一个Integer超过其最大值 它正在使用缓存java util Map
  • 如何安装 C++ 的 VOCE?

    我正在尝试安装 VOCE api 它是为 C 和 Java 构建的语音识别 API 这是我第二次使用外部 C 库 也是第一次使用 Java C api 语音链接 http voce sourceforge net http voce sou
  • 使用 Hibernate 或 Spring 打印 DBMS_OUTPUT.put_line

    我想知道 Hibernate 或 Spring 或任何第 3 方库是否提供将 DBMS OUTPUT put line 消息直接打印到 system out 或日志文件的能力 目的是在控制台中同时显示 PLSQL 日志消息和 java 日志
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • 使用 spring security 找不到 AuthenticationProvider

    我一直在尝试使用 x509 证书通过 LDAP 对用户进行身份验证 但似乎无法正常工作 我声明了一个身份验证提供程序 但仍然抛出错误 提示没有提供程序 这是我的调试输出 INFO Initiating Jersey application
  • UnsupportedOperationException:特权进程中不允许使用 WebView

    我在用android sharedUserId android uid system 在我的清单中获得一些不可避免的权利 从 HDMI 输入读取安卓盒子 http eweat manufacturer globalsources com s
  • java“类文件包含错误的类”错误

    我正在尝试制作一个控制台应用程序来测试我的网络服务 我成功部署了一个网络服务http localhost 8080 WS myWS http localhost 8080 WS myWS我用 wsimport 制作了代理类 wsimport
  • Log4j 未使用属性文件找到自定义附加程序

    我正在尝试使用以下 XML 属性文件在 Eclipse 插件项目中配置 log4j 其中包括一个名为 EclipseLoggingAppender 的自定义附加程序
  • 使用 eclipse 配置mockito 时出现问题。给出错误:java.lang.verifyError

    当我将我的mockito库添加到类路径中 并使用一个简单的mockito示例进行测试时 我尝试使用模拟对象为函数add返回错误的值 我得到java lang verifyerror 以下是用于测试的代码 后面是 logcat Test pu
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • 当另一个线程发生事情时从主线程获取数据?

    目前我有一个线程正在运行一个侦听连接的套接字 当它收到连接时 它需要上传在主线程中收集的数据 即从主线程获取数据 但是 我传递了对象的实例 但它从未使用等待连接时收集的数据进行更新 有没有正确的方法来做到这一点 我用谷歌搜索了一下 似乎找不
  • 在Java程序中计算zip文件的md5哈希值

    我有一个 zip 文件 在我的 Java 代码中我想计算 zip 文件的 md5 哈希值 有没有我可以用于此目的的 java 库 一些例子将非常感激 谢谢 几周前我通过这篇文章做到了这一点 http www javalobby org ja
  • spring-boot-starter-web 2.4.4 导入 spring-web 和 spring-webmvc 版本 4.3.12 在 pom 中列为 5.3.5

    我正在使用spring boot starter web我的项目中的版本2 4 4 当我查看其内容时 它清楚地列出了 spring web 和 spring webmvc 5 3 5 版本 但是 由于某种原因 我可以看到这个 spring
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • JBoss 5 截断 base64 cookie 字符串的尾部 =

    从 JBoss 4 升级到 JBoss 5 后 我注意到最烦人的回归 它截断 base64 cookie 值的尾部等号 我花了很长时间才明白问题不是我的代码而是 JBoss 的 我用 google 搜索了一下 发现这是一个已知的问题issu
  • 从 AJP 连接器请求中检索 Shibboleth 属性

    当我在 Apache 上运行 Shibboleth 身份验证时遇到了一个奇怪的问题 当 Tomcat7 在后端运行时 Apache 通过 mod proxy ajp 发送所有内容 Shibboleth 的参数也是如此 In the 文档 h
  • 使用 Tomcat 和 gradle 进行休眠

    免责声明 我是 Java 新手 我正在尝试使用 Tomcat 和 Gradle 设置 Hibernate 构建运行正确 但看起来像persistence xml文件未被读取 我的项目结构如下 build gradle src main ja
  • Spring 和 Hibernate 连接池

    如何使用 Spring 和 Hibernate 配置连接池 Thanks Venu 您可以使用 DBCP 组件

随机推荐

  • 快速熟悉Vue项目

    一 快速梳理大型vue项目整体架构技巧方法总结 首先对于Vue Cli搭建的项目 一定要知道项目的目录结构 如果目录结构都不了解 那一定会很头痛 查看 package json 配置文件 了解项目引用了哪些额外插件和框架 查看 router
  • Keras框架下的猫狗识别(二)

    Tensorflow学习 使用jupyter notebook Keras框架下的猫狗识别 一 模型构建与训练 Tensorflow学习 使用jupyter notebook 前言 一 数据预处理 二 使用步骤 1 引入库 2 定义模型 3
  • 检错纠错码(奇偶校验码 CRC循环冗余校验码 海明码)

    检错与纠错码在计算机中经常被使用 在此对常用的三种检错纠错码做一个介绍 分别是奇偶校验码 CRC循环冗余校验码和海明码 奇偶校验码 通常所说的奇偶校验码指的是一维奇偶校验码 它只能检错 不能纠错 只有二维奇偶校验码具备纠错能力 校验方法 分
  • 面试题:什么是跨域?出现的原因?如何解决跨域问题?

    跨域 浏览器不能执行其他网页的脚步 由浏览器的同源策略造成的 是浏览器对javascript实施的安全限制 无法跨域是浏览器对用户安全的考虑 如果自己写个没有同源策略的浏览器 完全不用考虑跨域问题 同源策略限制 Cookie localSt
  • 文件操作与IO

    目录 一 什么是文件 二 文件的分类 三 Java中的文件操作 四 文件操作案例 一 什么是文件 平时我们锁说到的文件一般指的都是存储在硬盘上的普通文件 形如txt png jpg 等等这些都是普通文件 都存储在硬盘上 而在计算机中 文件可
  • Apifox 生成接口文档 教程与操作步骤

    接口文档自动生成 本文主要介绍使用 apifox 如何生成接口文档 附上详细的使用教程和操作步骤 使用Apifox 的可以自动生成接口文档 本文会给大家介绍下如何使用Apifox 来自动生成所需的接口文档 Apifox 是一款接口设计 调试
  • C# 在VS里开发Android应用 Xamarin(一)(刚开始接触的菜鸡,有没说好的地方请指出,学习中!!)

    去年寒假把之前做的大大小小所有C 程序项目都重新看了一遍 发现都是些管理系统啥的 想想也没啥桌面程序可做了 有好点子的可以跟我说说 就想去找找还有啥可做的 于是就百度了一番 发现可以写Android的应用 欣喜若狂 赶紧看看若何进行下一步
  • Python3,一篇搞定Numpy与Pandas的差异点及应用场景,妥妥的学到了。

    Numpy 与Pandas的差异比较 1 引言 2 Numpy与Pandas比较 2 1 相同点 2 2 差异点 2 3 应用场景 2 3 1 Numpy应用场景 2 3 2 Pandas 应用场景 2 4 代码示例 2 4 1 Numpy
  • easyexcel导出100w条数据,使用分页查询批量导入

    昨天公司的数据那边的人导出操作日志 一次性导出30w 让服务直接挂掉了 所有有了这篇文章 正常从数据库导出少量数据到execl 直接将符合条件的数据全部查询放到一个List中然后写到execl里即可 但是数据量过大时会导致内存兜不住的情况
  • TPR、FPR、TNR、FNR的理解

    转自 https blog csdn net zhq9695 article details 82909967 TPR True Positive Rate 可以理解为所有正类中 有多少被预测成正类 正类预测正确 即召回率 给出定义如下 F
  • Java 巧妙将音频amr格式转换成MP3(linux 以及windows)

    作为一名技术宅男 没事就上掘金来淘宝 在这学习了很多东西 也一直想开个博客 写写自己的东西 一方面就当是笔记 另一方面也可以作为他人学习的前进的一种参考 本着这样的想法今天来开启我的第一篇博客之路 俗话说前人栽树后人乘凉 我们受益于前人 亦
  • 关于构造广义线性回归模型的glmfit函数

    MATLAB中有glmfit 函数用于构建一个广义的线性回归模型 glmfit 函数属于统计工具箱 如何去使用glmfit 参考help hlmfit中的discription b glmfit X y distr b glmfit X y
  • 【Linux】Nacos 2.1 单机安装

    目录 Nacos 2 1 单机安装 1 从GitHub下载2 1 0的压缩包 2 解压与配置 3 数据库配置 4 单机启动nacos 遇到的一些错误 ErrMsg jmenv tbsite net libstdc so 6 cannot o
  • 文件IO(一.系统IO)

    1 系统IO 1 用户操作寄存器或者操作系统来让计算机反馈不同的现象 在大学期间大家都学过51单片机 我们要利用51单片机去点LED灯 直接去操控单片机内部的寄存器 硬件 这种直接操控单片机的 硬件的方式称之为 裸奔 就是说用户与芯片 硬件
  • golang练手项目监控系统资源项目(二)

    介绍项目 仿写监控系统资源项目 主要功能 监控服务资源可视化 开发环境 windows idea influxdb granfa 主要技术 时序性数据库influxdb 和可视化平台granfa 项目描述 实时监控本机资源 展示成可视化页面
  • 在shell脚本里面调用conda创建的环境

    事情源于 我在写脚本的时候 在脚本里面插入了一句 conda activate 环境名 然后出现如下的报错提示 CommandNotFoundError Your shell has not been properly configured
  • IDEA 2020导入Eclipse项目并运行实战篇

    在刚开始做Java项目的时候 很多人用的IDE都是Eclipse 这就导致了一个问题 那就是后面学习IDEA后 想用IDEA打开以前做的项目时 一时无法下手 现在 我们通过实战来学习如何在IDEA 2020 中导入Eclipse项目并运行
  • 机智的Open3D学习生活(第二集):从pcb文件中读取并可视化展示点云数据

    只作为一个从项目需求衍生的例子进行演示 代码么 从其他处获取并简单修改 import numpy as np import open3d as o3d from pathlib import Path from traceback impo
  • 编程能力训练、常见编程面试题

    编程能力训练 常见编程面试题 案例一 买飞机票 案例二 找素数 案例三 开发验证码 案例四 数组元素的复制 案例五 评委打分 案例六 数字加密 案例七 模拟双色球 练习一 飞机票 需求 机票价格按照淡季旺季 头等舱和经济舱收费 输入机票原价
  • FISCO BCOS 搭建区块链,在SpringBoot中调用合约

    一 搭建区块链 使用的是FISCO BCOS 和 WeBASE Front来搭建区块链 详细教程 https blog csdn net yueyue763184 article details 128924144 spm 1001 201