Merge pull request #446 from jrawsthorne/bip339

BIP339: Add wtxidrelay message and WTx inv type
This commit is contained in:
Andrew Poelstra 2020-10-26 20:03:36 +00:00 committed by GitHub
commit c16053a265
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 2 deletions

View File

@ -42,6 +42,20 @@ use std::{fmt, io, ops};
use consensus::encode::{self, Encodable, Decodable}; use consensus::encode::{self, Encodable, Decodable};
/// Version of the protocol as appearing in network message headers /// Version of the protocol as appearing in network message headers
/// This constant is used to signal to other peers which features you support.
/// Increasing it implies that your software also supports every feature prior to this version.
/// Doing so without support may lead to you incorrectly banning other peers or other peers banning you.
/// These are the features required for each version:
/// 70016 - Support receiving `wtxidrelay` message between `version` and `verack` message
/// 70015 - Support receiving invalid compact blocks from a peer without banning them
/// 70014 - Support compact block messages `sendcmpct`, `cmpctblock`, `getblocktxn` and `blocktxn`
/// 70013 - Support `feefilter` message
/// 70012 - Support `sendheaders` message and announce new blocks via headers rather than inv
/// 70011 - Support NODE_BLOOM service flag and don't support bloom filter messages if it is not set
/// 70002 - Support `reject` message
/// 70001 - Support bloom filter messages `filterload`, `filterclear` `filteradd`, `merkleblock` and FILTERED_BLOCK inventory type
/// 60002 - Support `mempool` message
/// 60001 - Support `pong` message and nonce in `ping` message
pub const PROTOCOL_VERSION: u32 = 70001; pub const PROTOCOL_VERSION: u32 = 70001;
user_enum! { user_enum! {

View File

@ -157,6 +157,8 @@ pub enum NetworkMessage {
Reject(message_network::Reject), Reject(message_network::Reject),
/// `feefilter` /// `feefilter`
FeeFilter(i64), FeeFilter(i64),
/// `wtxidrelay`
WtxidRelay,
} }
impl NetworkMessage { impl NetworkMessage {
@ -188,6 +190,7 @@ impl NetworkMessage {
NetworkMessage::Alert(_) => "alert", NetworkMessage::Alert(_) => "alert",
NetworkMessage::Reject(_) => "reject", NetworkMessage::Reject(_) => "reject",
NetworkMessage::FeeFilter(_) => "feefilter", NetworkMessage::FeeFilter(_) => "feefilter",
NetworkMessage::WtxidRelay => "wtxidrelay",
} }
} }
@ -260,7 +263,8 @@ impl Encodable for RawNetworkMessage {
NetworkMessage::Verack NetworkMessage::Verack
| NetworkMessage::SendHeaders | NetworkMessage::SendHeaders
| NetworkMessage::MemPool | NetworkMessage::MemPool
| NetworkMessage::GetAddr => vec![], | NetworkMessage::GetAddr
| NetworkMessage::WtxidRelay => vec![],
}).consensus_encode(&mut s)?; }).consensus_encode(&mut s)?;
Ok(len) Ok(len)
} }
@ -324,6 +328,7 @@ impl Decodable for RawNetworkMessage {
"reject" => NetworkMessage::Reject(Decodable::consensus_decode(&mut mem_d)?), "reject" => NetworkMessage::Reject(Decodable::consensus_decode(&mut mem_d)?),
"alert" => NetworkMessage::Alert(Decodable::consensus_decode(&mut mem_d)?), "alert" => NetworkMessage::Alert(Decodable::consensus_decode(&mut mem_d)?),
"feefilter" => NetworkMessage::FeeFilter(Decodable::consensus_decode(&mut mem_d)?), "feefilter" => NetworkMessage::FeeFilter(Decodable::consensus_decode(&mut mem_d)?),
"wtxidrelay" => NetworkMessage::WtxidRelay,
_ => return Err(encode::Error::UnrecognizedNetworkCommand(cmd.into_owned())), _ => return Err(encode::Error::UnrecognizedNetworkCommand(cmd.into_owned())),
}; };
Ok(RawNetworkMessage { Ok(RawNetworkMessage {
@ -387,6 +392,7 @@ mod test {
NetworkMessage::Alert(vec![45,66,3,2,6,8,9,12,3,130]), NetworkMessage::Alert(vec![45,66,3,2,6,8,9,12,3,130]),
NetworkMessage::Reject(Reject{message: "Test reject".into(), ccode: RejectReason::Duplicate, reason: "Cause".into(), hash: hash([255u8; 32])}), NetworkMessage::Reject(Reject{message: "Test reject".into(), ccode: RejectReason::Duplicate, reason: "Cause".into(), hash: hash([255u8; 32])}),
NetworkMessage::FeeFilter(1000), NetworkMessage::FeeFilter(1000),
NetworkMessage::WtxidRelay,
]; ];
for msg in msgs { for msg in msgs {

View File

@ -24,7 +24,7 @@ use hashes::sha256d;
use network::constants; use network::constants;
use consensus::encode::{self, Decodable, Encodable}; use consensus::encode::{self, Decodable, Encodable};
use hash_types::{BlockHash, Txid}; use hash_types::{BlockHash, Txid, Wtxid};
/// An inventory item. /// An inventory item.
#[derive(PartialEq, Eq, Clone, Debug, Copy, Hash)] #[derive(PartialEq, Eq, Clone, Debug, Copy, Hash)]
@ -35,6 +35,8 @@ pub enum Inventory {
Transaction(Txid), Transaction(Txid),
/// Block /// Block
Block(BlockHash), Block(BlockHash),
/// Witness Transaction by Wtxid
WTx(Wtxid),
/// Witness Transaction /// Witness Transaction
WitnessTransaction(Txid), WitnessTransaction(Txid),
/// Witness Block /// Witness Block
@ -57,6 +59,7 @@ impl Encodable for Inventory {
Inventory::Error => encode_inv!(0, sha256d::Hash::default()), Inventory::Error => encode_inv!(0, sha256d::Hash::default()),
Inventory::Transaction(ref t) => encode_inv!(1, t), Inventory::Transaction(ref t) => encode_inv!(1, t),
Inventory::Block(ref b) => encode_inv!(2, b), Inventory::Block(ref b) => encode_inv!(2, b),
Inventory::WTx(w) => encode_inv!(5, w),
Inventory::WitnessTransaction(ref t) => encode_inv!(0x40000001, t), Inventory::WitnessTransaction(ref t) => encode_inv!(0x40000001, t),
Inventory::WitnessBlock(ref b) => encode_inv!(0x40000002, b), Inventory::WitnessBlock(ref b) => encode_inv!(0x40000002, b),
}) })
@ -71,6 +74,7 @@ impl Decodable for Inventory {
0 => Inventory::Error, 0 => Inventory::Error,
1 => Inventory::Transaction(Decodable::consensus_decode(&mut d)?), 1 => Inventory::Transaction(Decodable::consensus_decode(&mut d)?),
2 => Inventory::Block(Decodable::consensus_decode(&mut d)?), 2 => Inventory::Block(Decodable::consensus_decode(&mut d)?),
5 => Inventory::WTx(Decodable::consensus_decode(&mut d)?),
0x40000001 => Inventory::WitnessTransaction(Decodable::consensus_decode(&mut d)?), 0x40000001 => Inventory::WitnessTransaction(Decodable::consensus_decode(&mut d)?),
0x40000002 => Inventory::WitnessBlock(Decodable::consensus_decode(&mut d)?), 0x40000002 => Inventory::WitnessBlock(Decodable::consensus_decode(&mut d)?),
tp => return Err(encode::Error::UnknownInventoryType(tp)), tp => return Err(encode::Error::UnknownInventoryType(tp)),