注意:由于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
修改应用部署
以下是对官网资产交易的示例的修改
主要修改为交易时可以添加备注,效果如图
修改步骤如下:
- 首先修改智能合约,主要对合约中的转账函数修改,此步骤为官网步骤开发第一个区块链应用的第二个步骤-设计与开发智能合约部分
修改后的代码如下
/*描述 : 资产转移参数 : 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;//stringcomments = 0;// 转移账户是否存在" />
此小节其余步骤与官网无异,套用和编译即可
- 接着是对调用代码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这些就自行修改。
- 改个小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,另外启用服务的时候要先启动链
如果一切运行正常,你将得到数据库结构如下
有关交易的细节在tx_receipt_raw_data的input字段里。
Over!Over!