您正在查看: EOS-新手问答 分类下的文章

cleos查询账户RAM总购量与实际购买不一致

cleos get account

通过cleos 查询账户RAM余额

cleos -u http://127.0.0.1:8888 get account zer41iyhahwp
...
memory:
     quota:     9.366 KiB    used:     3.078 KiB

但实际创建账户时,RAM购买量为8192byte

cleos get table

通过查询用户资源表

cleos -u http://127.0.0.1:8888 get table bitconch zer41iyhahwp userres
$ cleos -u http://127.0.0.1:8888 get table eosio zer41iyhahwp userres
{
  "rows": [{
      "owner": "zer41iyhahwp",
      "net_weight": "10.00000000 EOS",
      "cpu_weight": "10.00000000 EOS",
      "ram_bytes": 8191
    }
  ],
  "more": false
}

ram_bytes的数据与创建时RAM数据基本(所差1byte是因为,购买RAM通过Bancor估价代币购买,会与实际少许误差)一致。那cleos查出的数据差距在哪?下面跟下系统合约源代码

系统合约源码

查看RAM购买后,设置资源的位置(跳转GitHub)

set_resource_limits( res_itr->owner, res_itr->ram_bytes + ram_gift_bytes, net, cpu );

发现设置资源的位置加上附加的ram_gift_bytes

查看ram_gift_bytes具体数值(跳转github

static constexpr int64_t  ram_gift_bytes        = 1400;

所以,查询账户RAM比实际购买多的部分为合约设置时赠送的部分(忽略运算误差)。

9.366 KiB = 8191 byte + 1400 byte

error: use of undeclared identifier 'current_time_point'

包含头文件

#include <eosio/system.hpp>

https://github.com/EOSIO/eosio.cdt/issues/470

EOS 部署合约出现 deadline ? exceeded by ?us

测试环境

OS: Ubuntu 18.04 server
EOS: v2.0.1
合约:v1.9.1

部署系统合约时出现以下错误

error 2020-02-07T03:05:55.178 cleos     main.cpp:4042                 main                 ] Failed with error: deadline 2020-02-07T03:05:55.175 exceeded by 43us  (2)
deadline 2020-02-07T03:05:55.175 exceeded by 43us

跟下代码(跳转github

#define FC_CHECK_DEADLINE( DEADLINE, ... ) \
  FC_MULTILINE_MACRO_BEGIN \
    if( DEADLINE < fc::time_point::maximum() && DEADLINE < fc::time_point::now() ) { \
       auto log_mgs = FC_LOG_MESSAGE( error, "deadline ${d} exceeded by ${t}us ", \
             FC_FORMAT_ARG_PARAMS(__VA_ARGS__)("d", DEADLINE)("t", fc::time_point::now() - DEADLINE) ); \
       auto msg = log_mgs.get_limited_message(); \
       throw timeout_exception( std::move( log_mgs ), timeout_exception_code, "timeout_exception", std::move( msg ) ); \
    } \
  FC_MULTILINE_MACRO_END

跟踪宏的调用 (跳转github

string exception::to_string( log_level ll   )const
   {
      const auto deadline = fc::time_point::now() + format_time_limit;
      std::stringstream ss;
      try {
         ss << my->_what;
         try {
            ss << " (" << variant( my->_code ).as_string() << ")\n";
         } catch( std::bad_alloc& ) {
            throw;
         } catch( ... ) {
            ss << "<- exception in to_string.\n";
         }
         for( auto itr = my->_elog.begin(); itr != my->_elog.end(); ++itr ) {
            try {
               FC_CHECK_DEADLINE(deadline);

查看 main.cpp:4042跳转github

if (!print_recognized_errors(e, verbose)) {
         // Error is not recognized
         if (!print_help_text(e) || verbose) {
            elog("Failed with error: ${e}", ("e", verbose ? e.to_detail_string() : e.to_string()));
         }
      }

发现该异常,为解析异常错误导致的解析超时错误,并非当时真实的错误。
继续查找 https://github.com/EOSIO/eos/issues/8443

2.0和1.8.9包括新的选项http-max-response-time-ms,该选项有助于减轻api节点的滥用。它允许您指定处理请求的时间限制。当前,这意味着将响应转换为json所需的时间受到限制,这是大多数api请求中最耗时的部分。我们将默认值设为30毫秒,以匹配默认的max-transaction-time。对于大块,30ms可能不足以让您的节点转换为json。当然取决于硬件等。随时随地将它放置在任何级别,您可以满足任何一个处理请求的要求。

解决方法

http-max-response-time-ms参数修改为30毫秒

http-max-response-time-ms = 30

参考

https://github.com/EOSIO/eos/issues/8443
https://github.com/EOSIO/eos/releases/tag/v1.8.9

EOS v2.0.x 打deb 包

测试系统

os: ubuntu 18.04 server
eos: v2.0.1

打包

编译完EOS后,切换到打包脚本目录

./scripts/eosio_build.sh -s EOS
cd ./build/packages

并执行打包操作

./generate_package.sh deb

如果是WSL 打包的话会报

dpkg-deb: error: control directory has bad permissions 777 (must be >=0755 and <=0775)

报错是因为当前打包的目录权限为777,需要修改为 0755到0775之间的某个权限。
由于WSL 默认是没有开启chmod的,所以需要先开启,才能修改目录权限。

WSL 启用chmod

新建配置文件

sudo vi /etc/wsl.conf

内容如下

[automount]
enabled = true
root = /mnt/
options = "metadata"

关闭所有bash,重新打开即可。

修改打包目录权限

chmod 775 eosio/* -R

再次执行打包即可

./generate_package.sh deb