BCOS链智能合约开发避坑

BCOS评论628阅读模式
摘要

BCOS链特有的Table结构直接与数据库打交道,solidity智能合约在开发中遇到的一些问题总结。如table的entry循环赋值出错;非storage变量不能使用push,memory变长数组不支持push;string[]作为函数参数;处理时间函数;Table插入问题。

 

BCOS链智能合约开发避坑

 

1. table的entry循环赋值出错

执行代码
pragma solidity ^0.4.25; 
struct Bean {
	// 表名称
	string tableName;
	// 主键
	string primaryKey;
	// 表字段
	string[] fields;
}

Bean t_bag_struct;
for (uint j = 0; j < 12; j++) {
	entry.set(t_bag_struct.fields[j], fields[j]);
}
错误描述

查看entry的值,出i=0,之后值均为空。

BCOS链智能合约开发避坑

错误原因

字符串解析方法(如下代码所示)中,切割时依照“,”作为分隔符

strings.slice memory s = _fields.toSlice();
strings.slice memory delim = ",".toSlice();
uint params_total = s.count(delim) + 1;
t_bag_struct.fields = new bytes32[](params_total);
for(uint i = 0; i < params_total; i++) {
	t_bag_struct.fields[i] = stringToBytes32(s.split(delim).toString()) ;
}

但之前待分隔字符串中“,”附近存在空格:

string constant tableBagFields = "userID, bag_name, production_date, brand, style, bag_status, activate_time, original_price, current_estimated_price, transfer_times, thumb_up_times, punch_locations_times";

因此,t_bag_struct.fields中的字符串会存在若干个空格问题,导致entry.set无法存储

修改之后(去掉空格),代码如下,运行正常。

string memory tableBagFields = "userID,bag_name,production_date,brand,style,bag_status,activate_time,original_price,current_estimated_price,transfer_times,thumb_up_times,punch_locations_times";

2. 非storage变量不能使用push,memory变长数组不支持push

执行代码
string[12] memory args = ["620523199x","jipinbao","1998-03-13","LV","oldschool","1","2020-05-28","20000","35000","5","1821","11"];
string[] memory inputs = new string[](args.length);
// 非storage变量不能使用push,memory变长数组不支持push()
for(uint i=0; i<args.length;i++){
	inputs[i] = args[i];
}
pragma solidity ^0.4.0;

contract AutoExtendArray{
  uint[] stateVar = new uint[](1);

  function autoExendArray(uint a) returns (uint){
    //stateVar.length++语句会修改数组的长度加1
    stateVar[stateVar.length++] = a;
    return stateVar[stateVar.length - 1];
  }
}

在上面这个例子中,可以看到,可通过stateVar.length++语句对数组长度进行自增,我们就得到了一个不断变长的数组。

3. string[]作为函数参数,似乎无法成功

改为string,然后使用strings库进行切

4. 处理时间函数

https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary

5.Table插入问题

一旦出问题,重新命名表并新建。

 

BCOS最后更新:2020-11-6
以太坊之数据存储详解 以太坊

以太坊之数据存储详解

本文整理分析以太坊网络中的区块、交易以及合约数据是如何存储的。 区块结构 区块由两部分组成,分别是区块头(header)和区块体(body)两部分,详细结构图如下。 区块头(header) 区块头存储...
FISCO BCOS证书与鉴权体系 BCOS

FISCO BCOS证书与鉴权体系

区块链之所以被称为“信任的机器”,是因为其通过密码学算法使各不信任的节点互相协作达到信任。这一理念在联盟链中的体现主要是基于PKI(公钥基础设施)建立证书体系,FISCO BCOS中的证书主要满足SS...
Solidity合约间调用原子性操作实验 BCOS

Solidity合约间调用原子性操作实验

实验说明 为了测试在合约内调用另一个合约时,若在某一方法内,先调用另一个合约方法导致其数据更改成功,而执行后面的语句时由于某些原因导致交易失败,那么已经被调用的合约数据已然更改还是未被更改?针对这个问...