What changed, and why it matters
This commit is a straightforward code cleanup in the Bitcoin peer-to-peer networking code. It replaces two internal-only wrapper types with a single public type called `HeadersMessage` so that outside developers can directly serialize and deserialize lists of block headers. The actual encoding and decoding logic is unchanged; only the names and visibility are different.
No security action required. Treat as a normal API refactor. Reviewers may want to verify that downstream callers of `NetworkMessage::Headers` are updated to use `HeadersMessage` where needed, but the commit itself does not introduce a vulnerability.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors p2p/src/message.rs by removing the private HeaderSerializationWrapper and HeaderDeserializationWrapper structs and introducing a public HeadersMessage newtype around Vec<block::Header>. The existing Encodable and Decodable implementations are retargeted to this new public type, and NetworkMessage::Headers now carries HeadersMessage instead of a raw Vec<block::Header>. No parsing rules, byte layouts, or validation checks are modified.
Changed components
p2p/src/message.rsNetworkMessage::HeadersHeaderSerializationWrapper (removed)HeaderDeserializationWrapper (removed)HeadersMessage (new public type)Inspect captured patch +11 / −11
diff --git a/p2p/src/message.rs b/p2p/src/message.rs
index 14dde067..b5506ae9 100644
--- a/p2p/src/message.rs
+++ b/p2p/src/message.rs
@@ -227,7 +227,7 @@ pub enum NetworkMessage {
/// `block`
Block(block::Block),
/// `headers`
- Headers(Vec<block::Header>),
+ Headers(HeadersMessage),
/// `sendheaders`
SendHeaders,
/// `getaddr`
@@ -396,9 +396,7 @@ impl V2NetworkMessage {
pub fn command(&self) -> CommandString { self.payload.command() }
}
-struct HeaderSerializationWrapper<'a>(&'a Vec<block::Header>);
-
-impl Encodable for HeaderSerializationWrapper<'_> {
+impl Encodable for HeadersMessage {
#[inline]
fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
let mut len = 0;
@@ -424,7 +422,7 @@ impl Encodable for NetworkMessage {
NetworkMessage::Tx(ref dat) => dat.consensus_encode(writer),
NetworkMessage::Block(ref dat) => dat.consensus_encode(writer),
NetworkMessage::Headers(ref dat) =>
- HeaderSerializationWrapper(dat).consensus_encode(writer),
+ dat.consensus_encode(writer),
NetworkMessage::Ping(ref dat) => dat.consensus_encode(writer),
NetworkMessage::Pong(ref dat) => dat.consensus_encode(writer),
NetworkMessage::MerkleBlock(ref dat) => dat.consensus_encode(writer),
@@ -525,9 +523,11 @@ impl Encodable for V2NetworkMessage {
}
}
-struct HeaderDeserializationWrapper(Vec<block::Header>);
+/// A list of bitcoin block headers.
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct HeadersMessage(pub Vec<block::Header>);
-impl Decodable for HeaderDeserializationWrapper {
+impl Decodable for HeadersMessage {
#[inline]
fn consensus_decode_from_finite_reader<R: BufRead + ?Sized>(
r: &mut R,
@@ -544,7 +544,7 @@ impl Decodable for HeaderDeserializationWrapper {
));
}
}
- Ok(HeaderDeserializationWrapper(ret))
+ Ok(HeadersMessage(ret))
}
#[inline]
@@ -588,7 +588,7 @@ impl Decodable for RawNetworkMessage {
"block" =>
NetworkMessage::Block(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
"headers" => NetworkMessage::Headers(
- HeaderDeserializationWrapper::consensus_decode_from_finite_reader(&mut mem_d)?.0,
+ HeadersMessage::consensus_decode_from_finite_reader(&mut mem_d)?,
),
"sendheaders" => NetworkMessage::SendHeaders,
"getaddr" => NetworkMessage::GetAddr,
@@ -712,7 +712,7 @@ impl Decodable for V2NetworkMessage {
11u8 => NetworkMessage::GetData(Decodable::consensus_decode_from_finite_reader(r)?),
12u8 => NetworkMessage::GetHeaders(Decodable::consensus_decode_from_finite_reader(r)?),
13u8 => NetworkMessage::Headers(
- HeaderDeserializationWrapper::consensus_decode_from_finite_reader(r)?.0,
+ HeadersMessage::consensus_decode_from_finite_reader(r)?,
),
14u8 => NetworkMessage::Inv(Decodable::consensus_decode_from_finite_reader(r)?),
15u8 => NetworkMessage::MemPool,
@@ -908,7 +908,7 @@ mod test {
NetworkMessage::MemPool,
NetworkMessage::Tx(tx),
NetworkMessage::Block(block),
- NetworkMessage::Headers(vec![header]),
+ NetworkMessage::Headers(HeadersMessage(vec![header])),
NetworkMessage::SendHeaders,
NetworkMessage::GetAddr,
NetworkMessage::Ping(15),
Why this scored 19/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.