message: Ensure _sessions accessed only on one thread
diff: @@ -1049,26 +1049,22 @@ namespace eosio {
  class bnet_plugin_impl : public std::enable_shared_from_this<bnet_plugin_impl> {
  public:
  - bnet_plugin_impl() {
  - _peer_pk = fc::crypto::private_key::generate();
  - _peer_id = _peer_pk.get_public_key();
  - }
  + bnet_plugin_impl() = default;
  + const private_key_type _peer_pk = fc::crypto::private_key::generate(); /// one time random key to identify this process
  + public_key_type _peer_id = _peer_pk.get_public_key();
  string _bnet_endpoint_address = "0.0.0.0";
  uint16_t _bnet_endpoint_port = 4321;
  bool _request_trx = true;
  - public_key_type _peer_id;
  - private_key_type _peer_pk; /// one time random key to identify this process
  -
  std::vector<std::string> _connect_to_peers; /// list of peers to connect to
  std::vector<std::thread> _socket_threads;
  int32_t _num_threads = 1;
  +
  std::unique_ptr<boost::asio::io_context> _ioc; // lifetime guarded by shared_ptr of bnet_plugin_impl
  std::shared_ptr<listener> _listener;
  - std::shared_ptr<boost::asio::deadline_timer> _timer;
  -
  - std::map<const session*, std::weak_ptr<session> > _sessions;
  + std::shared_ptr<boost::asio::deadline_timer> _timer; // only access on app io_service
  + std::map<const session*, std::weak_ptr<session> > _sessions; // only access on app io_service
  channels::irreversible_block::channel_type::handle _on_irb_handle;
  channels::accepted_block::channel_type::handle _on_accepted_block_handle;
  @@ -1085,6 +1081,7 @@ namespace eosio {
  }
  void on_session_close( const session* s ) {
  + if( !app().get_io_service().get_executor().running_in_this_thread() ) { elog( "wrong strand"); }
  auto itr = _sessions.find(s);
  if( _sessions.end() != itr )
  _sessions.erase(itr);
  @@ -1092,6 +1089,7 @@ namespace eosio {
  template<typename Call>
  void for_each_session( Call callback ) {
  + app().get_io_service().post([this, callback = callback] {
  for (const auto& item : _sessions) {
  if (auto ses = item.second.lock()) {
  ses->_ios.post(boost::asio::bind_executor(
  @@ -1100,6 +1098,7 @@ namespace eosio {
  ));
  }
  }
  + });
  }
  void on_accepted_transaction( transaction_metadata_ptr trx ) {
  @@ -1146,6 +1145,7 @@ namespace eosio {
  };
  void on_reconnect_peers() {
  + if( !app().get_io_service().get_executor().running_in_this_thread() ) { elog( "wrong strand"); }
  for( const auto& peer : _connect_to_peers ) {
  bool found = false;
  for( const auto& con : _sessions ) {
  