Fisco开发第一个区块链应用

这篇具有很好参考价值的文章主要介绍了Fisco开发第一个区块链应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、部署区块链

1. 环境准备

第一步:安装JDK 1.8版本。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链

第二步:下载fisco压缩包。

链接:https://pan.baidu.com/s/1_ivw1FeKVhbVZIAbzvdSQg 
提取码:e14j

下载完成后解压缩到/root目录下。

2. 启动节点

1)启动区块链节点:

cd /root/fisco/nodes/127.0.0.1/
sh start_all.sh

确认节点启动正常:

tail -f /root/fisco/nodes/127.0.0.1/node0/log/log*  | grep +++

正常情况会不停输出++++Generating seal,表示共识正常。

2)启动节点控制台服务:

cd /root/fisco/WeBASE-Front/dist
sh start.sh

通过浏览器远程访问如下链接,如果可以访问,则说明已经正常运行了。

http://ip:5002/WeBASE-Front/

界面如下所示:
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链

3. 编译合约

1)准备合约

pragma solidity ^0.4.21;

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);
    }
    
}

2)部署合约

选择合约IDE,点右上角“部署”按钮。部署成功后,会生成合约地址(如下图所示)。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链

3)下载SDK证书

点击右上角的“SDK证书下载”按钮,将下载的证书压缩包文件保存起来,后面需要导入到项目中。

4. 创建测试用户

点击左边“测试用户”菜单,在主界面上点击“新增用户”,然后输入用户名。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链
点击新建用户右边的导出按钮,选择.pem,导出用户证书。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链

二、创建应用

1. 新建项目

本示例所使用开发工具为Idea。首先新建一个Maven项目。然后按照下面目录结构在src/main/javasrc/main/resources中创建相应的包和文件夹。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链
将上面准备好的用户证书和sdk证书分别复制到对应文件夹中(如下图所示)。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链

2. 引入依赖

pom文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.fisco.bcos</groupId>
    <artifactId>asset-app</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.6.8</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.fisco-bcos.java-sdk</groupId>
            <artifactId>fisco-bcos-java-sdk</artifactId>
            <version>2.9.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

3. 启动类

org.fisco.bcos.asset包下创建启动类。

@SpringBootApplication
public class Application
{
    public static void main(String[] args)
    {
        SpringApplication.run(Application.class, args);
        System.out.println("项目启动成功");
    }
}

4. 导出Java文件

点击节点控制台上的合约IDE,然后选中Asset.sol合约后,点击上方的导出Java文件。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链
然后将导出的Java文件拷贝到项目的org.fisco.bcos.asset.contract包下。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链

5. 定义区块链配置信息

src/main/resources目录下,新建application.yaml文件。

fisco:
  nodeList: 192.168.88.15:20201
  groupId: 1
  certPath: E:\workspace\asset-app\src\main\resources\sdk
  contractAddress:
    # Asset合约地址(一定要加引号 不然注解@Value会把按照16进制数字进行转换赋值)
    asset: "0xe755337500bb6ffad292a2499bc12e30d5dc744f"
  # 账户地址
  account:
    # 账户秘钥地址
    accountAddress: E:\workspace\asset-app\src\main\resources\account
    # 账户文件地址
    accountFilePath: E:\workspace\asset-app\src\main\resources\account\zhongliwen_key_0x6e26d380588049b43efca3881a2b2c419ae1a118.pem

fisco.nodeList:区块链节点的ip和端口;
fisco.groupId:组ID;
fisco.certPath:证书保存目录;
fisco.contractAddress.asset:合约地址;
fisco.contractAddress.account.accountAddress:测试用户地址;
fisco.contractAddress.account.accountFilePath:用户密码文件地址;

6. 编写sdk访问合约方法

org.fisco.bcos.asset.client包下新建一个类,该类用于配置相关Bean。

package org.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.security.KeyPair;
import java.util.*;

/**
 * @Description: 配置类
 * @Date: 2022/9/30
 * @Author: zhongliwen
 * @Version: 1.0
 */
@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;
    }
}

然后再同样的包下创建另外一个类,该类定义了访问Asset合约的方法。

package org.fisco.bcos.asset.client;

import org.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());
        }
    }
}

关于Java SDK的使用手册,可以参考官方提供的文档。

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/index.html

7. 测试

编写一个单元测试类,分别对AssetClient类中的两个方法进行单元测试。

package org.fisco.bcos.asset.client;


import org.fisco.bcos.Application;
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 = Application.class)
public class AssetClientTest {
    @Autowired
    private AssetClient assetClient;

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

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

}

测试步骤:

  1. 先后执行testIssueAssettestSendAsset测试方法;
  2. 执行成功后,在节点控制台的合约列表中找到对应的合约;

