@@ -1286,7 +1286,7 @@ struct controller_impl {
12861286 }
12871287 }
12881288
1289- getpeerkeys_res_t get_top_producer_keys (fc::time_point deadline ) {
1289+ getpeerkeys_res_t get_top_producer_keys () {
12901290 try {
12911291 auto get_getpeerkeys_transaction = [&]() {
12921292 auto perms = vector<permission_level>{};
@@ -1303,7 +1303,7 @@ struct controller_impl {
13031303 transaction_metadata::trx_type::read_only);
13041304
13051305 // allow a max of 20ms for getpeerkeys
1306- auto trace = push_transaction (metadata, deadline , fc::milliseconds (20 ), 0 , false , 0 );
1306+ auto trace = push_transaction (metadata, fc::time_point::maximum () , fc::milliseconds (20 ), 0 , false , 0 );
13071307
13081308 if ( trace->except_ptr )
13091309 std::rethrow_exception (trace->except_ptr );
@@ -3237,6 +3237,11 @@ struct controller_impl {
32373237
32383238 auto & bb = std::get<building_block>(pending->_block_stage );
32393239
3240+ // limit to complete type to avoid multiple calls per block number due to speculative blocks
3241+ if (pending->_block_status == controller::block_status::complete) {
3242+ update_peer_keys ();
3243+ }
3244+
32403245 transaction_trace_ptr onblock_trace;
32413246
32423247 // block status is either ephemeral or incomplete. Modify state of speculative block only if we are building a
@@ -3384,12 +3389,16 @@ struct controller_impl {
33843389 return onblock_trace;
33853390 } // / start_block
33863391
3387- void update_peer_keys (fc::time_point deadline) {
3392+ void update_peer_keys () {
3393+ // if syncing or replaying old blocks don't bother updating peer keys
3394+ if (!peer_keys_db.is_active () || fc::time_point::now () - chain_head.timestamp () > fc::minutes (5 ))
3395+ return ;
3396+
33883397 try {
3389- // update peer public keys from chainbase db using a readonly trx
3390- auto block_num = chain_head. block_num ();
3391- if (block_num % 120 == 0 ) { // update once/minute
3392- peer_keys_db.update_peer_keys (get_top_producer_keys (deadline ));
3398+ auto block_num = chain_head. block_num () + 1 ;
3399+ if (peer_keys_db. should_update (block_num)) { // update once/minute
3400+ // update peer public keys from chainbase db using a readonly trx
3401+ peer_keys_db.update_peer_keys (block_num, get_top_producer_keys ());
33933402 }
33943403 } FC_LOG_AND_DROP ()
33953404 }
@@ -5348,10 +5357,6 @@ transaction_trace_ptr controller::start_block( block_timestamp_type when,
53485357 bs, std::optional<block_id_type>(), deadline );
53495358}
53505359
5351- void controller::update_peer_keys (fc::time_point deadline) {
5352- my->update_peer_keys (deadline);
5353- }
5354-
53555360void controller::assemble_and_complete_block ( const signer_callback_type& signer_callback ) {
53565361 validate_db_available_size ();
53575362
@@ -5848,16 +5853,20 @@ chain_id_type controller::get_chain_id()const {
58485853 return my->chain_id ;
58495854}
58505855
5851- void controller::set_peer_keys_retrieval_active (bool active ) {
5852- my->peer_keys_db .set_active (active );
5856+ void controller::set_peer_keys_retrieval_active (peer_name_set_t configured_bp_peers ) {
5857+ my->peer_keys_db .set_active (std::move (configured_bp_peers) );
58535858}
58545859
5855- peer_info_t controller::get_peer_info (name n) const {
5860+ std::optional< peer_info_t > controller::get_peer_info (name n) const {
58565861 return my->peer_keys_db .get_peer_info (n);
58575862}
58585863
5859- getpeerkeys_res_t controller::get_top_producer_keys (fc::time_point deadline) {
5860- return my->get_top_producer_keys (deadline);
5864+ bool controller::configured_peer_keys_updated () {
5865+ return my->peer_keys_db .configured_peer_keys_updated ();
5866+ }
5867+
5868+ getpeerkeys_res_t controller::get_top_producer_keys () {
5869+ return my->get_top_producer_keys ();
58615870}
58625871
58635872db_read_mode controller::get_read_mode ()const {
0 commit comments