FISCO BCOS 开发第一个区块链应用

Posted 狮子座xiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FISCO BCOS 开发第一个区块链应用相关的知识,希望对你有一定的参考价值。

FISCO BCOS 开发第一个区块链应用


这里只是记录流程、遇到的问题、解决方法以及注意的点

详细见开发文档:[https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html]


问题:

1、Resolving dependency configuration ‘runtime’ is not allowed

------>见下文:业务逻辑开发

2、could not find method compile() for arguments

------>估计你也跟我一样直接用了它提供的包,直接运行就会报很多错,因为里面的代码很多都过时了,尤其是gradle更新到7.x以后。这里复制文档提供的代码就行。

就是把compile 改成implemention,runtime改成runtimeonly

3、Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository ‘maven(XXX)’ to redirect to a secure protocol (like HTTPS) or allow insecure protocols.

------>https://www.jianshu.com/p/8a0e5191590a


设计智能合约

见文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html

开发源码

见文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html

编译智能合约


创建区块链应用项目

安装idea

CentOS7 安装IDEA及创建快捷方式
https://blog.csdn.net/HG_Harvey/article/details/79228263?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTdefault-1-79228263-blog-124675079.pc_relevant_multi_platform_featuressortv2removedup&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTdefault-1-79228263-blog-124675079.pc_relevant_multi_platform_featuressortv2removedup&utm_relevant_index=1

创建一个Java工程

见文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/sdk_application.html

引入FISCO BCOS Java SDK

更新新代码:
testImplementation group: 'junit', name: 'junit', version: '4.12'

implementation ('org.fisco-bcos.java-sdk:fisco-bcos-java-sdk:2.9.1')//这里不更新也行,软件会在代码下面用波浪线提示,可以升级也可以不升级。不过里面很多包都提示升级了,建议升级。

配置SDK证书

见文档:

业务逻辑开发


注意此处代码有更新,需要修改不然会报错:

错误信息是:Resolving dependency configuration ‘runtime’ is not allowed

jar 
destinationDir file('dist/apps')
archiveName project.name + '.jar'
exclude '**/*.xml'
exclude '**/*.properties'
exclude '**/*.crt'
exclude '**/*.key'

doLast 
    copy 
          from configurations.runtimeClasspath//*****此处更新***** #
        into 'dist/lib'
    
    copy 
        from file('src/test/resources/')
        into 'dist/conf'
    
    copy 
        from file('tool/')
        into 'dist/'
    
    copy 
        from file('src/test/resources/contract')
        into 'dist/contract'
    

运行应用


注意先启动FISCO BCOS链:
先进入fisco:

cd /home/xiao/fisco //这是我存放fisco的地址,改成你自己的

启动链:

bash nodes/127.0.0.1/start_all.sh

到这里跟着文档走就可以了。

Fisco-bsco 开发联盟链 账户之间的转账

Fisco-bsco 开发联盟链 账户之间的转账

参考:开发第一个区块链应用 — FISCO BCOS v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io)

前提:Fisco-bcos节点开启,控制台已搭建

步骤:

1. 开发源码

# 进入console/contracts目录
cd ~/fisco/console/contracts/solidity
# 创建Asset.sol合约文件
vi Asset.sol
​
# 将Assert.sol合约内容写入。
# 并键入wq保存退出。

Asset.sol:

pragma solidity ^0.4.24;
​
import "./Table.sol";
​
contract Asset 
    // event
    event RegisterEvent(int256 ret, string account, uint256 asset_value);
    event TransferEvent(int256 ret, string from_account, string to_account, uint256 amount);
​
    constructor() public 
        // 构造函数中创建t_asset表
        createTable();
    
​
    function createTable() private 
        TableFactory tf = TableFactory(0x1001);
        // 资产管理表, key : account, field : asset_value
        // |  资产账户(主键)      |     资产金额       |
        // |-------------------- |-------------------|
        // |        account      |    asset_value    |
        // |---------------------|-------------------|
        //
        // 创建表
        tf.createTable("t_asset", "account", "asset_value");
    