/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链
3. 点击右方的合约调用,然后方法选择balances,参数输入测试方法中receiver地址;
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链
点击确定后,可以看到相关的交易回执。
/root/fisco/stringgetset/src/main/java/org/java/pay/stringgetset/raw/stringg,区块链,区块链
到目前为止,已经完成了在Fisco区块链上部署智能合约,并通过Java SDK调用智能合约函数的示例。文章来源地址https://www.toymoban.com/news/detail-782684.html

到了这里,关于Fisco开发第一个区块链应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搭建第一个区块链网络(Fisco-Bcos),启动并使用控制台

    1.安装依赖 centos7 Ubuntu 2.创建操作目录, 下载安装脚本 3. 搭建单群组4节点联盟链 搭建成功截图如下  4.启动FISCO BCOS链 启动成功截图如下  5.检查进程 检查进程是否启动  输出结果如下,如果进程数不为4,则进程没有启动(一般是端口被占用导致的)  6.检查日志输出 查看节

    2024年02月04日
    浏览(51)
  • Fisco Bcos区块链一(搭建单群组FISCO BCOS联盟链)

    技术文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html 1、搭建单群组FISCO BCOS联盟链 1. 安装centos依赖包 安装依赖包openssl、curl 2. 创建操作目录, 下载安装脚本 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 3. 搭建单群组4节点联盟链 在fisco目录下执

    2024年02月10日
    浏览(46)
  • 【区块链】【FISCO】WeIdentity

    官方的说法:去中心化身份标识解决方案。其实说白了就是互联网上每个人都拥有自己数字身份,并且这个身份是唯一且不可篡改的。 WeIdentity要解决的问题就是用来解决数字身份验证的问题。传统互联网身份验证的方式通常用账户或密码,这样的话难免信息泄露然后被黑客

    2024年02月01日
    浏览(26)
  • FISCO BCOS 区块链(一)

    目录 一、搭建 FISCO BCOS 链 1、安装 openssl, curl 依赖 2、安装 build_chain 脚本 二、配置控制台 1、下载java jdk 2、安装控制台 3、拷贝配置文件以及证书 4、启动控制台 三、Java-SDK(idea版) 1、创建 project  2、引入 Java-SDK依赖 3、sol2java.sh 4、导入所需资源 5、创建测试类 参考 FISCO

    2024年01月24日
    浏览(47)
  • 搭建FISCO BCOS区块链平台

    这是为北京交通大学《区块链技术》课程制作的实验教程,因面向全校研究生开放选课,故提供了详细的步骤。本文是实验第一步,用于搭建FISCO BCOS区块链平台。 详细阅读FISCO BCOS官方文档: https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/index.html VMware虚拟机安装包下载地址: https

    2024年02月06日
    浏览(51)
  • Fisco Bcos区块链四(扩容节点)

    4、扩容节点 1. 操作命令 为保证区块链安全性,FISCO BCOS引入了游离节点、观察者节点和共识节点,这三种节点类型可通过控制台相互转换。 共识节点:参与共识的节点,拥有群组的所有数据(搭链时默认都生成共识节点)。 观察者节点:不参与共识,但能实时同步链上数据

    2024年02月05日
    浏览(51)
  • FISCO BCOS区块链建立配置启动

    创建操作目录, 下载安装脚本 搭建单群组4节点联盟链 启动FISCO BCOS链 安装java 获取控制台并回到fisco目录 拷贝控制台配置文件 配置控制台证书 编写HelloWorld合约 contract HelloWorld { string name; } 部署HelloWorld合约 调用HelloWorld合约 见https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/do

    2024年02月07日
    浏览(55)
  • 1.平台介绍:FISCO BCOS 区块链

    区块链技术作为一种分布式、安全可信的数据记录和交互方式,正逐渐在各行各业展现出巨大潜力。然而,公共区块链的隐私性和性能限制使得企业更倾向于采用联盟链或私有链解决方案。 FISCO BCOS(Blockchain Open Consortium Operating System)作为一种企业级区块链平台,为企业和组

    2024年02月13日
    浏览(45)
  • fisco区块链浏览器编译合约失败

    在fisco的区块链浏览器这个位置编译合约失败,但是合约可以正常执行,此时可能是因为浏览器在数据库中自动建表时,保存合约abi编码的字段长度不足的原因 将数据库中对应字段长度改长一些即可。 ps:这里编译的合约貌似必须在同一级目录下,多级目录合约无法检测到引

    2024年02月13日
    浏览(47)
  • 【FISCO BCOS】二十、多机部署区块链

    目录 一、准备环境 二、开始搭建 三、检查节点          1.检查节点进程

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包