EOS

EOS使用问题汇总

简介

记录使用EOSIO过程种所有的问题。包括cleos与eosjs的问题(本质上讲两个的大部分问题是同样的原因)。

创建账号

Account using more than allotted RAM usage

  • 问题:无法创建账号

  • 解决:使用eosio.system合约种的创建账号,并且要分配RAM\CPU\NET。

to account does not exist

  • 问题:账号不存在???无法创建账号。

  • 解决:不,这个提示大概率上并不是说你创建的账号abc不存在,而是说几个系统账号你没有创建。在新版的Dawn4.2标准下eosio.system合约变化非常大;它为确保系统资金的分配清晰,将系统资金分离如下:
    1. 对所有内存购买和销售实行1%的费用
    2. 所有从用户发送到eosio.ramfee的RAM交易费用
    3. 所有收益都来自eosio.ram发送的RAM
    4. 所有发送给eosio.stake的抵押令牌
    5. 从eosio.stake发送的所有未抵押的令牌
    6. 所有拍卖收益发送到eosio.names
    7. 未分配的通货膨胀发送给eosio.saving
    8. 生产者区块付款发送给eosio.bpay
    9. 生产者投票付款发送给eosio.vpay

不理解账号的具体作用没关系,只管创建这些必须的系统账号。

no active bid for name

  • 问题:没有竞标,无法创建账号。

  • 解决:检查账号名称是否等与12位,使用system newaccount创建账号时,短账号需要竞标才能注册,参见EOS主网账号模式。

must purchase a positive amount

  • 问题:金额非正,无法创建账号。

  • 解决:检查创建账号输入的各类值是否为正,涉及的账号包括系统账号余额是否充足;
    其次可能是精度问题:比如总计1G的RAM,发行token 100.0000 EOS,然后你选择购买1KB RAM,可能需要付出0.000095367 EOS,但是token精度只有0.0001,达不到最小精度可能内部舍弃,出现非正数的提示。此种办法就是发行更多的token.

eosjs与cleos RPC

无法看到详细的错误信息

  • 问题:在eosjs或者cleos中无法获得详细的错误信息

  • 解决:在config.ini中开启verbose-http-errors = true此配置即可。

eosjs配置完成后无法连接到eos网络

  • 问题:eosjs配置完成后无法连接到eos网络

  • 解决:在config.ini中检查以下项目:

参考配置说明检查其余配置项。

The transaction can not be found

  • 问题:使用getTransaction查询txid无结果(The transaction can not be found)

cleos下错误提示:

eosjs下错误提示:

  • 解决:在config.ini中检查filter-on = *配置,指定的交易是否被过滤。getTransaction是属于eosio::history_plugin插件的方法,而它的记录是独立的,如果一开始没有配置filter-on = *那可能会出现查询不到,重新配置并启动nodeos后可以查询到。
    此外还有一种可能,就是eosio本身有bug(详见github)。
    建议生产环境中使用外部库存储。

智能合约

Runtime Error Processing WASM

  • 问题:执行智能合约时报错。

  • 解决:此种情况大概率的智能合约内抛出异常,就是有BUG,例如空指针异常等等。

3090004 Missing required authority

  • 问题:当智能合约的参数包含两个以上的account时,提示其中一个没有授权missing authority of nmaccount

错误信息:

合约代码:

在上边的例子中仅仅是传入一个account_name &testuser就会提示missing authority of ${testuser}

  • 解决:注意上述代码中existing_user_asset.emplace(testuser, [&](auto &g) {这一行使用到了testuser,而这个参数表示传入账号为添加数据支付RAM等资源,既然要消耗账号的RAM那不经过授权是不可能的,故修改代码。

database dirty flag set (likely due to unclean shutdown): replay required

  • 问题:当机器非正常关机后可能出现区块错误

  • 解决:在启动nodeos时增加参数--replay-blockchain--hard-replay-blockchain,最后如果实在不行,使用--delete-all-blocks

eosio.bios与eosio.system部署不生效或无法调用

  • 问题:eosio.bios与eosio.system智能合约部署不生效或无法调用

  • 解决:如果eosio.bioseosio.system合约使用的不是eosio账号部署的,那么它就是不生效的。言外之意就是,这两个合约必须使用eosio部署,因为eosio是一个特权账户这两个合约中有包含特权账号的逻辑,且由于一个账号对一个合约的概念它们同时只能生效一个。此结论是经过本地测试得到,没有找到具体文档的支持。

unable to find key

  • 问题:调用合约的时候报出unable to find key

  • 解决:意为在DB没有找到对应的key,检查合约的scope与key;一般情况是转账Token类型写错了,比如10000.0000 SYS写成了10000.0000 EOS
    也遇到过一个例外,如下合约代码:

`C++
// 这样没问题
auto sym = quantity.symbol;
stats statstable(_self, sym.name());

// 在合约内报错:assertion failure with message: unable to find key
auto sym = quantity.symbol.name();
stats statstable(_self, sym);

  • 解决:签名错误,需要检查签名的数据是否符合编码要求,还要包含chainId,部分非空数据要插入00等;使用eosjs-ecc反向验证签名算法是否正确;检查签名内容;javaRPC项目可以参考eos4j

.
.
.
.
.
.
.
【本文章出自NM1024.com,转载请注明作者出处。】

2 thoughts on “EOS使用问题汇总”

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据