Skip to content

Commit 53a86d8

Browse files
stevenroose0xB10C
authored andcommitted
BIP152: Add Compact Blocks network messages
1 parent 7122a31 commit 53a86d8

File tree

4 files changed

+73
-0
lines changed

4 files changed

+73
-0
lines changed

src/network/message.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::network::address::{Address, AddrV2Message};
1919
use crate::network::{message_network, message_bloom};
2020
use crate::network::message_blockdata;
2121
use crate::network::message_filter;
22+
use crate::network::message_compact_blocks;
2223
use crate::consensus::encode::{CheckedData, Decodable, Encodable, VarInt};
2324
use crate::consensus::{encode, serialize};
2425
use crate::util::merkleblock::MerkleBlock;
@@ -181,6 +182,14 @@ pub enum NetworkMessage {
181182
GetCFCheckpt(message_filter::GetCFCheckpt),
182183
/// BIP157 cfcheckpt
183184
CFCheckpt(message_filter::CFCheckpt),
185+
/// BIP152 sendcmpct
186+
SendCmpct(message_compact_blocks::SendCmpct),
187+
/// BIP152 cmpctblock
188+
CmpctBlock(message_compact_blocks::CmpctBlock),
189+
/// BIP152 getblocktxn
190+
GetBlockTxn(message_compact_blocks::GetBlockTxn),
191+
/// BIP152 blocktxn
192+
BlockTxn(message_compact_blocks::BlockTxn),
184193
/// `alert`
185194
Alert(Vec<u8>),
186195
/// `reject`
@@ -237,6 +246,10 @@ impl NetworkMessage {
237246
NetworkMessage::CFHeaders(_) => "cfheaders",
238247
NetworkMessage::GetCFCheckpt(_) => "getcfcheckpt",
239248
NetworkMessage::CFCheckpt(_) => "cfcheckpt",
249+
NetworkMessage::SendCmpct(_) => "sendcmpct",
250+
NetworkMessage::CmpctBlock(_) => "cmpctblock",
251+
NetworkMessage::GetBlockTxn(_) => "getblocktxn",
252+
NetworkMessage::BlockTxn(_) => "blocktxn",
240253
NetworkMessage::Alert(_) => "alert",
241254
NetworkMessage::Reject(_) => "reject",
242255
NetworkMessage::FeeFilter(_) => "feefilter",
@@ -314,6 +327,10 @@ impl Encodable for RawNetworkMessage {
314327
NetworkMessage::CFHeaders(ref dat) => serialize(dat),
315328
NetworkMessage::GetCFCheckpt(ref dat) => serialize(dat),
316329
NetworkMessage::CFCheckpt(ref dat) => serialize(dat),
330+
NetworkMessage::SendCmpct(ref dat) => serialize(dat),
331+
NetworkMessage::CmpctBlock(ref dat) => serialize(dat),
332+
NetworkMessage::GetBlockTxn(ref dat) => serialize(dat),
333+
NetworkMessage::BlockTxn(ref dat) => serialize(dat),
317334
NetworkMessage::Alert(ref dat) => serialize(dat),
318335
NetworkMessage::Reject(ref dat) => serialize(dat),
319336
NetworkMessage::FeeFilter(ref data) => serialize(data),
@@ -394,6 +411,10 @@ impl Decodable for RawNetworkMessage {
394411
"reject" => NetworkMessage::Reject(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
395412
"alert" => NetworkMessage::Alert(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
396413
"feefilter" => NetworkMessage::FeeFilter(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
414+
"sendcmpct" => NetworkMessage::SendCmpct(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
415+
"cmpctblock" => NetworkMessage::CmpctBlock(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
416+
"getblocktxn" => NetworkMessage::GetBlockTxn(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
417+
"blocktxn" => NetworkMessage::BlockTxn(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
397418
"wtxidrelay" => NetworkMessage::WtxidRelay,
398419
"addrv2" => NetworkMessage::AddrV2(Decodable::consensus_decode_from_finite_reader(&mut mem_d)?),
399420
"sendaddrv2" => NetworkMessage::SendAddrV2,

src/network/message_blockdata.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ pub enum Inventory {
2727
Transaction(Txid),
2828
/// Block
2929
Block(BlockHash),
30+
/// Compact Block
31+
CompactBlock(BlockHash),
3032
/// Witness Transaction by Wtxid
3133
WTx(Wtxid),
3234
/// Witness Transaction
@@ -54,6 +56,7 @@ impl Encodable for Inventory {
5456
Inventory::Error => encode_inv!(0, sha256d::Hash::all_zeros()),
5557
Inventory::Transaction(ref t) => encode_inv!(1, t),
5658
Inventory::Block(ref b) => encode_inv!(2, b),
59+
Inventory::CompactBlock(ref b) => encode_inv!(4, b),
5760
Inventory::WTx(w) => encode_inv!(5, w),
5861
Inventory::WitnessTransaction(ref t) => encode_inv!(0x40000001, t),
5962
Inventory::WitnessBlock(ref b) => encode_inv!(0x40000002, b),
@@ -70,6 +73,7 @@ impl Decodable for Inventory {
7073
0 => Inventory::Error,
7174
1 => Inventory::Transaction(Decodable::consensus_decode(r)?),
7275
2 => Inventory::Block(Decodable::consensus_decode(r)?),
76+
4 => Inventory::CompactBlock(Decodable::consensus_decode(r)?),
7377
5 => Inventory::WTx(Decodable::consensus_decode(r)?),
7478
0x40000001 => Inventory::WitnessTransaction(Decodable::consensus_decode(r)?),
7579
0x40000002 => Inventory::WitnessBlock(Decodable::consensus_decode(r)?),

src/network/message_compact_blocks.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//!
2+
//! BIP152 Compact Blocks network messages
3+
//!
4+
5+
use crate::internal_macros::impl_consensus_encoding;
6+
use crate::util::bip152;
7+
8+
/// sendcmpct message
9+
#[derive(PartialEq, Eq, Clone, Debug, Copy, PartialOrd, Ord, Hash)]
10+
pub struct SendCmpct {
11+
/// Request to be send compact blocks.
12+
pub send_compact: bool,
13+
/// Compact Blocks protocol version number.
14+
pub version: u64,
15+
}
16+
impl_consensus_encoding!(SendCmpct, send_compact, version);
17+
18+
/// cmpctblock message
19+
///
20+
/// Note that the rules for validation before relaying compact blocks is
21+
/// different from headers and regular block messages. Thus, you shouldn't use
22+
/// compact blocks when relying on an upstream full node to have validated data
23+
/// being forwarded to you.
24+
#[derive(PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)]
25+
pub struct CmpctBlock {
26+
/// The Compact Block.
27+
pub compact_block: bip152::HeaderAndShortIds,
28+
}
29+
impl_consensus_encoding!(CmpctBlock, compact_block);
30+
31+
/// getblocktxn message
32+
#[derive(PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)]
33+
pub struct GetBlockTxn {
34+
/// The block transactions request.
35+
pub txs_request: bip152::BlockTransactionsRequest,
36+
}
37+
impl_consensus_encoding!(GetBlockTxn, txs_request);
38+
39+
/// blocktxn message
40+
#[derive(PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)]
41+
pub struct BlockTxn {
42+
/// The requested block transactions.
43+
pub transactions: bip152::BlockTransactions,
44+
}
45+
impl_consensus_encoding!(BlockTxn, transactions);

src/network/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ pub mod message_blockdata;
2626
pub mod message_bloom;
2727
#[cfg(feature = "std")]
2828
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
29+
pub mod message_compact_blocks;
30+
#[cfg(feature = "std")]
31+
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
2932
pub mod message_network;
3033
#[cfg(feature = "std")]
3134
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]

0 commit comments

Comments
 (0)