{
 "number": 35940,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/35940",
 "title": "net: allow selecting BIP152 high-bandwidth peers with `-addnode`",
 "author": "w0xlt",
 "author_association": "CONTRIBUTOR",
 "created_at": "2026-08-10T05:57:49Z",
 "updated_at": "2026-09-16T22:34:48Z",
 "age_days": 38,
 "draft": false,
 "labels": [
  "P2P"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "3072e067449e35288873da2989f82a122d1a9ab6",
 "head_ref": "feature/addnode-bip152-hb",
 "head_repo": "w0xlt/bitcoin",
 "head_history": [
  {
   "t": "2026-09-16T22:34:22Z",
   "sha": "3072e067449e35288873da2989f82a122d1a9ab6"
  }
 ],
 "additions": 189,
 "deletions": 16,
 "changed_files": 8,
 "commit_count": 4,
 "size_bucket": "M",
 "mergeable_state": "clean",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "jeanpablojp",
      "url": "https://github.com/bitcoin/bitcoin/pull/35940#pullrequestreview-4941909584"
     }
    ]
   },
   "conflicts": [
    {
     "number": 36257,
     "title": "qa: assert_equals -> assert_true/assert_false",
     "author": "hodlinator"
    },
    {
     "number": 36014,
     "title": "init: ignore repeated `-addnode` startup values",
     "author": "w0xlt"
    },
    {
     "number": 17783,
     "title": "common: Disallow calling IsArgSet() on ALLOW_LIST options",
     "author": "ryanofsky"
    },
    {
     "number": 17581,
     "title": "refactor: Remove settings merge reverse precedence code",
     "author": "ryanofsky"
    },
    {
     "number": 17580,
     "title": "refactor: Add ALLOW_LIST flags and enforce usage in CheckArgFlags",
     "author": "ryanofsky"
    },
    {
     "number": 17493,
     "title": "util: Forbid ambiguous multiple assignments in config file",
     "author": "ryanofsky"
    }
   ]
  }
 },
 "acks_parsed": {
  "jeanpablojp": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2026-08-14T23:32:52Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 1,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "jeanpablojp"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "clean",
  "last_author_activity": "2026-09-16T22:34:48Z",
  "last_reviewer_activity": "2026-08-14T23:32:52Z",
  "last_reviewer": "jeanpablojp",
  "author_silent_days": 0,
  "waiting_on_author_days": 0,
  "days_since_update": 0
 },
 "refs": {
  "mentioned": [],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [],
  "conflicts": [
   36257,
   36014,
   17783,
   17581,
   17580,
   17493
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "doc/release-notes-35940.md"
 ],
 "body": "Bitcoin Core automatically selects up to three BIP152 high-bandwidth peers after they deliver useful blocks. This works for ordinary connections, but it cannot use topology information known by the operator.\n\nFor example, an operator may run nodes in multiple locations or maintain a stable, low-latency peering link and want that connection to announce compact blocks immediately and consistently, including after reconnects, instead of waiting for automatic selection.\n\nThis PR adds an opt-in suffix:\n\n```\n-addnode=<host>[:port]=bip152-hb\n```\nA matching outbound peer receives the existing `SENDCMPCT(1)` request after the handshake. The policy is reapplied on reconnect and requires no new P2P protocol messages.\n\nConfigured peers are additional to the three automatically selected peers and are not included in automatic rotation. This intentionally allows explicit configuration to exceed BIP152\u2019s current three-peer limit and may increase redundant bandwidth. If accepted, BIP152 can be updated separately.\n\nThe option is incompatible with `-blocksonly`. Untagged addnodes, inbound connections, and the addnode RPC retain their existing behavior; RPC support can be considered separately.",
 "commits": [
  {
   "sha": "b1a6f73333de97cfa2ba57d249aabc7fa570b7e8",
   "date": "2026-08-09T03:29:34Z",
   "message": "net, init: pass -addnode values to CConnman as AddedNodeParams\n\nBuild the AddedNodeParams records in init.cpp instead of passing raw\nstrings to CConnman, and move the added-node v2 transport decision out of\nCConnman::Init() accordingly. This lets startup code attach per-added-node\nsettings in a follow-up commit.\n\nNo behavior change."
  },
  {
   "sha": "cd501f9b6bba83deb0b7d916a6125f5f066fdc33",
   "date": "2026-08-10T05:41:08Z",
   "message": "net: match outbound peers to BIP152 HB added-node policy\n\nMatch durable outbound peers against persistent added-node records without\ncarrying policy through connection creation. Snapshot tagged endpoints\nunder the added-node mutex, then compare exact destinations and numeric\nservices without name lookups.\n\nThis covers normal added-node connections, name-proxy destinations,\nnumeric aliases, and BIP324 reconnections while keeping DNS out of\nconnection initialization."
  },
  {
   "sha": "f6b7fb689c9a063b8b94b38b7d85b18372bb0aed",
   "date": "2026-08-10T05:41:17Z",
   "message": "net, init: configure BIP152 high bandwidth for added nodes\n\nRecognize the exact =bip152-hb suffix on persistent -addnode entries and\nclassify matching durable outbound peers during peer initialization.\n\nUse the existing SENDCMPCT sent at VERACK to request high-bandwidth\nannouncements, and keep configured peers outside the automatic\nthree-peer rotation list."
  },
  {
   "sha": "3072e067449e35288873da2989f82a122d1a9ab6",
   "date": "2026-09-16T22:31:32Z",
   "message": "doc: add release note for BIP152 high-bandwidth added nodes"
  }
 ],
 "timeline": [
  {
   "t": "2026-08-14T23:32:52Z",
   "kind": "review",
   "who": "jeanpablojp",
   "assoc": "CONTRIBUTOR",
   "state": "COMMENTED",
   "commit": "8ebd31e84c176e9dc83cc9e2356f6d8ae3ce3aba",
   "text": "Concept ACK\n\nThe opt-in override of the BIP152 three-peer cap seems fine to me, since it's an explicit operator choice, not a default, and it's disclosed upfront.\nReusing `-addnode` also made more sense to me than creating a dedicated option."
  },
  {
   "t": "2026-08-14T23:32:52Z",
   "kind": "review_comment",
   "who": "jeanpablojp",
   "assoc": "CONTRIBUTOR",
   "path": "doc/release-notes-35940.md",
   "commit": "3072e067449e35288873da2989f82a122d1a9ab6",
   "in_reply_to": null,
   "text": "shouldn't this be renamed to `release-notes-35940.md` before merge?"
  },
  {
   "t": "2026-09-16T22:34:22Z",
   "kind": "force_push",
   "who": "w0xlt",
   "commit": "3072e067449e35288873da2989f82a122d1a9ab6"
  },
  {
   "t": "2026-09-16T22:34:48Z",
   "kind": "review_comment",
   "who": "w0xlt",
   "assoc": "CONTRIBUTOR",
   "path": "doc/release-notes-35940.md",
   "commit": "3072e067449e35288873da2989f82a122d1a9ab6",
   "in_reply_to": 3787784207,
   "text": "Done. Thanks."
  }
 ],
 "labels_log": [
  {
   "t": "2026-08-10T05:57:54Z",
   "action": "labeled",
   "label": "P2P",
   "who": "DrahtBot"
  }
 ],
 "state_log": [],
 "text_chars": 2809,
 "text_tokens_estimate": 702,
 "changed_paths": [
  "doc/release-notes-35940.md",
  "src/init.cpp",
  "src/net.cpp",
  "src/net.h",
  "src/net_processing.cpp",
  "src/test/net_peer_connection_tests.cpp",
  "test/functional/feature_config_args.py",
  "test/functional/p2p_compactblocks_hb.py"
 ],
 "files": [
  {
   "path": "doc/release-notes-35940.md",
   "add": 12,
   "del": 0
  },
  {
   "path": "src/init.cpp",
   "add": 23,
   "del": 3
  },
  {
   "path": "src/net.cpp",
   "add": 25,
   "del": 0
  },
  {
   "path": "src/net.h",
   "add": 7,
   "del": 7
  },
  {
   "path": "src/net_processing.cpp",
   "add": 14,
   "del": 5
  },
  {
   "path": "src/test/net_peer_connection_tests.cpp",
   "add": 48,
   "del": 0
  },
  {
   "path": "test/functional/feature_config_args.py",
   "add": 21,
   "del": 0
  },
  {
   "path": "test/functional/p2p_compactblocks_hb.py",
   "add": 39,
   "del": 1
  }
 ],
 "test_lines": 109,
 "git": {
  "head": "3072e067449e35288873da2989f82a122d1a9ab6",
  "head_matches_backup": true,
  "base": "128456b62d5e38abea031f97f823d5b28aef9357",
  "commits": [
   {
    "sha": "b1a6f73333",
    "subject": "net, init: pass -addnode values to CConnman as AddedNodeParams",
    "files": 2,
    "add": 7,
    "del": 8
   },
   {
    "sha": "cd501f9b6b",
    "subject": "net: match outbound peers to BIP152 HB added-node policy",
    "files": 3,
    "add": 77,
    "del": 0
   },
   {
    "sha": "f6b7fb689c",
    "subject": "net, init: configure BIP152 high bandwidth for added nodes",
    "files": 4,
    "add": 94,
    "del": 9
   },
   {
    "sha": "3072e06744",
    "subject": "doc: add release note for BIP152 high-bandwidth added nodes",
    "files": 1,
    "add": 12,
    "del": 0
   }
  ],
  "patch_truncated": false
 },
 "input_hash": "b907995b2263a47a",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}