refactor: Use NodeClock::time_point for m_connected
What changed, and why it matters
This commit is a straightforward internal cleanup: it changes how Bitcoin Core stores the moment a peer connected, switching from a coarse 'whole seconds since 1970' value to a richer clock type that can carry finer precision. The change touches many files but only rewrites type declarations and conversions; it does not alter network rules, consensus logic, or security behavior. There is no indication this fixes or introduces a vulnerability.
No security action required. Treat as a normal code-quality refactor during review/merge.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors m_connected from std::chrono::seconds to NodeClock::time_point across CNode, NodeEvictionCandidate, RPC, GUI, benchmarks, and tests. It replaces GetTime<std::chrono::seconds>() with NodeClock::now() for the connection timestamp, uses TicksSinceEpoch<std::chrono::seconds> where whole-second epoch output is still required (e.g., getpeerinfo conntime, log messages), and updates comparisons in eviction, inactivity checks, and private-broadcast timeouts to operate on NodeClock::time_point directly. The commit message explicitly calls this a refactor and says it increases precision to the native clock precision rather than prescribing seconds.
Changed components
src/net.cppsrc/net.hsrc/net_processing.cppsrc/node/eviction.cppsrc/node/eviction.hsrc/qt/guiutil.cppsrc/qt/guiutil.hsrc/qt/rpcconsole.cppsrc/rpc/net.cppsrc/bench/peer_eviction.cppsrc/test/fuzz/node_eviction.cppsrc/test/net_peer_eviction_tests.cppsrc/test/util/net.cppInspect captured patch +57 / −57
diff --git a/src/bench/peer_eviction.cpp b/src/bench/peer_eviction.cpp
index 2360fb49..24b78e31 100644
--- a/src/bench/peer_eviction.cpp
+++ b/src/bench/peer_eviction.cpp
@@ -41,7 +41,7 @@ static void EvictionProtection0Networks250Candidates(benchmark::Bench& bench)
bench,
/*num_candidates=*/250,
[](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_network = NET_IPV4;
});
}
@@ -52,7 +52,7 @@ static void EvictionProtection1Networks250Candidates(benchmark::Bench& bench)
bench,
/*num_candidates=*/250,
[](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = false;
if (c.id >= 130 && c.id < 240) { // 110 Tor
c.m_network = NET_ONION;
@@ -68,7 +68,7 @@ static void EvictionProtection2Networks250Candidates(benchmark::Bench& bench)
bench,
/*num_candidates=*/250,
[](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = false;
if (c.id >= 90 && c.id < 160) { // 70 Tor
c.m_network = NET_ONION;
@@ -86,7 +86,7 @@ static void EvictionProtection3Networks050Candidates(benchmark::Bench& bench)
bench,
/*num_candidates=*/50,
[](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 28 || c.id == 47); // 2 localhost
if (c.id >= 30 && c.id < 47) { // 17 I2P
c.m_network = NET_I2P;
@@ -104,7 +104,7 @@ static void EvictionProtection3Networks100Candidates(benchmark::Bench& bench)
bench,
/*num_candidates=*/100,
[](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id >= 55 && c.id < 60); // 5 localhost
if (c.id >= 70 && c.id < 80) { // 10 I2P
c.m_network = NET_I2P;
@@ -122,7 +122,7 @@ static void EvictionProtection3Networks250Candidates(benchmark::Bench& bench)
bench,
/*num_candidates=*/250,
[](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id >= 140 && c.id < 160); // 20 localhost
if (c.id >= 170 && c.id < 180) { // 10 I2P
c.m_network = NET_I2P;
diff --git a/src/net.cpp b/src/net.cpp
index 7152f62a..d046c2a2 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -566,7 +566,7 @@ void CNode::CloseSocketDisconnect()
m_addr_name.c_str(),
ConnectionTypeAsString().c_str(),
ConnectedThroughNetwork(),
- Ticks<std::chrono::seconds>(m_connected));
+ TicksSinceEpoch<std::chrono::seconds>(m_connected));
}
m_i2p_sam_session.reset();
}
@@ -1727,7 +1727,7 @@ bool CConnman::AttemptToEvictConnection()
pnode->m_addr_name.c_str(),
pnode->ConnectionTypeAsString().c_str(),
pnode->ConnectedThroughNetwork(),
- Ticks<std::chrono::seconds>(pnode->m_connected));
+ TicksSinceEpoch<std::chrono::seconds>(pnode->m_connected));
pnode->fDisconnect = true;
return true;
}
@@ -2007,7 +2007,7 @@ void CConnman::NotifyNumConnectionsChanged()
bool CConnman::ShouldRunInactivityChecks(const CNode& node, NodeClock::time_point now) const
{
- return node.m_connected + m_peer_connect_timeout < now.time_since_epoch();
+ return node.m_connected + m_peer_connect_timeout < now;
}
bool CConnman::InactivityCheck(const CNode& node, NodeClock::time_point now) const
@@ -3987,7 +3987,7 @@ CNode::CNode(NodeId idIn,
: m_transport{MakeTransport(idIn, node_opts.use_v2transport, conn_type_in == ConnectionType::INBOUND)},
m_permission_flags{node_opts.permission_flags},
m_sock{sock},
- m_connected{GetTime<std::chrono::seconds>()},
+ m_connected{NodeClock::now()},
addr{addrIn},
addrBind{addrBindIn},
m_addr_name{addrNameIn.empty() ? addr.ToStringAddrPort() : addrNameIn},
diff --git a/src/net.h b/src/net.h
index 4f082b4e..928d518e 100644
--- a/src/net.h
+++ b/src/net.h
@@ -196,7 +196,7 @@ public:
NodeClock::time_point m_last_recv;
std::chrono::seconds m_last_tx_time;
std::chrono::seconds m_last_block_time;
- std::chrono::seconds m_connected;
+ NodeClock::time_point m_connected;
std::string m_addr_name;
int nVersion;
std::string cleanSubVer;
@@ -710,7 +710,7 @@ public:
std::atomic<NodeClock::time_point> m_last_send{NodeClock::epoch};
std::atomic<NodeClock::time_point> m_last_recv{NodeClock::epoch};
//! Unix epoch time at peer connection
- const std::chrono::seconds m_connected;
+ const NodeClock::time_point m_connected;
// Address of this peer
const CAddress addr;
// Bind address of our side of the connection
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index 6b352426..16d3f611 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -561,7 +561,7 @@ private:
void ConsiderEviction(CNode& pto, Peer& peer, std::chrono::seconds time_in_seconds) EXCLUSIVE_LOCKS_REQUIRED(cs_main, g_msgproc_mutex);
/** If we have extra outbound peers, try to disconnect the one with the oldest block announcement */
- void EvictExtraOutboundPeers(std::chrono::seconds now) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
+ void EvictExtraOutboundPeers(NodeClock::time_point now) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
/** Retrieve unbroadcast transactions from the mempool and reattempt sending to peers */
void ReattemptInitialBroadcast(CScheduler& scheduler) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
@@ -5261,7 +5261,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, Peer& peer, std::chrono::seco
}
}
-void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
+void PeerManagerImpl::EvictExtraOutboundPeers(NodeClock::time_point now)
{
// If we have any extra block-relay-only peers, disconnect the youngest unless
// it's given us a block -- in which case, compare with the second-youngest, and
@@ -5302,7 +5302,7 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
return true;
} else {
LogDebug(BCLog::NET, "keeping block-relay-only peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
- pnode->GetId(), count_seconds(pnode->m_connected), node_state->vBlocksInFlight.size());
+ pnode->GetId(), TicksSinceEpoch<std::chrono::seconds>(pnode->m_connected), node_state->vBlocksInFlight.size());
}
return false;
});
@@ -5353,7 +5353,7 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
return true;
} else {
LogDebug(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n",
- pnode->GetId(), count_seconds(pnode->m_connected), state.vBlocksInFlight.size());
+ pnode->GetId(), TicksSinceEpoch<std::chrono::seconds>(pnode->m_connected), state.vBlocksInFlight.size());
return false;
}
});
@@ -5373,9 +5373,10 @@ void PeerManagerImpl::CheckForStaleTipAndEvictPeers()
{
LOCK(cs_main);
+ const auto current_time{NodeClock::now()};
auto now{GetTime<std::chrono::seconds>()};
- EvictExtraOutboundPeers(now);
+ EvictExtraOutboundPeers(current_time);
if (now > m_stale_tip_check_time) {
// Check whether our tip is stale, and if so, allow using an extra
@@ -5740,7 +5741,7 @@ bool PeerManagerImpl::SendMessages(CNode& node)
// Also in CConnman::PushMessage() we make sure that unwanted messages are
// not sent. This here is just an optimization.
if (node.IsPrivateBroadcastConn()) {
- if (node.m_connected + PRIVATE_BROADCAST_MAX_CONNECTION_LIFETIME < current_time) {
+ if (node.m_connected + PRIVATE_BROADCAST_MAX_CONNECTION_LIFETIME < now) {
LogDebug(BCLog::PRIVBROADCAST, "Disconnecting: did not complete the transaction send within %d seconds, %s",
count_seconds(PRIVATE_BROADCAST_MAX_CONNECTION_LIFETIME), node.LogPeer());
node.fDisconnect = true;
@@ -5748,7 +5749,7 @@ bool PeerManagerImpl::SendMessages(CNode& node)
return true;
}
- if (node.IsAddrFetchConn() && current_time - node.m_connected > 10 * AVG_ADDRESS_BROADCAST_INTERVAL) {
+ if (node.IsAddrFetchConn() && now - node.m_connected > 10 * AVG_ADDRESS_BROADCAST_INTERVAL) {
LogDebug(BCLog::NET, "addrfetch connection timeout, %s", node.DisconnectMsg());
node.fDisconnect = true;
return true;
diff --git a/src/node/eviction.cpp b/src/node/eviction.cpp
index a2267813..0914ed73 100644
--- a/src/node/eviction.cpp
+++ b/src/node/eviction.cpp
@@ -218,7 +218,7 @@ void ProtectEvictionCandidatesByRatio(std::vector<NodeEvictionCandidate>& evicti
// (vEvictionCandidates is already sorted by reverse connect time)
uint64_t naMostConnections;
unsigned int nMostConnections = 0;
- std::chrono::seconds nMostConnectionsTime{0};
+ NodeClock::time_point nMostConnectionsTime{NodeClock::epoch};
std::map<uint64_t, std::vector<NodeEvictionCandidate> > mapNetGroupNodes;
for (const NodeEvictionCandidate &node : vEvictionCandidates) {
std::vector<NodeEvictionCandidate> &group = mapNetGroupNodes[node.nKeyedNetGroup];
diff --git a/src/node/eviction.h b/src/node/eviction.h
index 7230d959..3cd40feb 100644
--- a/src/node/eviction.h
+++ b/src/node/eviction.h
@@ -17,7 +17,7 @@ typedef int64_t NodeId;
struct NodeEvictionCandidate {
NodeId id;
- std::chrono::seconds m_connected;
+ NodeClock::time_point m_connected;
NodeClock::duration m_min_ping_time;
std::chrono::seconds m_last_block_time;
std::chrono::seconds m_last_tx_time;
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index e0210b05..e0966b9c 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -743,10 +743,9 @@ QString formatDurationStr(std::chrono::nanoseconds dur)
return str_list.join(" ");
}
-QString FormatPeerAge(std::chrono::seconds time_connected)
+QString FormatPeerAge(NodeClock::time_point connected)
{
- const auto time_now{GetTime<std::chrono::seconds>()};
- const auto age{time_now - time_connected};
+ const auto age{NodeClock::now() - connected};
if (age >= 24h) return QObject::tr("%1 d").arg(age / 24h);
if (age >= 1h) return QObject::tr("%1 h").arg(age / 1h);
if (age >= 1min) return QObject::tr("%1 m").arg(age / 1min);
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index 90b8013e..57d042f6 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -232,7 +232,7 @@ namespace GUIUtil
QString formatDurationStr(std::chrono::nanoseconds dur);
/** Convert peer connection time to a QString denominated in the most relevant unit. */
- QString FormatPeerAge(std::chrono::seconds time_connected);
+ QString FormatPeerAge(NodeClock::time_point connected);
/** Format CNodeStats.nServices bitmask into a user-readable string */
QString formatServicesStr(quint64 mask);
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index fef1f687..4c69ec29 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -1167,7 +1167,7 @@ void RPCConsole::updateDetailWidget()
ui->peerHighBandwidth->setText(bip152_hb_settings);
const auto now{NodeClock::now()};
const auto time_now{GetTime<std::chrono::seconds>()};
- ui->peerConnTime->setText(GUIUtil::formatDurationStr(time_now - stats->nodeStats.m_connected));
+ ui->peerConnTime->setText(GUIUtil::formatDurationStr(now - stats->nodeStats.m_connected));
ui->peerLastBlock->setText(TimeDurationField(time_now, stats->nodeStats.m_last_block_time));
ui->peerLastTx->setText(TimeDurationField(time_now, stats->nodeStats.m_last_tx_time));
ui->peerLastSend->setText(TimeDurationField(now, stats->nodeStats.m_last_send));
diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp
index ff2adf82..08dafdee 100644
--- a/src/rpc/net.cpp
+++ b/src/rpc/net.cpp
@@ -248,7 +248,7 @@ static RPCHelpMan getpeerinfo()
obj.pushKV("last_block", count_seconds(stats.m_last_block_time));
obj.pushKV("bytessent", stats.nSendBytes);
obj.pushKV("bytesrecv", stats.nRecvBytes);
- obj.pushKV("conntime", count_seconds(stats.m_connected));
+ obj.pushKV("conntime", TicksSinceEpoch<std::chrono::seconds>(stats.m_connected));
obj.pushKV("timeoffset", Ticks<std::chrono::seconds>(statestats.time_offset));
if (stats.m_last_ping_time > 0us) {
obj.pushKV("pingtime", Ticks<SecondsDouble>(stats.m_last_ping_time));
diff --git a/src/test/fuzz/node_eviction.cpp b/src/test/fuzz/node_eviction.cpp
index 2ecc91a0..562ece8b 100644
--- a/src/test/fuzz/node_eviction.cpp
+++ b/src/test/fuzz/node_eviction.cpp
@@ -23,7 +23,7 @@ FUZZ_TARGET(node_eviction)
{
eviction_candidates.push_back({
/*id=*/fuzzed_data_provider.ConsumeIntegral<NodeId>(),
- /*m_connected=*/ConsumeTime(fuzzed_data_provider).time_since_epoch(),
+ /*m_connected=*/ConsumeTime(fuzzed_data_provider),
/*m_min_ping_time=*/ConsumeDuration<decltype(NodeEvictionCandidate::m_min_ping_time)>(fuzzed_data_provider, /*min=*/std::chrono::years{-1}, /*max=*/decltype(CNode::m_min_ping_time.load())::max()),
/*m_last_block_time=*/ConsumeTime(fuzzed_data_provider).time_since_epoch(),
/*m_last_tx_time=*/ConsumeTime(fuzzed_data_provider).time_since_epoch(),
diff --git a/src/test/net_peer_eviction_tests.cpp b/src/test/net_peer_eviction_tests.cpp
index 5dc2061a..ab55b75f 100644
--- a/src/test/net_peer_eviction_tests.cpp
+++ b/src/test/net_peer_eviction_tests.cpp
@@ -68,7 +68,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// to be protected from eviction.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = false;
c.m_network = NET_IPV4;
},
@@ -79,7 +79,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// Verify in the opposite direction.
BOOST_CHECK(IsProtected(
num_peers, [num_peers](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{num_peers - c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{num_peers - c.id}};
c.m_is_local = false;
c.m_network = NET_IPV6;
},
@@ -104,7 +104,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// sorted by longest uptime (lowest m_connected), if no localhost, I2P or CJDNS peers.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = false;
c.m_network = (c.id == 3 || c.id > 7) ? NET_ONION : NET_IPV6;
},
@@ -127,7 +127,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// sorted by longest uptime (lowest m_connected), if no onion, I2P, or CJDNS peers.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id > 6);
c.m_network = NET_IPV6;
},
@@ -150,7 +150,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// by longest uptime (lowest m_connected), if no onion, localhost, or CJDNS peers.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = false;
c.m_network = (c.id == 4 || c.id > 8) ? NET_I2P : NET_IPV6;
},
@@ -173,7 +173,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// by longest uptime (lowest m_connected), if no onion, localhost, or I2P peers.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = false;
c.m_network = (c.id == 4 || c.id > 8) ? NET_CJDNS : NET_IPV6;
},
@@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// stable sort breaks tie with array order of localhost first.
BOOST_CHECK(IsProtected(
4, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 4);
c.m_network = (c.id == 3) ? NET_ONION : NET_IPV4;
},
@@ -201,7 +201,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// uptime; stable sort breaks tie with array order of localhost first.
BOOST_CHECK(IsProtected(
7, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 6);
c.m_network = (c.id == 5) ? NET_ONION : NET_IPV4;
},
@@ -214,7 +214,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// by uptime; stable sort breaks tie with array order of localhost first.
BOOST_CHECK(IsProtected(
8, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 6);
c.m_network = (c.id == 5) ? NET_ONION : NET_IPV4;
},
@@ -227,7 +227,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// uptime; stable sort breaks ties with the array order of localhost first.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 6 || c.id == 9 || c.id == 11);
c.m_network = (c.id == 7 || c.id == 8 || c.id == 10) ? NET_ONION : NET_IPV6;
},
@@ -239,7 +239,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// protect 2 localhost and 1 onion, plus 3 other peers, sorted by longest uptime.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id > 4 && c.id < 9);
c.m_network = (c.id == 10) ? NET_ONION : NET_IPV4;
},
@@ -251,7 +251,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// protect 2 localhost and 2 onions, plus 4 other peers, sorted by longest uptime.
BOOST_CHECK(IsProtected(
16, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 6 || c.id == 9 || c.id == 11 || c.id == 12);
c.m_network = (c.id == 8 || c.id == 10) ? NET_ONION : NET_IPV6;
},
@@ -264,7 +264,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// others, sorted by longest uptime.
BOOST_CHECK(IsProtected(
16, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id > 10);
c.m_network = (c.id == 10) ? NET_ONION : NET_IPV4;
},
@@ -277,7 +277,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// plus 4 others, sorted by longest uptime.
BOOST_CHECK(IsProtected(
16, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 15);
c.m_network = (c.id > 6 && c.id < 11) ? NET_ONION : NET_IPV6;
},
@@ -290,7 +290,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// others, sorted by longest uptime.
BOOST_CHECK(IsProtected(
num_peers, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = false;
if (c.id == 8 || c.id == 10) {
c.m_network = NET_ONION;
@@ -311,7 +311,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// by longest uptime; stable sort breaks tie with array order of I2P first.
BOOST_CHECK(IsProtected(
4, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 2);
if (c.id == 3) {
c.m_network = NET_I2P;
@@ -330,7 +330,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// by longest uptime; stable sort breaks tie with array order of I2P first.
BOOST_CHECK(IsProtected(
7, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 4);
if (c.id == 6) {
c.m_network = NET_I2P;
@@ -349,7 +349,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// by uptime; stable sort breaks tie with array order of I2P then localhost.
BOOST_CHECK(IsProtected(
8, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 6);
if (c.id == 5) {
c.m_network = NET_I2P;
@@ -368,7 +368,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// for 8 total, sorted by longest uptime.
BOOST_CHECK(IsProtected(
16, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 6 || c.id > 11);
if (c.id == 7 || c.id == 11) {
c.m_network = NET_I2P;
@@ -387,7 +387,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// sorted by longest uptime.
BOOST_CHECK(IsProtected(
24, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 12);
if (c.id > 14 && c.id < 23) { // 4 protected instead of usual 2
c.m_network = NET_I2P;
@@ -406,7 +406,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// unused localhost slot), plus 6 others for 12/24 total, sorted by longest uptime.
BOOST_CHECK(IsProtected(
24, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 15);
if (c.id == 12 || c.id == 14 || c.id == 17) {
c.m_network = NET_I2P;
@@ -425,7 +425,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// for 12/24 total, sorted by longest uptime.
BOOST_CHECK(IsProtected(
24, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 13);
if (c.id > 16) {
c.m_network = NET_I2P;
@@ -444,7 +444,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// sorted by longest uptime.
BOOST_CHECK(IsProtected(
24, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id > 15);
if (c.id > 10 && c.id < 15) {
c.m_network = NET_CJDNS;
@@ -466,7 +466,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// order of CJDNS first.
BOOST_CHECK(IsProtected(
5, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 3);
if (c.id == 4) {
c.m_network = NET_CJDNS;
@@ -488,7 +488,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// array order of CJDNS first.
BOOST_CHECK(IsProtected(
7, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 4);
if (c.id == 6) {
c.m_network = NET_CJDNS;
@@ -510,7 +510,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// array order of CJDNS first.
BOOST_CHECK(IsProtected(
8, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 3);
if (c.id == 5) {
c.m_network = NET_CJDNS;
@@ -531,7 +531,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// total), plus 4 others for 8 total, sorted by longest uptime.
BOOST_CHECK(IsProtected(
16, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id > 5);
if (c.id == 11 || c.id == 15) {
c.m_network = NET_CJDNS;
@@ -552,7 +552,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
// total), plus 6 others for 12/24 total, sorted by longest uptime.
BOOST_CHECK(IsProtected(
24, [](NodeEvictionCandidate& c) {
- c.m_connected = std::chrono::seconds{c.id};
+ c.m_connected = NodeSeconds{std::chrono::seconds{c.id}};
c.m_is_local = (c.id == 13);
if (c.id > 17) {
c.m_network = NET_CJDNS;
diff --git a/src/test/util/net.cpp b/src/test/util/net.cpp
index 73e5a58d..f20dda41 100644
--- a/src/test/util/net.cpp
+++ b/src/test/util/net.cpp
@@ -140,7 +140,7 @@ std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(int n_candida
for (int id = 0; id < n_candidates; ++id) {
candidates.push_back({
.id=id,
- .m_connected=std::chrono::seconds{random_context.randrange(100)},
+ .m_connected=NodeSeconds{std::chrono::seconds{random_context.randrange(100)}},
.m_min_ping_time=std::chrono::microseconds{random_context.randrange(100)},
.m_last_block_time=std::chrono::seconds{random_context.randrange(100)},
.m_last_tx_time=std::chrono::seconds{random_context.randrange(100)},
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.