您正在查看: Surou 发布的文章

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 部署eosio.bios合约,需先激活 WTMSIG_BLOCK_SIGNATURES 共识

问题

按v1.8.x部署的方式,启动链部署eosio.bios时报env.set_proposed_producers_ex unresolveable

$ cleos set contract eosio contracts/eosio.bios
Reading WASM from /mnt/d/github/contracts/eosio.bios/eosio.bios.wasm...
Publishing contract...
Error 3070000: WASM Exception
Error Details:
env.set_proposed_producers_ex unresolveable
pending console output:

测试环境

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

刚启动时可以看到目前支持了以下新共识

info  2020-02-06T01:42:48.853 nodeos    chain_plugin.cpp:421          operator()           ] Support for builtin protocol feature 'PREACTIVATE_FEATURE' (with digest of '0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd') is enabled without activation restrictions
info  2020-02-06T01:42:48.854 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'ONLY_LINK_TO_EXISTING_PERMISSION' (with digest of '1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241') is enabled with preactivation required
info  2020-02-06T01:42:48.856 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'FORWARD_SETCODE' (with digest of '2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25') is enabled with preactivation required
info  2020-02-06T01:42:48.857 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'WTMSIG_BLOCK_SIGNATURES' (with digest of '299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707') is enabled with preactivation required
info  2020-02-06T01:42:48.857 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'REPLACE_DEFERRED' (with digest of 'ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99') is enabled with preactivation required
info  2020-02-06T01:42:48.858 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'NO_DUPLICATE_DEFERRED_ID' (with digest of '4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f') is enabled with preactivation required
info  2020-02-06T01:42:48.860 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'RAM_RESTRICTIONS' (with digest of '4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67') is enabled with preactivation required
info  2020-02-06T01:42:48.861 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'WEBAUTHN_KEY' (with digest of '4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2') is enabled with preactivation required
info  2020-02-06T01:42:48.862 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'DISALLOW_EMPTY_PRODUCER_SCHEDULE' (with digest of '68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428') is enabled with preactivation required
info  2020-02-06T01:42:48.863 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'ONLY_BILL_FIRST_AUTHORIZER' (with digest of '8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405') is enabled with preactivation required
info  2020-02-06T01:42:48.864 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'RESTRICT_ACTION_TO_SELF' (with digest of 'ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43') is enabled with preactivation required
info  2020-02-06T01:42:48.864 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'FIX_LINKAUTH_RESTRICTION' (with digest of 'e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526') is enabled with preactivation required
info  2020-02-06T01:42:48.865 nodeos    chain_plugin.cpp:408          operator()           ] Support for builtin protocol feature 'GET_SENDER' (with digest of 'f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d') is enabled with preactivation required

查询当前已激活共识

curl -X POST http://127.0.0.1:8888/v1/chain/get_activated_protocol_features -d '{}' | jq

查看代码 (github)
https://github.com/EOSIO/eos/blob/e73a43be09478ed3fe5d48071156e1b7caa0e3e1/libraries/chain/controller.cpp#L3330

template<>
void controller_impl::on_activation<builtin_protocol_feature_t::wtmsig_block_signatures>() {
   db.modify( db.get<protocol_state_object>(), [&]( auto& ps ) {
      add_intrinsic_to_whitelist( ps.whitelisted_intrinsics, "set_proposed_producers_ex" );
   } );
}

报错信息提示WTMSIG_BLOCK_SIGNATURES
查看合约更新日志
https://github.com/EOSIO/eosio.contracts/releases/tag/v1.9.1

The eosio.system and eosio.bios contracts contained in this release can only be deployed on an EOSIO blockchain after the activation of the WTMSIG_BLOCK_SIGNATURES consensus protocol upgrade.

只有开启WTMSIG_BLOCK_SIGNATURES共识才能使用此合约。
根据查看 https://github.com/EOSIO/eos/pull/7404

开启WTMSIG_BLOCK_SIGNATURES共识

目前开启WTMSIG_BLOCK_SIGNATURES共识,需要系统账户先部署eosio.boot,并且此合约在单独的合约分支(吐槽下EOSIO代码版本管理...)
先获取下add-boot-contract分支合约

git clone --branch add-boot-contract https://github.com/EOSIO/eosio.contracts.git
./[path]/eosio.contracts/build.sh

和之前部署一样先激活PREACTIVATE_FEATURE

curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}' | jq

然后部署下eosio.boot合约

cleos set contract eosio [path]/eosio.contracts/build/contracts/eosio.boot -p eosio@active

激活WTMSIG_BLOCK_SIGNATURES协议

cleos -u http://127.0.0.1:8888 push transaction '{"delay_sec":0,"max_cpu_usage_ms":0,"actions":[{"account":"eosio","name":"activate","data":{"feature_digest":"299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707"},"authorization":[{"actor":"eosio","permission":"active"}]}]}'

