Page MenuHomePhabricator

D11141.id32625.diff
No OneTemporary

D11141.id32625.diff

diff --git a/src/rpc/avalanche.cpp b/src/rpc/avalanche.cpp
--- a/src/rpc/avalanche.cpp
+++ b/src/rpc/avalanche.cpp
@@ -541,9 +541,12 @@
static RPCHelpMan getavalanchepeerinfo() {
return RPCHelpMan{
"getavalanchepeerinfo",
- "Returns data about each connected avalanche peer as a json array of "
- "objects.\n",
- {},
+ "Returns data about an avalanche peer as a json array of objects. If "
+ "no proofid is provided, returns data about all the peers.\n",
+ {
+ {"proofid", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED,
+ "The hex encoded avalanche proof identifier."},
+ },
RPCResult{
RPCResult::Type::ARR,
"",
@@ -569,35 +572,62 @@
}},
},
RPCExamples{HelpExampleCli("getavalanchepeerinfo", "") +
- HelpExampleRpc("getavalanchepeerinfo", "")},
+ HelpExampleCli("getavalanchepeerinfo", "\"proofid\"") +
+ HelpExampleRpc("getavalanchepeerinfo", "") +
+ HelpExampleRpc("getavalanchepeerinfo", "\"proofid\"")},
[&](const RPCHelpMan &self, const Config &config,
const JSONRPCRequest &request) -> UniValue {
+ RPCTypeCheck(request.params, {UniValue::VSTR});
+
if (!g_avalanche) {
throw JSONRPCError(RPC_INTERNAL_ERROR,
"Avalanche is not initialized");
}
- UniValue ret(UniValue::VARR);
+ auto peerToUniv = [](const avalanche::PeerManager &pm,
+ const avalanche::Peer &peer) {
+ UniValue obj(UniValue::VOBJ);
- g_avalanche->withPeerManager([&](const avalanche::PeerManager &pm) {
- pm.forEachPeer([&](const avalanche::Peer &peer) {
- UniValue obj(UniValue::VOBJ);
+ CDataStream serproof(SER_NETWORK, PROTOCOL_VERSION);
+ serproof << *peer.proof;
- CDataStream serproof(SER_NETWORK, PROTOCOL_VERSION);
- serproof << *peer.proof;
+ obj.pushKV("peerid", uint64_t(peer.peerid));
+ obj.pushKV("proof", HexStr(serproof));
- obj.pushKV("peerid", uint64_t(peer.peerid));
- obj.pushKV("proof", HexStr(serproof));
+ UniValue nodes(UniValue::VARR);
+ pm.forEachNode(peer, [&](const avalanche::Node &n) {
+ nodes.push_back(n.nodeid);
+ });
- UniValue nodes(UniValue::VARR);
- pm.forEachNode(peer, [&](const avalanche::Node &n) {
- nodes.push_back(n.nodeid);
+ obj.pushKV("nodecount", uint64_t(peer.node_count));
+ obj.pushKV("nodes", nodes);
+
+ return obj;
+ };
+
+ UniValue ret(UniValue::VARR);
+
+ g_avalanche->withPeerManager([&](const avalanche::PeerManager &pm) {
+ // If a proofid is provided, only return the associated peer
+ if (!request.params[0].isNull()) {
+ const avalanche::ProofId proofid =
+ avalanche::ProofId::fromHex(
+ request.params[0].get_str());
+ if (!pm.isBoundToPeer(proofid)) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER,
+ "Proofid not found");
+ }
+
+ pm.forPeer(proofid, [&](const avalanche::Peer &peer) {
+ return ret.push_back(peerToUniv(pm, peer));
});
- obj.pushKV("nodecount", uint64_t(peer.node_count));
- obj.pushKV("nodes", nodes);
+ return;
+ }
- ret.push_back(obj);
+ // If no proofid is provided, return all the peers
+ pm.forEachPeer([&](const avalanche::Peer &peer) {
+ ret.push_back(peerToUniv(pm, peer));
});
});
diff --git a/test/functional/abc_rpc_getavalanchepeerinfo.py b/test/functional/abc_rpc_getavalanchepeerinfo.py
--- a/test/functional/abc_rpc_getavalanchepeerinfo.py
+++ b/test/functional/abc_rpc_getavalanchepeerinfo.py
@@ -3,13 +3,16 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test the getavalanchepeerinfo RPC."""
+from random import choice
+
from test_framework.avatools import (
+ avalanche_proof_from_hex,
create_coinbase_stakes,
get_ava_p2p_interface,
)
from test_framework.key import ECKey
from test_framework.test_framework import BitcoinTestFramework
-from test_framework.util import assert_equal
+from test_framework.util import assert_equal, assert_raises_rpc_error
from test_framework.wallet_util import bytes_to_wif
@@ -67,6 +70,18 @@
assert_equal(peer["nodecount"], nodecount)
assert_equal(set(peer["nodes"]), set([n.nodeid for n in nodes[i]]))
+ self.log.info("Testing with a specified proofid")
+
+ assert_raises_rpc_error(-8, "Proofid not found",
+ node.getavalanchepeerinfo, proofid="0" * 64)
+
+ target_proof = choice(proofs)
+ target_proofid = avalanche_proof_from_hex(target_proof).proofid
+ avapeerinfo = node.getavalanchepeerinfo(
+ proofid=f"{target_proofid:0{64}x}")
+ assert_equal(len(avapeerinfo), 1)
+ assert_equal(avapeerinfo[0]["proof"], target_proof)
+
if __name__ == '__main__':
GetAvalanchePeerInfoTest().main()

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 26, 09:57 (1 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5569590
Default Alt Text
D11141.id32625.diff (5 KB)

Event Timeline