EOS智能合约开发(二十四)EOS网络异灵问题解决

我带团队开发EOS项目,在设计区块链数据回滚方案中。出现了一个问题。我将问题罗列出来,及提供解决方案给大家,请掉坑里的同学参考。
问题一:
问题:报错提示:Not producing block because I don’t have the private key for
问题产生原因:在做数据回滚的时候,我们设计为从指定高度重播数据这个方案中产生问题。
问题分析:
针对报错信息,我们查看源码分析:
源代码位于:eos\plugins\producer_plugin\producer_plugin.cpp

producer_plugin_impl::start_block_result producer_plugin_impl::start_block(bool &last_block) {
   chain::controller& chain = app().get_plugin<chain_plugin>().chain();

   if( chain.get_read_mode() == chain::db_read_mode::READ_ONLY )
      return start_block_result::waiting;

   const auto& hbs = chain.head_block_state();

   //Schedule for the next second's tick regardless of chain state
   // If we would wait less than 50ms (1/10 of block_interval), wait for the whole block interval.
   const fc::time_point now = fc::time_point::now();
   const fc::time_point block_time = calculate_pending_block_time();

   _pending_block_mode = pending_block_mode::producing;

   // Not our turn
   last_block = ((block_timestamp_type(block_time).slot % config::producer_repetitions) == config::producer_repetitions - 1);
   const auto& scheduled_producer = hbs->get_scheduled_producer(block_time);
   auto currrent_watermark_itr = _producer_watermarks.find(scheduled_producer.producer_name);
   auto signature_provider_itr = _signature_providers.find(scheduled_producer.block_signing_key);
   auto irreversible_block_age = get_irreversible_block_age();

   // If the next block production opportunity is in the present or future, we're synced.
   if( !_production_enabled ) {
      _pending_block_mode = pending_block_mode::speculating;
   } else if( _producers.find(scheduled_producer.producer_name) == _producers.end()) {
      _pending_block_mode = pending_block_mode::speculating;
   } else if (signature_provider_itr == _signature_providers.end()) {
      elog("Not producing block because I don't have the private key for ${scheduled_key}", ("scheduled_key", scheduled_producer.block_signing_key));
      _pending_block_mode = pending_block_mode::speculating;
   } else if ( _pause_production ) {
      elog("Not producing block because production is explicitly paused");
      _pending_block_mode = pending_block_mode::speculating;

从源码分析:

auto signature_provider_itr = _signature_providers.find(scheduled_producer.block_signing_key);

这里说明,我们在执行注册生产者节点的时候,将生产者的公钥写入状态机里。那么在做生产的时候,需要从状态机里查询生产者信息,然后用生产者私钥签名生产信息。

cleos system regproducer producename  EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t

出现这个问题,log信息说明没有从状态机里找到这个生产者私钥,但是实际是,我们配置的私钥于注册的不一致导致。但是,实际我们在命令行也配置了公私钥信息,命令行的属性高于配置文件。
我前面写的文章有分析过,在命令行的参数执行属性,高于config.ini文件中的属性。从源码分析得到。(大家可以参考我之前的写《EOS智能合约开发(二十三)nodeos调用mongo_db_plugin源码分析》),既然这样,也许是EOS读取生产者信息的一些Bug导致,为了解决这个问题,我们用双保险解决问题,我们再次去修改config.ini文件,配置生产者公私钥信息到config.ini文件。然后启动节点。
我们先来分析错误时候的log信息。

error 2019-09-07T04:07:53.500 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
info  2019-09-07T04:07:53.507 thread-0  producer_plugin.cpp:341       on_incoming_block    ] Received block d671e5a0e7245264... #15695978 @ 2019-09-07T04:07:53.500 signed by accountpro3 [trxs: 0, lib: 15695930, conf: 0, latency: 7 ms]
error 2019-09-07T04:07:53.507 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:54.000 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:54.500 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:55.000 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:55.500 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:56.000 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:56.500 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:57.000 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:57.500 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:58.000 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t
error 2019-09-07T04:07:58.500 thread-0  producer_plugin.cpp:1031      start_block          ] Not producing block because I don't have the private key for EOS6eTC5oQ6phJLnZPvdeag7ReHKh3K3f13FKTRwKASPrq4qAKd1t

问题解决:
我们开始修改config.ini文件

(eosio::producer_plugin)
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

修改signature-provider =为生产者公钥,私钥即可。
修改完成,我们开启节点。

info  2019-09-07T04:13:30.001 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef826f919420bc... #15696495 @ 2019-09-07T04:13:30.000 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 36]
info  2019-09-07T04:13:30.501 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef8270f9b50c8e... #15696496 @ 2019-09-07T04:13:30.500 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:31.001 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef827103d43848... #15696497 @ 2019-09-07T04:13:31.000 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:31.501 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef82728624c3a3... #15696498 @ 2019-09-07T04:13:31.500 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:32.001 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef82738867abac... #15696499 @ 2019-09-07T04:13:32.000 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:32.501 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef8274c58d2d36... #15696500 @ 2019-09-07T04:13:32.500 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:33.001 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef82759fe861d9... #15696501 @ 2019-09-07T04:13:33.000 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:33.501 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef82760db0344e... #15696502 @ 2019-09-07T04:13:33.500 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:34.001 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef8277d73a5475... #15696503 @ 2019-09-07T04:13:34.000 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]
info  2019-09-07T04:13:34.501 thread-0  producer_plugin.cpp:1494      produce_block        ] Produced block 00ef82789a51d995... #15696504 @ 2019-09-07T04:13:34.500 signed by accountpro4 [trxs: 0, lib: 15696458, confirmed: 0]

log 显示正常。
问题解决。
希望能够帮助到大家。

后续,我们会将我们碰到的所有异灵问题,总结在这里,也希望,大家将自己遇到的异灵问题,提交给我们,大家一起解决后,我们总结给后续同学们。

2019年9月7日于深圳

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值