最后查询下PREACTIVATE_FEATUREWTMSIG_BLOCK_SIGNATURES是否已成功激活

curl -X POST http://127.0.0.1:8888/v1/chain/get_activated_protocol_features -d '{}' | jq
{
  "activated_protocol_features": [
    {
      "feature_digest": "0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd",
      "activation_ordinal": 0,
      "activation_block_num": 1176,
      "description_digest": "64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310",
      "dependencies": [],
      "protocol_feature_type": "builtin",
      "specification": [
        {
          "name": "builtin_feature_codename",
          "value": "PREACTIVATE_FEATURE"
        }
      ]
    },
    {
      "feature_digest": "299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707",
      "activation_ordinal": 1,
      "activation_block_num": 12770,
      "description_digest": "ab76031cad7a457f4fd5f5fca97a3f03b8a635278e0416f77dcc91eb99a48e10",
      "dependencies": [],
      "protocol_feature_type": "builtin",
      "specification": [
        {
          "name": "builtin_feature_codename",
          "value": "WTMSIG_BLOCK_SIGNATURES"
        }
      ]
    }
  ]
}

然后继续之前的步骤,继续部署eosio.bios合约,以及后面的步骤

cleos set contract eosio contracts/eosio.bios

参考
https://developers.eos.io/manuals/eos/latest/nodeos/upgrade-guides/1.8-upgrade-guide
https://eosio.stackexchange.com/questions/5241/how-to-activate-the-wtmsig-block-signatures-protocol-feature
https://eosio.stackexchange.com/questions/5235/error-while-deploying-eosio-system-contract-to-eosio-account-while-setting-up-a

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

EOS合约内判断账户是否部署了合约

根据社区小伙伴需求,需要合约内查看某账户是否部署了合约,
我们根据setabi action,看下系统合约代码
https://github.com/EOSIO/eosio.contracts/blob/636406b45a4e1d4c3d7b308f6064dfe61b962814/contracts/eosio.system/src/eosio.system.cpp#L361

  void native::setabi( const name& acnt, const std::vector<char>& abi ) {
      eosio::multi_index< "abihash"_n, abi_hash >  table(get_self(), get_self().value);
      auto itr = table.find( acnt.value );
      if( itr == table.end() ) {
         table.emplace( acnt, [&]( auto& row ) {
            row.owner = acnt;
            row.hash = eosio::sha256(const_cast<char*>(abi.data()), abi.size());
         });
      } else {
         table.modify( itr, same_payer, [&]( auto& row ) {
            row.hash = eosio::sha256(const_cast<char*>(abi.data()), abi.size());
         });
      }
   }

当账户部署合约时,会将合约的hash更新到abihash表,所以我们根据这个表,来判断是否部署了合约就好了

cleos -u https://api.eoslaomao.com get table eosio eosio abihash -L eosio.token -l 1

返回数据

{
  "rows": [{
      "owner": "eosio.token",
      "hash": "85fd4e647e88e595223e69d09a3368a14a45d29320ed1515f54fdfac6ca999df"
    }
  ],
  "more": true
}

当合约账户删除部署合约时,

cleos -u https://api.eoslaomao.com set abi -c

这个hash值为

0000000000000000000000000000000000000000000000000000000000000000
结论

判断下对应账户在该abihash表有记录,且hash值不为0000000000000000000000000000000000000000000000000000000000000000,即为已部署合约。

备注

cleos get code 拿到的是 wasm 和 abi 原数据,然后本地计算的hash(查看源代码),这个一般主要是判断 合约 有没有更新变化用。如果只是判断是否部署合约,还是本文更直接

【Ubuntu】Ubuntu 18.04 LTS 更换国内源——解决终端下载速度慢的问题

最近装了ubuntu18.04 LTS,下载软件有点慢,网上搜了下解决方案,大致是两种:一、把/etc/apt/sources.list文件里的源更换一下,改成阿里云或者其它的镜像的文件;二、更换software&updates里的select best server。

一、更换/etc/apt/sources.list文件里的源

1. 备份源列表

Ubuntu配置的默认源并不是国内的服务器,下载更新软件都比较慢。首先备份源列表文件sources.list:

# 首先备份源列表
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

2. 打开sources.list文件修改

选择合适的源,替换原文件的内容,保存编辑好的文件, 以阿里云更新服务器为例(可以分别测试阿里云、清华、中科大、163源的速度,选择最快的):

# 打开sources.list文件
sudo gedit /etc/apt/sources.list

编辑/etc/apt/sources.list文件, 在文件最前面添加阿里云镜像源:

#  阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

3. 刷新列表

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential

下载速度瞬间就起飞了。

4. 其他源

中科大源:

#  中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

163源:

# 163源
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

清华源:

# 清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

转载自:https://zhuanlan.zhihu.com/p/61228593