eos.cdt升级到1.4.1
2018-12-07 本文已影响0人
liuchungui
前天,我看到别人的合约能传递string[]
参数,而我传递时,报错Error 3015004: The type defined in the ABI is invalid. Error Details: invalid type >
。然后,google之后没找到解决问题的方案,于是在eos developers
群中问了个问题,最后才知道是因为eos.cdt 1.2.1
存在这个bug,只要升级到最新版本就没有问题了。
今天,我将eos.cdt升级到1.4.1,然后写了一个简单合约,测试了传递string[]
类型进去,果然没有问题了。不过,在升级之后,发现改变内容挺多的,都没法编译,然后参考Differences between Version 1.2.x and Version 1.3.x进行修改,算是暂时可以了。
我总结下自己修改的几点。
- account_name 变成了 name
- 删除N宏,替换为“”_n 操作符 或者 name 结构体。例如 N(foo) => “foo”_n 或者 N(foo) => name(“foo”)
- 删除S宏,使用symbol结构体替换,例如:S(4, SYS) => symbol(symbol_code(“SYS”), 4) 或者更简单 symbol(“SYS”, 4)
- apply函数中的变化:将N宏变成name,并且调用方法也改变了,示例如下:
extern "C" {
void apply(uint64_t receiver, uint64_t code, uint64_t action) {
auto self = receiver;
if (code == name("eosio.token").value && action == name("transfer").value) {
execute_action(name(receiver), name(code), &seller::receive_transfer);
return;
}
if (code != receiver) return;
if(action == name("testgame").value) {
execute_action(name(receiver), name(code), &seller::testgame);
}
}
}
- multi_index的变化,使用account_name需要变成name类型,并且返回的数据是name.value,如下:
#include <eosiolib/eosio.hpp>
struct buy {
name buyer;
asset use;
asset buy;
uint64_t primary_key() const {
return buyer.value;
}
};
typedef eosio::multi_index<"buyinfo"_n, buy> buy_list;
- 在contract中,以前的_self变成了_code,例如初始化全局变量:
seller(name receiver, name code, datastream<const char*> ds):contract(receiver, code, ds), _buy_list(_code, _code.value) {}
总结
文档中,我只是将官方的示例文档修改下,熟悉了下,若是一个项目的话,修改内容会更多。