​
    function openTable() private returns(Table) 
        TableFactory tf = TableFactory(0x1001);
        Table table = tf.openTable("t_asset");
        return table;
    
​
    /*
    描述 : 根据资产账户查询资产金额
    参数 :
            account : 资产账户
​
    返回值:
            参数一: 成功返回0, 账户不存在返回-1
            参数二: 第一个参数为0时有效,资产金额
    */
    function select(string account) public constant returns(int256, uint256) 
        // 打开表
        Table table = openTable();
        // 查询
        Entries entries = table.select(account, table.newCondition());
        uint256 asset_value = 0;
        if (0 == uint256(entries.size())) 
            return (-1, asset_value);
         else 
            Entry entry = entries.get(0);
            return (0, uint256(entry.getInt("asset_value")));
        
    
​
    /*
    描述 : 资产注册
    参数 :
            account : 资产账户
            amount  : 资产金额
    返回值:
            0  资产注册成功
            -1 资产账户已存在
            -2 其他错误
    */
    function register(string account, uint256 asset_value) public returns(int256)
        int256 ret_code = 0;
        int256 ret= 0;
        uint256 temp_asset_value = 0;
        // 查询账户是否存在
        (ret, temp_asset_value) = select(account);
        if(ret != 0) 
            Table table = openTable();
​
            Entry entry = table.newEntry();
            entry.set("account", account);
            entry.set("asset_value", int256(asset_value));
            // 插入
            int count = table.insert(account, entry);
            if (count == 1) 
                // 成功
                ret_code = 0;
             else 
                // 失败? 无权限或者其他错误
                ret_code = -2;
            
         else 
            // 账户已存在
            ret_code = -1;
        
​
        emit RegisterEvent(ret_code, account, asset_value);
​
        return ret_code;
    
​
    /*
    描述 : 资产转移
    参数 :
            from_account : 转移资产账户
            to_account : 接收资产账户
            amount : 转移金额
    返回值:
            0  资产转移成功
            -1 转移资产账户不存在
            -2 接收资产账户不存在
            -3 金额不足
            -4 金额溢出
            -5 其他错误
    */
    function transfer(string from_account, string to_account, uint256 amount) public returns(int256) 
        // 查询转移资产账户信息
        int ret_code = 0;
        int256 ret = 0;
        uint256 from_asset_value = 0;
        uint256 to_asset_value = 0;
​
        // 转移账户是否存在?
        (ret, from_asset_value) = select(from_account);
        if(ret != 0) 
            ret_code = -1;
            // 转移账户不存在
            emit TransferEvent(ret_code, from_account, to_account, amount);
            return ret_code;
​
        
​
        // 接受账户是否存在?
        (ret, to_asset_value) = select(to_account);
        if(ret != 0) 
            ret_code = -2;
            // 接收资产的账户不存在
            emit TransferEvent(ret_code, from_account, to_account, amount);
            return ret_code;
        
​
        if(from_asset_value < amount) 
            ret_code = -3;
            // 转移资产的账户金额不足
            emit TransferEvent(ret_code, from_account, to_account, amount);
            return ret_code;
        
​
        if (to_asset_value + amount < to_asset_value) 
            ret_code = -4;
            // 接收账户金额溢出
            emit TransferEvent(ret_code, from_account, to_account, amount);
            return ret_code;
        
​
        Table table = openTable();
​
        Entry entry0 = table.newEntry();
        entry0.set("account", from_account);
        entry0.set("asset_value", int256(from_asset_value - amount));
        // 更新转账账户
        int count = table.update(from_account, entry0, table.newCondition());
        if(count != 1) 
            ret_code = -5;
            // 失败? 无权限或者其他错误?
            emit TransferEvent(ret_code, from_account, to_account, amount);
            return ret_code;
        
​
        Entry entry1 = table.newEntry();
        entry1.set("account", to_account);
        entry1.set("asset_value", int256(to_asset_value + amount));
        // 更新接收账户
        table.update(to_account, entry1, table.newCondition());
