EOS · 2018年9月6日 2

EOS使用问题汇总

简介

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

创建账号

Account using more than allotted RAM usage

  • 问题:无法创建账号
Error 3080001: Account using more than allotted RAM usage
Error Details:
account eosio.ramfee has insufficient ram; needs 2996 bytes has 0 bytes
  • 解决:使用eosio.system合约种的创建账号,并且要分配RAM\CPU\NET。
$ cleos  system newaccount eosio  nm1024 --transfer  EOS57zTJCWoA6viGYi6y8mUKjfatSFZHxwVFmLdWoXpKDEC2Rx9GR EOS57zTJCWoA6viGYi6y8mUKjfatSFZHxwVFmLdWoXpKDEC2Rx9GR --stake-net '50.00 CYB' --stake-cpu '50.00 CYB' --buy-ram '10.0000 CYB'

to account does not exist

  • 问题:账号不存在???无法创建账号。
Error 3050003: eosio_assert_message assertion failure
Error Details:
assertion failure with message: to account does not exist
pending console output: 
  • 解决:不,这个提示大概率上并不是说你创建的账号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

  • 问题:没有竞标,无法创建账号。
Error 3050003: eosio_assert_message assertion failure
Error Details:
assertion failure with message: no active bid for name
pending console output: 
  • 解决:检查账号名称是否等与12位,使用system newaccount创建账号时,短账号需要竞标才能注册,参见EOS主网账号模式。

must purchase a positive amount

  • 问题:金额非正,无法创建账号。
Error 3050003: eosio_assert_message assertion failure
Error Details:
assertion failure with message: must purchase a positive amount
pending console output: 
  • 解决:检查创建账号输入的各类值是否为正,涉及的账号包括系统账号余额是否充足;
    其次可能是精度问题:比如总计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中检查以下项目:

ccess-control-allow-origin = *

# 以下此项不可填写127.0.0.1或者localhost
http-server-address = 192.168.1.1:8888 

http-validate-host = 0

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

The transaction can not be found

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

cleos下错误提示:

Exception Details: 3040011 tx_not_found: The transaction can not be found
Transaction de2fd0f3e117f57ad9d58e6bfea98f728f047d25ebb6392844cdbd75a3923347 not found in history or in block number 34994
    {"id":"de2fd0f3e117f57ad9d58e6bfea98f728f047d25ebb6392844cdbd75a3923347","n":34994}
    thread-0  history_plugin.cpp:540 get_transaction

eosjs下错误提示:

{
    "code": 500, 
    "message": "Internal Service Error", 
    "error": {
        "code": 3040011, 
        "name": "tx_not_found", 
        "what": "The transaction can not be found", 
        "details": [
            {
                "message": "Transaction de2fd0f3e117f57ad9d58e6bfea98f728f047d25ebb6392844cdbd75a3923347 not found in history or in block number 0", 
                "file": "history_plugin.cpp", 
                "line_number": 540, 
                "method": "get_transaction"
            }
        ]
    }
}
  • 解决:在config.ini中检查filter-on = *配置,指定的交易是否被过滤。getTransaction是属于eosio::history_plugin插件的方法,而它的记录是独立的,如果一开始没有配置filter-on = *那可能会出现查询不到,重新配置并启动nodeos后可以查询到。
    此外还有一种可能,就是eosio本身有bug(详见github)。
    建议生产环境中使用外部库存储。

智能合约

Runtime Error Processing WASM

  • 问题:执行智能合约时报错。
Error 3070002: Runtime Error Processing WASM
Error Details:
access violation
pending console output: 
  • 解决:此种情况大概率的智能合约内抛出异常,就是有BUG,例如空指针异常等等。

3090004 Missing required authority

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

错误信息:

{
    "code": 500, 
    "message": "Internal Service Error", 
    "error": {
        "code": 3090004, 
        "name": "missing_auth_exception", 
        "what": "Missing required authority", 
        "details": [
            {
                "message": "missing authority of nmaccount", 
                "file": "apply_context.cpp", 
                "line_number": 131, 
                "method": "require_authorization"
            }, 
            {
                "message": "pending console output: _self:cy.asset", 
                "file": "apply_context.cpp", 
                "line_number": 61, 
                "method": "exec_one"
            }
        ]
    }
}

合约代码:

void digital_asset::create(const uint32_t &asset_id, const std::string &asset_name, const account_name &user, const std::string &asset_desc, const uint32_t &maximum_supply, const account_name &testuser)
{
   require_auth(user);

   cyassets existing_user_asset(_self, user);
   auto itr = existing_user_asset.find(asset_id);
   eosio_assert(itr == existing_user_asset.end(), "asset_id already exists");

   eosio::print("_self:", eosio::name{_self});
   existing_user_asset.emplace(testuser, [&](auto &g) {
      g.asset_id = asset_id;
      g.asset_name = asset_name;
      g.user = user;
      g.asset_desc = asset_desc;
      g.maximum_supply = maximum_supply;
   });
}

在上边的例子中仅仅是传入一个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);

错误意思是一样的,但是这个语法就难以理解了,尚未不知这是C++的问题还是EOS的问题。也许C++就这种奇怪的语法吧。


### RPC

#### 3090003 unsatisfied authorization

- 问题:调用RPC接口`/v1/chain/push_transaction`返回Provided keys, permissions, and delays do not satisfy declared authorizations。

```json
{
    "code":500,
    "message":"Internal Service Error",
    "error":{
        "code":3090003,
        "name":"unsatisfied_authorization",
        "what":"Provided keys, permissions, and delays do not satisfy declared authorizations",
        "details":[
            {
                "message":"transaction declares authority '{"actor":"tequan1","permission":"active"}', but does not have signatures for it under a provided delay of 0 ms, provided permissions [], and provided keys ["EOS4wcdkswyuuFGjhjAzBosacpgiHJjHoPiS1VdpD4zfh7tQXDUHe"]",
                "file":"authorization_manager.cpp",
                "line_number":411,
                "method":"check_authorization"
            }
        ]
    }
}
  • 解决:签名错误,需要检查签名的数据是否符合编码要求,还要包含chainId,部分非空数据要插入00等;使用eosjs-ecc反向验证签名算法是否正确;检查签名内容;javaRPC项目可以参考eos4j

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






>>转载请注明原文链接地址:EOS使用问题汇总