What changed, and why it matters
This commit is a routine internal code cleanup in the Rust Bitcoin library. It changes how decoders are created so that Rust's built-in Default mechanism is used instead of manually writing a decoder() function for every type. There is no change to how data is parsed, no bug fix, and no security relevance.
No security action required. Treat as normal refactoring.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors the Decode trait and its implementations to require the associated Decoder type to implement Default and provides a default decoder() method returning Decoder::default(). It removes or replaces hand-written decoder() constructors with #[derive(Default)] on decoder structs and manual Default impls for enums such as Decoder2State, DecoderState, and V2NetworkMessageDecoderState. The change is purely ergonomic and does not alter decoding semantics, input handling, or validation logic.
Changed components
consensus_encoding/src/decode/decoders.rsconsensus_encoding/src/decode/mod.rsconsensus_encoding/tests/compact_size.rsconsensus_encoding/tests/composition.rsconsensus_encoding/tests/decode.rsio/src/lib.rsp2p/src/address.rsp2p/src/bip152.rsp2p/src/lib.rsp2p/src/merkle_tree.rsp2p/src/message.rsp2p/src/message_blockdata.rsp2p/src/message_bloom.rsp2p/src/message_compact_blocks.rsp2p/src/message_filter.rsp2p/src/message_network.rsInspect captured patch +79 / −47
diff --git a/consensus_encoding/src/decode/decoders.rs b/consensus_encoding/src/decode/decoders.rs
index f4ad3c54..c95d676d 100644
--- a/consensus_encoding/src/decode/decoders.rs
+++ b/consensus_encoding/src/decode/decoders.rs
@@ -363,6 +363,7 @@ impl<const N: usize> Decoder for ArrayDecoder<N> {
}
/// A decoder which wraps two inner decoders and returns the output of both.
+#[derive(Default)]
pub struct Decoder2<A, B>
where
A: Decoder,
@@ -380,6 +381,13 @@ enum Decoder2State<A: Decoder, B: Decoder> {
Errored,
}
+// the `#[default]` attribute may only be used on unit enum variants
+impl<A: Decoder + Default, B: Decoder + Default> Default for Decoder2State<A, B> {
+ fn default() -> Self {
+ Self::First(A::default(), B::default())
+ }
+}
+
impl<A, B> Decoder2<A, B>
where
A: Decoder,
@@ -496,6 +504,7 @@ where
}
/// A decoder which decodes three objects, one after the other.
+#[derive(Default)]
pub struct Decoder3<A, B, C>
where
A: Decoder,
@@ -574,6 +583,7 @@ where
}
/// A decoder which decodes four objects, one after the other.
+#[derive(Default)]
pub struct Decoder4<A, B, C, D>
where
A: Decoder,
@@ -662,6 +672,7 @@ where
/// A decoder which decodes six objects, one after the other.
#[allow(clippy::type_complexity)] // Nested composition is easier than flattened alternatives.
+#[derive(Default)]
pub struct Decoder6<A, B, C, D, E, F>
where
A: Decoder,
@@ -893,7 +904,7 @@ mod tests {
/// The decoder for the [`Inner`] type.
#[cfg(feature = "alloc")]
- #[derive(Clone)]
+ #[derive(Clone, Default)]
pub struct InnerDecoder(ArrayDecoder<4>);
#[cfg(feature = "alloc")]
diff --git a/consensus_encoding/src/decode/mod.rs b/consensus_encoding/src/decode/mod.rs
index 484e4586..8c2adfa6 100644
--- a/consensus_encoding/src/decode/mod.rs
+++ b/consensus_encoding/src/decode/mod.rs
@@ -20,6 +20,7 @@ use crate::{DecodeError, UnconsumedError};
///
/// struct Foo([u8; 4]);
///
+/// #[derive(Default)]
/// struct FooDecoder(ArrayDecoder<4>);
///
/// impl Decoder for FooDecoder {
@@ -43,10 +44,12 @@ use crate::{DecodeError, UnconsumedError};
/// ```
pub trait Decode {
/// Associated decoder for the type.
- type Decoder: Decoder<Output = Self>;
+ type Decoder: Decoder<Output = Self> + Default;
/// Constructs a "default decoder" for the type.
- fn decoder() -> Self::Decoder;
+ fn decoder() -> Self::Decoder {
+ Self::Decoder::default()
+ }
}
/// A push decoder for a consensus-decodable object.
diff --git a/consensus_encoding/tests/compact_size.rs b/consensus_encoding/tests/compact_size.rs
index b1fd2ce3..5976de3a 100644
--- a/consensus_encoding/tests/compact_size.rs
+++ b/consensus_encoding/tests/compact_size.rs
@@ -24,6 +24,7 @@ impl Encode for CompactSizeUsize {
/// Wraps `CompactSizeDecoder` to produce `CompactSizeUsize`.
#[cfg(feature = "alloc")]
+#[derive(Default)]
struct CompactSizeUsizeDecoderWrapper(CompactSizeDecoder);
#[cfg(feature = "alloc")]
@@ -61,6 +62,7 @@ impl Encode for CompactSizeU64 {
/// Wraps `CompactSizeU64Decoder` to produce `CompactSizeU64`.
#[cfg(feature = "alloc")]
+#[derive(Default)]
struct CompactSizeU64DecoderWrapper(CompactSizeU64Decoder);
#[cfg(feature = "alloc")]
diff --git a/consensus_encoding/tests/composition.rs b/consensus_encoding/tests/composition.rs
index 3f43211a..60ddf059 100644
--- a/consensus_encoding/tests/composition.rs
+++ b/consensus_encoding/tests/composition.rs
@@ -46,6 +46,7 @@ impl core::fmt::Display for CompositeError {
}
/// A wrapper decoder that converts the tuple output to [`CompositeData`].
+#[derive(Default)]
struct CompositeDataDecoder {
inner: Decoder2<ArrayDecoder<4>, ArrayDecoder<2>>,
}
diff --git a/consensus_encoding/tests/decode.rs b/consensus_encoding/tests/decode.rs
index 06225429..06e67179 100644
--- a/consensus_encoding/tests/decode.rs
+++ b/consensus_encoding/tests/decode.rs
@@ -236,6 +236,7 @@ impl Decode for TestArray {
fn decoder() -> Self::Decoder { TestArrayDecoder { inner: ArrayDecoder::new() } }
}
+#[derive(Default)]
struct TestArrayDecoder {
inner: ArrayDecoder<4>,
}
@@ -393,7 +394,7 @@ fn decode_from_read_unbuffered_extra_data() {
struct Inner(u32);
#[cfg(feature = "alloc")]
-#[derive(Clone)]
+#[derive(Clone, Default)]
struct InnerDecoder(ArrayDecoder<4>);
#[cfg(feature = "alloc")]
diff --git a/io/src/lib.rs b/io/src/lib.rs
index a576f8ef..db7474a4 100644
--- a/io/src/lib.rs
+++ b/io/src/lib.rs
@@ -809,6 +809,7 @@ mod tests {
fn decoder() -> Self::Decoder { TestArrayDecoder { inner: ArrayDecoder::new() } }
}
+ #[derive(Default)]
struct TestArrayDecoder {
inner: ArrayDecoder<4>,
}
diff --git a/p2p/src/address.rs b/p2p/src/address.rs
index d649d3d7..e4e0015a 100644
--- a/p2p/src/address.rs
+++ b/p2p/src/address.rs
@@ -159,7 +159,7 @@ type AddressInnerDecoder = encoding::Decoder3<
>;
/// The Decoder for [`Address`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct AddressDecoder(AddressInnerDecoder);
impl encoding::Decoder for AddressDecoder {
@@ -222,7 +222,7 @@ impl encoding::Encode for AddrV1Message {
type AddrV1MessageInnerDecoder = Decoder2<ArrayDecoder<4>, AddressDecoder>;
/// The decoder for an [`AddrV1Message`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct AddrV1MessageDecoder(AddrV1MessageInnerDecoder);
impl encoding::Decoder for AddrV1MessageDecoder {
@@ -494,7 +494,7 @@ impl encoding::Encode for AddrV2 {
type AddrV2InnerDecoder = Decoder2<ArrayDecoder<1>, ByteVecDecoder>;
/// The decoder type for an [`AddrV2`] type.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct AddrV2Decoder(AddrV2InnerDecoder);
impl AddrV2Decoder {
@@ -659,7 +659,7 @@ type AddrV2MessageInnerDecoder =
Decoder4<ArrayDecoder<4>, CompactSizeU64Decoder, AddrV2Decoder, ArrayDecoder<2>>;
/// The decoder for an [`AddrV2Message`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct AddrV2MessageDecoder(AddrV2MessageInnerDecoder);
impl encoding::Decoder for AddrV2MessageDecoder {
diff --git a/p2p/src/bip152.rs b/p2p/src/bip152.rs
index 4eea6386..0dd18675 100644
--- a/p2p/src/bip152.rs
+++ b/p2p/src/bip152.rs
@@ -75,7 +75,7 @@ impl encoding::Encode for PrefilledTransaction {
type PrefilledTransactionInnerDecoder = Decoder2<CompactSizeDecoder, TransactionDecoder>;
/// The decoder for a [`PrefilledTransaction`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct PrefilledTransactionDecoder(PrefilledTransactionInnerDecoder);
impl PrefilledTransactionDecoder {
@@ -212,7 +212,7 @@ impl encoding::Encode for ShortId {
type ShortIdInnerDecoder = ArrayDecoder<6>;
/// Decoder type for a [`ShortId`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct ShortIdDecoder(ShortIdInnerDecoder);
impl encoding::Decoder for ShortIdDecoder {
@@ -300,7 +300,7 @@ type HeaderAndShortIdsInnerDecoder =
Decoder4<HeaderDecoder, ArrayDecoder<8>, VecDecoder<ShortId>, VecDecoder<PrefilledTransaction>>;
/// Decoder type for the [`HeaderAndShortIds`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct HeaderAndShortIdsDecoder(HeaderAndShortIdsInnerDecoder);
impl HeaderAndShortIdsDecoder {
@@ -445,7 +445,7 @@ impl encoding::Encode for Offset {
fn encoder(&self) -> Self::Encoder<'_> { CompactSizeEncoder::new(self.0) }
}
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
struct OffsetDecoder(CompactSizeDecoder);
impl encoding::Decoder for OffsetDecoder {
@@ -558,7 +558,7 @@ impl encoding::Encode for BlockTransactionsRequest {
type BlockTransactionsRequestInnerDecoder = Decoder2<BlockHashDecoder, VecDecoder<Offset>>;
/// The encoder type for a [`BlockTransactionsRequest`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct BlockTransactionsRequestDecoder(BlockTransactionsRequestInnerDecoder);
impl encoding::Decoder for BlockTransactionsRequestDecoder {
@@ -629,7 +629,7 @@ impl encoding::Encode for BlockTransactions {
type BlockTransactionsInnerDecoder = Decoder2<BlockHashDecoder, VecDecoder<Transaction>>;
/// Decoder type for a [`BlockTransactions`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct BlockTransactionsDecoder(BlockTransactionsInnerDecoder);
impl encoding::Decoder for BlockTransactionsDecoder {
diff --git a/p2p/src/lib.rs b/p2p/src/lib.rs
index b0c22e5c..1d0e9870 100644
--- a/p2p/src/lib.rs
+++ b/p2p/src/lib.rs
@@ -466,7 +466,7 @@ impl encoding::Encode for Magic {
type MagicInnerDecoder = ArrayDecoder<4>;
/// The decoder type for a network [`Magic`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct MagicDecoder(MagicInnerDecoder);
impl encoding::Decoder for MagicDecoder {
diff --git a/p2p/src/merkle_tree.rs b/p2p/src/merkle_tree.rs
index d287408c..38717dd6 100644
--- a/p2p/src/merkle_tree.rs
+++ b/p2p/src/merkle_tree.rs
@@ -144,7 +144,7 @@ impl encoding::Encode for MerkleBlock {
type MerkleBlockInnerDecoder = Decoder2<HeaderDecoder, PartialMerkleTreeDecoder>;
/// The decoder for a [`MerkleBlock`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct MerkleBlockDecoder(MerkleBlockInnerDecoder);
impl encoding::Decoder for MerkleBlockDecoder {
@@ -515,7 +515,7 @@ type PartialMerkleTreeInnerDecoder =
Decoder3<ArrayDecoder<4>, VecDecoder<TxMerkleNode>, ByteVecDecoder>;
/// The decoder type for a [`PartialMerkleTree`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct PartialMerkleTreeDecoder(PartialMerkleTreeInnerDecoder);
impl encoding::Decoder for PartialMerkleTreeDecoder {
diff --git a/p2p/src/message.rs b/p2p/src/message.rs
index baa21854..1e1efbbd 100644
--- a/p2p/src/message.rs
+++ b/p2p/src/message.rs
@@ -160,7 +160,7 @@ impl encoding::ExactSizeEncoder for CommandStringEncoder {
}
/// Decoder for [`CommandString`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct CommandStringDecoder {
inner: encoding::ArrayDecoder<12>,
}
@@ -271,7 +271,7 @@ type V1MessageHeaderInnerDecoder = encoding::Decoder4<
>;
/// The Decoder for `V1MessageHeader`
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct V1MessageHeaderDecoder(V1MessageHeaderInnerDecoder);
impl encoding::Decoder for V1MessageHeaderDecoder {
@@ -344,7 +344,7 @@ impl encoding::Encode for InventoryPayload {
type InventoryInnerDecoder = VecDecoder<message_blockdata::Inventory>;
/// Decoder type for [`InventoryPayload`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct InventoryPayloadDecoder(InventoryInnerDecoder);
impl encoding::Decoder for InventoryPayloadDecoder {
@@ -396,7 +396,7 @@ impl encoding::Encode for AddrPayload {
type AddrPayloadInnerDecoder = VecDecoder<AddrV1Message>;
/// Decoder type for [`AddrPayload`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct AddrPayloadDecoder(AddrPayloadInnerDecoder);
impl encoding::Decoder for AddrPayloadDecoder {
@@ -449,7 +449,7 @@ impl encoding::Encode for AddrV2Payload {
type AddrV2PayloadInnerDecoder = VecDecoder<AddrV2Message>;
/// Decoder type for [`AddrV2Payload`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct AddrV2PayloadDecoder(AddrV2PayloadInnerDecoder);
impl encoding::Decoder for AddrV2PayloadDecoder {
@@ -597,7 +597,7 @@ impl encoding::Encode for Ping {
}
/// The Decoder for [`Ping`]
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct PingDecoder(encoding::ArrayDecoder<8>);
impl encoding::Decoder for PingDecoder {
@@ -654,7 +654,7 @@ impl encoding::Encode for Pong {
}
/// The Decoder for [`Pong`]
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct PongDecoder(encoding::ArrayDecoder<8>);
impl encoding::Decoder for PongDecoder {
@@ -1346,12 +1346,18 @@ enum DecoderState {
},
}
+impl Default for DecoderState {
+ fn default() -> Self {
+ Self::ReadingHeader { header_decoder: Default::default() }
+ }
+}
+
/// Decoder for [`V1NetworkMessage`].
///
/// This decoder implements a two-phase decoding process for Bitcoin V1 P2P messages.
/// It first decodes the fixed-sized header. It then uses the payload length information
/// to decode the dynamically sized network message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct V1NetworkMessageDecoder {
state: DecoderState,
}
@@ -1601,7 +1607,7 @@ impl encoding::Encode for NetworkHeader {
type NetworkHeaderInnerDecoder = Decoder2<HeaderDecoder, ArrayDecoder<1>>;
/// The decoder type for a [`NetworkHeader`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct NetworkHeaderDecoder(NetworkHeaderInnerDecoder);
impl encoding::Decoder for NetworkHeaderDecoder {
@@ -1670,7 +1676,7 @@ impl encoding::Encode for HeadersMessage {
type HeadersMessageInnerDecoder = VecDecoder<NetworkHeader>;
/// The decoder type for a [`HeadersMessage`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct HeadersMessageDecoder(HeadersMessageInnerDecoder);
impl encoding::Decoder for HeadersMessageDecoder {
@@ -1714,12 +1720,19 @@ enum V2NetworkMessageDecoderState {
Errored,
}
+impl Default for V2NetworkMessageDecoderState {
+ fn default() -> Self {
+ Self::ShortId(Default::default())
+ }
+}
+
/// Decoder for [`V2NetworkMessage`].
///
/// This decoder implements a multi-phase decoding process for Bitcoin V2 P2P messages.
/// It first decodes the 1-byte short ID. For optimized messages (IDs 1-28), it dispatches
/// directly to the payload decoder. For non-optimized messages (ID 0), it first reads the
/// 12-byte command string before dispatching.
+#[derive(Default)]
pub struct V2NetworkMessageDecoder {
state: V2NetworkMessageDecoderState,
}
diff --git a/p2p/src/message_blockdata.rs b/p2p/src/message_blockdata.rs
index d9f28f8a..29706d73 100644
--- a/p2p/src/message_blockdata.rs
+++ b/p2p/src/message_blockdata.rs
@@ -101,7 +101,7 @@ impl encoding::Encode for Inventory {
type InventoryInnerDecoder = Decoder2<ArrayDecoder<4>, ArrayDecoder<32>>;
/// The decoder for the [`Inventory`] type.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct InventoryDecoder(InventoryInnerDecoder);
impl encoding::Decoder for InventoryDecoder {
@@ -322,11 +322,11 @@ type GetBlocksOrHeadersInnerDecoder =
Decoder3<ProtocolVersionDecoder, BlockLocatorDecoder, BlockHashDecoder>;
/// Decoder type for [`GetBlocksMessage`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct GetBlocksMessageDecoder(GetBlocksOrHeadersInnerDecoder);
/// Decoder type for [`GetHeadersMessage`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct GetHeadersMessageDecoder(GetBlocksOrHeadersInnerDecoder);
impl encoding::Decoder for GetHeadersMessageDecoder {
diff --git a/p2p/src/message_bloom.rs b/p2p/src/message_bloom.rs
index 69ef393b..a2da0f9f 100644
--- a/p2p/src/message_bloom.rs
+++ b/p2p/src/message_bloom.rs
@@ -67,7 +67,7 @@ type FilterLoadInnerDecoder =
Decoder4<ByteVecDecoder, ArrayDecoder<4>, ArrayDecoder<4>, BloomFlagsDecoder>;
/// The decoder for the [`FilterLoad`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct FilterLoadDecoder(FilterLoadInnerDecoder);
impl encoding::Decoder for FilterLoadDecoder {
@@ -139,7 +139,7 @@ impl encoding::Encode for BloomFlags {
type BloomFlagsInnerDecoder = ArrayDecoder<1>;
/// The decoder for [`BloomFlags`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct BloomFlagsDecoder(BloomFlagsInnerDecoder);
impl BloomFlagsDecoder {
@@ -208,7 +208,7 @@ impl encoding::Encode for FilterAdd {
type FilterAddInnerDecoder = ByteVecDecoder;
/// The decoder for the [`FilterAdd`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct FilterAddDecoder(FilterAddInnerDecoder);
impl encoding::Decoder for FilterAddDecoder {
diff --git a/p2p/src/message_compact_blocks.rs b/p2p/src/message_compact_blocks.rs
index aa5bd687..6a4b0b2b 100644
--- a/p2p/src/message_compact_blocks.rs
+++ b/p2p/src/message_compact_blocks.rs
@@ -40,7 +40,7 @@ impl encoding::Encode for SendCmpct {
type SendCmpctInnerDecoder = Decoder2<ArrayDecoder<1>, ArrayDecoder<8>>;
/// Decoder type for the [`SendCmpct`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct SendCmpctDecoder(SendCmpctInnerDecoder);
impl encoding::Decoder for SendCmpctDecoder {
diff --git a/p2p/src/message_filter.rs b/p2p/src/message_filter.rs
index 2a960277..1d0f7819 100644
--- a/p2p/src/message_filter.rs
+++ b/p2p/src/message_filter.rs
@@ -78,7 +78,7 @@ impl encoding::Encode for FilterHeader {
type HashInnerDecoder = ArrayDecoder<32>;
/// Decoder for the [`FilterHash`] type.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct FilterHashDecoder(HashInnerDecoder);
impl encoding::Decoder for FilterHashDecoder {
@@ -107,7 +107,7 @@ impl encoding::Decode for FilterHash {
}
/// Decoder for the [`FilterHeader`] type.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct FilterHeaderDecoder(HashInnerDecoder);
impl encoding::Decoder for FilterHeaderDecoder {
@@ -181,7 +181,7 @@ impl encoding::Encode for GetCFilters {
type GetCFiltersInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHeightDecoder, BlockHashDecoder>;
/// Decoder type for the [`GetCFilters`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct GetCFiltersDecoder(GetCFiltersInnerDecoder);
impl encoding::Decoder for GetCFiltersDecoder {
@@ -259,7 +259,7 @@ impl encoding::Encode for CFilter {
type CFilterInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHashDecoder, ByteVecDecoder>;
/// Decoder type for a [`CFilter`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct CFilterDecoder(CFilterInnerDecoder);
impl encoding::Decoder for CFilterDecoder {
@@ -325,7 +325,7 @@ impl encoding::Encode for GetCFHeaders {
type GetCFHeadersInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHeightDecoder, BlockHashDecoder>;
/// Decoder type for the [`GetCFHeaders`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct GetCFHeadersDecoder(GetCFHeadersInnerDecoder);
impl encoding::Decoder for GetCFHeadersDecoder {
@@ -405,7 +405,7 @@ type CFHeadersInnerDecoder =
Decoder4<ArrayDecoder<1>, BlockHashDecoder, FilterHeaderDecoder, VecDecoder<FilterHash>>;
/// Decoder type for a [`CFHeaders`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct CFHeadersDecoder(CFHeadersInnerDecoder);
impl encoding::Decoder for CFHeadersDecoder {
@@ -475,7 +475,7 @@ impl encoding::Encode for GetCFCheckpt {
type GetCFCheckptInnerDecoder = Decoder2<ArrayDecoder<1>, BlockHashDecoder>;
/// Decoder type for a [`GetCFCheckpt`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct GetCFCheckptDecoder(GetCFCheckptInnerDecoder);
impl encoding::Decoder for GetCFCheckptDecoder {
@@ -549,7 +549,7 @@ impl encoding::Encode for CFCheckpt {
type CFCheckptInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHashDecoder, VecDecoder<FilterHeader>>;
/// Decoder type for a [`CFCheckpt`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct CFCheckptDecoder(CFCheckptInnerDecoder);
impl encoding::Decoder for CFCheckptDecoder {
diff --git a/p2p/src/message_network.rs b/p2p/src/message_network.rs
index 2a560bba..507c68b8 100644
--- a/p2p/src/message_network.rs
+++ b/p2p/src/message_network.rs
@@ -210,7 +210,7 @@ type VersionMessageInnerDecoder = encoding::Decoder2<
>;
/// The Decoder for [`VersionMessage`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct VersionMessageDecoder(VersionMessageInnerDecoder);
/// A bitcoin user agent defined by BIP-0014. The user agent is sent in the version message when a
@@ -243,7 +243,7 @@ impl encoding::Encode for UserAgent {
type UserAgentInnerDecoder = ByteVecDecoder;
/// The decoder for the [`UserAgent`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct UserAgentDecoder(UserAgentInnerDecoder);
impl encoding::Decoder for UserAgentDecoder {
@@ -452,7 +452,7 @@ impl encoding::Encode for RejectReason {
}
/// The decoder type for a [`RejectReason`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct RejectReasonDecoder(ArrayDecoder<1>);
impl encoding::Decoder for RejectReasonDecoder {
@@ -540,7 +540,7 @@ type RejectInnerDecoder =
Decoder4<ByteVecDecoder, RejectReasonDecoder, ByteVecDecoder, ArrayDecoder<32>>;
/// The decoder type for a [`Reject`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct RejectDecoder(RejectInnerDecoder);
impl encoding::Decoder for RejectDecoder {
@@ -625,7 +625,7 @@ impl encoding::Encode for Alert {
type AlertInnerDecoder = ByteVecDecoder;
/// The decoder for the [`Alert`] message.
-#[derive(Debug, Clone)]
+#[derive(Debug, Default, Clone)]
pub struct AlertDecoder(AlertInnerDecoder);
impl encoding::Decoder for AlertDecoder {
Why this scored 15/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.