美文网首页
eos.cdt升级到1.4.1

eos.cdt升级到1.4.1

作者: liuchungui | 来源:发表于2018-12-07 23:56 被阅读0次

前天,我看到别人的合约能传递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) {}

总结

文档中,我只是将官方的示例文档修改下,熟悉了下,若是一个项目的话,修改内容会更多。

相关文章

网友评论

      本文标题:eos.cdt升级到1.4.1

      本文链接:https://www.haomeiwen.com/subject/nmdfhqtx.html