Fisco-Bcos的环境搭建及Data-Export导出组件的使用

注意:由于Data-Export组件暂时只支持Fisco-Bcos 2.x系列(这个也是目前使用最多最稳定的系列),故这里使用的是目前最新的Fisco-Bcos 2.x。

Fisco-Bcos链环境搭建

区块链网络部署

主要一步步按照这个官方的操作即可区块链网络搭建
环境为Ubuntu18.04,java版本要使用及11以上的,按照官网教程在ubuntu18.04下默认安装的应该就是java11。

区块链应用部署

官网示例部署

大部分参考区块链应用部署
第一个小坑:如果想偷懒有写好的应用的话,如官网给的示例

$ cd ~/fisco
$ curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/tools/asset-app.tar.gz
# 解压得到Java工程项目asset-app
$ tar -zxf asset-app.tar.gz

使用是需要配置SDK证书,也就是执行如下指令

# 假设我们将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

修改应用部署

以下是对官网资产交易的示例的修改
主要修改为交易时可以添加备注,效果如图
image.png
修改步骤如下:

  1. 首先修改智能合约,主要对合约中的转账函数修改,此步骤为官网步骤开发第一个区块链应用的第二个步骤-设计与开发智能合约部分

修改后的代码如下

/*
描述 : 资产转移
参数 : 
from_account : 转移资产账户
to_account : 接收资产账户
amount : 转移金额
comments :备注
返回值:
0  资产转移成功
-1 转移资产账户不存在
-2 接收资产账户不存在
-3 金额不足
-4 金额溢出
-5 其他错误
修改:主要修改参数部分,增加comments字段
*/
function transfer(string memory from_account, string memory to_account, uint256 amount, string memory comments) public returns(int256) {
  // 查询转移资产账户信息
  int ret_code = 0;
  int256 ret = 0;
  uint256 from_asset_value = 0;
  uint256 to_asset_value = 0;
  //string  comments = 0;
  // 转移账户是否存在?
  (ret, from_asset_value) = select(from_account);
  if(ret != 0) {
      ret_code = -1;
      // 转移账户不存在
      emit TransferEvent(ret_code, from_account, to_account, amount, comments);
      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, comments);
      return ret_code;
    }

  if(from_asset_value < amount) {
      ret_code = -3;
      // 转移资产的账户金额不足
      emit TransferEvent(ret_code, from_account, to_account, amount, comments);
      return ret_code;
    } 

  if (to_asset_value + amount < to_asset_value) {
      ret_code = -4;
      // 接收账户金额溢出
      emit TransferEvent(ret_code, from_account, to_account, amount, comments);
      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, comments);
      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,comments);

  return ret_code;
}
}

此小节其余步骤与官网无异,套用和编译即可

  1. 接着是对调用代码AssetClient.java的修改,它位于/src/main/java/org/fisco/bcos/asset/client目录下,主要也是对转账函数以及main函数参数调用处的修改,此步骤为官网步骤开发第一个区块链应用的第四个步骤-创建区块链应用项目部分的。修改代码如下,
//转账部分修改,主要修改参数部分,增加comment字段
public void transferAsset(String fromAssetAccount, String toAssetAccount, BigInteger amount,String comments) {
    
    
    //System.out.println(comments);
    try {
    
    
      String contractAddress = loadAssetAddr();
      Asset asset = Asset.load(contractAddress, client, cryptoKeyPair);
      TransactionReceipt receipt = asset.transfer(fromAssetAccount, toAssetAccount, amount, comments);
      List<Asset.TransferEventEventResponse> response = asset.getTransferEventEvents(receipt); 
      if (!response.isEmpty()) {
    
    
        if (response.get(0).ret.compareTo(new BigInteger("0")) == 0) {
    
    
          //System.out.println(comments);
          System.out.printf(
              " transfer success => from_asset: %s, to_asset: %s, amount: %s ,comments: %s\n",
              fromAssetAccount, toAssetAccount, amount , comments);
        } else {
    
    
          System.out.printf(
              " transfer asset account failed, ret code is %s \n", response.get(0).ret.toString());
        }
      } else {
    
    
        System.out.println(" event log not found, maybe transaction not exec. ");
      }
    } catch (Exception e) {
    
    
      // TODO Auto-generated catch block
      // e.printStackTrace();

      logger.error(" registerAssetAccount exception, error message is {}", e.getMessage());
      System.out.printf(" register asset account failed, error message is %s\n", e.getMessage());
    }
  }

//main 函数参数调用修改
public static void main(String[] args) throws Exception {
    
    
    if (args.length < 1) {
    
    
      Usage();
    }

    AssetClient client = new AssetClient();
    client.initialize();

    switch (args[0]) {
    
    
      case "deploy":
        client.deployAssetAndRecordAddr();
        break;
      case "query":
        if (args.length < 2) {
    
    
          Usage();
        }
        client.queryAssetAmount(args[1]);
        break;
      case "register":
        if (args.length < 3) {
    
    
          Usage();
        }
        client.registerAssetAccount(args[1], new BigInteger(args[2]));
        break;
      case "transfer":
        if (args.length < 5) {
    
    
          Usage();
        }
        client.transferAsset(args[1], args[2], new BigInteger(args[3]),args[4]);
        break;
      default:
        {
    
    
          Usage();
        }
    }
    System.exit(0);
  }

然后usage这些就自行修改。

  1. 改个小bug

注意:整体修改完成后的时候出现过一个小bug,就是comments字段如果输入的英文字符串中间带有空格的话,将会丢失第一个空格之后的所有内容。如上图,若comments输入的内容为"Hello World",存入链上的数据将会是"Hello。原因在于,java执行带有参数的时候会将空格之后的视为另一个参数。
经多次测试,若想解决这个问题,需要对asset_run.sh做如下修改。将最后一行的$@修改为"$@",同时需要java版本为11及以上(1.8有bug)

Data-Export数据导出系统安装

再次提醒,此组件只支持FISCO-BCOS 2.x 版本,官网的步骤数据导出系统
然后要说的是按照官网这个流程是失败了的,原因暂时未知,尝试过切换多种版本java,尝试过更换数据库(官网用的是Mariadb)都无果。。。
于是采用的第二个办法,通过docker快速部署,参考docker快速部署
注意:通过这个部署后的mysql端口是3307,另外启用服务的时候要先启动链
如果一切运行正常,你将得到数据库结构如下
image.png
有关交易的细节在tx_receipt_raw_data的input字段里。
Over!Over!

猜你喜欢

转载自blog.csdn.net/qq_43271194/article/details/129323571