diff --git a/CHANGELOG.md b/CHANGELOG.md index b7ab043..c1ce5c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ Notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 0.6.0 + +## Changed + +- `HeaderCheckpoint` renamed to `HashCheckpoint` + ## 0.5.0 ## Added diff --git a/Cargo.toml b/Cargo.toml index b6a192f..cf8f441 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bip157" -version = "0.5.0" +version = "0.6.0" authors = ["Rob "] edition = "2021" license = "MIT OR Apache-2.0" @@ -13,7 +13,7 @@ rust-version = "1.84.0" [dependencies] addrman = { package = "bitcoin-address-book", version = "0.1.1" } -bitcoin = { version = "0.32.8", default-features = false, features = [ +bitcoin = { version = "=0.32.8", default-features = false, features = [ "rand-std", ] } bip324 = { version = "0.7.0", default-features = false, features = [ diff --git a/examples/bitcoin.rs b/examples/bitcoin.rs index 82bbe0c..74389dd 100644 --- a/examples/bitcoin.rs +++ b/examples/bitcoin.rs @@ -3,7 +3,7 @@ use bip157::builder::Builder; use bip157::chain::{BlockHeaderChanges, ChainState}; -use bip157::{Client, Event, HeaderCheckpoint, Network, ScriptBuf}; +use bip157::{Client, Event, HashCheckpoint, Network, ScriptBuf}; use std::collections::HashSet; use tokio::time::Instant; @@ -28,9 +28,7 @@ async fn main() { // The number of connections we would like to maintain .required_peers(2) // Only scan for taproot scripts - .chain_state(ChainState::Checkpoint( - HeaderCheckpoint::taproot_activation(), - )) + .chain_state(ChainState::Checkpoint(HashCheckpoint::taproot_activation())) // Add some initial peers // .add_peers(seeds.into_iter().map(From::from)) // Connections over Tor are supported by Socks5 proxy diff --git a/examples/signet.rs b/examples/signet.rs index 6412879..a8e3100 100644 --- a/examples/signet.rs +++ b/examples/signet.rs @@ -3,7 +3,7 @@ use bip157::chain::{BlockHeaderChanges, ChainState}; use bip157::messages::Event; -use bip157::{builder::Builder, chain::checkpoints::HeaderCheckpoint, Client}; +use bip157::{builder::Builder, chain::checkpoints::HashCheckpoint, Client}; use bip157::{Address, BlockHash, Network}; use std::collections::HashSet; use std::str::FromStr; @@ -20,7 +20,7 @@ async fn main() { tracing::subscriber::set_global_default(subscriber).unwrap(); // Use a predefined checkpoint let checkpoint = - HeaderCheckpoint::new(RECOVERY_HEIGHT, BlockHash::from_str(RECOVERY_HASH).unwrap()); + HashCheckpoint::new(RECOVERY_HEIGHT, BlockHash::from_str(RECOVERY_HASH).unwrap()); // Add Bitcoin scripts to scan the blockchain for let address = Address::from_str(ADDR) .unwrap() diff --git a/src/chain/chain.rs b/src/chain/chain.rs index 97134b3..0ddc58e 100644 --- a/src/chain/chain.rs +++ b/src/chain/chain.rs @@ -430,14 +430,14 @@ mod tests { use crate::chain::ChainState; use crate::FilterType; use crate::{ - chain::checkpoints::HeaderCheckpoint, + chain::checkpoints::HashCheckpoint, messages::{Event, Info, Warning}, Dialog, }; use super::{CFHeaderChanges, Chain}; - fn new_regtest(anchor: HeaderCheckpoint, peers: u8) -> Chain { + fn new_regtest(anchor: HashCheckpoint, peers: u8) -> Chain { let (info_tx, _) = tokio::sync::mpsc::channel::(1); let (warn_tx, _) = tokio::sync::mpsc::unbounded_channel::(); let (event_tx, _) = tokio::sync::mpsc::unbounded_channel::(); @@ -450,8 +450,8 @@ mod tests { ) } - fn base_block() -> HeaderCheckpoint { - HeaderCheckpoint::new( + fn base_block() -> HashCheckpoint { + HashCheckpoint::new( 2496, BlockHash::from_str("4b4f478800538b3301b681358f84d870da0f9c4cde63ebd85fa0f273dfb07c6a") .unwrap(), diff --git a/src/chain/checkpoints.rs b/src/chain/checkpoints.rs index 7f87530..20d85a1 100644 --- a/src/chain/checkpoints.rs +++ b/src/chain/checkpoints.rs @@ -6,24 +6,24 @@ type Height = u32; /// A known block hash in the chain of most work. #[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct HeaderCheckpoint { +pub struct HashCheckpoint { /// The index of the block hash. pub height: Height, /// The Bitcoin block hash expected at this height pub hash: BlockHash, } -impl HeaderCheckpoint { +impl HashCheckpoint { /// Create a new checkpoint from a known checkpoint of significant work. pub fn new(height: Height, hash: BlockHash) -> Self { - HeaderCheckpoint { height, hash } + HashCheckpoint { height, hash } } /// Build a checkpoint from the genesis block for a given network. pub fn from_genesis(params: impl AsRef) -> Self { let genesis_block = genesis_block(params); let hash = genesis_block.block_hash(); - HeaderCheckpoint { height: 0, hash } + HashCheckpoint { height: 0, hash } } /// One block before the activation of the taproot softfork. @@ -32,7 +32,7 @@ impl HeaderCheckpoint { .parse::() .unwrap(); let height = 709_631; - HeaderCheckpoint { height, hash } + HashCheckpoint { height, hash } } /// One block before the activation of the segwit softfork. @@ -41,42 +41,42 @@ impl HeaderCheckpoint { .parse::() .unwrap(); let height = 481_823; - HeaderCheckpoint { height, hash } + HashCheckpoint { height, hash } } } -impl std::cmp::PartialOrd for HeaderCheckpoint { +impl std::cmp::PartialOrd for HashCheckpoint { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl std::cmp::Ord for HeaderCheckpoint { +impl std::cmp::Ord for HashCheckpoint { fn cmp(&self, other: &Self) -> std::cmp::Ordering { self.height.cmp(&other.height) } } -impl From<(u32, BlockHash)> for HeaderCheckpoint { +impl From<(u32, BlockHash)> for HashCheckpoint { fn from(value: (u32, BlockHash)) -> Self { - HeaderCheckpoint::new(value.0, value.1) + HashCheckpoint::new(value.0, value.1) } } -impl TryFrom<(u32, String)> for HeaderCheckpoint { +impl TryFrom<(u32, String)> for HashCheckpoint { type Error = ::Err; fn try_from(value: (u32, String)) -> Result { let hash = BlockHash::from_str(&value.1)?; - Ok(HeaderCheckpoint::new(value.0, hash)) + Ok(HashCheckpoint::new(value.0, hash)) } } -impl TryFrom<(u32, &str)> for HeaderCheckpoint { +impl TryFrom<(u32, &str)> for HashCheckpoint { type Error = ::Err; fn try_from(value: (u32, &str)) -> Result { let hash = BlockHash::from_str(value.1)?; - Ok(HeaderCheckpoint::new(value.0, hash)) + Ok(HashCheckpoint::new(value.0, hash)) } } diff --git a/src/chain/graph.rs b/src/chain/graph.rs index b383e44..7704cb6 100644 --- a/src/chain/graph.rs +++ b/src/chain/graph.rs @@ -1,6 +1,6 @@ use std::collections::{BTreeMap, HashMap}; -use crate::HeaderCheckpoint; +use crate::HashCheckpoint; use bitcoin::{ block::Header, constants::genesis_block, BlockHash, CompactTarget, FilterHash, Network, Work, @@ -54,8 +54,8 @@ impl Tip { } } -impl From for Tip { - fn from(value: HeaderCheckpoint) -> Self { +impl From for Tip { + fn from(value: HashCheckpoint) -> Self { Tip::from_checkpoint(value.height, value.hash) } } diff --git a/src/chain/mod.rs b/src/chain/mod.rs index d8b1f66..fd66cb0 100644 --- a/src/chain/mod.rs +++ b/src/chain/mod.rs @@ -22,7 +22,7 @@ use bitcoin::{ }; use crate::network::PeerId; -use crate::HeaderCheckpoint; +use crate::HashCheckpoint; const MAX_PREV_STOP_HASHES: usize = 3; @@ -96,7 +96,7 @@ pub enum ChainState { /// A single checkpoint to start the sync _strictly after_. /// /// Note that no reorganizations can be reported. - Checkpoint(HeaderCheckpoint), + Checkpoint(HashCheckpoint), } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] diff --git a/src/client.rs b/src/client.rs index 8723d5d..1e277b5 100644 --- a/src/client.rs +++ b/src/client.rs @@ -9,7 +9,7 @@ use tokio::sync::oneshot; use crate::chain::block_subsidy; use crate::chain::IndexedHeader; use crate::messages::ClientRequest; -use crate::{Event, HeaderCheckpoint, Info, Package, TrustedPeer, Warning}; +use crate::{Event, HashCheckpoint, Info, Package, TrustedPeer, Warning}; use super::{error::ClientError, messages::ClientMessage}; use super::{error::FetchBlockError, IndexedBlock}; @@ -223,8 +223,8 @@ impl Requester { /// # Errors /// /// If the node has stopped running. - pub async fn chain_tip(&self) -> Result { - let (tx, rx) = tokio::sync::oneshot::channel::(); + pub async fn chain_tip(&self) -> Result { + let (tx, rx) = tokio::sync::oneshot::channel::(); let request = ClientRequest::new((), tx); self.ntx .send(ClientMessage::BestBlock(request)) diff --git a/src/lib.rs b/src/lib.rs index 24b5dc0..902419a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,7 +68,7 @@ use std::path::PathBuf; // Re-exports #[doc(inline)] -pub use chain::checkpoints::HeaderCheckpoint; +pub use chain::checkpoints::HashCheckpoint; #[doc(inline)] pub use tokio::sync::mpsc::Receiver; diff --git a/src/messages.rs b/src/messages.rs index c4ae1c1..af9e291 100644 --- a/src/messages.rs +++ b/src/messages.rs @@ -6,7 +6,7 @@ use bitcoin::p2p::ServiceFlags; use bitcoin::{block::Header, p2p::message_network::RejectReason, BlockHash, FeeRate, Wtxid}; use crate::chain::{BlockHeaderChanges, IndexedHeader}; -use crate::{chain::checkpoints::HeaderCheckpoint, IndexedBlock, TrustedPeer}; +use crate::{chain::checkpoints::HashCheckpoint, IndexedBlock, TrustedPeer}; use crate::{IndexedFilter, Package}; use super::error::FetchBlockError; @@ -53,13 +53,13 @@ pub enum Event { #[derive(Debug, Clone)] pub struct SyncUpdate { /// Last known tip of the blockchain - pub tip: HeaderCheckpoint, + pub tip: HashCheckpoint, /// Ten recent headers ending with the tip pub recent_history: BTreeMap, } impl SyncUpdate { - pub(crate) fn new(tip: HeaderCheckpoint, recent_history: BTreeMap) -> Self { + pub(crate) fn new(tip: HashCheckpoint, recent_history: BTreeMap) -> Self { Self { tip, recent_history, @@ -67,7 +67,7 @@ impl SyncUpdate { } /// Get the tip of the blockchain after this sync. - pub fn tip(&self) -> HeaderCheckpoint { + pub fn tip(&self) -> HashCheckpoint { self.tip } @@ -144,7 +144,7 @@ pub(crate) enum ClientMessage { /// Explicitly request a block from the node. GetBlock(ClientRequest>), /// Get the chain tip. - BestBlock(ClientRequest<(), HeaderCheckpoint>), + BestBlock(ClientRequest<(), HashCheckpoint>), /// Add another known peer to connect to. AddPeer(TrustedPeer), /// Request the broadcast minimum fee rate. diff --git a/src/network/mod.rs b/src/network/mod.rs index 367a043..6073642 100644 --- a/src/network/mod.rs +++ b/src/network/mod.rs @@ -40,7 +40,7 @@ pub(crate) mod reader; pub(crate) mod socks; pub const PROTOCOL_VERSION: u32 = 70016; -pub const KYOTO_VERSION: &str = "0.5.0"; +pub const KYOTO_VERSION: &str = "0.6.0"; pub const RUST_BITCOIN_VERSION: &str = "0.32.8"; const THIRTY_MINS: Duration = Duration::from_secs(60 * 30); diff --git a/src/network/reader.rs b/src/network/reader.rs index a722570..0f95593 100644 --- a/src/network/reader.rs +++ b/src/network/reader.rs @@ -133,7 +133,7 @@ impl Reader { } NetworkMessage::SendAddrV2 => None, #[allow(unused)] - NetworkMessage::Unknown { command, payload } => Some(ReaderMessage::Disconnect), + NetworkMessage::Unknown { command, payload } => None, } } } diff --git a/src/node.rs b/src/node.rs index bb9662e..ea35773 100644 --- a/src/node.rs +++ b/src/node.rs @@ -24,7 +24,7 @@ use crate::{ chain::{ block_queue::{BlockQueue, ProcessBlockResponse}, chain::Chain, - checkpoints::HeaderCheckpoint, + checkpoints::HashCheckpoint, CFHeaderChanges, ChainState, FilterCheck, HeaderSyncEffect, IndexedHeader, }, error::FetchBlockError, @@ -98,7 +98,7 @@ impl Node { ); // Build the chain let chain_state = chain_state.unwrap_or(ChainState::Checkpoint( - HeaderCheckpoint::from_genesis(network), + HashCheckpoint::from_genesis(network), )); let chain = Chain::new( network, @@ -228,7 +228,7 @@ impl Node { let block_tree = &self.chain.header_chain; let hash = block_tree.tip_hash(); let height = block_tree.height(); - let checkpoint = HeaderCheckpoint::new(height, hash); + let checkpoint = HashCheckpoint::new(height, hash); let send_result = oneshot.send(checkpoint); if send_result.is_err() { self.dialog.send_warning(Warning::ChannelDropped); @@ -338,7 +338,7 @@ impl Node { if self.chain.is_filters_synced() { self.state = NodeState::FiltersSynced; let update = SyncUpdate::new( - HeaderCheckpoint::new( + HashCheckpoint::new( self.chain.header_chain.height(), self.chain.header_chain.tip_hash(), ), diff --git a/tests/core.rs b/tests/core.rs index 9a72663..05cbea7 100644 --- a/tests/core.rs +++ b/tests/core.rs @@ -5,7 +5,7 @@ use std::{ }; use bip157::{ - chain::{checkpoints::HeaderCheckpoint, BlockHeaderChanges, ChainState}, + chain::{checkpoints::HashCheckpoint, BlockHeaderChanges, ChainState}, client::Client, node::Node, Address, BlockHash, Event, Info, ServiceFlags, Transaction, TrustedPeer, Warning, @@ -130,7 +130,7 @@ async fn live_reorg() { let (node, client) = new_node( socket_addr, tempdir, - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -182,7 +182,7 @@ async fn live_reorg_additional_sync() { let (node, client) = new_node( socket_addr, tempdir, - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -236,7 +236,7 @@ async fn various_client_methods() { let (node, client) = new_node( socket_addr, tempdir, - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -291,7 +291,7 @@ async fn stop_reorg_resync() { let (node, client) = new_node( socket_addr, tempdir.clone(), - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -313,7 +313,7 @@ async fn stop_reorg_resync() { let (node, client) = new_node( socket_addr, tempdir.clone(), - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -351,7 +351,7 @@ async fn stop_reorg_resync() { let (node, client) = new_node( socket_addr, tempdir, - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -379,7 +379,7 @@ async fn stop_reorg_two_resync() { let (node, client) = new_node( socket_addr, tempdir.clone(), - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -404,7 +404,7 @@ async fn stop_reorg_two_resync() { let (node, client) = new_node( socket_addr, tempdir.clone(), - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -441,7 +441,7 @@ async fn stop_reorg_two_resync() { let (node, client) = new_node( socket_addr, tempdir, - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -468,7 +468,7 @@ async fn stop_reorg_start_on_orphan() { let (node, client) = new_node( socket_addr, tempdir.clone(), - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -491,7 +491,7 @@ async fn stop_reorg_start_on_orphan() { let (node, client) = new_node( socket_addr, tempdir.clone(), - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -640,7 +640,7 @@ async fn tx_can_broadcast() { let (node, client) = new_node( socket_addr, tempdir.clone(), - ChainState::Checkpoint(HeaderCheckpoint::from_genesis(bitcoin::Network::Regtest)), + ChainState::Checkpoint(HashCheckpoint::from_genesis(bitcoin::Network::Regtest)), ); tokio::task::spawn(async move { node.run().await }); let Client { @@ -665,7 +665,7 @@ async fn whitelist_only_sync() { let best = best_hash(rpc); let host = (IpAddr::V4(*socket_addr.ip()), Some(socket_addr.port())); let builder = bip157::builder::Builder::new(bitcoin::Network::Regtest) - .chain_state(ChainState::Checkpoint(HeaderCheckpoint::from_genesis( + .chain_state(ChainState::Checkpoint(HashCheckpoint::from_genesis( bitcoin::Network::Regtest, ))) .add_peer(host) @@ -687,7 +687,7 @@ async fn whitelist_only_sync() { rpc.stop().unwrap(); // No peer available, white list only. let builder = bip157::builder::Builder::new(bitcoin::Network::Regtest) - .chain_state(ChainState::Checkpoint(HeaderCheckpoint::from_genesis( + .chain_state(ChainState::Checkpoint(HashCheckpoint::from_genesis( bitcoin::Network::Regtest, ))) .whitelist_only() @@ -703,7 +703,7 @@ async fn whitelist_only_sync() { let best = best_hash(rpc); let peer = TrustedPeer::from_hostname(socket_addr.ip().to_string(), socket_addr.port()); let builder = bip157::builder::Builder::new(bitcoin::Network::Regtest) - .chain_state(ChainState::Checkpoint(HeaderCheckpoint::from_genesis( + .chain_state(ChainState::Checkpoint(HashCheckpoint::from_genesis( bitcoin::Network::Regtest, ))) .add_peer(peer)