简介
记录使用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%的费用
- 所有从用户发送到eosio.ramfee的RAM交易费用
- 所有收益都来自eosio.ram发送的RAM
- 所有发送给eosio.stake的抵押令牌
- 从eosio.stake发送的所有未抵押的令牌
- 所有拍卖收益发送到eosio.names
- 未分配的通货膨胀发送给eosio.saving
- 生产者区块付款发送给eosio.bpay
- 生产者投票付款发送给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,例如空指针异常等等。
- 问题:当智能合约的参数包含两个以上的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.bios
和eosio.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使用问题汇总
本地环境转账,为什么get actions 任何账户都是空的,但账户余额已经变化了。
get actions 是指什么?