Skip to content
Merged
Show file tree
Hide file tree
Changes from 53 commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
7f66aad
GH-1245 Add gossip_bp_peers_message
heifner Mar 12, 2025
4a48bba
GH-1245 Move max_p2p_address_length to net_utils and enforce in split…
heifner Mar 12, 2025
73ba970
GH-1245 Move net_logger_impl to net_logger.hpp
heifner Mar 14, 2025
d51c6ed
GH-1245 Move buffer_factory into buffer_factor.hpp
heifner Mar 14, 2025
414c22d
GH-1245 Add tracking and validation of gossip_bp_peers_message.
heifner Mar 14, 2025
1f97d9d
GH-1245 Refactor some functionality into auto_bp_peering.hpp
heifner Mar 14, 2025
b337c1a
GH-1245 The gethostname() seems to be testing this python script rath…
heifner Mar 17, 2025
b4abdc7
GH-1245 Support both manually configured bp peers and gossip bp peers.
heifner Mar 17, 2025
a18b4fc
GH-1245 Remove extra loop
heifner Mar 17, 2025
c6bed3b
Merge remote-tracking branch 'spring/gh_1183' into GH-1245-gossip-bp-…
heifner Mar 19, 2025
8c98362
GH-1245 Add is_bp_gossip_peer to connection_status
heifner Mar 19, 2025
1a788ea
GH-1245 Integrate peer_keys_db
heifner Mar 19, 2025
dec942d
GH-1245 Add integration test for bp gossip peering
heifner Mar 21, 2025
b4cf089
GH-1245 Do not include sig in digest
heifner Mar 21, 2025
e8cbb49
GH-1245 Add peerkeys table and actions to system contract
heifner Mar 21, 2025
77bf31d
GH-1245 Update to match system contract
heifner Mar 21, 2025
ac93b63
GH-1245 Track active_schedule so when new peers are received in the s…
heifner Mar 21, 2025
8e7e6bd
GH-1245 Fix startup missing disconnect
heifner Mar 21, 2025
8f0c5c4
Merge remote-tracking branch 'spring/gh_1183' into GH-1245-gossip-bp-…
heifner Mar 21, 2025
292e4c2
GH-1245 Reduce test runtime
heifner Mar 21, 2025
b17234d
GH-1245 Simplify and add comment
heifner Mar 25, 2025
b3fac2f
GH-1245 Add some additional logging
heifner Mar 25, 2025
7cb4faa
GH-1245 Clarify code with extra comments and simplier if logic
heifner Mar 26, 2025
fe41bf2
GH-1245 Simplify logic and make sure no more 4 bp peers is maintained…
heifner Mar 26, 2025
c47600c
GH-1245 Make sig update faster and simpler
heifner Mar 26, 2025
1e8c4d2
GH-1245 Move call to connect_to_active_bp_peers() to net_plugin and a…
heifner Mar 26, 2025
52d8878
GH-1245 Remove duplicate code and avoid calling back into net_plugin …
heifner Mar 26, 2025
d4e2a9e
GH-1245 Verify private key found
heifner Mar 26, 2025
d30b57b
GH-1245 Replace is_gossip_bp_connection and is_configured_bp_connecti…
heifner Mar 26, 2025
d8f3204
Use `unique_ptr` in buffer factory. use `send_buffer_type` consistent…
greg7mdp Mar 27, 2025
8dff9eb
Make copies of buffers when posting them.
greg7mdp Mar 27, 2025
17c0cec
Merge branch 'main' into GH-1245-gossip-bp-peers
heifner Mar 27, 2025
3f12cb2
Add a `const`
greg7mdp Mar 27, 2025
1f96d42
Merge branch 'GH-1245-gossip-bp-peers' of github.com:AntelopeIO/sprin…
greg7mdp Mar 27, 2025
724edc0
Return a value as `send_buffer` can be modified at any time.
greg7mdp Mar 28, 2025
de8699e
Also update return value of `get_gossip_bp_initial_send_buffer`
greg7mdp Mar 28, 2025
95c26bb
Merge pull request #1283 from AntelopeIO/buff_factory_unique_ptr
greg7mdp Mar 28, 2025
18d8057
Merge remote-tracking branch 'spring/main' into GH-1245-gossip-bp-peers
heifner Mar 31, 2025
313dbfd
GH-1245 Verify regpeerkey is final before shutdown
heifner Mar 31, 2025
770049c
Merge remote-tracking branch 'spring/main' into GH-1245-gossip-bp-peers
heifner Apr 9, 2025
818da30
GH-1245 go_away_reason now an enum class
heifner Apr 9, 2025
e686d8d
Merge branch 'main' into GH-1245-gossip-bp-peers
heifner Apr 14, 2025
1260fc0
Merge remote-tracking branch 'spring/gh_1183_3' into GH-1245-gossip-b…
heifner Apr 14, 2025
187c406
Merge remote-tracking branch 'spring/gh_1183_3' into GH-1245-gossip-b…
heifner Apr 14, 2025
f87f2b3
GH-1245 Fix merge issue
heifner Apr 15, 2025
89ead3a
GH-1245 peerkeys table moved to peer_keys.?pp
heifner Apr 16, 2025
2235077
GH-1245 Simplify implementation since protoalvote not populated for m…
heifner Apr 16, 2025
65f3c9e
GH-1245 enable-stale-production so production restarts on node restart
heifner Apr 16, 2025
dff3da9
GH-1245 Integrate peer key retrieval by read-only trx. Required waiti…
heifner Apr 16, 2025
e835f95
Merge remote-tracking branch 'spring/main' into GH-1245-gossip-bp-peers
heifner Apr 16, 2025
9e487c0
GH-1245 Update test for simplified system contract
heifner Apr 16, 2025
b629769
1245 Improve test robustness in face of temp duplicate connections
heifner Apr 16, 2025
b8d8f22
Merge branch 'main' into GH-1245-gossip-bp-peers
heifner Apr 16, 2025
0721d18
Merge remote-tracking branch 'spring/main' into GH-1245-gossip-bp-peers
heifner Apr 18, 2025
596135d
GH-1245 Use peer_name_set_t throughout
heifner Apr 19, 2025
f816643
GH-1245 Verify not webauthn sig and don't check for canonical
heifner Apr 19, 2025
3b8145f
GH-1245 Add and use a new endpoint type instead of using string
heifner Apr 21, 2025
e70d33b
GH-1245 Fix host/port parsing when there is only one colon
heifner Apr 21, 2025
436e188
GH-1245 Fix auto_bp_peering_test.py to check for correct host name
heifner Apr 21, 2025
67e038f
Merge remote-tracking branch 'spring/main' into GH-1245-gossip-bp-peers
heifner Apr 22, 2025
f778d71
GH-1245 Reduce logging on expected already connected calls to resolve…
heifner Apr 22, 2025
75c63e3
GH-1245 Rename fatal_error to invalid_message
heifner Apr 22, 2025
4fe408f
GH-1245 Don't consider a peer outside of top producers a fatal error
heifner Apr 22, 2025
107647b
GH-1245 Add debug log statement when connection first becoming bp gos…
heifner Apr 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 25 additions & 16 deletions libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1286,7 +1286,7 @@ struct controller_impl {
}
}

