mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 19:42:46 +01:00
merge bitcoin#19776: expose high bandwidth mode state via getpeerinfo
This commit is contained in:
parent
8f2a460a8e
commit
799214b2c8
9
doc/release-notes-19776.md
Normal file
9
doc/release-notes-19776.md
Normal file
@ -0,0 +1,9 @@
|
||||
Updated RPCs
|
||||
------------
|
||||
|
||||
- The `getpeerinfo` RPC returns two new boolean fields, `bip152_hb_to` and
|
||||
`bip152_hb_from`, that respectively indicate whether we selected a peer to be
|
||||
in compact blocks high-bandwidth mode or whether a peer selected us as a
|
||||
compact blocks high-bandwidth peer. High-bandwidth peers send new block
|
||||
announcements via a `cmpctblock` message rather than the usual inv/headers
|
||||
announcements. See BIP 152 for more details.
|
@ -706,6 +706,8 @@ void CNode::CopyStats(CNodeStats& stats)
|
||||
}
|
||||
stats.fInbound = IsInboundConn();
|
||||
stats.m_manual_connection = IsManualConn();
|
||||
X(m_bip152_highbandwidth_to);
|
||||
X(m_bip152_highbandwidth_from);
|
||||
{
|
||||
LOCK(cs_vSend);
|
||||
X(mapSendBytesPerMsgCmd);
|
||||
|
@ -284,6 +284,8 @@ public:
|
||||
std::string cleanSubVer;
|
||||
bool fInbound;
|
||||
bool m_manual_connection;
|
||||
bool m_bip152_highbandwidth_to;
|
||||
bool m_bip152_highbandwidth_from;
|
||||
int m_starting_height;
|
||||
uint64_t nSendBytes;
|
||||
mapMsgCmdSize mapSendBytesPerMsgCmd;
|
||||
@ -582,6 +584,11 @@ public:
|
||||
}
|
||||
|
||||
public:
|
||||
// We selected peer as (compact blocks) high-bandwidth peer (BIP152)
|
||||
std::atomic<bool> m_bip152_highbandwidth_to{false};
|
||||
// Peer selected us as (compact blocks) high-bandwidth peer (BIP152)
|
||||
std::atomic<bool> m_bip152_highbandwidth_from{false};
|
||||
|
||||
/** Whether we should relay transactions to this peer (their version
|
||||
* message did not include fRelay=false and this is not a block-relay-only
|
||||
* connection). This only changes from false to true. It will never change
|
||||
|
@ -1073,11 +1073,15 @@ void PeerManagerImpl::MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid)
|
||||
// blocks using compact encodings.
|
||||
m_connman.ForNode(lNodesAnnouncingHeaderAndIDs.front(), [this, nCMPCTBLOCKVersion](CNode* pnodeStop){
|
||||
m_connman.PushMessage(pnodeStop, CNetMsgMaker(pnodeStop->GetCommonVersion()).Make(NetMsgType::SENDCMPCT, /*fAnnounceUsingCMPCTBLOCK=*/false, nCMPCTBLOCKVersion));
|
||||
// save BIP152 bandwidth state: we select peer to be low-bandwidth
|
||||
pnodeStop->m_bip152_highbandwidth_to = false;
|
||||
return true;
|
||||
});
|
||||
lNodesAnnouncingHeaderAndIDs.pop_front();
|
||||
}
|
||||
m_connman.PushMessage(pfrom, CNetMsgMaker(pfrom->GetCommonVersion()).Make(NetMsgType::SENDCMPCT, /*fAnnounceUsingCMPCTBLOCK=*/true, nCMPCTBLOCKVersion));
|
||||
// save BIP152 bandwidth state: we select peer to be high-bandwidth
|
||||
pfrom->m_bip152_highbandwidth_to = true;
|
||||
lNodesAnnouncingHeaderAndIDs.push_back(pfrom->GetId());
|
||||
return true;
|
||||
});
|
||||
@ -3687,6 +3691,9 @@ void PeerManagerImpl::ProcessMessage(
|
||||
State(pfrom.GetId())->fProvidesHeaderAndIDs = true;
|
||||
State(pfrom.GetId())->fPreferHeaderAndIDs = fAnnounceUsingCMPCTBLOCK;
|
||||
State(pfrom.GetId())->fSupportsDesiredCmpctVersion = true;
|
||||
// save whether peer selects us as BIP152 high-bandwidth peer
|
||||
// (receiving sendcmpct(1) signals high-bandwidth, sendcmpct(0) low-bandwidth)
|
||||
pfrom.m_bip152_highbandwidth_from = fAnnounceUsingCMPCTBLOCK;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -145,6 +145,8 @@ static RPCHelpMan getpeerinfo()
|
||||
{RPCResult::Type::NUM, "version", "The peer version, such as 70001"},
|
||||
{RPCResult::Type::STR, "subver", "The string version"},
|
||||
{RPCResult::Type::BOOL, "inbound", "Inbound (true) or Outbound (false)"},
|
||||
{RPCResult::Type::BOOL, "bip152_hb_to", "Whether we selected peer as (compact blocks) high-bandwidth peer"},
|
||||
{RPCResult::Type::BOOL, "bip152_hb_from", "Whether peer selected us as (compact blocks) high-bandwidth peer"},
|
||||
{RPCResult::Type::BOOL, "addnode", "Whether connection was due to addnode/-connect or if it was an automatic/inbound connection\n"
|
||||
"(DEPRECATED, returned only if the config option -deprecatedrpc=getpeerinfo_addnode is passed)"},
|
||||
{RPCResult::Type::BOOL, "masternode", "Whether connection was due to masternode connection attempt"},
|
||||
@ -244,6 +246,8 @@ static RPCHelpMan getpeerinfo()
|
||||
// their ver message.
|
||||
obj.pushKV("subver", stats.cleanSubVer);
|
||||
obj.pushKV("inbound", stats.fInbound);
|
||||
obj.pushKV("bip152_hb_to", stats.m_bip152_highbandwidth_to);
|
||||
obj.pushKV("bip152_hb_from", stats.m_bip152_highbandwidth_from);
|
||||
if (IsDeprecatedRPCEnabled("getpeerinfo_addnode")) {
|
||||
// addnode is deprecated in v21 for removal in v22
|
||||
obj.pushKV("addnode", stats.m_manual_connection);
|
||||
|
@ -767,6 +767,34 @@ class CompactBlocksTest(BitcoinTestFramework):
|
||||
stalling_peer.send_and_ping(msg)
|
||||
assert_equal(int(node.getbestblockhash(), 16), block.sha256)
|
||||
|
||||
def test_highbandwidth_mode_states_via_getpeerinfo(self):
|
||||
# create new p2p connection for a fresh state w/o any prior sendcmpct messages sent
|
||||
hb_test_node = self.nodes[0].add_p2p_connection(TestP2PConn(cmpct_version=1))
|
||||
|
||||
# assert the RPC getpeerinfo boolean fields `bip152_hb_{to, from}`
|
||||
# match the given parameters for the last peer of a given node
|
||||
def assert_highbandwidth_states(node, hb_to, hb_from):
|
||||
peerinfo = node.getpeerinfo()[-1]
|
||||
assert_equal(peerinfo['bip152_hb_to'], hb_to)
|
||||
assert_equal(peerinfo['bip152_hb_from'], hb_from)
|
||||
|
||||
# initially, neither node has selected the other peer as high-bandwidth yet
|
||||
assert_highbandwidth_states(self.nodes[0], hb_to=False, hb_from=False)
|
||||
|
||||
# peer requests high-bandwidth mode by sending sendcmpct(1)
|
||||
hb_test_node.send_and_ping(msg_sendcmpct(announce=True, version=1))
|
||||
assert_highbandwidth_states(self.nodes[0], hb_to=False, hb_from=True)
|
||||
|
||||
# peer generates a block and sends it to node, which should
|
||||
# select the peer as high-bandwidth (up to 3 peers according to BIP 152)
|
||||
block = self.build_block_on_tip(self.nodes[0])
|
||||
hb_test_node.send_and_ping(msg_block(block))
|
||||
assert_highbandwidth_states(self.nodes[0], hb_to=True, hb_from=True)
|
||||
|
||||
# peer requests low-bandwidth mode by sending sendcmpct(0)
|
||||
hb_test_node.send_and_ping(msg_sendcmpct(announce=False, version=1))
|
||||
assert_highbandwidth_states(self.nodes[0], hb_to=True, hb_from=False)
|
||||
|
||||
def run_test(self):
|
||||
# Get the nodes out of IBD
|
||||
self.nodes[0].generate(1)
|
||||
@ -817,5 +845,8 @@ class CompactBlocksTest(BitcoinTestFramework):
|
||||
self.log.info("Testing invalid index in cmpctblock message...")
|
||||
self.test_invalid_cmpctblock_message()
|
||||
|
||||
self.log.info("Testing high-bandwidth mode states via getpeerinfo...")
|
||||
self.test_highbandwidth_mode_states_via_getpeerinfo()
|
||||
|
||||
if __name__ == '__main__':
|
||||
CompactBlocksTest().main()
|
||||
|
Loading…
Reference in New Issue
Block a user