p2p: Add derives to encoders and decoders
What changed, and why it matters
This commit simply adds standard Rust helper traits (Debug for printing and Clone for copying) to a large set of P2P message encoder and decoder types. It does not change any behavior, parsing logic, or security checks. There is no security issue here.
No action required; this is a benign API improvement.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch adds #[derive(Debug, Clone)] to encoder/decoder structs and enums across ten p2p source files. The commit message states the underlying types already implement Debug and Clone, so this is a pure API ergonomics change. No logic, bounds, or state-machine code is modified.
Changed components
p2p/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 +97 / −0
diff --git a/p2p/src/address.rs b/p2p/src/address.rs
index c9d26e16..e8947d24 100644
--- a/p2p/src/address.rs
+++ b/p2p/src/address.rs
@@ -157,6 +157,7 @@ impl ToSocketAddrs for Address {
encoding::encoder_newtype_exact! {
/// The encoder for the [`Address`] type.
+ #[derive(Debug, Clone)]
pub struct AddressEncoder<'e>(encoding::Encoder3<
crate::ServiceFlagsEncoder<'e>,
encoding::ArrayEncoder<16>,
@@ -195,6 +196,7 @@ type AddressInnerDecoder = encoding::Decoder3<
>;
/// The Decoder for [`Address`].
+#[derive(Debug, Clone)]
pub struct AddressDecoder(AddressInnerDecoder);
impl encoding::Decoder for AddressDecoder {
@@ -258,6 +260,7 @@ pub struct AddrV1Message {
encoding::encoder_newtype! {
/// The encoder for an [`AddrV1Message`].
+ #[derive(Debug, Clone)]
pub struct AddrV1MessageEncoder<'e>(Encoder2<ArrayEncoder<4>, AddressEncoder<'e>>);
}
@@ -275,6 +278,7 @@ impl encoding::Encodable for AddrV1Message {
type AddrV1MessageInnerDecoder = Decoder2<ArrayDecoder<4>, AddressDecoder>;
/// The decoder for an [`AddrV2Message`].
+#[derive(Debug, Clone)]
pub struct AddrV1MessageDecoder(AddrV1MessageInnerDecoder);
impl encoding::Decoder for AddrV1MessageDecoder {
@@ -409,6 +413,7 @@ impl From<Ipv6Addr> for AddrV2 {
}
/// The encoder type for [`AddrV2`].
+#[derive(Debug, Clone)]
pub struct AddrV2Encoder<'e> {
network: Option<ArrayEncoder<1>>,
size: Option<CompactSizeEncoder>,
@@ -541,6 +546,7 @@ impl encoding::Encodable for AddrV2 {
type AddrV2InnerDecoder = Decoder2<ArrayDecoder<1>, ByteVecDecoder>;
/// The decoder type for an [`AddrV2`] type.
+#[derive(Debug, Clone)]
pub struct AddrV2Decoder(AddrV2InnerDecoder);
impl AddrV2Decoder {
@@ -852,6 +858,7 @@ impl ToSocketAddrs for AddrV2Message {
encoding::encoder_newtype! {
/// The encoder type for an [`AddrV2Message`].
+ #[derive(Debug, Clone)]
pub struct AddrV2MessageEncoder<'e>(Encoder4<ArrayEncoder<4>, CompactSizeEncoder, AddrV2Encoder<'e>, ArrayEncoder<2>>);
}
@@ -872,6 +879,7 @@ type AddrV2MessageInnerDecoder =
Decoder4<ArrayDecoder<4>, CompactSizeU64Decoder, AddrV2Decoder, ArrayDecoder<2>>;
/// The decoder for an [`AddrV2Message`].
+#[derive(Debug, Clone)]
pub struct AddrV2MessageDecoder(AddrV2MessageInnerDecoder);
impl encoding::Decoder for AddrV2MessageDecoder {
diff --git a/p2p/src/bip152.rs b/p2p/src/bip152.rs
index 52c6ccb5..8c18cc27 100644
--- a/p2p/src/bip152.rs
+++ b/p2p/src/bip152.rs
@@ -82,6 +82,7 @@ impl convert::AsRef<Transaction> for PrefilledTransaction {
encoding::encoder_newtype! {
/// The encoder for a [`PrefilledTransaction`] message.
+ #[derive(Debug, Clone)]
pub struct PrefilledTransactionEncoder<'e>(Encoder2<CompactSizeEncoder, TransactionEncoder<'e>>);
}
@@ -102,6 +103,7 @@ impl encoding::Encodable for PrefilledTransaction {
type PrefilledTransactionInnerDecoder = Decoder2<CompactSizeDecoder, TransactionDecoder>;
/// The decoder for a [`PrefilledTransaction`] message.
+#[derive(Debug, Clone)]
pub struct PrefilledTransactionDecoder(PrefilledTransactionInnerDecoder);
impl PrefilledTransactionDecoder {
@@ -288,6 +290,7 @@ impl Decodable for ShortId {
encoding::encoder_newtype_exact! {
/// Encoder type for a [`ShortId`].
+ #[derive(Debug, Clone)]
pub struct ShortIdEncoder<'e>(ArrayEncoder<6>);
}
@@ -302,6 +305,7 @@ impl encoding::Encodable for ShortId {
type ShortIdInnerDecoder = ArrayDecoder<6>;
/// Decoder type for a [`ShortId`].
+#[derive(Debug, Clone)]
pub struct ShortIdDecoder(ShortIdInnerDecoder);
impl encoding::Decoder for ShortIdDecoder {
@@ -376,6 +380,7 @@ type HeaderAndShortIdsInnerEncoder<'e> = Encoder4<
encoding::encoder_newtype! {
/// Encoder type for a [`HeaderAndShortIds`] message.
+ #[derive(Debug, Clone)]
pub struct HeaderAndShortIdsEncoder<'e>(
HeaderAndShortIdsInnerEncoder<'e>
);
@@ -407,6 +412,7 @@ type HeaderAndShortIdsInnerDecoder =
Decoder4<HeaderDecoder, ArrayDecoder<8>, VecDecoder<ShortId>, VecDecoder<PrefilledTransaction>>;
/// Decoder type for the [`HeaderAndShortIds`] message.
+#[derive(Debug, Clone)]
pub struct HeaderAndShortIdsDecoder(HeaderAndShortIdsInnerDecoder);
impl HeaderAndShortIdsDecoder {
@@ -609,6 +615,7 @@ impl encoding::Encodable for Offset {
fn encoder(&self) -> Self::Encoder<'_> { CompactSizeEncoder::new(self.0) }
}
+#[derive(Debug, Clone)]
struct OffsetDecoder(CompactSizeDecoder);
impl encoding::Decoder for OffsetDecoder {
@@ -695,6 +702,7 @@ impl BlockTransactionsRequest {
encoding::encoder_newtype! {
/// The encoder for [`BlockTransactionsRequest`].
+ #[derive(Debug, Clone)]
pub struct BlockTransactionsRequestEncoder<'e>(
Encoder2<
BlockHashEncoder<'e>,
@@ -720,6 +728,7 @@ impl encoding::Encodable for BlockTransactionsRequest {
type BlockTransactionsRequestInnerDecoder = Decoder2<BlockHashDecoder, VecDecoder<Offset>>;
/// The encoder type for a [`BlockTransactionsRequest`].
+#[derive(Debug, Clone)]
pub struct BlockTransactionsRequestDecoder(BlockTransactionsRequestInnerDecoder);
impl encoding::Decoder for BlockTransactionsRequestDecoder {
@@ -848,6 +857,7 @@ pub struct BlockTransactions {
encoding::encoder_newtype! {
/// Encoder type for [`BlockTransactions`].
+ #[derive(Debug, Clone)]
pub struct BlockTransactionsEncoder<'e>(
Encoder2<
BlockHashEncoder<'e>,
@@ -876,6 +886,7 @@ impl encoding::Encodable for BlockTransactions {
type BlockTransactionsInnerDecoder = Decoder2<BlockHashDecoder, VecDecoder<Transaction>>;
/// Decoder type for a [`BlockTransactions`] message.
+#[derive(Debug, Clone)]
pub struct BlockTransactionsDecoder(BlockTransactionsInnerDecoder);
impl encoding::Decoder for BlockTransactionsDecoder {
diff --git a/p2p/src/lib.rs b/p2p/src/lib.rs
index 72ff7a96..8721acd2 100644
--- a/p2p/src/lib.rs
+++ b/p2p/src/lib.rs
@@ -125,6 +125,7 @@ impl Decodable for ProtocolVersion {
encoding::encoder_newtype_exact! {
/// The encoder for the [`ProtocolVersion`] type.
+ #[derive(Debug, Clone)]
pub struct ProtocolVersionEncoder<'e>(encoding::ArrayEncoder<4>);
}
@@ -138,6 +139,7 @@ impl encoding::Encodable for ProtocolVersion {
}
/// The decoder for the [`ProtocolVersion`] type.
+#[derive(Debug, Clone)]
pub struct ProtocolVersionDecoder(encoding::ArrayDecoder<4>);
impl ProtocolVersionDecoder {
@@ -350,6 +352,7 @@ impl Decodable for ServiceFlags {
encoding::encoder_newtype_exact! {
/// The encoder for the [`ServiceFlags`] type.
+ #[derive(Debug, Clone)]
pub struct ServiceFlagsEncoder<'e>(encoding::ArrayEncoder<8>);
}
@@ -363,6 +366,7 @@ impl encoding::Encodable for ServiceFlags {
}
/// The decoder for the [`ServiceFlags`] type.
+#[derive(Debug, Clone)]
pub struct ServiceFlagsDecoder(encoding::ArrayDecoder<8>);
impl ServiceFlagsDecoder {
@@ -521,6 +525,7 @@ impl Decodable for Magic {
encoding::encoder_newtype_exact! {
/// The encoder type for network [`Magic`].
+ #[derive(Debug, Clone)]
pub struct MagicEncoder<'e>(ArrayEncoder<4>);
}
@@ -535,6 +540,7 @@ impl encoding::Encodable for Magic {
type MagicInnerDecoder = ArrayDecoder<4>;
/// The decoder type for a network [`Magic`].
+#[derive(Debug, 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 ca6a26b1..4bb67674 100644
--- a/p2p/src/merkle_tree.rs
+++ b/p2p/src/merkle_tree.rs
@@ -129,6 +129,7 @@ impl MerkleBlock {
encoding::encoder_newtype! {
/// The encoder type for a [`MerkleBlock`].
+ #[derive(Debug, Clone)]
pub struct MerkleBlockEncoder<'e>(Encoder2<HeaderEncoder<'e>, PartialMerkleTreeEncoder<'e>>);
}
@@ -143,6 +144,7 @@ impl encoding::Encodable for MerkleBlock {
type MerkleBlockInnerDecoder = Decoder2<HeaderDecoder, PartialMerkleTreeDecoder>;
/// The decoder for a [`MerkleBlock`].
+#[derive(Debug, Clone)]
pub struct MerkleBlockDecoder(MerkleBlockInnerDecoder);
impl encoding::Decoder for MerkleBlockDecoder {
@@ -476,6 +478,7 @@ impl PartialMerkleTree {
}
}
+#[derive(Debug, Clone)]
struct BitVecEncoder {
buffer: Vec<u8>,
exhausted: bool,
@@ -512,6 +515,7 @@ impl encoding::Encoder for BitVecEncoder {
encoding::encoder_newtype! {
/// The encoder for a [`PartialMerkleTree`].
+ #[derive(Debug, Clone)]
pub struct PartialMerkleTreeEncoder<'e>(
Encoder3<
ArrayEncoder<4>,
@@ -543,6 +547,7 @@ type PartialMerkleTreeInnerDecoder =
Decoder3<ArrayDecoder<4>, VecDecoder<TxMerkleNode>, ByteVecDecoder>;
/// The decoder type for a [`PartialMerkleTree`].
+#[derive(Debug, Clone)]
pub struct PartialMerkleTreeDecoder(PartialMerkleTreeInnerDecoder);
impl encoding::Decoder for PartialMerkleTreeDecoder {
diff --git a/p2p/src/message.rs b/p2p/src/message.rs
index a4f6bcac..31818099 100644
--- a/p2p/src/message.rs
+++ b/p2p/src/message.rs
@@ -159,6 +159,7 @@ impl encoding::Decodable for CommandString {
/// Encoder for the [`CommandString`] type
// We can't use the [`encoder_newtype!`] macro due to the lifetime conflicting
// when constructing the encoder in `V1NetworkMessage`.
+#[derive(Debug, Clone)]
pub struct CommandStringEncoder(encoding::ArrayEncoder<12>);
impl CommandStringEncoder {
@@ -182,6 +183,7 @@ impl encoding::ExactSizeEncoder for CommandStringEncoder {
}
/// Decoder for [`CommandString`].
+#[derive(Debug, Clone)]
pub struct CommandStringDecoder {
inner: encoding::ArrayDecoder<12>,
}
@@ -306,6 +308,7 @@ impl encoding::Encodable for V1MessageHeader {
encoding::encoder_newtype_exact! {
/// The encoder for the [`V1MessageHeader`] type.
+ #[derive(Debug, Clone)]
pub struct V1MessageHeaderEncoder<'e>(
encoding::Encoder4<
crate::MagicEncoder<'e>,
@@ -323,6 +326,7 @@ type V1MessageHeaderInnerDecoder = encoding::Decoder4<
>;
/// The Decoder for `V1MessageHeader`
+#[derive(Debug, Clone)]
pub struct V1MessageHeaderDecoder(V1MessageHeaderInnerDecoder);
impl encoding::Decoder for V1MessageHeaderDecoder {
@@ -386,6 +390,7 @@ pub struct InventoryPayload(pub Vec<message_blockdata::Inventory>);
encoding::encoder_newtype! {
/// The encoder for an [`InventoryPayload`].
+ #[derive(Debug, Clone)]
pub struct InventoryPayloadEncoder<'e>(Encoder2<CompactSizeEncoder, SliceEncoder<'e, message_blockdata::Inventory>>);
}
@@ -406,6 +411,7 @@ impl encoding::Encodable for InventoryPayload {
type InventoryInnerDecoder = VecDecoder<message_blockdata::Inventory>;
/// Decoder type for [`InventoryPayload`].
+#[derive(Debug, Clone)]
pub struct InventoryPayloadDecoder(InventoryInnerDecoder);
impl encoding::Decoder for InventoryPayloadDecoder {
@@ -458,6 +464,7 @@ pub struct AddrPayload(pub Vec<AddrV1Message>);
encoding::encoder_newtype! {
/// The encoder for an [`AddrPayload`].
+ #[derive(Debug, Clone)]
pub struct AddrPayloadEncoder<'e>(Encoder2<CompactSizeEncoder, SliceEncoder<'e, AddrV1Message>>);
}
@@ -475,6 +482,7 @@ impl encoding::Encodable for AddrPayload {
type AddrPayloadInnerDecoder = VecDecoder<AddrV1Message>;
/// Decoder type for [`AddrPayload`].
+#[derive(Debug, Clone)]
pub struct AddrPayloadDecoder(AddrPayloadInnerDecoder);
impl encoding::Decoder for AddrPayloadDecoder {
@@ -525,6 +533,7 @@ pub struct AddrV2Payload(pub Vec<AddrV2Message>);
encoding::encoder_newtype! {
/// The encoder for an [`AddrV2Payload`].
+ #[derive(Debug, Clone)]
pub struct AddrV2PayloadEncoder<'e>(Encoder2<CompactSizeEncoder, SliceEncoder<'e, AddrV2Message>>);
}
@@ -545,6 +554,7 @@ impl encoding::Encodable for AddrV2Payload {
type AddrV2PayloadInnerDecoder = VecDecoder<AddrV2Message>;
/// Decoder type for [`AddrV2Payload`].
+#[derive(Debug, Clone)]
pub struct AddrV2PayloadDecoder(AddrV2PayloadInnerDecoder);
impl encoding::Decoder for AddrV2PayloadDecoder {
@@ -662,6 +672,7 @@ impl bitcoin::consensus::encode::Decodable for FeeFilter {
encoding::encoder_newtype_exact! {
/// Encoder for [`FeeFilter`] type.
+ #[derive(Debug, Clone)]
pub struct FeeFilterEncoder<'e>(encoding::ArrayEncoder<8>);
}
@@ -676,6 +687,7 @@ impl encoding::Encodable for FeeFilter {
}
/// Decoder for [`FeeFilter`] type.
+#[derive(Debug, Clone)]
pub struct FeeFilterDecoder(encoding::ArrayDecoder<8>);
impl FeeFilterDecoder {
@@ -739,6 +751,7 @@ impl Ping {
encoding::encoder_newtype! {
/// The encoder for the [`Ping`] type.
+ #[derive(Debug, Clone)]
pub struct PingEncoder<'e>(encoding::ArrayEncoder<8>);
}
@@ -754,6 +767,7 @@ impl encoding::Encodable for Ping {
}
/// The Decoder for [`Ping`]
+#[derive(Debug, Clone)]
pub struct PingDecoder(encoding::ArrayDecoder<8>);
impl encoding::Decoder for PingDecoder {
@@ -813,6 +827,7 @@ impl Pong {
encoding::encoder_newtype! {
/// The encoder for the [`Pong`] type.
+ #[derive(Debug, Clone)]
pub struct PongEncoder<'e>(encoding::ArrayEncoder<8>);
}
@@ -828,6 +843,7 @@ impl encoding::Encodable for Pong {
}
/// The Decoder for [`Pong`]
+#[derive(Debug, Clone)]
pub struct PongDecoder(encoding::ArrayDecoder<8>);
impl encoding::Decoder for PongDecoder {
@@ -1134,6 +1150,7 @@ impl Encodable for V1NetworkMessage {
}
}
+#[derive(Debug, Clone)]
struct NetworkMessageEncoder {
buffer: Vec<u8>,
exhausted: bool,
@@ -1166,6 +1183,7 @@ impl encoding::Encoder for NetworkMessageEncoder {
encoding::encoder_newtype! {
/// Encoder for [`V1NetworkMessage`].
+ #[derive(Debug, Clone)]
pub struct V1NetworkMessageEncoder<'e>(
encoding::Encoder2<
encoding::Encoder4<
@@ -1195,6 +1213,7 @@ impl encoding::Encodable for V1NetworkMessage {
}
}
+#[derive(Debug, Clone)]
struct NetworkMessageDecoder {
command: CommandString,
payload_len: usize,
@@ -1481,6 +1500,7 @@ impl encoding::Decoder for NetworkMessageDecoder {
fn read_limit(&self) -> usize { self.payload_len - self.buffer.len() }
}
+#[derive(Debug, Clone)]
enum DecoderState {
ReadingHeader {
header_decoder: encoding::Decoder4<
@@ -1503,6 +1523,7 @@ enum DecoderState {
/// 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)]
pub struct V1NetworkMessageDecoder {
state: DecoderState,
}
@@ -1721,6 +1742,7 @@ impl NetworkHeader {
encoding::encoder_newtype_exact! {
/// The encoder type for a [`NetworkHeader`].
+ #[derive(Debug, Clone)]
pub struct NetworkHeaderEncoder<'e>(Encoder2<HeaderEncoder<'e>, ArrayEncoder<1>>);
}
@@ -1738,6 +1760,7 @@ impl encoding::Encodable for NetworkHeader {
type NetworkHeaderInnerDecoder = Decoder2<HeaderDecoder, ArrayDecoder<1>>;
/// The decoder type for a [`NetworkHeader`].
+#[derive(Debug, Clone)]
pub struct NetworkHeaderDecoder(NetworkHeaderInnerDecoder);
impl encoding::Decoder for NetworkHeaderDecoder {
@@ -1823,6 +1846,7 @@ impl_vec_wrapper!(HeadersMessage, NetworkHeader);
encoding::encoder_newtype! {
/// The encoder type for a [`HeadersMessage`].
+ #[derive(Debug, Clone)]
pub struct HeadersMessageEncoder<'e>(Encoder2<CompactSizeEncoder, SliceEncoder<'e, NetworkHeader>>);
}
@@ -1840,6 +1864,7 @@ impl encoding::Encodable for HeadersMessage {
type HeadersMessageInnerDecoder = VecDecoder<NetworkHeader>;
/// The decoder type for a [`HeadersMessage`].
+#[derive(Debug, Clone)]
pub struct HeadersMessageDecoder(HeadersMessageInnerDecoder);
impl encoding::Decoder for HeadersMessageDecoder {
diff --git a/p2p/src/message_blockdata.rs b/p2p/src/message_blockdata.rs
index 142a1b93..8c628412 100644
--- a/p2p/src/message_blockdata.rs
+++ b/p2p/src/message_blockdata.rs
@@ -110,6 +110,7 @@ impl Decodable for Inventory {
encoding::encoder_newtype_exact! {
/// The encoder for the [`Inventory`] type.
+ #[derive(Debug, Clone)]
pub struct InventoryEncoder<'e>(Encoder2<ArrayEncoder<4>, ArrayEncoder<32>>);
}
@@ -137,6 +138,7 @@ impl encoding::Encodable for Inventory {
type InventoryInnerDecoder = Decoder2<ArrayDecoder<4>, ArrayDecoder<32>>;
/// The decoder for the [`Inventory`] type.
+#[derive(Debug, Clone)]
pub struct InventoryDecoder(InventoryInnerDecoder);
impl encoding::Decoder for InventoryDecoder {
@@ -264,6 +266,7 @@ type BlockLocatorInnerEncoder<'e> = Encoder2<CompactSizeEncoder, SliceEncoder<'e
encoding::encoder_newtype! {
/// The encoder for [`BlockLocator`].
+ #[derive(Debug, Clone)]
pub struct BlockLocatorEncoder<'e>(BlockLocatorInnerEncoder<'e>);
}
@@ -281,6 +284,7 @@ impl encoding::Encodable for BlockLocator {
type BlockLocatorInnerDecoder = VecDecoder<BlockHash>;
/// The decoder for the [`BlockLocator`] type.
+#[derive(Debug, Clone)]
pub struct BlockLocatorDecoder(BlockLocatorInnerDecoder);
impl BlockLocatorDecoder {
@@ -366,11 +370,13 @@ type GetBlocksOrHeadersInnerEncoder<'e> = Encoder3<
encoding::encoder_newtype! {
/// The encoder for [`GetBlocksMessage`].
+ #[derive(Debug, Clone)]
pub struct GetBlocksEncoder<'e>(GetBlocksOrHeadersInnerEncoder<'e>);
}
encoding::encoder_newtype! {
/// The encoder for [`GetHeadersMessage`].
+ #[derive(Debug, Clone)]
pub struct GetHeadersEncoder<'e>(GetBlocksOrHeadersInnerEncoder<'e>);
}
@@ -408,9 +414,11 @@ type GetBlocksOrHeadersInnerDecoder =
Decoder3<ProtocolVersionDecoder, BlockLocatorDecoder, BlockHashDecoder>;
/// Decoder type for [`GetBlocksMessage`].
+#[derive(Debug, Clone)]
pub struct GetBlocksMessageDecoder(GetBlocksOrHeadersInnerDecoder);
/// Decoder type for [`GetHeadersMessage`].
+#[derive(Debug, 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 060ab68c..27febcf0 100644
--- a/p2p/src/message_bloom.rs
+++ b/p2p/src/message_bloom.rs
@@ -35,6 +35,7 @@ pub struct FilterLoad {
encoding::encoder_newtype_exact! {
/// The encoder for the [`FilterLoad`] message.
+ #[derive(Debug, Clone)]
pub struct FilterLoadEncoder<'e>(
Encoder2<
Encoder2<CompactSizeEncoder, BytesEncoder<'e>>,
@@ -69,6 +70,7 @@ type FilterLoadInnerDecoder =
Decoder4<ByteVecDecoder, ArrayDecoder<4>, ArrayDecoder<4>, BloomFlagsDecoder>;
/// The decoder for the [`FilterLoad`] message.
+#[derive(Debug, Clone)]
pub struct FilterLoadDecoder(FilterLoadInnerDecoder);
impl encoding::Decoder for FilterLoadDecoder {
@@ -142,6 +144,7 @@ pub enum BloomFlags {
encoding::encoder_newtype_exact! {
/// The encoder for [`BloomFlags`].
+ #[derive(Debug, Clone)]
pub struct BloomFlagsEncoder<'e>(ArrayEncoder<1>);
}
@@ -160,6 +163,7 @@ impl encoding::Encodable for BloomFlags {
type BloomFlagsInnerDecoder = ArrayDecoder<1>;
/// The decoder for [`BloomFlags`].
+#[derive(Debug, Clone)]
pub struct BloomFlagsDecoder(BloomFlagsInnerDecoder);
impl BloomFlagsDecoder {
@@ -264,6 +268,7 @@ pub struct FilterAdd {
encoding::encoder_newtype_exact! {
/// The encoder of the [`FilterAdd`] message.
+ #[derive(Debug, Clone)]
pub struct FilterAddEncoder<'e>(Encoder2<CompactSizeEncoder, BytesEncoder<'e>>);
}
@@ -281,6 +286,7 @@ impl encoding::Encodable for FilterAdd {
type FilterAddInnerDecoder = ByteVecDecoder;
/// The decoder for the [`FilterAdd`] message.
+#[derive(Debug, 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 0b79b799..4d3a7054 100644
--- a/p2p/src/message_compact_blocks.rs
+++ b/p2p/src/message_compact_blocks.rs
@@ -24,6 +24,7 @@ pub struct SendCmpct {
encoding::encoder_newtype_exact! {
/// Encoder type for the [`SendCmpct`] message.
+ #[derive(Debug, Clone)]
pub struct SendCmpctEncoder<'e>(Encoder2<ArrayEncoder<1>, ArrayEncoder<8>>);
}
@@ -41,6 +42,7 @@ impl encoding::Encodable for SendCmpct {
type SendCmpctInnerDecoder = Decoder2<ArrayDecoder<1>, ArrayDecoder<8>>;
/// Decoder type for the [`SendCmpct`] message.
+#[derive(Debug, 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 94134ff4..32479029 100644
--- a/p2p/src/message_filter.rs
+++ b/p2p/src/message_filter.rs
@@ -66,6 +66,7 @@ impl_hashencode!(FilterHeader);
encoding::encoder_newtype_exact! {
/// Encoder type for [`FilterHash`].
+ #[derive(Debug, Clone)]
pub struct FilterHashEncoder<'e>(ArrayEncoder<32>);
}
@@ -79,6 +80,7 @@ impl encoding::Encodable for FilterHash {
encoding::encoder_newtype_exact! {
/// Encoder type for [`FilterHeader`].
+ #[derive(Debug, Clone)]
pub struct FilterHeaderEncoder<'e>(ArrayEncoder<32>);
}
@@ -93,6 +95,7 @@ impl encoding::Encodable for FilterHeader {
type HashInnerDecoder = ArrayDecoder<32>;
/// Decoder for the [`FilterHash`] type.
+#[derive(Debug, Clone)]
pub struct FilterHashDecoder(HashInnerDecoder);
impl encoding::Decoder for FilterHashDecoder {
@@ -140,6 +143,7 @@ impl std::error::Error for FilterHashDecoderError {
}
/// Decoder for the [`FilterHeader`] type.
+#[derive(Debug, Clone)]
pub struct FilterHeaderDecoder(HashInnerDecoder);
impl encoding::Decoder for FilterHeaderDecoder {
@@ -213,6 +217,7 @@ pub struct GetCFilters {
encoding::encoder_newtype_exact! {
/// Encoder type for the [`GetCFilters`] message.
+ #[derive(Debug, Clone)]
pub struct GetCFiltersEncoder<'e>(Encoder3<ArrayEncoder<1>, BlockHeightEncoder<'e>, BlockHashEncoder<'e>>);
}
@@ -231,6 +236,7 @@ impl encoding::Encodable for GetCFilters {
type GetCFiltersInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHeightDecoder, BlockHashDecoder>;
/// Decoder type for the [`GetCFilters`] message.
+#[derive(Debug, Clone)]
pub struct GetCFiltersDecoder(GetCFiltersInnerDecoder);
impl encoding::Decoder for GetCFiltersDecoder {
@@ -298,6 +304,7 @@ pub struct CFilter {
encoding::encoder_newtype_exact! {
/// Encoder type for a [`CFilter`] message.
+ #[derive(Debug, Clone)]
pub struct CFilterEncoder<'e>(
Encoder3<
ArrayEncoder<1>,
@@ -328,6 +335,7 @@ impl encoding::Encodable for CFilter {
type CFilterInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHashDecoder, ByteVecDecoder>;
/// Decoder type for a [`CFilter`] message.
+#[derive(Debug, Clone)]
pub struct CFilterDecoder(CFilterInnerDecoder);
impl encoding::Decoder for CFilterDecoder {
@@ -395,6 +403,7 @@ pub struct GetCFHeaders {
encoding::encoder_newtype_exact! {
/// Encoder type for the [`GetCFHeaders`] message.
+ #[derive(Debug, Clone)]
pub struct GetCFHeadersEncoder<'e>(Encoder3<ArrayEncoder<1>, BlockHeightEncoder<'e>, BlockHashEncoder<'e>>);
}
@@ -413,6 +422,7 @@ impl encoding::Encodable for GetCFHeaders {
type GetCFHeadersInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHeightDecoder, BlockHashDecoder>;
/// Decoder type for the [`GetCFHeaders`] message.
+#[derive(Debug, Clone)]
pub struct GetCFHeadersDecoder(GetCFHeadersInnerDecoder);
impl encoding::Decoder for GetCFHeadersDecoder {
@@ -482,6 +492,7 @@ pub struct CFHeaders {
encoding::encoder_newtype! {
/// Encoder type for a [`CFHeaders`] message.
+ #[derive(Debug, Clone)]
pub struct CFHeadersEncoder<'e>(
Encoder4<
ArrayEncoder<1>,
@@ -512,6 +523,7 @@ type CFHeadersInnerDecoder =
Decoder4<ArrayDecoder<1>, BlockHashDecoder, FilterHeaderDecoder, VecDecoder<FilterHash>>;
/// Decoder type for a [`CFHeaders`] message.
+#[derive(Debug, Clone)]
pub struct CFHeadersDecoder(CFHeadersInnerDecoder);
impl encoding::Decoder for CFHeadersDecoder {
@@ -583,6 +595,7 @@ pub struct GetCFCheckpt {
encoding::encoder_newtype_exact! {
/// Encoder type for the [`GetCFCheckpt`] message.
+ #[derive(Debug, Clone)]
pub struct GetCFCheckptEncoder<'e>(Encoder2<ArrayEncoder<1>, BlockHashEncoder<'e>>);
}
@@ -600,6 +613,7 @@ impl encoding::Encodable for GetCFCheckpt {
type GetCFCheckptInnerDecoder = Decoder2<ArrayDecoder<1>, BlockHashDecoder>;
/// Decoder type for a [`GetCFCheckpt`] message.
+#[derive(Debug, Clone)]
pub struct GetCFCheckptDecoder(GetCFCheckptInnerDecoder);
impl encoding::Decoder for GetCFCheckptDecoder {
@@ -663,6 +677,7 @@ pub struct CFCheckpt {
encoding::encoder_newtype! {
/// Encoder type for a [`CFCheckpt`] message.
+ #[derive(Debug, Clone)]
pub struct CFCheckptEncoder<'e>(
Encoder3<
ArrayEncoder<1>,
@@ -693,6 +708,7 @@ impl encoding::Encodable for CFCheckpt {
type CFCheckptInnerDecoder = Decoder3<ArrayDecoder<1>, BlockHashDecoder, VecDecoder<FilterHeader>>;
/// Decoder type for a [`CFCheckpt`] message.
+#[derive(Debug, 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 02bc04d3..c62062f7 100644
--- a/p2p/src/message_network.rs
+++ b/p2p/src/message_network.rs
@@ -90,6 +90,7 @@ impl VersionMessage {
encoding::encoder_newtype_exact! {
/// The encoder for the [`VersionMessage`] type.
+ #[derive(Debug, Clone)]
pub struct VersionMessageEncoder<'e>(
encoding::Encoder2<
encoding::Encoder3<
@@ -208,6 +209,7 @@ type VersionMessageInnerDecoder = encoding::Decoder2<
>;
/// The Decoder for [`VersionMessage`].
+#[derive(Debug, Clone)]
pub struct VersionMessageDecoder(VersionMessageInnerDecoder);
/// An error consensus decoding a [`VersionMessage`].
@@ -254,6 +256,7 @@ pub struct UserAgent {
encoding::encoder_newtype_exact! {
/// The encoder for a [`UserAgent`] string.
+ #[derive(Debug, Clone)]
pub struct UserAgentEncoder<'e>(Encoder2<CompactSizeEncoder, BytesEncoder<'e>>);
}
@@ -271,6 +274,7 @@ impl encoding::Encodable for UserAgent {
type UserAgentInnerDecoder = ByteVecDecoder;
/// The decoder for the [`UserAgent`] message.
+#[derive(Debug, Clone)]
pub struct UserAgentDecoder(UserAgentInnerDecoder);
impl encoding::Decoder for UserAgentDecoder {
@@ -500,6 +504,7 @@ pub enum RejectReason {
encoding::encoder_newtype_exact! {
/// The encoder type for a [`RejectReason`].
+ #[derive(Debug, Clone)]
pub struct RejectReasonEncoder<'e>(ArrayEncoder<1>);
}
@@ -512,6 +517,7 @@ impl encoding::Encodable for RejectReason {
}
/// The decoder type for a [`RejectReason`].
+#[derive(Debug, Clone)]
pub struct RejectReasonDecoder(ArrayDecoder<1>);
impl encoding::Decoder for RejectReasonDecoder {
@@ -620,6 +626,7 @@ pub struct Reject {
encoding::encoder_newtype_exact! {
/// The encoder type for a [`Reject`] message.
+ #[derive(Debug, Clone)]
pub struct RejectEncoder<'e>(
Encoder4<
Encoder2<CompactSizeEncoder, BytesEncoder<'e>>,
@@ -653,6 +660,7 @@ type RejectInnerDecoder =
Decoder4<ByteVecDecoder, RejectReasonDecoder, ByteVecDecoder, ArrayDecoder<32>>;
/// The decoder type for a [`Reject`] message.
+#[derive(Debug, Clone)]
pub struct RejectDecoder(RejectInnerDecoder);
impl encoding::Decoder for RejectDecoder {
@@ -753,6 +761,7 @@ impl Alert {
encoding::encoder_newtype_exact! {
/// The encoder type for an [`Alert`] message.
+ #[derive(Debug, Clone)]
pub struct AlertEncoder<'e>(Encoder2<CompactSizeEncoder, BytesEncoder<'e>>);
}
@@ -770,6 +779,7 @@ impl encoding::Encodable for Alert {
type AlertInnerDecoder = ByteVecDecoder;
/// The decoder for the [`Alert`] message.
+#[derive(Debug, 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.