getpeerkeys_res_t get_top_producer_keys(fc::time_point deadline) {
getpeerkeys_res_t get_top_producer_keys() {
try {
auto get_getpeerkeys_transaction = [&]() {
auto perms = vector<permission_level>{};
Expand All @@ -1303,7 +1303,7 @@ struct controller_impl {
transaction_metadata::trx_type::read_only);

// allow a max of 20ms for getpeerkeys
auto trace = push_transaction(metadata, deadline, fc::milliseconds(20), 0, false, 0);
auto trace = push_transaction(metadata, fc::time_point::maximum(), fc::milliseconds(20), 0, false, 0);
Comment thread
greg7mdp marked this conversation as resolved.

if( trace->except_ptr )
std::rethrow_exception(trace->except_ptr);
Expand Down Expand Up @@ -3237,6 +3237,11 @@ struct controller_impl {

auto& bb = std::get<building_block>(pending->_block_stage);

// limit to complete type to avoid multiple calls per block number due to speculative blocks
if (pending->_block_status == controller::block_status::complete) {
update_peer_keys();
}

transaction_trace_ptr onblock_trace;

// block status is either ephemeral or incomplete. Modify state of speculative block only if we are building a
Expand Down Expand Up @@ -3384,12 +3389,16 @@ struct controller_impl {
return onblock_trace;
} /// start_block

void update_peer_keys(fc::time_point deadline) {
void update_peer_keys() {
// if syncing or replaying old blocks don't bother updating peer keys
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good call I didn't think of this when reviewing other PR

if (!peer_keys_db.is_active() || fc::time_point::now() - chain_head.timestamp() > fc::minutes(5))
return;

try {
// update peer public keys from chainbase db using a readonly trx
auto block_num = chain_head.block_num();
if (block_num % 120 == 0) { // update once/minute
peer_keys_db.update_peer_keys(get_top_producer_keys(deadline));
auto block_num = chain_head.block_num() + 1;
if (peer_keys_db.should_update(block_num)) { // update once/minute
// update peer public keys from chainbase db using a readonly trx
peer_keys_db.update_peer_keys(block_num, get_top_producer_keys());
}
} FC_LOG_AND_DROP()
}
Expand Down Expand Up @@ -5339,10 +5348,6 @@ transaction_trace_ptr controller::start_block( block_timestamp_type when,
bs, std::optional<block_id_type>(), deadline );
}

void controller::update_peer_keys(fc::time_point deadline) {
my->update_peer_keys(deadline);
}

void controller::assemble_and_complete_block( const signer_callback_type& signer_callback ) {
validate_db_available_size();

Expand Down Expand Up @@ -5839,16 +5844,20 @@ chain_id_type controller::get_chain_id()const {
return my->chain_id;
}

void controller::set_peer_keys_retrieval_active(bool active) {
my->peer_keys_db.set_active(active);
void controller::set_peer_keys_retrieval_active(flat_set<account_name> configured_bp_peers) {
my->peer_keys_db.set_active(std::move(configured_bp_peers));
}

peer_info_t controller::get_peer_info(name n) const {
std::optional<peer_info_t> controller::get_peer_info(name n) const {
return my->peer_keys_db.get_peer_info(n);
}

getpeerkeys_res_t controller::get_top_producer_keys(fc::time_point deadline) {
return my->get_top_producer_keys(deadline);
bool controller::configured_peer_keys_updated() {
return my->peer_keys_db.configured_peer_keys_updated();
}

getpeerkeys_res_t controller::get_top_producer_keys() {
return my->get_top_producer_keys();
}

db_read_mode controller::get_read_mode()const {
Expand Down
9 changes: 5 additions & 4 deletions libraries/chain/include/eosio/chain/controller.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,6 @@ namespace eosio::chain {
void assemble_and_complete_block( const signer_callback_type& signer_callback );
void sign_block( const signer_callback_type& signer_callback );
void commit_block();
void update_peer_keys(fc::time_point deadline);
void testing_allow_voting(bool val);
bool get_testing_allow_voting_flag();
void set_async_voting(async_t val);
Expand Down Expand Up @@ -445,9 +444,11 @@ namespace eosio::chain {

chain_id_type get_chain_id()const;

void set_peer_keys_retrieval_active(bool active);
peer_info_t get_peer_info(name n) const; // thread safe
getpeerkeys_res_t get_top_producer_keys(fc::time_point deadline); // must be called from main thread
void set_peer_keys_retrieval_active(flat_set<account_name> configured_bp_peers);
std::optional<peer_info_t> get_peer_info(name n) const; // thread safe
bool configured_peer_keys_updated(); // thread safe
// used for testing, only call with an active pending block from main thread
getpeerkeys_res_t get_top_producer_keys();

// thread safe
db_read_mode get_read_mode()const;
Expand Down
39 changes: 24 additions & 15 deletions libraries/chain/include/eosio/chain/peer_keys_db.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,37 @@ class peer_keys_db_t {
using peer_key_map_t = boost::unordered_flat_map<name, peer_info_t, std::hash<name>>;
using new_peers_t = flat_set<name>;
Comment thread
greg7mdp marked this conversation as resolved.
Outdated

peer_keys_db_t();
peer_keys_db_t() = default;

void set_active(bool b) { _active = b; }
// called on startup with configured bp peers of the node
void set_active(new_peers_t configured_bp_peers) {
_configured_bp_peers = std::move(configured_bp_peers);
_active = true;
}

// must be called from main thread
// return the new peers either:
// - added to the top selected producers (according to "getpeerkeys"_n in system contracts)
// - removed from the top selected producers
// - whose key changed
// since the last call to update_peer_keys
// ---------------------------------------
new_peers_t update_peer_keys(const getpeerkeys_res_t& v);
// safe to be called from any thread, _active only modified on startup
bool is_active() const { return _active; }

// must be called from the main thread
// return true if update_peer_keys should be called with new map of peer keys
bool should_update(block_num_type block_num) { return _active && (_last_block_num == 0 || block_num % 120 == 0); }

// must be called from main thread, only call if should_update() returns true
void update_peer_keys(block_num_type block_num, const getpeerkeys_res_t& v);

// safe to be called from any thread
// peers no longer in top selected producers will have a rank of std::numeric_limits<uint32_t>::max()
// ----------------------------------------------------------------------------------
peer_info_t get_peer_info(name n) const;
std::optional<peer_info_t> get_peer_info(name n) const;

private:
std::optional<uint64_t> _get_version(const chainbase::database& db);
// safe to be called from any thread
// returns true if configured bp peers modified, also resets flag so next call returns false until updated again
bool configured_peer_keys_updated();

private:
bool _active = false; // if not active (the default), no update occurs
block_num_type _last_block_num = 0;
new_peers_t _configured_bp_peers; // no updates occurs
std::atomic<bool> _configured_bp_peers_updated{false};

mutable fc::mutex _m;
peer_key_map_t _peer_info_map GUARDED_BY(_m);
};
Expand Down
34 changes: 21 additions & 13 deletions libraries/chain/peer_keys_db.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,40 @@

namespace eosio::chain {

peer_keys_db_t::peer_keys_db_t() : _active(false) {}

peer_info_t peer_keys_db_t::get_peer_info(name n) const {
std::optional<peer_info_t> peer_keys_db_t::get_peer_info(name n) const {
fc::lock_guard g(_m);
assert(_active);
if (auto it = _peer_info_map.find(n); it != _peer_info_map.end())
return it->second;
return peer_info_t{};
return std::optional<peer_info_t>(it->second);
return std::optional<peer_info_t>{};
}

bool peer_keys_db_t::configured_peer_keys_updated() {
return _configured_bp_peers_updated.exchange(false);
}

peer_keys_db_t::new_peers_t peer_keys_db_t::update_peer_keys(const getpeerkeys_res_t& v) {
if (!_active || v.empty())
return {};
void peer_keys_db_t::update_peer_keys(block_num_type block_num, const getpeerkeys_res_t& v) {
assert(_active);
_last_block_num = block_num;

if (v.empty())
return;

// create hash_map of current top selected producers (according to "getpeerkeys"_n in system contracts)
// ----------------------------------------------------------------------------------------------------
peer_key_map_t current;
for (size_t i=0; i<v.size(); ++i)
current[v[i].producer_name] = peer_info_t{static_cast<uint32_t>(i), v[i].peer_key};

bool configured_bp_peers_updated = false;
fc::lock_guard g(_m);
new_peers_t res;

// remove those that aren't among the top producers anymore
// --------------------------------------------------------
for (auto it = _peer_info_map.begin(); it != _peer_info_map.end(); ) {
if (!current.contains(it->first)) {
res.insert(it->first);
if (_configured_bp_peers.contains(it->first))
configured_bp_peers_updated = true;
it = _peer_info_map.erase(it);
} else {
++it;
Expand All @@ -42,11 +48,13 @@ peer_keys_db_t::new_peers_t peer_keys_db_t::update_peer_keys(const getpeerkeys_r
for (auto& pi : current) {
if (!_peer_info_map.contains(pi.first) || _peer_info_map[pi.first] != pi.second) {
_peer_info_map[pi.first] = pi.second;
res.insert(pi.first);
if (_configured_bp_peers.contains(pi.first))
configured_bp_peers_updated = true;
}
}

return res;

if (configured_bp_peers_updated)
_configured_bp_peers_updated = true;
}

} // namespace eosio::chain
Loading
Loading