​
        emit TransferEvent(ret_code, from_account, to_account, amount);
​
        return ret_code;
    

运行ls命令,确保Asset.solTable.sol在目录~/fisco/console/contracts/solidity下。

Table.sol 在搭建控制台的时候自动创建

2.编译智能合约

# 切换到fisco/console/目录
cd ~/fisco/console/
​
# 若控制台版本大于等于2.8.0,编译合约方法如下:(可通过bash sol2java.sh -h命令查看该脚本使用方法)
bash sol2java.sh -p org.fisco.bcos.asset.contract
​
# 若控制台版本小于2.8.0,编译合约(后面指定一个Java的包名参数,可以根据实际项目路径指定包名)如下:
./sol2java.sh org.fisco.bcos.asset.contract

3.创建区块链应用项目

  1. 确认jdk以及集成环境

 确认您当前的java版本
$ java -version
# 确认您的java路径
$ ls /Library/Java/JavaVirtualMachines
# 返回
# jdk-14.0.2.jdk
​
# 如果使用的是bash
$ vim .bash_profile 
# 在文件中加入JAVA_HOME的路径
# export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home 
$ source .bash_profile
​
# 如果使用的是zash
$ vim .zashrc
# 在文件中加入JAVA_HOME的路径
# export JAVA_HOME = Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home 
$ source .zashrc
​
# 确认您的java版本
$ java -version
# 返回
# java version "14.0.2" 2020-07-14
# Java(TM) SE Runtime Environment (build 14.0.2+12-46)
# Java HotSpot(TM) 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)
​
  1. 进入IntelliJ IDE官网下载社区版即可,安装解压

  2. 快速搭建

     cd ~/fisco
    $ curl -#LO https://github.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz
    # 解压得到Java工程项目asset-app
    $ tar -zxf asset-app.tar.gz
    ​
  3. 将项目用IDE打开,打开终端

    # 假设我们将asset-app放在~/fisco目录下 进入~/fisco目录
    $ cd ~/fisco
    # 创建放置证书的文件夹
    $ mkdir -p asset-app/src/test/resources/conf
    # 拷贝节点证书到项目的资源目录
    $ cp -r nodes/127.0.0.1/sdk/* asset-app/src/test/resources/conf
    # 若在IDE直接运行,拷贝证书到resources路径
    $ mkdir -p asset-app/src/main/resources/conf
    $ cp -r nodes/127.0.0.1/sdk/* asset-app/src/main/resources/conf

4.运行

  • 编译

    # 切换到项目目录
    $ cd ~/fisco/asset-app
    # 编译项目
    $ ./gradlew build
  • 部署Asset.sol

    # 进入dist目录
    $ cd dist
    $ bash asset_run.sh deploy
    Deploy Asset successfully, contract address is 0xd09ad04220e40bb8666e885730c8c460091a4775
  • 注册资产

    $ bash asset_run.sh register Alice 100000
    Register account successfully => account: Alice, value: 100000
    $ bash asset_run.sh register Bob 100000
    Register account successfully => account: Bob, value: 100000
  • 查询资产

    $ bash asset_run.sh query Alice
    account Alice, value 100000
    $ bash asset_run.sh query Bob
    account Bob, value 100000
  • 资产转移

    $ bash asset_run.sh transfer Alice Bob  50000
    Transfer successfully => from_account: Alice, to_account: Bob, amount: 50000
    $ bash asset_run.sh query Alice
    account Alice, value 50000
    $ bash asset_run.sh query Bob
    account Bob, value 150000

 

 

以上是关于FISCO BCOS 开发第一个区块链应用的主要内容,如果未能解决你的问题,请参考以下文章

区块链入门教程--FISCO BCOS单机四节点联盟链安装

FISCO BCOS 区块链 设置交易最晚处理区块高度

FISCO BCOS区块链 修改增加RPC接口

FISCO BCOS区块链 修改增加RPC接口

FISCO BCOS 区块链 查看代码版本号

FISCO BCOS区块链固定出块节点 方法