{
 "number": 29418,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/29418",
 "title": "rpc: provide per message stats for global traffic via new RPC 'getnetmsgstats'",
 "author": "vasild",
 "author_association": "CONTRIBUTOR",
 "created_at": "2024-02-11T09:32:51Z",
 "updated_at": "2026-08-10T20:27:50Z",
 "age_days": 949,
 "draft": false,
 "labels": [
  "RPC/REST/ZMQ",
  "Needs rebase"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f",
 "head_ref": "getnetmsgstats",
 "head_repo": "vasild/bitcoin",
 "head_history": [
  {
   "t": "2024-02-11T12:45:15Z",
   "sha": "91c90d759503aa3fa15b330bba2148698cdc271d"
  },
  {
   "t": "2024-05-09T13:40:05Z",
   "sha": "6bfda84b921dd21e45441e9fb817ebeb4ee9bbe1"
  },
  {
   "t": "2024-05-23T09:50:42Z",
   "sha": "b5189f543cd5fedc38395a85930c609c09fd34c7"
  },
  {
   "t": "2024-05-23T12:38:48Z",
   "sha": "68dfd4270c5cdbc5009791c8a22aeac6c0d84ffa"
  },
  {
   "t": "2024-09-03T10:30:05Z",
   "sha": "f85814052de368bcbb1176d87c8c4a7cb9cd2b1d"
  },
  {
   "t": "2024-09-30T10:59:15Z",
   "sha": "a8e531f92fd2347584d95bbcb9353597d2241fd1"
  },
  {
   "t": "2024-10-28T11:05:56Z",
   "sha": "f42561e66750d95f0d21bca1930aa7c7f9279f38"
  },
  {
   "t": "2025-01-23T10:46:34Z",
   "sha": "58538c0847c35459305a303869d9eed5d18bc550"
  },
  {
   "t": "2025-01-23T12:42:22Z",
   "sha": "a46cbdd4780ca4d53ae6cba53b0168a9f330f926"
  },
  {
   "t": "2025-01-24T16:15:54Z",
   "sha": "db442f3d6e08d89031f1913695a6cc563f29c2c4"
  },
  {
   "t": "2025-03-20T17:38:12Z",
   "sha": "626cc06c697cc8ddc49329b9d477b6353fca06d8"
  },
  {
   "t": "2025-05-21T08:59:43Z",
   "sha": "528b4d6b9cc7a8364c5e6351144d41be79a47ffc"
  },
  {
   "t": "2025-09-09T08:02:44Z",
   "sha": "87d3d640e66b6d03e2ede60f794a3449234b98f0"
  },
  {
   "t": "2025-09-10T07:56:31Z",
   "sha": "7d4e82c0bbe763acac9ba8770a40c162b79054a7"
  },
  {
   "t": "2026-05-18T08:42:53Z",
   "sha": "9fc5965c554244ae2db7cec2cf696eb7fd3a83d5"
  },
  {
   "t": "2026-05-18T13:06:32Z",
   "sha": "6293e251350dd2b6da6cd6018606e8f780b606f9"
  },
  {
   "t": "2026-06-12T14:16:44Z",
   "sha": "397ac2983a14be446035e683044f6537ce179cb7"
  },
  {
   "t": "2026-06-12T14:22:45Z",
   "sha": "b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f"
  }
 ],
 "additions": 540,
 "deletions": 14,
 "changed_files": 9,
 "commit_count": 3,
 "size_bucket": "L",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "epiccurious",
      "url": "https://github.com/bitcoin/bitcoin/pull/29418#issuecomment-1937894386"
     },
     {
      "login": "danielabrozzoni",
      "url": "https://github.com/bitcoin/bitcoin/pull/29418#pullrequestreview-3778099883"
     },
     {
      "login": "stickies-v",
      "url": "https://github.com/bitcoin/bitcoin/pull/29418#pullrequestreview-4344834666"
     }
    ],
    "stale_ack": [
     {
      "login": "waketraindev",
      "url": "https://github.com/bitcoin/bitcoin/pull/29418#issuecomment-3696978489"
     }
    ]
   },
   "conflicts": [
    {
     "number": 35720,
     "title": "ipc: Update libmultiprocess subtree and drop fuzz test workaround",
     "author": "maflcko"
    },
    {
     "number": 34162,
     "title": "net: Avoid undershooting in GetAddressesUnsafe",
     "author": "fjahr"
    }
   ]
  }
 },
 "acks_parsed": {
  "epiccurious": {
   "kind": "concept_ack",
   "hash": "91c90d759503aa3fa15b330bba2148698cdc271d",
   "t": "2024-02-11T22:26:43Z",
   "stale": false
  },
  "waketraindev": {
   "kind": "ack",
   "hash": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "t": "2025-12-29T16:30:51Z",
   "stale": true
  },
  "danielabrozzoni": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2026-02-10T12:13:26Z",
   "stale": false
  },
  "stickies-v": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2026-05-22T10:57:35Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 1,
  "concept_ack": 3,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "0xB10C",
   "danielabrozzoni",
   "epiccurious",
   "jonatack",
   "maflcko",
   "satsie",
   "sedited",
   "stickies-v",
   "waketraindev"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": false,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-06-12T14:30:05Z",
  "last_reviewer_activity": "2026-08-10T20:27:46Z",
  "last_reviewer": "sedited",
  "author_silent_days": 97,
  "waiting_on_author_days": 37,
  "days_since_update": 37
 },
 "refs": {
  "mentioned": [],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [],
  "conflicts": [
   35720,
   34162
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/net.cpp",
  "src/net.h",
  "src/rpc/net.cpp",
  "test/functional/rpc_net.py"
 ],
 "body": "Introduce a new RPC, `getnetmsgstats` to retrieve traffic bytes and count of messages possibly broken down by:\n* direction (sent or received)\n* network (ipv4, tor, etc)\n* connection type (outbound-full-relay, block-relay-only, etc)\n* message type (verack, ping, etc)\n\nImplements: https://github.com/bitcoin/bitcoin/issues/26337 Add per message stats to getnettotals rpc\n\n---\n\nExamples:\n\nbitcoin-cli getnetmsgstats '[\"direction\", \"network\", \"connection_type\", \"message_type\"]'\n\n```\n{\n  \"bytes\": 5392756,\n  \"count\": 32683\n}\n```\n\nbitcoin-cli getnetmsgstats '[\"direction\", \"network\", \"connection_type\"]'\n\n```\n{\n  \"sendcmpct\": {\n    \"bytes\": 975,\n    \"count\": 31\n  },\n  \"sendaddrv2\": {\n    \"bytes\": 816,\n    \"count\": 28\n  },\n  \"headers\": {\n    \"bytes\": 1786,\n    \"count\": 28\n  },\n  \"feefilter\": {\n    \"bytes\": 816,\n    \"count\": 27\n  },\n  \"version\": {\n    \"bytes\": 4843,\n    \"count\": 37\n  },\n  \"ping\": {\n    \"bytes\": 1104,\n    \"count\": 36\n  },\n  \"getaddr\": {\n    \"bytes\": 384,\n    \"count\": 13\n  },\n  \"block\": {\n    \"bytes\": 5128467,\n    \"count\": 20365\n  },\n  \"getheaders\": {\n    \"bytes\": 29436,\n    \"count\": 28\n  },\n  \"pong\": {\n    \"bytes\": 1040,\n    \"count\": 34\n  },\n  \"getdata\": {\n    \"bytes\": 1218925,\n    \"count\": 20008\n  },\n  \"sendheaders\": {\n    \"bytes\": 447,\n    \"count\": 16\n  },\n  \"wtxidrelay\": {\n    \"bytes\": 816,\n    \"count\": 28\n  },\n  \"addrv2\": {\n    \"bytes\": 301161,\n    \"count\": 25\n  },\n  \"verack\": {\n    \"bytes\": 816,\n    \"count\": 28\n  }\n}\n```\n\nbitcoin-cli getnetmsgstats '[\"direction\", \"connection_type\", \"message_type\"]'\n\n```\n{\n  \"i2p\": {\n    \"bytes\": 1311861,\n    \"count\": 8226\n  },\n  \"onion\": {\n    \"bytes\": 3932760,\n    \"count\": 24272\n  },\n  \"ipv6\": {\n    \"bytes\": 631265,\n    \"count\": 3362\n  },\n  \"ipv4\": {\n    \"bytes\": 1300106,\n    \"count\": 7773\n  }\n}\n```\n\nbitcoin-cli getnetmsgstats\n\n```\n{\n  \"recv\": {\n    \"i2p\": {\n      \"manual\": {\n        \"sendcmpct\": {\n          \"bytes\": 90,\n          \"count\": 3\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 99,\n          \"count\": 3\n        },\n        \"headers\": {\n          \"bytes\": 309,\n          \"count\": 3\n        },\n        \"feefilter\": {\n          \"bytes\": 87,\n          \"count\": 3\n        },\n        \"version\": {\n          \"bytes\": 408,\n          \"count\": 3\n        },\n        \"ping\": {\n          \"bytes\": 87,\n          \"count\": 3\n        },\n        \"block\": {\n          \"bytes\": 432950,\n          \"count\": 1794\n        },\n        \"getheaders\": {\n          \"bytes\": 3150,\n          \"count\": 3\n        },\n        \"pong\": {\n          \"bytes\": 87,\n          \"count\": 3\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 99,\n          \"count\": 3\n        },\n        \"addrv2\": {\n          \"bytes\": 68508,\n          \"count\": 3\n        },\n        \"verack\": {\n          \"bytes\": 99,\n          \"count\": 3\n        }\n      }\n    },\n    \"onion\": {\n      \"block-relay-only\": {\n        \"sendcmpct\": {\n          \"bytes\": 66,\n          \"count\": 2\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"headers\": {\n          \"bytes\": 106,\n          \"count\": 1\n        },\n        \"feefilter\": {\n          \"bytes\": 32,\n          \"count\": 1\n        },\n        \"version\": {\n          \"bytes\": 126,\n          \"count\": 1\n        },\n        \"ping\": {\n          \"bytes\": 64,\n          \"count\": 2\n        },\n        \"block\": {\n          \"bytes\": 478479,\n          \"count\": 1896\n        },\n        \"getheaders\": {\n          \"bytes\": 1053,\n          \"count\": 1\n        },\n        \"pong\": {\n          \"bytes\": 64,\n          \"count\": 2\n        },\n        \"sendheaders\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"verack\": {\n          \"bytes\": 24,\n          \"count\": 1\n        }\n      },\n      \"outbound-full-relay\": {\n        \"sendcmpct\": {\n          \"bytes\": 195,\n          \"count\": 6\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 129,\n          \"count\": 5\n        },\n        \"headers\": {\n          \"bytes\": 527,\n          \"count\": 5\n        },\n        \"feefilter\": {\n          \"bytes\": 157,\n          \"count\": 5\n        },\n        \"version\": {\n          \"bytes\": 639,\n          \"count\": 5\n        },\n        \"ping\": {\n          \"bytes\": 189,\n          \"count\": 6\n        },\n        \"block\": {\n          \"bytes\": 1465688,\n          \"count\": 5957\n        },\n        \"getheaders\": {\n          \"bytes\": 5262,\n          \"count\": 5\n        },\n        \"pong\": {\n          \"bytes\": 189,\n          \"count\": 6\n        },\n        \"sendheaders\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 129,\n          \"count\": 5\n        },\n        \"addrv2\": {\n          \"bytes\": 120693,\n          \"count\": 9\n        },\n        \"verack\": {\n          \"bytes\": 129,\n          \"count\": 5\n        }\n      }\n    },\n    \"ipv6\": {\n      \"manual\": {\n        \"sendcmpct\": {\n          \"bytes\": 120,\n          \"count\": 4\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 132,\n          \"count\": 4\n        },\n        \"headers\": {\n          \"bytes\": 412,\n          \"count\": 4\n        },\n        \"feefilter\": {\n          \"bytes\": 116,\n          \"count\": 4\n        },\n        \"version\": {\n          \"bytes\": 544,\n          \"count\": 4\n        },\n        \"ping\": {\n          \"bytes\": 116,\n          \"count\": 4\n        },\n        \"block\": {\n          \"bytes\": 138074,\n          \"count\": 583\n        },\n        \"getheaders\": {\n          \"bytes\": 4200,\n          \"count\": 4\n        },\n        \"pong\": {\n          \"bytes\": 116,\n          \"count\": 4\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 132,\n          \"count\": 4\n        },\n        \"addrv2\": {\n          \"bytes\": 93436,\n          \"count\": 4\n        },\n        \"verack\": {\n          \"bytes\": 132,\n          \"count\": 4\n        }\n      },\n      \"outbound-full-relay\": {\n        \"version\": {\n          \"bytes\": 126,\n          \"count\": 1\n        }\n      }\n    },\n    \"ipv4\": {\n      \"outbound-full-relay\": {\n        \"sendcmpct\": {\n          \"bytes\": 66,\n          \"count\": 2\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"headers\": {\n          \"bytes\": 106,\n          \"count\": 1\n        },\n        \"feefilter\": {\n          \"bytes\": 32,\n          \"count\": 1\n        },\n        \"version\": {\n          \"bytes\": 252,\n          \"count\": 2\n        },\n        \"ping\": {\n          \"bytes\": 32,\n          \"count\": 1\n        },\n        \"block\": {\n          \"bytes\": 313988,\n          \"count\": 1255\n        },\n        \"getheaders\": {\n          \"bytes\": 1053,\n          \"count\": 1\n        },\n        \"pong\": {\n          \"bytes\": 32,\n          \"count\": 1\n        },\n        \"sendheaders\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"addrv2\": {\n          \"bytes\": 40,\n          \"count\": 1\n        },\n        \"verack\": {\n          \"bytes\": 24,\n          \"count\": 1\n        }\n      }\n    }\n  },\n  \"sent\": {\n    \"i2p\": {\n      \"manual\": {\n        \"sendcmpct\": {\n          \"bytes\": 90,\n          \"count\": 3\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 99,\n          \"count\": 3\n        },\n        \"headers\": {\n          \"bytes\": 66,\n          \"count\": 3\n        },\n        \"feefilter\": {\n          \"bytes\": 87,\n          \"count\": 3\n        },\n        \"version\": {\n          \"bytes\": 544,\n          \"count\": 4\n        },\n        \"ping\": {\n          \"bytes\": 87,\n          \"count\": 3\n        },\n        \"getaddr\": {\n          \"bytes\": 99,\n          \"count\": 3\n        },\n        \"getheaders\": {\n          \"bytes\": 3150,\n          \"count\": 3\n        },\n        \"pong\": {\n          \"bytes\": 87,\n          \"count\": 3\n        },\n        \"getdata\": {\n          \"bytes\": 105382,\n          \"count\": 1789\n        },\n        \"sendheaders\": {\n          \"bytes\": 99,\n          \"count\": 3\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 99,\n          \"count\": 3\n        },\n        \"verack\": {\n          \"bytes\": 99,\n          \"count\": 3\n        }\n      }\n    },\n    \"onion\": {\n      \"block-relay-only\": {\n        \"sendcmpct\": {\n          \"bytes\": 33,\n          \"count\": 1\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"headers\": {\n          \"bytes\": 25,\n          \"count\": 1\n        },\n        \"version\": {\n          \"bytes\": 127,\n          \"count\": 1\n        },\n        \"ping\": {\n          \"bytes\": 64,\n          \"count\": 2\n        },\n        \"getheaders\": {\n          \"bytes\": 1053,\n          \"count\": 1\n        },\n        \"pong\": {\n          \"bytes\": 64,\n          \"count\": 2\n        },\n        \"getdata\": {\n          \"bytes\": 115932,\n          \"count\": 1884\n        },\n        \"sendheaders\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"verack\": {\n          \"bytes\": 24,\n          \"count\": 1\n        }\n      },\n      \"outbound-full-relay\": {\n        \"sendcmpct\": {\n          \"bytes\": 162,\n          \"count\": 5\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 129,\n          \"count\": 5\n        },\n        \"headers\": {\n          \"bytes\": 122,\n          \"count\": 5\n        },\n        \"feefilter\": {\n          \"bytes\": 157,\n          \"count\": 5\n        },\n        \"version\": {\n          \"bytes\": 771,\n          \"count\": 6\n        },\n        \"ping\": {\n          \"bytes\": 221,\n          \"count\": 7\n        },\n        \"getaddr\": {\n          \"bytes\": 129,\n          \"count\": 5\n        },\n        \"getheaders\": {\n          \"bytes\": 5262,\n          \"count\": 5\n        },\n        \"pong\": {\n          \"bytes\": 189,\n          \"count\": 6\n        },\n        \"getdata\": {\n          \"bytes\": 363478,\n          \"count\": 5932\n        },\n        \"sendheaders\": {\n          \"bytes\": 129,\n          \"count\": 5\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 129,\n          \"count\": 5\n        },\n        \"addrv2\": {\n          \"bytes\": 231,\n          \"count\": 4\n        },\n        \"verack\": {\n          \"bytes\": 129,\n          \"count\": 5\n        }\n      }\n    },\n    \"ipv6\": {\n      \"manual\": {\n        \"sendcmpct\": {\n          \"bytes\": 120,\n          \"count\": 4\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 132,\n          \"count\": 4\n        },\n        \"headers\": {\n          \"bytes\": 88,\n          \"count\": 4\n        },\n        \"feefilter\": {\n          \"bytes\": 116,\n          \"count\": 4\n        },\n        \"version\": {\n          \"bytes\": 544,\n          \"count\": 4\n        },\n        \"ping\": {\n          \"bytes\": 116,\n          \"count\": 4\n        },\n        \"getaddr\": {\n          \"bytes\": 132,\n          \"count\": 4\n        },\n        \"getheaders\": {\n          \"bytes\": 4200,\n          \"count\": 4\n        },\n        \"pong\": {\n          \"bytes\": 116,\n          \"count\": 4\n        },\n        \"getdata\": {\n          \"bytes\": 35492,\n          \"count\": 584\n        },\n        \"sendheaders\": {\n          \"bytes\": 99,\n          \"count\": 3\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 132,\n          \"count\": 4\n        },\n        \"verack\": {\n          \"bytes\": 132,\n          \"count\": 4\n        }\n      },\n      \"outbound-full-relay\": {\n        \"version\": {\n          \"bytes\": 254,\n          \"count\": 2\n        }\n      }\n    },\n    \"ipv4\": {\n      \"outbound-full-relay\": {\n        \"sendcmpct\": {\n          \"bytes\": 33,\n          \"count\": 1\n        },\n        \"sendaddrv2\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"headers\": {\n          \"bytes\": 25,\n          \"count\": 1\n        },\n        \"feefilter\": {\n          \"bytes\": 32,\n          \"count\": 1\n        },\n        \"version\": {\n          \"bytes\": 508,\n          \"count\": 4\n        },\n        \"ping\": {\n          \"bytes\": 32,\n          \"count\": 1\n        },\n        \"getaddr\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"getheaders\": {\n          \"bytes\": 1053,\n          \"count\": 1\n        },\n        \"pong\": {\n          \"bytes\": 32,\n          \"count\": 1\n        },\n        \"getdata\": {\n          \"bytes\": 76531,\n          \"count\": 1231\n        },\n        \"sendheaders\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"wtxidrelay\": {\n          \"bytes\": 24,\n          \"count\": 1\n        },\n        \"verack\": {\n          \"bytes\": 24,\n          \"count\": 1\n        }\n      }\n    }\n  }\n}\n```\n\n---\n\nPrevious incarnations of this:\nhttps://github.com/bitcoin/bitcoin/pull/27534 rpc: add 'getnetmsgstats', new rpc to view network message statistics (Thank you, @satsie!)\nhttps://github.com/bitcoin/bitcoin/pull/28926 rpc: add 'getnetmsgstats' RPC (Thank you, @willcl-ark!)",
 "commits": [
  {
   "sha": "dca3bb66737b512b6483c7aa91451f8d974701e2",
   "date": "2026-06-12T08:57:31Z",
   "message": "net: count traffic bytes and number of messages globally\n\nBefore this change only per-peer stats were gathered. They\nare lost when the peer disconnects.\n\nSo, collect the traffic stats globally in `CConnman`, broken down by\n* direction (sent or received, (2))\n* network of the peer (IPv4, IPv6, Tor, I2P, CJDNS (5))\n* connection type (inbound, full outbound, feeler, etc, (6))\n* message type (verack, ping, etc, (36))"
  },
  {
   "sha": "b001579e43e1d910203d5ad43d937f04cabdd984",
   "date": "2026-06-12T14:22:17Z",
   "message": "rpc: visualize global CConnman stats in a new RPC getnetmsgstats\n\nIntroduce a new RPC `getnetmsgstats` that renders the global traffic\nstats from `CConnman`.\n\nCo-authored-by: Vasil Dimov <vd@FreeBSD.org>"
  },
  {
   "sha": "b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f",
   "date": "2026-06-12T14:22:18Z",
   "message": "test: add functional tests for the new getnetmsgstats RPC\n\nCo-authored-by: Vasil Dimov <vd@FreeBSD.org>"
  }
 ],
 "timeline": [
  {
   "t": "2024-02-11T12:45:15Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "91c90d759503aa3fa15b330bba2148698cdc271d"
  },
  {
   "t": "2024-02-11T22:26:43Z",
   "kind": "comment",
   "who": "epiccurious",
   "assoc": "CONTRIBUTOR",
   "text": "Concept ACK 91c90d759503aa3fa15b330bba2148698cdc271d."
  },
  {
   "t": "2024-04-09T16:20:24Z",
   "kind": "comment",
   "who": "0xB10C",
   "assoc": "CONTRIBUTOR",
   "text": "just fyi as this came up: You could count up message stats with the inbound and outbound message tracepoints. However, this does only gives you stats from the points on where you start hooking into the tracepoints, might not be as user friendly (RPC is easier to use than the tracepoints), and the tracepoints currently only work on Linux.\n\nWhile I personally don't need it, I see why some node operators need traffic statistics. E.g. How much of my (limited monthly) traffic is used up by inbound connections?"
  },
  {
   "t": "2024-05-09T13:40:05Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "6bfda84b921dd21e45441e9fb817ebeb4ee9bbe1"
  },
  {
   "t": "2024-05-09T13:40:37Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`91c90d7595...6bfda84b92`: rebase, pick changes from https://github.com/bitcoin/bitcoin/pull/29421 and adjust the newly added test."
  },
  {
   "t": "2024-05-23T09:50:42Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "b5189f543cd5fedc38395a85930c609c09fd34c7"
  },
  {
   "t": "2024-05-23T09:51:33Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`6bfda84b92...b5189f543c`: rebase due to conflicts (part of this PR was merged via https://github.com/bitcoin/bitcoin/pull/29421)"
  },
  {
   "t": "2024-05-23T12:38:48Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "68dfd4270c5cdbc5009791c8a22aeac6c0d84ffa"
  },
  {
   "t": "2024-09-03T10:30:05Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "f85814052de368bcbb1176d87c8c4a7cb9cd2b1d"
  },
  {
   "t": "2024-09-03T10:30:30Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`68dfd4270c...f85814052d`: rebase due to conflicts and to pick CMake"
  },
  {
   "t": "2024-09-30T10:59:15Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "a8e531f92fd2347584d95bbcb9353597d2241fd1"
  },
  {
   "t": "2024-09-30T10:59:33Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`f85814052d...a8e531f92f`: rebase due to conflicts"
  },
  {
   "t": "2024-10-10T22:27:20Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "```suggestion\n        if (key.empty()) {\n```"
  },
  {
   "t": "2024-10-10T22:38:32Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_net.py",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "Suggest making all the added test logging after \"Test getnetmsgstats\" `debug` level rather than `info`.\n```suggestion\n            self.log.debug(\"Compare byte count getnetmsgstats vs getnettotals\")\n```"
  },
  {
   "t": "2024-10-10T22:40:31Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "nit, this prints as:\n\n`(json array, optional, default=empty (no aggregation)) An array of keywords for aggregating the results.`\n\nPerhaps avoid the double braces with\n\n`(json array, optional, default=empty, no aggregation) An array of keywords for aggregating the results.`\n\n```suggestion\n            /*fallback=*/RPCArg::DefaultHint{\"empty, no aggregation\"},\n```"
  },
  {
   "t": "2024-10-11T13:45:13Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_net.py",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "for lines 233-262, it might be more efficient to replace all of these `if self.options.v2transport` conditionals with just one (and if v1 is ever removed, doing so would be a cleaner diff)"
  },
  {
   "t": "2024-10-11T13:45:42Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/net.h",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "I'm confused by the formatting here."
  },
  {
   "t": "2024-10-11T13:49:07Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/net.h",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "Would there be any benefit to moving this class outside of `net.{h,cpp}`? It's quite a lot of code.\n\n(Though, much of its verbosity is the formatting style used that often reads top-to-bottom rather than left-to-right. I prefer the latter.)"
  },
  {
   "t": "2024-10-11T13:52:29Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "Would it make sense to put these 2 `ConnectionType` utility methods in `node/connection_types.{h,cpp}` where they could be more widely used?"
  },
  {
   "t": "2024-10-11T13:54:24Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "Note to self, these 2 `Network` methods might be candidates for extraction in https://github.com/bitcoin/bitcoin/pull/27385."
  },
  {
   "t": "2024-10-11T13:54:28Z",
   "kind": "review",
   "who": "jonatack",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "a8e531f92fd2347584d95bbcb9353597d2241fd1",
   "text": "Lightly tested, a few initial questions/comments. (Edit: I wonder if the code can be a bit less; it seems quite verbose.)"
  },
  {
   "t": "2024-10-11T18:42:43Z",
   "kind": "review_comment",
   "who": "satsie",
   "assoc": "CONTRIBUTOR",
   "path": "src/net.h",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796983203,
   "text": "The thinking behind this is because it is a 4D array, all the nesting required to create it can be a headache to look at. Lines 725 - 727 are the array sizes, the second arguments needed for `std::array` creation. Each one of these lines up with the `std::array` they are part of.\n\nFor example, `NUM_DIRECTIONS` finishes the declaration off the parent level `std::array` that all the others are nested in. For that reason, `NUM_DIRECTIONS` lines up with the space after that array's opening `<`.\n\nHope that made some sense! Open to hearing any suggestions on how to make this easier to read."
  },
  {
   "t": "2024-10-28T11:05:56Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "f42561e66750d95f0d21bca1930aa7c7f9279f38"
  },
  {
   "t": "2024-10-28T11:06:19Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`a8e531f92f...f42561e667`: rebase and address suggestions"
  },
  {
   "t": "2024-10-28T11:16:02Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796995737,
   "text": "See https://github.com/bitcoin/bitcoin/pull/29418#discussion_r1796992532"
  },
  {
   "t": "2024-10-28T11:17:37Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796992532,
   "text": "These are to/from \"index\". By \"index\" here I mean the index in some array that is private in `NetStats`. They are private methods in `NetStats`.\n\nNot sure exposing those to the outside would be useful. Unless to imply a broader meaning in \"index\", something like: \"a zero based number without gaps\". E.g. if there are 3 enums, then each one of them uniquely maps to one of the numbers 0, 1, 2. Would that be useful to some other code, outside of `NetStats`?"
  },
  {
   "t": "2024-10-28T11:19:19Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/net.h",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796987675,
   "text": "No opinion."
  },
  {
   "t": "2024-10-28T11:20:59Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/rpc_net.py",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796982625,
   "text": "Done"
  },
  {
   "t": "2024-10-28T11:21:09Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796174636,
   "text": "Done"
  },
  {
   "t": "2024-10-28T11:21:19Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/rpc_net.py",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796173208,
   "text": "Done"
  },
  {
   "t": "2024-10-28T11:21:29Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1796165328,
   "text": "Done"
  },
  {
   "t": "2025-01-23T10:46:34Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "58538c0847c35459305a303869d9eed5d18bc550"
  },
  {
   "t": "2025-01-23T10:46:49Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`f42561e667...58538c0847`: rebase due to conflicts"
  },
  {
   "t": "2025-01-23T12:42:22Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "a46cbdd4780ca4d53ae6cba53b0168a9f330f926"
  },
  {
   "t": "2025-01-23T12:43:13Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`58538c0847...a46cbdd478`: pet the py linter"
  },
  {
   "t": "2025-01-23T13:24:14Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "no opinion on the changes, but this is a bit verbose and unclear why. clang-tidy named args can be helpful when there is a risk of mixing args, but for example putting `RPCArg::Type` anywhere else will already fail to compile before clang-tidy gets a chance to look at it. Similar reasoning for the string, etc..."
  },
  {
   "t": "2025-01-24T08:35:06Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1926973656,
   "text": "I am fine with anything. Do you suggest to drop `/*name=*/`, `/*type=*/`, `/*fallback=*/` and `/*description=*/`? If you make a suggestion in a form of a diff or new code, how you think it would be better, I will apply it right away."
  },
  {
   "t": "2025-01-24T08:49:50Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1926973656,
   "text": "[quoted text omitted]\n\nYes, I think it would be better to drop them in this case, because:\n\n* This would be the first and only RPC to do this, so it is inconsistent.\n* There isn't any benefit to do it here in this context (as explained above).\n* It is overly verbose.\n* It will break scripted-diffs in the future that assume a halfway uniform format.\n* If there was a benefit or reason to do it, it may be better to do it for all RPCs in a scripted-diff.\n\nBut no strong opinion. It is just a drive-by style-nit, so feel free to ignore."
  },
  {
   "t": "2025-01-24T16:15:54Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "db442f3d6e08d89031f1913695a6cc563f29c2c4"
  },
  {
   "t": "2025-01-24T16:16:08Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 1926973656,
   "text": "Agree. Removed."
  },
  {
   "t": "2025-01-24T16:16:28Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`a46cbdd478...db442f3d6e`: do https://github.com/bitcoin/bitcoin/pull/29418#discussion_r1926973656"
  },
  {
   "t": "2025-03-20T17:38:12Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "626cc06c697cc8ddc49329b9d477b6353fca06d8"
  },
  {
   "t": "2025-03-20T17:38:29Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`db442f3d6e...626cc06c69`: rebase due to conflicts"
  },
  {
   "t": "2025-05-20T20:36:08Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "```suggestion\n        \"Returns the messages count and total number of bytes for network traffic.\\n\"\n```\n\n the ci failure is a bit vague, but I guess this would fix it"
  },
  {
   "t": "2025-05-21T08:59:43Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "528b4d6b9cc7a8364c5e6351144d41be79a47ffc"
  },
  {
   "t": "2025-05-21T09:00:09Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`626cc06c69...528b4d6b9c`: rebase and do https://github.com/bitcoin/bitcoin/pull/29418#discussion_r2098827990"
  },
  {
   "t": "2025-05-22T04:18:18Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/net.cpp",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 2098827990,
   "text": "\"All checks have passed\", thank you :heart:"
  },
  {
   "t": "2025-09-09T08:02:44Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "87d3d640e66b6d03e2ede60f794a3449234b98f0"
  },
  {
   "t": "2025-09-09T08:03:00Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`528b4d6b9c...87d3d640e6`: rebase due to conflicts and fix a typo in comment"
  },
  {
   "t": "2025-09-10T07:56:31Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7"
  },
  {
   "t": "2025-09-10T07:57:12Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`87d3d640e6...7d4e82c0bb`: remove leading `\\n` from RPC help"
  },
  {
   "t": "2025-12-29T01:19:29Z",
   "kind": "comment",
   "who": "waketraindev",
   "assoc": "CONTRIBUTOR",
   "text": "Concept ACK\n\nUseful netstats for tracking. Normally, I'd sum and aggregate peer stats. This approach simplifies that."
  },
  {
   "t": "2025-12-29T16:30:51Z",
   "kind": "comment",
   "who": "waketraindev",
   "assoc": "CONTRIBUTOR",
   "text": "ACK 7d4e82c0bbe763acac9ba8770a40c162b79054a7\n\nlgtm. Tested on master and with v30.1 in my node monitoring dashboard."
  },
  {
   "t": "2026-02-10T10:26:34Z",
   "kind": "review_comment",
   "who": "danielabrozzoni",
   "assoc": "MEMBER",
   "path": "src/net.cpp",
   "commit": "b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f",
   "in_reply_to": null,
   "text": "nit: I would add a short comment here and below to clarify why there are two separate Record calls. For example: \"we record a message when it is accepted by the transport, and we record bytes later, incrementally, when they are actually written to the socket.\""
  },
  {
   "t": "2026-02-10T11:32:27Z",
   "kind": "review_comment",
   "who": "danielabrozzoni",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_net.py",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": null,
   "text": "Debug leftovers?"
  },
  {
   "t": "2026-02-10T12:13:26Z",
   "kind": "review",
   "who": "danielabrozzoni",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "text": "Concept ACK, reviewed up to 5ad1f5d83e1f8dddde90c81dab264df0d5e0dc5c, I still haven't finished the review of the last commit\n\nI wonder if in the functional test, instead of hard-coding the message stats values, we could check how many messages/bytes are sent using P2PInterface... I'm not sure how this would look like or if it's possible at all, I'll try it out and report back :)"
  },
  {
   "t": "2026-03-09T13:04:22Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "CONTRIBUTOR",
   "text": "Ping @vasild for rebase"
  },
  {
   "t": "2026-05-14T10:33:08Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "CONTRIBUTOR",
   "text": "@vasild are you still working on this?"
  },
  {
   "t": "2026-05-18T08:42:53Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "9fc5965c554244ae2db7cec2cf696eb7fd3a83d5"
  },
  {
   "t": "2026-05-18T08:45:07Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`7d4e82c0bbe763acac9ba8770a40c162b79054a7...9fc5965c554244ae2db7cec2cf696eb7fd3a83d5`: rebase and address suggestions\n\n[quoted text omitted]\nYes. This and a few others got pushed way back on my TODO list, slowly processing it, thanks for the patience."
  },
  {
   "t": "2026-05-18T08:45:26Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/rpc_net.py",
   "commit": "7d4e82c0bbe763acac9ba8770a40c162b79054a7",
   "in_reply_to": 2787428347,
   "text": "Yes, removed."
  },
  {
   "t": "2026-05-18T08:45:36Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/net.cpp",
   "commit": "b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f",
   "in_reply_to": 2787115536,
   "text": "Added, thanks!"
  },
  {
   "t": "2026-05-18T13:06:32Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "6293e251350dd2b6da6cd6018606e8f780b606f9"
  },
  {
   "t": "2026-05-22T10:57:35Z",
   "kind": "review",
   "who": "stickies-v",
   "assoc": "CONTRIBUTOR",
   "state": "COMMENTED",
   "commit": "6293e251350dd2b6da6cd6018606e8f780b606f9",
   "text": "Concept ACK. Seems like useful info to expose.\n\nApproach-wise, I like that it adds very little logic in the RPC layer. I quite strongly opppose the aggregation option, just a simple `bitcoin-cli getnetmsgstats` provides a user all the info they need. Visualization/aggregation can easily be done by the user, e.g. using `jq` or any other tool / aggregation they like, so adding that to our interface unnecessarily locks us into backwards compatibility promises and code/interface complexity (even if it's not a crazy amount).\n\nI'm not sure I'll review this in-depth anytime soon, but will try to keep engaging on high-level."
  },
  {
   "t": "2026-05-22T11:20:58Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/net.cpp",
   "commit": "6293e251350dd2b6da6cd6018606e8f780b606f9",
   "in_reply_to": null,
   "text": "nit: You'll have to use named args for all those bools, see the LLM linter DrahtBot comment. Otherwise, it is unclear what they mean. Also, all other RPCs use named args for them."
  },
  {
   "t": "2026-06-12T14:16:44Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "397ac2983a14be446035e683044f6537ce179cb7"
  },
  {
   "t": "2026-06-12T14:22:45Z",
   "kind": "force_push",
   "who": "vasild",
   "commit": "b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f"
  },
  {
   "t": "2026-06-12T14:29:55Z",
   "kind": "comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "text": "`6293e251350dd2b6da6cd6018606e8f780b606f9...b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f`: rebase and address suggestions\n\n[quoted text omitted]\nAlright, that's it. I was thinking the same for some time now - \"Should we do aggregation on the server side, given that it is more like a visualization/presentation thing?\". Thanks for pushing here. I have now dropped the aggregation, which means removing commit d5a1ad981b `rpc: make it possible to aggregate the result in getnetmsgstats` and omitting the parts of the test that tested the aggregation and tweaking the parts of the test that used the aggregation.\n\nThanks!"
  },
  {
   "t": "2026-06-12T14:30:05Z",
   "kind": "review_comment",
   "who": "vasild",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/net.cpp",
   "commit": "6293e251350dd2b6da6cd6018606e8f780b606f9",
   "in_reply_to": 3287977899,
   "text": "Done"
  },
  {
   "t": "2026-08-10T20:27:46Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "CONTRIBUTOR",
   "text": "@vasild ping for rebase."
  }
 ],
 "labels_log": [
  {
   "t": "2024-02-11T09:32:56Z",
   "action": "labeled",
   "label": "RPC/REST/ZMQ",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-11T10:51:03Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-11T13:50:39Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-12T06:18:50Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-09T14:42:44Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-21T19:34:47Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-23T10:11:03Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-23T12:38:52Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-23T20:03:13Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-13T09:45:08Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-03T11:13:06Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-19T12:24:09Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-30T12:22:32Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-11T04:57:05Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-23T12:00:57Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-23T12:20:15Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-23T14:47:47Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-20T08:03:22Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-20T18:57:08Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-18T22:41:34Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-21T13:43:10Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-25T10:34:39Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-09-09T08:10:31Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-13T11:43:30Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-18T09:16:40Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-18T09:34:46Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-18T13:59:48Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-12T14:23:24Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-12T15:25:17Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-14T19:06:10Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2024-04-23T06:28:19Z",
   "kind": "convert_to_draft",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-23T09:51:36Z",
   "kind": "ready_for_review",
   "who": "vasild"
  }
 ],
 "text_chars": 21581,
 "text_tokens_estimate": 5395,
 "changed_paths": [
  "src/net.cpp",
  "src/net.h",
  "src/node/connection_types.h",
  "src/rpc/net.cpp",
  "src/test/fuzz/net.cpp",
  "src/test/fuzz/rpc.cpp",
  "src/test/util/net.cpp",
  "src/test/util/net.h",
  "test/functional/rpc_net.py"
 ],
 "files": [
  {
   "path": "src/net.cpp",
   "add": 177,
   "del": 3
  },
  {
   "path": "src/net.h",
   "add": 85,
   "del": 2
  },
  {
   "path": "src/node/connection_types.h",
   "add": 8,
   "del": 3
  },
  {
   "path": "src/rpc/net.cpp",
   "add": 119,
   "del": 0
  },
  {
   "path": "src/test/fuzz/net.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/test/fuzz/rpc.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/test/util/net.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/util/net.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "test/functional/rpc_net.py",
   "add": 143,
   "del": 0
  }
 ],
 "test_lines": 157,
 "git": {
  "head": "b2d092efcf94e721dab4a36ce3aeefa7f9d9af5f",
  "head_matches_backup": true,
  "base": "142e86a65c8a809911e37ead5ece63ad7854077e",
  "commits": [
   {
    "sha": "dca3bb6673",
    "subject": "net: count traffic bytes and number of messages globally",
    "files": 6,
    "add": 277,
    "del": 14
   },
   {
    "sha": "b001579e43",
    "subject": "rpc: visualize global CConnman stats in a new RPC getnetmsgstats",
    "files": 2,
    "add": 120,
    "del": 0
   },
   {
    "sha": "b2d092efcf",
    "subject": "test: add functional tests for the new getnetmsgstats RPC",
    "files": 1,
    "add": 143,
    "del": 0
   }
  ],
  "patch_truncated": false
 },
 "input_hash": "e3ceb7d1b3350d6d",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}