From 363422ec2105cb52f5627408946c660ae9a698e2 Mon Sep 17 00:00:00 2001 From: bayk Date: Thu, 6 Jun 2024 17:22:14 -0700 Subject: [PATCH 01/96] grin rebase (0002) Flexible peer filtering (#3458) --- Cargo.lock | 58 +++--- api/src/foreign.rs | 3 +- api/src/handlers.rs | 4 +- api/src/handlers/peers_api.rs | 10 +- api/src/handlers/server_api.rs | 8 +- chain/src/chain.rs | 41 +++- chain/src/linked_list.rs | 4 +- chain/src/store.rs | 74 ++++--- chain/src/txhashset/txhashset.rs | 7 +- p2p/src/peers.rs | 297 ++++++++++++--------------- p2p/src/serv.rs | 2 +- p2p/src/store.rs | 23 ++- p2p/src/types.rs | 1 + p2p/tests/peer_handshake.rs | 2 +- servers/src/common/types.rs | 6 +- servers/src/grin/seed.rs | 67 +++--- servers/src/grin/server.rs | 13 +- servers/src/grin/sync/body_sync.rs | 17 +- servers/src/grin/sync/header_sync.rs | 17 +- servers/src/grin/sync/state_sync.rs | 13 +- servers/src/grin/sync/syncer.rs | 21 +- store/src/lmdb.rs | 202 +++++++++--------- store/tests/lmdb.rs | 68 +++++- 23 files changed, 561 insertions(+), 397 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c9925f6b4..ee3eb9ae79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1473,35 +1473,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "grin" -version = "4.4.2" -dependencies = [ - "blake2-rfc", - "built", - "chrono", - "clap", - "ctrlc", - "cursive", - "failure", - "failure_derive", - "futures 0.3.21", - "grin_api", - "grin_chain", - "grin_config", - "grin_core", - "grin_keychain", - "grin_p2p", - "grin_servers", - "grin_store", - "grin_util", - "humansize", - "log", - "serde", - "serde_json", - "term", -] - [[package]] name = "grin_api" version = "4.4.2" @@ -2683,6 +2654,35 @@ dependencies = [ "unsigned-varint 0.7.0", ] +[[package]] +name = "mwc" +version = "4.4.2" +dependencies = [ + "blake2-rfc", + "built", + "chrono", + "clap", + "ctrlc", + "cursive", + "failure", + "failure_derive", + "futures 0.3.21", + "grin_api", + "grin_chain", + "grin_config", + "grin_core", + "grin_keychain", + "grin_p2p", + "grin_servers", + "grin_store", + "grin_util", + "humansize", + "log", + "serde", + "serde_json", + "term", +] + [[package]] name = "ncurses" version = "5.101.0" diff --git a/api/src/foreign.rs b/api/src/foreign.rs index d19e2369cf..e29f1d2322 100644 --- a/api/src/foreign.rs +++ b/api/src/foreign.rs @@ -380,8 +380,9 @@ where let node_peers = if let Some(peers) = self.peers.upgrade() { let connected_peers: Vec = peers - .connected_peers() .iter() + .connected() + .into_iter() .map(|peer| peer.info.addr.tor_address().unwrap_or("".to_string())) .filter(|addr| !addr.is_empty()) .collect(); diff --git a/api/src/handlers.rs b/api/src/handlers.rs index c96aec190b..e1787c05a2 100644 --- a/api/src/handlers.rs +++ b/api/src/handlers.rs @@ -421,10 +421,10 @@ fn response>(status: StatusCode, text: T) -> Response { } // Legacy V1 router -#[deprecated( +/*#[deprecated( since = "4.0.0", note = "The V1 Node API will be removed in grin 5.0.0. Please migrate to the V2 API as soon as possible." -)] +)]*/ pub fn build_router( chain: Arc, tx_pool: Arc>>, diff --git a/api/src/handlers/peers_api.rs b/api/src/handlers/peers_api.rs index 5118212b6f..f0d86dcb94 100644 --- a/api/src/handlers/peers_api.rs +++ b/api/src/handlers/peers_api.rs @@ -30,7 +30,7 @@ pub struct PeersAllHandler { impl Handler for PeersAllHandler { fn get(&self, _req: Request) -> ResponseFuture { - let peers = &w_fut!(&self.peers).all_peers(); + let peers = &w_fut!(&self.peers).all_peer_data(); json_response_pretty(&peers) } } @@ -42,8 +42,9 @@ pub struct PeersConnectedHandler { impl PeersConnectedHandler { pub fn get_connected_peers(&self) -> Result, Error> { let peers = w(&self.peers)? - .connected_peers() .iter() + .connected() + .into_iter() .map(|p| p.info.clone().into()) .collect::>(); @@ -83,8 +84,9 @@ impl PeersConnectedHandler { impl Handler for PeersConnectedHandler { fn get(&self, _req: Request) -> ResponseFuture { let peers: Vec = w_fut!(&self.peers) - .connected_peers() .iter() + .connected() + .into_iter() .map(|p| p.info.clone().into()) .collect(); @@ -140,7 +142,7 @@ impl PeerHandler { })?; return Ok(vec![peer_data]); } - let peers = w(&self.peers)?.all_peers(); + let peers = w(&self.peers)?.all_peer_data(); Ok(peers) } diff --git a/api/src/handlers/server_api.rs b/api/src/handlers/server_api.rs index 8155807c5f..2a5498f2c2 100644 --- a/api/src/handlers/server_api.rs +++ b/api/src/handlers/server_api.rs @@ -22,6 +22,7 @@ use crate::web::*; use grin_core::global; use hyper::{Body, Request, StatusCode}; use serde_json::json; +use std::convert::TryInto; use std::sync::atomic::Ordering; use std::sync::Weak; @@ -57,7 +58,12 @@ impl StatusHandler { let (api_sync_status, api_sync_info) = sync_status_to_api(sync_status); Ok(Status::from_tip_and_peers( head, - w(&self.peers)?.peer_count(), + w(&self.peers)? + .iter() + .connected() + .count() + .try_into() + .unwrap(), api_sync_status, api_sync_info, )) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 05e653f0b9..0a03fae9ad 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -35,14 +35,15 @@ use crate::types::{ }; use crate::util::secp::pedersen::{Commitment, RangeProof}; use crate::{util::RwLock, ChainStore}; +use grin_core::ser; use grin_store::Error::NotFoundErr; use grin_util::ToHex; -use std::collections::HashMap; use std::fs::{self, File}; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::time::{Duration, Instant}; +use std::{collections::HashMap, io::Cursor}; /// Orphan pool size is limited by MAX_ORPHAN_SIZE pub const MAX_ORPHAN_SIZE: usize = 200; @@ -1321,10 +1322,9 @@ impl Chain { let tail = batch.get_block_header(&tail_hash)?; // Remove old blocks (including short lived fork blocks) which height < tail.height - // here b is a block - for (_, b) in batch.blocks_iter()? { - if b.header.height < tail.height { - let _ = batch.delete_block(&b.hash()); + for block in batch.blocks_iter()? { + if block.header.height < tail.height { + let _ = batch.delete_block(&block.hash()); count += 1; } } @@ -1541,13 +1541,32 @@ impl Chain { /// Migrate our local db from v2 to v3. /// "commit only" inputs. fn migrate_db_v2_v3(store: &ChainStore) -> Result<(), Error> { - let store_v2 = store.with_version(ProtocolVersion(2)); - let batch = store_v2.batch()?; - for (_, block) in batch.blocks_iter()? { - batch.migrate_block(&block, ProtocolVersion(3))?; + let mut keys_to_migrate = vec![]; + for (k, v) in store.batch()?.blocks_raw_iter()? { + // We want to migrate all blocks that cannot be read via v3 protocol version. + let block_v2: Result = + ser::deserialize(&mut Cursor::new(&v), ProtocolVersion(2)); + let block_v3: Result = + ser::deserialize(&mut Cursor::new(&v), ProtocolVersion(3)); + if let (Ok(_), Err(_)) = (block_v2, block_v3) { + keys_to_migrate.push(k); + } } - batch.commit()?; - Ok(()) + debug!( + "migrate_db_v2_v3: {} blocks to migrate", + keys_to_migrate.len() + ); + let mut count = 0; + keys_to_migrate.chunks(100).try_for_each(|keys| { + let batch = store.batch()?; + for key in keys { + batch.migrate_block(&key, ProtocolVersion(2), ProtocolVersion(3))?; + count += 1; + } + batch.commit()?; + debug!("migrate_db_v2_v3: successfully migrated {} blocks", count); + Ok(()) + }) } /// Gets the block header in which a given output appears in the txhashset. diff --git a/chain/src/linked_list.rs b/chain/src/linked_list.rs index d36640681c..4f531cb63e 100644 --- a/chain/src/linked_list.rs +++ b/chain/src/linked_list.rs @@ -394,12 +394,12 @@ impl PruneableListIndex for MultiIndex { let mut list_count = 0; let mut entry_count = 0; let prefix = to_key(self.list_prefix, ""); - for (key, _) in batch.db.iter::>(&prefix)? { + for key in batch.db.iter(&prefix, |k, _| Ok(k.to_vec()))? { let _ = batch.delete(&key); list_count += 1; } let prefix = to_key(self.entry_prefix, ""); - for (key, _) in batch.db.iter::>(&prefix)? { + for key in batch.db.iter(&prefix, |k, _| Ok(k.to_vec()))? { let _ = batch.delete(&key); entry_count += 1; } diff --git a/chain/src/store.rs b/chain/src/store.rs index c5bebf01b1..a93df1c7aa 100644 --- a/chain/src/store.rs +++ b/chain/src/store.rs @@ -23,9 +23,10 @@ use crate::linked_list::MultiIndex; use crate::types::{CommitPos, HashHeight, Tip}; use crate::util::secp::pedersen::Commitment; -use croaring::{Bitmap, Portable}; +use croaring::Bitmap; +use grin_core::ser; use grin_store as store; -use grin_store::{option_to_not_found, to_key, Error, SerIterator}; +use grin_store::{option_to_not_found, to_key, Error}; use std::convert::TryInto; use std::sync::Arc; @@ -60,17 +61,6 @@ impl ChainStore { Ok(ChainStore { db }) } - /// Create a new instance of the chain store based on this instance - /// but with the provided protocol version. This is used when migrating - /// data in the db to a different protocol version, reading using one version and - /// writing back to the db with a different version. - pub fn with_version(&self, version: ProtocolVersion) -> ChainStore { - let db_with_version = self.db.with_version(version); - ChainStore { - db: db_with_version, - } - } - /// The current chain head. pub fn head(&self) -> Result { option_to_not_found(self.db.get_ser(&[HEAD_PREFIX]), || "HEAD".to_owned()) @@ -262,11 +252,20 @@ impl<'a> Batch<'a> { // self.db.iter(&key) // } - /// Migrate a block stored in the db by serializing it using the provided protocol version. - /// Block may have been read using a previous protocol version but we do not actually care. - pub fn migrate_block(&self, b: &Block, version: ProtocolVersion) -> Result<(), Error> { - self.db - .put_ser_with_version(&to_key(BLOCK_PREFIX, b.hash())[..], b, version)?; + /// Migrate a block stored in the db reading from one protocol version and writing + /// with new protocol version. + pub fn migrate_block( + &self, + key: &[u8], + from_version: ProtocolVersion, + to_version: ProtocolVersion, + ) -> Result<(), Error> { + let block: Option = self.db.get_with(key, move |_, mut v| { + ser::deserialize(&mut v, from_version).map_err(From::from) + })?; + if let Some(block) = block { + self.db.put_ser_with_version(key, &block, to_version)?; + } Ok(()) } @@ -362,9 +361,14 @@ impl<'a> Batch<'a> { } /// Iterator over the output_pos index. - pub fn output_pos_iter(&self) -> Result, Error> { + pub fn output_pos_iter(&self) -> Result, CommitPos)>, Error> { let key = to_key(OUTPUT_POS_PREFIX, ""); - self.db.iter(&key) + let protocol_version = self.db.protocol_version(); + self.db.iter(&key, move |k, mut v| { + ser::deserialize(&mut v, protocol_version) + .map(|pos| (k.to_vec(), pos)) + .map_err(From::from) + }) } /// Get output_pos from index. @@ -436,10 +440,10 @@ impl<'a> Batch<'a> { fn get_legacy_input_bitmap(&self, bh: &Hash) -> Result { option_to_not_found( - self.db.get_with( - &to_key(BLOCK_INPUT_BITMAP_PREFIX, bh), - Bitmap::deserialize::, - ), + self.db + .get_with(&to_key(BLOCK_INPUT_BITMAP_PREFIX, bh), move |_, data| { + Ok(Bitmap::deserialize::(data)) + }), || "legacy block input bitmap".to_string(), ) } @@ -466,10 +470,26 @@ impl<'a> Batch<'a> { }) } - /// An iterator to all block in db - pub fn blocks_iter(&self) -> Result, Error> { + /// Iterator over all full blocks in the db. + /// Uses default db serialization strategy via db protocol version. + pub fn blocks_iter(&self) -> Result, Error> { let key = to_key(BLOCK_PREFIX, ""); - self.db.iter(&key) + let protocol_version = self.db.protocol_version(); + self.db.iter(&key, move |_, mut v| { + ser::deserialize(&mut v, protocol_version).map_err(From::from) + }) + } + + /// Iterator over raw data for full blocks in the db. + /// Used during block migration (we need flexibility around deserialization). + pub fn blocks_raw_iter(&self) -> Result, Vec)>, Error> { + let key = to_key(BLOCK_PREFIX, ""); + self.db.iter(&key, |k, v| Ok((k.to_vec(), v.to_vec()))) + } + + /// Protocol version of our underlying db. + pub fn protocol_version(&self) -> ProtocolVersion { + self.db.protocol_version() } } diff --git a/chain/src/txhashset/txhashset.rs b/chain/src/txhashset/txhashset.rs index 0e0adee9d7..16ce3f07eb 100644 --- a/chain/src/txhashset/txhashset.rs +++ b/chain/src/txhashset/txhashset.rs @@ -515,12 +515,13 @@ impl TxHashSet { // Iterate over the current output_pos index, removing any entries that // do not point to to the expected output. let mut removed_count = 0; - for (key, (pos, _)) in batch.output_pos_iter()? { - if let Some(out) = output_pmmr.get_data(pos) { + for (key, pos) in batch.output_pos_iter()? { + if let Some(out) = output_pmmr.get_data(pos.pos) { if let Ok(pos_via_mmr) = batch.get_output_pos(&out.commitment()) { // If the pos matches and the index key matches the commitment // then keep the entry, other we want to clean it up. - if pos == pos_via_mmr && batch.is_match_output_pos_key(&key, &out.commitment()) + if pos.pos == pos_via_mmr + && batch.is_match_output_pos_key(&key, &out.commitment()) { continue; } diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index fe0b5ca077..46ba06a61e 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -18,8 +18,7 @@ use std::fs::File; use std::path::PathBuf; use std::sync::Arc; -use rand::seq::SliceRandom; -use rand::thread_rng; +use rand::prelude::*; use crate::chain; use crate::core::core; @@ -117,149 +116,35 @@ impl Peers { Ok(peers.contains_key(&addr)) } - /// Get vec of peers we are currently connected to. - pub fn connected_peers(&self) -> Vec> { + /// Iterator over our current peers. + /// This allows us to hide try_read_for() behind a cleaner interface. + /// PeersIter lets us chain various adaptors for convenience. + pub fn iter(&self) -> PeersIter>> { let peers = match self.peers.try_read_for(LOCK_TIMEOUT) { - Some(peers) => peers, + Some(peers) => peers.values().cloned().collect(), None => { if !self.stop_state.is_stopped() { // When stopped, peers access is locked by stopped thread error!("connected_peers: failed to get peers lock"); } - return vec![]; + vec![] } }; - let mut res = peers - .values() - .filter(|p| p.is_connected()) - .cloned() - .collect::>(); - res.shuffle(&mut thread_rng()); - res - } - - /// Get vec of peers we currently have an outgoing connection with. - pub fn outgoing_connected_peers(&self) -> Vec> { - self.connected_peers() - .into_iter() - .filter(|x| x.info.is_outbound()) - .collect() - } - - /// Get vec of peers we currently have an incoming connection with. - pub fn incoming_connected_peers(&self) -> Vec> { - self.connected_peers() - .into_iter() - .filter(|x| x.info.is_inbound()) - .collect() + PeersIter { + iter: peers.into_iter(), + } } /// Get a peer we're connected to by address. pub fn get_connected_peer(&self, addr: PeerAddr) -> Option> { - if self.stop_state.is_stopped() { - return None; - } - - let peers = match self.peers.try_read_for(LOCK_TIMEOUT) { - Some(peers) => peers, - None => { - if !self.stop_state.is_stopped() { - // When stopped, peers access is locked by stopped thread - error!("get_connected_peer: failed to get peers lock"); - } - return None; - } - }; - peers.get(&addr).cloned() - } - - /// Number of peers currently connected to. - pub fn peer_count(&self) -> u32 { - self.connected_peers().len() as u32 - } - - /// Number of outbound peers currently connected to. - pub fn peer_outbound_count(&self) -> u32 { - self.outgoing_connected_peers().len() as u32 + self.iter().connected().by_addr(addr) } - /// Number of inbound peers currently connected to. - pub fn peer_inbound_count(&self) -> u32 { - self.incoming_connected_peers().len() as u32 - } - - // Return vec of connected peers that currently advertise more work - // (total_difficulty) than we do. - pub fn more_work_peers(&self) -> Result>, chain::Error> { - let peers = self.connected_peers(); - if peers.is_empty() { - return Ok(vec![]); - } - - let total_difficulty = self.total_difficulty()?; - - let mut max_peers = peers - .into_iter() - .filter(|x| x.info.total_difficulty() > total_difficulty) - .collect::>(); - - max_peers.shuffle(&mut thread_rng()); - Ok(max_peers) - } - - // Return number of connected peers that currently advertise more/same work - // (total_difficulty) than/as we do. - pub fn more_or_same_work_peers(&self) -> Result { - let peers = self.connected_peers(); - if peers.is_empty() { - return Ok(0); - } - - let total_difficulty = self.total_difficulty()?; - - Ok(peers - .iter() - .filter(|x| x.info.total_difficulty() >= total_difficulty) - .count()) - } - - /// Returns single random peer with more work than us. - pub fn more_work_peer(&self) -> Option> { - match self.more_work_peers() { - Ok(mut peers) => peers.pop(), - Err(e) => { - error!("failed to get more work peers: {:?}", e); - None - } - } - } - - /// Return vec of connected peers that currently have the most worked - /// branch, showing the highest total difficulty. - pub fn most_work_peers(&self) -> Vec> { - let peers = self.connected_peers(); - if peers.is_empty() { - return vec![]; - } - - let max_total_difficulty = match peers.iter().map(|x| x.info.total_difficulty()).max() { - Some(v) => v, - None => return vec![], - }; - - let mut max_peers = peers - .into_iter() - .filter(|x| x.info.total_difficulty() == max_total_difficulty) - .collect::>(); - - max_peers.shuffle(&mut thread_rng()); - max_peers - } - - /// Returns single random peer with the most worked branch, showing the - /// highest total difficulty. - pub fn most_work_peer(&self) -> Option> { - self.most_work_peers().pop() + pub fn max_peer_difficulty(&self) -> Difficulty { + self.iter() + .connected() + .max_difficulty() + .unwrap_or(Difficulty::zero()) } pub fn is_banned(&self, peer_addr: PeerAddr) -> bool { @@ -308,7 +193,7 @@ impl Peers { { let mut count = 0; - for p in self.connected_peers().iter() { + for p in self.iter().connected() { match inner(&p) { Ok(true) => count += 1, Ok(false) => (), @@ -375,7 +260,7 @@ impl Peers { /// Ping all our connected peers. Always automatically expects a pong back /// or disconnects. This acts as a liveness test. pub fn check_all(&self, total_difficulty: Difficulty, height: u64) { - for p in self.connected_peers().iter() { + for p in self.iter().connected() { if let Err(e) = p.send_ping(total_difficulty, height) { debug!("Error pinging peer {:?}: {:?}", &p.info.addr, e); let mut peers = match self.peers.try_write_for(LOCK_TIMEOUT) { @@ -391,15 +276,16 @@ impl Peers { } } - /// All peer information we have in storage - pub fn all_peers(&self) -> Vec { - match self.store.all_peers() { - Ok(peers) => peers, - Err(e) => { - error!("all_peers failed: {:?}", e); - vec![] - } - } + /// Iterator over all peers we know about (stored in our db). + pub fn peer_data_iter(&self) -> Result, Error> { + self.store.peers_iter().map_err(From::from) + } + + /// Convenience for reading all peer data from the db. + pub fn all_peer_data(&self) -> Vec { + self.peer_data_iter() + .map(|peers| peers.collect()) + .unwrap_or(vec![]) } /// Find peers in store (not necessarily connected) and return their data @@ -448,14 +334,8 @@ impl Peers { // build a list of peers to be cleaned up { - let peers = match self.peers.try_read_for(LOCK_TIMEOUT) { - Some(peers) => peers, - None => { - error!("clean_peers: can't get peers lock"); - return; - } - }; - for peer in peers.values() { + for peer in self.iter() { + let ref peer: &Peer = peer.as_ref(); if peer.is_banned() { debug!("clean_peers {:?}, peer banned", peer.info.addr); rm.push(peer.info.addr.clone()); @@ -487,27 +367,34 @@ impl Peers { } } + // closure to build an iterator of our inbound peers + let outbound_peers = || self.iter().outbound().connected().into_iter(); + // check here to make sure we don't have too many outgoing connections - let excess_outgoing_count = - (self.peer_outbound_count() as usize).saturating_sub(max_outbound_count); + // Preferred peers are treated preferentially here. + // Also choose outbound peers with lowest total difficulty to drop. + let excess_outgoing_count = outbound_peers().count().saturating_sub(max_outbound_count); if excess_outgoing_count > 0 { - let mut addrs: Vec<_> = self - .outgoing_connected_peers() - .iter() - .filter(|x| !preferred_peers.contains(&x.info.addr)) + let mut peer_infos: Vec<_> = outbound_peers() + .map(|x| x.info.clone()) + .filter(|x| !preferred_peers.contains(&x.addr)) + .collect(); + peer_infos.sort_unstable_by_key(|x| x.total_difficulty()); + let mut addrs = peer_infos + .into_iter() + .map(|x| x.addr) .take(excess_outgoing_count) - .map(|x| x.info.addr.clone()) .collect(); rm.append(&mut addrs); } + // closure to build an iterator of our inbound peers + let inbound_peers = || self.iter().inbound().connected().into_iter(); + // check here to make sure we don't have too many incoming connections - let excess_incoming_count = - (self.peer_inbound_count() as usize).saturating_sub(max_inbound_count); + let excess_incoming_count = inbound_peers().count().saturating_sub(max_inbound_count); if excess_incoming_count > 0 { - let mut addrs: Vec<_> = self - .incoming_connected_peers() - .iter() + let mut addrs: Vec<_> = inbound_peers() .filter(|x| !preferred_peers.contains(&x.info.addr)) .take(excess_incoming_count) .map(|x| x.info.addr.clone()) @@ -543,7 +430,8 @@ impl Peers { /// We have enough outbound connected peers pub fn enough_outbound_peers(&self) -> bool { - self.peer_outbound_count() >= self.config.peer_min_preferred_outbound_count() + self.iter().outbound().connected().count() + >= self.config.peer_min_preferred_outbound_count() as usize } /// Removes those peers that seem to have expired @@ -796,3 +684,86 @@ impl NetAdapter for Peers { } } } + +pub struct PeersIter { + iter: I, +} + +impl IntoIterator for PeersIter { + type Item = I::Item; + type IntoIter = I; + + fn into_iter(self) -> Self::IntoIter { + self.iter.into_iter() + } +} + +impl>> PeersIter { + /// Filter peers that are currently connected. + /// Note: This adaptor takes a read lock internally. + /// So if we are chaining adaptors then defer this toward the end of the chain. + pub fn connected(self) -> PeersIter>> { + PeersIter { + iter: self.iter.filter(|p| p.is_connected()), + } + } + + /// Filter inbound peers. + pub fn inbound(self) -> PeersIter>> { + PeersIter { + iter: self.iter.filter(|p| p.info.is_inbound()), + } + } + + /// Filter outbound peers. + pub fn outbound(self) -> PeersIter>> { + PeersIter { + iter: self.iter.filter(|p| p.info.is_outbound()), + } + } + + /// Filter peers with the provided difficulty comparison fn. + /// + /// with_difficulty(|x| x > diff) + /// + /// Note: This adaptor takes a read lock internally for each peer. + /// So if we are chaining adaptors then put this toward later in the chain. + pub fn with_difficulty(self, f: F) -> PeersIter>> + where + F: Fn(Difficulty) -> bool, + { + PeersIter { + iter: self.iter.filter(move |p| f(p.info.total_difficulty())), + } + } + + /// Filter peers that support the provided capabilities. + pub fn with_capabilities( + self, + cap: Capabilities, + ) -> PeersIter>> { + PeersIter { + iter: self.iter.filter(move |p| p.info.capabilities.contains(cap)), + } + } + + pub fn by_addr(&mut self, addr: PeerAddr) -> Option> { + self.iter.find(|p| p.info.addr == addr) + } + + /// Choose a random peer from the current (filtered) peers. + pub fn choose_random(self) -> Option> { + let mut rng = rand::thread_rng(); + self.iter.choose(&mut rng) + } + + /// Find the max difficulty of the current (filtered) peers. + pub fn max_difficulty(self) -> Option { + self.iter.map(|p| p.info.total_difficulty()).max() + } + + /// Count the current (filtered) peers. + pub fn count(self) -> usize { + self.iter.count() + } +} diff --git a/p2p/src/serv.rs b/p2p/src/serv.rs index 8212c76d68..2ee0cecca5 100644 --- a/p2p/src/serv.rs +++ b/p2p/src/serv.rs @@ -326,7 +326,7 @@ impl Server { /// different sets of peers themselves. In addition, it prevent potential /// duplicate connections, malicious or not. fn check_undesirable(&self, stream: &TcpStream) -> bool { - if self.peers.peer_inbound_count() + if self.peers.iter().inbound().connected().count() as u32 >= self.config.peer_max_inbound_count() + self.config.peer_listener_buffer_count() { debug!("Accepting new connection will exceed peer limit, refusing connection."); diff --git a/p2p/src/store.rs b/p2p/src/store.rs index 64baacbf85..4e2145693a 100644 --- a/p2p/src/store.rs +++ b/p2p/src/store.rs @@ -164,24 +164,27 @@ impl PeerStore { count: usize, ) -> Result, Error> { let mut peers = self - .db - .iter::(&to_key(PEER_PREFIX, ""))? - .map(|(_, v)| v) + .peers_iter()? .filter(|p| p.flags == state && p.capabilities.contains(cap)) .collect::>(); peers[..].shuffle(&mut thread_rng()); Ok(peers.iter().take(count).cloned().collect()) } + /// Iterator over all known peers. + pub fn peers_iter(&self) -> Result, Error> { + let key = to_key(PEER_PREFIX, ""); + let protocol_version = self.db.protocol_version(); + self.db.iter(&key, move |_, mut v| { + ser::deserialize(&mut v, protocol_version).map_err(From::from) + }) + } + /// List all known peers /// Used for /v1/peers/all api endpoint pub fn all_peers(&self) -> Result, Error> { - let key = to_key(PEER_PREFIX, ""); - Ok(self - .db - .iter::(&key)? - .map(|(_, v)| v) - .collect::>()) + let peers: Vec = self.peers_iter()?.collect(); + Ok(peers) } /// Convenience method to load a peer data, update its status and save it @@ -209,7 +212,7 @@ impl PeerStore { { let mut to_remove = vec![]; - for x in self.all_peers()? { + for x in self.peers_iter()? { if predicate(&x) { to_remove.push(x) } diff --git a/p2p/src/types.rs b/p2p/src/types.rs index 2fa3908da6..ee18460050 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -360,6 +360,7 @@ pub struct P2PConfig { /// The list of seed nodes, if using Seeding as a seed type pub seeds: Option, + /// TODO: Rethink this. We need to separate what *we* advertise vs. who we connect to. /// Capabilities expose by this node, also conditions which other peers this /// node will have an affinity toward when connection. pub capabilities: Capabilities, diff --git a/p2p/tests/peer_handshake.rs b/p2p/tests/peer_handshake.rs index 6931115986..a5ba8309d7 100644 --- a/p2p/tests/peer_handshake.rs +++ b/p2p/tests/peer_handshake.rs @@ -101,5 +101,5 @@ fn peer_handshake() { let server_peer = server.peers.get_connected_peer(my_addr).unwrap(); assert_eq!(server_peer.info.total_difficulty(), Difficulty::min()); - assert!(server.peers.peer_count() > 0); + assert!(server.peers.iter().connected().count() > 0); } diff --git a/servers/src/common/types.rs b/servers/src/common/types.rs index efdce326fa..ced55b6f5f 100644 --- a/servers/src/common/types.rs +++ b/servers/src/common/types.rs @@ -493,11 +493,11 @@ impl DandelionEpoch { /// Choose a new outbound stem relay peer. pub fn next_epoch(&mut self, peers: &Arc) { self.start_time = Some(Utc::now().timestamp()); - self.relay_peer = peers.outgoing_connected_peers().first().cloned(); + self.relay_peer = peers.iter().outbound().connected().choose_random(); // If stem_probability == 90 then we stem 90% of the time. - let mut rng = rand::thread_rng(); let stem_probability = self.config.stem_probability; + let mut rng = rand::thread_rng(); self.is_stem = rng.gen_range(0, 100) < stem_probability; let addr = self.relay_peer.clone().map(|p| p.info.addr.clone()); @@ -534,7 +534,7 @@ impl DandelionEpoch { } if update_relay { - self.relay_peer = peers.outgoing_connected_peers().first().cloned(); + self.relay_peer = peers.iter().outbound().connected().choose_random(); info!( "DandelionEpoch: relay_peer: new peer chosen: {:?}", self.relay_peer.clone().map(|p| p.info.addr.clone()) diff --git a/servers/src/grin/seed.rs b/servers/src/grin/seed.rs index 06c14ae455..16f3e4cbce 100644 --- a/servers/src/grin/seed.rs +++ b/servers/src/grin/seed.rs @@ -20,8 +20,7 @@ use chrono::prelude::{DateTime, Utc}; use chrono::{Duration, MIN_DATE}; use grin_p2p::PeerAddr::Onion; -use rand::seq::SliceRandom; -use rand::thread_rng; +use rand::prelude::*; use std::collections::HashMap; use std::net::ToSocketAddrs; use std::sync::{mpsc, Arc}; @@ -75,7 +74,7 @@ pub fn connect_and_monitor( if stop_state.is_stopped() { break; } - let peer_count = peers.all_peers().len(); + let peer_count = peers.all_peer_data().len(); // Pause egress peer connection request. Only for tests. if stop_state.is_paused() { thread::sleep(time::Duration::from_secs(1)); @@ -85,7 +84,7 @@ pub fn connect_and_monitor( let connected_peers = if peer_count == 0 { 0 } else { - peers.connected_peers().len() + peers.iter().connected().count() }; if connected_peers == 0 { @@ -175,14 +174,14 @@ fn monitor_peers( tx: mpsc::Sender, preferred_peers: &[PeerAddr], ) { - // regularly check if we need to acquire more peers and if so, gets + // regularly check if we need to acquire more peers and if so, gets // them from db - let total_count = peers.all_peers().len(); + let mut total_count = 0; let mut healthy_count = 0; let mut banned_count = 0; let mut defuncts = vec![]; - for x in peers.all_peers() { + for x in peers.all_peer_data().into_iter() { match x.flags { p2p::State::Banned => { let interval = Utc::now().timestamp() - x.last_banned; @@ -202,15 +201,26 @@ fn monitor_peers( p2p::State::Healthy => healthy_count += 1, p2p::State::Defunct => defuncts.push(x), } + total_count += 1; } + let peers_count = peers.iter().connected().count(); + + let max_diff = peers.max_peer_difficulty(); + let most_work_count = peers + .iter() + .outbound() + .with_difficulty(|x| x >= max_diff) + .connected() + .count(); + debug!( "monitor_peers: on {}:{}, {} connected ({} most_work). \ all {} = {} healthy + {} banned + {} defunct", config.host, config.port, - peers.peer_count(), - peers.most_work_peers().len(), + peers_count, + most_work_count, total_count, healthy_count, banned_count, @@ -228,10 +238,14 @@ fn monitor_peers( return; } - // loop over connected peers + // loop over connected peers that can provide peer lists // ask them for their list of peers let mut connected_peers: Vec = vec![]; - for p in peers.connected_peers() { + for p in peers + .iter() + .with_capabilities(p2p::Capabilities::PEER_LIST) + .connected() + { trace!( "monitor_peers: {}:{} ask {} for more peers", config.host, @@ -253,11 +267,10 @@ fn monitor_peers( } } - // take a random defunct peer and mark it healthy: over a long period any + // take a random defunct peer and mark it healthy: over a long enough period any // peer will see another as defunct eventually, gives us a chance to retry - if !defuncts.is_empty() { - defuncts.shuffle(&mut thread_rng()); - let _ = peers.update_state(defuncts[0].addr.clone(), p2p::State::Healthy); + if let Some(peer) = defuncts.into_iter().choose(&mut thread_rng()) { + let _ = peers.update_state(peer.addr, p2p::State::Healthy); } // find some peers from our db @@ -333,7 +346,7 @@ fn listen_for_addrs( let mut addrs: Vec = rx.try_iter().collect(); if attempt_all { - for x in peers.all_peers() { + for x in peers.all_peer_data() { match x.flags { p2p::State::Banned => {} _ => { @@ -388,18 +401,20 @@ fn listen_for_addrs( if update_possible { match p2p_c.connect(addr.clone(), header_cache_size) { Ok(p) => { - debug!("Sending peer request to {}", addr); - if p.send_peer_request(capab).is_ok() { - match addr { - PeerAddr::Onion(_) => { - if let Err(_) = libp2p_connection::add_new_peer(&addr) { - error!("Unable to add libp2p peer {}", addr); + if p.info.capabilities.contains(p2p::Capabilities::PEER_LIST) { + debug!("Sending peer request to {}", addr); + if p.send_peer_request(capab).is_ok() { + match addr { + PeerAddr::Onion(_) => { + if let Err(_) = libp2p_connection::add_new_peer(&addr) { + error!("Unable to add libp2p peer {}", addr); + } } - } - _ => (), - }; - let _ = peers_c.update_state(addr, p2p::State::Healthy); + _ => (), + }; + } } + let _ = peers_c.update_state(addr, p2p::State::Healthy); } Err(e) => { debug!("Connection to the peer {} was rejected, {}", addr, e); diff --git a/servers/src/grin/server.rs b/servers/src/grin/server.rs index 1dbf11770b..8195db97b6 100644 --- a/servers/src/grin/server.rs +++ b/servers/src/grin/server.rs @@ -18,7 +18,6 @@ use crate::tor::config as tor_config; use crate::util::secp; -use std::fs; use std::fs::File; use std::io::prelude::*; use std::path::PathBuf; @@ -27,6 +26,7 @@ use std::sync::mpsc; use std::sync::mpsc::Receiver; use std::sync::mpsc::Sender; use std::sync::Arc; +use std::{convert::TryInto, fs}; use std::{ thread::{self, JoinHandle}, time::{self, Duration}, @@ -800,7 +800,13 @@ impl Server { /// Number of peers pub fn peer_count(&self) -> u32 { - self.p2p.peers.peer_count() + self.p2p + .peers + .iter() + .connected() + .count() + .try_into() + .unwrap() } /// Start a minimal "stratum" mining service on a separate thread @@ -944,7 +950,8 @@ impl Server { let peer_stats = self .p2p .peers - .connected_peers() + .iter() + .connected() .into_iter() .map(|p| PeerStats::from_peer(&p)) .collect(); diff --git a/servers/src/grin/sync/body_sync.rs b/servers/src/grin/sync/body_sync.rs index d77e634a01..65f7c417f0 100644 --- a/servers/src/grin/sync/body_sync.rs +++ b/servers/src/grin/sync/body_sync.rs @@ -14,6 +14,7 @@ use chrono::prelude::{DateTime, Utc}; use chrono::Duration; +use rand::prelude::*; use std::cmp; use std::sync::Arc; @@ -89,7 +90,17 @@ impl BodySync { hashes.reverse(); - let peers = self.peers.more_work_peers()?; + let head = self.chain.head()?; + + // Find connected peers with strictly greater difficulty than us. + let peers: Vec<_> = self + .peers + .iter() + .outbound() + .with_difficulty(|x| x > head.total_difficulty) + .connected() + .into_iter() + .collect(); // if we have 5 peers to sync from then ask for 50 blocks total (peer_count * // 10) max will be 80 if all 8 peers are advertising more work @@ -125,9 +136,9 @@ impl BodySync { self.blocks_requested = 0; self.receive_timeout = Utc::now() + Duration::seconds(6); - let mut peers_iter = peers.iter().cycle(); + let mut rng = rand::thread_rng(); for hash in hashes_to_get.clone() { - if let Some(peer) = peers_iter.next() { + if let Some(peer) = peers.choose(&mut rng) { if let Err(e) = peer.send_block_request(*hash, chain::Options::SYNC) { debug!("Skipped request to {}: {:?}", peer.info.addr, e); peer.stop(); diff --git a/servers/src/grin/sync/header_sync.rs b/servers/src/grin/sync/header_sync.rs index ffcde6aef0..d5cdbab415 100644 --- a/servers/src/grin/sync/header_sync.rs +++ b/servers/src/grin/sync/header_sync.rs @@ -19,7 +19,7 @@ use std::sync::Arc; use crate::chain::{self, SyncState, SyncStatus}; use crate::common::types::Error; use crate::core::core::hash::{Hash, Hashed}; -use crate::p2p::{self, types::ReasonForBan, Peer}; +use crate::p2p::{self, types::ReasonForBan, Capabilities, Peer}; pub struct HeaderSync { sync_state: Arc, @@ -170,10 +170,17 @@ impl HeaderSync { fn header_sync(&mut self) -> Option> { if let Ok(header_head) = self.chain.header_head() { - let difficulty = header_head.total_difficulty; - - if let Some(peer) = self.peers.most_work_peer() { - if peer.info.total_difficulty() > difficulty { + let max_diff = self.peers.max_peer_difficulty(); + let peer = self + .peers + .iter() + .outbound() + .with_capabilities(Capabilities::HEADER_HIST) + .with_difficulty(|x| x >= max_diff) + .connected() + .choose_random(); + if let Some(peer) = peer { + if peer.info.total_difficulty() > header_head.total_difficulty { return self.request_headers(peer); } } diff --git a/servers/src/grin/sync/state_sync.rs b/servers/src/grin/sync/state_sync.rs index 5dc5c953ce..d09f8567d7 100644 --- a/servers/src/grin/sync/state_sync.rs +++ b/servers/src/grin/sync/state_sync.rs @@ -19,7 +19,7 @@ use std::sync::Arc; use crate::chain::{self, SyncState, SyncStatus}; use crate::core::core::hash::Hashed; use crate::core::global; -use crate::p2p::{self, Peer}; +use crate::p2p::{self, Capabilities, Peer}; /// Fast sync has 3 "states": /// * syncing headers @@ -163,7 +163,16 @@ impl StateSync { let mut txhashset_height = header_head.height.saturating_sub(threshold); txhashset_height = txhashset_height.saturating_sub(txhashset_height % archive_interval); - if let Some(peer) = self.peers.most_work_peer() { + let max_diff = self.peers.max_peer_difficulty(); + let peer = self + .peers + .iter() + .outbound() + .with_capabilities(Capabilities::TXHASHSET_HIST) + .with_difficulty(|x| x >= max_diff) + .connected() + .choose_random(); + if let Some(peer) = peer { // ask for txhashset at state_sync_threshold let mut txhashset_head = self .chain diff --git a/servers/src/grin/sync/syncer.rs b/servers/src/grin/sync/syncer.rs index c84180a7a0..69a9b04567 100644 --- a/servers/src/grin/sync/syncer.rs +++ b/servers/src/grin/sync/syncer.rs @@ -79,7 +79,15 @@ impl SyncRunner { if self.stop_state.is_stopped() { break; } - let wp = self.peers.more_or_same_work_peers()?; + // Count peers with at least our difficulty. + let wp = self + .peers + .iter() + .outbound() + .with_difficulty(|x| x >= head.total_difficulty) + .connected() + .count(); + // exit loop when: // * we have more than MIN_PEERS more_or_same_work peers // * we are synced already, e.g. grin was quickly restarted @@ -222,7 +230,16 @@ impl SyncRunner { fn needs_syncing(&self) -> Result<(bool, u64), chain::Error> { let local_diff = self.chain.head()?.total_difficulty; let mut is_syncing = self.sync_state.is_syncing(); - let peer = self.peers.most_work_peer(); + + // Find a peer with greatest known difficulty. + let max_diff = self.peers.max_peer_difficulty(); + let peer = self + .peers + .iter() + .outbound() + .with_difficulty(|x| x >= max_diff) + .connected() + .choose_random(); let peer_info = if let Some(p) = peer { p.info.clone() diff --git a/store/src/lmdb.rs b/store/src/lmdb.rs index b187c0e944..2dfb41f7c7 100644 --- a/store/src/lmdb.rs +++ b/store/src/lmdb.rs @@ -15,7 +15,6 @@ //! Storage of core types using LMDB. use std::fs; -use std::marker; use std::sync::Arc; use lmdb_zero as lmdb; @@ -48,10 +47,10 @@ pub enum Error { #[fail(display = "LMDB Serialization Error, {}", _0)] SerErr(String), /// File handling error - #[fail(display = "File handling Error")] + #[fail(display = "File handling Error: {}", _0)] FileErr(String), /// Other error - #[fail(display = "Other Error")] + #[fail(display = "Other Error: {}", _0)] OtherErr(String), } @@ -61,6 +60,12 @@ impl From for Error { } } +impl From for Error { + fn from(e: ser::Error) -> Error { + Error::SerErr(e.to_string()) + } +} + /// unwraps the inner option by converting the none case to a not found error pub fn option_to_not_found(res: Result, Error>, field_name: F) -> Result where @@ -245,23 +250,27 @@ impl Store { Ok(()) } - /// Gets a value from the db, provided its key - pub fn get_with(&self, key: &[u8], f: F) -> Result, Error> + /// Gets a value from the db, provided its key. + /// Deserializes the retrieved data using the provided function. + pub fn get_with( + &self, + key: &[u8], + access: &lmdb::ConstAccessor<'_>, + db: &lmdb::Database<'_>, + deserialize: F, + ) -> Result, Error> where - F: Fn(&[u8]) -> T, + F: Fn(&[u8], &[u8]) -> Result, { - let lock = self.db.read(); - let db = lock - .as_ref() - .ok_or_else(|| Error::NotFoundErr("chain db is None".to_string()))?; - let txn = lmdb::ReadTransaction::new(self.env.clone())?; - let access = txn.access(); - let res = access.get(db, key); - res.map(f).to_opt().map_err(From::from) + let res: Option<&[u8]> = access.get(db, key).to_opt()?; + match res { + None => Ok(None), + Some(res) => deserialize(key, res).map(Some), + } } - /// Gets a `Readable` value from the db, provided its key. Encapsulates - /// serialization. + /// Gets a `Readable` value from the db, provided its key. + /// Note: Creates a new read transaction so will *not* see any uncommitted data. pub fn get_ser(&self, key: &[u8]) -> Result, Error> { let lock = self.db.read(); let db = lock @@ -269,24 +278,10 @@ impl Store { .ok_or_else(|| Error::NotFoundErr("chain db is None".to_string()))?; let txn = lmdb::ReadTransaction::new(self.env.clone())?; let access = txn.access(); - self.get_ser_access(key, &access, db.clone()) - } - fn get_ser_access( - &self, - key: &[u8], - access: &lmdb::ConstAccessor<'_>, - db: Arc>, - ) -> Result, Error> { - let res: lmdb::error::Result<&[u8]> = access.get(&db, key); - match res.to_opt() { - Ok(Some(mut res)) => match ser::deserialize(&mut res, self.protocol_version()) { - Ok(res) => Ok(Some(res)), - Err(e) => Err(Error::SerErr(format!("{}", e))), - }, - Ok(None) => Ok(None), - Err(e) => Err(From::from(e)), - } + self.get_with(key, &access, &db, |_, mut data| { + ser::deserialize(&mut data, self.protocol_version()).map_err(From::from) + }) } /// Whether the provided key exists @@ -297,13 +292,16 @@ impl Store { .ok_or_else(|| Error::NotFoundErr("chain db is None".to_string()))?; let txn = lmdb::ReadTransaction::new(self.env.clone())?; let access = txn.access(); - let res: lmdb::error::Result<&lmdb::Ignore> = access.get(db, key); - res.to_opt().map(|r| r.is_some()).map_err(From::from) + + let res: Option<&lmdb::Ignore> = access.get(db, key).to_opt()?; + Ok(res.is_some()) } - /// Produces an iterator of (key, value) pairs, where values are `Readable` types - /// moving forward from the provided key. - pub fn iter(&self, from: &[u8]) -> Result, Error> { + /// Produces an iterator from the provided key prefix. + pub fn iter(&self, prefix: &[u8], deserialize: F) -> Result, Error> + where + F: Fn(&[u8], &[u8]) -> Result, + { let db = self.db.read(); let cloned_db = db.as_ref(); let cloned_db = if cloned_db.is_some() { @@ -313,14 +311,7 @@ impl Store { }; let tx = Arc::new(lmdb::ReadTransaction::new(self.env.clone())?); let cursor = Arc::new(tx.cursor(cloned_db)?); - Ok(SerIterator { - tx, - cursor, - seek: false, - prefix: from.to_vec(), - version: self.protocol_version(), - _marker: marker::PhantomData, - }) + Ok(PrefixIterator::new(tx, cursor, prefix, deserialize)) } /// Builds a new batch to be used with this store. @@ -375,40 +366,53 @@ impl<'a> Batch<'a> { let ser_value = ser::ser_vec(value, version); match ser_value { Ok(data) => self.put(key, &data), - Err(err) => Err(Error::SerErr(format!("{}", err))), + Err(err) => Err(err.into()), } } - /// gets a value from the db, provided its key - pub fn get_with(&self, key: &[u8], f: F) -> Result, Error> + /// Low-level access for retrieving data by key. + /// Takes a function for flexible deserialization. + pub fn get_with(&self, key: &[u8], deserialize: F) -> Result, Error> where - F: Fn(&[u8]) -> T, + F: Fn(&[u8], &[u8]) -> Result, { - self.store.get_with(key, f) - } - - /// Whether the provided key exists - pub fn exists(&self, key: &[u8]) -> Result { - self.store.exists(key) - } + let access = self.tx.access(); + let lock = self.store.db.read(); + let db = lock + .as_ref() + .ok_or_else(|| Error::NotFoundErr("chain db is None".to_string()))?; - /// Produces an iterator of `Readable` types moving forward from the - /// provided key. - pub fn iter(&self, from: &[u8]) -> Result, Error> { - self.store.iter(from) + self.store.get_with(key, &access, &db, deserialize) } - /// Gets a `Readable` value from the db, provided its key, taking the - /// content of the current batch into account. - pub fn get_ser(&self, key: &[u8]) -> Result, Error> { + /// Whether the provided key exists. + /// This is in the context of the current write transaction. + pub fn exists(&self, key: &[u8]) -> Result { let access = self.tx.access(); - let lock = self.store.db.read(); let db = lock .as_ref() .ok_or_else(|| Error::NotFoundErr("chain db is None".to_string()))?; + let res: Option<&lmdb::Ignore> = access.get(db, key).to_opt()?; + Ok(res.is_some()) + } - self.store.get_ser_access(key, &access, db.clone()) + /// Produces an iterator from the provided key prefix. + pub fn iter(&self, prefix: &[u8], deserialize: F) -> Result, Error> + where + F: Fn(&[u8], &[u8]) -> Result, + { + self.store.iter(prefix, deserialize) + } + + /// Gets a `Readable` value from the db by provided key and default deserialization strategy. + pub fn get_ser(&self, key: &[u8]) -> Result, Error> { + self.get_with(key, |_, mut data| { + match ser::deserialize(&mut data, self.protocol_version()) { + Ok(res) => Ok(res), + Err(e) => Err(From::from(e)), + } + }) } /// Deletes a key/value pair from the db @@ -437,57 +441,61 @@ impl<'a> Batch<'a> { } } -/// An iterator that produces Readable instances back. Wraps the lower level -/// DBIterator and deserializes the returned values. -pub struct SerIterator +/// An iterator based on key prefix. +/// Caller is responsible for deserialization of the data. +pub struct PrefixIterator where - T: ser::Readable, + F: Fn(&[u8], &[u8]) -> Result, { tx: Arc>, cursor: Arc>, seek: bool, prefix: Vec, - version: ProtocolVersion, - _marker: marker::PhantomData, + deserialize: F, } -impl Iterator for SerIterator +impl Iterator for PrefixIterator where - T: ser::Readable, + F: Fn(&[u8], &[u8]) -> Result, { - type Item = (Vec, T); + type Item = T; - fn next(&mut self) -> Option<(Vec, T)> { + fn next(&mut self) -> Option { let access = self.tx.access(); - let kv = if self.seek { - Arc::get_mut(&mut self.cursor).unwrap().next(&access) + let cursor = Arc::get_mut(&mut self.cursor).expect("failed to get cursor"); + let kv: Result<(&[u8], &[u8]), _> = if self.seek { + cursor.next(&access) } else { self.seek = true; - Arc::get_mut(&mut self.cursor) - .unwrap() - .seek_range_k(&access, &self.prefix[..]) + cursor.seek_range_k(&access, &self.prefix[..]) }; - match kv { - Ok((k, v)) => self.deser_if_prefix_match(k, v), - Err(_) => None, - } + kv.ok() + .filter(|(k, _)| k.starts_with(self.prefix.as_slice())) + .map(|(k, v)| match (self.deserialize)(k, v) { + Ok(v) => Some(v), + Err(_) => None, + }) + .flatten() } } -impl SerIterator +impl PrefixIterator where - T: ser::Readable, + F: Fn(&[u8], &[u8]) -> Result, { - fn deser_if_prefix_match(&self, key: &[u8], value: &[u8]) -> Option<(Vec, T)> { - let plen = self.prefix.len(); - if plen == 0 || (key.len() >= plen && key[0..plen] == self.prefix[..]) { - if let Ok(value) = ser::deserialize(&mut &value[..], self.version) { - Some((key.to_vec(), value)) - } else { - None - } - } else { - None + /// Initialize a new prefix iterator. + pub fn new( + tx: Arc>, + cursor: Arc>, + prefix: &[u8], + deserialize: F, + ) -> PrefixIterator { + PrefixIterator { + tx, + cursor, + seek: false, + prefix: prefix.to_vec(), + deserialize, } } } diff --git a/store/tests/lmdb.rs b/store/tests/lmdb.rs index cceb4c11ef..0bbf3c4c4e 100644 --- a/store/tests/lmdb.rs +++ b/store/tests/lmdb.rs @@ -65,9 +65,75 @@ fn setup(test_dir: &str) { clean_output_dir(test_dir); } +#[test] +fn test_exists() -> Result<(), store::Error> { + let test_dir = "target/test_exists"; + setup(test_dir); + + let store = store::Store::new(test_dir, Some("test1"), None, None)?; + + let key = [0, 0, 0, 1]; + let value = [1, 1, 1, 1]; + + // Start new batch and insert a new key/value entry. + let batch = store.batch()?; + batch.put(&key, &value)?; + + // Check we can see the new entry in uncommitted batch. + assert!(batch.exists(&key)?); + + // Check we cannot see the new entry yet outside of the uncommitted batch. + assert!(!store.exists(&key)?); + + batch.commit()?; + + // Check we can see the new entry after committing the batch. + assert!(store.exists(&key)?); + + clean_output_dir(test_dir); + Ok(()) +} + +#[test] +fn test_iter() -> Result<(), store::Error> { + let test_dir = "target/test_iter"; + setup(test_dir); + + let store = store::Store::new(test_dir, Some("test1"), None, None)?; + + let key = [0, 0, 0, 1]; + let value = [1, 1, 1, 1]; + + // Start new batch and insert a new key/value entry. + let batch = store.batch()?; + batch.put(&key, &value)?; + + // TODO - This is not currently possible (and we need to be aware of this). + // Currently our SerIterator is limited to using a ReadTransaction only. + // + // Check we can see the new entry via an iterator using the uncommitted batch. + // let mut iter: SerIterator> = batch.iter(&[0])?; + // assert_eq!(iter.next(), Some((key.to_vec(), value.to_vec()))); + // assert_eq!(iter.next(), None); + + // Check we can not yet see the new entry via an iterator outside the uncommitted batch. + let mut iter = store.iter(&[0], |_, v| Ok(v.to_vec()))?; + assert_eq!(iter.next(), None); + + batch.commit()?; + + // Check we can see the new entry via an iterator after committing the batch. + let mut iter = store.iter(&[0], |_, v| Ok(v.to_vec()))?; + assert_eq!(iter.next(), Some(value.to_vec())); + assert_eq!(iter.next(), None); + + clean_output_dir(test_dir); + Ok(()) +} + #[test] fn lmdb_allocate() -> Result<(), store::Error> { - let test_dir = "test_output/lmdb_allocate"; + let test_dir = "target/lmdb_allocate"; setup(test_dir); // Allocate more than the initial chunk, ensuring // the DB resizes underneath From 4ef5646e1899b2874be777c2fa6121e755eaa3f2 Mon Sep 17 00:00:00 2001 From: bayk Date: Thu, 6 Jun 2024 17:28:04 -0700 Subject: [PATCH 02/96] grin v5.3 (0003) on_block_accepted logging and webhooks all the time (#3486) --- servers/src/common/adapters.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index 5ece406800..8a2da242d3 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -967,11 +967,13 @@ where V: VerifierCache + 'static, { fn block_accepted(&self, b: &core::Block, status: BlockStatus, opts: Options) { - // not broadcasting blocks received through sync + // Trigger all registered "on_block_accepted" hooks (logging and webhooks). + for hook in &self.hooks { + hook.on_block_accepted(b, status); + } + + // Suppress broadcast of new blocks received during sync. if !opts.contains(chain::Options::SYNC) { - for hook in &self.hooks { - hook.on_block_accepted(b, status); - } // If we mined the block then we want to broadcast the compact block. // If we received the block from another node then broadcast "header first" // to minimize network traffic. From 4dcffab22cfe0f2a168fb0a90eac9eb4ffc1cf4f Mon Sep 17 00:00:00 2001 From: bayk Date: Thu, 6 Jun 2024 17:35:33 -0700 Subject: [PATCH 03/96] grin v5.3 (0004) Disable merkle proofs for v2 get_block (#3487) --- api/src/foreign_rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/foreign_rpc.rs b/api/src/foreign_rpc.rs index 4e72166671..f33c271302 100644 --- a/api/src/foreign_rpc.rs +++ b/api/src/foreign_rpc.rs @@ -226,7 +226,7 @@ pub trait ForeignRpc: Sync + Send { { "block_height": 374274, "commit": "09d33615563ba2d65acc2b295a024337166b9f520122d49730c73e8bfb43017610", - "merkle_proof": "00000000003e6f5e000000000000000f60fe09a7601a519d9be71135404580ad9de0964c70a7619b1731dca2cd8c1ae1dce9f544df671d63ff0e05b58f070cb48e163ca8f44fb4446c9fe1fc9cfef90e4b81e7119e8cf60acb9515363ecaea1ce20d2a8ea2f6f638f79a33a19d0d7b54cfff3daf8d21c243ba4ccd2c0fbda833edfa2506b1b326059d124e0c2e27cda90268e66f2dcc7576efac9ebbb831894d7776c191671c3294c2ca0af23201498a7f5ce98d5440ca24116b40ac98b1c5e38b28c8b560afc4f4684b81ab34f8cf162201040d4779195ba0e4967d1dd8184b579208e9ebebafa2f5004c51f5902a94bf268fd498f0247e8ba1a46efec8d88fa44d5ecb206fbe728ee56c24af36442eba416ea4d06e1ea267309bc2e6f961c57069e2525d17e78748254729d7fdec56720aa85fe6d89b2756a7eeed0a7aa5d13cfb874e3c65576ec8a15d6df17d7d4856653696b10fb9ec205f5e4d1c7a1f3e2dd2994b12eeed93e84776d8dcd8a5d78aecd4f96ae95c0b090d104adf2aa84f0a1fbd8d319fea5476d1a306b2800716e60b00115a5cca678617361c5a89660b4536c56254bc8dd7035d96f05de62b042d16acaeff57c111fdf243b859984063e3fcfdf40c4c4a52889706857a7c3e90e264f30f40cc87bd20e74689f14284bc5ea0a540950dfcc8d33c503477eb1c60", + "merkle_proof": null, "mmr_index": 4091742, "output_type": "Coinbase", "proof": "7adae7bcecf735c70eaa21e8fdce1d3c83d7b593f082fc29e16ff2c64ee5aaa15b682e5583257cf351de457dda8f877f4d8c1492af3aaf25cf5f496fce7ca54a0ef78cc61c4252c490386f3c69132960e9edc811add6415a6026d53d604414a5f4dd330a63fcbb005ba908a45b2fb1950a9529f793405832e57c89a36d3920715bc2d43db16a718ecd19aeb23428b5d3eeb89d73c28272a7f2b39b8923e777d8eb2c5ce9872353ba026dc79fdb093a6538868b4d184215afc29a9f90548f9c32aa663f9197fea1cadbb28d40d35ed79947b4b2b722e30e877a15aa2ecf95896faad173af2e2795b36ce342dfdacf13a2f4f273ab9927371f52913367d1d58246a0c35c8f0d2330fcddb9eec34c277b1cfdaf7639eec2095930b2adef17e0eb94f32e071bf1c607d2ef1757d66647477335188e5afc058c07fe0440a67804fbdd5d35d850391ead3e9c8a3136ae1c42a33d5b01fb2c6ec84a465df3f74358cbc28542036ae4ef3e63046fbd2bce6b12f829ed193fb51ea87790e88f1ea686d943c46714b076fb8c6be7c577bca5b2792e63d5f7b8f6018730b6f9ddaf5758a5fa6a3859d68b317ad4383719211e78f2ca832fd34c6a222a8488e40519179209ad1979f3095b7b7ba7f57e81c371989a4ace465149b0fe576d89473bc596c54cee663fbf78196e7eb31e4d56604c5226e9242a68bda95e1b45473c52f63fe865901839e82079a9935e25fe8d44e339484ba0a62d20857c6b3f15ab5c56b59c7523b63f86fa8977e3f4c35dc8b1c446c48a28947f9d9bd9992763404bcba95f94b45d643f07bb7c352bfad30809c741938b103a44218696206ca1e18f0b10b222d8685cc1ed89d5fdb0c7258b66486e35c0fd560a678864fd64c642b2b689a0c46d1be6b402265b7808cd61a95c2b4a4df280e3f0ec090197fb039d32538d05d3f0a082f5", From 6ca9b7c449190ab0144c8c7dbf12f512c09dbf6f Mon Sep 17 00:00:00 2001 From: bayk Date: Thu, 6 Jun 2024 17:37:31 -0700 Subject: [PATCH 04/96] grin v5.3 (0005) PMMR segment creation and validation (#3453) * Chunk generation and validation * Rename chunk -> segment * Missed a few * Generate and validate merkle proof * Fix bugs in generation and validation * Add test for unprunable MMR of various sizes * Add missing docs * Remove unused functions * Remove segment error variant on chain error type * Simplify calculation by using a Vec instead of HashMap * Use vectors in segment definition * Compare subtree root during tests * Add test of segments for a prunable mmr * Remove assertion * Only send intermediary hashes for prunable MMRs * Get hash from file directly * Require both leaves if one of them is not pruned * More pruning tests * Add segment (de)serialization * Require sorted vectors in segment deser * Store pos and data separately in segment * Rename log_size -> height * Fix bitmap index in root calculation * Add validation function for output (bitmap) MMRs * Remove left over debug statements * Fix test * Edge case: final segment with uneven number of leaves * Use last_pos instead of segment_last_pos * Simplify pruning in test * Add leaf and hash iterators * Support fully pruned segments * Drop backend before deleting dir in pruned_segment test * Simplify output of first_unpruned_parent --- core/src/core.rs | 1 + core/src/core/pmmr.rs | 1 + core/src/core/pmmr/segment.rs | 680 ++++++++++++++++++++++++++++++++++ core/tests/segment.rs | 61 +++ store/tests/segment.rs | 422 +++++++++++++++++++++ 5 files changed, 1165 insertions(+) create mode 100644 core/src/core/pmmr/segment.rs create mode 100644 core/tests/segment.rs create mode 100644 store/tests/segment.rs diff --git a/core/src/core.rs b/core/src/core.rs index 366692d82a..2984f9fda7 100644 --- a/core/src/core.rs +++ b/core/src/core.rs @@ -33,6 +33,7 @@ pub use self::block_sums::*; pub use self::committed::Committed; pub use self::compact_block::*; pub use self::id::ShortId; +pub use self::pmmr::segment::*; pub use self::transaction::*; /// Common errors diff --git a/core/src/core/pmmr.rs b/core/src/core/pmmr.rs index b41d894679..a294eba242 100644 --- a/core/src/core/pmmr.rs +++ b/core/src/core/pmmr.rs @@ -40,6 +40,7 @@ mod backend; mod pmmr; mod readonly_pmmr; mod rewindable_pmmr; +pub mod segment; mod vec_backend; pub use self::backend::*; diff --git a/core/src/core/pmmr/segment.rs b/core/src/core/pmmr/segment.rs new file mode 100644 index 0000000000..551254c8bf --- /dev/null +++ b/core/src/core/pmmr/segment.rs @@ -0,0 +1,680 @@ +// Copyright 2020 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Segment of a PMMR. + +use crate::core::hash::Hash; +use crate::core::pmmr::{self, Backend, ReadablePMMR, ReadonlyPMMR}; +use crate::ser::{Error, PMMRIndexHashable, PMMRable, Readable, Reader, Writeable, Writer}; +use croaring::Bitmap; +use std::cmp::min; +use std::fmt::{self, Debug}; + +#[derive(Clone, Debug, PartialEq, Eq)] +/// Error related to segment creation or validation +pub enum SegmentError { + /// An expected leaf was missing + MissingLeaf(u64), + /// An expected hash was missing + MissingHash(u64), + /// The segment does not exist + NonExistent, + /// Mismatch between expected and actual root hash + Mismatch, +} + +impl fmt::Display for SegmentError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + SegmentError::MissingLeaf(idx) => write!(f, "Missing leaf at pos {}", idx), + SegmentError::MissingHash(idx) => write!(f, "Missing hash at pos {}", idx), + SegmentError::NonExistent => write!(f, "Segment does not exist"), + SegmentError::Mismatch => write!(f, "Root hash mismatch"), + } + } +} + +/// Tuple that defines a segment of a given PMMR +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub struct SegmentIdentifier { + /// Height of a segment + pub height: u8, + /// Zero-based index of the segment + pub idx: u64, +} + +impl Readable for SegmentIdentifier { + fn read(reader: &mut R) -> Result { + let height = reader.read_u8()?; + let idx = reader.read_u64()?; + Ok(Self { height, idx }) + } +} + +impl Writeable for SegmentIdentifier { + fn write(&self, writer: &mut W) -> Result<(), Error> { + writer.write_u8(self.height)?; + writer.write_u64(self.idx) + } +} + +/// Segment of a PMMR: unpruned leaves and the necessary data to verify +/// segment membership in the original MMR. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Segment { + identifier: SegmentIdentifier, + hash_pos: Vec, + hashes: Vec, + leaf_pos: Vec, + leaf_data: Vec, + proof: SegmentProof, +} + +impl Segment { + /// Creates an empty segment + fn empty(identifier: SegmentIdentifier) -> Self { + Segment { + identifier, + hash_pos: Vec::new(), + hashes: Vec::new(), + leaf_pos: Vec::new(), + leaf_data: Vec::new(), + proof: SegmentProof::empty(), + } + } + + /// Maximum number of leaves in a segment, given by `2**height` + fn segment_capacity(&self) -> u64 { + 1 << self.identifier.height + } + + /// Offset (in leaf idx) of first leaf in the segment + fn leaf_offset(&self) -> u64 { + self.identifier.idx * self.segment_capacity() + } + + /// Number of leaves in this segment. Equal to capacity except for the final segment, which can be smaller + fn segment_unpruned_size(&self, last_pos: u64) -> u64 { + min( + self.segment_capacity(), + pmmr::n_leaves(last_pos).saturating_sub(self.leaf_offset()), + ) + } + + /// Whether the segment is full (size == capacity) + fn full_segment(&self, last_pos: u64) -> bool { + self.segment_unpruned_size(last_pos) == self.segment_capacity() + } + + /// Inclusive range of MMR positions for this segment + pub fn segment_pos_range(&self, last_pos: u64) -> (u64, u64) { + let segment_size = self.segment_unpruned_size(last_pos); + let leaf_offset = self.leaf_offset(); + let first = pmmr::insertion_to_pmmr_index(leaf_offset + 1); + let last = if self.full_segment(last_pos) { + pmmr::insertion_to_pmmr_index(leaf_offset + segment_size) + + (self.identifier.height as u64) + } else { + last_pos + }; + + (first, last) + } + + fn get_hash(&self, pos: u64) -> Result { + self.hash_pos + .iter() + .zip(&self.hashes) + .find(|&(&p, _)| p == pos) + .map(|(_, &h)| h) + .ok_or_else(|| SegmentError::MissingHash(pos)) + } + + /// Iterator of all the leaves in the segment + pub fn leaf_iter(&self) -> impl Iterator + '_ { + self.leaf_pos.iter().map(|&p| p).zip(&self.leaf_data) + } + + /// Iterator of all the hashes in the segment + pub fn hash_iter(&self) -> impl Iterator + '_ { + self.hash_pos + .iter() + .zip(&self.hashes) + .map(|(&p, &h)| (p, h)) + } +} + +impl Segment +where + T: Readable + Writeable + Debug, +{ + /// Generate a segment from a PMMR + pub fn from_pmmr( + segment_id: SegmentIdentifier, + pmmr: &ReadonlyPMMR<'_, U, B>, + prunable: bool, + ) -> Result + where + U: PMMRable, + B: Backend, + { + let mut segment = Segment::empty(segment_id); + + let last_pos = pmmr.unpruned_size(); + if segment.segment_unpruned_size(last_pos) == 0 { + return Err(SegmentError::NonExistent); + } + + // Fill leaf data and hashes + let (segment_first_pos, segment_last_pos) = segment.segment_pos_range(last_pos); + for pos in segment_first_pos..=segment_last_pos { + if pmmr::is_leaf(pos) { + if let Some(data) = pmmr.get_data_from_file(pos) { + segment.leaf_data.push(data); + segment.leaf_pos.push(pos); + continue; + } else if !prunable { + return Err(SegmentError::MissingLeaf(pos)); + } + } + // TODO: optimize, no need to send every intermediary hash + if prunable { + if let Some(hash) = pmmr.get_from_file(pos) { + segment.hashes.push(hash); + segment.hash_pos.push(pos); + } + } + } + + let mut start_pos = None; + // Fully pruned segment: only include a single hash, the first unpruned parent + if segment.leaf_data.is_empty() && segment.hashes.is_empty() { + let family_branch = pmmr::family_branch(segment_last_pos, last_pos); + for (pos, _) in family_branch { + if let Some(hash) = pmmr.get_from_file(pos) { + segment.hashes.push(hash); + segment.hash_pos.push(pos); + start_pos = Some(pos); + break; + } + } + } + + // Segment merkle proof + segment.proof = SegmentProof::generate( + pmmr, + last_pos, + segment_first_pos, + segment_last_pos, + start_pos, + )?; + + Ok(segment) + } +} + +impl Segment +where + T: PMMRIndexHashable, +{ + /// Calculate root hash of this segment + /// Returns `None` iff the segment is full and completely pruned + pub fn root( + &self, + last_pos: u64, + bitmap: Option<&Bitmap>, + ) -> Result, SegmentError> { + let (segment_first_pos, segment_last_pos) = self.segment_pos_range(last_pos); + let mut hashes = Vec::>::with_capacity(2 * (self.identifier.height as usize)); + let mut leaves = self.leaf_pos.iter().zip(&self.leaf_data); + for pos in segment_first_pos..=segment_last_pos { + let height = pmmr::bintree_postorder_height(pos); + let hash = if height == 0 { + // Leaf + if bitmap + .map(|b| { + let idx_1 = pmmr::n_leaves(pos) - 1; + let idx_2 = if pmmr::is_left_sibling(pos) { + idx_1 + 1 + } else { + idx_1 - 1 + }; + b.contains(idx_1 as u32) || b.contains(idx_2 as u32) || pos == last_pos + }) + .unwrap_or(true) + { + // We require the data of this leaf if either the mmr is not prunable or if + // the bitmap indicates it (or its sibling) should be here. + // Edge case: if the final segment has an uneven number of leaves, we + // require the last leaf to be present regardless of the status in the bitmap. + // TODO: possibly remove requirement on the sibling when we no longer support + // syncing through the txhashset.zip method. + let data = leaves + .find(|&(&p, _)| p == pos) + .map(|(_, l)| l) + .ok_or_else(|| SegmentError::MissingLeaf(pos))?; + Some(data.hash_with_index(pos - 1)) + } else { + None + } + } else { + let left_child_pos = pos - (1 << height); + let right_child_pos = pos - 1; + + let right_child = hashes.pop().unwrap(); + let left_child = hashes.pop().unwrap(); + + if bitmap.is_some() { + // Prunable MMR + match (left_child, right_child) { + (None, None) => None, + (Some(l), Some(r)) => Some((l, r).hash_with_index(pos - 1)), + (None, Some(r)) => { + let l = self.get_hash(left_child_pos)?; + Some((l, r).hash_with_index(pos - 1)) + } + (Some(l), None) => { + let r = self.get_hash(right_child_pos)?; + Some((l, r).hash_with_index(pos - 1)) + } + } + } else { + // Non-prunable MMR: require both children + Some( + ( + left_child.ok_or_else(|| SegmentError::MissingHash(left_child_pos))?, + right_child + .ok_or_else(|| SegmentError::MissingHash(right_child_pos))?, + ) + .hash_with_index(pos - 1), + ) + } + }; + hashes.push(hash); + } + + if self.full_segment(last_pos) { + // Full segment: last position of segment is subtree root + Ok(hashes.pop().unwrap()) + } else { + // Not full (only final segment): peaks in segment, bag them together + let peaks = pmmr::peaks(last_pos) + .into_iter() + .filter(|&pos| pos >= segment_first_pos && pos <= segment_last_pos) + .rev(); + let mut hash = None; + for pos in peaks { + let mut lhash = hashes.pop().ok_or_else(|| SegmentError::MissingHash(pos))?; + if lhash.is_none() && bitmap.is_some() { + // If this entire peak is pruned, load it from the segment hashes + lhash = Some(self.get_hash(pos)?); + } + let lhash = lhash.ok_or_else(|| SegmentError::MissingHash(pos))?; + + hash = match hash { + None => Some(lhash), + Some(rhash) => Some((lhash, rhash).hash_with_index(last_pos)), + }; + } + Ok(Some(hash.unwrap())) + } + } + + /// Get the first unpruned parent hash of this segment + pub fn first_unpruned_parent( + &self, + last_pos: u64, + bitmap: Option<&Bitmap>, + ) -> Result<(Hash, u64), SegmentError> { + let root = self.root(last_pos, bitmap)?; + let (_, last) = self.segment_pos_range(last_pos); + if let Some(root) = root { + return Ok((root, last)); + } + let bitmap = bitmap.unwrap(); + let n_leaves = pmmr::n_leaves(last_pos); + + let mut cardinality = 0; + let mut pos = last; + let mut hash = Err(SegmentError::MissingHash(last)); + let mut family_branch = pmmr::family_branch(last, last_pos).into_iter(); + while cardinality == 0 { + hash = self.get_hash(pos).map(|h| (h, pos)); + if hash.is_ok() { + // Return early in case a lower level hash is already present + // This can occur if both child trees are pruned but compaction hasn't run yet + return hash; + } + + if let Some((p, _)) = family_branch.next() { + pos = p; + let range = (pmmr::n_leaves(pmmr::bintree_leftmost(p)) - 1) + ..min(pmmr::n_leaves(pmmr::bintree_rightmost(p)), n_leaves); + cardinality = bitmap.range_cardinality(range); + } else { + break; + } + } + hash + } + + /// Check validity of the segment by calculating its root and validating the merkle proof + pub fn validate( + &self, + last_pos: u64, + bitmap: Option<&Bitmap>, + mmr_root: Hash, + ) -> Result<(), SegmentError> { + let (first, last) = self.segment_pos_range(last_pos); + let (segment_root, segment_unpruned_pos) = self.first_unpruned_parent(last_pos, bitmap)?; + self.proof.validate( + last_pos, + mmr_root, + first, + last, + segment_root, + segment_unpruned_pos, + ) + } + + /// Check validity of the segment by calculating its root and validating the merkle proof + /// This function assumes a final hashing step together with `other_root` + pub fn validate_with( + &self, + last_pos: u64, + bitmap: Option<&Bitmap>, + mmr_root: Hash, + other_root: Hash, + other_is_left: bool, + ) -> Result<(), SegmentError> { + let (first, last) = self.segment_pos_range(last_pos); + let (segment_root, segment_unpruned_pos) = self.first_unpruned_parent(last_pos, bitmap)?; + self.proof.validate_with( + last_pos, + mmr_root, + first, + last, + segment_root, + segment_unpruned_pos, + other_root, + other_is_left, + ) + } +} + +impl Readable for Segment { + fn read(reader: &mut R) -> Result { + let identifier = Readable::read(reader)?; + + let mut last_pos = 0; + let n_hashes = reader.read_u64()? as usize; + let mut hash_pos = Vec::with_capacity(n_hashes); + for _ in 0..n_hashes { + let pos = reader.read_u64()?; + if pos <= last_pos { + return Err(Error::SortError); + } + last_pos = pos; + hash_pos.push(pos); + } + + let mut hashes = Vec::::with_capacity(n_hashes); + for _ in 0..n_hashes { + hashes.push(Readable::read(reader)?); + } + + let n_leaves = reader.read_u64()? as usize; + let mut leaf_pos = Vec::with_capacity(n_leaves); + last_pos = 0; + for _ in 0..n_leaves { + let pos = reader.read_u64()?; + if pos <= last_pos { + return Err(Error::SortError); + } + last_pos = pos; + leaf_pos.push(pos); + } + + let mut leaf_data = Vec::::with_capacity(n_leaves); + for _ in 0..n_leaves { + leaf_data.push(Readable::read(reader)?); + } + + let proof = Readable::read(reader)?; + + Ok(Self { + identifier, + hash_pos, + hashes, + leaf_pos, + leaf_data, + proof, + }) + } +} + +impl Writeable for Segment { + fn write(&self, writer: &mut W) -> Result<(), Error> { + Writeable::write(&self.identifier, writer)?; + writer.write_u64(self.hashes.len() as u64)?; + for &pos in &self.hash_pos { + writer.write_u64(pos)?; + } + for hash in &self.hashes { + Writeable::write(hash, writer)?; + } + writer.write_u64(self.leaf_data.len() as u64)?; + for &pos in &self.leaf_pos { + writer.write_u64(pos)?; + } + for data in &self.leaf_data { + Writeable::write(data, writer)?; + } + Writeable::write(&self.proof, writer)?; + Ok(()) + } +} + +/// Merkle proof of a segment +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct SegmentProof { + hashes: Vec, +} + +impl SegmentProof { + fn empty() -> Self { + Self { hashes: Vec::new() } + } + + fn generate( + pmmr: &ReadonlyPMMR<'_, U, B>, + last_pos: u64, + segment_first_pos: u64, + segment_last_pos: u64, + start_pos: Option, + ) -> Result + where + U: PMMRable, + B: Backend, + { + let family_branch = pmmr::family_branch(segment_last_pos, last_pos); + + // 1. siblings along the path from the subtree root to the peak + let hashes: Result, _> = family_branch + .iter() + .filter(|&&(p, _)| start_pos.map(|s| p > s).unwrap_or(true)) + .map(|&(_, s)| pmmr.get_hash(s).ok_or_else(|| SegmentError::MissingHash(s))) + .collect(); + let mut proof = Self { hashes: hashes? }; + + // 2. bagged peaks to the right + let peak_pos = family_branch + .last() + .map(|&(p, _)| p) + .unwrap_or(segment_last_pos); + if let Some(h) = pmmr.bag_the_rhs(peak_pos) { + proof.hashes.push(h); + } + + // 3. peaks to the left + let peaks: Result, _> = pmmr::peaks(last_pos) + .into_iter() + .filter(|&x| x < segment_first_pos) + .rev() + .map(|p| pmmr.get_hash(p).ok_or_else(|| SegmentError::MissingHash(p))) + .collect(); + proof.hashes.extend(peaks?); + + Ok(proof) + } + + /// Reconstruct PMMR root using this proof + pub fn reconstruct_root( + &self, + last_pos: u64, + segment_first_pos: u64, + segment_last_pos: u64, + segment_root: Hash, + segment_unpruned_pos: u64, + ) -> Result { + let mut iter = self.hashes.iter(); + let family_branch = pmmr::family_branch(segment_last_pos, last_pos); + + // 1. siblings along the path from the subtree root to the peak + let mut root = segment_root; + for &(p, s) in family_branch + .iter() + .filter(|&&(p, _)| p > segment_unpruned_pos) + { + let sibling_hash = iter.next().ok_or_else(|| SegmentError::MissingHash(s))?; + root = if pmmr::is_left_sibling(s) { + (sibling_hash, root).hash_with_index(p - 1) + } else { + (root, sibling_hash).hash_with_index(p - 1) + }; + } + + // 2. bagged peaks to the right + let peak_pos = family_branch + .last() + .map(|&(p, _)| p) + .unwrap_or(segment_last_pos); + + let rhs = pmmr::peaks(last_pos) + .into_iter() + .filter(|&x| x > peak_pos) + .next(); + + if let Some(pos) = rhs { + root = ( + root, + iter.next().ok_or_else(|| SegmentError::MissingHash(pos))?, + ) + .hash_with_index(last_pos) + } + + // 3. peaks to the left + let peaks = pmmr::peaks(last_pos) + .into_iter() + .filter(|&x| x < segment_first_pos) + .rev(); + for pos in peaks { + root = ( + iter.next().ok_or_else(|| SegmentError::MissingHash(pos))?, + root, + ) + .hash_with_index(last_pos); + } + + Ok(root) + } + + /// Check validity of the proof by equating the reconstructed root with the actual root + pub fn validate( + &self, + last_pos: u64, + mmr_root: Hash, + segment_first_pos: u64, + segment_last_pos: u64, + segment_root: Hash, + segment_unpruned_pos: u64, + ) -> Result<(), SegmentError> { + let root = self.reconstruct_root( + last_pos, + segment_first_pos, + segment_last_pos, + segment_root, + segment_unpruned_pos, + )?; + if root == mmr_root { + Ok(()) + } else { + Err(SegmentError::Mismatch) + } + } + + /// Check validity of the proof by equating the reconstructed root with the actual root + /// This function assumes a final hashing step together with `other_root` + pub fn validate_with( + &self, + last_pos: u64, + mmr_root: Hash, + segment_first_pos: u64, + segment_last_pos: u64, + segment_root: Hash, + segment_unpruned_pos: u64, + other_root: Hash, + other_is_left: bool, + ) -> Result<(), SegmentError> { + let root = self.reconstruct_root( + last_pos, + segment_first_pos, + segment_last_pos, + segment_root, + segment_unpruned_pos, + )?; + let root = if other_is_left { + (other_root, root).hash_with_index(last_pos) + } else { + (root, other_root).hash_with_index(last_pos) + }; + if root == mmr_root { + Ok(()) + } else { + Err(SegmentError::Mismatch) + } + } +} + +impl Readable for SegmentProof { + fn read(reader: &mut R) -> Result { + let n_hashes = reader.read_u64()? as usize; + let mut hashes = Vec::with_capacity(n_hashes); + for _ in 0..n_hashes { + let hash: Hash = Readable::read(reader)?; + hashes.push(hash); + } + Ok(Self { hashes }) + } +} + +impl Writeable for SegmentProof { + fn write(&self, writer: &mut W) -> Result<(), Error> { + writer.write_u64(self.hashes.len() as u64)?; + for hash in &self.hashes { + Writeable::write(hash, writer)?; + } + Ok(()) + } +} diff --git a/core/tests/segment.rs b/core/tests/segment.rs new file mode 100644 index 0000000000..c70a73e6fb --- /dev/null +++ b/core/tests/segment.rs @@ -0,0 +1,61 @@ +// Copyright 2020 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod common; + +use self::core::core::pmmr; +use self::core::core::{Segment, SegmentIdentifier}; +use common::TestElem; +use grin_core as core; +use grin_core::core::pmmr::ReadablePMMR; + +fn test_unprunable_size(height: u8, n_leaves: u32) { + let size = 1u64 << height; + let n_segments = (n_leaves as u64 + size - 1) / size; + + // Build an MMR with n_leaves leaves + let mut ba = pmmr::VecBackend::new(); + let mut mmr = pmmr::PMMR::new(&mut ba); + for i in 0..n_leaves { + mmr.push(&TestElem([i / 7, i / 5, i / 3, i])).unwrap(); + } + let mmr = mmr.readonly_pmmr(); + let last_pos = mmr.unpruned_size(); + let root = mmr.root().unwrap(); + + for idx in 0..n_segments { + let id = SegmentIdentifier { height, idx }; + let segment = Segment::from_pmmr(id, &mmr, false).unwrap(); + println!( + "\n\n>>>>>>> N_LEAVES = {}, LAST_POS = {}, SEGMENT = {}:\n{:#?}", + n_leaves, last_pos, idx, segment + ); + if idx < n_segments - 1 || (n_leaves as u64) % size == 0 { + // Check if the reconstructed subtree root matches with the hash stored in the mmr + let subtree_root = segment.root(last_pos, None).unwrap().unwrap(); + let last = pmmr::insertion_to_pmmr_index((idx + 1) * size) + (height as u64); + assert_eq!(subtree_root, mmr.get_hash(last).unwrap()); + println!(" ROOT OK"); + } + segment.validate(last_pos, None, root).unwrap(); + println!(" PROOF OK"); + } +} + +#[test] +fn unprunable_mmr() { + for i in 1..=64 { + test_unprunable_size(3, i); + } +} diff --git a/store/tests/segment.rs b/store/tests/segment.rs new file mode 100644 index 0000000000..042a5365a2 --- /dev/null +++ b/store/tests/segment.rs @@ -0,0 +1,422 @@ +// Copyright 2020 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::core::core::hash::DefaultHashable; +use crate::core::core::pmmr; +use crate::core::core::pmmr::segment::{Segment, SegmentIdentifier}; +use crate::core::core::pmmr::{Backend, ReadablePMMR, ReadonlyPMMR, PMMR}; +use crate::core::ser::{ + BinReader, BinWriter, Error, PMMRable, ProtocolVersion, Readable, Reader, Writeable, Writer, +}; +use crate::store::pmmr::PMMRBackend; +use chrono::Utc; +use croaring::Bitmap; +use grin_core as core; +use grin_store as store; +use std::fs; +use std::io::Cursor; + +#[test] +fn prunable_mmr() { + let t = Utc::now(); + let data_dir = format!( + "./target/tmp/{}.{}-prunable_mmr", + t.timestamp(), + t.timestamp_subsec_nanos() + ); + fs::create_dir_all(&data_dir).unwrap(); + + let n_leaves = 64 + 8 + 4 + 2 + 1; + let mut ba = PMMRBackend::new(&data_dir, true, ProtocolVersion(1), None).unwrap(); + let mut mmr = PMMR::new(&mut ba); + for i in 0..n_leaves { + mmr.push(&TestElem([i / 7, i / 5, i / 3, i])).unwrap(); + } + let last_pos = mmr.unpruned_size(); + let root = mmr.root().unwrap(); + + let mut bitmap = Bitmap::create(); + bitmap.add_range(0..n_leaves as u64); + + let id = SegmentIdentifier { height: 3, idx: 1 }; + + // Validate a segment before any pruning + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!( + segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), + mmr.get_hash(30).unwrap() + ); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune a few leaves + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[8, 9, 13]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!( + segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), + mmr.get_hash(30).unwrap() + ); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune more + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[10, 11]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!( + segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), + mmr.get_hash(30).unwrap() + ); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune all but 1 + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[14, 15]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!( + segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), + mmr.get_hash(30).unwrap() + ); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune all + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[12]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + assert!(Segment::from_pmmr(id, &mmr, true).is_ok()); + + // Final segment is not full, test it before pruning + let id = SegmentIdentifier { height: 3, idx: 9 }; + + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune second and third to last leaves (a full peak in the MMR) + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[76, 77]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune final element + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[78]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + std::mem::drop(ba); + fs::remove_dir_all(&data_dir).unwrap(); +} + +#[test] +fn pruned_segment() { + let t = Utc::now(); + let data_dir = format!( + "./target/tmp/{}.{}-pruned_segment", + t.timestamp(), + t.timestamp_subsec_nanos() + ); + fs::create_dir_all(&data_dir).unwrap(); + + let n_leaves = 16; + let mut ba = PMMRBackend::new(&data_dir, true, ProtocolVersion(1), None).unwrap(); + let mut mmr = PMMR::new(&mut ba); + for i in 0..n_leaves { + mmr.push(&TestElem([i / 7, i / 5, i / 3, i])).unwrap(); + } + let last_pos = mmr.unpruned_size(); + let root = mmr.root().unwrap(); + + let mut bitmap = Bitmap::create(); + bitmap.add_range(0..n_leaves as u64); + + // Prune all leaves of segment 1 + prune(&mut mmr, &mut bitmap, &[4, 5, 6, 7]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate the empty segment 1 + let id = SegmentIdentifier { height: 2, idx: 1 }; + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!(segment.leaf_iter().count(), 0); + assert_eq!(segment.hash_iter().count(), 1); + assert_eq!( + segment + .first_unpruned_parent(last_pos, Some(&bitmap)) + .unwrap(), + (ba.get_hash(14).unwrap(), 14) + ); + assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_none()); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune all leaves of segment 0 + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[0, 1, 2, 3]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate the empty segment 1 again + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!(segment.leaf_iter().count(), 0); + assert_eq!(segment.hash_iter().count(), 1); + // Since both 7 and 14 are now pruned, the first unpruned hash will be at 15 + assert_eq!( + segment + .first_unpruned_parent(last_pos, Some(&bitmap)) + .unwrap(), + (ba.get_hash(15).unwrap(), 15) + ); + assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_none()); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune all leaves of segment 2 & 3 + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[8, 9, 10, 11, 12, 13, 14, 15]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate the empty segment 1 again + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!(segment.leaf_iter().count(), 0); + assert_eq!(segment.hash_iter().count(), 1); + // Since both 15 and 30 are now pruned, the first unpruned hash will be at 31: the mmr root + assert_eq!( + segment + .first_unpruned_parent(last_pos, Some(&bitmap)) + .unwrap(), + (root, 31) + ); + assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_none()); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + let n_leaves = n_leaves + 4 + 2 + 1; + let mut mmr = PMMR::at(&mut ba, last_pos); + for i in 16..n_leaves { + mmr.push(&TestElem([i / 7, i / 5, i / 3, i])).unwrap(); + } + bitmap.add_range(16..n_leaves as u64); + let last_pos = mmr.unpruned_size(); + let root = mmr.root().unwrap(); + + // Prune all leaves of segment 4 + // The root of this segment is a direct peak of the full MMR + prune(&mut mmr, &mut bitmap, &[16, 17, 18, 19]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate segment 4 + let id = SegmentIdentifier { height: 2, idx: 4 }; + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!(segment.leaf_iter().count(), 0); + assert_eq!(segment.hash_iter().count(), 1); + assert_eq!( + segment + .first_unpruned_parent(last_pos, Some(&bitmap)) + .unwrap(), + (ba.get_hash(38).unwrap(), 38) + ); + assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_none()); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Segment 5 has 2 peaks + let id = SegmentIdentifier { height: 2, idx: 5 }; + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!(segment.leaf_iter().count(), 3); + assert_eq!( + segment + .first_unpruned_parent(last_pos, Some(&bitmap)) + .unwrap() + .1, + segment.segment_pos_range(last_pos).1 + ); + assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_some()); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + let prev_segment = segment; + + // Prune final leaf (a peak) + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[22]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Segment 5 should be unchanged + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!(segment, prev_segment); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + // Prune other peak of segment 5 + let mut mmr = PMMR::at(&mut ba, last_pos); + prune(&mut mmr, &mut bitmap, &[20, 21]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + // Validate segment 5 again + let mmr = ReadonlyPMMR::at(&mut ba, last_pos); + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + assert_eq!(segment.leaf_iter().count(), 1); + assert_eq!(segment.hash_iter().count(), 1); + assert_eq!( + segment + .first_unpruned_parent(last_pos, Some(&bitmap)) + .unwrap() + .1, + segment.segment_pos_range(last_pos).1 + ); + assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_some()); + segment.validate(last_pos, Some(&bitmap), root).unwrap(); + + std::mem::drop(ba); + fs::remove_dir_all(&data_dir).unwrap(); +} + +#[test] +fn ser_round_trip() { + let t = Utc::now(); + let data_dir = format!( + "./target/tmp/{}.{}-segment_ser_round_trip", + t.timestamp(), + t.timestamp_subsec_nanos() + ); + fs::create_dir_all(&data_dir).unwrap(); + + let n_leaves = 32; + let mut ba = PMMRBackend::new(&data_dir, true, ProtocolVersion(1), None).unwrap(); + let mut mmr = pmmr::PMMR::new(&mut ba); + for i in 0..n_leaves { + mmr.push(&TestElem([i / 7, i / 5, i / 3, i])).unwrap(); + } + let mut bitmap = Bitmap::create(); + bitmap.add_range(0..n_leaves as u64); + let last_pos = mmr.unpruned_size(); + + prune(&mut mmr, &mut bitmap, &[0, 1]); + ba.sync().unwrap(); + ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.sync().unwrap(); + + let mmr = ReadonlyPMMR::at(&ba, last_pos); + let id = SegmentIdentifier { height: 3, idx: 0 }; + let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); + + let mut cursor = Cursor::new(Vec::::new()); + let mut writer = BinWriter::new(&mut cursor, ProtocolVersion(1)); + Writeable::write(&segment, &mut writer).unwrap(); + assert_eq!( + cursor.position(), + (9) + (8 + 7 * (8 + 32)) + (8 + 6 * (8 + 16)) + (8 + 2 * 32) + ); + cursor.set_position(0); + + let mut reader = BinReader::new(&mut cursor, ProtocolVersion(1)); + let segment2: Segment = Readable::read(&mut reader).unwrap(); + assert_eq!(segment, segment2); + + std::mem::drop(ba); + fs::remove_dir_all(&data_dir).unwrap(); +} + +fn prune(mmr: &mut PMMR, bitmap: &mut Bitmap, leaf_idxs: &[u64]) +where + T: PMMRable, + B: Backend, +{ + for &leaf_idx in leaf_idxs { + mmr.prune(pmmr::insertion_to_pmmr_index(leaf_idx + 1)) + .unwrap(); + bitmap.remove(leaf_idx as u32); + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub struct TestElem(pub [u32; 4]); + +impl DefaultHashable for TestElem {} + +impl PMMRable for TestElem { + type E = Self; + + fn as_elmt(&self) -> Self::E { + *self + } + + fn elmt_size() -> Option { + Some(16) + } +} + +impl Writeable for TestElem { + fn write(&self, writer: &mut W) -> Result<(), Error> { + writer.write_u32(self.0[0])?; + writer.write_u32(self.0[1])?; + writer.write_u32(self.0[2])?; + writer.write_u32(self.0[3]) + } +} + +impl Readable for TestElem { + fn read(reader: &mut R) -> Result { + Ok(TestElem([ + reader.read_u32()?, + reader.read_u32()?, + reader.read_u32()?, + reader.read_u32()?, + ])) + } +} From 01b460604cfb7c2cc3b58028711764449d68bdd6 Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 14:25:39 -0700 Subject: [PATCH 05/96] grin v5.3 (0006) default capabilities cleanup (#3484) * default capabilities cleanup * fix tests for unused pibd capabilities --- api/src/handlers/server_api.rs | 5 +- api/src/handlers/utils.rs | 2 +- chain/src/chain.rs | 74 +-- chain/src/pipe.rs | 62 +- chain/src/store.rs | 4 +- chain/src/txhashset/bitmap_accumulator.rs | 332 ++++++++++- chain/src/txhashset/txhashset.rs | 258 ++++---- chain/src/txhashset/utxo_view.rs | 28 +- chain/src/types.rs | 36 +- chain/tests/bitmap_segment.rs | 79 +++ chain/tests/process_block_cut_through.rs | 3 + config/src/comments.rs | 12 +- core/src/core/merkle_proof.rs | 24 +- core/src/core/pmmr/backend.rs | 19 +- core/src/core/pmmr/pmmr.rs | 681 ++++++++++++---------- core/src/core/pmmr/readonly_pmmr.rs | 204 +++---- core/src/core/pmmr/rewindable_pmmr.rs | 9 +- core/src/core/pmmr/segment.rs | 280 +++++---- core/src/core/pmmr/vec_backend.rs | 40 +- core/tests/merkle_proof.rs | 88 +-- core/tests/pmmr.rs | 352 ++++++++--- core/tests/segment.rs | 2 +- core/tests/vec_backend.rs | 6 +- p2p/src/serv.rs | 4 +- p2p/src/types.rs | 32 +- p2p/tests/capabilities.rs | 52 ++ p2p/tests/ser_deser.rs | 31 +- servers/src/common/adapters.rs | 24 +- servers/src/grin/seed.rs | 8 +- servers/src/grin/sync/header_sync.rs | 95 +-- servers/src/grin/sync/state_sync.rs | 13 - servers/src/grin/sync/syncer.rs | 13 +- src/bin/tui/status.rs | 5 +- store/src/leaf_set.rs | 14 +- store/src/pmmr.rs | 143 +++-- store/src/prune_list.rs | 430 ++++++++++---- store/src/types.rs | 5 +- store/tests/pmmr.rs | 272 ++++----- store/tests/prune_list.rs | 415 +++++++++---- store/tests/segment.rs | 61 +- store/tests/utxo_set_perf.rs | 6 +- 41 files changed, 2721 insertions(+), 1502 deletions(-) create mode 100644 chain/tests/bitmap_segment.rs create mode 100644 p2p/tests/capabilities.rs diff --git a/api/src/handlers/server_api.rs b/api/src/handlers/server_api.rs index 2a5498f2c2..611961d8b0 100644 --- a/api/src/handlers/server_api.rs +++ b/api/src/handlers/server_api.rs @@ -122,11 +122,12 @@ fn sync_status_to_api(sync_status: SyncStatus) -> (String, Option ("no_sync".to_string(), None), SyncStatus::AwaitingPeers(_) => ("awaiting_peers".to_string(), None), SyncStatus::HeaderSync { - current_height, + sync_head, highest_height, + .. } => ( "header_sync".to_string(), - Some(json!({ "current_height": current_height, "highest_height": highest_height })), + Some(json!({ "current_height": sync_head.height, "highest_height": highest_height })), ), SyncStatus::TxHashsetDownload(stats) => ( "txhashset_download".to_string(), diff --git a/api/src/handlers/utils.rs b/api/src/handlers/utils.rs index cb308640ed..57d5da42f7 100644 --- a/api/src/handlers/utils.rs +++ b/api/src/handlers/utils.rs @@ -71,7 +71,7 @@ pub fn get_output_v2( None => return Ok(None), }; - let output = chain.get_unspent_output_at(pos.pos)?; + let output = chain.get_unspent_output_at(pos.pos - 1)?; let header = if include_merkle_proof && output.is_coinbase() { chain.get_header_by_height(pos.height).ok() } else { diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 0a03fae9ad..45ff872259 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -600,28 +600,23 @@ impl Chain { /// Attempt to add new headers to the header chain (or fork). /// This is only ever used during sync and is based on sync_head. /// We update header_head here if our total work increases. - pub fn sync_block_headers(&self, headers: &[BlockHeader], opts: Options) -> Result<(), Error> { - let mut sync_pmmr = self.sync_pmmr.write(); + /// Returns the new sync_head (may temporarily diverge from header_head when syncing a long fork). + pub fn sync_block_headers( + &self, + headers: &[BlockHeader], + sync_head: Tip, + opts: Options, + ) -> Result, Error> { let mut header_pmmr = self.header_pmmr.write(); let mut txhashset = self.txhashset.write(); + let batch = self.store.batch()?; - // Sync the chunk of block headers, updating sync_head as necessary. - { - let batch = self.store.batch()?; - let mut ctx = self.new_ctx(opts, batch, &mut sync_pmmr, &mut txhashset)?; - pipe::sync_block_headers(headers, &mut ctx)?; - ctx.batch.commit()?; - } - - // Now "process" the last block header, updating header_head to match sync_head. - if let Some(header) = headers.last() { - let batch = self.store.batch()?; - let mut ctx = self.new_ctx(opts, batch, &mut header_pmmr, &mut txhashset)?; - pipe::process_block_header(header, &mut ctx)?; - ctx.batch.commit()?; - } + // Sync the chunk of block headers, updating header_head if total work increases. + let mut ctx = self.new_ctx(opts, batch, &mut header_pmmr, &mut txhashset)?; + let sync_head = pipe::process_block_headers(headers, sync_head, &mut ctx)?; + ctx.batch.commit()?; - Ok(()) + Ok(sync_head) } /// Build a new block processing context. @@ -718,11 +713,11 @@ impl Chain { } /// Retrieves an unspent output using its PMMR position - pub fn get_unspent_output_at(&self, pos: u64) -> Result { + pub fn get_unspent_output_at(&self, pos0: u64) -> Result { let header_pmmr = self.header_pmmr.read(); let txhashset = self.txhashset.read(); txhashset::utxo_view(&header_pmmr, &txhashset, |utxo, _| { - utxo.get_unspent_output_at(pos) + utxo.get_unspent_output_at(pos0) }) } @@ -1426,7 +1421,7 @@ impl Chain { let txhashset = self.txhashset.read(); let last_index = match max_pmmr_index { Some(i) => i, - None => txhashset.highest_output_insertion_index(), + None => txhashset.output_mmr_size(), }; let outputs = txhashset.outputs_by_pmmr_index(start_index, max_count, max_pmmr_index); let rangeproofs = @@ -1455,13 +1450,14 @@ impl Chain { None => self.head_header()?.height, }; // Return headers at the given heights - let prev_to_start_header = - self.get_header_by_height(start_block_height.saturating_sub(1))?; - let end_header = self.get_header_by_height(end_block_height)?; - Ok(( - prev_to_start_header.output_mmr_size + 1, - end_header.output_mmr_size, - )) + let start_mmr_size = if start_block_height == 0 { + 0 + } else { + self.get_header_by_height(start_block_height - 1)? + .output_mmr_size + 1 + }; + let end_mmr_size = self.get_header_by_height(end_block_height)?.output_mmr_size; + Ok((start_mmr_size, end_mmr_size)) } /// Orphans pool size @@ -1699,12 +1695,20 @@ impl Chain { /// Gets multiple headers at the provided heights. /// Note: Uses the sync pmmr, not the header pmmr. - pub fn get_locator_hashes(&self, heights: &[u64]) -> Result, Error> { - let pmmr = self.sync_pmmr.read(); - heights - .iter() - .map(|h| pmmr.get_header_hash_by_height(*h)) - .collect() + /// Note: This is based on the provided sync_head to support syncing against a fork. + pub fn get_locator_hashes(&self, sync_head: Tip, heights: &[u64]) -> Result, Error> { + let mut header_pmmr = self.header_pmmr.write(); + txhashset::header_extending_readonly(&mut header_pmmr, &self.store(), |ext, batch| { + let header = batch.get_block_header(&sync_head.hash())?; + pipe::rewind_and_apply_header_fork(&header, ext, batch)?; + + let hashes = heights + .iter() + .filter_map(|h| ext.get_header_hash_by_height(*h)) + .collect(); + + Ok(hashes) + }) } /// Builds an iterator on blocks starting from the current chain head and @@ -1739,7 +1743,7 @@ fn setup_head( batch.save_block_header(&genesis.header)?; } - if header_pmmr.last_pos == 0 { + if header_pmmr.size == 0 { txhashset::header_extending(header_pmmr, &mut batch, |ext, _| { ext.apply_header(&genesis.header) })?; diff --git a/chain/src/pipe.rs b/chain/src/pipe.rs index 666fed7647..24be0870f7 100644 --- a/chain/src/pipe.rs +++ b/chain/src/pipe.rs @@ -287,42 +287,52 @@ pub fn replay_attack_check( /// Sync a chunk of block headers. /// This is only used during header sync. +/// Will update header_head locally if this batch of headers increases total work. +/// Returns the updated sync_head, which may be on a fork. pub fn sync_block_headers( headers: &[BlockHeader], + sync_head: Tip, ctx: &mut BlockContext<'_>, -) -> Result<(), Error> { +) -> Result, Error> { if headers.is_empty() { - return Ok(()); + return Ok(None); } let last_header = headers.last().expect("last header"); - // Check if we know about all these headers. If so we can accept them quickly. - // If they *do not* increase total work on the sync chain we are done. - // If they *do* increase total work then we should process them to update sync_head. - let sync_head = { - let hash = ctx.header_pmmr.head_hash()?; - let header = ctx.batch.get_block_header(&hash)?; - Tip::from_header(&header) - }; - - if let Ok(existing) = ctx.batch.get_block_header(&last_header.hash()) { - if !has_more_work(&existing, &sync_head) { - return Ok(()); - } - } + let head = ctx.batch.header_head()?; // Validate each header in the chunk and add to our db. // Note: This batch may be rolled back later if the MMR does not validate successfully. + // Note: This batch may later be committed even if the MMR itself is rollbacked. for header in headers { validate_header(header, ctx)?; add_block_header(header, &ctx.batch)?; } - // Now apply this entire chunk of headers to the sync MMR (ctx is sync MMR specific). + // Now apply this entire chunk of headers to the header MMR. txhashset::header_extending(&mut ctx.header_pmmr, &mut ctx.batch, |ext, batch| { rewind_and_apply_header_fork(&last_header, ext, batch)?; - Ok(()) - }) + // If previous sync_head is not on the "current" chain then + // these headers are on an alternative fork to sync_head. + let alt_fork = !ext.is_on_current_chain(sync_head, batch)?; + + // Update our "header_head" if this batch results in an increase in total work. + // Otherwise rollback this header extension. + // Note the outer batch may still be committed to db assuming no errors occur in the extension. + if has_more_work(last_header, &head) { + let header_head = last_header.into(); + update_header_head(&header_head, &batch)?; + } else { + ext.force_rollback(); + }; + + Ok(()) + if alt_fork || has_more_work(last_header, &sync_head) { + Ok(Some(last_header.into())) + } else { + Ok(None) + } + }) } /// Process a block header. Update the header MMR and corresponding header_head if this header @@ -375,7 +385,7 @@ pub fn process_block_header(header: &BlockHeader, ctx: &mut BlockContext<'_>) -> update_header_head(&Tip::from_header(header), &mut ctx.batch)?; } - Ok(()) + Ok(()) } /// Quick check to reject recently handled blocks. @@ -617,7 +627,7 @@ fn add_block_header(bh: &BlockHeader, batch: &store::Batch<'_>) -> Result<(), Er Ok(()) } -fn update_header_head(head: &Tip, batch: &mut store::Batch<'_>) -> Result<(), Error> { +fn update_header_head(head: &Tip, batch: &store::Batch<'_>) -> Result<(), Error> { batch .save_header_head(&head) .map_err(|e| ErrorKind::StoreErr(e, "pipe save header head".to_owned()))?; @@ -630,7 +640,7 @@ fn update_header_head(head: &Tip, batch: &mut store::Batch<'_>) -> Result<(), Er Ok(()) } -fn update_head(head: &Tip, batch: &mut store::Batch<'_>) -> Result<(), Error> { +fn update_head(head: &Tip, batch: &store::Batch<'_>) -> Result<(), Error> { batch .save_body_head(&head) .map_err(|e| ErrorKind::StoreErr(e, "pipe save body".to_owned()))?; @@ -653,7 +663,7 @@ pub fn rewind_and_apply_header_fork( ) -> Result<(), Error> { let mut fork_hashes = vec![]; let mut current = header.clone(); - while current.height > 0 && ext.is_on_current_chain(¤t, batch).is_err() { + while current.height > 0 && !ext.is_on_current_chain(¤t, batch)? { fork_hashes.push(current.hash()); current = batch.get_previous_header(¤t)?; } @@ -694,11 +704,7 @@ pub fn rewind_and_apply_fork( // Rewind the txhashset extension back to common ancestor based on header MMR. let mut current = batch.head_header()?; - while current.height > 0 - && header_extension - .is_on_current_chain(¤t, batch) - .is_err() - { + while current.height > 0 && !header_extension.is_on_current_chain(¤t, batch)? { current = batch.get_previous_header(¤t)?; } let fork_point = current; diff --git a/chain/src/store.rs b/chain/src/store.rs index a93df1c7aa..5229bd5dd1 100644 --- a/chain/src/store.rs +++ b/chain/src/store.rs @@ -117,7 +117,7 @@ impl ChainStore { /// Get PMMR pos for the given output commitment. pub fn get_output_pos(&self, commit: &Commitment) -> Result { match self.get_output_pos_height(commit)? { - Some(pos) => Ok(pos.pos), + Some(pos) => Ok(pos.pos - 1), None => Err(Error::NotFoundErr(format!( "Output position for: {:?}", commit @@ -374,7 +374,7 @@ impl<'a> Batch<'a> { /// Get output_pos from index. pub fn get_output_pos(&self, commit: &Commitment) -> Result { match self.get_output_pos_height(commit)? { - Some(pos) => Ok(pos.pos), + Some(pos) => Ok(pos.pos - 1), None => Err(Error::NotFoundErr(format!( "Output position for: {:?}", commit diff --git a/chain/src/txhashset/bitmap_accumulator.rs b/chain/src/txhashset/bitmap_accumulator.rs index bdc72b45b9..fddad29e31 100644 --- a/chain/src/txhashset/bitmap_accumulator.rs +++ b/chain/src/txhashset/bitmap_accumulator.rs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::cmp::min; use std::convert::TryFrom; use std::time::Instant; @@ -19,9 +20,11 @@ use bit_vec::BitVec; use croaring::Bitmap; use crate::core::core::hash::{DefaultHashable, Hash}; -use crate::core::core::pmmr::{self, ReadonlyPMMR, VecBackend, PMMR}; +use crate::core::core::pmmr::segment::{Segment, SegmentIdentifier, SegmentProof}; +use crate::core::core::pmmr::{self, ReadablePMMR, ReadonlyPMMR, VecBackend, PMMR}; use crate::core::ser::{self, PMMRable, Readable, Reader, Writeable, Writer}; use crate::error::{Error, ErrorKind}; +use enum_primitive::FromPrimitive; /// The "bitmap accumulator" allows us to commit to a specific bitmap by splitting it into /// fragments and inserting these fragments into an MMR to produce an overall root hash. @@ -47,6 +50,8 @@ pub struct BitmapAccumulator { } impl BitmapAccumulator { + const NBITS: u64 = BitmapChunk::LEN_BITS as u64; + /// Crate a new empty bitmap accumulator. pub fn new() -> BitmapAccumulator { BitmapAccumulator { @@ -62,12 +67,12 @@ impl BitmapAccumulator { /// Find the start of the first "chunk" of 1024 bits from the provided idx. /// Zero the last 10 bits to round down to multiple of 1024. pub fn chunk_start_idx(idx: u64) -> u64 { - idx & !0x3ff + idx & !(Self::NBITS - 1) } /// The first 1024 belong to chunk 0, the next 1024 to chunk 1 etc. fn chunk_idx(idx: u64) -> u64 { - idx / 1024 + idx / Self::NBITS } /// Apply the provided idx iterator to our bitmap accumulator. @@ -88,12 +93,13 @@ impl BitmapAccumulator { let mut idx_iter = idx.into_iter().filter(|&x| x < size).peekable(); while let Some(x) = idx_iter.peek() { - if *x < chunk_idx * 1024 { + if *x < chunk_idx * Self::NBITS { + // NOTE we never get here if idx starts from from_idx // skip until we reach our first chunk idx_iter.next(); - } else if *x < (chunk_idx + 1) * 1024 { + } else if *x < (chunk_idx + 1) * Self::NBITS { let idx = idx_iter.next().expect("next after peek"); - chunk.set(idx % 1024, true); + chunk.set(idx % Self::NBITS, true); } else { self.append_chunk(chunk)?; chunk_idx += 1; @@ -121,6 +127,8 @@ impl BitmapAccumulator { /// If size is 1 then we will have a single chunk. /// If size is 1023 then we will have a single chunk (bits 0 to 1023 inclusive). /// If the size is 1024 then we will have two chunks. + /// TODO: first argument is an iterator for no good reason; + /// might as well pass from_idx as first argument pub fn apply(&mut self, invalidated_idx: T, idx: U, size: u64) -> Result<(), Error> where T: IntoIterator, @@ -146,8 +154,7 @@ impl BitmapAccumulator { let chunk_idx = BitmapAccumulator::chunk_idx(from_idx); let last_pos = self.backend.size(); let mut pmmr = PMMR::at(&mut self.backend, last_pos); - let chunk_pos = pmmr::insertion_to_pmmr_index(chunk_idx + 1); - let rewind_pos = chunk_pos.saturating_sub(1); + let rewind_pos = pmmr::insertion_to_pmmr_index(chunk_idx); pmmr.rewind(rewind_pos, &Bitmap::new()) .map_err(|e| ErrorKind::Other(format!("pmmr rewind error, {}", e)))?; Ok(()) @@ -178,13 +185,15 @@ impl BitmapAccumulator { /// The root hash of the bitmap accumulator MMR. pub fn root(&self) -> Hash { - ReadonlyPMMR::at(&self.backend, self.backend.size()).root() + ReadonlyPMMR::at(&self.backend, self.backend.size()) + .root() + .expect("no root, invalid tree") } } /// A bitmap "chunk" representing 1024 contiguous bits of the overall bitmap. /// The first 1024 bits belong in one chunk. The next 1024 bits in the next chunk, etc. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct BitmapChunk(BitVec); impl BitmapChunk { @@ -239,3 +248,306 @@ impl Readable for BitmapChunk { Ok(BitmapChunk::new()) } } + +/// +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct BitmapSegment { + identifier: SegmentIdentifier, + blocks: Vec, + proof: SegmentProof, +} + +impl Writeable for BitmapSegment { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + Writeable::write(&self.identifier, writer)?; + writer.write_u16(self.blocks.len() as u16)?; + for block in &self.blocks { + Writeable::write(block, writer)?; + } + Writeable::write(&self.proof, writer)?; + Ok(()) + } +} + +impl Readable for BitmapSegment { + fn read(reader: &mut R) -> Result { + let identifier: SegmentIdentifier = Readable::read(reader)?; + + let n_blocks = reader.read_u16()? as usize; + let mut blocks = Vec::::with_capacity(n_blocks); + for _ in 0..n_blocks { + blocks.push(Readable::read(reader)?); + } + let proof = Readable::read(reader)?; + + Ok(Self { + identifier, + blocks, + proof, + }) + } +} + +// TODO: this can be sped up with some `unsafe` code +impl From> for BitmapSegment { + fn from(segment: Segment) -> Self { + let (identifier, _, _, _, leaf_data, proof) = segment.parts(); + + let mut chunks_left = leaf_data.len(); + let mut blocks = + Vec::with_capacity((chunks_left + BitmapBlock::NCHUNKS - 1) / BitmapBlock::NCHUNKS); + while chunks_left > 0 { + let n_chunks = min(BitmapBlock::NCHUNKS, chunks_left); + chunks_left = chunks_left.saturating_sub(n_chunks); + blocks.push(BitmapBlock::new(n_chunks)); + } + + for (chunk_idx, chunk) in leaf_data.into_iter().enumerate() { + assert_eq!(chunk.0.len(), BitmapChunk::LEN_BITS); + let block = &mut blocks + .get_mut(chunk_idx / BitmapBlock::NCHUNKS) + .unwrap() + .inner; + let offset = (chunk_idx % BitmapBlock::NCHUNKS) * BitmapChunk::LEN_BITS; + for (i, _) in chunk.0.iter().enumerate().filter(|&(_, v)| v) { + block.set(offset + i, true); + } + } + + Self { + identifier, + blocks, + proof, + } + } +} + +// TODO: this can be sped up with some `unsafe` code +impl From for Segment { + fn from(segment: BitmapSegment) -> Self { + let BitmapSegment { + identifier, + blocks, + proof, + } = segment; + + // Count the number of chunks taking into account that the final block might be smaller + let n_chunks = (blocks.len() - 1) * BitmapBlock::NCHUNKS + + blocks.last().map(|b| b.n_chunks()).unwrap_or(0); + let mut leaf_pos = Vec::with_capacity(n_chunks); + let mut chunks = Vec::with_capacity(n_chunks); + let offset = (1 << identifier.height) * identifier.idx; + for i in 0..(n_chunks as u64) { + leaf_pos.push(pmmr::insertion_to_pmmr_index(offset + i)); + chunks.push(BitmapChunk::new()); + } + + for (block_idx, block) in blocks.into_iter().enumerate() { + assert_eq!(block.inner.len(), BitmapBlock::NBITS as usize); + let offset = block_idx * BitmapBlock::NCHUNKS; + for (i, _) in block.inner.iter().enumerate().filter(|&(_, v)| v) { + chunks + .get_mut(offset + i / BitmapChunk::LEN_BITS) + .unwrap() + .0 + .set(i % BitmapChunk::LEN_BITS, true); + } + } + + Segment::from_parts(identifier, Vec::new(), Vec::new(), leaf_pos, chunks, proof) + } +} + +/// A block of 2^16 bits that provides an efficient (de)serialization +/// depending on the bitmap occupancy. +#[derive(Clone, Debug, PartialEq, Eq)] +struct BitmapBlock { + inner: BitVec, +} + +impl BitmapBlock { + /// Maximum number of bits in a block + const NBITS: u32 = 1 << 16; + /// Maximum number of chunks in a block + const NCHUNKS: usize = Self::NBITS as usize / BitmapChunk::LEN_BITS; + + fn new(n_chunks: usize) -> Self { + assert!(n_chunks <= BitmapBlock::NCHUNKS); + Self { + inner: BitVec::from_elem(n_chunks * BitmapChunk::LEN_BITS, false), + } + } + + fn n_chunks(&self) -> usize { + let length = self.inner.len(); + assert_eq!(length % BitmapChunk::LEN_BITS, 0); + let n_chunks = length / BitmapChunk::LEN_BITS; + assert!(n_chunks <= BitmapBlock::NCHUNKS); + n_chunks + } +} + +impl Writeable for BitmapBlock { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + let length = self.inner.len(); + assert!(length <= Self::NBITS as usize); + assert_eq!(length % BitmapChunk::LEN_BITS, 0); + writer.write_u8((length / BitmapChunk::LEN_BITS) as u8)?; + + let count_pos = self.inner.iter().filter(|&v| v).count() as u32; + let count_neg = Self::NBITS - count_pos; + let threshold = Self::NBITS / 16; + if count_pos < threshold { + // Write positive indices + Writeable::write(&BitmapBlockSerialization::Positive, writer)?; + writer.write_u16(count_pos as u16)?; + for (i, _) in self.inner.iter().enumerate().filter(|&(_, v)| v) { + writer.write_u16(i as u16)?; + } + } else if count_neg < threshold { + // Write negative indices + Writeable::write(&BitmapBlockSerialization::Negative, writer)?; + writer.write_u16(count_neg as u16)?; + for (i, _) in self.inner.iter().enumerate().filter(|&(_, v)| !v) { + writer.write_u16(i as u16)?; + } + } else { + // Write raw bytes + Writeable::write(&BitmapBlockSerialization::Raw, writer)?; + let bytes = self.inner.to_bytes(); + assert_eq!(bytes.len(), Self::NBITS as usize / 8); + writer.write_fixed_bytes(&bytes)?; + } + + Ok(()) + } +} + +impl Readable for BitmapBlock { + fn read(reader: &mut R) -> Result { + let n_chunks = reader.read_u8()?; + if n_chunks as usize > BitmapBlock::NCHUNKS { + return Err(ser::Error::TooLargeReadErr); + } + let n_bits = n_chunks as usize * BitmapChunk::LEN_BITS; + + let mode = Readable::read(reader)?; + let inner = match mode { + BitmapBlockSerialization::Raw => { + // Raw bytes + let bytes = reader.read_fixed_bytes(n_bits / 8)?; + BitVec::from_bytes(&bytes) + } + BitmapBlockSerialization::Positive => { + // Positive indices + let mut inner = BitVec::from_elem(n_bits, false); + let n = reader.read_u16()?; + for _ in 0..n { + inner.set(reader.read_u16()? as usize, true); + } + inner + } + BitmapBlockSerialization::Negative => { + // Negative indices + let mut inner = BitVec::from_elem(n_bits, true); + let n = reader.read_u16()?; + for _ in 0..n { + inner.set(reader.read_u16()? as usize, false); + } + inner + } + }; + + Ok(BitmapBlock { inner }) + } +} + +enum_from_primitive! { + #[derive(Debug, Clone, Copy, PartialEq)] + #[repr(u8)] + enum BitmapBlockSerialization { + Raw = 0, + Positive = 1, + Negative = 2, + } +} + +impl Writeable for BitmapBlockSerialization { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + writer.write_u8(*self as u8) + } +} + +impl Readable for BitmapBlockSerialization { + fn read(reader: &mut R) -> Result { + Self::from_u8(reader.read_u8()?).ok_or(ser::Error::CorruptedData) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::core::ser::{BinReader, BinWriter, ProtocolVersion, Readable, Writeable}; + use byteorder::ReadBytesExt; + use grin_util::secp::rand::Rng; + use rand::thread_rng; + use std::io::Cursor; + + fn test_roundtrip(entries: usize, inverse: bool, encoding: u8, length: usize) { + let mut rng = thread_rng(); + let mut block = BitmapBlock::new(64); + if inverse { + block.inner.negate(); + } + + // Flip `entries` bits in random spots + let mut count = 0; + while count < entries { + let idx = rng.gen_range(0, BitmapBlock::NBITS as usize); + if block.inner.get(idx).unwrap() == inverse { + count += 1; + block.inner.set(idx, !inverse); + } + } + + // Serialize + let mut cursor = Cursor::new(Vec::::new()); + let mut writer = BinWriter::new(&mut cursor, ProtocolVersion(1)); + Writeable::write(&block, &mut writer).unwrap(); + + // Check encoding type and length + cursor.set_position(1); + assert_eq!(cursor.read_u8().unwrap(), encoding); + let actual_length = cursor.get_ref().len(); + assert_eq!(actual_length, length); + assert!(actual_length <= 2 + BitmapBlock::NBITS as usize / 8); + + // Deserialize + cursor.set_position(0); + let mut reader = BinReader::new(&mut cursor, ProtocolVersion(1)); + let block2: BitmapBlock = Readable::read(&mut reader).unwrap(); + assert_eq!(block, block2); + } + + #[test] + fn block_ser_roundtrip() { + let threshold = BitmapBlock::NBITS as usize / 16; + let entries = thread_rng().gen_range(threshold, 4 * threshold); + test_roundtrip(entries, false, 0, 2 + BitmapBlock::NBITS as usize / 8); + test_roundtrip(entries, true, 0, 2 + BitmapBlock::NBITS as usize / 8); + } + + #[test] + fn sparse_block_ser_roundtrip() { + let entries = + thread_rng().gen_range(BitmapChunk::LEN_BITS, BitmapBlock::NBITS as usize / 16); + test_roundtrip(entries, false, 1, 4 + 2 * entries); + } + + #[test] + fn abdundant_block_ser_roundtrip() { + let entries = + thread_rng().gen_range(BitmapChunk::LEN_BITS, BitmapBlock::NBITS as usize / 16); + test_roundtrip(entries, true, 2, 4 + 2 * entries); + } +} diff --git a/chain/src/txhashset/txhashset.rs b/chain/src/txhashset/txhashset.rs index 16ce3f07eb..1c3a99a3ba 100644 --- a/chain/src/txhashset/txhashset.rs +++ b/chain/src/txhashset/txhashset.rs @@ -19,7 +19,7 @@ use crate::core::consensus::WEEK_HEIGHT; use crate::core::core::committed::Committed; use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::merkle_proof::MerkleProof; -use crate::core::core::pmmr::{self, Backend, ReadonlyPMMR, RewindablePMMR, PMMR}; +use crate::core::core::pmmr::{self, Backend, ReadablePMMR, ReadonlyPMMR, RewindablePMMR, PMMR}; use crate::core::core::{Block, BlockHeader, KernelFeatures, Output, OutputIdentifier, TxKernel}; use crate::core::global; use crate::core::ser::{PMMRable, ProtocolVersion}; @@ -51,8 +51,8 @@ const TXHASHSET_ZIP: &str = "txhashset_snapshot"; pub struct PMMRHandle { /// The backend storage for the MMR. pub backend: PMMRBackend, - /// The last position accessible via this MMR handle (backend may continue out beyond this). - pub last_pos: u64, + /// The MMR size accessible via this handle (backend may continue out beyond this). + pub size: u64, } impl PMMRHandle { @@ -66,8 +66,8 @@ impl PMMRHandle { ) -> Result, Error> { fs::create_dir_all(&path)?; let backend = PMMRBackend::new(&path, prunable, version, header)?; - let last_pos = backend.unpruned_size(); - Ok(PMMRHandle { backend, last_pos }) + let size = backend.unpruned_size(); + Ok(PMMRHandle { backend, size }) } } @@ -86,31 +86,29 @@ impl PMMRHandle { return Err(ErrorKind::Other("header PMMR inconsistent".to_string()).into()); } - // 1-indexed pos and we want to account for subsequent parent hash pos. - // so use next header pos to find our last_pos. + // use next header pos to find our size. let next_height = head.height + 1; - let next_pos = pmmr::insertion_to_pmmr_index(next_height + 1); - let pos = next_pos.saturating_sub(1); + let size = pmmr::insertion_to_pmmr_index(next_height); debug!( "init_head: header PMMR: current head {} at pos {}", - head_hash, self.last_pos + head_hash, self.size ); debug!( "init_head: header PMMR: resetting to {} at pos {} (height {})", head.hash(), - pos, + size, head.height ); - self.last_pos = pos; + self.size = size; Ok(()) } /// Get the header hash at the specified height based on the current header MMR state. pub fn get_header_hash_by_height(&self, height: u64) -> Result { - let pos = pmmr::insertion_to_pmmr_index(height + 1); - let header_pmmr = ReadonlyPMMR::at(&self.backend, self.last_pos); + let pos = pmmr::insertion_to_pmmr_index(height); + let header_pmmr = ReadonlyPMMR::at(&self.backend, self.size); if let Some(entry) = header_pmmr.get_data(pos) { Ok(entry.hash()) } else { @@ -121,11 +119,11 @@ impl PMMRHandle { /// Get the header hash for the head of the header chain based on current MMR state. /// Find the last leaf pos based on MMR size and return its header hash. pub fn head_hash(&self) -> Result { - if self.last_pos == 0 { + if self.size == 0 { return Err(ErrorKind::Other("MMR empty, no head".to_string()).into()); } - let header_pmmr = ReadonlyPMMR::at(&self.backend, self.last_pos); - let leaf_pos = pmmr::bintree_rightmost(self.last_pos); + let header_pmmr = ReadonlyPMMR::at(&self.backend, self.size); + let leaf_pos = pmmr::bintree_rightmost(self.size - 1); if let Some(entry) = header_pmmr.get_data(leaf_pos) { Ok(entry.hash()) } else { @@ -193,7 +191,7 @@ impl TxHashSet { version, None, )?; - if handle.last_pos == 0 { + if handle.size == 0 { debug!( "attempting to open (empty) kernel PMMR using {:?} - SUCCESS", version @@ -201,7 +199,7 @@ impl TxHashSet { maybe_kernel_handle = Some(handle); break; } - let kernel: Option = ReadonlyPMMR::at(&handle.backend, 1).get_data(1); + let kernel: Option = ReadonlyPMMR::at(&handle.backend, 1).get_data(0); if let Some(kernel) = kernel { if kernel.verify().is_ok() { debug!( @@ -240,10 +238,10 @@ impl TxHashSet { fn bitmap_accumulator( pmmr_h: &PMMRHandle, ) -> Result { - let pmmr = ReadonlyPMMR::at(&pmmr_h.backend, pmmr_h.last_pos); - let size = pmmr::n_leaves(pmmr_h.last_pos); + let pmmr = ReadonlyPMMR::at(&pmmr_h.backend, pmmr_h.size); + let nbits = pmmr::n_leaves(pmmr_h.size); let mut bitmap_accumulator = BitmapAccumulator::new(); - bitmap_accumulator.init(&mut pmmr.leaf_idx_iter(0), size)?; + bitmap_accumulator.init(&mut pmmr.leaf_idx_iter(0), nbits)?; Ok(bitmap_accumulator) } @@ -262,12 +260,12 @@ impl TxHashSet { commit: Commitment, ) -> Result, Error> { match self.commit_index.get_output_pos_height(&commit) { - Ok(Some(pos)) => { + Ok(Some(pos1)) => { let output_pmmr: ReadonlyPMMR<'_, OutputIdentifier, _> = - ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.last_pos); - if let Some(out) = output_pmmr.get_data(pos.pos) { + ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.size); + if let Some(out) = output_pmmr.get_data(pos1.pos - 1) { if out.commitment() == commit { - Ok(Some((out, pos))) + Ok(Some((out, pos1))) } else { Ok(None) } @@ -285,19 +283,19 @@ impl TxHashSet { /// TODO: These need to return the actual data from the flat-files instead /// of hashes now pub fn last_n_output(&self, distance: u64) -> Vec<(Hash, OutputIdentifier)> { - ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.last_pos) + ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.size) .get_last_n_insertions(distance) } /// as above, for range proofs pub fn last_n_rangeproof(&self, distance: u64) -> Vec<(Hash, RangeProof)> { - ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.last_pos) + ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.size) .get_last_n_insertions(distance) } /// as above, for kernels pub fn last_n_kernel(&self, distance: u64) -> Vec<(Hash, TxKernel)> { - ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.last_pos) + ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.size) .get_last_n_insertions(distance) } @@ -315,13 +313,13 @@ impl TxHashSet { max_count: u64, max_index: Option, ) -> (u64, Vec) { - ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.last_pos) + ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.size) .elements_from_pmmr_index(start_index, max_count, max_index) } - /// highest output insertion index available - pub fn highest_output_insertion_index(&self) -> u64 { - self.output_pmmr_h.last_pos + /// number of outputs + pub fn output_mmr_size(&self) -> u64 { + self.output_pmmr_h.size } /// As above, for rangeproofs @@ -331,11 +329,13 @@ impl TxHashSet { max_count: u64, max_index: Option, ) -> (u64, Vec) { - ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.last_pos) + ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.size) .elements_from_pmmr_index(start_index, max_count, max_index) } /// Find a kernel with a given excess. Work backwards from `max_index` to `min_index` + /// NOTE: this linear search over all kernel history can be VERY expensive + /// public API access to this method should be limited pub fn find_kernel( &self, excess: &Commitment, @@ -343,13 +343,13 @@ impl TxHashSet { max_index: Option, ) -> Option<(TxKernel, u64)> { let min_index = min_index.unwrap_or(1); - let max_index = max_index.unwrap_or(self.kernel_pmmr_h.last_pos); + let max_index = max_index.unwrap_or(self.kernel_pmmr_h.size); - let pmmr = ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.last_pos); + let pmmr = ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.size); let mut index = max_index + 1; while index > min_index { index -= 1; - if let Some(kernel) = pmmr.get_data(index) { + if let Some(kernel) = pmmr.get_data(index - 1) { if &kernel.excess == excess { return Some((kernel, index)); } @@ -360,20 +360,17 @@ impl TxHashSet { /// Get MMR roots. pub fn roots(&self) -> TxHashSetRoots { - let output_pmmr = - ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.last_pos); - let rproof_pmmr = - ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.last_pos); - let kernel_pmmr = - ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.last_pos); + let output_pmmr = ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.size); + let rproof_pmmr = ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.size); + let kernel_pmmr = ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.size); TxHashSetRoots { output_roots: OutputRoots { - pmmr_root: output_pmmr.root(), + pmmr_root: output_pmmr.root().expect("no root, invalid tree"), bitmap_root: self.bitmap_accumulator.root(), }, - rproof_root: rproof_pmmr.root(), - kernel_root: kernel_pmmr.root(), + rproof_root: rproof_pmmr.root().expect("no root, invalid tree"), + kernel_root: kernel_pmmr.root().expect("no root, invalid tree"), } } @@ -382,11 +379,11 @@ impl TxHashSet { Ok(self.commit_index.get_output_pos(&commit)?) } - /// build a new merkle proof for the given position. + /// build a new merkle proof for the given output commitment pub fn merkle_proof(&mut self, commit: Commitment) -> Result { - let pos = self.commit_index.get_output_pos(&commit)?; - PMMR::at(&mut self.output_pmmr_h.backend, self.output_pmmr_h.last_pos) - .merkle_proof(pos) + let pos0 = self.commit_index.get_output_pos(&commit)?; + PMMR::at(&mut self.output_pmmr_h.backend, self.output_pmmr_h.size) + .merkle_proof(pos0) .map_err(|e| { ErrorKind::MerkleProof(format!("Commit {:?}, pos {}, {}", commit, pos, e)).into() }) @@ -461,15 +458,14 @@ impl TxHashSet { prev_size, ); - let kernel_pmmr = - ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.last_pos); + let kernel_pmmr = ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.size); let mut current_pos = prev_size + 1; let mut current_header = from_header.clone(); let mut count = 0; - while current_pos <= self.kernel_pmmr_h.last_pos { - if pmmr::is_leaf(current_pos) { - if let Some(kernel) = kernel_pmmr.get_data(current_pos) { + while current_pos <= self.kernel_pmmr_h.size { + if pmmr::is_leaf(current_pos - 1) { + if let Some(kernel) = kernel_pmmr.get_data(current_pos - 1) { match kernel.features { KernelFeatures::NoRecentDuplicate { .. } => { while current_pos > current_header.kernel_mmr_size { @@ -509,18 +505,18 @@ impl TxHashSet { ) -> Result<(), Error> { let now = Instant::now(); - let output_pmmr = - ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.last_pos); + let output_pmmr = ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.size); // Iterate over the current output_pos index, removing any entries that // do not point to to the expected output. let mut removed_count = 0; - for (key, pos) in batch.output_pos_iter()? { - if let Some(out) = output_pmmr.get_data(pos.pos) { - if let Ok(pos_via_mmr) = batch.get_output_pos(&out.commitment()) { + for (key, pos1) in batch.output_pos_iter()? { + let pos0 = pos1.pos - 1; + if let Some(out) = output_pmmr.get_data(pos0) { + if let Ok(pos0_via_mmr) = batch.get_output_pos(&out.commitment()) { // If the pos matches and the index key matches the commitment // then keep the entry, other we want to clean it up. - if pos.pos == pos_via_mmr + if pos0 == pos0_via_mmr && batch.is_match_output_pos_key(&key, &out.commitment()) { continue; @@ -536,9 +532,9 @@ impl TxHashSet { ); let mut outputs_pos: Vec<(Commitment, u64)> = vec![]; - for pos in output_pmmr.leaf_pos_iter() { - if let Some(out) = output_pmmr.get_data(pos) { - outputs_pos.push((out.commit, pos)); + for pos0 in output_pmmr.leaf_pos_iter() { + if let Some(out) = output_pmmr.get_data(pos0) { + outputs_pos.push((out.commit, 1 + pos0)); } } @@ -568,15 +564,14 @@ impl TxHashSet { let hash = header_pmmr.get_header_hash_by_height(search_height + 1)?; let h = batch.get_block_header(&hash)?; while i < total_outputs { - let (commit, pos) = outputs_pos[i]; - if pos > h.output_mmr_size { - // Note: MMR position is 1-based and not 0-based, so here must be '>' instead of '>=' + let (commit, pos1) = outputs_pos[i]; + if pos1 > h.output_mmr_size { break; } batch.save_output_pos_height( &commit, CommitPos { - pos, + pos: pos1, height: h.height, }, )?; @@ -615,7 +610,7 @@ where let header_head = batch.header_head()?; let res = { - let header_pmmr = PMMR::at(&mut handle.backend, handle.last_pos); + let header_pmmr = PMMR::at(&mut handle.backend, handle.size); let mut header_extension = HeaderExtension::new(header_pmmr, header_head); let mut extension = Extension::new(trees, head); let mut extension_pair = ExtensionPair { @@ -650,11 +645,9 @@ where { let res: Result; { - let header_pmmr = ReadonlyPMMR::at(&handle.backend, handle.last_pos); - let output_pmmr = - ReadonlyPMMR::at(&trees.output_pmmr_h.backend, trees.output_pmmr_h.last_pos); - let rproof_pmmr = - ReadonlyPMMR::at(&trees.rproof_pmmr_h.backend, trees.rproof_pmmr_h.last_pos); + let header_pmmr = ReadonlyPMMR::at(&handle.backend, handle.size); + let output_pmmr = ReadonlyPMMR::at(&trees.output_pmmr_h.backend, trees.output_pmmr_h.size); + let rproof_pmmr = ReadonlyPMMR::at(&trees.rproof_pmmr_h.backend, trees.rproof_pmmr_h.size); // new a new batch here to pass into the utxo_view. // Discard it (rollback) after we finish with the utxo_view. @@ -667,7 +660,7 @@ where /// Rewindable (but still readonly) view on the kernel MMR. /// The underlying backend is readonly. But we permit the PMMR to be "rewound" -/// via last_pos. +/// via size. /// We new a new db batch for this view and discard it (rollback) /// when we are done with the view. pub fn rewindable_kernel_view(trees: &TxHashSet, inner: F) -> Result @@ -677,7 +670,7 @@ where let res: Result; { let kernel_pmmr = - RewindablePMMR::at(&trees.kernel_pmmr_h.backend, trees.kernel_pmmr_h.last_pos); + RewindablePMMR::at(&trees.kernel_pmmr_h.backend, trees.kernel_pmmr_h.size); // new a new batch here to pass into the kernel_view. // Discard it (rollback) after we finish with the kernel_view. @@ -719,7 +712,7 @@ where { trace!("Starting new txhashset extension."); - let header_pmmr = PMMR::at(&mut header_pmmr.backend, header_pmmr.last_pos); + let header_pmmr = PMMR::at(&mut header_pmmr.backend, header_pmmr.size); let mut header_extension = HeaderExtension::new(header_pmmr, header_head); let mut extension = Extension::new(trees, head); let mut extension_pair = ExtensionPair { @@ -757,9 +750,9 @@ where trees.output_pmmr_h.backend.sync()?; trees.rproof_pmmr_h.backend.sync()?; trees.kernel_pmmr_h.backend.sync()?; - trees.output_pmmr_h.last_pos = sizes.0; - trees.rproof_pmmr_h.last_pos = sizes.1; - trees.kernel_pmmr_h.last_pos = sizes.2; + trees.output_pmmr_h.size = sizes.0; + trees.rproof_pmmr_h.size = sizes.1; + trees.kernel_pmmr_h.size = sizes.2; // Update our bitmap_accumulator based on our extension trees.bitmap_accumulator = bitmap_accumulator; @@ -794,7 +787,7 @@ where Err(_) => Tip::default(), }; - let pmmr = PMMR::at(&mut handle.backend, handle.last_pos); + let pmmr = PMMR::at(&mut handle.backend, handle.size); let mut extension = HeaderExtension::new(pmmr, head); let res = inner(&mut extension, &batch); @@ -836,7 +829,7 @@ where }; { - let pmmr = PMMR::at(&mut handle.backend, handle.last_pos); + let pmmr = PMMR::at(&mut handle.backend, handle.size); let mut extension = HeaderExtension::new(pmmr, head); res = inner(&mut extension, &child_batch); @@ -855,7 +848,7 @@ where } else { child_batch.commit()?; handle.backend.sync()?; - handle.last_pos = size; + handle.size = size; } Ok(r) } @@ -886,8 +879,8 @@ impl<'a> HeaderExtension<'a> { } /// Get the header hash for the specified pos from the underlying MMR backend. - fn get_header_hash(&self, pos: u64) -> Option { - self.pmmr.get_data(pos).map(|x| x.hash()) + fn get_header_hash(&self, pos0: u64) -> Option { + self.pmmr.get_data(pos0).map(|x| x.hash()) } /// The head representing the furthest extent of the current extension. @@ -895,6 +888,13 @@ impl<'a> HeaderExtension<'a> { self.head.clone() } + /// Get header hash by height. + /// Based on current header MMR. + pub fn get_header_hash_by_height(&self, height: u64) -> Option { + let pos = pmmr::insertion_to_pmmr_index(height); + self.get_header_hash(pos) + } + /// Get the header at the specified height based on the current state of the header extension. /// Derives the MMR pos from the height (insertion index) and retrieves the header hash. /// Looks the header up in the db by hash. @@ -903,8 +903,7 @@ impl<'a> HeaderExtension<'a> { height: u64, batch: &Batch<'_>, ) -> Result { - let pos = pmmr::insertion_to_pmmr_index(height + 1); - if let Some(hash) = self.get_header_hash(pos) { + if let Some(hash) = self.get_header_hash_by_height(height) { Ok(batch.get_block_header(&hash)?) } else { Err(ErrorKind::Other(format!("not found header for height {}", height)).into()) @@ -913,22 +912,17 @@ impl<'a> HeaderExtension<'a> { /// Compares the provided header to the header in the header MMR at that height. /// If these match we know the header is on the current chain. - pub fn is_on_current_chain( + pub fn is_on_current_chain>( &self, - header: &BlockHeader, + t: T, batch: &Batch<'_>, - ) -> Result<(), Error> { - if header.height > self.head.height { - return Err( - ErrorKind::Other(format!("header is not on current chain, out beyond")).into(), - ); - } - let chain_header = self.get_header_by_height(header.height, batch)?; - if chain_header.hash() == header.hash() { - Ok(()) - } else { - Err(ErrorKind::Other("header is not on current chain".to_string()).into()) + ) -> Result { + let t = t.into(); + if t.height > self.head.height { + return Ok(false); } + let chain_header = self.get_header_by_height(t.height, batch)?; + Ok(chain_header.hash() == t.hash()) } /// Force the rollback of this extension, no matter the result. @@ -961,7 +955,7 @@ impl<'a> HeaderExtension<'a> { self.head.height, ); - let header_pos = pmmr::insertion_to_pmmr_index(header.height + 1); + let header_pos = 1 + pmmr::insertion_to_pmmr_index(header.height); self.pmmr.rewind(header_pos, &Bitmap::new()).map_err(|e| { ErrorKind::TxHashSetErr(format!("pmmr rewind for pos {}, {}", header_pos, e)) })?; @@ -1034,8 +1028,8 @@ impl<'a> Committed for Extension<'a> { fn outputs_committed(&self) -> Vec { let mut commitments = vec![]; - for pos in self.output_pmmr.leaf_pos_iter() { - if let Some(out) = self.output_pmmr.get_data(pos) { + for pos0 in self.output_pmmr.leaf_pos_iter() { + if let Some(out) = self.output_pmmr.get_data(pos0) { commitments.push(out.commit); } } @@ -1044,7 +1038,7 @@ impl<'a> Committed for Extension<'a> { fn kernels_committed(&self) -> Vec { let mut commitments = vec![]; - for n in 1..self.kernel_pmmr.unpruned_size() + 1 { + for n in 0..self.kernel_pmmr.unpruned_size() { if pmmr::is_leaf(n) { if let Some(kernel) = self.kernel_pmmr.get_data(n) { commitments.push(kernel.excess()); @@ -1059,18 +1053,9 @@ impl<'a> Extension<'a> { fn new(trees: &'a mut TxHashSet, head: Tip) -> Extension<'a> { Extension { head, - output_pmmr: PMMR::at( - &mut trees.output_pmmr_h.backend, - trees.output_pmmr_h.last_pos, - ), - rproof_pmmr: PMMR::at( - &mut trees.rproof_pmmr_h.backend, - trees.rproof_pmmr_h.last_pos, - ), - kernel_pmmr: PMMR::at( - &mut trees.kernel_pmmr_h.backend, - trees.kernel_pmmr_h.last_pos, - ), + output_pmmr: PMMR::at(&mut trees.output_pmmr_h.backend, trees.output_pmmr_h.size), + rproof_pmmr: PMMR::at(&mut trees.rproof_pmmr_h.backend, trees.rproof_pmmr_h.size), + kernel_pmmr: PMMR::at(&mut trees.kernel_pmmr_h.backend, trees.kernel_pmmr_h.size), bitmap_accumulator: trees.bitmap_accumulator.clone(), rollback: false, } @@ -1155,13 +1140,14 @@ impl<'a> Extension<'a> { } fn apply_to_bitmap_accumulator(&mut self, output_pos: &[u64]) -> Result<(), Error> { + // NOTE: 1-based output_pos shouldn't have 0 in it (but does) let mut output_idx: Vec<_> = output_pos .iter() .map(|x| pmmr::n_leaves(*x).saturating_sub(1)) .collect(); output_idx.sort_unstable(); let min_idx = output_idx.first().cloned().unwrap_or(0); - let size = pmmr::n_leaves(self.output_pmmr.last_pos); + let size = pmmr::n_leaves(self.output_pmmr.size); self.bitmap_accumulator.apply( output_idx, self.output_pmmr @@ -1173,10 +1159,10 @@ impl<'a> Extension<'a> { // Prune output and rangeproof PMMRs based on provided pos. // Input is not valid if we cannot prune successfully. fn apply_input(&mut self, commit: Commitment, pos: CommitPos) -> Result<(), Error> { - match self.output_pmmr.prune(pos.pos) { + match self.output_pmmr.prune(pos.pos - 1) { Ok(true) => { self.rproof_pmmr - .prune(pos.pos) + .prune(pos.pos - 1) .map_err(|e| ErrorKind::TxHashSetErr(format!("pmmr prune error, {}", e)))?; Ok(()) } @@ -1188,8 +1174,8 @@ impl<'a> Extension<'a> { fn apply_output(&mut self, out: &Output, batch: &Batch<'_>) -> Result { let commit = out.commitment(); - if let Ok(pos) = batch.get_output_pos(&commit) { - if let Some(out_mmr) = self.output_pmmr.get_data(pos) { + if let Ok(pos0) = batch.get_output_pos(&commit) { + if let Some(out_mmr) = self.output_pmmr.get_data(pos0) { if out_mmr.commitment() == commit { return Err(ErrorKind::DuplicateCommitment(commit).into()); } @@ -1222,7 +1208,7 @@ impl<'a> Extension<'a> { ); } } - Ok(output_pos) + Ok(1 + output_pos) } /// Apply kernels to the kernel MMR. @@ -1250,7 +1236,7 @@ impl<'a> Extension<'a> { .kernel_pmmr .push(kernel) .map_err(|e| ErrorKind::TxHashSetErr(format!("pmmr push kernel error, {}", e)))?; - Ok(pos) + Ok(1 + pos) } /// Build a Merkle proof for the given output and the block @@ -1266,9 +1252,9 @@ impl<'a> Extension<'a> { let out_id = out_id.as_ref(); debug!("txhashset: merkle_proof: output: {:?}", out_id.commit); // then calculate the Merkle Proof based on the known pos - let pos = batch.get_output_pos(&out_id.commit)?; - let merkle_proof = self.output_pmmr.merkle_proof(pos).map_err(|e| { - ErrorKind::TxHashSetErr(format!("pmmr get merkle proof at pos {}, {}", pos, e)) + let pos0 = batch.get_output_pos(&out_id.commit)?; + let merkle_proof = self.output_pmmr.merkle_proof(pos0).map_err(|e| { + ErrorKind::TxHashSetErr(format!("pmmr get merkle proof at pos {}, {}", pos0, e)) })?; Ok(merkle_proof) @@ -1363,9 +1349,9 @@ impl<'a> Extension<'a> { // Update our BitmapAccumulator based on affected outputs. // We want to "unspend" every rewound spent output. - // Treat last_pos as an affected output to ensure we rebuild far enough back. + // Treat size as an affected output to ensure we rebuild far enough back. let mut affected_pos = spent_pos; - affected_pos.push(self.output_pmmr.last_pos); + affected_pos.push(self.output_pmmr.size); // Remove any entries from the output_pos newd by the block being rewound. let mut missing_count = 0; @@ -1399,9 +1385,9 @@ impl<'a> Extension<'a> { // reused output commitment. For example an output at pos 1, spent, reused at pos 2. // The output_pos index should be updated to reflect the old pos 1 when unspent. if let Ok(spent) = spent { - for pos in spent { - if let Some(out) = self.output_pmmr.get_data(pos.pos) { - batch.save_output_pos_height(&out.commitment(), pos)?; + for pos1 in spent { + if let Some(out) = self.output_pmmr.get_data(pos1.pos - 1) { + batch.save_output_pos_height(&out.commitment(), pos1)?; } } } @@ -1604,7 +1590,7 @@ impl<'a> Extension<'a> { let mut kern_count = 0; let total_kernels = pmmr::n_leaves(self.kernel_pmmr.unpruned_size()); let mut tx_kernels: Vec = Vec::with_capacity(KERNEL_BATCH_SIZE); - for n in 1..self.kernel_pmmr.unpruned_size() + 1 { + for n in 0..self.kernel_pmmr.unpruned_size() { if pmmr::is_leaf(n) { let kernel = self .kernel_pmmr @@ -1613,7 +1599,7 @@ impl<'a> Extension<'a> { tx_kernels.push(kernel); } - if tx_kernels.len() >= KERNEL_BATCH_SIZE || n >= self.kernel_pmmr.unpruned_size() { + if tx_kernels.len() >= KERNEL_BATCH_SIZE || n + 1 >= self.kernel_pmmr.unpruned_size() { TxKernel::batch_sig_verify(&tx_kernels)?; kern_count += tx_kernels.len() as u64; tx_kernels.clear(); @@ -1644,9 +1630,9 @@ impl<'a> Extension<'a> { let mut proof_count = 0; let total_rproofs = self.output_pmmr.n_unpruned_leaves(); - for pos in self.output_pmmr.leaf_pos_iter() { - let output = self.output_pmmr.get_data(pos); - let proof = self.rproof_pmmr.get_data(pos); + for pos0 in self.output_pmmr.leaf_pos_iter() { + let output = self.output_pmmr.get_data(pos0); + let proof = self.rproof_pmmr.get_data(pos0); // Output and corresponding rangeproof *must* exist. // It is invalid for either to be missing and we fail immediately in this case. diff --git a/chain/src/txhashset/utxo_view.rs b/chain/src/txhashset/utxo_view.rs index 4ed2a8422a..aa3834ed63 100644 --- a/chain/src/txhashset/utxo_view.rs +++ b/chain/src/txhashset/utxo_view.rs @@ -15,7 +15,7 @@ //! Lightweight readonly view into output MMR for convenience. use crate::core::core::hash::{Hash, Hashed}; -use crate::core::core::pmmr::{self, ReadonlyPMMR}; +use crate::core::core::pmmr::{self, ReadablePMMR, ReadonlyPMMR}; use crate::core::core::{Block, BlockHeader, Inputs, Output, OutputIdentifier, Transaction}; use crate::core::global; use crate::error::{Error, ErrorKind}; @@ -123,12 +123,12 @@ impl<'a> UTXOView<'a> { batch: &Batch<'_>, ) -> Result<(OutputIdentifier, CommitPos), Error> { let pos = batch.get_output_pos_height(&input)?; - if let Some(pos) = pos { - if let Some(out) = self.output_pmmr.get_data(pos.pos) { + if let Some(pos1) = pos { + if let Some(out) = self.output_pmmr.get_data(pos1.pos - 1) { if out.commitment() == input { - return Ok((out, pos)); + return Ok((out, pos1)); } else { - error!("input mismatch: {:?}, {:?}, {:?}", out, pos, input); + error!("input mismatch: {:?}, {:?}, {:?}", out, pos1, input); return Err(ErrorKind::Other( "input mismatch (output_pos index mismatch?)".into(), ) @@ -141,8 +141,8 @@ impl<'a> UTXOView<'a> { // Output is valid if it would not result in a duplicate commitment in the output MMR. fn validate_output(&self, output: &Output, batch: &Batch<'_>) -> Result<(), Error> { - if let Ok(pos) = batch.get_output_pos(&output.commitment()) { - if let Some(out_mmr) = self.output_pmmr.get_data(pos) { + if let Ok(pos0) = batch.get_output_pos(&output.commitment()) { + if let Some(out_mmr) = self.output_pmmr.get_data(pos0) { if out_mmr.commitment() == output.commitment() { return Err(ErrorKind::DuplicateCommitment(output.commitment()).into()); } @@ -152,9 +152,9 @@ impl<'a> UTXOView<'a> { } /// Retrieves an unspent output using its PMMR position - pub fn get_unspent_output_at(&self, pos: u64) -> Result { - match self.output_pmmr.get_data(pos) { - Some(output_id) => match self.rproof_pmmr.get_data(pos) { + pub fn get_unspent_output_at(&self, pos0: u64) -> Result { + match self.output_pmmr.get_data(pos0) { + Some(output_id) => match self.rproof_pmmr.get_data(pos0) { Some(rproof) => Ok(output_id.into_output(rproof)), None => Err(ErrorKind::RangeproofNotFound(format!("at position {}", pos)).into()), }, @@ -214,8 +214,8 @@ impl<'a> UTXOView<'a> { } /// Get the header hash for the specified pos from the underlying MMR backend. - fn get_header_hash(&self, pos: u64) -> Option { - self.header_pmmr.get_data(pos).map(|x| x.hash()) + fn get_header_hash(&self, pos1: u64) -> Option { + self.header_pmmr.get_data(pos1 - 1).map(|x| x.hash()) } /// Get the header at the specified height based on the current state of the extension. @@ -226,8 +226,8 @@ impl<'a> UTXOView<'a> { height: u64, batch: &Batch<'_>, ) -> Result { - let pos = pmmr::insertion_to_pmmr_index(height + 1); - if let Some(hash) = self.get_header_hash(pos) { + let pos1 = 1 + pmmr::insertion_to_pmmr_index(height); + if let Some(hash) = self.get_header_hash(pos1) { let header = batch.get_block_header(&hash)?; Ok(header) } else { diff --git a/chain/src/types.rs b/chain/src/types.rs index b8229d9757..dc1248cb58 100644 --- a/chain/src/types.rs +++ b/chain/src/types.rs @@ -38,7 +38,7 @@ bitflags! { } /// Various status sync can be in, whether it's fast sync or archival. -#[derive(Debug, Clone, Copy, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize)] pub enum SyncStatus { /// Initial State (we do not yet know if we are/should be syncing) Initial, @@ -49,10 +49,12 @@ pub enum SyncStatus { AwaitingPeers(bool), /// Downloading block headers HeaderSync { - /// current node height - current_height: u64, + /// current sync head + sync_head: Tip, /// height of the most advanced peer highest_height: u64, + /// diff of the most advanced peer + highest_diff: Difficulty, }, /// Downloading the various txhashsets TxHashsetDownload(TxHashsetDownloadStats), @@ -176,6 +178,17 @@ impl SyncState { } } + /// Update sync_head if state is currently HeaderSync. + pub fn update_header_sync(&self, new_sync_head: Tip) { + let status: &mut SyncStatus = &mut self.current.write(); + match status { + SyncStatus::HeaderSync { sync_head, .. } => { + *sync_head = new_sync_head; + } + _ => (), + } + } + /// Update txhashset downloading progress pub fn update_txhashset_download(&self, stats: TxHashsetDownloadStats) { *self.current.write() = SyncStatus::TxHashsetDownload(stats); @@ -373,12 +386,7 @@ pub struct Tip { impl Tip { /// Creates a new tip based on provided header. pub fn from_header(header: &BlockHeader) -> Tip { - Tip { - height: header.height, - last_block_h: header.hash(), - prev_block_h: header.prev_hash, - total_difficulty: header.total_difficulty(), - } + header.into() } } @@ -399,6 +407,16 @@ impl Default for Tip { } } } +impl From<&BlockHeader> for Tip { + fn from(header: &BlockHeader) -> Tip { + Tip { + height: header.height, + last_block_h: header.hash(), + prev_block_h: header.prev_hash, + total_difficulty: header.total_difficulty(), + } + } +} /// Serialization of a tip, required to save to datastore. impl ser::Writeable for Tip { diff --git a/chain/tests/bitmap_segment.rs b/chain/tests/bitmap_segment.rs new file mode 100644 index 0000000000..f0695a0b2e --- /dev/null +++ b/chain/tests/bitmap_segment.rs @@ -0,0 +1,79 @@ +use self::chain::txhashset::{BitmapAccumulator, BitmapSegment}; +use self::core::core::pmmr::segment::{Segment, SegmentIdentifier}; +use self::core::ser::{BinReader, BinWriter, ProtocolVersion, Readable, Writeable}; +use croaring::Bitmap; +use grin_chain as chain; +use grin_core as core; +use grin_util::secp::rand::Rng; +use rand::thread_rng; +use std::io::Cursor; + +fn test_roundtrip(entries: usize) { + let mut rng = thread_rng(); + + let identifier = SegmentIdentifier { + height: 12, + idx: rng.gen_range(8, 16), + }; + let block = rng.gen_range(2, 64); + + let mut bitmap = Bitmap::create(); + let block_size = 1 << 16; + let offset = (1 << identifier.height) * 1024 * identifier.idx + block_size * block; + let mut count = 0; + while count < entries { + let idx = (offset + rng.gen_range(0, block_size)) as u32; + if !bitmap.contains(idx) { + count += 1; + bitmap.add(idx); + } + } + + // Add a bunch of segments after the one we are interested in + let size = + bitmap.maximum().unwrap() as u64 + (1 << identifier.height) * 1024 * rng.gen_range(0, 64); + + // Construct the accumulator + let mut accumulator = BitmapAccumulator::new(); + accumulator + .init(bitmap.iter().map(|v| v as u64), size) + .unwrap(); + + let mmr = accumulator.readonly_pmmr(); + let segment = Segment::from_pmmr(identifier, &mmr, false).unwrap(); + + // Convert to `BitmapSegment` + let bms = BitmapSegment::from(segment.clone()); + + // Serialize `BitmapSegment` + let mut cursor = Cursor::new(Vec::::new()); + let mut writer = BinWriter::new(&mut cursor, ProtocolVersion(1)); + Writeable::write(&bms, &mut writer).unwrap(); + + // Read `BitmapSegment` + cursor.set_position(0); + let mut reader = BinReader::new(&mut cursor, ProtocolVersion(1)); + let bms2: BitmapSegment = Readable::read(&mut reader).unwrap(); + assert_eq!(bms, bms2); + + // Convert back to `Segment` + let segment2 = Segment::from(bms2); + assert_eq!(segment, segment2); +} + +#[test] +fn segment_ser_roundtrip() { + let threshold = 4096; + test_roundtrip(thread_rng().gen_range(threshold, 4 * threshold)); +} + +#[test] +fn sparse_segment_ser_roundtrip() { + test_roundtrip(thread_rng().gen_range(1024, 4096)); +} + +#[test] +fn abundant_segment_ser_roundtrip() { + let max = 1 << 16; + test_roundtrip(thread_rng().gen_range(max - 4096, max - 1024)); +} diff --git a/chain/tests/process_block_cut_through.rs b/chain/tests/process_block_cut_through.rs index ed794f3d16..2dde2759a6 100644 --- a/chain/tests/process_block_cut_through.rs +++ b/chain/tests/process_block_cut_through.rs @@ -66,6 +66,9 @@ where chain.set_prev_root_only(&mut block.header)?; // Manually set the mmr sizes for a "valid" block (increment prev output and kernel counts). + // The 2 lines below were bogus before when using 1-based positions. + // They worked only for even output_mmr_count()s + // But it was actually correct for 0-based position! block.header.output_mmr_size = pmmr::insertion_to_pmmr_index(prev.output_mmr_count() + 1); block.header.kernel_mmr_size = pmmr::insertion_to_pmmr_index(prev.kernel_mmr_count() + 1); } else { diff --git a/config/src/comments.rs b/config/src/comments.rs index 7dce1e0be6..082756a9c0 100644 --- a/config/src/comments.rs +++ b/config/src/comments.rs @@ -317,7 +317,7 @@ fn comments() -> HashMap { ); retval.insert( - "[server.p2p_config.capabilities]".to_string(), + "[server.pool_config]".to_string(), "#If the seeding type is List, the list of peers to connect to can #be specified as follows: #seeds = [\"192.168.0.1:3414\",\"192.168.0.2:3414\"] @@ -346,19 +346,9 @@ fn comments() -> HashMap { #amount of incoming connections temporarily allowed to exceed peer_max_inbound_count #peer_listener_buffer_count = 8 -# 15 = Bit flags for FULL_NODE -#This structure needs to be changed internally, to make it more configurable - # A preferred dandelion_peer, mainly used for testing dandelion # dandelion_peer = \"10.0.0.1:13144\" -" - .to_string(), - ); - - retval.insert( - "[server.pool_config]".to_string(), - " ######################################### ### MEMPOOL CONFIGURATION ### ######################################### diff --git a/core/src/core/merkle_proof.rs b/core/src/core/merkle_proof.rs index bde5f83fdd..04e5efb928 100644 --- a/core/src/core/merkle_proof.rs +++ b/core/src/core/merkle_proof.rs @@ -114,13 +114,13 @@ impl MerkleProof { &mut self, root: Hash, element: &dyn PMMRIndexHashable, - node_pos: u64, - peaks_pos: &[u64], + node_pos0: u64, + peaks_pos0: &[u64], ) -> Result<(), MerkleProofError> { - let node_hash = if node_pos > self.mmr_size { + let node_hash = if node_pos0 >= self.mmr_size { element.hash_with_index(self.mmr_size) } else { - element.hash_with_index(node_pos - 1) + element.hash_with_index(node_pos0) }; // handle special case of only a single entry in the MMR @@ -134,25 +134,25 @@ impl MerkleProof { } let sibling = self.path.remove(0); - let (parent_pos, sibling_pos) = pmmr::family(node_pos); + let (parent_pos0, sibling_pos0) = pmmr::family(node_pos0); - if let Ok(x) = peaks_pos.binary_search(&node_pos) { - let parent = if x == peaks_pos.len() - 1 { + if let Ok(x) = peaks_pos0.binary_search(&(node_pos0)) { + let parent = if x == peaks_pos0.len() - 1 { (sibling, node_hash) } else { (node_hash, sibling) }; - self.verify(root, &parent, parent_pos) - } else if parent_pos > self.mmr_size { + self.verify(root, &parent, parent_pos0) + } else if parent_pos0 >= self.mmr_size { let parent = (sibling, node_hash); - self.verify(root, &parent, parent_pos) + self.verify(root, &parent, parent_pos0) } else { - let parent = if pmmr::is_left_sibling(sibling_pos) { + let parent = if pmmr::is_left_sibling(sibling_pos0) { (sibling, node_hash) } else { (node_hash, sibling) }; - self.verify(root, &parent, parent_pos) + self.verify(root, &parent, parent_pos0) } } } diff --git a/core/src/core/pmmr/backend.rs b/core/src/core/pmmr/backend.rs index 5159c42775..a752b6afaa 100644 --- a/core/src/core/pmmr/backend.rs +++ b/core/src/core/pmmr/backend.rs @@ -29,26 +29,35 @@ pub trait Backend { /// help the implementation. fn append(&mut self, data: &T, hashes: Vec) -> Result<(), String>; + /// Rebuilding a PMMR locally from PIBD segments requires pruned subtree support. + /// This allows us to append an existing pruned subtree directly without the underlying leaf nodes. + fn append_pruned_subtree(&mut self, hash: Hash, pos: u64) -> Result<(), String>; + /// Rewind the backend state to a previous position, as if all append /// operations after that had been canceled. Expects a position in the PMMR /// to rewind to as well as bitmaps representing the positions added and /// removed since the rewind position. These are what we will "undo" /// during the rewind. - fn rewind(&mut self, position: u64, rewind_rm_pos: &Bitmap) -> Result<(), String>; + fn rewind(&mut self, pos1: u64, rewind_rm_pos: &Bitmap) -> Result<(), String>; /// Get a Hash by insertion position. - fn get_hash(&self, position: u64) -> Option; + fn get_hash(&self, pos0: u64) -> Option; /// Get underlying data by insertion position. - fn get_data(&self, position: u64) -> Option; + fn get_data(&self, pos0: u64) -> Option; /// Get a Hash by original insertion position /// (ignoring the remove log). - fn get_from_file(&self, position: u64) -> Option; + fn get_from_file(&self, pos0: u64) -> Option; + + /// Get hash for peak pos. + /// Optimized for reading peak hashes rather than arbitrary pos hashes. + /// Peaks can be assumed to not be compacted. + fn get_peak_from_file(&self, pos0: u64) -> Option; /// Get a Data Element by original insertion position /// (ignoring the remove log). - fn get_data_from_file(&self, position: u64) -> Option; + fn get_data_from_file(&self, pos0: u64) -> Option; /// Iterator over current (unpruned, unremoved) leaf positions. fn leaf_pos_iter(&self) -> Box + '_>; diff --git a/core/src/core/pmmr/pmmr.rs b/core/src/core/pmmr/pmmr.rs index 0a91c8d68a..23ff605625 100644 --- a/core/src/core/pmmr/pmmr.rs +++ b/core/src/core/pmmr/pmmr.rs @@ -12,10 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::marker; -use std::u64; - use croaring::Bitmap; +use std::{iter, marker, ops::Range, u64}; use crate::core::hash::{Hash, ZERO_HASH}; use crate::core::merkle_proof::MerkleProof; @@ -23,149 +21,125 @@ use crate::core::pmmr::{Backend, ReadonlyPMMR}; use crate::core::BlockHeader; use crate::ser::{PMMRIndexHashable, PMMRable}; -/// 64 bits all ones: 0b11111111...1 -const ALL_ONES: u64 = u64::MAX; +/// Trait with common methods for reading from a PMMR +pub trait ReadablePMMR { + /// Leaf type + type Item; -/// Prunable Merkle Mountain Range implementation. All positions within the tree -/// start at 1 as they're postorder tree traversal positions rather than array -/// indices. -/// -/// Heavily relies on navigation operations within a binary tree. In particular, -/// all the implementation needs to keep track of the MMR structure is how far -/// we are in the sequence of nodes making up the MMR. -pub struct PMMR<'a, T, B> -where - T: PMMRable, - B: Backend, -{ - /// The last position in the PMMR - pub last_pos: u64, - backend: &'a mut B, - // only needed to parameterise Backend - _marker: marker::PhantomData, -} + /// Get the hash at provided position in the MMR. + /// NOTE all positions are 0-based, so a size n MMR has nodes in positions 0 through n-1 + /// just like a Rust Range 0..n + fn get_hash(&self, pos: u64) -> Option; -impl<'a, T, B> PMMR<'a, T, B> -where - T: PMMRable, - B: 'a + Backend, -{ - /// Build a new prunable Merkle Mountain Range using the provided backend. - pub fn new(backend: &'a mut B) -> PMMR<'_, T, B> { - PMMR { - backend, - last_pos: 0, - _marker: marker::PhantomData, - } - } + /// Get the data element at provided position in the MMR. + fn get_data(&self, pos: u64) -> Option; - /// Build a new prunable Merkle Mountain Range pre-initialized until - /// last_pos with the provided backend. - pub fn at(backend: &'a mut B, last_pos: u64) -> PMMR<'_, T, B> { - PMMR { - backend, - last_pos, - _marker: marker::PhantomData, - } - } + /// Get the hash from the underlying MMR file (ignores the remove log). + fn get_from_file(&self, pos: u64) -> Option; - /// Build a "readonly" view of this PMMR. - pub fn readonly_pmmr(&self) -> ReadonlyPMMR<'_, T, B> { - ReadonlyPMMR::at(&self.backend, self.last_pos) - } + /// Get the hash for the provided peak pos. + /// Optimized for reading peak hashes rather than arbitrary pos hashes. + /// Peaks can be assumed to not be compacted. + fn get_peak_from_file(&self, pos: u64) -> Option; - /// Iterator over current (unpruned, unremoved) leaf positions. - pub fn leaf_pos_iter(&self) -> impl Iterator + '_ { - self.backend.leaf_pos_iter() - } + /// Get the data element at provided position in the MMR (ignores the remove log). + fn get_data_from_file(&self, pos: u64) -> Option; - /// Number of leafs in the MMR - pub fn n_unpruned_leaves(&self) -> u64 { - self.backend.n_unpruned_leaves() - } + /// Total size of the tree, including intermediary nodes and ignoring any pruning. + fn unpruned_size(&self) -> u64; - /// Iterator over current (unpruned, unremoved) leaf insertion indices. - pub fn leaf_idx_iter(&self, from_idx: u64) -> impl Iterator + '_ { - self.backend.leaf_idx_iter(from_idx) - } + /// Iterator over current (unpruned, unremoved) leaf positions. + fn leaf_pos_iter(&self) -> Box + '_>; - /// Returns a vec of the peaks of this MMR. - pub fn peaks(&self) -> impl DoubleEndedIterator + '_ { - let peaks_pos = peaks(self.last_pos); - peaks_pos.into_iter().filter_map(move |pi| { - // here we want to get from underlying hash file - // as the pos *may* have been "removed" - self.backend.get_from_file(pi) - }) - } + /// Iterator over current (unpruned, unremoved) leaf insertion indices. + fn leaf_idx_iter(&self, from_idx: u64) -> Box + '_>; - fn peak_path(&self, peak_pos: u64) -> Vec { - let rhs = self.bag_the_rhs(peak_pos); - let mut res = peaks(self.last_pos) - .into_iter() - .filter(|x| *x < peak_pos) - .filter_map(|x| self.backend.get_from_file(x)) - .collect::>(); - if let Some(rhs) = rhs { - res.push(rhs); - } - res.reverse(); + /// Number of leaves in the MMR + fn n_unpruned_leaves(&self) -> u64; - res + /// Is the MMR empty? + fn is_empty(&self) -> bool { + self.unpruned_size() == 0 } /// Takes a single peak position and hashes together /// all the peaks to the right of this peak (if any). /// If this return a hash then this is our peaks sibling. /// If none then the sibling of our peak is the peak to the left. - pub fn bag_the_rhs(&self, peak_pos: u64) -> Option { - let rhs = peaks(self.last_pos) + fn bag_the_rhs(&self, peak_pos0: u64) -> Option { + let size = self.unpruned_size(); + let rhs = peaks(size) .into_iter() - .filter(|x| *x > peak_pos) - .filter_map(|x| self.backend.get_from_file(x)); + .filter(|&x| x > peak_pos0) + .filter_map(|x| self.get_from_file(x)); let mut res = None; for peak in rhs.rev() { res = match res { None => Some(peak), - Some(rhash) => Some((peak, rhash).hash_with_index(self.unpruned_size())), + Some(rhash) => Some((peak, rhash).hash_with_index(size)), } } res } + /// Returns a vec of the peaks of this MMR. + fn peaks(&self) -> Vec { + peaks(self.unpruned_size()) + .into_iter() + .filter_map(move |pi0| self.get_peak_from_file(pi0)) + .collect() + } + + /// Hashes of the peaks excluding `peak_pos`, where the rhs is bagged together + fn peak_path(&self, peak_pos0: u64) -> Vec { + let rhs = self.bag_the_rhs(peak_pos0); + let mut res = peaks(self.unpruned_size()) + .into_iter() + .filter(|&x| x < peak_pos0) + .filter_map(|x| self.get_peak_from_file(x)) + .collect::>(); + if let Some(rhs) = rhs { + res.push(rhs); + } + res.reverse(); + + res + } + /// Computes the root of the MMR. Find all the peaks in the current /// tree and "bags" them to get a single peak. - pub fn root(&self) -> Result { + fn root(&self) -> Result { if self.is_empty() { return Ok(ZERO_HASH); } let mut res = None; - for peak in self.peaks().rev() { + let peaks = self.peaks(); + let mmr_size = self.unpruned_size(); + for peak in peaks.into_iter().rev() { res = match res { None => Some(peak), - Some(rhash) => Some((peak, rhash).hash_with_index(self.unpruned_size())), + Some(rhash) => Some((peak, rhash).hash_with_index(mmr_size)), } } res.ok_or_else(|| "no root, invalid tree".to_owned()) } /// Build a Merkle proof for the element at the given position. - pub fn merkle_proof(&self, pos: u64) -> Result { - debug!("merkle_proof {}, last_pos {}", pos, self.last_pos); + fn merkle_proof(&self, pos0: u64) -> Result { + let size = self.unpruned_size(); + debug!("merkle_proof {}, size {}", pos0, size); // check this pos is actually a leaf in the MMR - if !is_leaf(pos) { - return Err(format!("not a mmr leaf at pos {}", pos)); + if !is_leaf(pos0) { + return Err(format!("not a mmr leaf at pos {}", pos0)); } // check we actually have a hash in the MMR at this pos - self.get_hash(pos) - .ok_or_else(|| format!("no element at pos {}", pos))?; - - let mmr_size = self.unpruned_size(); + self.get_hash(pos0) + .ok_or_else(|| format!("no element at pos {}", pos0))?; - let family_branch = family_branch(pos, self.last_pos); + let family_branch = family_branch(pos0, size); let mut path = family_branch .iter() @@ -174,26 +148,77 @@ where let peak_pos = match family_branch.last() { Some(&(x, _)) => x, - None => pos, + None => pos0, }; path.append(&mut self.peak_path(peak_pos)); - Ok(MerkleProof { mmr_size, path }) + Ok(MerkleProof { + mmr_size: size, + path, + }) + } +} + +/// Prunable Merkle Mountain Range implementation. All positions within the tree +/// start at 0 just like array indices. +/// +/// Heavily relies on navigation operations within a binary tree. In particular, +/// all the implementation needs to keep track of the MMR structure is how far +/// we are in the sequence of nodes making up the MMR. +pub struct PMMR<'a, T, B> +where + T: PMMRable, + B: Backend, +{ + /// Number of nodes in the PMMR + pub size: u64, + backend: &'a mut B, + // only needed to parameterise Backend + _marker: marker::PhantomData, +} + +impl<'a, T, B> PMMR<'a, T, B> +where + T: PMMRable, + B: 'a + Backend, +{ + /// Build a new prunable Merkle Mountain Range using the provided backend. + pub fn new(backend: &'a mut B) -> PMMR<'_, T, B> { + PMMR { + backend, + size: 0, + _marker: marker::PhantomData, + } + } + + /// Build a new prunable Merkle Mountain Range pre-initialized until + /// size with the provided backend. + pub fn at(backend: &'a mut B, size: u64) -> PMMR<'_, T, B> { + PMMR { + backend, + size, + _marker: marker::PhantomData, + } + } + + /// Build a "readonly" view of this PMMR. + pub fn readonly_pmmr(&self) -> ReadonlyPMMR<'_, T, B> { + ReadonlyPMMR::at(&self.backend, self.size) } /// Push a new element into the MMR. Computes new related peaks at /// the same time if applicable. - pub fn push(&mut self, elmt: &T) -> Result { - let elmt_pos = self.last_pos + 1; - let mut current_hash = elmt.hash_with_index(elmt_pos - 1); + pub fn push(&mut self, leaf: &T) -> Result { + let leaf_pos = self.size; + let mut current_hash = leaf.hash_with_index(leaf_pos); let mut hashes = vec![current_hash]; - let mut pos = elmt_pos; + let mut pos = leaf_pos; - let (peak_map, height) = peak_map_height(pos - 1); + let (peak_map, height) = peak_map_height(pos); if height != 0 { - return Err(format!("bad mmr size {}", pos - 1)); + return Err(format!("bad mmr size {}", pos)); } // hash with all immediately preceding peaks, as indicated by peak map let mut peak = 1; @@ -201,18 +226,18 @@ where let left_sibling = pos + 1 - 2 * peak; let left_hash = self .backend - .get_from_file(left_sibling) + .get_peak_from_file(left_sibling) .ok_or("missing left sibling in tree, should not have been pruned")?; peak *= 2; pos += 1; - current_hash = (left_hash, current_hash).hash_with_index(pos - 1); + current_hash = (left_hash, current_hash).hash_with_index(pos); hashes.push(current_hash); } // append all the new nodes and update the MMR index - self.backend.append(elmt, hashes)?; - self.last_pos = pos; - Ok(elmt_pos) + self.backend.append(leaf, &hashes)?; + self.size = pos + 1; + Ok(leaf_pos) } /// Saves a snapshot of the MMR tagged with the block hash. @@ -231,13 +256,9 @@ where // Identify which actual position we should rewind to as the provided // position is a leaf. We traverse the MMR to include any parent(s) that // need to be included for the MMR to be valid. - let mut pos = position; - while bintree_postorder_height(pos + 1) > 0 { - pos += 1; - } - - self.backend.rewind(pos, rewind_rm_pos)?; - self.last_pos = pos; + let leaf_pos = round_up_to_leaf_pos(position); + self.backend.rewind(leaf_pos, rewind_rm_pos)?; + self.size = leaf_pos; Ok(()) } @@ -245,63 +266,23 @@ where /// Returns an error if prune is called on a non-leaf position. /// Returns false if the leaf node has already been pruned. /// Returns true if pruning is successful. - pub fn prune(&mut self, position: u64) -> Result { - if !is_leaf(position) { - return Err(format!( - "pmmr node at {} is not a leaf, can't prune.", - position - )); + pub fn prune(&mut self, pos0: u64) -> Result { + if !is_leaf(pos0) { + return Err(format!("Node at {} is not a leaf, can't prune.", pos0)); } - if self.backend.get_hash(position).is_none() { + if self.backend.get_hash(pos0).is_none() { return Ok(false); } - self.backend.remove(position)?; + self.backend.remove(pos0)?; Ok(true) } - /// Get the hash at provided position in the MMR. - pub fn get_hash(&self, pos: u64) -> Option { - if pos > self.last_pos { - None - } else if is_leaf(pos) { - // If we are a leaf then get hash from the backend. - self.backend.get_hash(pos) - } else { - // If we are not a leaf get hash ignoring the remove log. - self.backend.get_from_file(pos) - } - } - - /// Get the data element at provided position in the MMR. - pub fn get_data(&self, pos: u64) -> Option { - if pos > self.last_pos { - // If we are beyond the rhs of the MMR return None. - None - } else if is_leaf(pos) { - // If we are a leaf then get data from the backend. - self.backend.get_data(pos) - } else { - // If we are not a leaf then return None as only leaves have data. - None - } - } - - /// Get the hash from the underlying MMR file - /// (ignores the remove log). - fn get_from_file(&self, pos: u64) -> Option { - if pos > self.last_pos { - None - } else { - self.backend.get_from_file(pos) - } - } - /// Walks all unpruned nodes in the MMR and revalidate all parent hashes pub fn validate(&self) -> Result<(), String> { // iterate on all parent nodes - for n in 1..(self.last_pos + 1) { + for n in 0..self.size { let height = bintree_postorder_height(n); if height > 0 { if let Some(hash) = self.get_hash(n) { @@ -311,11 +292,11 @@ where if let Some(left_child_hs) = self.get_from_file(left_pos) { if let Some(right_child_hs) = self.get_from_file(right_pos) { // hash the two child nodes together with parent_pos and compare - if (left_child_hs, right_child_hs).hash_with_index(n - 1) != hash { + if (left_child_hs, right_child_hs).hash_with_index(n) != hash { return Err(format!( "Invalid MMR, hash of parent at {} does \ not match children.", - n + n + 1 )); } } @@ -326,17 +307,6 @@ where Ok(()) } - /// Is the MMR empty? - pub fn is_empty(&self) -> bool { - self.last_pos == 0 - } - - /// Total size of the tree, including intermediary nodes and ignoring any - /// pruning. - pub fn unpruned_size(&self) -> u64 { - self.last_pos - } - /// Debugging utility to print information about the MMRs. Short version /// only prints the last 8 nodes. pub fn dump(&self, short: bool) { @@ -344,7 +314,7 @@ where if sz > 2000 && !short { return; } - let start = if short && sz > 7 { sz / 8 - 1 } else { 0 }; + let start = if short { sz / 8 } else { 0 }; for n in start..(sz / 8 + 1) { let mut idx = "".to_owned(); let mut hashes = "".to_owned(); @@ -353,7 +323,7 @@ where break; } idx.push_str(&format!("{:>8} ", m + 1)); - let ohs = self.get_hash(m + 1); + let ohs = self.get_hash(m); match ohs { Some(hs) => hashes.push_str(&format!("{} ", hs)), None => hashes.push_str(&format!("{:>8} ", "??")), @@ -378,7 +348,7 @@ where if sz > 2000 && !short { return; } - let start = if short && sz > 7 { sz / 8 - 1 } else { 0 }; + let start = if short { sz / 8 } else { 0 }; for n in start..(sz / 8 + 1) { let mut idx = "".to_owned(); let mut hashes = "".to_owned(); @@ -387,7 +357,7 @@ where break; } idx.push_str(&format!("{:>8} ", m + 1)); - let ohs = self.get_from_file(m + 1); + let ohs = self.get_from_file(m); match ohs { Some(hs) => hashes.push_str(&format!("{} ", hs)), None => hashes.push_str(&format!("{:>8} ", " .")), @@ -399,198 +369,235 @@ where } } -/// Gets the postorder traversal index of all peaks in a MMR given its size. -/// Starts with the top peak, which is always on the left -/// side of the range, and navigates toward lower siblings toward the right -/// of the range. -pub fn peaks(num: u64) -> Vec { - if num == 0 { - return vec![]; - } - let mut peak_size = ALL_ONES >> num.leading_zeros(); - let mut num_left = num; - let mut sum_prev_peaks = 0; - let mut peaks = vec![]; - while peak_size != 0 { - if num_left >= peak_size { - peaks.push(sum_prev_peaks + peak_size); - sum_prev_peaks += peak_size; - num_left -= peak_size; +impl<'a, T, B> ReadablePMMR for PMMR<'a, T, B> +where + T: PMMRable, + B: 'a + Backend, +{ + type Item = T::E; + + fn get_hash(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else if is_leaf(pos0) { + // If we are a leaf then get hash from the backend. + self.backend.get_hash(pos0) + } else { + // If we are not a leaf get hash ignoring the remove log. + self.backend.get_from_file(pos0) } - peak_size >>= 1; } - if num_left > 0 { - return vec![]; + + fn get_data(&self, pos0: u64) -> Option { + if pos0 >= self.size { + // If we are beyond the rhs of the MMR return None. + None + } else if is_leaf(pos0) { + // If we are a leaf then get data from the backend. + self.backend.get_data(pos0) + } else { + // If we are not a leaf then return None as only leaves have data. + None + } } - peaks -} -/// The number of leaves in a MMR of the provided size. -pub fn n_leaves(size: u64) -> u64 { - let (sizes, height) = peak_sizes_height(size); - let nleaves = sizes.into_iter().map(|n| (n + 1) / 2 as u64).sum(); - if height == 0 { - nleaves - } else { - nleaves + 1 + fn get_from_file(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else { + self.backend.get_from_file(pos0) + } + } + + fn get_peak_from_file(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else { + self.backend.get_peak_from_file(pos0) + } + } + + fn get_data_from_file(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else { + self.backend.get_data_from_file(pos0) + } } -} -/// Returns the pmmr index of the nth inserted element -pub fn insertion_to_pmmr_index(mut sz: u64) -> u64 { - if sz == 0 { - return 0; + fn unpruned_size(&self) -> u64 { + self.size + } + + fn leaf_pos_iter(&self) -> Box + '_> { + self.backend.leaf_pos_iter() + } + + fn leaf_idx_iter(&self, from_idx: u64) -> Box + '_> { + self.backend.leaf_idx_iter(from_idx) + } + + fn n_unpruned_leaves(&self) -> u64 { + self.backend.n_unpruned_leaves() } - // 1 based pmmrs - sz -= 1; - 2 * sz - sz.count_ones() as u64 + 1 } -/// sizes of peaks and height of next node in mmr of given size -/// Example: on input 5 returns ([3,1], 1) as mmr state before adding 5 was +/// 64 bits all ones: 0b11111111...1 +const ALL_ONES: u64 = u64::MAX; + +/// peak bitmap and height of next node in mmr of given size +/// Example: on size 4 returns (0b11, 0) as mmr tree of size 4 is /// 2 /// / \ -/// 0 1 3 4 -pub fn peak_sizes_height(size: u64) -> (Vec, u64) { +/// 0 1 3 +/// with 0b11 indicating the presence of peaks of height 0 and 1, +/// and 0 the height of the next node 4, which is a leaf +/// NOTE: +/// the peak map also encodes the path taken from the root to the added node +/// since the path turns left (resp. right) if-and-only-if +/// a peak at that height is absent (resp. present) +pub fn peak_map_height(mut size: u64) -> (u64, u64) { if size == 0 { - return (vec![], 0); + // rust can't shift right by 64 + return (0, 0); } let mut peak_size = ALL_ONES >> size.leading_zeros(); - let mut sizes = vec![]; - let mut size_left = size; + let mut peak_map = 0; while peak_size != 0 { - if size_left >= peak_size { - sizes.push(peak_size); - size_left -= peak_size; + peak_map <<= 1; + if size >= peak_size { + size -= peak_size; + peak_map |= 1; } peak_size >>= 1; } - (sizes, size_left) + (peak_map, size) } -/// return (peak_map, pos_height) of given 0-based node pos prior to its -/// addition -/// Example: on input 4 returns (0b11, 0) as mmr state before adding 4 was +/// sizes of peaks and height of next node in mmr of given size +/// similar to peak_map_height but replacing bitmap by vector of sizes +/// Example: on input 5 returns ([3,1], 1) as mmr state before adding 5 was /// 2 /// / \ -/// 0 1 3 -/// with 0b11 indicating presence of peaks of height 0 and 1. -/// NOTE: -/// the peak map also encodes the path taken from the root to the added node -/// since the path turns left (resp. right) if-and-only-if -/// a peak at that height is absent (resp. present) -pub fn peak_map_height(mut pos: u64) -> (u64, u64) { - if pos == 0 { - return (0, 0); +/// 0 1 3 4 +pub fn peak_sizes_height(mut size: u64) -> (Vec, u64) { + if size == 0 { + // rust can't shift right by 64 + return (vec![], 0); } - let mut peak_size = ALL_ONES >> pos.leading_zeros(); - let mut bitmap = 0; + let mut peak_size = ALL_ONES >> size.leading_zeros(); + let mut peak_sizes = vec![]; while peak_size != 0 { - bitmap <<= 1; - if pos >= peak_size { - pos -= peak_size; - bitmap |= 1; + if size >= peak_size { + peak_sizes.push(peak_size); + size -= peak_size; } peak_size >>= 1; } - (bitmap, pos) + (peak_sizes, size) } -/// The height of a node in a full binary tree from its postorder traversal -/// index. This function is the base on which all others, as well as the MMR, -/// are built. -pub fn bintree_postorder_height(num: u64) -> u64 { - if num == 0 { - return 0; +/// Gets the postorder traversal 0-based index of all peaks in a MMR given its size. +/// Starts with the top peak, which is always on the left +/// side of the range, and navigates toward lower siblings toward the right +/// of the range. +/// For some odd reason, return empty when next node is not a leaf +pub fn peaks(size: u64) -> Vec { + let (peak_sizes, height) = peak_sizes_height(size); + if height == 0 { + peak_sizes + .iter() + .scan(0, |acc, &x| { + *acc += &x; + Some(*acc) + }) + .map(|x| x - 1) // rust doesn't allow starting scan with -1 as u64 + .collect() + } else { + vec![] + } +} +/// The number of leaves in a MMR of the provided size. +pub fn n_leaves(size: u64) -> u64 { + let (peak_map, height) = peak_map_height(size); + if height == 0 { + peak_map + } else { + peak_map + 1 + } +} + +/// returns least position >= pos0 with height 0 +pub fn round_up_to_leaf_pos(pos0: u64) -> u64 { + let (insert_idx, height) = peak_map_height(pos0); + let leaf_idx = if height == 0 { + insert_idx + } else { + insert_idx + 1 + }; + return insertion_to_pmmr_index(leaf_idx); +} + +/// Returns the 0-based pmmr index of 0-based leaf index n +pub fn insertion_to_pmmr_index(nleaf0: u64) -> u64 { + 2 * nleaf0 - nleaf0.count_ones() as u64 +} + +/// Returns the insertion index of the given leaf index +pub fn pmmr_leaf_to_insertion_index(pos0: u64) -> Option { + let (insert_idx, height) = peak_map_height(pos0); + if height == 0 { + Some(insert_idx) + } else { + None } - peak_map_height(num - 1).1 +} + +/// The height of a node in a full binary tree from its postorder traversal +/// index. +pub fn bintree_postorder_height(pos0: u64) -> u64 { + peak_map_height(pos0).1 } /// Is this position a leaf in the MMR? /// We know the positions of all leaves based on the postorder height of an MMR /// of any size (somewhat unintuitively but this is how the PMMR is "append /// only"). -pub fn is_leaf(pos: u64) -> bool { - bintree_postorder_height(pos) == 0 +pub fn is_leaf(pos0: u64) -> bool { + bintree_postorder_height(pos0) == 0 } /// Calculates the positions of the parent and sibling of the node at the /// provided position. -pub fn family(pos: u64) -> (u64, u64) { - let (peak_map, height) = peak_map_height(pos - 1); +pub fn family(pos0: u64) -> (u64, u64) { + let (peak_map, height) = peak_map_height(pos0); let peak = 1 << height; if (peak_map & peak) != 0 { - (pos + 1, pos + 1 - 2 * peak) + (pos0 + 1, pos0 + 1 - 2 * peak) } else { - (pos + 2 * peak, pos + 2 * peak - 1) + (pos0 + 2 * peak, pos0 + 2 * peak - 1) } } /// Is the node at this pos the "left" sibling of its parent? -pub fn is_left_sibling(pos: u64) -> bool { - let (peak_map, height) = peak_map_height(pos - 1); +pub fn is_left_sibling(pos0: u64) -> bool { + let (peak_map, height) = peak_map_height(pos0); let peak = 1 << height; (peak_map & peak) == 0 } -/// Returns the path from the specified position up to its -/// corresponding peak in the MMR. -/// The size (and therefore the set of peaks) of the MMR -/// is defined by last_pos. -pub fn path(pos: u64, last_pos: u64) -> impl Iterator { - Path::new(pos, last_pos) -} - -struct Path { - current: u64, - last_pos: u64, - peak: u64, - peak_map: u64, -} - -impl Path { - fn new(pos: u64, last_pos: u64) -> Self { - let (peak_map, height) = peak_map_height(pos - 1); - Path { - current: pos, - peak: 1 << height, - peak_map, - last_pos, - } - } -} - -impl Iterator for Path { - type Item = u64; - - fn next(&mut self) -> Option { - if self.current > self.last_pos { - return None; - } - - let next = Some(self.current); - self.current += if (self.peak_map & self.peak) != 0 { - 1 - } else { - 2 * self.peak - }; - self.peak <<= 1; - next - } -} - /// For a given starting position calculate the parent and sibling positions /// for the branch/path from that position to the peak of the tree. /// We will use the sibling positions to generate the "path" of a Merkle proof. -pub fn family_branch(pos: u64, last_pos: u64) -> Vec<(u64, u64)> { +pub fn family_branch(pos0: u64, size: u64) -> Vec<(u64, u64)> { // loop going up the tree, from node to parent, as long as we stay inside - // the tree (as defined by last_pos). - let (peak_map, height) = peak_map_height(pos - 1); + // the tree (as defined by size). + let (peak_map, height) = peak_map_height(pos0); let mut peak = 1 << height; let mut branch = vec![]; - let mut current = pos; + let mut current = pos0; let mut sibling; - while current < last_pos { + while current + 1 < size { if (peak_map & peak) != 0 { current += 1; sibling = current - 2 * peak; @@ -598,7 +605,7 @@ pub fn family_branch(pos: u64, last_pos: u64) -> Vec<(u64, u64)> { current += 2 * peak; sibling = current - 1; }; - if current > last_pos { + if current >= size { break; } branch.push((current, sibling)); @@ -608,12 +615,40 @@ pub fn family_branch(pos: u64, last_pos: u64) -> Vec<(u64, u64)> { } /// Gets the position of the rightmost node (i.e. leaf) beneath the provided subtree root. -pub fn bintree_rightmost(num: u64) -> u64 { - num - bintree_postorder_height(num) +pub fn bintree_rightmost(pos0: u64) -> u64 { + pos0 - bintree_postorder_height(pos0) } -/// Gets the position of the rightmost node (i.e. leaf) beneath the provided subtree root. -pub fn bintree_leftmost(num: u64) -> u64 { - let height = bintree_postorder_height(num); - num + 2 - (2 << height) +/// Gets the position of the leftmost node (i.e. leaf) beneath the provided subtree root. +pub fn bintree_leftmost(pos0: u64) -> u64 { + let height = bintree_postorder_height(pos0); + pos0 + 2 - (2 << height) +} + +/// Iterator over all leaf pos beneath the provided subtree root (including the root itself). +pub fn bintree_leaf_pos_iter(pos0: u64) -> Box> { + let leaf_start = pmmr_leaf_to_insertion_index(bintree_leftmost(pos0)); + let leaf_end = pmmr_leaf_to_insertion_index(bintree_rightmost(pos0)); + let leaf_start = match leaf_start { + Some(l) => l, + None => return Box::new(iter::empty::()), + }; + let leaf_end = match leaf_end { + Some(l) => l, + None => return Box::new(iter::empty::()), + }; + Box::new((leaf_start..=leaf_end).map(|n| insertion_to_pmmr_index(n))) +} + +/// Iterator over all pos beneath the provided subtree root (including the root itself). +pub fn bintree_pos_iter(pos0: u64) -> impl Iterator { + let leaf_start = bintree_leftmost(pos0); + (leaf_start..=pos0).into_iter() +} + +/// All pos in the subtree beneath the provided root, including root itself. +pub fn bintree_range(pos0: u64) -> Range { + let height = bintree_postorder_height(pos0); + let leftmost = pos0 + 2 - (2 << height); + leftmost..(pos0 + 1) } diff --git a/core/src/core/pmmr/readonly_pmmr.rs b/core/src/core/pmmr/readonly_pmmr.rs index de2f24495f..baafe1baca 100644 --- a/core/src/core/pmmr/readonly_pmmr.rs +++ b/core/src/core/pmmr/readonly_pmmr.rs @@ -16,10 +16,10 @@ use std::marker; -use crate::core::hash::{Hash, ZERO_HASH}; -use crate::core::pmmr::pmmr::{bintree_rightmost, peaks}; +use crate::core::hash::Hash; +use crate::core::pmmr::pmmr::{bintree_rightmost, ReadablePMMR}; use crate::core::pmmr::{is_leaf, Backend}; -use crate::ser::{PMMRIndexHashable, PMMRable}; +use crate::ser::PMMRable; /// Readonly view of a PMMR. pub struct ReadonlyPMMR<'a, T, B> @@ -28,7 +28,7 @@ where B: Backend, { /// The last position in the PMMR - last_pos: u64, + size: u64, /// The backend for this readonly PMMR backend: &'a B, // only needed to parameterise Backend @@ -44,153 +44,135 @@ where pub fn new(backend: &'a B) -> ReadonlyPMMR<'_, T, B> { ReadonlyPMMR { backend, - last_pos: 0, + size: 0, _marker: marker::PhantomData, } } /// Build a new readonly PMMR pre-initialized to - /// last_pos with the provided backend. - pub fn at(backend: &'a B, last_pos: u64) -> ReadonlyPMMR<'_, T, B> { + /// size with the provided backend. + pub fn at(backend: &'a B, size: u64) -> ReadonlyPMMR<'_, T, B> { ReadonlyPMMR { backend, - last_pos, + size, _marker: marker::PhantomData, } } - /// Get the data element at provided position in the MMR. - pub fn get_data(&self, pos: u64) -> Option { - if pos > self.last_pos { - // If we are beyond the rhs of the MMR return None. - None - } else if is_leaf(pos) { - // If we are a leaf then get data from the backend. - self.backend.get_data(pos) - } else { - // If we are not a leaf then return None as only leaves have data. - None - } - } - - /// Get the hash at provided position in the MMR. - pub fn get_hash(&self, pos: u64) -> Option { - if pos > self.last_pos { - None - } else if is_leaf(pos) { - // If we are a leaf then get hash from the backend. - self.backend.get_hash(pos) - } else { - // If we are not a leaf get hash ignoring the remove log. - self.backend.get_from_file(pos) - } - } - - /// Get the hash from the underlying MMR file, ignoring the leafset. - /// Some entries may have been removed from the leafset but not yet pruned from the file. - pub fn get_from_file(&self, pos: u64) -> Option { - if pos > self.last_pos { - None - } else { - self.backend.get_from_file(pos) - } - } - - /// Iterator over current (unpruned, unremoved) leaf positions. - pub fn leaf_pos_iter(&self) -> impl Iterator + '_ { - self.backend.leaf_pos_iter() - } - - /// Iterator over current (unpruned, unremoved) leaf insertion indices. - pub fn leaf_idx_iter(&self, from_idx: u64) -> impl Iterator + '_ { - self.backend.leaf_idx_iter(from_idx) - } - - /// Is the MMR empty? - pub fn is_empty(&self) -> bool { - self.last_pos == 0 - } - - /// Computes the root of the MMR. Find all the peaks in the current - /// tree and "bags" them to get a single peak. - pub fn root(&self) -> Hash { - if self.is_empty() { - return ZERO_HASH; - } - let mut res = None; - for peak in self.peaks().iter().rev() { - res = match res { - None => Some(*peak), - Some(rhash) => Some((*peak, rhash).hash_with_index(self.unpruned_size())), - } - } - res.expect("no root, invalid tree") - } - - /// Returns a vec of the peaks of this MMR. - pub fn peaks(&self) -> Vec { - let peaks_pos = peaks(self.last_pos); - peaks_pos - .into_iter() - .filter_map(|pi| { - // here we want to get from underlying hash file - // as the pos *may* have been "removed" - self.backend.get_from_file(pi) - }) - .collect() - } - - /// Total size of the tree, including intermediary nodes and ignoring any - /// pruning. - pub fn unpruned_size(&self) -> u64 { - self.last_pos - } - /// Helper function which returns un-pruned nodes from the insertion index /// forward /// returns last pmmr index returned along with data pub fn elements_from_pmmr_index( &self, - mut pmmr_index: u64, + pmmr_index1: u64, max_count: u64, - max_pmmr_pos: Option, + max_pmmr_pos1: Option, ) -> (u64, Vec) { let mut return_vec = vec![]; - let last_pos = match max_pmmr_pos { + let size = match max_pmmr_pos1 { Some(p) => p, - None => self.last_pos, + None => self.size, }; - if pmmr_index == 0 { - pmmr_index = 1; - } - while return_vec.len() < max_count as usize && pmmr_index <= last_pos { + let mut pmmr_index = pmmr_index1 - 1; + while return_vec.len() < max_count as usize && pmmr_index < size { if let Some(t) = self.get_data(pmmr_index) { return_vec.push(t); } pmmr_index += 1; } - (pmmr_index.saturating_sub(1), return_vec) + (pmmr_index, return_vec) } /// Helper function to get the last N nodes inserted, i.e. the last /// n nodes along the bottom of the tree. /// May return less than n items if the MMR has been pruned/compacted. + /// NOTE This should just iterate over insertion indices + /// to avoid the repeated calls to bintree_rightmost! pub fn get_last_n_insertions(&self, n: u64) -> Vec<(Hash, T::E)> { let mut return_vec = vec![]; - let mut last_leaf = self.last_pos; - for _ in 0..n as u64 { - if last_leaf == 0 { - break; - } - last_leaf = bintree_rightmost(last_leaf); + let mut last_leaf = self.size; + while return_vec.len() < n as usize && last_leaf > 0 { + last_leaf = bintree_rightmost(last_leaf - 1); if let Some(hash) = self.backend.get_hash(last_leaf) { if let Some(data) = self.backend.get_data(last_leaf) { return_vec.push((hash, data)); } } - last_leaf -= 1; } return_vec } } + +impl<'a, T, B> ReadablePMMR for ReadonlyPMMR<'a, T, B> +where + T: PMMRable, + B: 'a + Backend, +{ + type Item = T::E; + + fn get_hash(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else if is_leaf(pos0) { + // If we are a leaf then get hash from the backend. + self.backend.get_hash(pos0) + } else { + // If we are not a leaf get hash ignoring the remove log. + self.backend.get_from_file(pos0) + } + } + + fn get_data(&self, pos0: u64) -> Option { + if pos0 >= self.size { + // If we are beyond the rhs of the MMR return None. + None + } else if is_leaf(pos0) { + // If we are a leaf then get data from the backend. + self.backend.get_data(pos0) + } else { + // If we are not a leaf then return None as only leaves have data. + None + } + } + + fn get_from_file(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else { + self.backend.get_from_file(pos0) + } + } + + fn get_peak_from_file(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else { + self.backend.get_peak_from_file(pos0) + } + } + + fn get_data_from_file(&self, pos0: u64) -> Option { + if pos0 >= self.size { + None + } else { + self.backend.get_data_from_file(pos0) + } + } + + fn unpruned_size(&self) -> u64 { + self.size + } + + fn leaf_pos_iter(&self) -> Box + '_> { + self.backend.leaf_pos_iter() + } + + fn leaf_idx_iter(&self, from_idx: u64) -> Box + '_> { + self.backend.leaf_idx_iter(from_idx) + } + + fn n_unpruned_leaves(&self) -> u64 { + self.backend.n_unpruned_leaves() + } +} diff --git a/core/src/core/pmmr/rewindable_pmmr.rs b/core/src/core/pmmr/rewindable_pmmr.rs index 1e33c6fa35..2985be7252 100644 --- a/core/src/core/pmmr/rewindable_pmmr.rs +++ b/core/src/core/pmmr/rewindable_pmmr.rs @@ -18,7 +18,7 @@ use std::marker; use crate::core::hash::{Hash, ZERO_HASH}; -use crate::core::pmmr::{bintree_postorder_height, is_leaf, peaks, Backend}; +use crate::core::pmmr::{is_leaf, peaks, round_up_to_leaf_pos, Backend}; use crate::ser::{PMMRIndexHashable, PMMRable}; /// Rewindable (but still readonly) view of a PMMR. @@ -70,12 +70,7 @@ where // Identify which actual position we should rewind to as the provided // position is a leaf. We traverse the MMR to include any parent(s) that // need to be included for the MMR to be valid. - let mut pos = position; - while bintree_postorder_height(pos + 1) > 0 { - pos += 1; - } - - self.last_pos = pos; + self.last_pos = round_up_to_leaf_pos(position); Ok(()) } diff --git a/core/src/core/pmmr/segment.rs b/core/src/core/pmmr/segment.rs index 551254c8bf..33bda343c1 100644 --- a/core/src/core/pmmr/segment.rs +++ b/core/src/core/pmmr/segment.rs @@ -112,33 +112,90 @@ impl Segment { ) } - /// Whether the segment is full (size == capacity) + /// Whether the segment is full (segment size == capacity) fn full_segment(&self, last_pos: u64) -> bool { self.segment_unpruned_size(last_pos) == self.segment_capacity() } /// Inclusive range of MMR positions for this segment - pub fn segment_pos_range(&self, last_pos: u64) -> (u64, u64) { - let segment_size = self.segment_unpruned_size(last_pos); + pub fn segment_pos_range(&self, mmr_size: u64) -> (u64, u64) { + let segment_size = self.segment_unpruned_size(mmr_size); let leaf_offset = self.leaf_offset(); - let first = pmmr::insertion_to_pmmr_index(leaf_offset + 1); - let last = if self.full_segment(last_pos) { - pmmr::insertion_to_pmmr_index(leaf_offset + segment_size) + let first = pmmr::insertion_to_pmmr_index(leaf_offset); + let last = if self.full_segment(mmr_size) { + pmmr::insertion_to_pmmr_index(leaf_offset + segment_size - 1) + (self.identifier.height as u64) } else { - last_pos + mmr_size - 1 }; - (first, last) } - fn get_hash(&self, pos: u64) -> Result { + fn get_hash(&self, pos0: u64) -> Result { self.hash_pos .iter() .zip(&self.hashes) - .find(|&(&p, _)| p == pos) + .find(|&(&p, _)| p == pos0) .map(|(_, &h)| h) - .ok_or_else(|| SegmentError::MissingHash(pos)) + .ok_or_else(|| SegmentError::MissingHash(pos0)) + } + + /// Get the identifier associated with this segment + pub fn identifier(&self) -> SegmentIdentifier { + self.identifier + } + + /// Consume the segment and return its parts + pub fn parts( + self, + ) -> ( + SegmentIdentifier, + Vec, + Vec, + Vec, + Vec, + SegmentProof, + ) { + ( + self.identifier, + self.hash_pos, + self.hashes, + self.leaf_pos, + self.leaf_data, + self.proof, + ) + } + + /// Construct a segment from its parts + pub fn from_parts( + identifier: SegmentIdentifier, + hash_pos: Vec, + hashes: Vec, + leaf_pos: Vec, + leaf_data: Vec, + proof: SegmentProof, + ) -> Self { + assert_eq!(hash_pos.len(), hashes.len()); + let mut last = 0; + for &pos in &hash_pos { + assert!(last == 0 || pos > last); + last = pos; + } + assert_eq!(leaf_pos.len(), leaf_data.len()); + last = 0; + for &pos in &leaf_pos { + assert!(last == 0 || pos > last); + last = pos; + } + + Self { + identifier, + hash_pos, + hashes, + leaf_pos, + leaf_data, + proof, + } } /// Iterator of all the leaves in the segment @@ -171,28 +228,28 @@ where { let mut segment = Segment::empty(segment_id); - let last_pos = pmmr.unpruned_size(); - if segment.segment_unpruned_size(last_pos) == 0 { + let mmr_size = pmmr.unpruned_size(); + if segment.segment_unpruned_size(mmr_size) == 0 { return Err(SegmentError::NonExistent); } // Fill leaf data and hashes - let (segment_first_pos, segment_last_pos) = segment.segment_pos_range(last_pos); - for pos in segment_first_pos..=segment_last_pos { - if pmmr::is_leaf(pos) { - if let Some(data) = pmmr.get_data_from_file(pos) { + let (segment_first_pos, segment_last_pos) = segment.segment_pos_range(mmr_size); + for pos0 in segment_first_pos..=segment_last_pos { + if pmmr::is_leaf(pos0) { + if let Some(data) = pmmr.get_data_from_file(pos0) { segment.leaf_data.push(data); - segment.leaf_pos.push(pos); + segment.leaf_pos.push(pos0); continue; } else if !prunable { - return Err(SegmentError::MissingLeaf(pos)); + return Err(SegmentError::MissingLeaf(pos0)); } } // TODO: optimize, no need to send every intermediary hash if prunable { - if let Some(hash) = pmmr.get_from_file(pos) { + if let Some(hash) = pmmr.get_from_file(pos0) { segment.hashes.push(hash); - segment.hash_pos.push(pos); + segment.hash_pos.push(pos0); } } } @@ -200,12 +257,12 @@ where let mut start_pos = None; // Fully pruned segment: only include a single hash, the first unpruned parent if segment.leaf_data.is_empty() && segment.hashes.is_empty() { - let family_branch = pmmr::family_branch(segment_last_pos, last_pos); - for (pos, _) in family_branch { - if let Some(hash) = pmmr.get_from_file(pos) { + let family_branch = pmmr::family_branch(segment_last_pos, mmr_size); + for (pos0, _) in family_branch { + if let Some(hash) = pmmr.get_from_file(pos0) { segment.hashes.push(hash); - segment.hash_pos.push(pos); - start_pos = Some(pos); + segment.hash_pos.push(pos0); + start_pos = Some(1 + pos0); break; } } @@ -214,9 +271,9 @@ where // Segment merkle proof segment.proof = SegmentProof::generate( pmmr, - last_pos, - segment_first_pos, - segment_last_pos, + mmr_size, + 1 + segment_first_pos, + 1 + segment_last_pos, start_pos, )?; @@ -232,25 +289,25 @@ where /// Returns `None` iff the segment is full and completely pruned pub fn root( &self, - last_pos: u64, + mmr_size: u64, bitmap: Option<&Bitmap>, ) -> Result, SegmentError> { - let (segment_first_pos, segment_last_pos) = self.segment_pos_range(last_pos); + let (segment_first_pos, segment_last_pos) = self.segment_pos_range(mmr_size); let mut hashes = Vec::>::with_capacity(2 * (self.identifier.height as usize)); - let mut leaves = self.leaf_pos.iter().zip(&self.leaf_data); - for pos in segment_first_pos..=segment_last_pos { - let height = pmmr::bintree_postorder_height(pos); + let mut leaves0 = self.leaf_pos.iter().zip(&self.leaf_data); + for pos0 in segment_first_pos..=segment_last_pos { + let height = pmmr::bintree_postorder_height(pos0); let hash = if height == 0 { // Leaf if bitmap .map(|b| { - let idx_1 = pmmr::n_leaves(pos) - 1; - let idx_2 = if pmmr::is_left_sibling(pos) { + let idx_1 = pmmr::n_leaves(pos0 + 1) - 1; + let idx_2 = if pmmr::is_left_sibling(pos0) { idx_1 + 1 } else { idx_1 - 1 }; - b.contains(idx_1 as u32) || b.contains(idx_2 as u32) || pos == last_pos + b.contains(idx_1 as u32) || b.contains(idx_2 as u32) || pos0 == mmr_size - 1 }) .unwrap_or(true) { @@ -260,17 +317,17 @@ where // require the last leaf to be present regardless of the status in the bitmap. // TODO: possibly remove requirement on the sibling when we no longer support // syncing through the txhashset.zip method. - let data = leaves - .find(|&(&p, _)| p == pos) + let data = leaves0 + .find(|&(&p, _)| p == pos0) .map(|(_, l)| l) - .ok_or_else(|| SegmentError::MissingLeaf(pos))?; - Some(data.hash_with_index(pos - 1)) + .ok_or_else(|| SegmentError::MissingLeaf(pos0))?; + Some(data.hash_with_index(pos0)) } else { None } } else { - let left_child_pos = pos - (1 << height); - let right_child_pos = pos - 1; + let left_child_pos = 1 + pos0 - (1 << height); + let right_child_pos = pos0; let right_child = hashes.pop().unwrap(); let left_child = hashes.pop().unwrap(); @@ -279,14 +336,14 @@ where // Prunable MMR match (left_child, right_child) { (None, None) => None, - (Some(l), Some(r)) => Some((l, r).hash_with_index(pos - 1)), + (Some(l), Some(r)) => Some((l, r).hash_with_index(pos0)), (None, Some(r)) => { - let l = self.get_hash(left_child_pos)?; - Some((l, r).hash_with_index(pos - 1)) + let l = self.get_hash(left_child_pos - 1)?; + Some((l, r).hash_with_index(pos0)) } (Some(l), None) => { - let r = self.get_hash(right_child_pos)?; - Some((l, r).hash_with_index(pos - 1)) + let r = self.get_hash(right_child_pos - 1)?; + Some((l, r).hash_with_index(pos0)) } } } else { @@ -297,70 +354,72 @@ where right_child .ok_or_else(|| SegmentError::MissingHash(right_child_pos))?, ) - .hash_with_index(pos - 1), + .hash_with_index(pos0), ) } }; hashes.push(hash); } - if self.full_segment(last_pos) { + if self.full_segment(mmr_size) { // Full segment: last position of segment is subtree root Ok(hashes.pop().unwrap()) } else { // Not full (only final segment): peaks in segment, bag them together - let peaks = pmmr::peaks(last_pos) + let peaks = pmmr::peaks(mmr_size) .into_iter() - .filter(|&pos| pos >= segment_first_pos && pos <= segment_last_pos) + .filter(|&pos0| pos0 >= segment_first_pos && pos0 <= segment_last_pos) .rev(); let mut hash = None; - for pos in peaks { - let mut lhash = hashes.pop().ok_or_else(|| SegmentError::MissingHash(pos))?; + for pos0 in peaks { + let mut lhash = hashes + .pop() + .ok_or_else(|| SegmentError::MissingHash(1 + pos0))?; if lhash.is_none() && bitmap.is_some() { // If this entire peak is pruned, load it from the segment hashes - lhash = Some(self.get_hash(pos)?); + lhash = Some(self.get_hash(pos0)?); } - let lhash = lhash.ok_or_else(|| SegmentError::MissingHash(pos))?; + let lhash = lhash.ok_or_else(|| SegmentError::MissingHash(1 + pos0))?; hash = match hash { None => Some(lhash), - Some(rhash) => Some((lhash, rhash).hash_with_index(last_pos)), + Some(rhash) => Some((lhash, rhash).hash_with_index(mmr_size)), }; } Ok(Some(hash.unwrap())) } } - /// Get the first unpruned parent hash of this segment + /// Get the first 1-based (sucks) unpruned parent hash of this segment pub fn first_unpruned_parent( &self, - last_pos: u64, + mmr_size: u64, bitmap: Option<&Bitmap>, ) -> Result<(Hash, u64), SegmentError> { - let root = self.root(last_pos, bitmap)?; - let (_, last) = self.segment_pos_range(last_pos); + let root = self.root(mmr_size, bitmap)?; + let (_, last) = self.segment_pos_range(mmr_size); if let Some(root) = root { - return Ok((root, last)); + return Ok((root, 1 + last)); } let bitmap = bitmap.unwrap(); - let n_leaves = pmmr::n_leaves(last_pos); + let n_leaves = pmmr::n_leaves(mmr_size); let mut cardinality = 0; - let mut pos = last; + let mut pos0 = last; let mut hash = Err(SegmentError::MissingHash(last)); - let mut family_branch = pmmr::family_branch(last, last_pos).into_iter(); + let mut family_branch = pmmr::family_branch(last, mmr_size).into_iter(); while cardinality == 0 { - hash = self.get_hash(pos).map(|h| (h, pos)); + hash = self.get_hash(pos0).map(|h| (h, 1 + pos0)); if hash.is_ok() { // Return early in case a lower level hash is already present // This can occur if both child trees are pruned but compaction hasn't run yet return hash; } - if let Some((p, _)) = family_branch.next() { - pos = p; - let range = (pmmr::n_leaves(pmmr::bintree_leftmost(p)) - 1) - ..min(pmmr::n_leaves(pmmr::bintree_rightmost(p)), n_leaves); + if let Some((p0, _)) = family_branch.next() { + pos0 = p0; + let range = (pmmr::n_leaves(1 + pmmr::bintree_leftmost(p0)) - 1) as u32 + ..min(pmmr::n_leaves(1 + pmmr::bintree_rightmost(p0)), n_leaves) as u32; cardinality = bitmap.range_cardinality(range); } else { break; @@ -372,14 +431,14 @@ where /// Check validity of the segment by calculating its root and validating the merkle proof pub fn validate( &self, - last_pos: u64, + mmr_size: u64, bitmap: Option<&Bitmap>, mmr_root: Hash, ) -> Result<(), SegmentError> { - let (first, last) = self.segment_pos_range(last_pos); - let (segment_root, segment_unpruned_pos) = self.first_unpruned_parent(last_pos, bitmap)?; + let (first, last) = self.segment_pos_range(mmr_size); + let (segment_root, segment_unpruned_pos) = self.first_unpruned_parent(mmr_size, bitmap)?; self.proof.validate( - last_pos, + mmr_size, mmr_root, first, last, @@ -392,16 +451,16 @@ where /// This function assumes a final hashing step together with `other_root` pub fn validate_with( &self, - last_pos: u64, + mmr_size: u64, bitmap: Option<&Bitmap>, mmr_root: Hash, other_root: Hash, other_is_left: bool, ) -> Result<(), SegmentError> { - let (first, last) = self.segment_pos_range(last_pos); - let (segment_root, segment_unpruned_pos) = self.first_unpruned_parent(last_pos, bitmap)?; + let (first, last) = self.segment_pos_range(mmr_size); + let (segment_root, segment_unpruned_pos) = self.first_unpruned_parent(mmr_size, bitmap)?; self.proof.validate_with( - last_pos, + mmr_size, mmr_root, first, last, @@ -417,16 +476,16 @@ impl Readable for Segment { fn read(reader: &mut R) -> Result { let identifier = Readable::read(reader)?; - let mut last_pos = 0; let n_hashes = reader.read_u64()? as usize; let mut hash_pos = Vec::with_capacity(n_hashes); + let mut last_pos = 0; for _ in 0..n_hashes { let pos = reader.read_u64()?; if pos <= last_pos { return Err(Error::SortError); } last_pos = pos; - hash_pos.push(pos); + hash_pos.push(pos - 1); } let mut hashes = Vec::::with_capacity(n_hashes); @@ -443,7 +502,7 @@ impl Readable for Segment { return Err(Error::SortError); } last_pos = pos; - leaf_pos.push(pos); + leaf_pos.push(pos - 1); } let mut leaf_data = Vec::::with_capacity(n_leaves); @@ -469,14 +528,14 @@ impl Writeable for Segment { Writeable::write(&self.identifier, writer)?; writer.write_u64(self.hashes.len() as u64)?; for &pos in &self.hash_pos { - writer.write_u64(pos)?; + writer.write_u64(1 + pos)?; } for hash in &self.hashes { Writeable::write(hash, writer)?; } writer.write_u64(self.leaf_data.len() as u64)?; for &pos in &self.leaf_pos { - writer.write_u64(pos)?; + writer.write_u64(1 + pos)?; } for data in &self.leaf_data { Writeable::write(data, writer)?; @@ -508,21 +567,24 @@ impl SegmentProof { U: PMMRable, B: Backend, { - let family_branch = pmmr::family_branch(segment_last_pos, last_pos); + let family_branch = pmmr::family_branch(segment_last_pos - 1, last_pos); // 1. siblings along the path from the subtree root to the peak let hashes: Result, _> = family_branch .iter() - .filter(|&&(p, _)| start_pos.map(|s| p > s).unwrap_or(true)) - .map(|&(_, s)| pmmr.get_hash(s).ok_or_else(|| SegmentError::MissingHash(s))) + .filter(|&&(p0, _)| start_pos.map(|s| p0 >= s).unwrap_or(true)) + .map(|&(_, s0)| { + pmmr.get_hash(s0) + .ok_or_else(|| SegmentError::MissingHash(s0)) + }) .collect(); let mut proof = Self { hashes: hashes? }; // 2. bagged peaks to the right let peak_pos = family_branch .last() - .map(|&(p, _)| p) - .unwrap_or(segment_last_pos); + .map(|&(p0, _)| p0) + .unwrap_or(segment_last_pos - 1); if let Some(h) = pmmr.bag_the_rhs(peak_pos) { proof.hashes.push(h); } @@ -530,7 +592,7 @@ impl SegmentProof { // 3. peaks to the left let peaks: Result, _> = pmmr::peaks(last_pos) .into_iter() - .filter(|&x| x < segment_first_pos) + .filter(|&x| 1 + x < segment_first_pos) .rev() .map(|p| pmmr.get_hash(p).ok_or_else(|| SegmentError::MissingHash(p))) .collect(); @@ -543,43 +605,46 @@ impl SegmentProof { pub fn reconstruct_root( &self, last_pos: u64, - segment_first_pos: u64, - segment_last_pos: u64, + segment_first_pos0: u64, + segment_last_pos0: u64, segment_root: Hash, segment_unpruned_pos: u64, ) -> Result { let mut iter = self.hashes.iter(); - let family_branch = pmmr::family_branch(segment_last_pos, last_pos); + let family_branch = pmmr::family_branch(segment_last_pos0, last_pos); // 1. siblings along the path from the subtree root to the peak let mut root = segment_root; - for &(p, s) in family_branch + for &(p0, s0) in family_branch .iter() - .filter(|&&(p, _)| p > segment_unpruned_pos) + .filter(|&&(p0, _)| p0 >= segment_unpruned_pos) { - let sibling_hash = iter.next().ok_or_else(|| SegmentError::MissingHash(s))?; - root = if pmmr::is_left_sibling(s) { - (sibling_hash, root).hash_with_index(p - 1) + let sibling_hash = iter + .next() + .ok_or_else(|| SegmentError::MissingHash(1 + s0))?; + root = if pmmr::is_left_sibling(s0) { + (sibling_hash, root).hash_with_index(p0) } else { - (root, sibling_hash).hash_with_index(p - 1) + (root, sibling_hash).hash_with_index(p0) }; } // 2. bagged peaks to the right - let peak_pos = family_branch + let peak_pos0 = family_branch .last() - .map(|&(p, _)| p) - .unwrap_or(segment_last_pos); + .map(|&(p0, _)| p0) + .unwrap_or(segment_last_pos0); let rhs = pmmr::peaks(last_pos) .into_iter() - .filter(|&x| x > peak_pos) + .filter(|&x| x > peak_pos0) .next(); - if let Some(pos) = rhs { + if let Some(pos0) = rhs { root = ( root, - iter.next().ok_or_else(|| SegmentError::MissingHash(pos))?, + iter.next() + .ok_or_else(|| SegmentError::MissingHash(1 + pos0))?, ) .hash_with_index(last_pos) } @@ -587,11 +652,12 @@ impl SegmentProof { // 3. peaks to the left let peaks = pmmr::peaks(last_pos) .into_iter() - .filter(|&x| x < segment_first_pos) + .filter(|&x| x < segment_first_pos0) .rev(); - for pos in peaks { + for pos0 in peaks { root = ( - iter.next().ok_or_else(|| SegmentError::MissingHash(pos))?, + iter.next() + .ok_or_else(|| SegmentError::MissingHash(1 + pos0))?, root, ) .hash_with_index(last_pos); diff --git a/core/src/core/pmmr/vec_backend.rs b/core/src/core/pmmr/vec_backend.rs index fea1dbe633..3892dc9cdc 100644 --- a/core/src/core/pmmr/vec_backend.rs +++ b/core/src/core/pmmr/vec_backend.rs @@ -43,31 +43,38 @@ impl Backend for VecBackend { Ok(()) } - fn get_hash(&self, position: u64) -> Option { - if self.removed.contains(&position) { + fn append_pruned_subtree(&mut self, _hash: Hash, _pos0: u64) -> Result<(), String> { + unimplemented!() + } + + fn get_hash(&self, pos0: u64) -> Option { + if self.removed.contains(&pos0) { None } else { - self.get_from_file(position) + self.get_from_file(pos0) } } - fn get_data(&self, position: u64) -> Option { - if self.removed.contains(&position) { + fn get_data(&self, pos0: u64) -> Option { + if self.removed.contains(&pos0) { None } else { - self.get_data_from_file(position) + self.get_data_from_file(pos0) } } - fn get_from_file(&self, position: u64) -> Option { - let idx = usize::try_from(position.saturating_sub(1)).expect("usize from u64"); + fn get_from_file(&self, pos0: u64) -> Option { + let idx = usize::try_from(pos0).expect("usize from u64"); self.hashes.get(idx).cloned() } - fn get_data_from_file(&self, position: u64) -> Option { + fn get_peak_from_file(&self, pos0: u64) -> Option { + self.get_from_file(pos0) + } + + fn get_data_from_file(&self, pos0: u64) -> Option { if let Some(data) = &self.data { - let idx = usize::try_from(pmmr::n_leaves(position).saturating_sub(1)) - .expect("usize from u64"); + let idx = usize::try_from(pmmr::n_leaves(1 + pos0) - 1).expect("usize from u64"); data.get(idx).map(|x| x.as_elmt()) } else { None @@ -84,22 +91,23 @@ impl Backend for VecBackend { self.hashes .iter() .enumerate() - .map(|(x, _)| (x + 1) as u64) + .map(|(x, _)| x as u64) .filter(move |x| pmmr::is_leaf(*x) && !self.removed.contains(x)), ) } + /// NOTE this function is needlessly inefficient with repeated calls to n_leaves() fn leaf_idx_iter(&self, from_idx: u64) -> Box + '_> { - let from_pos = pmmr::insertion_to_pmmr_index(from_idx + 1); + let from_pos = pmmr::insertion_to_pmmr_index(from_idx); Box::new( self.leaf_pos_iter() .skip_while(move |x| *x < from_pos) - .map(|x| pmmr::n_leaves(x).saturating_sub(1)), + .map(|x| pmmr::n_leaves(x + 1) - 1), ) } - fn remove(&mut self, position: u64) -> Result<(), String> { - self.removed.insert(position); + fn remove(&mut self, pos0: u64) -> Result<(), String> { + self.removed.insert(pos0); Ok(()) } diff --git a/core/tests/merkle_proof.rs b/core/tests/merkle_proof.rs index dfcf3432c7..33c0166424 100644 --- a/core/tests/merkle_proof.rs +++ b/core/tests/merkle_proof.rs @@ -15,7 +15,7 @@ mod common; use self::core::core::merkle_proof::MerkleProof; -use self::core::core::pmmr::{VecBackend, PMMR}; +use self::core::core::pmmr::{ReadablePMMR, VecBackend, PMMR}; use self::core::ser::{self, PMMRIndexHashable}; use crate::common::TestElem; use grin_core as core; @@ -34,7 +34,7 @@ fn merkle_proof_ser_deser() { for x in 0..15 { pmmr.push(&TestElem([0, 0, 0, x])).unwrap(); } - let proof = pmmr.merkle_proof(9).unwrap(); + let proof = pmmr.merkle_proof(8).unwrap(); let mut vec = Vec::new(); ser::serialize_default(&mut vec, &proof).expect("serialization failed"); @@ -49,12 +49,12 @@ fn pmmr_merkle_proof_prune_and_rewind() { let mut pmmr = PMMR::new(&mut ba); pmmr.push(&TestElem([0, 0, 0, 1])).unwrap(); pmmr.push(&TestElem([0, 0, 0, 2])).unwrap(); - let proof = pmmr.merkle_proof(2).unwrap(); + let proof = pmmr.merkle_proof(1).unwrap(); // now prune an element and check we can still generate // the correct Merkle proof for the other element (after sibling pruned) - pmmr.prune(1).unwrap(); - let proof_2 = pmmr.merkle_proof(2).unwrap(); + pmmr.prune(0).unwrap(); + let proof_2 = pmmr.merkle_proof(1).unwrap(); assert_eq!(proof, proof_2); } @@ -77,113 +77,113 @@ fn pmmr_merkle_proof() { pmmr.push(&elems[0]).unwrap(); let pos_0 = elems[0].hash_with_index(0); - assert_eq!(pmmr.get_hash(1).unwrap(), pos_0); + assert_eq!(pmmr.get_hash(0).unwrap(), pos_0); - let proof = pmmr.merkle_proof(1).unwrap(); + let proof = pmmr.merkle_proof(0).unwrap(); assert_eq!(proof.path, vec![]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 1).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 0).is_ok()); pmmr.push(&elems[1]).unwrap(); let pos_1 = elems[1].hash_with_index(1); - assert_eq!(pmmr.get_hash(2).unwrap(), pos_1); + assert_eq!(pmmr.get_hash(1).unwrap(), pos_1); let pos_2 = (pos_0, pos_1).hash_with_index(2); - assert_eq!(pmmr.get_hash(3).unwrap(), pos_2); + assert_eq!(pmmr.get_hash(2).unwrap(), pos_2); assert_eq!(pmmr.root().unwrap(), pos_2); - assert_eq!(pmmr.peaks().collect::>(), [pos_2]); + assert_eq!(pmmr.peaks(), vec![pos_2]); // single peak, path with single sibling - let proof = pmmr.merkle_proof(1).unwrap(); + let proof = pmmr.merkle_proof(0).unwrap(); assert_eq!(proof.path, vec![pos_1]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 1).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 0).is_ok()); - let proof = pmmr.merkle_proof(2).unwrap(); + let proof = pmmr.merkle_proof(1).unwrap(); assert_eq!(proof.path, vec![pos_0]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[1], 2).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[1], 1).is_ok()); // three leaves, two peaks (one also the right-most leaf) pmmr.push(&elems[2]).unwrap(); let pos_3 = elems[2].hash_with_index(3); - assert_eq!(pmmr.get_hash(4).unwrap(), pos_3); + assert_eq!(pmmr.get_hash(3).unwrap(), pos_3); assert_eq!(pmmr.root().unwrap(), (pos_2, pos_3).hash_with_index(4)); - assert_eq!(pmmr.peaks().collect::>(), [pos_2, pos_3]); + assert_eq!(pmmr.peaks(), vec![pos_2, pos_3]); - let proof = pmmr.merkle_proof(1).unwrap(); + let proof = pmmr.merkle_proof(0).unwrap(); assert_eq!(proof.path, vec![pos_1, pos_3]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 1).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 0).is_ok()); - let proof = pmmr.merkle_proof(2).unwrap(); + let proof = pmmr.merkle_proof(1).unwrap(); assert_eq!(proof.path, vec![pos_0, pos_3]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[1], 2).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[1], 1).is_ok()); - let proof = pmmr.merkle_proof(4).unwrap(); + let proof = pmmr.merkle_proof(3).unwrap(); assert_eq!(proof.path, vec![pos_2]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[2], 4).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[2], 3).is_ok()); // 7 leaves, 3 peaks, 11 pos in total pmmr.push(&elems[3]).unwrap(); let pos_4 = elems[3].hash_with_index(4); - assert_eq!(pmmr.get_hash(5).unwrap(), pos_4); + assert_eq!(pmmr.get_hash(4).unwrap(), pos_4); let pos_5 = (pos_3, pos_4).hash_with_index(5); - assert_eq!(pmmr.get_hash(6).unwrap(), pos_5); + assert_eq!(pmmr.get_hash(5).unwrap(), pos_5); let pos_6 = (pos_2, pos_5).hash_with_index(6); - assert_eq!(pmmr.get_hash(7).unwrap(), pos_6); + assert_eq!(pmmr.get_hash(6).unwrap(), pos_6); pmmr.push(&elems[4]).unwrap(); let pos_7 = elems[4].hash_with_index(7); - assert_eq!(pmmr.get_hash(8).unwrap(), pos_7); + assert_eq!(pmmr.get_hash(7).unwrap(), pos_7); pmmr.push(&elems[5]).unwrap(); let pos_8 = elems[5].hash_with_index(8); - assert_eq!(pmmr.get_hash(9).unwrap(), pos_8); + assert_eq!(pmmr.get_hash(8).unwrap(), pos_8); let pos_9 = (pos_7, pos_8).hash_with_index(9); - assert_eq!(pmmr.get_hash(10).unwrap(), pos_9); + assert_eq!(pmmr.get_hash(9).unwrap(), pos_9); pmmr.push(&elems[6]).unwrap(); let pos_10 = elems[6].hash_with_index(10); - assert_eq!(pmmr.get_hash(11).unwrap(), pos_10); + assert_eq!(pmmr.get_hash(10).unwrap(), pos_10); assert_eq!(pmmr.unpruned_size(), 11); - let proof = pmmr.merkle_proof(1).unwrap(); + let proof = pmmr.merkle_proof(0).unwrap(); assert_eq!( proof.path, vec![pos_1, pos_5, (pos_9, pos_10).hash_with_index(11)] ); - assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 1).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[0], 0).is_ok()); - let proof = pmmr.merkle_proof(2).unwrap(); + let proof = pmmr.merkle_proof(1).unwrap(); assert_eq!( proof.path, vec![pos_0, pos_5, (pos_9, pos_10).hash_with_index(11)] ); - assert!(proof.verify(pmmr.root().unwrap(), &elems[1], 2).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[1], 1).is_ok()); - let proof = pmmr.merkle_proof(4).unwrap(); + let proof = pmmr.merkle_proof(3).unwrap(); assert_eq!( proof.path, vec![pos_4, pos_2, (pos_9, pos_10).hash_with_index(11)] ); - assert!(proof.verify(pmmr.root().unwrap(), &elems[2], 4).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[2], 3).is_ok()); - let proof = pmmr.merkle_proof(5).unwrap(); + let proof = pmmr.merkle_proof(4).unwrap(); assert_eq!( proof.path, vec![pos_3, pos_2, (pos_9, pos_10).hash_with_index(11)] ); - assert!(proof.verify(pmmr.root().unwrap(), &elems[3], 5).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[3], 4).is_ok()); - let proof = pmmr.merkle_proof(8).unwrap(); + let proof = pmmr.merkle_proof(7).unwrap(); assert_eq!(proof.path, vec![pos_8, pos_10, pos_6]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[4], 8).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[4], 7).is_ok()); - let proof = pmmr.merkle_proof(9).unwrap(); + let proof = pmmr.merkle_proof(8).unwrap(); assert_eq!(proof.path, vec![pos_7, pos_10, pos_6]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[5], 9).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[5], 8).is_ok()); - let proof = pmmr.merkle_proof(11).unwrap(); + let proof = pmmr.merkle_proof(10).unwrap(); assert_eq!(proof.path, vec![pos_9, pos_6]); - assert!(proof.verify(pmmr.root().unwrap(), &elems[6], 11).is_ok()); + assert!(proof.verify(pmmr.root().unwrap(), &elems[6], 10).is_ok()); } diff --git a/core/tests/pmmr.rs b/core/tests/pmmr.rs index 1e02ea135d..6e56222062 100644 --- a/core/tests/pmmr.rs +++ b/core/tests/pmmr.rs @@ -15,12 +15,11 @@ mod common; use self::core::core::hash::Hash; -use self::core::core::pmmr::{self, VecBackend, PMMR}; +use self::core::core::pmmr::{self, ReadablePMMR, VecBackend, PMMR}; use self::core::ser::PMMRIndexHashable; use crate::common::TestElem; use chrono::prelude::Utc; use grin_core as core; -use std::u64; #[test] fn some_peak_map() { @@ -77,7 +76,7 @@ fn first_100_mmr_heights() { 0 0 1 0 0 1 2 0 0 1 0 0 1 2 3 0 0 1 0 0 1 2 0 0 1 0 0 1 2 3 4 5 \ 0 0 1 0 0 1 2 0 0 1 0 0 1 2 3 0 0 1 0 0 1 2 0 0 1 0 0 1 2 3 4 0 0 1 0 0"; let first_100 = first_100_str.split(' ').map(|n| n.parse::().unwrap()); - let mut count = 1; + let mut count = 0; for n in first_100 { assert_eq!( n, @@ -90,17 +89,27 @@ fn first_100_mmr_heights() { } } +#[test] +fn test_bintree_range() { + assert_eq!(pmmr::bintree_range(0), 0..1); + assert_eq!(pmmr::bintree_range(1), 1..2); + assert_eq!(pmmr::bintree_range(2), 0..3); + assert_eq!(pmmr::bintree_range(3), 3..4); + assert_eq!(pmmr::bintree_range(4), 4..5); + assert_eq!(pmmr::bintree_range(5), 3..6); + assert_eq!(pmmr::bintree_range(6), 0..7); +} + // The pos of the rightmost leaf for the provided MMR size (last leaf in subtree). #[test] fn test_bintree_rightmost() { assert_eq!(pmmr::bintree_rightmost(0), 0); assert_eq!(pmmr::bintree_rightmost(1), 1); - assert_eq!(pmmr::bintree_rightmost(2), 2); - assert_eq!(pmmr::bintree_rightmost(3), 2); + assert_eq!(pmmr::bintree_rightmost(2), 1); + assert_eq!(pmmr::bintree_rightmost(3), 3); assert_eq!(pmmr::bintree_rightmost(4), 4); - assert_eq!(pmmr::bintree_rightmost(5), 5); - assert_eq!(pmmr::bintree_rightmost(6), 5); - assert_eq!(pmmr::bintree_rightmost(7), 5); + assert_eq!(pmmr::bintree_rightmost(5), 4); + assert_eq!(pmmr::bintree_rightmost(6), 4); } // The pos of the leftmost leaf for the provided MMR size (first leaf in subtree). @@ -108,19 +117,162 @@ fn test_bintree_rightmost() { fn test_bintree_leftmost() { assert_eq!(pmmr::bintree_leftmost(0), 0); assert_eq!(pmmr::bintree_leftmost(1), 1); - assert_eq!(pmmr::bintree_leftmost(2), 2); - assert_eq!(pmmr::bintree_leftmost(3), 1); + assert_eq!(pmmr::bintree_leftmost(2), 0); + assert_eq!(pmmr::bintree_leftmost(3), 3); assert_eq!(pmmr::bintree_leftmost(4), 4); - assert_eq!(pmmr::bintree_leftmost(5), 5); - assert_eq!(pmmr::bintree_leftmost(6), 4); - assert_eq!(pmmr::bintree_leftmost(7), 1); + assert_eq!(pmmr::bintree_leftmost(5), 3); + assert_eq!(pmmr::bintree_leftmost(6), 0); +} + +#[test] +fn test_bintree_leaf_pos_iter() { + assert_eq!(pmmr::bintree_leaf_pos_iter(0).collect::>(), [0]); + assert_eq!(pmmr::bintree_leaf_pos_iter(1).collect::>(), [1]); + assert_eq!(pmmr::bintree_leaf_pos_iter(2).collect::>(), [0, 1]); + assert_eq!(pmmr::bintree_leaf_pos_iter(3).collect::>(), [3]); + assert_eq!(pmmr::bintree_leaf_pos_iter(4).collect::>(), [4]); + assert_eq!(pmmr::bintree_leaf_pos_iter(5).collect::>(), [3, 4]); + assert_eq!( + pmmr::bintree_leaf_pos_iter(6).collect::>(), + [0, 1, 3, 4] + ); +} + +#[test] +fn test_bintree_pos_iter() { + assert_eq!(pmmr::bintree_pos_iter(0).collect::>(), [0]); + assert_eq!(pmmr::bintree_pos_iter(1).collect::>(), [1]); + assert_eq!(pmmr::bintree_pos_iter(2).collect::>(), [0, 1, 2]); + assert_eq!(pmmr::bintree_pos_iter(3).collect::>(), [3]); + assert_eq!(pmmr::bintree_pos_iter(4).collect::>(), [4]); + assert_eq!(pmmr::bintree_pos_iter(5).collect::>(), [3, 4, 5]); + assert_eq!( + pmmr::bintree_pos_iter(6).collect::>(), + [0, 1, 2, 3, 4, 5, 6] + ); +} + +#[test] +fn test_is_leaf() { + assert_eq!(pmmr::is_leaf(0), true); + assert_eq!(pmmr::is_leaf(1), true); + assert_eq!(pmmr::is_leaf(2), false); + assert_eq!(pmmr::is_leaf(3), true); + assert_eq!(pmmr::is_leaf(4), true); + assert_eq!(pmmr::is_leaf(5), false); + assert_eq!(pmmr::is_leaf(6), false); +} + +#[test] +fn test_pmmr_leaf_to_insertion_index() { + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(0), Some(0)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(1), Some(1)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(3), Some(2)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(4), Some(3)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(7), Some(4)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(8), Some(5)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(10), Some(6)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(11), Some(7)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(15), Some(8)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(16), Some(9)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(18), Some(10)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(19), Some(11)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(22), Some(12)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(23), Some(13)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(25), Some(14)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(26), Some(15)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(31), Some(16)); + + // Not a leaf node + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(30), None); + + // Sanity check to make sure we don't get an explosion around the u64 max + // number of leaves + let n_leaves_max_u64 = pmmr::n_leaves(u64::MAX - 257); + assert_eq!( + pmmr::pmmr_leaf_to_insertion_index(n_leaves_max_u64), + Some(4611686018427387884) + ); +} + +#[test] +fn test_bintree_leaf_pos_iter() { + assert_eq!(pmmr::bintree_leaf_pos_iter(0).count(), 0); + assert_eq!(pmmr::bintree_leaf_pos_iter(1).collect::>(), [1]); + assert_eq!(pmmr::bintree_leaf_pos_iter(2).collect::>(), [2]); + assert_eq!(pmmr::bintree_leaf_pos_iter(3).collect::>(), [1, 2]); + assert_eq!(pmmr::bintree_leaf_pos_iter(4).collect::>(), [4]); + assert_eq!(pmmr::bintree_leaf_pos_iter(5).collect::>(), [5]); + assert_eq!(pmmr::bintree_leaf_pos_iter(6).collect::>(), [4, 5]); + assert_eq!( + pmmr::bintree_leaf_pos_iter(7).collect::>(), + [1, 2, 4, 5] + ); +} + +#[test] +fn test_bintree_pos_iter() { + assert_eq!(pmmr::bintree_pos_iter(0).count(), 0); + assert_eq!(pmmr::bintree_pos_iter(1).collect::>(), [1]); + assert_eq!(pmmr::bintree_pos_iter(2).collect::>(), [2]); + assert_eq!(pmmr::bintree_pos_iter(3).collect::>(), [1, 2, 3]); + assert_eq!(pmmr::bintree_pos_iter(4).collect::>(), [4]); + assert_eq!(pmmr::bintree_pos_iter(5).collect::>(), [5]); + assert_eq!(pmmr::bintree_pos_iter(6).collect::>(), [4, 5, 6]); + assert_eq!( + pmmr::bintree_pos_iter(7).collect::>(), + [1, 2, 3, 4, 5, 6, 7] + ); +} + +#[test] +fn test_is_leaf() { + assert_eq!(pmmr::is_leaf(0), false); + assert_eq!(pmmr::is_leaf(1), true); + assert_eq!(pmmr::is_leaf(2), true); + assert_eq!(pmmr::is_leaf(3), false); + assert_eq!(pmmr::is_leaf(4), true); + assert_eq!(pmmr::is_leaf(5), true); + assert_eq!(pmmr::is_leaf(6), false); + assert_eq!(pmmr::is_leaf(7), false); +} + +#[test] +fn test_pmmr_leaf_to_insertion_index() { + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(1), Some(0)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(2), Some(1)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(4), Some(2)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(5), Some(3)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(8), Some(4)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(9), Some(5)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(11), Some(6)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(12), Some(7)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(16), Some(8)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(17), Some(9)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(19), Some(10)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(20), Some(11)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(23), Some(12)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(24), Some(13)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(26), Some(14)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(27), Some(15)); + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(32), Some(16)); + + // Not a leaf node + assert_eq!(pmmr::pmmr_leaf_to_insertion_index(31), None); + + // Sanity check to make sure we don't get an explosion around the u64 max + // number of leaves + let n_leaves_max_u64 = pmmr::n_leaves(u64::MAX - 256); + assert_eq!( + pmmr::pmmr_leaf_to_insertion_index(n_leaves_max_u64), + Some(4611686018427387884) + ); } #[test] fn test_n_leaves() { // make sure we handle an empty MMR correctly assert_eq!(pmmr::n_leaves(0), 0); - // and various sizes on non-empty MMRs assert_eq!(pmmr::n_leaves(1), 1); assert_eq!(pmmr::n_leaves(2), 2); @@ -134,57 +286,65 @@ fn test_n_leaves() { assert_eq!(pmmr::n_leaves(10), 6); } -/// Find parent and sibling positions for various node positions. #[test] -fn various_families() { - // 0 0 1 0 0 1 2 0 0 1 0 0 1 2 3 - assert_eq!(pmmr::family(1), (3, 2)); - assert_eq!(pmmr::family(2), (3, 1)); - assert_eq!(pmmr::family(3), (7, 6)); - assert_eq!(pmmr::family(4), (6, 5)); - assert_eq!(pmmr::family(5), (6, 4)); - assert_eq!(pmmr::family(6), (7, 3)); - assert_eq!(pmmr::family(7), (15, 14)); - assert_eq!(pmmr::family(1_000), (1_001, 997)); +fn test_round_up_to_leaf_pos() { + assert_eq!(pmmr::round_up_to_leaf_pos(0), 0); + assert_eq!(pmmr::round_up_to_leaf_pos(1), 1); + assert_eq!(pmmr::round_up_to_leaf_pos(2), 3); + assert_eq!(pmmr::round_up_to_leaf_pos(3), 3); + assert_eq!(pmmr::round_up_to_leaf_pos(4), 4); + assert_eq!(pmmr::round_up_to_leaf_pos(5), 7); + assert_eq!(pmmr::round_up_to_leaf_pos(6), 7); + assert_eq!(pmmr::round_up_to_leaf_pos(7), 7); + assert_eq!(pmmr::round_up_to_leaf_pos(8), 8); + assert_eq!(pmmr::round_up_to_leaf_pos(9), 10); + assert_eq!(pmmr::round_up_to_leaf_pos(10), 10); } +/// Find parent and sibling positions for various node positions. #[test] -fn test_paths() { - assert_eq!(pmmr::path(1, 3).collect::>(), [1, 3]); - assert_eq!(pmmr::path(2, 3).collect::>(), [2, 3]); - assert_eq!(pmmr::path(4, 16).collect::>(), [4, 6, 7, 15]); +fn various_families() { + // 0 0 1 0 0 1 2 0 0 1 0 0 1 2 3 + assert_eq!(pmmr::family(0), (2, 1)); + assert_eq!(pmmr::family(1), (2, 0)); + assert_eq!(pmmr::family(2), (6, 5)); + assert_eq!(pmmr::family(3), (5, 4)); + assert_eq!(pmmr::family(4), (5, 3)); + assert_eq!(pmmr::family(5), (6, 2)); + assert_eq!(pmmr::family(6), (14, 13)); + assert_eq!(pmmr::family(999), (1_000, 996)); } #[test] fn test_is_left_sibling() { - assert_eq!(pmmr::is_left_sibling(1), true); - assert_eq!(pmmr::is_left_sibling(2), false); - assert_eq!(pmmr::is_left_sibling(3), true); + assert_eq!(pmmr::is_left_sibling(0), true); + assert_eq!(pmmr::is_left_sibling(1), false); + assert_eq!(pmmr::is_left_sibling(2), true); } #[test] fn various_branches() { // the two leaf nodes in a 3 node tree (height 1) - assert_eq!(pmmr::family_branch(1, 3), [(3, 2)]); - assert_eq!(pmmr::family_branch(2, 3), [(3, 1)]); + assert_eq!(pmmr::family_branch(0, 3), [(2, 1)]); + assert_eq!(pmmr::family_branch(1, 3), [(2, 0)]); // the root node in a 3 node tree - assert_eq!(pmmr::family_branch(3, 3), []); + assert_eq!(pmmr::family_branch(2, 3), []); // leaf node in a larger tree of 7 nodes (height 2) - assert_eq!(pmmr::family_branch(1, 7), [(3, 2), (7, 6)]); + assert_eq!(pmmr::family_branch(0, 7), [(2, 1), (6, 5)]); // note these only go as far up as the local peak, not necessarily the single // root - assert_eq!(pmmr::family_branch(1, 4), [(3, 2)]); + assert_eq!(pmmr::family_branch(0, 4), [(2, 1)]); // pos 4 in a tree of size 4 is a local peak - assert_eq!(pmmr::family_branch(4, 4), []); + assert_eq!(pmmr::family_branch(3, 4), []); // pos 4 in a tree of size 5 is also still a local peak - assert_eq!(pmmr::family_branch(4, 5), []); + assert_eq!(pmmr::family_branch(3, 5), []); // pos 4 in a tree of size 6 has a parent and a sibling - assert_eq!(pmmr::family_branch(4, 6), [(6, 5)]); + assert_eq!(pmmr::family_branch(3, 6), [(5, 4)]); // a tree of size 7 is all under a single root - assert_eq!(pmmr::family_branch(4, 7), [(6, 5), (7, 3)]); + assert_eq!(pmmr::family_branch(3, 7), [(5, 4), (6, 2)]); // ok now for a more realistic one, a tree with over a million nodes in it // find the "family path" back up the tree from a leaf node at 0 @@ -193,27 +353,27 @@ fn various_branches() { // largest possible list of peaks before we start combining them into larger // peaks. assert_eq!( - pmmr::family_branch(1, 1_049_000), + pmmr::family_branch(0, 1_049_000), [ - (3, 2), - (7, 6), - (15, 14), - (31, 30), - (63, 62), - (127, 126), - (255, 254), - (511, 510), - (1023, 1022), - (2047, 2046), - (4095, 4094), - (8191, 8190), - (16383, 16382), - (32767, 32766), - (65535, 65534), - (131071, 131070), - (262143, 262142), - (524287, 524286), - (1048575, 1048574), + (2, 1), + (6, 5), + (14, 13), + (30, 29), + (62, 61), + (126, 125), + (254, 253), + (510, 509), + (1022, 1021), + (2046, 2045), + (4094, 4093), + (8190, 8189), + (16382, 16381), + (32766, 32765), + (65534, 65533), + (131070, 131069), + (262142, 262141), + (524286, 524285), + (1048574, 1048573), ] ); } @@ -228,21 +388,21 @@ fn some_peaks() { assert_eq!(pmmr::peaks(0), empty); // and various non-empty MMRs - assert_eq!(pmmr::peaks(1), [1]); + assert_eq!(pmmr::peaks(1), [0]); assert_eq!(pmmr::peaks(2), empty); - assert_eq!(pmmr::peaks(3), [3]); - assert_eq!(pmmr::peaks(4), [3, 4]); + assert_eq!(pmmr::peaks(3), [2]); + assert_eq!(pmmr::peaks(4), [2, 3]); assert_eq!(pmmr::peaks(5), empty); assert_eq!(pmmr::peaks(6), empty); - assert_eq!(pmmr::peaks(7), [7]); - assert_eq!(pmmr::peaks(8), [7, 8]); + assert_eq!(pmmr::peaks(7), [6]); + assert_eq!(pmmr::peaks(8), [6, 7]); assert_eq!(pmmr::peaks(9), empty); - assert_eq!(pmmr::peaks(10), [7, 10]); - assert_eq!(pmmr::peaks(11), [7, 10, 11]); - assert_eq!(pmmr::peaks(22), [15, 22]); - assert_eq!(pmmr::peaks(32), [31, 32]); - assert_eq!(pmmr::peaks(35), [31, 34, 35]); - assert_eq!(pmmr::peaks(42), [31, 38, 41, 42]); + assert_eq!(pmmr::peaks(10), [6, 9]); + assert_eq!(pmmr::peaks(11), [6, 9, 10]); + assert_eq!(pmmr::peaks(22), [14, 21]); + assert_eq!(pmmr::peaks(32), [30, 31]); + assert_eq!(pmmr::peaks(35), [30, 33, 34]); + assert_eq!(pmmr::peaks(42), [30, 37, 40, 41]); // large realistic example with almost 1.5 million nodes // note the distance between peaks decreases toward the right (trees get @@ -250,8 +410,8 @@ fn some_peaks() { assert_eq!( pmmr::peaks(1048555), [ - 524287, 786430, 917501, 983036, 1015803, 1032186, 1040377, 1044472, 1046519, 1047542, - 1048053, 1048308, 1048435, 1048498, 1048529, 1048544, 1048551, 1048554, 1048555, + 524286, 786429, 917500, 983035, 1015802, 1032185, 1040376, 1044471, 1046518, 1047541, + 1048052, 1048307, 1048434, 1048497, 1048528, 1048543, 1048550, 1048553, 1048554, ], ); } @@ -278,7 +438,7 @@ fn pmmr_push_root() { pmmr.push(&elems[0]).unwrap(); pmmr.dump(false); let pos_0 = elems[0].hash_with_index(0); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_0]); + assert_eq!(pmmr.peaks(), vec![pos_0]); assert_eq!(pmmr.root().unwrap(), pos_0); assert_eq!(pmmr.unpruned_size(), 1); @@ -287,7 +447,7 @@ fn pmmr_push_root() { pmmr.dump(false); let pos_1 = elems[1].hash_with_index(1); let pos_2 = (pos_0, pos_1).hash_with_index(2); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_2]); + assert_eq!(pmmr.peaks(), vec![pos_2]); assert_eq!(pmmr.root().unwrap(), pos_2); assert_eq!(pmmr.unpruned_size(), 3); @@ -295,7 +455,7 @@ fn pmmr_push_root() { pmmr.push(&elems[2]).unwrap(); pmmr.dump(false); let pos_3 = elems[2].hash_with_index(3); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_2, pos_3]); + assert_eq!(pmmr.peaks(), vec![pos_2, pos_3]); assert_eq!(pmmr.root().unwrap(), (pos_2, pos_3).hash_with_index(4)); assert_eq!(pmmr.unpruned_size(), 4); @@ -305,7 +465,7 @@ fn pmmr_push_root() { let pos_4 = elems[3].hash_with_index(4); let pos_5 = (pos_3, pos_4).hash_with_index(5); let pos_6 = (pos_2, pos_5).hash_with_index(6); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_6]); + assert_eq!(pmmr.peaks(), vec![pos_6]); assert_eq!(pmmr.root().unwrap(), pos_6); assert_eq!(pmmr.unpruned_size(), 7); @@ -313,7 +473,7 @@ fn pmmr_push_root() { pmmr.push(&elems[4]).unwrap(); pmmr.dump(false); let pos_7 = elems[4].hash_with_index(7); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_6, pos_7]); + assert_eq!(pmmr.peaks(), vec![pos_6, pos_7]); assert_eq!(pmmr.root().unwrap(), (pos_6, pos_7).hash_with_index(8)); assert_eq!(pmmr.unpruned_size(), 8); @@ -321,14 +481,14 @@ fn pmmr_push_root() { pmmr.push(&elems[5]).unwrap(); let pos_8 = elems[5].hash_with_index(8); let pos_9 = (pos_7, pos_8).hash_with_index(9); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_6, pos_9]); + assert_eq!(pmmr.peaks(), vec![pos_6, pos_9]); assert_eq!(pmmr.root().unwrap(), (pos_6, pos_9).hash_with_index(10)); assert_eq!(pmmr.unpruned_size(), 10); // seven elements pmmr.push(&elems[6]).unwrap(); let pos_10 = elems[6].hash_with_index(10); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_6, pos_9, pos_10]); + assert_eq!(pmmr.peaks(), vec![pos_6, pos_9, pos_10]); assert_eq!( pmmr.root().unwrap(), (pos_6, (pos_9, pos_10).hash_with_index(11)).hash_with_index(11) @@ -342,14 +502,14 @@ fn pmmr_push_root() { let pos_12 = (pos_10, pos_11).hash_with_index(12); let pos_13 = (pos_9, pos_12).hash_with_index(13); let pos_14 = (pos_6, pos_13).hash_with_index(14); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_14]); + assert_eq!(pmmr.peaks(), vec![pos_14]); assert_eq!(pmmr.root().unwrap(), pos_14); assert_eq!(pmmr.unpruned_size(), 15); // nine elements pmmr.push(&elems[8]).unwrap(); let pos_15 = elems[8].hash_with_index(15); - assert_eq!(pmmr.peaks().collect::>(), vec![pos_14, pos_15]); + assert_eq!(pmmr.peaks(), vec![pos_14, pos_15]); assert_eq!(pmmr.root().unwrap(), (pos_14, pos_15).hash_with_index(16)); assert_eq!(pmmr.unpruned_size(), 16); } @@ -437,7 +597,7 @@ fn pmmr_prune() { // pruning a leaf with no parent should do nothing { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut ba, sz); - pmmr.prune(16).unwrap(); + pmmr.prune(15).unwrap(); assert_eq!(orig_root, pmmr.root().unwrap()); } assert_eq!(ba.hashes.len(), 16); @@ -446,7 +606,7 @@ fn pmmr_prune() { // pruning leaves with no shared parent just removes 1 element { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut ba, sz); - pmmr.prune(2).unwrap(); + pmmr.prune(1).unwrap(); assert_eq!(orig_root, pmmr.root().unwrap()); } assert_eq!(ba.hashes.len(), 16); @@ -454,7 +614,7 @@ fn pmmr_prune() { { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut ba, sz); - pmmr.prune(4).unwrap(); + pmmr.prune(3).unwrap(); assert_eq!(orig_root, pmmr.root().unwrap()); } assert_eq!(ba.hashes.len(), 16); @@ -463,7 +623,7 @@ fn pmmr_prune() { // pruning a non-leaf node has no effect { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut ba, sz); - pmmr.prune(3).unwrap_err(); + pmmr.prune(2).unwrap_err(); assert_eq!(orig_root, pmmr.root().unwrap()); } assert_eq!(ba.hashes.len(), 16); @@ -472,7 +632,7 @@ fn pmmr_prune() { // TODO - no longer true (leaves only now) - pruning sibling removes subtree { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut ba, sz); - pmmr.prune(5).unwrap(); + pmmr.prune(4).unwrap(); assert_eq!(orig_root, pmmr.root().unwrap()); } assert_eq!(ba.hashes.len(), 16); @@ -482,7 +642,7 @@ fn pmmr_prune() { // removes all subtree { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut ba, sz); - pmmr.prune(1).unwrap(); + pmmr.prune(0).unwrap(); assert_eq!(orig_root, pmmr.root().unwrap()); } assert_eq!(ba.hashes.len(), 16); @@ -491,7 +651,7 @@ fn pmmr_prune() { // pruning everything should only leave us with a single peak { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut ba, sz); - for n in 1..16 { + for n in 0..15 { let _ = pmmr.prune(n); } assert_eq!(orig_root, pmmr.root().unwrap()); @@ -502,14 +662,14 @@ fn pmmr_prune() { #[test] fn check_insertion_to_pmmr_index() { + assert_eq!(pmmr::insertion_to_pmmr_index(0), 0); assert_eq!(pmmr::insertion_to_pmmr_index(1), 1); - assert_eq!(pmmr::insertion_to_pmmr_index(2), 2); + assert_eq!(pmmr::insertion_to_pmmr_index(2), 3); assert_eq!(pmmr::insertion_to_pmmr_index(3), 4); - assert_eq!(pmmr::insertion_to_pmmr_index(4), 5); + assert_eq!(pmmr::insertion_to_pmmr_index(4), 7); assert_eq!(pmmr::insertion_to_pmmr_index(5), 8); - assert_eq!(pmmr::insertion_to_pmmr_index(6), 9); + assert_eq!(pmmr::insertion_to_pmmr_index(6), 10); assert_eq!(pmmr::insertion_to_pmmr_index(7), 11); - assert_eq!(pmmr::insertion_to_pmmr_index(8), 12); } #[test] @@ -547,8 +707,8 @@ fn check_elements_from_pmmr_index() { assert_eq!(res.1[6].0[3], 11); // pruning a few nodes should get consistent results - pmmr.prune(pmmr::insertion_to_pmmr_index(5)).unwrap(); - pmmr.prune(pmmr::insertion_to_pmmr_index(20)).unwrap(); + pmmr.prune(pmmr::insertion_to_pmmr_index(4)).unwrap(); + pmmr.prune(pmmr::insertion_to_pmmr_index(19)).unwrap(); let res = pmmr .readonly_pmmr() diff --git a/core/tests/segment.rs b/core/tests/segment.rs index c70a73e6fb..be1b063404 100644 --- a/core/tests/segment.rs +++ b/core/tests/segment.rs @@ -44,7 +44,7 @@ fn test_unprunable_size(height: u8, n_leaves: u32) { if idx < n_segments - 1 || (n_leaves as u64) % size == 0 { // Check if the reconstructed subtree root matches with the hash stored in the mmr let subtree_root = segment.root(last_pos, None).unwrap().unwrap(); - let last = pmmr::insertion_to_pmmr_index((idx + 1) * size) + (height as u64); + let last = pmmr::insertion_to_pmmr_index((idx + 1) * size - 1) + (height as u64); assert_eq!(subtree_root, mmr.get_hash(last).unwrap()); println!(" ROOT OK"); } diff --git a/core/tests/vec_backend.rs b/core/tests/vec_backend.rs index d0d313cd95..b24473918f 100644 --- a/core/tests/vec_backend.rs +++ b/core/tests/vec_backend.rs @@ -14,7 +14,7 @@ mod common; -use self::core::core::pmmr::{VecBackend, PMMR}; +use self::core::core::pmmr::{ReadablePMMR, VecBackend, PMMR}; use crate::common::TestElem; use grin_core as core; @@ -37,7 +37,7 @@ fn leaf_pos_and_idx_iter_test() { pmmr.leaf_idx_iter(0).collect::>() ); assert_eq!( - vec![1, 2, 4, 5, 8], + vec![0, 1, 3, 4, 7], pmmr.leaf_pos_iter().collect::>() ); } @@ -61,7 +61,7 @@ fn leaf_pos_and_idx_iter_hash_only_test() { pmmr.leaf_idx_iter(0).collect::>() ); assert_eq!( - vec![1, 2, 4, 5, 8], + vec![0, 1, 3, 4, 7], pmmr.leaf_pos_iter().collect::>() ); } diff --git a/p2p/src/serv.rs b/p2p/src/serv.rs index 2ee0cecca5..2201b83c3d 100644 --- a/p2p/src/serv.rs +++ b/p2p/src/serv.rs @@ -55,7 +55,7 @@ impl Server { /// Creates a new idle p2p server with no peers pub fn new( db_root: &str, - capab: Capabilities, + capabilities: Capabilities, config: P2PConfig, adapter: Arc, genesis: Hash, @@ -65,7 +65,7 @@ impl Server { ) -> Result { Ok(Server { config: config.clone(), - capabilities: capab, + capabilities, handshake: Arc::new(Handshake::new( genesis, config.clone(), diff --git a/p2p/src/types.rs b/p2p/src/types.rs index ee18460050..e6191beb04 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -360,11 +360,6 @@ pub struct P2PConfig { /// The list of seed nodes, if using Seeding as a seed type pub seeds: Option, - /// TODO: Rethink this. We need to separate what *we* advertise vs. who we connect to. - /// Capabilities expose by this node, also conditions which other peers this - /// node will have an affinity toward when connection. - pub capabilities: Capabilities, - pub peers_allow: Option, pub peers_deny: Option, @@ -392,7 +387,6 @@ impl Default for P2PConfig { P2PConfig { host: ipaddr, port: 3414, - capabilities: Capabilities::FULL_NODE, seeding_type: Seeding::default(), seeds: None, peers_allow: None, @@ -480,8 +474,7 @@ bitflags! { /// Can provide full history of headers back to genesis /// (for at least one arbitrary fork). const HEADER_HIST = 0b0000_0001; - /// Can provide block headers and the TxHashSet for some recent-enough - /// height. + /// Can provide recent txhashset archive for fast sync. const TXHASHSET_HIST = 0b0000_0010; /// Can provide a list of healthy peers const PEER_LIST = 0b0000_0100; @@ -489,16 +482,21 @@ bitflags! { const TX_KERNEL_HASH = 0b0000_1000; /// Can send/receive tor addresses const TOR_ADDRESS = 0b0001_0000; + /// Can provide PIBD segments during initial byte download (fast sync). + const PIBD_HIST = 0b0010_0000; + } +} - /// All nodes right now are "full nodes". - /// Some nodes internally may maintain longer block histories (archival_mode) - /// but we do not advertise this to other nodes. - /// All nodes by default will accept lightweight "kernel first" tx broadcast. - const FULL_NODE = Capabilities::HEADER_HIST.bits - | Capabilities::TXHASHSET_HIST.bits - | Capabilities::PEER_LIST.bits - | Capabilities::TX_KERNEL_HASH.bits - | Capabilities::TOR_ADDRESS.bits; +/// Default capabilities. +impl Default for Capabilities { + fn default() -> Self { + Capabilities::HEADER_HIST + | Capabilities::TXHASHSET_HIST + | Capabilities::PEER_LIST + | Capabilities::TX_KERNEL_HASH + | Capabilities::TOR_ADDRESS + // To be enabled once we start supporting the various PIBD segment msgs. + // | Capabilities::PIBD_HIST } } diff --git a/p2p/tests/capabilities.rs b/p2p/tests/capabilities.rs new file mode 100644 index 0000000000..1e179a4e98 --- /dev/null +++ b/p2p/tests/capabilities.rs @@ -0,0 +1,52 @@ +// Copyright 2020 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use grin_p2p::Capabilities; + +// We use `contains()` to filter capabilities bits. +#[test] +fn capabilities_contains() { + let x = Capabilities::HEADER_HIST; + + // capabilities contain themselves + assert!(x.contains(Capabilities::HEADER_HIST)); + + // UNKNOWN can be used to filter for any capabilities + assert!(x.contains(Capabilities::UNKNOWN)); + + // capabilities do not contain other disjoint capabilities + assert_eq!(false, x.contains(Capabilities::PEER_LIST)); +} + +#[test] +fn default_capabilities() { + let x = Capabilities::default(); + + // Check that default capabilities is covered by UNKNOWN. + assert!(x.contains(Capabilities::UNKNOWN)); + + // Check that all the expected capabilities are included in default capabilities. + assert!(x.contains(Capabilities::HEADER_HIST)); + assert!(x.contains(Capabilities::TXHASHSET_HIST)); + assert!(x.contains(Capabilities::PEER_LIST)); + assert!(x.contains(Capabilities::TX_KERNEL_HASH)); + + assert_eq!( + x, + Capabilities::HEADER_HIST + | Capabilities::TXHASHSET_HIST + | Capabilities::PEER_LIST + | Capabilities::TX_KERNEL_HASH + ); +} diff --git a/p2p/tests/ser_deser.rs b/p2p/tests/ser_deser.rs index 1c8cee347c..f8bbe1af4a 100644 --- a/p2p/tests/ser_deser.rs +++ b/p2p/tests/ser_deser.rs @@ -42,6 +42,8 @@ fn test_type_enum() { #[test] fn test_capabilities() { + let expected = p2p::types::Capabilities::default(); + assert_eq!( p2p::types::Capabilities::from_bits_truncate(0b00000000 as u32), p2p::types::Capabilities::UNKNOWN @@ -52,25 +54,20 @@ fn test_capabilities() { ); assert_eq!( + expected, p2p::types::Capabilities::from_bits_truncate(0b11111 as u32), - p2p::types::Capabilities::FULL_NODE - ); - assert_eq!( - p2p::types::Capabilities::from_bits_truncate(0b00011111 as u32), - p2p::types::Capabilities::FULL_NODE ); assert_eq!( - p2p::types::Capabilities::from_bits_truncate(0b11111111 as u32), - p2p::types::Capabilities::FULL_NODE + expected, + p2p::types::Capabilities::from_bits_truncate(0b00011111 as u32), ); + assert_eq!( - p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32), - p2p::types::Capabilities::FULL_NODE + expected, + p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32), ); - assert!( - p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32) - .contains(p2p::types::Capabilities::FULL_NODE) + assert!(p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32).contains(expected)); ); assert!( @@ -78,3 +75,13 @@ fn test_capabilities() { .contains(p2p::types::Capabilities::TX_KERNEL_HASH) ); } + +// Default capabilities do not currently include PIBD_HIST +// but it is a supported capability bit flag (currently unused). +#[test] +fn test_pibd_capabilities() { + assert_eq!( + p2p::types::Capabilities::default() | p2p::types::Capabilities::PIBD_HIST, + p2p::types::Capabilities::from_bits_truncate(0b11111111 as u32), + ); +} diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index 8a2da242d3..4801725025 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -527,9 +527,29 @@ where header_cache_size: u64, ) -> Result { let mut hashmap = self.header_cache.lock().unwrap(); + + // Read our sync_head if we are in header_sync. + // If not then we can ignore this batch of headers. + let sync_head = match self.sync_state.status() { + SyncStatus::HeaderSync { sync_head, .. } => sync_head, + _ => { + debug!("headers_received: ignoring as not in header_sync"); + return Ok(true); + } + }; + // try to add headers to our header chain - match self.chain().sync_block_headers(bhs, chain::Options::SYNC) { - Ok(_) => { + match self + .chain() + .sync_block_headers(bhs, sync_head, chain::Options::SYNC) + { + Ok(sync_head) => { + // If we have an updated sync_head after processing this batch of headers + // then update our sync_state so we can request relevant headers in the next batch. + if let Some(sync_head) = sync_head { + self.sync_state.update_header_sync(sync_head); + } + for bh in bhs { let mut tip_processed = self.tip_processed.lock().unwrap(); if *tip_processed < bh.height { diff --git a/servers/src/grin/seed.rs b/servers/src/grin/seed.rs index 16f3e4cbce..6d0521198b 100644 --- a/servers/src/grin/seed.rs +++ b/servers/src/grin/seed.rs @@ -36,7 +36,6 @@ use crate::util::StopState; pub fn connect_and_monitor( p2p_server: Arc, - capabilities: p2p::Capabilities, seed_list: Box Vec + Send>, preferred_peers: &[PeerAddr], stop_state: Arc, @@ -115,7 +114,6 @@ pub fn connect_and_monitor( listen_for_addrs( peers.clone(), p2p_server.clone(), - capabilities, &rx, &mut connecting_history, header_cache_size, @@ -333,7 +331,6 @@ fn connect_to_seeds_and_preferred_peers( fn listen_for_addrs( peers: Arc, p2p: Arc, - capab: p2p::Capabilities, rx: &mpsc::Receiver, connecting_history: &mut HashMap>, header_cache_size: u64, @@ -401,9 +398,12 @@ fn listen_for_addrs( if update_possible { match p2p_c.connect(addr.clone(), header_cache_size) { Ok(p) => { + // If peer advertizes PEER_LIST then ask it for more peers that support PEER_LIST. + // We want to build a local db of possible peers to connect to. + // We do not necessarily care (at this point in time) what other capabilities these peers support. if p.info.capabilities.contains(p2p::Capabilities::PEER_LIST) { debug!("Sending peer request to {}", addr); - if p.send_peer_request(capab).is_ok() { + if p.send_peer_request(p2p::Capabilities::PEER_LIST).is_ok() { match addr { PeerAddr::Onion(_) => { if let Err(_) = libp2p_connection::add_new_peer(&addr) { diff --git a/servers/src/grin/sync/header_sync.rs b/servers/src/grin/sync/header_sync.rs index d5cdbab415..73c0be0fde 100644 --- a/servers/src/grin/sync/header_sync.rs +++ b/servers/src/grin/sync/header_sync.rs @@ -46,16 +46,9 @@ impl HeaderSync { } } - pub fn check_run( - &mut self, - header_head: &chain::Tip, - highest_height: u64, - ) -> Result { - if !self.header_sync_due(header_head) { - return Ok(false); - } - - let enable_header_sync = match self.sync_state.status() { + pub fn check_run(&mut self, sync_head: chain::Tip) -> Result { + // We only want to run header_sync for some sync states. + let do_run = match self.sync_state.status() { SyncStatus::BodySync { .. } | SyncStatus::HeaderSync { .. } | SyncStatus::TxHashsetDone => true, @@ -83,19 +76,41 @@ impl HeaderSync { _ => false, }; - if enable_header_sync { + if !do_run { + return Ok(false); + } + + // TODO - can we safely reuse the peer here across multiple runs? + let sync_peer = self.choose_sync_peer(); + + if let Some(sync_peer) = sync_peer { + let (peer_height, peer_diff) = { + let info = sync_peer.info.live_info.read(); + (info.height, info.total_difficulty) + }; + + // Quick check - nothing to sync if we are caught up with the peer. + if peer_diff <= sync_head.total_difficulty { + return Ok(false); + } + + if !self.header_sync_due(sync_head) { + return Ok(false); + } + self.sync_state.update(SyncStatus::HeaderSync { - current_height: header_head.height, - highest_height: highest_height, + sync_head, + highest_height: peer_height, + highest_diff: peer_diff, }); - self.syncing_peer = self.header_sync(); - return Ok(true); + self.header_sync(sync_head, sync_peer.clone()); + self.syncing_peer = Some(sync_peer.clone()); } - Ok(false) + Ok(true) } - fn header_sync_due(&mut self, header_head: &chain::Tip) -> bool { + fn header_sync_due(&mut self, header_head: chain::Tip) -> bool { let now = Utc::now(); let (timeout, latest_height, prev_height) = self.prev_header_sync; @@ -168,47 +183,49 @@ impl HeaderSync { } } - fn header_sync(&mut self) -> Option> { - if let Ok(header_head) = self.chain.header_head() { - let max_diff = self.peers.max_peer_difficulty(); - let peer = self - .peers + fn choose_sync_peer(&self) -> Option> { + let peers_iter = || { + self.peers .iter() - .outbound() .with_capabilities(Capabilities::HEADER_HIST) - .with_difficulty(|x| x >= max_diff) .connected() - .choose_random(); - if let Some(peer) = peer { - if peer.info.total_difficulty() > header_head.total_difficulty { - return self.request_headers(peer); - } - } + }; + + // Filter peers further based on max difficulty. + let max_diff = peers_iter().max_difficulty().unwrap_or(Difficulty::zero()); + let peers_iter = || peers_iter().with_difficulty(|x| x >= max_diff); + + // Choose a random "most work" peer, preferring outbound if at all possible. + peers_iter().outbound().choose_random().or_else(|| { + warn!("no suitable outbound peer for header sync, considering inbound"); + peers_iter().inbound().choose_random() + }) + } + + fn header_sync(&self, sync_head: chain::Tip, peer: Arc) { + if peer.info.total_difficulty() > sync_head.total_difficulty { + self.request_headers(sync_head, peer); } - return None; } /// Request some block headers from a peer to advance us. - fn request_headers(&mut self, peer: Arc) -> Option> { - if let Ok(locator) = self.get_locator() { + fn request_headers(&self, sync_head: chain::Tip, peer: Arc) { + if let Ok(locator) = self.get_locator(sync_head) { debug!( "sync: request_headers: asking {} for headers, {:?}", peer.info.addr, locator, ); let _ = peer.send_header_request(locator); - return Some(peer); } - return None; } /// We build a locator based on sync_head. /// Even if sync_head is significantly out of date we will "reset" it once we /// start getting headers back from a peer. - fn get_locator(&mut self) -> Result, Error> { - let tip = self.chain.get_sync_head()?; - let heights = get_locator_heights(tip.height); - let locator = self.chain.get_locator_hashes(&heights)?; + fn get_locator(&self, sync_head: chain::Tip) -> Result, Error> { + let heights = get_locator_heights(sync_head.height); + let locator = self.chain.get_locator_hashes(sync_head, &heights)?; Ok(locator) } } diff --git a/servers/src/grin/sync/state_sync.rs b/servers/src/grin/sync/state_sync.rs index d09f8567d7..c385fbc289 100644 --- a/servers/src/grin/sync/state_sync.rs +++ b/servers/src/grin/sync/state_sync.rs @@ -137,19 +137,6 @@ impl StateSync { .set_sync_error(chain::ErrorKind::SyncError(format!("{:?}", e)).into()), } - // to avoid the confusing log, - // update the final HeaderSync state mainly for 'current_height' - self.sync_state.update_if( - SyncStatus::HeaderSync { - current_height: header_head.height, - highest_height, - }, - |s| match s { - SyncStatus::HeaderSync { .. } => true, - _ => false, - }, - ); - self.sync_state .update(SyncStatus::TxHashsetDownload(Default::default())); } diff --git a/servers/src/grin/sync/syncer.rs b/servers/src/grin/sync/syncer.rs index 69a9b04567..edd994f64c 100644 --- a/servers/src/grin/sync/syncer.rs +++ b/servers/src/grin/sync/syncer.rs @@ -193,9 +193,18 @@ impl SyncRunner { let tail = self.chain.tail().unwrap_or_else(|_| head.clone()); let header_head = unwrap_or_restart_loop!(self.chain.header_head()); + // "sync_head" allows us to sync against a large fork on the header chain + // we track this during an extended header sync + let sync_status = self.sync_state.status(); + + let sync_head = match sync_status { + SyncStatus::HeaderSync { sync_head, .. } => sync_head, + _ => header_head, + }; + // run each sync stage, each of them deciding whether they're needed // except for state sync that only runs if body sync return true (means txhashset is needed) - unwrap_or_restart_loop!(header_sync.check_run(&header_head, highest_height)); + unwrap_or_restart_loop!(header_sync.check_run(sync_head)); let mut check_state_sync = false; match self.sync_state.status() { @@ -207,7 +216,7 @@ impl SyncRunner { | SyncStatus::TxHashsetDone => check_state_sync = true, _ => { // skip body sync if header chain is not synced. - if header_head.height < highest_height { + if sync_head.height < highest_height { continue; } diff --git a/src/bin/tui/status.rs b/src/bin/tui/status.rs index 7509a27051..b7f3fe908c 100644 --- a/src/bin/tui/status.rs +++ b/src/bin/tui/status.rs @@ -39,13 +39,14 @@ impl TUIStatusView { SyncStatus::NoSync => Cow::Borrowed("Running"), SyncStatus::AwaitingPeers(_) => Cow::Borrowed("Waiting for peers"), SyncStatus::HeaderSync { - current_height, + sync_head, highest_height, + .. } => { let percent = if highest_height == 0 { 0 } else { - current_height * 100 / highest_height + sync_head.height * 100 / highest_height }; Cow::Owned(format!("Sync step 1/7: Downloading headers: {}%", percent)) } diff --git a/store/src/leaf_set.rs b/store/src/leaf_set.rs index fa80b2bf10..46c00ccc85 100644 --- a/store/src/leaf_set.rs +++ b/store/src/leaf_set.rs @@ -96,7 +96,7 @@ impl LeafSet { /// Only applicable for the output MMR. fn unpruned_pre_cutoff(&self, cutoff_pos: u64, prune_list: &PruneList) -> Bitmap { (1..=cutoff_pos) - .filter(|&x| pmmr::is_leaf(x) && !prune_list.is_pruned(x)) + .filter(|&x| pmmr::is_leaf(x - 1) && !prune_list.is_pruned(x - 1)) .map(|x| x as u32) .collect() } @@ -142,13 +142,13 @@ impl LeafSet { } /// Append a new position to the leaf_set. - pub fn add(&mut self, pos: u64) { - self.bitmap.add(pos as u32); + pub fn add(&mut self, pos0: u64) { + self.bitmap.add(1 + pos0 as u32); } /// Remove the provided position from the leaf_set. - pub fn remove(&mut self, pos: u64) { - self.bitmap.remove(pos as u32); + pub fn remove(&mut self, pos0: u64) { + self.bitmap.remove(1 + pos0 as u32); } /// Saves the utxo file tagged with block hash as filename suffix. @@ -187,8 +187,8 @@ impl LeafSet { } /// Whether the leaf_set includes the provided position. - pub fn includes(&self, pos: u64) -> bool { - self.bitmap.contains(pos as u32) + pub fn includes(&self, pos0: u64) -> bool { + self.bitmap.contains(1 + pos0 as u32) } /// Number of positions stored in the leaf_set. diff --git a/store/src/pmmr.rs b/store/src/pmmr.rs index 9acdf7d07d..3e3b52771e 100644 --- a/store/src/pmmr.rs +++ b/store/src/pmmr.rs @@ -65,7 +65,6 @@ pub struct PMMRBackend { impl Backend for PMMRBackend { /// Append the provided data and hashes to the backend storage. /// Add the new leaf pos to our leaf_set if this is a prunable MMR. - #[allow(unused_variables)] fn append(&mut self, data: &T, hashes: Vec) -> Result<(), String> { let size = self .data_file @@ -81,53 +80,96 @@ impl Backend for PMMRBackend { if self.prunable { // (Re)calculate the latest pos given updated size of data file // and the total leaf_shift, and add to our leaf_set. - let pos = pmmr::insertion_to_pmmr_index(size + self.prune_list.get_total_leaf_shift()); + let pos = + pmmr::insertion_to_pmmr_index(size + self.prune_list.get_total_leaf_shift() - 1); self.leaf_set.add(pos); } Ok(()) } - fn get_from_file(&self, position: u64) -> Option { - if self.is_compacted(position) { + // Supports appending a pruned subtree (single root hash) to an existing hash file. + // Update the prune_list "shift cache" to reflect the new pruned leaf pos in the subtree. + fn append_pruned_subtree(&mut self, hash: Hash, pos0: u64) -> Result<(), String> { + if !self.prunable { + return Err("Not prunable, cannot append pruned subtree.".into()); + } + + self.hash_file + .append(&hash) + .map_err(|e| format!("Failed to append subtree hash to file. {}", e))?; + + self.prune_list.append(pos0); + + Ok(()) + } + + // Supports appending a pruned subtree (single root hash) to an existing hash file. + // Update the prune_list "shift cache" to reflect the new pruned leaf pos in the subtree. + fn append_pruned_subtree(&mut self, hash: Hash, pos: u64) -> Result<(), String> { + if !self.prunable { + return Err("Not prunable, cannot append pruned subtree.".into()); + } + + self.hash_file + .append(&hash) + .map_err(|e| format!("Failed to append subtree hash to file. {}", e))?; + + self.prune_list.append(pos); + + Ok(()) + } + + fn get_from_file(&self, pos0: u64) -> Option { + if self.is_compacted(pos0) { return None; } + let shift = self.prune_list.get_shift(pos0); + self.hash_file.read(1 + pos0 - shift) + } + + fn get_peak_from_file(&self, pos0: u64) -> Option { + let shift = self.prune_list.get_shift(pos0); + self.hash_file.read(1 + pos0 - shift) + } + + fn get_peak_from_file(&self, position: u64) -> Option { let shift = self.prune_list.get_shift(position); self.hash_file.read(position - shift) } - fn get_data_from_file(&self, position: u64) -> Option { - if !pmmr::is_leaf(position) { + fn get_data_from_file(&self, pos0: u64) -> Option { + if !pmmr::is_leaf(pos0) { return None; } - if self.is_compacted(position) { + if self.is_compacted(pos0) { return None; } - let flatfile_pos = pmmr::n_leaves(position); - let shift = self.prune_list.get_leaf_shift(position); + let flatfile_pos = pmmr::n_leaves(pos0 + 1); + let shift = self.prune_list.get_leaf_shift(1 + pos0); self.data_file.read(flatfile_pos - shift) } /// Get the hash at pos. /// Return None if pos is a leaf and it has been removed (or pruned or /// compacted). - fn get_hash(&self, pos: u64) -> Option { - if self.prunable && pmmr::is_leaf(pos) && !self.leaf_set.includes(pos) { + fn get_hash(&self, pos0: u64) -> Option { + if self.prunable && pmmr::is_leaf(pos0) && !self.leaf_set.includes(pos0) { return None; } - self.get_from_file(pos) + self.get_from_file(pos0) } /// Get the data at pos. /// Return None if it has been removed or if pos is not a leaf node. - fn get_data(&self, pos: u64) -> Option { - if !pmmr::is_leaf(pos) { + fn get_data(&self, pos0: u64) -> Option { + if !pmmr::is_leaf(pos0) { return None; } - if self.prunable && !self.leaf_set.includes(pos) { + if self.prunable && !self.leaf_set.includes(pos0) { return None; } - self.get_data_from_file(pos) + self.get_data_from_file(pos0) } /// Returns an iterator over all the leaf positions. @@ -135,7 +177,7 @@ impl Backend for PMMRBackend { /// For a non-prunable PMMR this is *all* leaves (this is not yet implemented). fn leaf_pos_iter(&self) -> Box + '_> { if self.prunable { - Box::new(self.leaf_set.iter()) + Box::new(self.leaf_set.iter().map(|x| x - 1)) } else { panic!("leaf_pos_iter not implemented for non-prunable PMMR") } @@ -157,7 +199,7 @@ impl Backend for PMMRBackend { // iterate, skipping everything prior to this // pass in from_idx=0 then we want to convert to pos=1 - let from_pos = pmmr::insertion_to_pmmr_index(from_idx + 1); + let from_pos = 1 + pmmr::insertion_to_pmmr_index(from_idx); if self.prunable { Box::new( @@ -179,21 +221,29 @@ impl Backend for PMMRBackend { } // Rewind the hash file accounting for pruned/compacted pos - let shift = self.prune_list.get_shift(position); + let shift = if position == 0 { + 0 + } else { + self.prune_list.get_shift(position - 1) + }; self.hash_file.rewind(position - shift); // Rewind the data file accounting for pruned/compacted pos let flatfile_pos = pmmr::n_leaves(position); - let leaf_shift = self.prune_list.get_leaf_shift(position); + let leaf_shift = if position == 0 { + 0 + } else { + self.prune_list.get_leaf_shift(position) + }; self.data_file.rewind(flatfile_pos - leaf_shift); Ok(()) } /// Remove by insertion position. - fn remove(&mut self, pos: u64) -> Result<(), String> { + fn remove(&mut self, pos0: u64) -> Result<(), String> { assert!(self.prunable, "Remove on non-prunable MMR"); - self.leaf_set.remove(pos); + self.leaf_set.remove(pos0); Ok(()) } @@ -282,16 +332,23 @@ impl PMMRBackend { }) } - fn is_pruned(&self, pos: u64) -> bool { - self.prune_list.is_pruned(pos) + fn is_pruned(&self, pos0: u64) -> bool { + self.prune_list.is_pruned(pos0) } - fn is_pruned_root(&self, pos: u64) -> bool { - self.prune_list.is_pruned_root(pos) + fn is_pruned_root(&self, pos0: u64) -> bool { + self.prune_list.is_pruned_root(pos0) } - fn is_compacted(&self, pos: u64) -> bool { - self.is_pruned(pos) && !self.is_pruned_root(pos) + // Check if pos is pruned but not a pruned root itself. + // Checking for pruned root is faster so we do this check first. + // We can do a fast initial check as well - + // if its in the current leaf_set then we know it is not compacted. + fn is_compacted(&self, pos0: u64) -> bool { + if self.leaf_set.includes(pos0) { + return false; + } + !self.is_pruned_root(pos0) && self.is_pruned(pos0) } /// Number of hashes in the PMMR stored by this backend. Only produces the @@ -360,9 +417,9 @@ impl PMMRBackend { // 1. Save compact copy of the hash file, skipping removed data. { - let pos_to_rm = map_vec!(pos_to_rm, |pos| { - let shift = self.prune_list.get_shift(pos.into()); - pos as u64 - shift + let pos_to_rm = map_vec!(pos_to_rm, |pos1| { + let shift = self.prune_list.get_shift(pos1 as u64 - 1); + pos1 as u64 - shift }); self.hash_file.save_prune(&pos_to_rm)?; @@ -372,8 +429,8 @@ impl PMMRBackend { { let leaf_pos_to_rm = pos_to_rm .iter() - .filter(|&x| pmmr::is_leaf(x.into())) .map(|x| x as u64) + .filter(|x| pmmr::is_leaf(x - 1)) .collect::>(); let pos_to_rm = map_vec!(leaf_pos_to_rm, |&pos| { @@ -387,9 +444,9 @@ impl PMMRBackend { // 3. Update the prune list and write to disk. { - for pos in leaves_removed.iter() { - self.prune_list.add(pos.into()); - } + let mut bitmap = self.prune_list.bitmap(); + bitmap.or_inplace(&leaves_removed); + self.prune_list = PruneList::new(Some(self.data_dir.join(PMMR_PRUN_FILE)), bitmap); self.prune_list.flush()?; } @@ -420,19 +477,19 @@ impl PMMRBackend { expanded.add(x); let mut current = x as u64; loop { - let (parent, sibling) = family(current); - let sibling_pruned = self.is_pruned_root(sibling); + let (parent0, sibling0) = family(current - 1); + let sibling_pruned = self.is_pruned_root(sibling0); // if sibling previously pruned // push it back onto list of pos to remove // so we can remove it and traverse up to parent if sibling_pruned { - expanded.add(sibling as u32); + expanded.add(1 + sibling0 as u32); } - if sibling_pruned || expanded.contains(sibling as u32) { - expanded.add(parent as u32); - current = parent; + if sibling_pruned || expanded.contains(1 + sibling0 as u32) { + expanded.add(1 + parent0 as u32); + current = 1 + parent0; } else { break; } @@ -448,8 +505,8 @@ fn removed_excl_roots(removed: &Bitmap) -> Bitmap { removed .iter() .filter(|pos| { - let (parent_pos, _) = family(*pos as u64); - removed.contains(parent_pos as u32) + let (parent_pos0, _) = family(*pos as u64 - 1); + removed.contains(1 + parent_pos0 as u32) }) .collect() } diff --git a/store/src/prune_list.rs b/store/src/prune_list.rs index 555b11552a..f76ca7a70d 100644 --- a/store/src/prune_list.rs +++ b/store/src/prune_list.rs @@ -21,13 +21,18 @@ //! must be shifted the appropriate amount when reading from the hash and data //! files. -use std::io::{self, Write}; use std::path::{Path, PathBuf}; +use std::{ + io::{self, Write}, + ops::Range, +}; use croaring::{Bitmap, Portable}; +use grin_core::core::pmmr; -use crate::core::core::pmmr::{bintree_postorder_height, family, path}; +use crate::core::core::pmmr::{bintree_leftmost, bintree_postorder_height, family}; use crate::{read_bitmap, save_via_temp_file}; +use std::cmp::min; /// Maintains a list of previously pruned nodes in PMMR, compacting the list as /// parents get pruned and allowing checking whether a leaf is pruned. Given @@ -40,29 +45,33 @@ use crate::{read_bitmap, save_via_temp_file}; /// but positions of a node within the PMMR will not match positions in the /// backend storage anymore. The PruneList accounts for that mismatch and does /// the position translation. +#[derive(Debug)] pub struct PruneList { path: Option, /// Bitmap representing pruned root node positions. bitmap: Bitmap, - /// Bitmap representing all pruned node positions (everything under the pruned roots). - pruned_cache: Bitmap, shift_cache: Vec, leaf_shift_cache: Vec, } impl PruneList { - /// Instantiate a new prune list from the provided path and bitmap. - pub fn new(path: Option, mut bitmap: Bitmap) -> PruneList { - // Note: prune list is 1-indexed so remove any 0 value for safety. - bitmap.remove(0); - - PruneList { + /// Instantiate a new prune list from the provided path and 1-based bitmap. + /// Note: Does not flush the bitmap to disk. Caller is responsible for doing this. + pub fn new(path: Option, bitmap: Bitmap) -> PruneList { + assert!(!bitmap.contains(0)); + let mut prune_list = PruneList { path, - bitmap, - pruned_cache: Bitmap::new(), + bitmap: Bitmap::new(), shift_cache: vec![], leaf_shift_cache: vec![], + }; + + for pos1 in bitmap.iter() { + prune_list.append(pos1 as u64 - 1) } + + prune_list.bitmap.run_optimize(); + prune_list } /// Instatiate a new empty prune list. @@ -71,6 +80,7 @@ impl PruneList { } /// Open an existing prune_list or create a new one. + /// Takes an optional bitmap of new pruned pos to be combined with existing pos. pub fn open>(path: P) -> io::Result { let file_path = PathBuf::from(path.as_ref()); let bitmap = if file_path.exists() { @@ -78,18 +88,18 @@ impl PruneList { } else { Bitmap::new() }; + assert!(!bitmap.contains(0)); let mut prune_list = PruneList::new(Some(file_path), bitmap); - // Now built the shift and pruned caches from the bitmap we read from disk. + // Now build the shift caches from the bitmap we read from disk prune_list.init_caches(); if !prune_list.bitmap.is_empty() { - debug!("bitmap {} pos ({} bytes), pruned_cache {} pos ({} bytes), shift_cache {}, leaf_shift_cache {}", + debug!( + "bitmap {} pos ({} bytes), shift_cache {}, leaf_shift_cache {}", prune_list.bitmap.cardinality(), prune_list.bitmap.get_serialized_size_in_bytes::(), - prune_list.pruned_cache.cardinality(), - prune_list.pruned_cache.get_serialized_size_in_bytes::(), prune_list.shift_cache.len(), prune_list.leaf_shift_cache.len(), ); @@ -102,12 +112,9 @@ impl PruneList { pub fn init_caches(&mut self) { self.build_shift_cache(); self.build_leaf_shift_cache(); - self.build_pruned_cache(); } /// Save the prune_list to disk. - /// Clears out leaf pos before saving to disk - /// as we track these via the leaf_set. pub fn flush(&mut self) -> io::Result<()> { // Run the optimization step on the bitmap. self.bitmap.run_optimize(); @@ -119,58 +126,45 @@ impl PruneList { })?; } - // Rebuild our "shift caches" here as we are flushing changes to disk - // and the contents of our prune_list has likely changed. - self.init_caches(); - Ok(()) } /// Return the total shift from all entries in the prune_list. /// This is the shift we need to account for when adding new entries to our PMMR. pub fn get_total_shift(&self) -> u64 { - self.get_shift(self.bitmap.maximum().unwrap_or(0) as u64) + self.get_shift(self.bitmap.maximum().unwrap_or(1) as u64 - 1) } /// Return the total leaf_shift from all entries in the prune_list. /// This is the leaf_shift we need to account for when adding new entries to our PMMR. pub fn get_total_leaf_shift(&self) -> u64 { - self.get_leaf_shift(self.bitmap.maximum().unwrap_or(0) as u64) + self.get_leaf_shift(self.bitmap.maximum().unwrap_or(1) as u64 - 1) } /// Computes by how many positions a node at pos should be shifted given the /// number of nodes that have already been pruned before it. /// Note: the node at pos may be pruned and may be compacted away itself and /// the caller needs to be aware of this. - pub fn get_shift(&self, pos: u64) -> u64 { - if self.bitmap.is_empty() { - return 0; - } - - let idx = self.bitmap.rank(pos as u32); + pub fn get_shift(&self, pos0: u64) -> u64 { + let idx = self.bitmap.rank(1 + pos0 as u32); if idx == 0 { return 0; } - - if idx > self.shift_cache.len() as u64 { - self.shift_cache[self.shift_cache.len().saturating_sub(1)] - } else { - self.shift_cache[(idx as usize).saturating_sub(1)] - } + self.shift_cache[min(idx as usize, self.shift_cache.len()) - 1] } fn build_shift_cache(&mut self) { - if self.bitmap.is_empty() { - return; - } - self.shift_cache.clear(); - for pos in self.bitmap.iter().filter(|x| *x > 0) { - let pos = pos as u64; - let prev_shift = self.get_shift(pos.saturating_sub(1)); + for pos1 in self.bitmap.iter() { + let pos0 = pos1 as u64 - 1; + let prev_shift = if pos0 == 0 { + 0 + } else { + self.get_shift(pos0 - 1) + }; - let curr_shift = if self.is_pruned_root(pos) { - let height = bintree_postorder_height(pos); + let curr_shift = if self.is_pruned_root(pos0) { + let height = bintree_postorder_height(pos0); 2 * ((1 << height) - 1) } else { 0 @@ -180,39 +174,45 @@ impl PruneList { } } + // Calculate the next shift based on provided pos and the previous shift. + fn calculate_next_shift(&self, pos0: u64) -> u64 { + let prev_shift = if pos0 == 0 { + 0 + } else { + self.get_shift(pos0 - 1) + }; + let shift = if self.is_pruned_root(pos0) { + let height = bintree_postorder_height(pos0); + 2 * ((1 << height) - 1) + } else { + 0 + }; + prev_shift + shift + } + /// As above, but only returning the number of leaf nodes to skip for a /// given leaf. Helpful if, for instance, data for each leaf is being stored /// separately in a continuous flat-file. - pub fn get_leaf_shift(&self, pos: u64) -> u64 { - if self.bitmap.is_empty() { - return 0; - } - - let idx = self.bitmap.rank(pos as u32); + pub fn get_leaf_shift(&self, pos0: u64) -> u64 { + let idx = self.bitmap.rank(1 + pos0 as u32); if idx == 0 { return 0; } - - if idx > self.leaf_shift_cache.len() as u64 { - self.leaf_shift_cache[self.leaf_shift_cache.len().saturating_sub(1)] - } else { - self.leaf_shift_cache[(idx as usize).saturating_sub(1)] - } + self.leaf_shift_cache[min(idx as usize, self.leaf_shift_cache.len()) - 1] } fn build_leaf_shift_cache(&mut self) { - if self.bitmap.is_empty() { - return; - } - self.leaf_shift_cache.clear(); + for pos1 in self.bitmap.iter() { + let pos0 = pos1 as u64 - 1; + let prev_shift = if pos0 == 0 { + 0 + } else { + self.get_leaf_shift(pos0 - 1) + }; - for pos in self.bitmap.iter().filter(|x| *x > 0) { - let pos = pos as u64; - let prev_shift = self.get_leaf_shift(pos.saturating_sub(1)); - - let curr_shift = if self.is_pruned_root(pos) { - let height = bintree_postorder_height(pos); + let curr_shift = if self.is_pruned_root(pos0) { + let height = bintree_postorder_height(pos0); if height == 0 { 0 } else { @@ -226,25 +226,87 @@ impl PruneList { } } - /// Push the node at the provided position in the prune list. Compacts the - /// list if pruning the additional node means a parent can get pruned as - /// well. - pub fn add(&mut self, pos: u64) { - assert!(pos > 0, "prune list 1-indexed, 0 not valid pos"); - - let mut current = pos; - loop { - let (parent, sibling) = family(current); - - if self.bitmap.contains(sibling as u32) || self.pruned_cache.contains(sibling as u32) { - self.pruned_cache.add(current as u32); - self.bitmap.remove(sibling as u32); - current = parent; + // Calculate the next leaf shift based on provided pos and the previous leaf shift. + fn calculate_next_leaf_shift(&self, pos0: u64) -> u64 { + let prev_shift = if pos0 == 0 { + 0 + } else { + self.get_leaf_shift(pos0 - 1) + }; + let shift = if self.is_pruned_root(pos0) { + let height = bintree_postorder_height(pos0); + if height == 0 { + 0 } else { - self.pruned_cache.add(current as u32); - self.bitmap.add(current as u32); - break; + 1 << height } + } else { + 0 + }; + prev_shift + shift + } + + // Remove any existing entries in shift_cache and leaf_shift_cache + // for any pos contained in the subtree with provided root. + fn cleanup_subtree(&mut self, pos0: u64) { + let lc0 = bintree_leftmost(pos0) as u32; + let size = self.bitmap.maximum().unwrap_or(0); + + // If this subtree does not intersect with existing bitmap then nothing to cleanup. + if lc0 >= size { + return; + } + + // Note: We will treat this as a "closed range" below (croaring api weirdness). + let cleanup_pos1 = (lc0 + 1)..size; + + // Find point where we can truncate based on bitmap "rank" (index) of pos to the left of subtree. + let idx = self.bitmap.rank(lc0); + self.shift_cache.truncate(idx as usize); + self.leaf_shift_cache.truncate(idx as usize); + + self.bitmap.remove_range_closed(cleanup_pos1) + } + + /// Push the node at the provided position in the prune list. + /// Assumes rollup of siblings and children has already been handled. + fn append_single(&mut self, pos0: u64) { + assert!( + pos0 >= self.bitmap.maximum().unwrap_or(0) as u64, + "prune list append only" + ); + + // Add this pos to the bitmap (leaf or subtree root) + self.bitmap.add(1 + pos0 as u32); + + // Calculate shift and leaf_shift for this pos. + self.shift_cache.push(self.calculate_next_shift(pos0)); + self.leaf_shift_cache + .push(self.calculate_next_leaf_shift(pos0)); + } + + /// Push the node at the provided position in the prune list. + /// Handles rollup of siblings and children as we go (relatively slow). + /// Once we find a subtree root that can not be rolled up any further + /// we cleanup everything beneath it and replace it with a single appended node. + pub fn append(&mut self, pos0: u64) { + let max = self.bitmap.maximum().unwrap_or(0) as u64; + assert!( + pos0 >= max, + "prune list append only - pos={} bitmap.maximum={}", + pos0, + max + ); + + let (parent0, sibling0) = family(pos0); + if self.is_pruned(sibling0) { + // Recursively append the parent (removing our sibling in the process). + self.append(parent0) + } else { + // Make sure we roll anything beneath this up into this higher level pruned subtree root. + // We should have no nested entries in the prune_list. + self.cleanup_subtree(pos0); + self.append_single(pos0); } } @@ -258,36 +320,196 @@ impl PruneList { self.bitmap.is_empty() } + /// A pos is pruned if it is a pruned root directly or if it is + /// beneath the "next" pruned subtree. + /// We only need to consider the "next" subtree due to the append-only MMR structure. + pub fn is_pruned(&self, pos0: u64) -> bool { + if self.is_pruned_root(pos0) { + return true; + } + let rank = self.bitmap.rank(1 + pos0 as u32); + if let Some(root) = self.bitmap.select(rank as u32) { + let range = pmmr::bintree_range(root as u64 - 1); + range.contains(&pos0) + } else { + false + } + } + /// Convert the prune_list to a vec of pos. pub fn to_vec(&self) -> Vec { self.bitmap.iter().map(|x| x as u64).collect() } - /// Is the pos pruned? - /// Assumes the pruned_cache is fully built and up to date. - pub fn is_pruned(&self, pos: u64) -> bool { - assert!(pos > 0, "prune list 1-indexed, 0 not valid pos"); - self.pruned_cache.contains(pos as u32) + /// Internal shift cache as slice. + /// only used in store/tests/prune_list.rs tests + pub fn shift_cache(&self) -> &[u64] { + self.shift_cache.as_slice() } - fn build_pruned_cache(&mut self) { - if self.bitmap.is_empty() { - return; + /// Internal leaf shift cache as slice. + pub fn leaf_shift_cache(&self) -> &[u64] { + self.leaf_shift_cache.as_slice() + } + + /// Convert the prune_list to a vec of pos. + pub fn to_vec(&self) -> Vec { + self.bitmap.iter().map(|x| x as u64).collect() + } + + /// Internal shift cache as slice. + pub fn shift_cache(&self) -> &[u64] { + self.shift_cache.as_slice() + } + + /// Internal leaf shift cache as slice. + /// only used in store/tests/prune_list.rs tests + pub fn leaf_shift_cache(&self) -> &[u64] { + self.leaf_shift_cache.as_slice() + } + + /// Is the specified position a root of a pruned subtree? + pub fn is_pruned_root(&self, pos0: u64) -> bool { + self.bitmap.contains(1 + pos0 as u32) + } + + /// Iterator over the entries in the prune list (pruned roots). + pub fn iter(&self) -> impl Iterator + '_ { + self.bitmap.iter().map(|x| x as u64) + } + + /// Iterator over the pruned "bintree range" for each pruned root. + pub fn pruned_bintree_range_iter(&self) -> impl Iterator> + '_ { + self.iter().map(|x| { + let rng = pmmr::bintree_range(x - 1); + (1 + rng.start)..(1 + rng.end) + }) + } + + /// Iterator over all pos that are *not* pruned based on current prune_list. + pub fn unpruned_iter(&self, cutoff_pos: u64) -> impl Iterator + '_ { + UnprunedIterator::new(self.pruned_bintree_range_iter()) + .take_while(move |x| *x <= cutoff_pos) + } + + /// Iterator over all leaf pos that are *not* pruned based on current prune_list. + /// Note this is not necessarily the same as the "leaf_set" as an output + /// can be spent but not yet pruned. + pub fn unpruned_leaf_iter(&self, cutoff_pos: u64) -> impl Iterator + '_ { + self.unpruned_iter(cutoff_pos) + .filter(|x| pmmr::is_leaf(*x - 1)) + } + + /// Return a clone of our internal bitmap. + pub fn bitmap(&self) -> Bitmap { + self.bitmap.clone() + } + + /// Iterator over the entries in the prune list (pruned roots). + pub fn iter(&self) -> impl Iterator + '_ { + self.bitmap.iter().map(|x| x as u64) + } + + /// Iterator over the pruned "bintree range" for each pruned root. + pub fn pruned_bintree_range_iter(&self) -> impl Iterator> + '_ { + self.iter().map(|x| pmmr::bintree_range(x)) + } + + /// Iterator over all pos that are *not* pruned based on current prune_list. + pub fn unpruned_iter(&self, cutoff_pos: u64) -> impl Iterator + '_ { + UnprunedIterator::new(self.pruned_bintree_range_iter()) + .take_while(move |x| *x <= cutoff_pos) + } + + /// Iterator over all leaf pos that are *not* pruned based on current prune_list. + /// Note this is not necessarily the same as the "leaf_set" as an output + /// can be spent but not yet pruned. + pub fn unpruned_leaf_iter(&self, cutoff_pos: u64) -> impl Iterator + '_ { + self.unpruned_iter(cutoff_pos).filter(|x| pmmr::is_leaf(*x)) + } + + /// Return a clone of our internal bitmap. + pub fn bitmap(&self) -> Bitmap { + self.bitmap.clone() + } +} + +struct UnprunedIterator { + inner: I, + current_excl_range: Option>, + current_pos: u64, +} + +impl>> UnprunedIterator { + fn new(mut inner: I) -> UnprunedIterator { + let current_excl_range = inner.next(); + UnprunedIterator { + inner, + current_excl_range, + current_pos: 1, } - let maximum = self.bitmap.maximum().unwrap_or(0); - self.pruned_cache = Bitmap::with_container_capacity(maximum); - for pos in 1..(maximum + 1) { - let pruned = path(pos as u64, maximum as u64).any(|x| self.bitmap.contains(x as u32)); - if pruned { - self.pruned_cache.add(pos as u32) + } +} + +impl>> Iterator for UnprunedIterator { + type Item = u64; + + fn next(&mut self) -> Option { + if let Some(range) = &self.current_excl_range { + if self.current_pos < range.start { + let next = self.current_pos; + self.current_pos += 1; + Some(next) + } else { + // skip the entire excluded range, moving to next excluded range as necessary + self.current_pos = range.end; + self.current_excl_range = self.inner.next(); + self.next() } + } else { + let next = self.current_pos; + self.current_pos += 1; + Some(next) } - self.pruned_cache.run_optimize(); } +} - /// Is the specified position a root of a pruned subtree? - pub fn is_pruned_root(&self, pos: u64) -> bool { - assert!(pos > 0, "prune list 1-indexed, 0 not valid pos"); - self.bitmap.contains(pos as u32) +struct UnprunedIterator { + inner: I, + current_excl_range: Option>, + current_pos: u64, +} + +impl>> UnprunedIterator { + fn new(mut inner: I) -> UnprunedIterator { + let current_excl_range = inner.next(); + UnprunedIterator { + inner, + current_excl_range, + current_pos: 1, + } + } +} + +impl>> Iterator for UnprunedIterator { + type Item = u64; + + fn next(&mut self) -> Option { + if let Some(range) = &self.current_excl_range { + if self.current_pos < range.start { + let next = self.current_pos; + self.current_pos += 1; + Some(next) + } else { + // skip the entire excluded range, moving to next excluded range as necessary + self.current_pos = range.end; + self.current_excl_range = self.inner.next(); + self.next() + } + } else { + let next = self.current_pos; + self.current_pos += 1; + Some(next) + } } } diff --git a/store/src/types.rs b/store/src/types.rs index db7709d897..9980534065 100644 --- a/store/src/types.rs +++ b/store/src/types.rs @@ -289,7 +289,7 @@ where let offset = if next_pos == 0 { 0 } else { - let prev_entry = size_file.read_as_elmt(next_pos.saturating_sub(1))?; + let prev_entry = size_file.read_as_elmt(next_pos - 1)?; prev_entry.offset + prev_entry.size as u64 }; size_file.append_elmt(&SizeEntry { @@ -354,8 +354,7 @@ where if self.buffer_start_pos == 0 { file.set_len(0)?; } else { - let (offset, size) = - self.offset_and_size(self.buffer_start_pos.saturating_sub(1))?; + let (offset, size) = self.offset_and_size(self.buffer_start_pos - 1)?; file.set_len(offset + size as u64)?; }; } diff --git a/store/tests/pmmr.rs b/store/tests/pmmr.rs index 1c0b1b32b1..97e5d9ffa5 100644 --- a/store/tests/pmmr.rs +++ b/store/tests/pmmr.rs @@ -22,7 +22,7 @@ use chrono::prelude::Utc; use croaring::Bitmap; use crate::core::core::hash::DefaultHashable; -use crate::core::core::pmmr::{Backend, PMMR}; +use crate::core::core::pmmr::{Backend, ReadablePMMR, PMMR}; use crate::core::ser::{ Error, PMMRIndexHashable, PMMRable, ProtocolVersion, Readable, Reader, Writeable, Writer, }; @@ -46,7 +46,7 @@ fn pmmr_leaf_idx_iter() { // The first 5 leaves [0,1,2,3,4] are at pos [1,2,4,5,8] in the MMR. assert_eq!(leaf_idx, vec![0, 1, 2, 3, 4]); - assert_eq!(leaf_pos, vec![1, 2, 4, 5, 8]); + assert_eq!(leaf_pos, vec![0, 1, 3, 4, 7]); } } teardown(data_dir); @@ -73,12 +73,12 @@ fn pmmr_append() { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); assert_eq!(pmmr.n_unpruned_leaves(), 4); - assert_eq!(pmmr.get_data(1), Some(elems[0])); - assert_eq!(pmmr.get_data(2), Some(elems[1])); + assert_eq!(pmmr.get_data(0), Some(elems[0])); + assert_eq!(pmmr.get_data(1), Some(elems[1])); - assert_eq!(pmmr.get_hash(1), Some(pos_0)); - assert_eq!(pmmr.get_hash(2), Some(pos_1)); - assert_eq!(pmmr.get_hash(3), Some(pos_2)); + assert_eq!(pmmr.get_hash(0), Some(pos_0)); + assert_eq!(pmmr.get_hash(1), Some(pos_1)); + assert_eq!(pmmr.get_hash(2), Some(pos_2)); } // adding the rest and sync again @@ -111,22 +111,22 @@ fn pmmr_append() { assert_eq!(pmmr.n_unpruned_leaves(), 9); // First pair of leaves. - assert_eq!(pmmr.get_data(1), Some(elems[0])); - assert_eq!(pmmr.get_data(2), Some(elems[1])); + assert_eq!(pmmr.get_data(0), Some(elems[0])); + assert_eq!(pmmr.get_data(1), Some(elems[1])); // Second pair of leaves. - assert_eq!(pmmr.get_data(4), Some(elems[2])); - assert_eq!(pmmr.get_data(5), Some(elems[3])); + assert_eq!(pmmr.get_data(3), Some(elems[2])); + assert_eq!(pmmr.get_data(4), Some(elems[3])); // Third pair of leaves. - assert_eq!(pmmr.get_data(8), Some(elems[4])); - assert_eq!(pmmr.get_data(9), Some(elems[5])); - assert_eq!(pmmr.get_hash(10), Some(pos_9)); + assert_eq!(pmmr.get_data(7), Some(elems[4])); + assert_eq!(pmmr.get_data(8), Some(elems[5])); + assert_eq!(pmmr.get_hash(9), Some(pos_9)); } // check the resulting backend store and the computation of the root let node_hash = elems[0].hash_with_index(0); - assert_eq!(backend.get_hash(1).unwrap(), node_hash); + assert_eq!(backend.get_hash(0).unwrap(), node_hash); { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); @@ -154,22 +154,22 @@ fn pmmr_compact_leaf_sibling() { // pos 1 and 2 are leaves (and siblings) // the parent is pos 3 - let (pos_1_hash, pos_2_hash, pos_3_hash) = { + let (pos_0_hash, pos_1_hash, pos_2_hash) = { let pmmr = PMMR::at(&mut backend, mmr_size); ( + pmmr.get_hash(0).unwrap(), pmmr.get_hash(1).unwrap(), pmmr.get_hash(2).unwrap(), - pmmr.get_hash(3).unwrap(), ) }; // prune pos 1 { let mut pmmr = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); + pmmr.prune(0).unwrap(); // prune pos 8 as well to push the remove list past the cutoff - pmmr.prune(8).unwrap(); + pmmr.prune(7).unwrap(); } backend.sync().unwrap(); @@ -179,36 +179,36 @@ fn pmmr_compact_leaf_sibling() { assert_eq!(pmmr.n_unpruned_leaves(), 17); - // check that pos 1 is "removed" - assert_eq!(pmmr.get_hash(1), None); + // check that pos 0 is "removed" + assert_eq!(pmmr.get_hash(0), None); - // check that pos 2 and 3 are unchanged + // check that pos 1 and 2 are unchanged + assert_eq!(pmmr.get_hash(1).unwrap(), pos_1_hash); assert_eq!(pmmr.get_hash(2).unwrap(), pos_2_hash); - assert_eq!(pmmr.get_hash(3).unwrap(), pos_3_hash); } - // check we can still retrieve the "removed" element at pos 1 + // check we can still retrieve the "removed" element at pos 0 // from the backend hash file. - assert_eq!(backend.get_from_file(1).unwrap(), pos_1_hash); + assert_eq!(backend.get_from_file(0).unwrap(), pos_0_hash); // aggressively compact the PMMR files backend.check_compact(1, &Bitmap::new()).unwrap(); - // check pos 1, 2, 3 are in the state we expect after compacting + // check pos 0, 1, 2 are in the state we expect after compacting { let pmmr = PMMR::at(&mut backend, mmr_size); - // check that pos 1 is "removed" - assert_eq!(pmmr.get_hash(1), None); + // check that pos 0 is "removed" + assert_eq!(pmmr.get_hash(0), None); - // check that pos 2 and 3 are unchanged + // check that pos 1 and 2 are unchanged + assert_eq!(pmmr.get_hash(1).unwrap(), pos_1_hash); assert_eq!(pmmr.get_hash(2).unwrap(), pos_2_hash); - assert_eq!(pmmr.get_hash(3).unwrap(), pos_3_hash); } // Check we can still retrieve the "removed" hash at pos 1 from the hash file. // It should still be available even after pruning and compacting. - assert_eq!(backend.get_from_file(1).unwrap(), pos_1_hash); + assert_eq!(backend.get_from_file(0).unwrap(), pos_0_hash); } teardown(data_dir); @@ -235,9 +235,9 @@ fn pmmr_prune_compact() { // pruning some choice nodes { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); + pmmr.prune(0).unwrap(); + pmmr.prune(3).unwrap(); pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); } backend.sync().unwrap(); @@ -246,9 +246,9 @@ fn pmmr_prune_compact() { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); assert_eq!(root, pmmr.root().unwrap()); // check we can still retrieve same element from leaf index 2 - assert_eq!(pmmr.get_data(2).unwrap(), TestElem(2)); + assert_eq!(pmmr.get_data(1).unwrap(), TestElem(2)); // and the same for leaf index 7 - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + assert_eq!(pmmr.get_data(10).unwrap(), TestElem(7)); } // compact @@ -258,8 +258,8 @@ fn pmmr_prune_compact() { { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); assert_eq!(root, pmmr.root().unwrap()); - assert_eq!(pmmr.get_data(2).unwrap(), TestElem(2)); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + assert_eq!(pmmr.get_data(1).unwrap(), TestElem(2)); + assert_eq!(pmmr.get_data(10).unwrap(), TestElem(7)); } } @@ -279,9 +279,9 @@ fn pmmr_reload() { let mmr_size = load(0, &elems[..], &mut backend); // retrieve entries from the hash file for comparison later + let pos_2_hash = backend.get_hash(2).unwrap(); let pos_3_hash = backend.get_hash(3).unwrap(); let pos_4_hash = backend.get_hash(4).unwrap(); - let pos_5_hash = backend.get_hash(5).unwrap(); // save the root let root = { @@ -296,7 +296,7 @@ fn pmmr_reload() { // prune a node so we have prune data { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); + pmmr.prune(0).unwrap(); } backend.sync().unwrap(); assert_eq!(backend.unpruned_size(), mmr_size); @@ -310,8 +310,8 @@ fn pmmr_reload() { // prune another node to force compact to actually do something { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(4).unwrap(); - pmmr.prune(2).unwrap(); + pmmr.prune(3).unwrap(); + pmmr.prune(1).unwrap(); } backend.sync().unwrap(); assert_eq!(backend.unpruned_size(), mmr_size); @@ -324,7 +324,7 @@ fn pmmr_reload() { // prune some more to get rm log data { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(5).unwrap(); + pmmr.prune(4).unwrap(); } backend.sync().unwrap(); assert_eq!(backend.unpruned_size(), mmr_size); @@ -342,29 +342,29 @@ fn pmmr_reload() { assert_eq!(root, pmmr.root().unwrap()); } - // pos 1 and pos 2 are both removed (via parent pos 3 in prune list) + // pos 0 and pos 1 are both removed (via parent pos 2 in prune list) + assert_eq!(backend.get_hash(0), None); assert_eq!(backend.get_hash(1), None); - assert_eq!(backend.get_hash(2), None); - // pos 3 is "removed" but we keep the hash around for root of pruned subtree - assert_eq!(backend.get_hash(3), Some(pos_3_hash)); + // pos 2 is "removed" but we keep the hash around for root of pruned subtree + assert_eq!(backend.get_hash(2), Some(pos_2_hash)); - // pos 4 is removed (via prune list) + // pos 3 is removed (via prune list) + assert_eq!(backend.get_hash(3), None); + // pos 4 is removed (via leaf_set) assert_eq!(backend.get_hash(4), None); - // pos 5 is removed (via leaf_set) - assert_eq!(backend.get_hash(5), None); // now check contents of the hash file - // pos 1 and pos 2 are no longer in the hash file + // pos 0 and pos 1 are no longer in the hash file + assert_eq!(backend.get_from_file(0), None); assert_eq!(backend.get_from_file(1), None); - assert_eq!(backend.get_from_file(2), None); - // pos 3 is still in there - assert_eq!(backend.get_from_file(3), Some(pos_3_hash)); + // pos 2 is still in there + assert_eq!(backend.get_from_file(2), Some(pos_2_hash)); - // pos 4 and pos 5 are also still in there + // pos 3 and pos 4 are also still in there + assert_eq!(backend.get_from_file(3), Some(pos_3_hash)); assert_eq!(backend.get_from_file(4), Some(pos_4_hash)); - assert_eq!(backend.get_from_file(5), Some(pos_5_hash)); } } @@ -406,10 +406,10 @@ fn pmmr_rewind() { // prune the first 4 elements (leaves at pos 1, 2, 4, 5) { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(0).unwrap(); pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); + pmmr.prune(3).unwrap(); pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); } backend.sync().unwrap(); @@ -436,26 +436,26 @@ fn pmmr_rewind() { } // Also check the data file looks correct. - // pos 1, 2, 4, 5 are all leaves but these have been pruned. - for pos in vec![1, 2, 4, 5] { + // pos 0, 1, 3, 4 are all leaves but these have been pruned. + for pos in vec![0, 1, 3, 4] { assert_eq!(backend.get_data(pos), None); } - // pos 3, 6, 7 are non-leaves so we have no data for these - for pos in vec![3, 6, 7] { + // pos 2, 5, 6 are non-leaves so we have no data for these + for pos in vec![2, 5, 6] { assert_eq!(backend.get_data(pos), None); } - // pos 8 and 9 are both leaves and should be unaffected by prior pruning + // pos 7 and 8 are both leaves and should be unaffected by prior pruning - assert_eq!(backend.get_data(8), Some(elems[4])); - assert_eq!(backend.get_hash(8), Some(elems[4].hash_with_index(7))); + assert_eq!(backend.get_data(7), Some(elems[4])); + assert_eq!(backend.get_hash(7), Some(elems[4].hash_with_index(7))); - assert_eq!(backend.get_data(9), Some(elems[5])); - assert_eq!(backend.get_hash(9), Some(elems[5].hash_with_index(8))); + assert_eq!(backend.get_data(8), Some(elems[5])); + assert_eq!(backend.get_hash(8), Some(elems[5].hash_with_index(8))); // TODO - Why is this 2 here? println!("***** backend size here: {}", backend.data_size()); - // assert_eq!(backend.data_size(), 2); + assert_eq!(backend.data_size(), 2); { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, 10); @@ -470,9 +470,9 @@ fn pmmr_rewind() { } // also check the data file looks correct - // everything up to and including pos 7 should be pruned from the data file - // but we have rewound to pos 5 so everything after that should be None - for pos in 1..17 { + // everything up to and including pos 6 should be pruned from the data file + // but we have rewound to pos 4 so everything after that should be None + for pos in 0..16 { assert_eq!(backend.get_data(pos), None); } @@ -500,8 +500,8 @@ fn pmmr_compact_single_leaves() { { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); - pmmr.prune(4).unwrap(); + pmmr.prune(0).unwrap(); + pmmr.prune(3).unwrap(); } backend.sync().unwrap(); @@ -511,8 +511,8 @@ fn pmmr_compact_single_leaves() { { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(2).unwrap(); - pmmr.prune(5).unwrap(); + pmmr.prune(1).unwrap(); + pmmr.prune(4).unwrap(); } backend.sync().unwrap(); @@ -534,18 +534,18 @@ fn pmmr_compact_entire_peak() { let mmr_size = load(0, &elems[0..5], &mut backend); backend.sync().unwrap(); - let pos_7_hash = backend.get_hash(7).unwrap(); + let pos_6_hash = backend.get_hash(6).unwrap(); - let pos_8 = backend.get_data(8).unwrap(); - let pos_8_hash = backend.get_hash(8).unwrap(); + let pos_7 = backend.get_data(7).unwrap(); + let pos_7_hash = backend.get_hash(7).unwrap(); // prune all leaves under the peak at pos 7 { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(0).unwrap(); pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); + pmmr.prune(3).unwrap(); pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); } backend.sync().unwrap(); @@ -555,13 +555,13 @@ fn pmmr_compact_entire_peak() { // now check we have pruned up to and including the peak at pos 7 // hash still available in underlying hash file - assert_eq!(backend.get_hash(7), Some(pos_7_hash)); - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); + assert_eq!(backend.get_hash(6), Some(pos_6_hash)); + assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); // now check we still have subsequent hash and data where we expect - assert_eq!(backend.get_data(8), Some(pos_8)); - assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); + assert_eq!(backend.get_data(7), Some(pos_7)); + assert_eq!(backend.get_hash(7), Some(pos_7_hash)); + assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); } teardown(data_dir); @@ -571,17 +571,17 @@ fn pmmr_compact_entire_peak() { fn pmmr_compact_horizon() { let (data_dir, elems) = setup("compact_horizon"); { + let pos_0_hash; let pos_1_hash; let pos_2_hash; - let pos_3_hash; + let pos_5_hash; let pos_6_hash; - let pos_7_hash; - let pos_8; - let pos_8_hash; + let pos_7; + let pos_7_hash; - let pos_11; - let pos_11_hash; + let pos_10; + let pos_10_hash; let mmr_size; { @@ -596,46 +596,46 @@ fn pmmr_compact_horizon() { assert_eq!(backend.data_size(), 19); assert_eq!(backend.hash_size(), 35); + pos_0_hash = backend.get_hash(0).unwrap(); pos_1_hash = backend.get_hash(1).unwrap(); pos_2_hash = backend.get_hash(2).unwrap(); - pos_3_hash = backend.get_hash(3).unwrap(); + pos_5_hash = backend.get_hash(5).unwrap(); pos_6_hash = backend.get_hash(6).unwrap(); - pos_7_hash = backend.get_hash(7).unwrap(); - pos_8 = backend.get_data(8).unwrap(); - pos_8_hash = backend.get_hash(8).unwrap(); + pos_7 = backend.get_data(7).unwrap(); + pos_7_hash = backend.get_hash(7).unwrap(); - pos_11 = backend.get_data(11).unwrap(); - pos_11_hash = backend.get_hash(11).unwrap(); + pos_10 = backend.get_data(10).unwrap(); + pos_10_hash = backend.get_hash(10).unwrap(); // pruning some choice nodes { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(3).unwrap(); pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); + pmmr.prune(0).unwrap(); pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); } backend.sync().unwrap(); // check we can read hashes and data correctly after pruning { // assert_eq!(backend.get_hash(3), None); - assert_eq!(backend.get_from_file(3), Some(pos_3_hash)); + assert_eq!(backend.get_from_file(2), Some(pos_2_hash)); // assert_eq!(backend.get_hash(6), None); - assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); + assert_eq!(backend.get_from_file(5), Some(pos_5_hash)); // assert_eq!(backend.get_hash(7), None); - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); + assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); - assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_data(8), Some(pos_8)); - assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); + assert_eq!(backend.get_hash(7), Some(pos_7_hash)); + assert_eq!(backend.get_data(7), Some(pos_7)); + assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); - assert_eq!(backend.get_hash(11), Some(pos_11_hash)); - assert_eq!(backend.get_data(11), Some(pos_11)); - assert_eq!(backend.get_from_file(11), Some(pos_11_hash)); + assert_eq!(backend.get_hash(10), Some(pos_10_hash)); + assert_eq!(backend.get_data(10), Some(pos_10)); + assert_eq!(backend.get_from_file(10), Some(pos_10_hash)); } // compact @@ -644,22 +644,22 @@ fn pmmr_compact_horizon() { // check we can read a hash by pos correctly after compaction { + assert_eq!(backend.get_hash(0), None); + assert_eq!(backend.get_from_file(0), Some(pos_0_hash)); + assert_eq!(backend.get_hash(1), None); assert_eq!(backend.get_from_file(1), Some(pos_1_hash)); - assert_eq!(backend.get_hash(2), None); - assert_eq!(backend.get_from_file(2), Some(pos_2_hash)); - - assert_eq!(backend.get_hash(3), Some(pos_3_hash)); + assert_eq!(backend.get_hash(2), Some(pos_2_hash)); + assert_eq!(backend.get_hash(3), None); assert_eq!(backend.get_hash(4), None); - assert_eq!(backend.get_hash(5), None); - assert_eq!(backend.get_hash(6), Some(pos_6_hash)); + assert_eq!(backend.get_hash(5), Some(pos_5_hash)); - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); + assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); - assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); + assert_eq!(backend.get_hash(7), Some(pos_7_hash)); + assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); } } @@ -678,11 +678,11 @@ fn pmmr_compact_horizon() { assert_eq!(backend.hash_size(), 35); // check we can read a hash by pos correctly from renewd backend + assert_eq!(backend.get_hash(6), Some(pos_6_hash)); + assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); + assert_eq!(backend.get_hash(7), Some(pos_7_hash)); assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); - - assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); } { @@ -697,8 +697,8 @@ fn pmmr_compact_horizon() { { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(7).unwrap(); pmmr.prune(8).unwrap(); - pmmr.prune(9).unwrap(); } // compact some more @@ -723,13 +723,13 @@ fn pmmr_compact_horizon() { // check we can read a hash by pos correctly from renewd backend // get_hash() and get_from_file() should return the same value - // and we only store leaves in the leaf_set so pos 7 still has a hash in there - assert_eq!(backend.get_hash(7), Some(pos_7_hash)); - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); + // and we only store leaves in the leaf_set so pos 6 still has a hash in there + assert_eq!(backend.get_hash(6), Some(pos_6_hash)); + assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); - assert_eq!(backend.get_hash(11), Some(pos_11_hash)); - assert_eq!(backend.get_data(11), Some(pos_11)); - assert_eq!(backend.get_from_file(11), Some(pos_11_hash)); + assert_eq!(backend.get_hash(10), Some(pos_10_hash)); + assert_eq!(backend.get_data(10), Some(pos_10)); + assert_eq!(backend.get_from_file(10), Some(pos_10_hash)); } } @@ -758,9 +758,9 @@ fn compact_twice() { // pruning some choice nodes { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(0).unwrap(); pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); - pmmr.prune(4).unwrap(); + pmmr.prune(3).unwrap(); } backend.sync().unwrap(); @@ -768,8 +768,8 @@ fn compact_twice() { { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); assert_eq!(root, pmmr.root().unwrap()); - assert_eq!(pmmr.get_data(5).unwrap(), TestElem(4)); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + assert_eq!(pmmr.get_data(4).unwrap(), TestElem(4)); + assert_eq!(pmmr.get_data(10).unwrap(), TestElem(7)); } // compact @@ -779,16 +779,16 @@ fn compact_twice() { { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); assert_eq!(root, pmmr.root().unwrap()); - assert_eq!(pmmr.get_data(5).unwrap(), TestElem(4)); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + assert_eq!(pmmr.get_data(4).unwrap(), TestElem(4)); + assert_eq!(pmmr.get_data(10).unwrap(), TestElem(7)); } // now prune some more nodes { let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(5).unwrap(); + pmmr.prune(4).unwrap(); + pmmr.prune(7).unwrap(); pmmr.prune(8).unwrap(); - pmmr.prune(9).unwrap(); } backend.sync().unwrap(); @@ -796,7 +796,7 @@ fn compact_twice() { { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); assert_eq!(root, pmmr.root().unwrap()); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + assert_eq!(pmmr.get_data(10).unwrap(), TestElem(7)); } // compact @@ -806,7 +806,7 @@ fn compact_twice() { { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); assert_eq!(root, pmmr.root().unwrap()); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + assert_eq!(pmmr.get_data(10).unwrap(), TestElem(7)); } } diff --git a/store/tests/prune_list.rs b/store/tests/prune_list.rs index c98410d30d..60f68312df 100644 --- a/store/tests/prune_list.rs +++ b/store/tests/prune_list.rs @@ -15,65 +15,46 @@ use grin_store as store; use crate::store::prune_list::PruneList; -use croaring::Bitmap; - -// Prune list is 1-indexed but we implement this internally with a bitmap that supports a 0 value. -// We need to make sure we safely handle 0 safely. -#[test] -fn test_zero_value() { - // new a bitmap with a 0 value in it. - let mut bitmap = Bitmap::new(); - bitmap.add(0); - - // Instantiate a prune list from our existing bitmap. - let pl = PruneList::new(None, bitmap); - - // Our prune list should be empty (0 filtered out during creation). - assert!(pl.is_empty()); -} #[test] fn test_is_pruned() { let mut pl = PruneList::empty(); assert_eq!(pl.len(), 0); + assert_eq!(pl.is_pruned(0), false); assert_eq!(pl.is_pruned(1), false); assert_eq!(pl.is_pruned(2), false); - assert_eq!(pl.is_pruned(3), false); - pl.add(2); - pl.flush().unwrap(); + pl.append(1); - assert_eq!(pl.to_vec(), vec![2]); - assert_eq!(pl.is_pruned(1), false); - assert_eq!(pl.is_pruned(2), true); + assert_eq!(pl.iter().collect::>(), [2]); + assert_eq!(pl.is_pruned(0), false); + assert_eq!(pl.is_pruned(1), true); + assert_eq!(pl.is_pruned(2), false); assert_eq!(pl.is_pruned(3), false); assert_eq!(pl.is_pruned(4), false); - pl.add(2); - pl.add(1); + let mut pl = PruneList::empty(); + pl.append(0); + pl.append(1); pl.flush().unwrap(); assert_eq!(pl.len(), 1); - assert_eq!(pl.to_vec(), [3]); + assert_eq!(pl.iter().collect::>(), [3]); + assert_eq!(pl.is_pruned(0), true); assert_eq!(pl.is_pruned(1), true); assert_eq!(pl.is_pruned(2), true); - assert_eq!(pl.is_pruned(3), true); - assert_eq!(pl.is_pruned(4), false); + assert_eq!(pl.is_pruned(3), false); - pl.add(4); - - // Flushing the prune_list removes any individual leaf positions. - // This assumes we will track these outside the prune_list via the leaf_set. - pl.flush().unwrap(); + pl.append(3); assert_eq!(pl.len(), 2); assert_eq!(pl.to_vec(), [3, 4]); + assert_eq!(pl.is_pruned(0), true); assert_eq!(pl.is_pruned(1), true); assert_eq!(pl.is_pruned(2), true); assert_eq!(pl.is_pruned(3), true); - assert_eq!(pl.is_pruned(4), true); - assert_eq!(pl.is_pruned(5), false); + assert_eq!(pl.is_pruned(4), false); } #[test] @@ -82,189 +63,405 @@ fn test_get_leaf_shift() { // start with an empty prune list (nothing shifted) assert_eq!(pl.len(), 0); + assert_eq!(pl.get_leaf_shift(4), 0); assert_eq!(pl.get_leaf_shift(1), 0); assert_eq!(pl.get_leaf_shift(2), 0); assert_eq!(pl.get_leaf_shift(3), 0); - assert_eq!(pl.get_leaf_shift(4), 0); // now add a single leaf pos to the prune list // leaves will not shift shift anything // we only start shifting after pruning a parent - pl.add(1); + pl.append(0); pl.flush().unwrap(); - assert_eq!(pl.to_vec(), vec![1]); + assert_eq!(pl.iter().collect::>(), [1]); + assert_eq!(pl.get_leaf_shift(0), 0); assert_eq!(pl.get_leaf_shift(1), 0); assert_eq!(pl.get_leaf_shift(2), 0); assert_eq!(pl.get_leaf_shift(3), 0); - assert_eq!(pl.get_leaf_shift(4), 0); - // now add the sibling leaf pos (pos 1 and pos 2) which will prune the parent - // at pos 3 this in turn will "leaf shift" the leaf at pos 3 by 2 - pl.add(1); - pl.add(2); + // now add the sibling leaf pos (pos 1) which will prune the parent + // at pos 2 this in turn will "leaf shift" the leaf at pos 2 by 2 + pl.append(1); pl.flush().unwrap(); assert_eq!(pl.len(), 1); + assert_eq!(pl.get_leaf_shift(0), 0); assert_eq!(pl.get_leaf_shift(1), 0); - assert_eq!(pl.get_leaf_shift(2), 0); + assert_eq!(pl.get_leaf_shift(2), 2); assert_eq!(pl.get_leaf_shift(3), 2); assert_eq!(pl.get_leaf_shift(4), 2); - assert_eq!(pl.get_leaf_shift(5), 2); - // now prune an additional leaf at pos 4 + // now prune an additional leaf at pos 3 // leaf offset of subsequent pos will be 2 // 00100120 - pl.add(4); + pl.append(3); pl.flush().unwrap(); assert_eq!(pl.len(), 2); - assert_eq!(pl.to_vec(), [3, 4]); + assert_eq!(pl.iter().collect::>(), [3, 4]); + assert_eq!(pl.get_leaf_shift(0), 0); assert_eq!(pl.get_leaf_shift(1), 0); - assert_eq!(pl.get_leaf_shift(2), 0); + assert_eq!(pl.get_leaf_shift(2), 2); assert_eq!(pl.get_leaf_shift(3), 2); assert_eq!(pl.get_leaf_shift(4), 2); assert_eq!(pl.get_leaf_shift(5), 2); assert_eq!(pl.get_leaf_shift(6), 2); assert_eq!(pl.get_leaf_shift(7), 2); - assert_eq!(pl.get_leaf_shift(8), 2); - // now prune the sibling at pos 5 - // the two smaller subtrees (pos 3 and pos 6) are rolled up to larger subtree - // (pos 7) the leaf offset is now 4 to cover entire subtree containing first + // now prune the sibling at pos 4 + // the two smaller subtrees (pos 2 and pos 5) are rolled up to larger subtree + // (pos 6) the leaf offset is now 4 to cover entire subtree containing first // 4 leaves 00100120 - pl.add(4); - pl.add(5); + pl.append(4); pl.flush().unwrap(); assert_eq!(pl.len(), 1); - assert_eq!(pl.to_vec(), [7]); + assert_eq!(pl.iter().collect::>(), [7]); + assert_eq!(pl.get_leaf_shift(0), 0); assert_eq!(pl.get_leaf_shift(1), 0); assert_eq!(pl.get_leaf_shift(2), 0); assert_eq!(pl.get_leaf_shift(3), 0); assert_eq!(pl.get_leaf_shift(4), 0); assert_eq!(pl.get_leaf_shift(5), 0); - assert_eq!(pl.get_leaf_shift(6), 0); + assert_eq!(pl.get_leaf_shift(6), 4); assert_eq!(pl.get_leaf_shift(7), 4); assert_eq!(pl.get_leaf_shift(8), 4); - assert_eq!(pl.get_leaf_shift(9), 4); - // now check we can prune some unconnected nodes in arbitrary order + // now check we can prune some unconnected nodes // and that leaf_shift is correct for various pos let mut pl = PruneList::empty(); - pl.add(5); - pl.add(11); - pl.add(12); - pl.add(4); + pl.append(3); + pl.append(4); + pl.append(10); + pl.append(11); pl.flush().unwrap(); assert_eq!(pl.len(), 2); - assert_eq!(pl.to_vec(), [6, 13]); - assert_eq!(pl.get_leaf_shift(2), 0); - assert_eq!(pl.get_leaf_shift(4), 0); + assert_eq!(pl.iter().collect::>(), [6, 13]); + assert_eq!(pl.get_leaf_shift(1), 0); + assert_eq!(pl.get_leaf_shift(3), 0); + assert_eq!(pl.get_leaf_shift(7), 2); assert_eq!(pl.get_leaf_shift(8), 2); - assert_eq!(pl.get_leaf_shift(9), 2); + assert_eq!(pl.get_leaf_shift(12), 4); assert_eq!(pl.get_leaf_shift(13), 4); - assert_eq!(pl.get_leaf_shift(14), 4); } #[test] fn test_get_shift() { let mut pl = PruneList::empty(); assert!(pl.is_empty()); + assert_eq!(pl.get_shift(0), 0); assert_eq!(pl.get_shift(1), 0); assert_eq!(pl.get_shift(2), 0); - assert_eq!(pl.get_shift(3), 0); // prune a single leaf node // pruning only a leaf node does not shift any subsequent pos // we will only start shifting when a parent can be pruned - pl.add(1); + pl.append(0); pl.flush().unwrap(); - assert_eq!(pl.to_vec(), [1]); + assert_eq!(pl.iter().collect::>(), [1]); + assert_eq!(pl.get_shift(0), 0); assert_eq!(pl.get_shift(1), 0); assert_eq!(pl.get_shift(2), 0); - assert_eq!(pl.get_shift(3), 0); - pl.add(1); - pl.add(2); + pl.append(1); pl.flush().unwrap(); - assert_eq!(pl.to_vec(), [3]); + assert_eq!(pl.iter().collect::>(), [3]); + assert_eq!(pl.get_shift(0), 0); assert_eq!(pl.get_shift(1), 0); - assert_eq!(pl.get_shift(2), 0); + assert_eq!(pl.get_shift(2), 2); assert_eq!(pl.get_shift(3), 2); assert_eq!(pl.get_shift(4), 2); assert_eq!(pl.get_shift(5), 2); - assert_eq!(pl.get_shift(6), 2); - // pos 3 is not a leaf and is already in prune list - // prune it and check we are still consistent - pl.add(3); + pl.append(3); pl.flush().unwrap(); - assert_eq!(pl.to_vec(), [3]); + assert_eq!(pl.iter().collect::>(), [3, 4]); + assert_eq!(pl.get_shift(0), 0); assert_eq!(pl.get_shift(1), 0); - assert_eq!(pl.get_shift(2), 0); - assert_eq!(pl.get_shift(3), 2); - assert_eq!(pl.get_shift(4), 2); - assert_eq!(pl.get_shift(5), 2); - assert_eq!(pl.get_shift(6), 2); - - pl.add(4); - pl.flush().unwrap(); - - assert_eq!(pl.to_vec(), [3, 4]); - assert_eq!(pl.get_shift(1), 0); - assert_eq!(pl.get_shift(2), 0); + assert_eq!(pl.get_shift(2), 2); assert_eq!(pl.get_shift(3), 2); assert_eq!(pl.get_shift(4), 2); assert_eq!(pl.get_shift(5), 2); - assert_eq!(pl.get_shift(6), 2); - pl.add(4); - pl.add(5); + pl.append(4); pl.flush().unwrap(); - assert_eq!(pl.to_vec(), [7]); + assert_eq!(pl.iter().collect::>(), [7]); + assert_eq!(pl.get_shift(0), 0); assert_eq!(pl.get_shift(1), 0); assert_eq!(pl.get_shift(2), 0); assert_eq!(pl.get_shift(3), 0); assert_eq!(pl.get_shift(4), 0); assert_eq!(pl.get_shift(5), 0); - assert_eq!(pl.get_shift(6), 0); + assert_eq!(pl.get_shift(6), 6); assert_eq!(pl.get_shift(7), 6); assert_eq!(pl.get_shift(8), 6); - assert_eq!(pl.get_shift(9), 6); // prune a bunch more - for x in 6..1000 { - pl.add(x); + for x in 5..999 { + if !pl.is_pruned(x) { + pl.append(x); + } } pl.flush().unwrap(); // and check we shift by a large number (hopefully the correct number...) - assert_eq!(pl.get_shift(1010), 996); + assert_eq!(pl.get_shift(1009), 996); + // now check we can do some sparse pruning let mut pl = PruneList::empty(); - pl.add(9); - pl.add(8); - pl.add(5); - pl.add(4); + pl.append(3); + pl.append(4); + pl.append(7); + pl.append(8); pl.flush().unwrap(); - assert_eq!(pl.to_vec(), [6, 10]); + assert_eq!(pl.iter().collect::>(), [6, 10]); + assert_eq!(pl.get_shift(0), 0); assert_eq!(pl.get_shift(1), 0); assert_eq!(pl.get_shift(2), 0); assert_eq!(pl.get_shift(3), 0); assert_eq!(pl.get_shift(4), 0); - assert_eq!(pl.get_shift(5), 0); + assert_eq!(pl.get_shift(5), 2); assert_eq!(pl.get_shift(6), 2); assert_eq!(pl.get_shift(7), 2); assert_eq!(pl.get_shift(8), 2); - assert_eq!(pl.get_shift(9), 2); + assert_eq!(pl.get_shift(9), 4); assert_eq!(pl.get_shift(10), 4); assert_eq!(pl.get_shift(11), 4); - assert_eq!(pl.get_shift(12), 4); +} + +#[test] +pub fn test_iter() { + let mut pl = PruneList::empty(); + pl.append(0); + pl.append(1); + pl.append(3); + assert_eq!(pl.iter().collect::>(), [3, 4]); + + let mut pl = PruneList::empty(); + pl.append(0); + pl.append(1); + pl.append(4); + assert_eq!(pl.iter().collect::>(), [3, 5]); +} + +#[test] +pub fn test_pruned_bintree_range_iter() { + let mut pl = PruneList::empty(); + pl.append(0); + pl.append(1); + pl.append(3); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [1..4, 4..5] + ); + + let mut pl = PruneList::empty(); + pl.append(0); + pl.append(1); + pl.append(4); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [1..4, 5..6] + ); +} + +#[test] +pub fn test_unpruned_iter() { + let pl = PruneList::empty(); + assert_eq!(pl.unpruned_iter(5).collect::>(), [1, 2, 3, 4, 5]); + + let mut pl = PruneList::empty(); + pl.append(1); + assert_eq!(pl.iter().collect::>(), [2]); + assert_eq!(pl.pruned_bintree_range_iter().collect::>(), [2..3]); + assert_eq!(pl.unpruned_iter(4).collect::>(), [1, 3, 4]); + + let mut pl = PruneList::empty(); + pl.append(1); + pl.append(3); + pl.append(4); + assert_eq!(pl.iter().collect::>(), [2, 6]); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [2..3, 4..7] + ); + assert_eq!(pl.unpruned_iter(9).collect::>(), [1, 3, 7, 8, 9]); +} + +#[test] +fn test_unpruned_leaf_iter() { + let pl = PruneList::empty(); + assert_eq!( + pl.unpruned_leaf_iter(8).collect::>(), + [1, 2, 4, 5, 8] + ); + + let mut pl = PruneList::empty(); + pl.append(1); + assert_eq!(pl.iter().collect::>(), [2]); + assert_eq!(pl.pruned_bintree_range_iter().collect::>(), [2..3]); + assert_eq!(pl.unpruned_leaf_iter(5).collect::>(), [1, 4, 5]); + + let mut pl = PruneList::empty(); + pl.append(1); + pl.append(3); + pl.append(4); + assert_eq!(pl.iter().collect::>(), [2, 6]); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [2..3, 4..7] + ); + assert_eq!(pl.unpruned_leaf_iter(9).collect::>(), [1, 8, 9]); +} + +#[test] +pub fn test_iter() { + let mut pl = PruneList::empty(); + pl.append(1); + pl.append(2); + pl.append(4); + assert_eq!(pl.iter().collect::>(), [3, 4]); + + let mut pl = PruneList::empty(); + pl.append(1); + pl.append(2); + pl.append(5); + assert_eq!(pl.iter().collect::>(), [3, 5]); +} + +#[test] +pub fn test_pruned_bintree_range_iter() { + let mut pl = PruneList::empty(); + pl.append(1); + pl.append(2); + pl.append(4); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [1..4, 4..5] + ); + + let mut pl = PruneList::empty(); + pl.append(1); + pl.append(2); + pl.append(5); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [1..4, 5..6] + ); +} + +#[test] +pub fn test_unpruned_iter() { + let pl = PruneList::empty(); + assert_eq!(pl.unpruned_iter(5).collect::>(), [1, 2, 3, 4, 5]); + + let mut pl = PruneList::empty(); + pl.append(2); + assert_eq!(pl.iter().collect::>(), [2]); + assert_eq!(pl.pruned_bintree_range_iter().collect::>(), [2..3]); + assert_eq!(pl.unpruned_iter(4).collect::>(), [1, 3, 4]); + + let mut pl = PruneList::empty(); + pl.append(2); + pl.append(4); + pl.append(5); + assert_eq!(pl.iter().collect::>(), [2, 6]); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [2..3, 4..7] + ); + assert_eq!(pl.unpruned_iter(9).collect::>(), [1, 3, 7, 8, 9]); +} + +#[test] +fn test_unpruned_leaf_iter() { + let pl = PruneList::empty(); + assert_eq!( + pl.unpruned_leaf_iter(8).collect::>(), + [1, 2, 4, 5, 8] + ); + + let mut pl = PruneList::empty(); + pl.append(2); + assert_eq!(pl.iter().collect::>(), [2]); + assert_eq!(pl.pruned_bintree_range_iter().collect::>(), [2..3]); + assert_eq!(pl.unpruned_leaf_iter(5).collect::>(), [1, 4, 5]); + + let mut pl = PruneList::empty(); + pl.append(2); + pl.append(4); + pl.append(5); + assert_eq!(pl.iter().collect::>(), [2, 6]); + assert_eq!( + pl.pruned_bintree_range_iter().collect::>(), + [2..3, 4..7] + ); + assert_eq!(pl.unpruned_leaf_iter(9).collect::>(), [1, 8, 9]); +} + +pub fn test_append_pruned_subtree() { + let mut pl = PruneList::empty(); + + // append a pruned leaf pos (shift and leaf shift are unaffected). + pl.append(0); + + assert_eq!(pl.to_vec(), [1]); + assert_eq!(pl.get_shift(1), 0); + assert_eq!(pl.get_leaf_shift(1), 0); + + pl.append(2); + + // subtree beneath root at 2 is pruned + // pos 3 is shifted by 2 pruned hashes [1, 2] + // pos 3 is shifted by 2 leaves [1, 2] + assert_eq!(pl.to_vec(), [3]); + assert_eq!(pl.get_shift(3), 2); + assert_eq!(pl.get_leaf_shift(3), 2); + + // append another pruned subtree (ancester of previous one) + pl.append(6); + + // subtree beneath root at 6 is pruned + // pos 7 is shifted by 6 pruned hashes [1, 2, 3, 4, 5, 6] + // pos 3 is shifted by 4 leaves [1, 2, 4, 5] + assert_eq!(pl.to_vec(), [7]); + assert_eq!(pl.get_shift(7), 6); + assert_eq!(pl.get_leaf_shift(7), 4); + + // now append another pruned leaf pos + pl.append(7); + + // additional pruned leaf does not affect the shift or leaf shift + // pos 8 is shifted by 6 pruned hashes [1, 2, 3, 4, 5, 6] + // pos 8 is shifted by 4 leaves [1, 2, 4, 5] + assert_eq!(pl.to_vec(), [7, 8]); + assert_eq!(pl.get_shift(8), 6); + assert_eq!(pl.get_leaf_shift(8), 4); +} + +#[test] +fn test_recreate_prune_list() { + let mut pl = PruneList::empty(); + pl.append(3); + pl.append(4); + pl.append(10); + + let pl2 = PruneList::new(None, vec![4, 5, 11].into_iter().collect()); + + assert_eq!(pl.to_vec(), pl2.to_vec()); + assert_eq!(pl.shift_cache(), pl2.shift_cache()); + assert_eq!(pl.leaf_shift_cache(), pl2.leaf_shift_cache()); + + let pl3 = PruneList::new(None, vec![6, 11].into_iter().collect()); + + assert_eq!(pl.to_vec(), pl3.to_vec()); + assert_eq!(pl.shift_cache(), pl3.shift_cache()); + assert_eq!(pl.leaf_shift_cache(), pl3.leaf_shift_cache()); } diff --git a/store/tests/segment.rs b/store/tests/segment.rs index 042a5365a2..3df593ab28 100644 --- a/store/tests/segment.rs +++ b/store/tests/segment.rs @@ -46,8 +46,8 @@ fn prunable_mmr() { let last_pos = mmr.unpruned_size(); let root = mmr.root().unwrap(); - let mut bitmap = Bitmap::create(); - bitmap.add_range(0..n_leaves as u64); + let mut bitmap = Bitmap::new(); + bitmap.add_range(0..n_leaves); let id = SegmentIdentifier { height: 3, idx: 1 }; @@ -56,7 +56,7 @@ fn prunable_mmr() { let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); assert_eq!( segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), - mmr.get_hash(30).unwrap() + mmr.get_hash(29).unwrap() ); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -64,7 +64,7 @@ fn prunable_mmr() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[8, 9, 13]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate @@ -72,7 +72,7 @@ fn prunable_mmr() { let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); assert_eq!( segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), - mmr.get_hash(30).unwrap() + mmr.get_hash(29).unwrap() ); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -80,7 +80,7 @@ fn prunable_mmr() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[10, 11]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate @@ -88,7 +88,7 @@ fn prunable_mmr() { let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); assert_eq!( segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), - mmr.get_hash(30).unwrap() + mmr.get_hash(29).unwrap() ); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -96,7 +96,7 @@ fn prunable_mmr() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[14, 15]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate @@ -104,7 +104,7 @@ fn prunable_mmr() { let segment = Segment::from_pmmr(id, &mmr, true).unwrap(); assert_eq!( segment.root(last_pos, Some(&bitmap)).unwrap().unwrap(), - mmr.get_hash(30).unwrap() + mmr.get_hash(29).unwrap() ); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -112,7 +112,7 @@ fn prunable_mmr() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[12]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); let mmr = ReadonlyPMMR::at(&mut ba, last_pos); @@ -129,7 +129,7 @@ fn prunable_mmr() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[76, 77]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate @@ -141,7 +141,7 @@ fn prunable_mmr() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[78]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate @@ -172,13 +172,13 @@ fn pruned_segment() { let last_pos = mmr.unpruned_size(); let root = mmr.root().unwrap(); - let mut bitmap = Bitmap::create(); - bitmap.add_range(0..n_leaves as u64); + let mut bitmap = Bitmap::new(); + bitmap.add_range(0..n_leaves); // Prune all leaves of segment 1 prune(&mut mmr, &mut bitmap, &[4, 5, 6, 7]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate the empty segment 1 @@ -191,7 +191,7 @@ fn pruned_segment() { segment .first_unpruned_parent(last_pos, Some(&bitmap)) .unwrap(), - (ba.get_hash(14).unwrap(), 14) + (ba.get_hash(13).unwrap(), 14) ); assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_none()); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -200,7 +200,7 @@ fn pruned_segment() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[0, 1, 2, 3]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate the empty segment 1 again @@ -213,7 +213,7 @@ fn pruned_segment() { segment .first_unpruned_parent(last_pos, Some(&bitmap)) .unwrap(), - (ba.get_hash(15).unwrap(), 15) + (ba.get_hash(14).unwrap(), 15) ); assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_none()); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -222,7 +222,7 @@ fn pruned_segment() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[8, 9, 10, 11, 12, 13, 14, 15]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate the empty segment 1 again @@ -245,7 +245,7 @@ fn pruned_segment() { for i in 16..n_leaves { mmr.push(&TestElem([i / 7, i / 5, i / 3, i])).unwrap(); } - bitmap.add_range(16..n_leaves as u64); + bitmap.add_range(16..n_leaves); let last_pos = mmr.unpruned_size(); let root = mmr.root().unwrap(); @@ -253,7 +253,7 @@ fn pruned_segment() { // The root of this segment is a direct peak of the full MMR prune(&mut mmr, &mut bitmap, &[16, 17, 18, 19]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate segment 4 @@ -266,7 +266,7 @@ fn pruned_segment() { segment .first_unpruned_parent(last_pos, Some(&bitmap)) .unwrap(), - (ba.get_hash(38).unwrap(), 38) + (ba.get_hash(37).unwrap(), 38) ); assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_none()); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -281,7 +281,7 @@ fn pruned_segment() { .first_unpruned_parent(last_pos, Some(&bitmap)) .unwrap() .1, - segment.segment_pos_range(last_pos).1 + 1 + segment.segment_pos_range(last_pos).1 ); assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_some()); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -291,7 +291,7 @@ fn pruned_segment() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[22]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Segment 5 should be unchanged @@ -304,7 +304,7 @@ fn pruned_segment() { let mut mmr = PMMR::at(&mut ba, last_pos); prune(&mut mmr, &mut bitmap, &[20, 21]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); // Validate segment 5 again @@ -317,7 +317,7 @@ fn pruned_segment() { .first_unpruned_parent(last_pos, Some(&bitmap)) .unwrap() .1, - segment.segment_pos_range(last_pos).1 + 1 + segment.segment_pos_range(last_pos).1 ); assert!(segment.root(last_pos, Some(&bitmap)).unwrap().is_some()); segment.validate(last_pos, Some(&bitmap), root).unwrap(); @@ -342,13 +342,13 @@ fn ser_round_trip() { for i in 0..n_leaves { mmr.push(&TestElem([i / 7, i / 5, i / 3, i])).unwrap(); } - let mut bitmap = Bitmap::create(); - bitmap.add_range(0..n_leaves as u64); + let mut bitmap = Bitmap::new(); + bitmap.add_range(0..n_leaves); let last_pos = mmr.unpruned_size(); prune(&mut mmr, &mut bitmap, &[0, 1]); ba.sync().unwrap(); - ba.check_compact(last_pos, &Bitmap::create()).unwrap(); + ba.check_compact(last_pos, &Bitmap::new()).unwrap(); ba.sync().unwrap(); let mmr = ReadonlyPMMR::at(&ba, last_pos); @@ -378,8 +378,7 @@ where B: Backend, { for &leaf_idx in leaf_idxs { - mmr.prune(pmmr::insertion_to_pmmr_index(leaf_idx + 1)) - .unwrap(); + mmr.prune(pmmr::insertion_to_pmmr_index(leaf_idx)).unwrap(); bitmap.remove(leaf_idx as u32); } } diff --git a/store/tests/utxo_set_perf.rs b/store/tests/utxo_set_perf.rs index 0e0e664124..52613cf773 100644 --- a/store/tests/utxo_set_perf.rs +++ b/store/tests/utxo_set_perf.rs @@ -39,7 +39,7 @@ fn test_leaf_set_performance() { let now = Instant::now(); for x in 0..1_000 { for y in 0..1_000 { - let pos = (x * 1_000) + y + 1; + let pos = (x * 1_000) + y; leaf_set.add(pos); } leaf_set.flush().unwrap(); @@ -53,7 +53,7 @@ fn test_leaf_set_performance() { // Simulate looking up existence of a large number of pos in the leaf_set. let now = Instant::now(); for x in 0..1_000_000 { - assert!(leaf_set.includes(x + 1)); + assert!(leaf_set.includes(x)); } println!( "Checking 1,000,000 inclusions in leaf_set took {}ms", @@ -65,7 +65,7 @@ fn test_leaf_set_performance() { let now = Instant::now(); for x in 0..1_000 { for y in 0..1_000 { - let pos = (x * 1_000) + y + 1; + let pos = (x * 1_000) + y; leaf_set.remove(pos); } leaf_set.flush().unwrap(); From 651a3499f6aa7b82a031e31143aa650f23c68a7f Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 14:35:09 -0700 Subject: [PATCH 06/96] grin v5.3 (0008) add segmenter for generating segments from txhashset with consistent rewind (#3482) * add segmenter for generating segments from txhashset with consistent rewind * rework segmenter to take a txhashset wrapped in rwlock rework our rewindable pmmr so we can convert to readonly easily * placeholder code for rewinding readonly txhashset extension to build a rangeproof segment * segment creation for outputs/rangeproofs/kernels/bitmaps * placeholder segment impl * commit * rework segmenter to use a cached bitmap (rewind is expensive) * cache segmenter instance based on current archive header * integrate the real segment and segment identifier with our segmenter * exercise the segmenter code on chain init * wrap accumulator in an arc, no need to clone each time --- chain/src/chain.rs | 83 +++++++++- chain/src/error.rs | 12 ++ chain/src/txhashset.rs | 2 + chain/src/txhashset/bitmap_accumulator.rs | 9 +- chain/src/txhashset/rewindable_kernel_view.rs | 12 +- chain/src/txhashset/segmenter.rs | 149 ++++++++++++++++++ chain/src/txhashset/txhashset.rs | 56 ++++++- core/src/core/pmmr/rewindable_pmmr.rs | 67 +------- core/src/core/pmmr/segment.rs | 15 ++ util/src/lib.rs | 3 +- 10 files changed, 334 insertions(+), 74 deletions(-) create mode 100644 chain/src/txhashset/segmenter.rs diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 45ff872259..26dde22879 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -20,7 +20,7 @@ use crate::core::core::merkle_proof::MerkleProof; use crate::core::core::verifier_cache::VerifierCache; use crate::core::core::{ Block, BlockHeader, BlockSums, Committed, Inputs, KernelFeatures, Output, OutputIdentifier, - Transaction, TxKernel, + SegmentIdentifier, Transaction, TxKernel, }; use crate::core::global; use crate::core::pow; @@ -29,12 +29,13 @@ use crate::error::{Error, ErrorKind}; use crate::pipe; use crate::store; use crate::txhashset; -use crate::txhashset::{PMMRHandle, TxHashSet}; +use crate::txhashset::{PMMRHandle, Segmenter, TxHashSet}; use crate::types::{ BlockStatus, ChainAdapter, CommitPos, NoStatus, Options, Tip, TxHashsetWriteStatus, }; use crate::util::secp::pedersen::{Commitment, RangeProof}; -use crate::{util::RwLock, ChainStore}; +use crate::util::RwLock; +use crate::ChainStore; use grin_core::ser; use grin_store::Error::NotFoundErr; use grin_util::ToHex; @@ -156,6 +157,7 @@ pub struct Chain { header_pmmr: Arc>>, sync_pmmr: Arc>>, verifier_cache: Arc>, + pibd_segmenter: Arc>>, // POW verification function pow_verifier: fn(&BlockHeader) -> Result<(), pow::Error>, archive_mode: bool, @@ -221,6 +223,7 @@ impl Chain { txhashset: Arc::new(RwLock::new(txhashset)), header_pmmr: Arc::new(RwLock::new(header_pmmr)), sync_pmmr: Arc::new(RwLock::new(sync_pmmr)), + pibd_segmenter: Arc::new(RwLock::new(None)), pow_verifier, verifier_cache, archive_mode, @@ -236,6 +239,22 @@ impl Chain { chain.log_heads()?; + // Temporarily exercising the initialization process. + // Note: This is *really* slow because we are starting from cold. + // + // This is not required as we will lazily initialize our segmenter as required + // once we start receiving PIBD segment requests. + // In reality we will do this based on PIBD segment requests. + // Initialization (once per 12 hour period) will not be this slow once lmdb and PMMRs + // are warmed up. + { + let segmenter = chain.segmenter()?; + let _ = segmenter.kernel_segment(SegmentIdentifier { height: 9, idx: 0 }); + let _ = segmenter.bitmap_segment(SegmentIdentifier { height: 9, idx: 0 }); + let _ = segmenter.output_segment(SegmentIdentifier { height: 11, idx: 0 }); + let _ = segmenter.rangeproof_segment(SegmentIdentifier { height: 7, idx: 0 }); + } + Ok(chain) } @@ -944,6 +963,64 @@ impl Chain { }) } + /// The segmenter is responsible for generation PIBD segments. + /// We cache a segmenter instance based on the current archve period (new period every 12 hours). + /// This allows us to efficiently generate bitmap segments for the current archive period. + /// + /// It is a relatively expensive operation to initializa and cache a new segmenter instance + /// as this involves rewinding the txhashet by approx 720 blocks (12 hours). + /// + /// Caller is responsible for only doing this when required. + /// Caller should verify a peer segment request is valid before calling this for example. + /// + pub fn segmenter(&self) -> Result { + // The archive header corresponds to the data we will segment. + let ref archive_header = self.txhashset_archive_header()?; + + // Use our cached segmenter if we have one and the associated header matches. + if let Some(x) = self.pibd_segmenter.read().as_ref() { + if x.header() == archive_header { + return Ok(x.clone()); + } + } + + // We have no cached segmenter or the cached segmenter is no longer useful. + // Initialize a new segment, cache it and return it. + let segmenter = self.init_segmenter(archive_header)?; + let mut cache = self.pibd_segmenter.write(); + *cache = Some(segmenter.clone()); + + return Ok(segmenter); + } + + /// This is an expensive rewind to recreate bitmap state but we only need to do this once. + /// Caller is responsible for "caching" the segmenter (per archive period) for reuse. + fn init_segmenter(&self, header: &BlockHeader) -> Result { + let now = Instant::now(); + debug!( + "init_segmenter: initializing new segmenter for {} at {}", + header.hash(), + header.height + ); + + let mut header_pmmr = self.header_pmmr.write(); + let mut txhashset = self.txhashset.write(); + + let bitmap_snapshot = + txhashset::extending_readonly(&mut header_pmmr, &mut txhashset, |ext, batch| { + ext.extension.rewind(header, batch)?; + Ok(ext.extension.bitmap_accumulator()) + })?; + + debug!("init_segmenter: done, took {}ms", now.elapsed().as_millis()); + + Ok(Segmenter::new( + self.txhashset(), + Arc::new(bitmap_snapshot), + header.clone(), + )) + } + /// To support the ability to download the txhashset from multiple peers in parallel, /// the peers must all agree on the exact binary representation of the txhashset. /// This means compacting and rewinding to the exact same header. diff --git a/chain/src/error.rs b/chain/src/error.rs index fe0f9039e2..8541a94db6 100644 --- a/chain/src/error.rs +++ b/chain/src/error.rs @@ -13,6 +13,7 @@ // limitations under the License. //! Error types for chain +use crate::core::core::pmmr::segment; use crate::core::core::{block, committed, transaction}; use crate::core::ser; use crate::keychain; @@ -155,6 +156,9 @@ pub enum ErrorKind { /// Error during chain sync #[fail(display = "Sync error")] SyncError(String), + /// PIBD segment related error + #[fail(display = "Segment error")] + SegmentError(segment::SegmentError), } impl Display for Error { @@ -279,6 +283,14 @@ impl From for Error { } } +impl From for Error { + fn from(error: segment::SegmentError) -> Error { + Error { + inner: Context::new(ErrorKind::SegmentError(error)), + } + } +} + impl From for Error { fn from(e: secp::Error) -> Error { Error { diff --git a/chain/src/txhashset.rs b/chain/src/txhashset.rs index 094df1cb96..1926d7d79a 100644 --- a/chain/src/txhashset.rs +++ b/chain/src/txhashset.rs @@ -17,10 +17,12 @@ mod bitmap_accumulator; mod rewindable_kernel_view; +mod segmenter; mod txhashset; mod utxo_view; pub use self::bitmap_accumulator::*; pub use self::rewindable_kernel_view::*; +pub use self::segmenter::*; pub use self::txhashset::*; pub use self::utxo_view::*; diff --git a/chain/src/txhashset/bitmap_accumulator.rs b/chain/src/txhashset/bitmap_accumulator.rs index fddad29e31..e2f523f6e1 100644 --- a/chain/src/txhashset/bitmap_accumulator.rs +++ b/chain/src/txhashset/bitmap_accumulator.rs @@ -55,7 +55,7 @@ impl BitmapAccumulator { /// Crate a new empty bitmap accumulator. pub fn new() -> BitmapAccumulator { BitmapAccumulator { - backend: VecBackend::new_hash_only(), + backend: VecBackend::new(), } } @@ -185,9 +185,12 @@ impl BitmapAccumulator { /// The root hash of the bitmap accumulator MMR. pub fn root(&self) -> Hash { + self.readonly_pmmr().root().expect("no root, invalid tree") + } + + /// Readonly access to our internal data. + pub fn readonly_pmmr(&self) -> ReadonlyPMMR> { ReadonlyPMMR::at(&self.backend, self.backend.size()) - .root() - .expect("no root, invalid tree") } } diff --git a/chain/src/txhashset/rewindable_kernel_view.rs b/chain/src/txhashset/rewindable_kernel_view.rs index 567ba2df99..883bb5df37 100644 --- a/chain/src/txhashset/rewindable_kernel_view.rs +++ b/chain/src/txhashset/rewindable_kernel_view.rs @@ -14,7 +14,7 @@ //! Lightweight readonly view into kernel MMR for convenience. -use crate::core::core::pmmr::RewindablePMMR; +use crate::core::core::pmmr::{ReadablePMMR, ReadonlyPMMR, RewindablePMMR}; use crate::core::core::{BlockHeader, TxKernel}; use crate::error::{Error, ErrorKind}; use grin_store::pmmr::PMMRBackend; @@ -54,7 +54,10 @@ impl<'a> RewindableKernelView<'a> { /// fast sync where a reorg past the horizon could allow a whole rewrite of /// the kernel set. pub fn validate_root(&self) -> Result<(), Error> { - let root = self.pmmr.root().map_err(|e| ErrorKind::InvalidRoot(e))?; + let root = self + .readonly_pmmr() + .root() + .map_err(|e| ErrorKind::InvalidRoot(e))?; if root != self.header.kernel_root { return Err(ErrorKind::InvalidTxHashSet(format!( "Kernel root at {} does not match", @@ -64,4 +67,9 @@ impl<'a> RewindableKernelView<'a> { } Ok(()) } + + /// Readonly view of our internal data. + pub fn readonly_pmmr(&self) -> ReadonlyPMMR> { + self.pmmr.as_readonly() + } } diff --git a/chain/src/txhashset/segmenter.rs b/chain/src/txhashset/segmenter.rs new file mode 100644 index 0000000000..ccf21eeb51 --- /dev/null +++ b/chain/src/txhashset/segmenter.rs @@ -0,0 +1,149 @@ +// Copyright 2020 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Generation of the various necessary segments requested during PIBD. + +use std::{sync::Arc, time::Instant}; + +use crate::core::core::hash::Hash; +use crate::core::core::pmmr::ReadablePMMR; +use crate::core::core::{BlockHeader, OutputIdentifier, Segment, SegmentIdentifier, TxKernel}; +use crate::error::{Error, ErrorKind}; +use crate::txhashset::{BitmapAccumulator, BitmapChunk, TxHashSet}; +use crate::util::secp::pedersen::RangeProof; +use crate::util::RwLock; + +/// Segmenter for generating PIBD segments. +#[derive(Clone)] +pub struct Segmenter { + txhashset: Arc>, + bitmap_snapshot: Arc, + header: BlockHeader, +} + +impl Segmenter { + /// Create a new segmenter based on the provided txhashset. + pub fn new( + txhashset: Arc>, + bitmap_snapshot: Arc, + header: BlockHeader, + ) -> Segmenter { + Segmenter { + txhashset, + bitmap_snapshot, + header, + } + } + + /// Header associated with this segmenter instance. + /// The bitmap "snapshot" corresponds to rewound state at this header. + pub fn header(&self) -> &BlockHeader { + &self.header + } + + /// Create a kernel segment. + pub fn kernel_segment(&self, id: SegmentIdentifier) -> Result, Error> { + let now = Instant::now(); + let txhashset = self.txhashset.read(); + let kernel_pmmr = txhashset.kernel_pmmr_at(&self.header); + let segment = Segment::from_pmmr(id, &kernel_pmmr, false)?; + debug!( + "kernel_segment: id: ({}, {}), leaves: {}, hashes: {}, proof hashes: {}, took {}ms", + segment.id().height, + segment.id().idx, + segment.leaf_iter().count(), + segment.hash_iter().count(), + segment.proof().size(), + now.elapsed().as_millis() + ); + Ok(segment) + } + + /// The root of the output PMMR based on size from the header. + fn output_root(&self) -> Result { + let txhashset = self.txhashset.read(); + let pmmr = txhashset.output_pmmr_at(&self.header); + let root = pmmr.root().map_err(&ErrorKind::TxHashSetErr)?; + Ok(root) + } + + /// The root of the bitmap snapshot PMMR. + fn bitmap_root(&self) -> Result { + let pmmr = self.bitmap_snapshot.readonly_pmmr(); + let root = pmmr.root().map_err(&ErrorKind::TxHashSetErr)?; + Ok(root) + } + + /// Create a utxo bitmap segment based on our bitmap "snapshot" and return it with + /// the corresponding output root. + pub fn bitmap_segment( + &self, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), Error> { + let now = Instant::now(); + let bitmap_pmmr = self.bitmap_snapshot.readonly_pmmr(); + let segment = Segment::from_pmmr(id, &bitmap_pmmr, false)?; + let output_root = self.output_root()?; + debug!( + "bitmap_segment: id: ({}, {}), leaves: {}, hashes: {}, proof hashes: {}, took {}ms", + segment.id().height, + segment.id().idx, + segment.leaf_iter().count(), + segment.hash_iter().count(), + segment.proof().size(), + now.elapsed().as_millis() + ); + Ok((segment, output_root)) + } + + /// Create an output segment and return it with the corresponding bitmap root. + pub fn output_segment( + &self, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), Error> { + let now = Instant::now(); + let txhashset = self.txhashset.read(); + let output_pmmr = txhashset.output_pmmr_at(&self.header); + let segment = Segment::from_pmmr(id, &output_pmmr, true)?; + let bitmap_root = self.bitmap_root()?; + debug!( + "output_segment: id: ({}, {}), leaves: {}, hashes: {}, proof hashes: {}, took {}ms", + segment.id().height, + segment.id().idx, + segment.leaf_iter().count(), + segment.hash_iter().count(), + segment.proof().size(), + now.elapsed().as_millis() + ); + Ok((segment, bitmap_root)) + } + + /// Create a rangeproof segment. + pub fn rangeproof_segment(&self, id: SegmentIdentifier) -> Result, Error> { + let now = Instant::now(); + let txhashset = self.txhashset.read(); + let pmmr = txhashset.rangeproof_pmmr_at(&self.header); + let segment = Segment::from_pmmr(id, &pmmr, true)?; + debug!( + "rangeproof_segment: id: ({}, {}), leaves: {}, hashes: {}, proof hashes: {}, took {}ms", + segment.id().height, + segment.id().idx, + segment.leaf_iter().count(), + segment.hash_iter().count(), + segment.proof().size(), + now.elapsed().as_millis() + ); + Ok(segment) + } +} diff --git a/chain/src/txhashset/txhashset.rs b/chain/src/txhashset/txhashset.rs index 1c3a99a3ba..75b5dbda37 100644 --- a/chain/src/txhashset/txhashset.rs +++ b/chain/src/txhashset/txhashset.rs @@ -19,14 +19,16 @@ use crate::core::consensus::WEEK_HEIGHT; use crate::core::core::committed::Committed; use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::merkle_proof::MerkleProof; -use crate::core::core::pmmr::{self, Backend, ReadablePMMR, ReadonlyPMMR, RewindablePMMR, PMMR}; +use crate::core::core::pmmr::{ + self, Backend, ReadablePMMR, ReadonlyPMMR, RewindablePMMR, VecBackend, PMMR, +}; use crate::core::core::{Block, BlockHeader, KernelFeatures, Output, OutputIdentifier, TxKernel}; use crate::core::global; use crate::core::ser::{PMMRable, ProtocolVersion}; use crate::error::{Error, ErrorKind}; use crate::linked_list::{ListIndex, PruneableListIndex, RewindableListIndex}; use crate::store::{self, Batch, ChainStore}; -use crate::txhashset::bitmap_accumulator::BitmapAccumulator; +use crate::txhashset::bitmap_accumulator::{BitmapAccumulator, BitmapChunk}; use crate::txhashset::{RewindableKernelView, UTXOView}; use crate::types::{CommitPos, HashHeight, OutputRoots, Tip, TxHashSetRoots, TxHashsetWriteStatus}; use crate::util::secp::pedersen::{Commitment, RangeProof}; @@ -299,6 +301,30 @@ impl TxHashSet { .get_last_n_insertions(distance) } + /// Efficient view into the kernel PMMR based on size in header. + pub fn kernel_pmmr_at( + &self, + header: &BlockHeader, + ) -> ReadonlyPMMR> { + ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, header.kernel_mmr_size) + } + + /// Efficient view into the output PMMR based on size in header. + pub fn output_pmmr_at( + &self, + header: &BlockHeader, + ) -> ReadonlyPMMR> { + ReadonlyPMMR::at(&self.output_pmmr_h.backend, header.output_mmr_size) + } + + /// Efficient view into the rangeproof PMMR based on size in header. + pub fn rangeproof_pmmr_at( + &self, + header: &BlockHeader, + ) -> ReadonlyPMMR> { + ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, header.output_mmr_size) + } + /// Convenience function to query the db for a header by its hash. pub fn get_block_header(&self, hash: &Hash) -> Result { Ok(self.commit_index.get_block_header(&hash)?) @@ -1071,11 +1097,33 @@ impl<'a> Extension<'a> { pub fn utxo_view(&'a self, header_ext: &'a HeaderExtension<'a>) -> UTXOView<'a> { UTXOView::new( header_ext.pmmr.readonly_pmmr(), - self.output_pmmr.readonly_pmmr(), - self.rproof_pmmr.readonly_pmmr(), + self.output_readonly_pmmr(), + self.rproof_readonly_pmmr(), ) } + /// Readonly view of our output data. + pub fn output_readonly_pmmr( + &self, + ) -> ReadonlyPMMR> { + self.output_pmmr.readonly_pmmr() + } + + /// Take a snapshot of our bitmap accumulator + pub fn bitmap_accumulator(&self) -> BitmapAccumulator { + self.bitmap_accumulator.clone() + } + + /// Readonly view of our bitmap accumulator data. + pub fn bitmap_readonly_pmmr(&self) -> ReadonlyPMMR> { + self.bitmap_accumulator.readonly_pmmr() + } + + /// Readonly view of our rangeproof data. + pub fn rproof_readonly_pmmr(&self) -> ReadonlyPMMR> { + self.rproof_pmmr.readonly_pmmr() + } + /// Apply a new block to the current txhashet extension (output, rangeproof, kernel MMRs). /// Returns a vec of commit_pos representing the pos and height of the outputs spent /// by this block. diff --git a/core/src/core/pmmr/rewindable_pmmr.rs b/core/src/core/pmmr/rewindable_pmmr.rs index 2985be7252..dd238e1853 100644 --- a/core/src/core/pmmr/rewindable_pmmr.rs +++ b/core/src/core/pmmr/rewindable_pmmr.rs @@ -17,9 +17,8 @@ use std::marker; -use crate::core::hash::{Hash, ZERO_HASH}; -use crate::core::pmmr::{is_leaf, peaks, round_up_to_leaf_pos, Backend}; -use crate::ser::{PMMRIndexHashable, PMMRable}; +use crate::core::pmmr::{bintree_postorder_height, Backend, ReadonlyPMMR}; +use crate::ser::PMMRable; /// Rewindable (but still readonly) view of a PMMR. pub struct RewindablePMMR<'a, T, B> @@ -49,11 +48,6 @@ where } } - /// Reference to the underlying storage backend. - pub fn backend(&'a self) -> &dyn Backend { - self.backend - } - /// Build a new readonly PMMR pre-initialized to /// last_pos with the provided backend. pub fn at(backend: &'a B, last_pos: u64) -> RewindablePMMR<'_, T, B> { @@ -74,57 +68,10 @@ where Ok(()) } - /// Get the data element at provided position in the MMR. - pub fn get_data(&self, pos: u64) -> Option { - if pos > self.last_pos { - // If we are beyond the rhs of the MMR return None. - None - } else if is_leaf(pos) { - // If we are a leaf then get data from the backend. - self.backend.get_data(pos) - } else { - // If we are not a leaf then return None as only leaves have data. - None - } - } - - /// Is the MMR empty? - pub fn is_empty(&self) -> bool { - self.last_pos == 0 - } - - /// Computes the root of the MMR. Find all the peaks in the current - /// tree and "bags" them to get a single peak. - pub fn root(&self) -> Result { - if self.is_empty() { - return Ok(ZERO_HASH); - } - let mut res = None; - for peak in self.peaks().iter().rev() { - res = match res { - None => Some(*peak), - Some(rhash) => Some((*peak, rhash).hash_with_index(self.unpruned_size())), - } - } - res.ok_or_else(|| "no root, invalid tree".to_owned()) - } - - /// Returns a vec of the peaks of this MMR. - pub fn peaks(&self) -> Vec { - let peaks_pos = peaks(self.last_pos); - peaks_pos - .into_iter() - .filter_map(|pi| { - // here we want to get from underlying hash file - // as the pos *may* have been "removed" - self.backend.get_from_file(pi) - }) - .collect() - } - - /// Total size of the tree, including intermediary nodes and ignoring any - /// pruning. - pub fn unpruned_size(&self) -> u64 { - self.last_pos + /// Allows conversion of a "rewindable" PMMR into a "readonly" PMMR. + /// Intended usage is to create a rewindable PMMR, rewind it, + /// then convert to "readonly" and read from it. + pub fn as_readonly(&self) -> ReadonlyPMMR<'a, T, B> { + ReadonlyPMMR::at(&self.backend, self.last_pos) } } diff --git a/core/src/core/pmmr/segment.rs b/core/src/core/pmmr/segment.rs index 33bda343c1..e813e3721f 100644 --- a/core/src/core/pmmr/segment.rs +++ b/core/src/core/pmmr/segment.rs @@ -210,6 +210,16 @@ impl Segment { .zip(&self.hashes) .map(|(&p, &h)| (p, h)) } + + /// Segment proof + pub fn proof(&self) -> &SegmentProof { + &self.proof + } + + /// Segment identifier + pub fn id(&self) -> SegmentIdentifier { + self.identifier + } } impl Segment @@ -601,6 +611,11 @@ impl SegmentProof { Ok(proof) } + /// Size of the proof in hashes. + pub fn size(&self) -> usize { + self.hashes.len() + } + /// Reconstruct PMMR root using this proof pub fn reconstruct_root( &self, diff --git a/util/src/lib.rs b/util/src/lib.rs index 29d1753697..f9028f452b 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -33,8 +33,7 @@ pub use ov3::OnionV3Address; pub use ov3::OnionV3Error as OnionV3AddressError; // Re-export so only has to be included once -pub use parking_lot::Mutex; -pub use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard}; +pub use parking_lot::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard}; // Re-export so only has to be included once pub use secp256k1zkp as secp; From e03f36402707c13e88f06f421738cf616bb891f6 Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 14:44:27 -0700 Subject: [PATCH 07/96] grin v5.3 (0011) use extend_from_slice when appending multiple hashes to hash file (#3497) * use extend_from_slice when appending multiple hashes to hash file * bump --- core/src/core/pmmr/backend.rs | 2 +- core/src/core/pmmr/vec_backend.rs | 4 ++-- store/src/pmmr.rs | 10 ++++------ store/src/types.rs | 16 ++++++++++++++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/src/core/pmmr/backend.rs b/core/src/core/pmmr/backend.rs index a752b6afaa..dc1e8ce550 100644 --- a/core/src/core/pmmr/backend.rs +++ b/core/src/core/pmmr/backend.rs @@ -27,7 +27,7 @@ pub trait Backend { /// associated data element to flatfile storage (for leaf nodes only). The /// position of the first element of the Vec in the MMR is provided to /// help the implementation. - fn append(&mut self, data: &T, hashes: Vec) -> Result<(), String>; + fn append(&mut self, data: &T, hashes: &[Hash]) -> Result<(), String>; /// Rebuilding a PMMR locally from PIBD segments requires pruned subtree support. /// This allows us to append an existing pruned subtree directly without the underlying leaf nodes. diff --git a/core/src/core/pmmr/vec_backend.rs b/core/src/core/pmmr/vec_backend.rs index 3892dc9cdc..f1ec2bce8f 100644 --- a/core/src/core/pmmr/vec_backend.rs +++ b/core/src/core/pmmr/vec_backend.rs @@ -35,11 +35,11 @@ pub struct VecBackend { } impl Backend for VecBackend { - fn append(&mut self, elmt: &T, hashes: Vec) -> Result<(), String> { + fn append(&mut self, elmt: &T, hashes: &[Hash]) -> Result<(), String> { if let Some(data) = &mut self.data { data.push(elmt.clone()); } - self.hashes.append(&mut hashes.clone()); + self.hashes.extend_from_slice(hashes); Ok(()) } diff --git a/store/src/pmmr.rs b/store/src/pmmr.rs index 3e3b52771e..fa1aa429b4 100644 --- a/store/src/pmmr.rs +++ b/store/src/pmmr.rs @@ -65,17 +65,15 @@ pub struct PMMRBackend { impl Backend for PMMRBackend { /// Append the provided data and hashes to the backend storage. /// Add the new leaf pos to our leaf_set if this is a prunable MMR. - fn append(&mut self, data: &T, hashes: Vec) -> Result<(), String> { + fn append(&mut self, data: &T, hashes: &[Hash]) -> Result<(), String> { let size = self .data_file .append(&data.as_elmt()) .map_err(|e| format!("Failed to append data to file. {}", e))?; - for h in &hashes { - self.hash_file - .append(h) - .map_err(|e| format!("Failed to append hash to file. {}", e))?; - } + self.hash_file + .extend_from_slice(hashes) + .map_err(|e| format!("Failed to append hash to file. {}", e))?; if self.prunable { // (Re)calculate the latest pos given updated size of data file diff --git a/store/src/types.rs b/store/src/types.rs index 9980534065..307518dc92 100644 --- a/store/src/types.rs +++ b/store/src/types.rs @@ -99,6 +99,14 @@ where Ok(self.size_unsync()) } + /// Append a slice of multiple elements to the file. + /// Will not be written to disk until flush() is subsequently called. + /// Alternatively discard() may be called to discard any pending changes. + pub fn extend_from_slice(&mut self, data: &[T]) -> io::Result { + self.file.append_elmts(data)?; + Ok(self.size_unsync()) + } + /// Read an element from the file by position. /// Assumes we have already "shifted" the position to account for pruned data. /// Note: PMMR API is 1-indexed, but backend storage is 0-indexed. @@ -281,6 +289,14 @@ where Ok(()) } + /// Iterate over the slice and append each element. + fn append_elmts(&mut self, data: &[T]) -> io::Result<()> { + for x in data { + self.append_elmt(x)?; + } + Ok(()) + } + /// Append data to the file. Until the append-only file is synced, data is /// only written to memory. pub fn append(&mut self, bytes: &mut [u8]) -> io::Result<()> { From e1cfa248285aa56ffe1f5563839ae4c7a0214b32 Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 16:02:09 -0700 Subject: [PATCH 08/96] grin v5.3 (0011) fixed build issue. Tests are not passing. --- chain/src/chain.rs | 2 +- chain/src/pipe.rs | 47 ++++++------- chain/src/txhashset/bitmap_accumulator.rs | 10 ++- chain/src/txhashset/txhashset.rs | 6 +- chain/src/txhashset/utxo_view.rs | 4 +- chain/tests/bitmap_segment.rs | 2 +- core/src/core/pmmr/rewindable_pmmr.rs | 2 +- core/tests/pmmr.rs | 74 ------------------- p2p/tests/capabilities.rs | 2 + p2p/tests/ser_deser.rs | 13 ++-- servers/src/common/adapters.rs | 6 ++ servers/src/grin/server.rs | 15 ++-- servers/src/grin/sync/header_sync.rs | 13 ++-- store/src/pmmr.rs | 21 ------ store/src/prune_list.rs | 86 +---------------------- store/tests/prune_list.rs | 85 ---------------------- 16 files changed, 69 insertions(+), 319 deletions(-) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 26dde22879..2a2ced4063 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -1826,7 +1826,7 @@ fn setup_head( })?; } - if sync_pmmr.last_pos == 0 { + if sync_pmmr.size == 0 { txhashset::header_extending(sync_pmmr, &mut batch, |ext, _| { ext.apply_header(&genesis.header) })?; diff --git a/chain/src/pipe.rs b/chain/src/pipe.rs index 24be0870f7..9834996422 100644 --- a/chain/src/pipe.rs +++ b/chain/src/pipe.rs @@ -289,7 +289,7 @@ pub fn replay_attack_check( /// This is only used during header sync. /// Will update header_head locally if this batch of headers increases total work. /// Returns the updated sync_head, which may be on a fork. -pub fn sync_block_headers( +pub fn process_block_headers( headers: &[BlockHeader], sync_head: Tip, ctx: &mut BlockContext<'_>, @@ -299,7 +299,7 @@ pub fn sync_block_headers( } let last_header = headers.last().expect("last header"); - let head = ctx.batch.header_head()?; + let head = ctx.batch.header_head()?; // Validate each header in the chunk and add to our db. // Note: This batch may be rolled back later if the MMR does not validate successfully. @@ -312,27 +312,26 @@ pub fn sync_block_headers( // Now apply this entire chunk of headers to the header MMR. txhashset::header_extending(&mut ctx.header_pmmr, &mut ctx.batch, |ext, batch| { rewind_and_apply_header_fork(&last_header, ext, batch)?; - // If previous sync_head is not on the "current" chain then - // these headers are on an alternative fork to sync_head. - let alt_fork = !ext.is_on_current_chain(sync_head, batch)?; - - // Update our "header_head" if this batch results in an increase in total work. - // Otherwise rollback this header extension. - // Note the outer batch may still be committed to db assuming no errors occur in the extension. - if has_more_work(last_header, &head) { - let header_head = last_header.into(); - update_header_head(&header_head, &batch)?; - } else { - ext.force_rollback(); - }; - - Ok(()) - if alt_fork || has_more_work(last_header, &sync_head) { - Ok(Some(last_header.into())) - } else { - Ok(None) - } - }) + // If previous sync_head is not on the "current" chain then + // these headers are on an alternative fork to sync_head. + let alt_fork = !ext.is_on_current_chain(sync_head, batch)?; + + // Update our "header_head" if this batch results in an increase in total work. + // Otherwise rollback this header extension. + // Note the outer batch may still be committed to db assuming no errors occur in the extension. + if has_more_work(last_header, &head) { + let header_head = last_header.into(); + update_header_head(&header_head, &batch)?; + } else { + ext.force_rollback(); + }; + + if alt_fork || has_more_work(last_header, &sync_head) { + Ok(Some(last_header.into())) + } else { + Ok(None) + } + }) } /// Process a block header. Update the header MMR and corresponding header_head if this header @@ -385,7 +384,7 @@ pub fn process_block_header(header: &BlockHeader, ctx: &mut BlockContext<'_>) -> update_header_head(&Tip::from_header(header), &mut ctx.batch)?; } - Ok(()) + Ok(()) } /// Quick check to reject recently handled blocks. diff --git a/chain/src/txhashset/bitmap_accumulator.rs b/chain/src/txhashset/bitmap_accumulator.rs index e2f523f6e1..2464b6518a 100644 --- a/chain/src/txhashset/bitmap_accumulator.rs +++ b/chain/src/txhashset/bitmap_accumulator.rs @@ -430,7 +430,11 @@ impl Readable for BitmapBlock { fn read(reader: &mut R) -> Result { let n_chunks = reader.read_u8()?; if n_chunks as usize > BitmapBlock::NCHUNKS { - return Err(ser::Error::TooLargeReadErr); + return Err(ser::Error::TooLargeReadErr(format!( + "Requested {} chunks, limit is {}", + n_chunks, + BitmapBlock::NCHUNKS + ))); } let n_bits = n_chunks as usize * BitmapChunk::LEN_BITS; @@ -483,7 +487,9 @@ impl Writeable for BitmapBlockSerialization { impl Readable for BitmapBlockSerialization { fn read(reader: &mut R) -> Result { - Self::from_u8(reader.read_u8()?).ok_or(ser::Error::CorruptedData) + Self::from_u8(reader.read_u8()?).ok_or(ser::Error::CorruptedData(format!( + "Failed to read the next byte" + ))) } } diff --git a/chain/src/txhashset/txhashset.rs b/chain/src/txhashset/txhashset.rs index 75b5dbda37..fe0cc06759 100644 --- a/chain/src/txhashset/txhashset.rs +++ b/chain/src/txhashset/txhashset.rs @@ -411,7 +411,7 @@ impl TxHashSet { PMMR::at(&mut self.output_pmmr_h.backend, self.output_pmmr_h.size) .merkle_proof(pos0) .map_err(|e| { - ErrorKind::MerkleProof(format!("Commit {:?}, pos {}, {}", commit, pos, e)).into() + ErrorKind::MerkleProof(format!("Commit {:?}, pos {}, {}", commit, pos0, e)).into() }) } @@ -1688,14 +1688,14 @@ impl<'a> Extension<'a> { (None, _) => { return Err(ErrorKind::OutputNotFound(format!( "at verify_rangeproofs for pos {}", - pos + pos0 )) .into()) } (_, None) => { return Err(ErrorKind::RangeproofNotFound(format!( "at verify_rangeproofs for pos {}", - pos + pos0 )) .into()) } diff --git a/chain/src/txhashset/utxo_view.rs b/chain/src/txhashset/utxo_view.rs index aa3834ed63..e4a876575b 100644 --- a/chain/src/txhashset/utxo_view.rs +++ b/chain/src/txhashset/utxo_view.rs @@ -156,9 +156,9 @@ impl<'a> UTXOView<'a> { match self.output_pmmr.get_data(pos0) { Some(output_id) => match self.rproof_pmmr.get_data(pos0) { Some(rproof) => Ok(output_id.into_output(rproof)), - None => Err(ErrorKind::RangeproofNotFound(format!("at position {}", pos)).into()), + None => Err(ErrorKind::RangeproofNotFound(format!("at position {}", pos0)).into()), }, - None => Err(ErrorKind::OutputNotFound(format!("at position {}", pos)).into()), + None => Err(ErrorKind::OutputNotFound(format!("at position {}", pos0)).into()), } } diff --git a/chain/tests/bitmap_segment.rs b/chain/tests/bitmap_segment.rs index f0695a0b2e..003009568e 100644 --- a/chain/tests/bitmap_segment.rs +++ b/chain/tests/bitmap_segment.rs @@ -17,7 +17,7 @@ fn test_roundtrip(entries: usize) { }; let block = rng.gen_range(2, 64); - let mut bitmap = Bitmap::create(); + let mut bitmap = Bitmap::new(); let block_size = 1 << 16; let offset = (1 << identifier.height) * 1024 * identifier.idx + block_size * block; let mut count = 0; diff --git a/core/src/core/pmmr/rewindable_pmmr.rs b/core/src/core/pmmr/rewindable_pmmr.rs index dd238e1853..fda752e268 100644 --- a/core/src/core/pmmr/rewindable_pmmr.rs +++ b/core/src/core/pmmr/rewindable_pmmr.rs @@ -17,7 +17,7 @@ use std::marker; -use crate::core::pmmr::{bintree_postorder_height, Backend, ReadonlyPMMR}; +use crate::core::pmmr::{round_up_to_leaf_pos, Backend, ReadonlyPMMR}; use crate::ser::PMMRable; /// Rewindable (but still readonly) view of a PMMR. diff --git a/core/tests/pmmr.rs b/core/tests/pmmr.rs index 6e56222062..ff1e493d33 100644 --- a/core/tests/pmmr.rs +++ b/core/tests/pmmr.rs @@ -195,80 +195,6 @@ fn test_pmmr_leaf_to_insertion_index() { ); } -#[test] -fn test_bintree_leaf_pos_iter() { - assert_eq!(pmmr::bintree_leaf_pos_iter(0).count(), 0); - assert_eq!(pmmr::bintree_leaf_pos_iter(1).collect::>(), [1]); - assert_eq!(pmmr::bintree_leaf_pos_iter(2).collect::>(), [2]); - assert_eq!(pmmr::bintree_leaf_pos_iter(3).collect::>(), [1, 2]); - assert_eq!(pmmr::bintree_leaf_pos_iter(4).collect::>(), [4]); - assert_eq!(pmmr::bintree_leaf_pos_iter(5).collect::>(), [5]); - assert_eq!(pmmr::bintree_leaf_pos_iter(6).collect::>(), [4, 5]); - assert_eq!( - pmmr::bintree_leaf_pos_iter(7).collect::>(), - [1, 2, 4, 5] - ); -} - -#[test] -fn test_bintree_pos_iter() { - assert_eq!(pmmr::bintree_pos_iter(0).count(), 0); - assert_eq!(pmmr::bintree_pos_iter(1).collect::>(), [1]); - assert_eq!(pmmr::bintree_pos_iter(2).collect::>(), [2]); - assert_eq!(pmmr::bintree_pos_iter(3).collect::>(), [1, 2, 3]); - assert_eq!(pmmr::bintree_pos_iter(4).collect::>(), [4]); - assert_eq!(pmmr::bintree_pos_iter(5).collect::>(), [5]); - assert_eq!(pmmr::bintree_pos_iter(6).collect::>(), [4, 5, 6]); - assert_eq!( - pmmr::bintree_pos_iter(7).collect::>(), - [1, 2, 3, 4, 5, 6, 7] - ); -} - -#[test] -fn test_is_leaf() { - assert_eq!(pmmr::is_leaf(0), false); - assert_eq!(pmmr::is_leaf(1), true); - assert_eq!(pmmr::is_leaf(2), true); - assert_eq!(pmmr::is_leaf(3), false); - assert_eq!(pmmr::is_leaf(4), true); - assert_eq!(pmmr::is_leaf(5), true); - assert_eq!(pmmr::is_leaf(6), false); - assert_eq!(pmmr::is_leaf(7), false); -} - -#[test] -fn test_pmmr_leaf_to_insertion_index() { - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(1), Some(0)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(2), Some(1)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(4), Some(2)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(5), Some(3)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(8), Some(4)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(9), Some(5)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(11), Some(6)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(12), Some(7)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(16), Some(8)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(17), Some(9)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(19), Some(10)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(20), Some(11)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(23), Some(12)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(24), Some(13)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(26), Some(14)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(27), Some(15)); - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(32), Some(16)); - - // Not a leaf node - assert_eq!(pmmr::pmmr_leaf_to_insertion_index(31), None); - - // Sanity check to make sure we don't get an explosion around the u64 max - // number of leaves - let n_leaves_max_u64 = pmmr::n_leaves(u64::MAX - 256); - assert_eq!( - pmmr::pmmr_leaf_to_insertion_index(n_leaves_max_u64), - Some(4611686018427387884) - ); -} - #[test] fn test_n_leaves() { // make sure we handle an empty MMR correctly diff --git a/p2p/tests/capabilities.rs b/p2p/tests/capabilities.rs index 1e179a4e98..3df837205e 100644 --- a/p2p/tests/capabilities.rs +++ b/p2p/tests/capabilities.rs @@ -41,6 +41,7 @@ fn default_capabilities() { assert!(x.contains(Capabilities::TXHASHSET_HIST)); assert!(x.contains(Capabilities::PEER_LIST)); assert!(x.contains(Capabilities::TX_KERNEL_HASH)); + assert!(x.contains(Capabilities::TOR_ADDRESS)); assert_eq!( x, @@ -48,5 +49,6 @@ fn default_capabilities() { | Capabilities::TXHASHSET_HIST | Capabilities::PEER_LIST | Capabilities::TX_KERNEL_HASH + | Capabilities::TOR_ADDRESS ); } diff --git a/p2p/tests/ser_deser.rs b/p2p/tests/ser_deser.rs index f8bbe1af4a..70ba0583e8 100644 --- a/p2p/tests/ser_deser.rs +++ b/p2p/tests/ser_deser.rs @@ -54,21 +54,20 @@ fn test_capabilities() { ); assert_eq!( - expected, + expected, p2p::types::Capabilities::from_bits_truncate(0b11111 as u32), ); assert_eq!( - expected, - p2p::types::Capabilities::from_bits_truncate(0b00011111 as u32), + expected, + p2p::types::Capabilities::from_bits_truncate(0b00011111 as u32), ); assert_eq!( - expected, - p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32), + expected, + p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32), ); - assert!(p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32).contains(expected)); - ); + assert!(p2p::types::Capabilities::from_bits_truncate(0b01011111 as u32).contains(expected)); assert!( p2p::types::Capabilities::from_bits_truncate(0b00101111 as u32) diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index 4801725025..df3d2a2afb 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -401,6 +401,12 @@ where peer_info: &PeerInfo, header_cache_size: u64, ) -> Result { + info!( + "Received {} block headers from {}", + bhs.len(), + peer_info.addr + ); + let tip_processed = { let mut tip_processed = self.tip_processed.lock().unwrap(); let sync_head_height = self.chain().get_sync_head()?.height; diff --git a/servers/src/grin/server.rs b/servers/src/grin/server.rs index 8195db97b6..b08bd5e28e 100644 --- a/servers/src/grin/server.rs +++ b/servers/src/grin/server.rs @@ -73,6 +73,7 @@ use std::sync::atomic::Ordering; use crate::p2p::libp2p_connection; use chrono::Utc; use grin_core::core::TxKernel; +use grin_p2p::Capabilities; use grin_util::from_hex; use grin_util::secp::constants::SECRET_KEY_SIZE; use grin_util::secp::pedersen::Commitment; @@ -294,12 +295,6 @@ impl Server { init_net_hooks(&config), )); - // we always support tor, so don't rely on config. This fixes - // the problem of old config files - // only for capabilities params, doesn't mean - // tor _MUST_ be on. - let capab = config.p2p_config.capabilities | p2p::Capabilities::TOR_ADDRESS; - api::reset_server_onion_address(); let (onion_address, tor_secret) = if config.tor_config.tor_enabled { @@ -513,9 +508,14 @@ impl Server { })?; } + // Use our default capabilities here. + // We will advertize these to our peers during hand/shake. + let capabilities = Capabilities::default(); + debug!("Capabilities: {:?}", capabilities); + let p2p_server = Arc::new(p2p::Server::new( &config.db_root, - capab, + capabilities, config.p2p_config.clone(), net_adapter.clone(), genesis.hash(), @@ -556,7 +556,6 @@ impl Server { connect_thread = Some(seed::connect_and_monitor( p2p_server.clone(), - config.p2p_config.capabilities, seeder, &preferred_peers, stop_state.clone(), diff --git a/servers/src/grin/sync/header_sync.rs b/servers/src/grin/sync/header_sync.rs index 73c0be0fde..4ec5d070d1 100644 --- a/servers/src/grin/sync/header_sync.rs +++ b/servers/src/grin/sync/header_sync.rs @@ -18,7 +18,9 @@ use std::sync::Arc; use crate::chain::{self, SyncState, SyncStatus}; use crate::common::types::Error; -use crate::core::core::hash::{Hash, Hashed}; +use crate::core::core::hash::Hash; +use crate::core::core::hash::Hashed; +use crate::core::pow::Difficulty; use crate::p2p::{self, types::ReasonForBan, Capabilities, Peer}; pub struct HeaderSync { @@ -47,19 +49,20 @@ impl HeaderSync { } pub fn check_run(&mut self, sync_head: chain::Tip) -> Result { + // We only want to run header_sync for some sync states. // We only want to run header_sync for some sync states. let do_run = match self.sync_state.status() { SyncStatus::BodySync { .. } | SyncStatus::HeaderSync { .. } | SyncStatus::TxHashsetDone => true, SyncStatus::NoSync | SyncStatus::Initial | SyncStatus::AwaitingPeers(_) => { - let sync_head = self.chain.get_sync_head()?; + let sync_head_sync = self.chain.get_sync_head()?; debug!( "sync: initial transition to HeaderSync. sync_head: {} at {}, resetting to: {} at {}", + sync_head_sync.hash(), + sync_head_sync.height, sync_head.hash(), sync_head.height, - header_head.hash(), - header_head.height, ); // Reset sync_head to header_head on transition to HeaderSync, @@ -70,7 +73,7 @@ impl HeaderSync { // correctly, so reset any previous (and potentially stale) sync_head to match // our last known "good" header_head. // - self.chain.rebuild_sync_mmr(&header_head)?; + self.chain.rebuild_sync_mmr(&sync_head)?; true } _ => false, diff --git a/store/src/pmmr.rs b/store/src/pmmr.rs index fa1aa429b4..b5d4d2e386 100644 --- a/store/src/pmmr.rs +++ b/store/src/pmmr.rs @@ -102,22 +102,6 @@ impl Backend for PMMRBackend { Ok(()) } - // Supports appending a pruned subtree (single root hash) to an existing hash file. - // Update the prune_list "shift cache" to reflect the new pruned leaf pos in the subtree. - fn append_pruned_subtree(&mut self, hash: Hash, pos: u64) -> Result<(), String> { - if !self.prunable { - return Err("Not prunable, cannot append pruned subtree.".into()); - } - - self.hash_file - .append(&hash) - .map_err(|e| format!("Failed to append subtree hash to file. {}", e))?; - - self.prune_list.append(pos); - - Ok(()) - } - fn get_from_file(&self, pos0: u64) -> Option { if self.is_compacted(pos0) { return None; @@ -131,11 +115,6 @@ impl Backend for PMMRBackend { self.hash_file.read(1 + pos0 - shift) } - fn get_peak_from_file(&self, position: u64) -> Option { - let shift = self.prune_list.get_shift(position); - self.hash_file.read(position - shift) - } - fn get_data_from_file(&self, pos0: u64) -> Option { if !pmmr::is_leaf(pos0) { return None; diff --git a/store/src/prune_list.rs b/store/src/prune_list.rs index f76ca7a70d..7154d5bb47 100644 --- a/store/src/prune_list.rs +++ b/store/src/prune_list.rs @@ -265,7 +265,7 @@ impl PruneList { self.shift_cache.truncate(idx as usize); self.leaf_shift_cache.truncate(idx as usize); - self.bitmap.remove_range_closed(cleanup_pos1) + self.bitmap.remove_range(cleanup_pos1) } /// Push the node at the provided position in the prune list. @@ -352,22 +352,6 @@ impl PruneList { self.leaf_shift_cache.as_slice() } - /// Convert the prune_list to a vec of pos. - pub fn to_vec(&self) -> Vec { - self.bitmap.iter().map(|x| x as u64).collect() - } - - /// Internal shift cache as slice. - pub fn shift_cache(&self) -> &[u64] { - self.shift_cache.as_slice() - } - - /// Internal leaf shift cache as slice. - /// only used in store/tests/prune_list.rs tests - pub fn leaf_shift_cache(&self) -> &[u64] { - self.leaf_shift_cache.as_slice() - } - /// Is the specified position a root of a pruned subtree? pub fn is_pruned_root(&self, pos0: u64) -> bool { self.bitmap.contains(1 + pos0 as u32) @@ -404,74 +388,6 @@ impl PruneList { pub fn bitmap(&self) -> Bitmap { self.bitmap.clone() } - - /// Iterator over the entries in the prune list (pruned roots). - pub fn iter(&self) -> impl Iterator + '_ { - self.bitmap.iter().map(|x| x as u64) - } - - /// Iterator over the pruned "bintree range" for each pruned root. - pub fn pruned_bintree_range_iter(&self) -> impl Iterator> + '_ { - self.iter().map(|x| pmmr::bintree_range(x)) - } - - /// Iterator over all pos that are *not* pruned based on current prune_list. - pub fn unpruned_iter(&self, cutoff_pos: u64) -> impl Iterator + '_ { - UnprunedIterator::new(self.pruned_bintree_range_iter()) - .take_while(move |x| *x <= cutoff_pos) - } - - /// Iterator over all leaf pos that are *not* pruned based on current prune_list. - /// Note this is not necessarily the same as the "leaf_set" as an output - /// can be spent but not yet pruned. - pub fn unpruned_leaf_iter(&self, cutoff_pos: u64) -> impl Iterator + '_ { - self.unpruned_iter(cutoff_pos).filter(|x| pmmr::is_leaf(*x)) - } - - /// Return a clone of our internal bitmap. - pub fn bitmap(&self) -> Bitmap { - self.bitmap.clone() - } -} - -struct UnprunedIterator { - inner: I, - current_excl_range: Option>, - current_pos: u64, -} - -impl>> UnprunedIterator { - fn new(mut inner: I) -> UnprunedIterator { - let current_excl_range = inner.next(); - UnprunedIterator { - inner, - current_excl_range, - current_pos: 1, - } - } -} - -impl>> Iterator for UnprunedIterator { - type Item = u64; - - fn next(&mut self) -> Option { - if let Some(range) = &self.current_excl_range { - if self.current_pos < range.start { - let next = self.current_pos; - self.current_pos += 1; - Some(next) - } else { - // skip the entire excluded range, moving to next excluded range as necessary - self.current_pos = range.end; - self.current_excl_range = self.inner.next(); - self.next() - } - } else { - let next = self.current_pos; - self.current_pos += 1; - Some(next) - } - } } struct UnprunedIterator { diff --git a/store/tests/prune_list.rs b/store/tests/prune_list.rs index 60f68312df..935da0acd8 100644 --- a/store/tests/prune_list.rs +++ b/store/tests/prune_list.rs @@ -321,91 +321,6 @@ fn test_unpruned_leaf_iter() { assert_eq!(pl.unpruned_leaf_iter(9).collect::>(), [1, 8, 9]); } -#[test] -pub fn test_iter() { - let mut pl = PruneList::empty(); - pl.append(1); - pl.append(2); - pl.append(4); - assert_eq!(pl.iter().collect::>(), [3, 4]); - - let mut pl = PruneList::empty(); - pl.append(1); - pl.append(2); - pl.append(5); - assert_eq!(pl.iter().collect::>(), [3, 5]); -} - -#[test] -pub fn test_pruned_bintree_range_iter() { - let mut pl = PruneList::empty(); - pl.append(1); - pl.append(2); - pl.append(4); - assert_eq!( - pl.pruned_bintree_range_iter().collect::>(), - [1..4, 4..5] - ); - - let mut pl = PruneList::empty(); - pl.append(1); - pl.append(2); - pl.append(5); - assert_eq!( - pl.pruned_bintree_range_iter().collect::>(), - [1..4, 5..6] - ); -} - -#[test] -pub fn test_unpruned_iter() { - let pl = PruneList::empty(); - assert_eq!(pl.unpruned_iter(5).collect::>(), [1, 2, 3, 4, 5]); - - let mut pl = PruneList::empty(); - pl.append(2); - assert_eq!(pl.iter().collect::>(), [2]); - assert_eq!(pl.pruned_bintree_range_iter().collect::>(), [2..3]); - assert_eq!(pl.unpruned_iter(4).collect::>(), [1, 3, 4]); - - let mut pl = PruneList::empty(); - pl.append(2); - pl.append(4); - pl.append(5); - assert_eq!(pl.iter().collect::>(), [2, 6]); - assert_eq!( - pl.pruned_bintree_range_iter().collect::>(), - [2..3, 4..7] - ); - assert_eq!(pl.unpruned_iter(9).collect::>(), [1, 3, 7, 8, 9]); -} - -#[test] -fn test_unpruned_leaf_iter() { - let pl = PruneList::empty(); - assert_eq!( - pl.unpruned_leaf_iter(8).collect::>(), - [1, 2, 4, 5, 8] - ); - - let mut pl = PruneList::empty(); - pl.append(2); - assert_eq!(pl.iter().collect::>(), [2]); - assert_eq!(pl.pruned_bintree_range_iter().collect::>(), [2..3]); - assert_eq!(pl.unpruned_leaf_iter(5).collect::>(), [1, 4, 5]); - - let mut pl = PruneList::empty(); - pl.append(2); - pl.append(4); - pl.append(5); - assert_eq!(pl.iter().collect::>(), [2, 6]); - assert_eq!( - pl.pruned_bintree_range_iter().collect::>(), - [2..3, 4..7] - ); - assert_eq!(pl.unpruned_leaf_iter(9).collect::>(), [1, 8, 9]); -} - pub fn test_append_pruned_subtree() { let mut pl = PruneList::empty(); From 4bc56001702fdec3e0b97de35c43936134dcf384 Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 16:24:49 -0700 Subject: [PATCH 09/96] grin v5.3 (0014) fix calls to next_diff() in tests to use next height correctly (#3501) --- chain/tests/chain_test_helper.rs | 7 ++--- chain/tests/mine_simple_chain.rs | 5 +++- chain/tests/test_coinbase_maturity.rs | 37 +++++++++++++++++---------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/chain/tests/chain_test_helper.rs b/chain/tests/chain_test_helper.rs index 6b4ceae539..72ecb59817 100644 --- a/chain/tests/chain_test_helper.rs +++ b/chain/tests/chain_test_helper.rs @@ -87,7 +87,8 @@ where { for n in 1..chain_length { let prev = chain.head_header().unwrap(); - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); let pk = ExtKeychainPath::new(1, n as u32, 0, 0, 0).to_identifier(); let reward = libtx::reward::output( keychain, @@ -98,8 +99,8 @@ where n, ) .unwrap(); - let mut b = core::core::Block::new(&prev, &[], next_header_info.clone().difficulty, reward) - .unwrap(); + let mut b = + core::core::Block::new(&prev, &[], next_header_info.difficulty, reward).unwrap(); b.header.timestamp = prev.timestamp + Duration::seconds(60); b.header.pow.secondary_scaling = next_header_info.secondary_scaling; diff --git a/chain/tests/mine_simple_chain.rs b/chain/tests/mine_simple_chain.rs index 5516289915..685d1687d5 100644 --- a/chain/tests/mine_simple_chain.rs +++ b/chain/tests/mine_simple_chain.rs @@ -762,7 +762,9 @@ fn spend_in_fork_and_compact() { /// Test ability to retrieve block headers for a given output #[test] fn output_header_mappings() { + clean_output_dir(".grin_header_for_output"); global::set_local_chain_type(ChainTypes::AutomatedTesting); + util::init_test_logger(); { clean_output_dir(".mwc_header_for_output"); let chain = init_chain(".mwc_header_for_output", pow::mine_genesis_block().unwrap()); @@ -771,7 +773,8 @@ fn output_header_mappings() { for n in 1..15 { let prev = chain.head_header().unwrap(); - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); let pk = ExtKeychainPath::new(1, n as u32, 0, 0, 0).to_identifier(); let reward = libtx::reward::output( &keychain, diff --git a/chain/tests/test_coinbase_maturity.rs b/chain/tests/test_coinbase_maturity.rs index 298c2a0e4a..d90607d025 100644 --- a/chain/tests/test_coinbase_maturity.rs +++ b/chain/tests/test_coinbase_maturity.rs @@ -23,7 +23,6 @@ use self::core::{consensus, pow}; use self::keychain::{ExtKeychain, ExtKeychainPath, Keychain}; use self::util::RwLock; use chrono::Duration; -use env_logger; use grin_chain as chain; use grin_core as core; use grin_keychain as keychain; @@ -37,7 +36,7 @@ fn clean_output_dir(dir_name: &str) { #[test] fn test_coinbase_maturity() { - let _ = env_logger::init(); + util::init_test_logger(); let chain_dir = ".mwc_coinbase"; clean_output_dir(chain_dir); global::set_local_chain_type(ChainTypes::AutomatedTesting); @@ -66,7 +65,8 @@ fn test_coinbase_maturity() { let key_id3 = ExtKeychainPath::new(1, 3, 0, 0, 0).to_identifier(); let key_id4 = ExtKeychainPath::new(1, 4, 0, 0, 0).to_identifier(); - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); let reward = libtx::reward::output(&keychain, &builder, &key_id1, 0, false, 1).unwrap(); let mut block = core::core::Block::new(&prev, &[], Difficulty::min(), reward).unwrap(); block.header.timestamp = prev.timestamp + Duration::seconds(60); @@ -113,8 +113,10 @@ fn test_coinbase_maturity() { let txs = &[coinbase_txn.clone()]; let fees = txs.iter().map(|tx| tx.fee()).sum(); let reward = libtx::reward::output(&keychain, &builder, &key_id3, fees, false, 1).unwrap(); - let mut block = core::core::Block::new(&prev, txs, Difficulty::min(), reward).unwrap(); - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); + let mut block = + core::core::Block::new(&prev, txs, next_header_info.difficulty, reward).unwrap(); block.header.timestamp = prev.timestamp + Duration::seconds(60); block.header.pow.secondary_scaling = next_header_info.secondary_scaling; @@ -147,9 +149,11 @@ fn test_coinbase_maturity() { let builder = ProofBuilder::new(&keychain); let key_id1 = ExtKeychainPath::new(1, 1, 0, 0, 0).to_identifier(); - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); let reward = libtx::reward::output(&keychain, &builder, &key_id1, 0, false, 1).unwrap(); - let mut block = core::core::Block::new(&prev, &[], Difficulty::min(), reward).unwrap(); + let mut block = + core::core::Block::new(&prev, &[], next_header_info.difficulty, reward).unwrap(); block.header.timestamp = prev.timestamp + Duration::seconds(60); block.header.pow.secondary_scaling = next_header_info.secondary_scaling; @@ -196,8 +200,10 @@ fn test_coinbase_maturity() { let fees = txs.iter().map(|tx| tx.fee()).sum(); let reward = libtx::reward::output(&keychain, &builder, &key_id3, fees, false, 1).unwrap(); - let mut block = core::core::Block::new(&prev, txs, Difficulty::min(), reward).unwrap(); - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); + let mut block = + core::core::Block::new(&prev, txs, next_header_info.difficulty, reward).unwrap(); block.header.timestamp = prev.timestamp + Duration::seconds(60); block.header.pow.secondary_scaling = next_header_info.secondary_scaling; @@ -231,10 +237,11 @@ fn test_coinbase_maturity() { let pk = ExtKeychainPath::new(1, 1, 0, 0, 0).to_identifier(); let reward = libtx::reward::output(&keychain, &builder, &pk, 0, false, 1).unwrap(); - let mut block = - core::core::Block::new(&prev, &[], Difficulty::min(), reward).unwrap(); let next_header_info = - consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); + let mut block = + core::core::Block::new(&prev, &[], next_header_info.difficulty, reward) + .unwrap(); block.header.timestamp = prev.timestamp + Duration::seconds(60); block.header.pow.secondary_scaling = next_header_info.secondary_scaling; @@ -261,10 +268,12 @@ fn test_coinbase_maturity() { let txs = &[coinbase_txn]; let fees = txs.iter().map(|tx| tx.fee()).sum(); - let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); + let next_header_info = + consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); let reward = libtx::reward::output(&keychain, &builder, &key_id4, fees, false, 1).unwrap(); - let mut block = core::core::Block::new(&prev, txs, Difficulty::min(), reward).unwrap(); + let mut block = + core::core::Block::new(&prev, txs, next_header_info.difficulty, reward).unwrap(); block.header.timestamp = prev.timestamp + Duration::seconds(60); block.header.pow.secondary_scaling = next_header_info.secondary_scaling; From b2982103af2cbc74bb270c4ed85a2fccee3c36d6 Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 16:27:20 -0700 Subject: [PATCH 10/96] grin v5.3 (0016) add peer capabilities to tui peers screen (#3490) --- servers/src/common/stats.rs | 4 ++++ src/bin/tui/peers.rs | 10 +++++++++- src/bin/tui/table.rs | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/servers/src/common/stats.rs b/servers/src/common/stats.rs index 2347605256..2a961caa0b 100644 --- a/servers/src/common/stats.rs +++ b/servers/src/common/stats.rs @@ -28,6 +28,7 @@ use chrono::prelude::*; use crate::chain::SyncStatus; use crate::p2p; +use crate::p2p::Capabilities; use grin_core::pow::Difficulty; /// Server state info collection struct, to be passed around into internals @@ -192,6 +193,8 @@ pub struct PeerStats { pub sent_bytes_per_sec: u64, /// Number of bytes we've received from the peer. pub received_bytes_per_sec: u64, + /// Peer advertised capability flags. + pub capabilities: Capabilities, } impl PartialEq for PeerStats { @@ -291,6 +294,7 @@ impl PeerStats { last_seen: peer.info.last_seen(), sent_bytes_per_sec: peer.last_min_sent_bytes().unwrap_or(0) / 60, received_bytes_per_sec: peer.last_min_received_bytes().unwrap_or(0) / 60, + capabilities: peer.info.capabilities, } } } diff --git a/src/bin/tui/peers.rs b/src/bin/tui/peers.rs index adb4db057f..672d1cc6d0 100644 --- a/src/bin/tui/peers.rs +++ b/src/bin/tui/peers.rs @@ -41,6 +41,7 @@ pub enum PeerColumn { Direction, Version, UserAgent, + Capabilities, } impl PeerColumn { @@ -53,6 +54,7 @@ impl PeerColumn { PeerColumn::TotalDifficulty => "Total Difficulty", PeerColumn::Direction => "Direction", PeerColumn::UserAgent => "User Agent", + PeerColumn::Capabilities => "Capabilities", } } } @@ -82,6 +84,7 @@ impl TableViewItem for PeerStats { PeerColumn::Direction => self.direction.clone(), PeerColumn::Version => format!("{}", self.version), PeerColumn::UserAgent => self.user_agent.clone(), + PeerColumn::Capabilities => format!("{}", self.capabilities.bits()), } } @@ -115,6 +118,10 @@ impl TableViewItem for PeerStats { PeerColumn::Direction => self.direction.cmp(&other.direction).then(sort_by_addr()), PeerColumn::Version => self.version.cmp(&other.version).then(sort_by_addr()), PeerColumn::UserAgent => self.user_agent.cmp(&other.user_agent).then(sort_by_addr()), + PeerColumn::Capabilities => self + .capabilities + .cmp(&other.capabilities) + .then(sort_by_addr()), } } } @@ -133,7 +140,8 @@ impl TUIPeerView { .column(PeerColumn::TotalDifficulty, "Total Difficulty", |c| { c.width_percent(24) }) - .column(PeerColumn::Version, "Proto", |c| c.width_percent(6)) + .column(PeerColumn::Version, "Proto", |c| c.width_percent(4)) + .column(PeerColumn::Capabilities, "Capab", |c| c.width_percent(4)) .column(PeerColumn::UserAgent, "User Agent", |c| c.width_percent(18)); let peer_status_view = ResizedView::with_full_screen( LinearLayout::new(Orientation::Vertical) diff --git a/src/bin/tui/table.rs b/src/bin/tui/table.rs index b619792959..0fb110ee1a 100644 --- a/src/bin/tui/table.rs +++ b/src/bin/tui/table.rs @@ -995,6 +995,7 @@ impl TableColumn { #[cfg(test)] mod test { + use crate::p2p::Capabilities; use crate::tui::peers::PeerColumn; use crate::tui::table::TableView; use chrono::Utc; @@ -1060,6 +1061,7 @@ mod test { last_seen: Utc::now(), sent_bytes_per_sec: 0, received_bytes_per_sec: 0, + capabilities: Capabilities::FULL_NODE, } } } From f4ebd14b3a656902c195da56e9a3d82310888687 Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 16:36:19 -0700 Subject: [PATCH 11/96] grin v5.3 (0018) fix, no more FULL_NODE (#3504) --- src/bin/tui/table.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/tui/table.rs b/src/bin/tui/table.rs index 0fb110ee1a..694452069a 100644 --- a/src/bin/tui/table.rs +++ b/src/bin/tui/table.rs @@ -1061,7 +1061,7 @@ mod test { last_seen: Utc::now(), sent_bytes_per_sec: 0, received_bytes_per_sec: 0, - capabilities: Capabilities::FULL_NODE, + capabilities: Capabilities::default(), } } } From e5944df518c02272692206fa8c1be43dbfc128a6 Mon Sep 17 00:00:00 2001 From: bayk Date: Sat, 8 Jun 2024 16:41:47 -0700 Subject: [PATCH 12/96] grin v5.3 (0019) Fix missing path in foreign_api_secret, part of Disable API v1 (#3503) --- config/src/config.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/config/src/config.rs b/config/src/config.rs index f4ea031a3c..5e8b588ff6 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -251,10 +251,17 @@ impl GlobalConfig { let mut chain_path = grin_home.clone(); chain_path.push(GRIN_CHAIN_DIR); self.members.as_mut().unwrap().server.db_root = chain_path.to_str().unwrap().to_owned(); - let mut secret_path = grin_home.clone(); - secret_path.push(API_SECRET_FILE_NAME); + let mut api_secret_path = grin_home.clone(); + api_secret_path.push(API_SECRET_FILE_NAME); self.members.as_mut().unwrap().server.api_secret_path = - Some(secret_path.to_str().unwrap().to_owned()); + Some(api_secret_path.to_str().unwrap().to_owned()); + let mut foreign_api_secret_path = grin_home.clone(); + foreign_api_secret_path.push(FOREIGN_API_SECRET_FILE_NAME); + self.members + .as_mut() + .unwrap() + .server + .foreign_api_secret_path = Some(foreign_api_secret_path.to_str().unwrap().to_owned()); let mut log_path = grin_home.clone(); log_path.push(SERVER_LOG_FILE_NAME); self.members From 7dc4125309d1c5bcad45505d28c758867a8d7557 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 13:54:26 -0700 Subject: [PATCH 13/96] grin v5.3 (0020) PIBD segment p2p messages (#3496) * Define PIBD segment p2p messages * Respond to segment requests * Use specialized (de)ser for output bitmap segments * Allowed segment height ranges in const --- Cargo.lock | 2 + chain/src/error.rs | 6 + core/Cargo.toml | 1 + core/src/global.rs | 50 +++- core/src/pow/types.rs | 6 +- core/src/ser.rs | 113 +++++++++ p2p/Cargo.toml | 1 + p2p/src/codec.rs | 257 +++++++++++++++++++ p2p/src/conn.rs | 181 ++++++-------- p2p/src/lib.rs | 1 + p2p/src/msg.rs | 230 ++++++++++++++++- p2p/src/peer.rs | 35 +++ p2p/src/peers.rs | 35 +++ p2p/src/protocol.rs | 433 +++++++++++++++------------------ p2p/src/serv.rs | 35 +++ p2p/src/types.rs | 45 ++++ servers/src/common/adapters.rs | 73 +++++- 17 files changed, 1158 insertions(+), 346 deletions(-) create mode 100644 p2p/src/codec.rs diff --git a/Cargo.lock b/Cargo.lock index ee3eb9ae79..197c6489c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1556,6 +1556,7 @@ version = "4.4.2" dependencies = [ "blake2-rfc", "byteorder", + "bytes 0.5.6", "chrono", "croaring", "enum_primitive", @@ -1605,6 +1606,7 @@ version = "4.4.2" dependencies = [ "async-std", "bitflags 1.2.1", + "bytes 0.5.6", "chrono", "ed25519-dalek", "enum_primitive", diff --git a/chain/src/error.rs b/chain/src/error.rs index 8541a94db6..a040daf0ba 100644 --- a/chain/src/error.rs +++ b/chain/src/error.rs @@ -159,6 +159,12 @@ pub enum ErrorKind { /// PIBD segment related error #[fail(display = "Segment error")] SegmentError(segment::SegmentError), + /// The segmenter is associated to a different block header + #[fail(display = "Segmenter header mismatch")] + SegmenterHeaderMismatch, + /// Segment height not within allowed range + #[fail(display = "Invalid segment height")] + InvalidSegmentHeight, } impl Display for Error { diff --git a/core/Cargo.toml b/core/Cargo.toml index fd47fd6ffb..8af93bdc0f 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -27,6 +27,7 @@ siphasher = "0.3" log = "0.4" chrono = { version = "0.4.11", features = ["serde"] } zeroize = { version = "1.1", features =["zeroize_derive"] } +bytes = "0.5" keychain = { package = "grin_keychain", path = "../keychain", version = "4.4.2" } util = { package = "grin_util", path = "../util", version = "4.4.2" } diff --git a/core/src/global.rs b/core/src/global.rs index c1eb793fb4..e0e25c49ed 100644 --- a/core/src/global.rs +++ b/core/src/global.rs @@ -22,7 +22,7 @@ use crate::consensus::{ DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, MAX_BLOCK_WEIGHT, PROOFSIZE, SECOND_POW_EDGE_BITS, STATE_SYNC_THRESHOLD, }; -use crate::pow::{self, new_cuckarood_ctx, new_cuckatoo_ctx, PoWContext}; +use crate::pow::{self, new_cuckarood_ctx, new_cuckatoo_ctx, BitVec, PoWContext}; use crate::ser::ProtocolVersion; use std::cell::Cell; use std::sync::atomic::{AtomicBool, Ordering}; @@ -446,6 +446,54 @@ where last_n } +/// Calculates the size of a header (in bytes) given a number of edge bits in the PoW +#[inline] +pub fn header_size_bytes(edge_bits: u8) -> usize { + let size = 2 + 2 * 8 + 5 * 32 + 32 + 2 * 8; + let proof_size = 8 + 4 + 8 + 1 + BitVec::bytes_len(edge_bits as usize * proofsize()); + size + proof_size +} + +#[cfg(test)] +mod test { + use super::*; + use crate::core::Block; + use crate::genesis::*; + use crate::pow::mine_genesis_block; + use crate::ser::{BinWriter, Writeable}; + + fn test_header_len(genesis: Block) { + let mut raw = Vec::::with_capacity(1_024); + let mut writer = BinWriter::new(&mut raw, ProtocolVersion::local()); + genesis.header.write(&mut writer).unwrap(); + assert_eq!(raw.len(), header_size_bytes(genesis.header.pow.edge_bits())); + } + + #[test] + fn automated_testing_header_len() { + set_local_chain_type(ChainTypes::AutomatedTesting); + test_header_len(mine_genesis_block().unwrap()); + } + + #[test] + fn user_testing_header_len() { + set_local_chain_type(ChainTypes::UserTesting); + test_header_len(mine_genesis_block().unwrap()); + } + + #[test] + fn floonet_header_len() { + set_local_chain_type(ChainTypes::Floonet); + test_header_len(genesis_floo()); + } + + #[test] + fn mainnet_header_len() { + set_local_chain_type(ChainTypes::Mainnet); + test_header_len(genesis_main()); + } +} + /// Checking running status if the server pub fn is_server_running() -> bool { SERVER_RUNNING.load(Ordering::SeqCst) diff --git a/core/src/pow/types.rs b/core/src/pow/types.rs index 37be40cbb6..83ba200703 100644 --- a/core/src/pow/types.rs +++ b/core/src/pow/types.rs @@ -477,15 +477,17 @@ impl Writeable for Proof { } } +/// A bit vector // TODO this could likely be optimized by writing whole bytes (or even words) // in the `BitVec` at once, dealing with the truncation, instead of bits by bits -struct BitVec { +pub struct BitVec { bits: Vec, } impl BitVec { /// Number of bytes required to store the provided number of bits - fn bytes_len(bits_len: usize) -> usize { + #[inline] + pub fn bytes_len(bits_len: usize) -> usize { (bits_len + 7) / 8 } diff --git a/core/src/ser.rs b/core/src/ser.rs index 7d590b3abd..4073997a74 100644 --- a/core/src/ser.rs +++ b/core/src/ser.rs @@ -22,6 +22,7 @@ use crate::core::hash::{DefaultHashable, Hash, Hashed}; use crate::global::PROTOCOL_VERSION; use byteorder::{BigEndian, ByteOrder, ReadBytesExt}; +use bytes::Buf; use keychain::{BlindingFactor, Identifier, IDENTIFIER_SIZE}; use serde::__private::from_utf8_lossy; use std::convert::TryInto; @@ -109,6 +110,12 @@ impl From for Error { } } +impl From for Error { + fn from(e: io::ErrorKind) -> Error { + Error::IOErr(format!("{}", io::Error::from(e)), e) + } +} + impl From for Error { fn from(e: util::secp::Error) -> Error { Error::SecpError(e) @@ -583,6 +590,112 @@ impl<'a> Reader for StreamingReader<'a> { } } +/// Protocol version-aware wrapper around a `Buf` impl +pub struct BufReader<'a, B: Buf> { + inner: &'a mut B, + version: ProtocolVersion, + bytes_read: usize, +} + +impl<'a, B: Buf> BufReader<'a, B> { + /// Construct a new BufReader + pub fn new(buf: &'a mut B, version: ProtocolVersion) -> Self { + Self { + inner: buf, + version, + bytes_read: 0, + } + } + + /// Check whether the buffer has enough bytes remaining to perform a read + fn has_remaining(&mut self, len: usize) -> Result<(), Error> { + if self.inner.remaining() >= len { + self.bytes_read += len; + Ok(()) + } else { + Err(io::ErrorKind::UnexpectedEof.into()) + } + } + + /// The total bytes read + pub fn bytes_read(&self) -> u64 { + self.bytes_read as u64 + } + + /// Convenience function to read from the buffer and deserialize + pub fn body(&mut self) -> Result { + T::read(self) + } +} + +impl<'a, B: Buf> Reader for BufReader<'a, B> { + fn read_u8(&mut self) -> Result { + self.has_remaining(1)?; + Ok(self.inner.get_u8()) + } + + fn read_u16(&mut self) -> Result { + self.has_remaining(2)?; + Ok(self.inner.get_u16()) + } + + fn read_u32(&mut self) -> Result { + self.has_remaining(4)?; + Ok(self.inner.get_u32()) + } + + fn read_u64(&mut self) -> Result { + self.has_remaining(8)?; + Ok(self.inner.get_u64()) + } + + fn read_i32(&mut self) -> Result { + self.has_remaining(4)?; + Ok(self.inner.get_i32()) + } + + fn read_i64(&mut self) -> Result { + self.has_remaining(8)?; + Ok(self.inner.get_i64()) + } + + fn read_bytes_len_prefix(&mut self) -> Result, Error> { + let len = self.read_u64()?; + self.read_fixed_bytes(len as usize) + } + + fn read_fixed_bytes(&mut self, len: usize) -> Result, Error> { + // not reading more than 100k bytes in a single read + if len > 100_000 { + return Err(Error::TooLargeReadErr(format!( + "read unexpected large chunk of {} bytes", + len + ))); + } + self.has_remaining(len)?; + + let mut buf = vec![0; len]; + self.inner.copy_to_slice(&mut buf[..]); + Ok(buf) + } + + fn expect_u8(&mut self, val: u8) -> Result { + let b = self.read_u8()?; + if b == val { + Ok(b) + } else { + Err(Error::UnexpectedData { + expected: vec![val], + received: vec![b], + }) + } + } + + fn protocol_version(&self) -> ProtocolVersion { + self.version + } +} + impl Readable for Commitment { fn read(reader: &mut R) -> Result { let a = reader.read_fixed_bytes(PEDERSEN_COMMITMENT_SIZE)?; diff --git a/p2p/Cargo.toml b/p2p/Cargo.toml index cbf33a4c22..b1b4e33fff 100644 --- a/p2p/Cargo.toml +++ b/p2p/Cargo.toml @@ -35,6 +35,7 @@ async-std = "1.9" tokio = {version = "0.2", features = ["full"] } ed25519-dalek = "1" serde_json = "1" +bytes = "0.5" grin_core = { path = "../core", version = "4.4.2" } grin_store = { path = "../store", version = "4.4.2" } diff --git a/p2p/src/codec.rs b/p2p/src/codec.rs new file mode 100644 index 0000000000..217210c3cb --- /dev/null +++ b/p2p/src/codec.rs @@ -0,0 +1,257 @@ +use crate::core::core::block::{BlockHeader, UntrustedBlockHeader}; +use crate::core::global::header_size_bytes; +use crate::core::ser::{BufReader, ProtocolVersion, Readable}; +use crate::msg::{Message, MsgHeader, MsgHeaderWrapper, Type}; +use crate::types::{AttachmentMeta, AttachmentUpdate, Error}; +use bytes::{Buf, BufMut, Bytes, BytesMut}; +use core::ser::Reader; +use std::cmp::min; +use std::io::Read; +use std::mem; +use std::net::TcpStream; +use std::sync::Arc; +use std::time::{Duration, Instant}; +use MsgHeaderWrapper::*; +use State::*; + +const HEADER_IO_TIMEOUT: Duration = Duration::from_millis(2000); +pub const BODY_IO_TIMEOUT: Duration = Duration::from_millis(60000); +const HEADER_BATCH_SIZE: usize = 32; + +enum State { + None, + Header(MsgHeaderWrapper), + BlockHeaders { + bytes_left: usize, + items_left: usize, + headers: Vec, + }, + Attachment(usize, Arc, Instant), +} + +impl State { + fn is_none(&self) -> bool { + match self { + State::None => true, + _ => false, + } + } +} + +pub struct Codec { + pub version: ProtocolVersion, + stream: TcpStream, + buffer: BytesMut, + state: State, + bytes_read: usize, +} + +impl Codec { + pub fn new(version: ProtocolVersion, stream: TcpStream) -> Self { + Self { + version, + stream, + buffer: BytesMut::with_capacity(8 * 1024), + state: None, + bytes_read: 0, + } + } + + /// Destroy the codec and return the reader + pub fn stream(self) -> TcpStream { + self.stream + } + + /// Inform codec next `len` bytes are an attachment + /// Panics if already reading a body + pub fn expect_attachment(&mut self, meta: Arc) { + assert!(self.state.is_none()); + self.state = Attachment(meta.size, meta, Instant::now()); + } + + /// Length of the next item we are expecting, could be msg header, body, block header or attachment chunk + fn next_len(&self) -> usize { + match &self.state { + None => MsgHeader::LEN, + Header(Known(h)) if h.msg_type == Type::Headers => { + // If we are receiving a list of headers, read off the item count first + min(h.msg_len as usize, 2) + } + Header(Known(header)) => header.msg_len as usize, + Header(Unknown(len, _)) => *len as usize, + BlockHeaders { bytes_left, .. } => { + // The header length varies with the number of edge bits. Therefore we overestimate + // its size and only actually read the bytes we need + min(*bytes_left, header_size_bytes(63)) + } + Attachment(left, _, _) => min(*left, 48_000), + } + } + + /// Set stream timeout depending on the next expected item + fn set_stream_timeout(&self) -> Result<(), Error> { + let timeout = match &self.state { + None => HEADER_IO_TIMEOUT, + _ => BODY_IO_TIMEOUT, + }; + self.stream.set_read_timeout(Some(timeout))?; + Ok(()) + } + + fn read_inner(&mut self) -> Result { + self.bytes_read = 0; + loop { + let next_len = self.next_len(); + let pre_len = self.buffer.len(); + // Buffer could already be partially filled, calculate additional bytes we need + let to_read = next_len.saturating_sub(pre_len); + if to_read > 0 { + self.buffer.reserve(to_read); + for _ in 0..to_read { + self.buffer.put_u8(0); + } + self.set_stream_timeout()?; + if let Err(e) = self.stream.read_exact(&mut self.buffer[pre_len..]) { + // Undo reserved bytes on a failed read + self.buffer.truncate(pre_len); + return Err(e.into()); + } + self.bytes_read += to_read; + } + match &mut self.state { + None => { + // Parse header and keep reading + let mut raw = self.buffer.split_to(next_len).freeze(); + let mut reader = BufReader::new(&mut raw, self.version); + let header = MsgHeaderWrapper::read(&mut reader)?; + self.state = Header(header); + } + Header(Known(header)) => { + let mut raw = self.buffer.split_to(next_len).freeze(); + if header.msg_type == Type::Headers { + // Special consideration for a list of headers, as we want to verify and process + // them as they come in instead of only after the full list has been received + let mut reader = BufReader::new(&mut raw, self.version); + let items_left = reader.read_u16()? as usize; + self.state = BlockHeaders { + bytes_left: header.msg_len as usize - 2, + items_left, + headers: Vec::with_capacity(min(HEADER_BATCH_SIZE, items_left)), + }; + } else { + // Return full message + let msg = decode_message(header, &mut raw, self.version); + self.state = None; + return msg; + } + } + Header(Unknown(_, msg_type)) => { + // Discard body and return + let msg_type = *msg_type; + self.buffer.advance(next_len); + self.state = None; + return Ok(Message::Unknown(msg_type)); + } + BlockHeaders { + bytes_left, + items_left, + headers, + } => { + if *bytes_left == 0 { + // Incorrect item count + self.state = None; + return Err(Error::BadMessage); + } + + let mut reader = BufReader::new(&mut self.buffer, self.version); + let header: UntrustedBlockHeader = reader.body()?; + let bytes_read = reader.bytes_read() as usize; + headers.push(header.into()); + *bytes_left = bytes_left.saturating_sub(bytes_read); + *items_left -= 1; + + if headers.len() == HEADER_BATCH_SIZE || *items_left == 0 { + let mut h = Vec::with_capacity(min(HEADER_BATCH_SIZE, *items_left)); + mem::swap(headers, &mut h); + if *items_left == 0 { + let bytes_left = *bytes_left; + self.state = None; + if bytes_left > 0 { + return Err(Error::BadMessage); + } + } + return Ok(Message::Headers(h)); + } + } + Attachment(left, meta, now) => { + let raw = self.buffer.split_to(next_len).freeze(); + *left -= next_len; + if now.elapsed().as_secs() > 10 { + *now = Instant::now(); + debug!("attachment: {}/{}", meta.size - *left, meta.size); + } + let update = AttachmentUpdate { + read: next_len, + left: *left, + meta: Arc::clone(meta), + }; + if *left == 0 { + self.state = None; + debug!("attachment: DONE"); + } + return Ok(Message::Attachment(update, Some(raw))); + } + } + } + } + + /// Blocking read of the next message + pub fn read(&mut self) -> (Result, u64) { + let msg = self.read_inner(); + (msg, self.bytes_read as u64) + } +} + +// TODO: replace with a macro? +fn decode_message( + header: &MsgHeader, + body: &mut Bytes, + version: ProtocolVersion, +) -> Result { + let mut msg = BufReader::new(body, version); + let c = match header.msg_type { + Type::Ping => Message::Ping(msg.body()?), + Type::Pong => Message::Pong(msg.body()?), + Type::BanReason => Message::BanReason(msg.body()?), + Type::TransactionKernel => Message::TransactionKernel(msg.body()?), + Type::GetTransaction => Message::GetTransaction(msg.body()?), + Type::Transaction => Message::Transaction(msg.body()?), + Type::StemTransaction => Message::StemTransaction(msg.body()?), + Type::GetBlock => Message::GetBlock(msg.body()?), + Type::Block => Message::Block(msg.body()?), + Type::GetCompactBlock => Message::GetCompactBlock(msg.body()?), + Type::CompactBlock => Message::CompactBlock(msg.body()?), + Type::GetHeaders => Message::GetHeaders(msg.body()?), + Type::Header => Message::Header(msg.body()?), + Type::GetPeerAddrs => Message::GetPeerAddrs(msg.body()?), + Type::PeerAddrs => Message::PeerAddrs(msg.body()?), + Type::TxHashSetRequest => Message::TxHashSetRequest(msg.body()?), + Type::TxHashSetArchive => Message::TxHashSetArchive(msg.body()?), + Type::GetOutputBitmapSegment => Message::GetOutputBitmapSegment(msg.body()?), + Type::OutputBitmapSegment => Message::OutputBitmapSegment(msg.body()?), + Type::GetOutputSegment => Message::GetOutputSegment(msg.body()?), + Type::OutputSegment => Message::OutputSegment(msg.body()?), + Type::GetRangeProofSegment => Message::GetRangeProofSegment(msg.body()?), + Type::RangeProofSegment => Message::RangeProofSegment(msg.body()?), + Type::GetKernelSegment => Message::GetKernelSegment(msg.body()?), + Type::KernelSegment => Message::KernelSegment(msg.body()?), + Type::Error | Type::Hand | Type::Shake | Type::Headers => { + return Err(Error::UnexpectedMessage(format!( + "get message with type {}", + header.msg_type as i32 + ))) + } + Type::TorAddress => Message::TorAddress(msg.body()?), + }; + Ok(c) +} diff --git a/p2p/src/conn.rs b/p2p/src/conn.rs index f99ac2118f..1ef5ea8cfd 100644 --- a/p2p/src/conn.rs +++ b/p2p/src/conn.rs @@ -20,40 +20,28 @@ //! forces us to go through some additional gymnastic to loop over the async //! stream and make sure we get the right number of bytes out. -use crate::core::ser; +use crate::codec::{Codec, BODY_IO_TIMEOUT}; use crate::core::ser::ProtocolVersion; -use crate::msg::{ - read_body, read_discard, read_header, read_item, write_message, Msg, MsgHeader, - MsgHeaderWrapper, -}; +use crate::msg::{write_message, Consumed, Message, Msg}; use crate::types::Error; use crate::util::{RateCounter, RwLock}; -use std::io::{self, Read, Write}; +use std::fs::File; +use std::io::{self, Write}; use std::net::{Shutdown, TcpStream}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::RecvTimeoutError; use std::sync::{mpsc, Arc}; +use std::thread::{self, JoinHandle}; use std::time::Duration; -use std::{ - cmp, - thread::{self, JoinHandle}, -}; pub const SEND_CHANNEL_CAP: usize = 100; -const HEADER_IO_TIMEOUT: Duration = Duration::from_millis(10000); const CHANNEL_TIMEOUT: Duration = Duration::from_millis(15000); -const BODY_IO_TIMEOUT: Duration = Duration::from_millis(90000); /// A trait to be implemented in order to receive messages from the /// connection. Allows providing an optional response. pub trait MessageHandler: Send + 'static { - fn consume<'a, R: Read>( - &mut self, - msg: Message<'a, R>, - stopped: Arc, - tracker: Arc, - ) -> Result, Error>; + fn consume(&self, message: Message) -> Result; } // Macro to simplify the boilerplate around I/O and Grin error handling @@ -79,54 +67,6 @@ macro_rules! try_break { }; } -macro_rules! try_header { - ($res:expr, $conn: expr) => {{ - let _ = $conn.set_read_timeout(Some(HEADER_IO_TIMEOUT)); - try_break!($res) - }}; -} - -/// A message as received by the connection. Provides access to the message -/// header lazily consumes the message body, handling its deserialization. -pub struct Message<'a, R: Read> { - pub header: MsgHeader, - stream: &'a mut R, - version: ProtocolVersion, -} - -impl<'a, R: Read> Message<'a, R> { - fn from_header(header: MsgHeader, stream: &'a mut R, version: ProtocolVersion) -> Self { - Message { - header, - stream, - version, - } - } - - /// Read the message body from the underlying connection - pub fn body(&mut self) -> Result { - read_body(&self.header, self.stream, self.version) - } - - /// Read a single "thing" from the underlying connection. - /// Return the thing and the total bytes read. - pub fn streaming_read(&mut self) -> Result<(T, u64), Error> { - read_item(self.stream, self.version) - } - - pub fn copy_attachment(&mut self, len: usize, writer: &mut dyn Write) -> Result { - let mut written = 0; - while written < len { - let read_len = cmp::min(8000, len - written); - let mut buf = vec![0u8; read_len]; - self.stream.read_exact(&mut buf[..])?; - writer.write_all(&buf)?; - written += read_len; - } - Ok(written) - } -} - pub struct StopHandle { /// Channel to close the connection stopped: Arc, @@ -272,7 +212,7 @@ fn poll( conn: TcpStream, conn_handle: ConnHandle, version: ProtocolVersion, - mut handler: H, + handler: H, send_rx: mpsc::Receiver, stopped: Arc, tracker: Arc, @@ -281,7 +221,7 @@ where H: MessageHandler, { // Split out tcp stream out into separate reader/writer halves. - let mut reader = conn.try_clone().expect("clone conn for reader failed"); + let reader = conn.try_clone().expect("clone conn for reader failed"); let mut writer = conn.try_clone().expect("clone conn for writer failed"); let reader_stopped = stopped.clone(); @@ -291,58 +231,83 @@ where let reader_thread = thread::Builder::new() .name("peer_read".to_string()) .spawn(move || { + let peer_addr = reader + .peer_addr() + .map(|a| a.to_string()) + .unwrap_or_else(|_| "?".to_owned()); + let mut codec = Codec::new(version, reader); + let mut attachment: Option = None; loop { + // check the close channel + if reader_stopped.load(Ordering::Relaxed) { + break; + } + // check the read end - match try_header!(read_header(&mut reader, version), &reader) { - Some(MsgHeaderWrapper::Known(header)) => { - let _ = reader.set_read_timeout(Some(BODY_IO_TIMEOUT)); - let msg = Message::from_header(header, &mut reader, version); - - trace!( - "Received message header, type {:?}, len {}.", - msg.header.msg_type, - msg.header.msg_len - ); + let (next, bytes_read) = codec.read(); - // Increase received bytes counter - reader_tracker.inc_received(MsgHeader::LEN as u64 + msg.header.msg_len); + // increase the appropriate counter + match &next { + Ok(Message::Attachment(_, _)) => reader_tracker.inc_quiet_received(bytes_read), + _ => reader_tracker.inc_received(bytes_read), + } - let resp_msg = try_break!(handler.consume( - msg, - reader_stopped.clone(), - reader_tracker.clone() - )); - if let Some(Some(resp_msg)) = resp_msg { - try_break!(conn_handle.send(resp_msg)); - } - } - Some(MsgHeaderWrapper::Unknown(msg_len, type_byte)) => { + let message = match try_break!(next) { + Some(Message::Unknown(type_byte)) => { debug!( - "Received unknown message header, type {:?}, len {}.", - type_byte, msg_len + "Received unknown message, type {:?}, len {}.", + type_byte, bytes_read ); - // Increase received bytes counter - reader_tracker.inc_received(MsgHeader::LEN as u64 + msg_len); + continue; + } + Some(Message::Attachment(update, bytes)) => { + let a = match &mut attachment { + Some(a) => a, + None => { + error!("Received unexpected attachment chunk"); + break; + } + }; + + let bytes = bytes.unwrap(); + if let Err(e) = a.write_all(&bytes) { + error!("Unable to write attachment file: {}", e); + break; + } + if update.left == 0 { + if let Err(e) = a.sync_all() { + error!("Unable to sync attachment file: {}", e); + break; + } + attachment.take(); + } - try_break!(read_discard(msg_len, &mut reader)); + Message::Attachment(update, None) } - None => {} - } + Some(message) => { + trace!("Received message, type {}, len {}.", message, bytes_read); + message + } + None => continue, + }; - // check the close channel - if reader_stopped.load(Ordering::Relaxed) { - break; + let consumed = try_break!(handler.consume(message)).unwrap_or(Consumed::None); + match consumed { + Consumed::Response(resp_msg) => { + try_break!(conn_handle.send(resp_msg)); + } + Consumed::Attachment(meta, file) => { + // Start attachment + codec.expect_attachment(meta); + attachment = Some(file); + } + Consumed::Disconnect => break, + Consumed::None => {} } } - debug!( - "Shutting down reader connection with {}", - reader - .peer_addr() - .map(|a| a.to_string()) - .unwrap_or_else(|_| "?".to_owned()) - ); - let _ = reader.shutdown(Shutdown::Both); + debug!("Shutting down reader connection with {}", peer_addr); + let _ = codec.stream().shutdown(Shutdown::Both); })?; let writer_thread = thread::Builder::new() diff --git a/p2p/src/lib.rs b/p2p/src/lib.rs index e40bc115c2..278b1a838c 100644 --- a/p2p/src/lib.rs +++ b/p2p/src/lib.rs @@ -39,6 +39,7 @@ extern crate log; #[macro_use] extern crate lazy_static; +mod codec; mod conn; pub mod handshake; pub mod libp2p_connection; diff --git a/p2p/src/msg.rs b/p2p/src/msg.rs index 8bf2b3e232..aaba4fd9ed 100644 --- a/p2p/src/msg.rs +++ b/p2p/src/msg.rs @@ -14,18 +14,27 @@ //! Message types that transit over the network and related serialization code. +use crate::chain::txhashset::BitmapSegment; use crate::conn::Tracker; use crate::core::core::hash::Hash; -use crate::core::core::BlockHeader; +use crate::core::core::transaction::{OutputIdentifier, TxKernel}; +use crate::core::core::{ + BlockHeader, Segment, SegmentIdentifier, Transaction, UntrustedBlock, UntrustedBlockHeader, + UntrustedCompactBlock, +}; use crate::core::pow::Difficulty; use crate::core::ser::{ self, ProtocolVersion, Readable, Reader, StreamingReader, Writeable, Writer, }; use crate::core::{consensus, global}; use crate::types::{ - Capabilities, Error, PeerAddr, ReasonForBan, MAX_BLOCK_HEADERS, MAX_LOCATORS, MAX_PEER_ADDRS, + AttachmentMeta, AttachmentUpdate, Capabilities, Error, PeerAddr, ReasonForBan, + MAX_BLOCK_HEADERS, MAX_LOCATORS, MAX_PEER_ADDRS, }; +use crate::util::secp::pedersen::RangeProof; +use bytes::Bytes; use num::FromPrimitive; +use std::fmt; use std::fs::File; use std::io::{Read, Write}; use std::sync::Arc; @@ -67,6 +76,14 @@ enum_from_primitive! { GetTransaction = 19, TransactionKernel = 20, TorAddress = 23, + GetOutputBitmapSegment = 24, + OutputBitmapSegment = 25, + GetOutputSegment = 26, + OutputSegment = 27, + GetRangeProofSegment = 28, + RangeProofSegment = 29, + GetKernelSegment = 30, + KernelSegment = 31, } } @@ -105,6 +122,14 @@ fn max_msg_size(msg_type: Type) -> u64 { Type::GetTransaction => 32, Type::TransactionKernel => 32, Type::TorAddress => 128, + Type::GetOutputBitmapSegment => 41, + Type::OutputBitmapSegment => 2 * max_block_size(), + Type::GetOutputSegment => 41, + Type::OutputSegment => 2 * max_block_size(), + Type::GetRangeProofSegment => 41, + Type::RangeProofSegment => 2 * max_block_size(), + Type::GetKernelSegment => 41, + Type::KernelSegment => 2 * max_block_size(), } } @@ -717,6 +742,207 @@ impl Readable for TxHashSetRequest { } } +/// Request to get a segment of a (P)MMR at a particular block. +pub struct SegmentRequest { + /// The hash of the block the MMR is associated with + pub block_hash: Hash, + /// The identifier of the requested segment + pub identifier: SegmentIdentifier, +} + +impl Readable for SegmentRequest { + fn read(reader: &mut R) -> Result { + let block_hash = Readable::read(reader)?; + let identifier = Readable::read(reader)?; + Ok(Self { + block_hash, + identifier, + }) + } +} + +impl Writeable for SegmentRequest { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + Writeable::write(&self.block_hash, writer)?; + Writeable::write(&self.identifier, writer) + } +} + +/// Response to a (P)MMR segment request. +pub struct SegmentResponse { + /// The hash of the block the MMR is associated with + pub block_hash: Hash, + /// The MMR segment + pub segment: Segment, +} + +impl Readable for SegmentResponse { + fn read(reader: &mut R) -> Result { + let block_hash = Readable::read(reader)?; + let segment = Readable::read(reader)?; + Ok(Self { + block_hash, + segment, + }) + } +} + +impl Writeable for SegmentResponse { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + Writeable::write(&self.block_hash, writer)?; + Writeable::write(&self.segment, writer) + } +} + +/// Response to an output PMMR segment request. +pub struct OutputSegmentResponse { + /// The segment response + pub response: SegmentResponse, + /// The root hash of the output bitmap MMR + pub output_bitmap_root: Hash, +} + +impl Readable for OutputSegmentResponse { + fn read(reader: &mut R) -> Result { + let response = Readable::read(reader)?; + let output_bitmap_root = Readable::read(reader)?; + Ok(Self { + response, + output_bitmap_root, + }) + } +} + +impl Writeable for OutputSegmentResponse { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + Writeable::write(&self.response, writer)?; + Writeable::write(&self.output_bitmap_root, writer) + } +} + +/// Response to an output bitmap MMR segment request. +pub struct OutputBitmapSegmentResponse { + /// The hash of the block the MMR is associated with + pub block_hash: Hash, + /// The MMR segment + pub segment: BitmapSegment, + /// The root hash of the output PMMR + pub output_root: Hash, +} + +impl Readable for OutputBitmapSegmentResponse { + fn read(reader: &mut R) -> Result { + let block_hash = Readable::read(reader)?; + let segment = Readable::read(reader)?; + let output_root = Readable::read(reader)?; + Ok(Self { + block_hash, + segment, + output_root, + }) + } +} + +impl Writeable for OutputBitmapSegmentResponse { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + Writeable::write(&self.block_hash, writer)?; + Writeable::write(&self.segment, writer)?; + Writeable::write(&self.output_root, writer) + } +} + +pub enum Message { + Unknown(u8), + Ping(Ping), + Pong(Pong), + BanReason(BanReason), + TransactionKernel(Hash), + GetTransaction(Hash), + Transaction(Transaction), + StemTransaction(Transaction), + GetBlock(Hash), + Block(UntrustedBlock), + GetCompactBlock(Hash), + CompactBlock(UntrustedCompactBlock), + GetHeaders(Locator), + Header(UntrustedBlockHeader), + Headers(Vec), + GetPeerAddrs(GetPeerAddrs), + PeerAddrs(PeerAddrs), + TxHashSetRequest(TxHashSetRequest), + TxHashSetArchive(TxHashSetArchive), + Attachment(AttachmentUpdate, Option), + TorAddress(TorAddress), + GetOutputBitmapSegment(SegmentRequest), + OutputBitmapSegment(OutputBitmapSegmentResponse), + GetOutputSegment(SegmentRequest), + OutputSegment(OutputSegmentResponse), + GetRangeProofSegment(SegmentRequest), + RangeProofSegment(SegmentResponse), + GetKernelSegment(SegmentRequest), + KernelSegment(SegmentResponse), +} + +impl fmt::Display for Message { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Message::Unknown(_) => write!(f, "unknown"), + Message::Ping(_) => write!(f, "ping"), + Message::Pong(_) => write!(f, "pong"), + Message::BanReason(_) => write!(f, "ban reason"), + Message::TransactionKernel(_) => write!(f, "tx kernel"), + Message::GetTransaction(_) => write!(f, "get tx"), + Message::Transaction(_) => write!(f, "tx"), + Message::StemTransaction(_) => write!(f, "stem tx"), + Message::GetBlock(_) => write!(f, "get block"), + Message::Block(_) => write!(f, "block"), + Message::GetCompactBlock(_) => write!(f, "get compact block"), + Message::CompactBlock(_) => write!(f, "compact block"), + Message::GetHeaders(_) => write!(f, "get headers"), + Message::Header(_) => write!(f, "header"), + Message::Headers(_) => write!(f, "headers"), + Message::GetPeerAddrs(_) => write!(f, "get peer addrs"), + Message::PeerAddrs(_) => write!(f, "peer addrs"), + Message::TxHashSetRequest(_) => write!(f, "tx hash set request"), + Message::TxHashSetArchive(_) => write!(f, "tx hash set"), + Message::Attachment(_, _) => write!(f, "attachment"), + Message::TorAddress(_) => write!(f, "tor address"), + Message::GetOutputBitmapSegment(_) => write!(f, "get output bitmap segment"), + Message::OutputBitmapSegment(_) => write!(f, "output bitmap segment"), + Message::GetOutputSegment(_) => write!(f, "get output segment"), + Message::OutputSegment(_) => write!(f, "output segment"), + Message::GetRangeProofSegment(_) => write!(f, "get range proof segment"), + Message::RangeProofSegment(_) => write!(f, "range proof segment"), + Message::GetKernelSegment(_) => write!(f, "get kernel segment"), + Message::KernelSegment(_) => write!(f, "kernel segment"), + } + } +} + +impl fmt::Debug for Message { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Consume({})", self) + } +} + +pub enum Consumed { + Response(Msg), + Attachment(Arc, File), + None, + Disconnect, +} + +impl fmt::Debug for Consumed { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Consumed::Response(msg) => write!(f, "Consumed::Response({:?})", msg.header.msg_type), + Consumed::Attachment(meta, _) => write!(f, "Consumed::Attachment({:?})", meta.size), + Consumed::None => write!(f, "Consumed::None"), + Consumed::Disconnect => write!(f, "Consumed::Disconnect"), + } + } +} + /// Response to a txhashset archive request, must include a zip stream of the /// archive after the message body. pub struct TxHashSetArchive { diff --git a/p2p/src/peer.rs b/p2p/src/peer.rs index c8397f3c69..fc64745790 100644 --- a/p2p/src/peer.rs +++ b/p2p/src/peer.rs @@ -24,8 +24,10 @@ use std::sync::Arc; use lru_cache::LruCache; use crate::chain; +use crate::chain::txhashset::BitmapChunk; use crate::conn; use crate::core::core::hash::{Hash, Hashed}; +use crate::core::core::{OutputIdentifier, Segment, SegmentIdentifier, TxKernel}; use crate::core::pow::Difficulty; use crate::core::ser::Writeable; use crate::core::{core, global}; @@ -36,6 +38,7 @@ use crate::types::{ Capabilities, ChainAdapter, Error, NetAdapter, P2PConfig, PeerAddr, PeerInfo, ReasonForBan, TxHashSetRead, }; +use crate::util::secp::pedersen::RangeProof; use chrono::prelude::{DateTime, Utc}; use std::time::Instant; @@ -645,6 +648,38 @@ impl ChainAdapter for TrackingAdapter { fn get_tmpfile_pathname(&self, tmpfile_name: String) -> PathBuf { self.adapter.get_tmpfile_pathname(tmpfile_name) } + + fn get_kernel_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error> { + self.adapter.get_kernel_segment(hash, id) + } + + fn get_bitmap_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + self.adapter.get_bitmap_segment(hash, id) + } + + fn get_output_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + self.adapter.get_output_segment(hash, id) + } + + fn get_rangeproof_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error> { + self.adapter.get_rangeproof_segment(hash, id) + } } impl NetAdapter for TrackingAdapter { diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index 46ba06a61e..fcd7b7d349 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -21,8 +21,10 @@ use std::sync::Arc; use rand::prelude::*; use crate::chain; +use crate::chain::txhashset::BitmapChunk; use crate::core::core; use crate::core::core::hash::{Hash, Hashed}; +use crate::core::core::{OutputIdentifier, Segment, SegmentIdentifier, TxKernel}; use crate::core::global; use crate::core::pow::Difficulty; use crate::peer::Peer; @@ -31,6 +33,7 @@ use crate::types::{ Capabilities, ChainAdapter, Error, NetAdapter, P2PConfig, PeerAddr, PeerInfo, ReasonForBan, TxHashSetRead, MAX_PEER_ADDRS, }; +use crate::util::secp::pedersen::RangeProof; use chrono::prelude::*; use chrono::Duration; use grin_util::StopState; @@ -635,6 +638,38 @@ impl ChainAdapter for Peers { fn get_tmpfile_pathname(&self, tmpfile_name: String) -> PathBuf { self.adapter.get_tmpfile_pathname(tmpfile_name) } + + fn get_kernel_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error> { + self.adapter.get_kernel_segment(hash, id) + } + + fn get_bitmap_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + self.adapter.get_bitmap_segment(hash, id) + } + + fn get_output_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + self.adapter.get_output_segment(hash, id) + } + + fn get_rangeproof_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error> { + self.adapter.get_rangeproof_segment(hash, id) + } } impl NetAdapter for Peers { diff --git a/p2p/src/protocol.rs b/p2p/src/protocol.rs index e7bb4f57a3..bf940fe356 100644 --- a/p2p/src/protocol.rs +++ b/p2p/src/protocol.rs @@ -12,28 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::chain; -use crate::conn::{Message, MessageHandler, Tracker}; -use crate::core::core::{self, hash::Hash, hash::Hashed, CompactBlock}; -use crate::serv::Server; -use crate::types::PeerAddr::Onion; +use crate::conn::MessageHandler; +use crate::core::core::{hash::Hashed, CompactBlock}; +use crate::{chain, Capabilities}; use crate::msg::{ - BanReason, GetPeerAddrs, Headers, Locator, Msg, PeerAddrs, Ping, Pong, TorAddress, - TxHashSetArchive, TxHashSetRequest, Type, + Consumed, Headers, Message, Msg, OutputBitmapSegmentResponse, OutputSegmentResponse, PeerAddrs, + Pong, SegmentRequest, SegmentResponse, TxHashSetArchive, Type, }; - -use crate::types::Capabilities; -use crate::types::PeerAddr; -use crate::types::{Error, NetAdapter, PeerInfo}; +use crate::serv::Server; +use crate::types::{AttachmentMeta, Error, NetAdapter, PeerAddr, PeerAddr::Onion, PeerInfo}; use chrono::prelude::Utc; use rand::{thread_rng, Rng}; -use std::cmp; -use std::fs::{self, File, OpenOptions}; -use std::io::{BufWriter, Read}; +use std::fs::{self, File}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; -use std::time::Instant; pub struct Protocol { adapter: Arc, @@ -62,165 +55,146 @@ impl Protocol { } impl MessageHandler for Protocol { - fn consume( - &mut self, - mut msg: Message, - stopped: Arc, - tracker: Arc, - ) -> Result, Error> { + fn consume(&self, message: Message) -> Result { let adapter = &self.adapter; - let header_cache_size = self.header_cache_size; // If we received a msg from a banned peer then log and drop it. // If we are getting a lot of these then maybe we are not cleaning // banned peers up correctly? if adapter.is_banned(self.peer_info.addr.clone()) { debug!( - "handler: consume: peer {:?} banned, received: {:?}, dropping.", - self.peer_info.addr, msg.header.msg_type, + "handler: consume: peer {:?} banned, received: {}, dropping.", + self.peer_info.addr, message, ); - return Ok(None); + return Ok(Consumed::Disconnect); } - match msg.header.msg_type { - Type::Ping => { - let ping: Ping = msg.body()?; + let consumed = match message { + Message::Attachment(update, _) => { + self.adapter.txhashset_download_update( + update.meta.start_time, + (update.meta.size - update.left) as u64, + update.meta.size as u64, + ); + + if update.left == 0 { + let meta = update.meta; + trace!( + "handle_payload: txhashset archive save to file {:?} success", + meta.path, + ); + + let zip = File::open(meta.path.clone())?; + let res = + self.adapter + .txhashset_write(meta.hash.clone(), zip, &self.peer_info)?; + + debug!( + "handle_payload: txhashset archive for {} at {}, DONE. Data Ok: {}", + meta.hash, meta.height, !res + ); + + if let Err(e) = fs::remove_file(meta.path.clone()) { + warn!("fail to remove tmp file: {:?}. err: {}", meta.path, e); + } + } + + Consumed::None + } + + Message::Ping(ping) => { adapter.peer_difficulty( self.peer_info.addr.clone(), ping.total_difficulty, ping.height, ); - - Ok(Some(Msg::new( + Consumed::Response(Msg::new( Type::Pong, Pong { total_difficulty: adapter.total_difficulty()?, height: adapter.total_height()?, }, self.peer_info.version, - )?)) + )?) } - Type::Pong => { - let pong: Pong = msg.body()?; + Message::Pong(pong) => { adapter.peer_difficulty( self.peer_info.addr.clone(), pong.total_difficulty, pong.height, ); - Ok(None) + Consumed::None } - Type::BanReason => { - let ban_reason: BanReason = msg.body()?; + Message::BanReason(ban_reason) => { error!("handle_payload: BanReason {:?}", ban_reason); - Ok(None) + Consumed::Disconnect } - Type::TransactionKernel => { - let h: Hash = msg.body()?; - debug!( - "handle_payload: received tx kernel: {}, msg_len: {}", - h, msg.header.msg_len - ); + Message::TransactionKernel(h) => { + debug!("handle_payload: received tx kernel: {}", h); adapter.tx_kernel_received(h, &self.peer_info)?; - Ok(None) + Consumed::None } - Type::GetTransaction => { - let h: Hash = msg.body()?; - debug!( - "handle_payload: GetTransaction: {}, msg_len: {}", - h, msg.header.msg_len, - ); + Message::GetTransaction(h) => { + debug!("handle_payload: GetTransaction: {}", h); let tx = adapter.get_transaction(h); if let Some(tx) = tx { - Ok(Some(Msg::new( - Type::Transaction, - tx, - self.peer_info.version, - )?)) + Consumed::Response(Msg::new(Type::Transaction, tx, self.peer_info.version)?) } else { - Ok(None) + Consumed::None } } - Type::Transaction => { - debug!( - "handle_payload: received tx: msg_len: {}", - msg.header.msg_len - ); - let tx: core::Transaction = msg.body()?; + Message::Transaction(tx) => { + debug!("handle_payload: received tx"); adapter.transaction_received(tx, false)?; - Ok(None) + Consumed::None } - Type::StemTransaction => { - debug!( - "handle_payload: received stem tx: msg_len: {}", - msg.header.msg_len - ); - let tx: core::Transaction = msg.body()?; + Message::StemTransaction(tx) => { + debug!("handle_payload: received stem tx"); adapter.transaction_received(tx, true)?; - Ok(None) + Consumed::None } - Type::GetBlock => { - let h: Hash = msg.body()?; - trace!( - "handle_payload: GetBlock: {}, msg_len: {}", - h, - msg.header.msg_len, - ); - + Message::GetBlock(h) => { + trace!("handle_payload: GetBlock: {}", h); let bo = adapter.get_block(h, &self.peer_info); if let Some(b) = bo { - return Ok(Some(Msg::new(Type::Block, b, self.peer_info.version)?)); + Consumed::Response(Msg::new(Type::Block, b, self.peer_info.version)?) + } else { + Consumed::None } - Ok(None) } - Type::Block => { - debug!( - "handle_payload: received block: msg_len: {}", - msg.header.msg_len - ); - let b: core::UntrustedBlock = msg.body()?; - + Message::Block(b) => { + debug!("handle_payload: received block"); // We default to NONE opts here as we do not know know yet why this block was // received. // If we requested this block from a peer due to our node syncing then // the peer adapter will override opts to reflect this. adapter.block_received(b.into(), &self.peer_info, chain::Options::NONE)?; - Ok(None) + Consumed::None } - Type::GetCompactBlock => { - let h: Hash = msg.body()?; + Message::GetCompactBlock(h) => { if let Some(b) = adapter.get_block(h, &self.peer_info) { let cb: CompactBlock = b.into(); - Ok(Some(Msg::new( - Type::CompactBlock, - cb, - self.peer_info.version, - )?)) + Consumed::Response(Msg::new(Type::CompactBlock, cb, self.peer_info.version)?) } else { - Ok(None) + Consumed::None } } - Type::CompactBlock => { - debug!( - "handle_payload: received compact block: msg_len: {}", - msg.header.msg_len - ); - let b: core::UntrustedCompactBlock = msg.body()?; - + Message::CompactBlock(b) => { + debug!("handle_payload: received compact block"); adapter.compact_block_received(b.into(), &self.peer_info)?; - Ok(None) + Consumed::None } - Type::TorAddress => { - let tor_address: TorAddress = msg.body()?; + Message::TorAddress(tor_address) => { info!( "TorAddress received from {:?}, address = {:?}", self.peer_info, tor_address @@ -239,61 +213,34 @@ impl MessageHandler for Protocol { self.server.peers.save_peer(&peer)?; } } - Ok(None) + Consumed::None } - Type::GetHeaders => { + Message::GetHeaders(loc) => { // load headers from the locator - let loc: Locator = msg.body()?; let headers = adapter.locate_headers(&loc.hashes)?; // serialize and send all the headers over - Ok(Some(Msg::new( + Consumed::Response(Msg::new( Type::Headers, Headers { headers }, self.peer_info.version, - )?)) + )?) } // "header first" block propagation - if we have not yet seen this block // we can go request it from some of our peers - Type::Header => { - let header: core::UntrustedBlockHeader = msg.body()?; + Message::Header(header) => { adapter.header_received(header.into(), &self.peer_info)?; - Ok(None) + Consumed::None } - Type::Headers => { - let mut total_bytes_read = 0; - - // Read the count (u16) so we now how many headers to read. - let (count, bytes_read): (u16, _) = msg.streaming_read()?; - total_bytes_read += bytes_read; - - // Read chunks of headers off the stream and pass them off to the adapter. - let chunk_size = 32u16; - let mut headers = Vec::with_capacity(chunk_size as usize); - for i in 1..=count { - let (header, bytes_read) = - msg.streaming_read::()?; - headers.push(header.into()); - total_bytes_read += bytes_read; - if i % chunk_size == 0 || i == count { - adapter.headers_received(&headers, &self.peer_info, header_cache_size)?; - headers.clear(); - } - } - - // Now check we read the correct total number of bytes off the stream. - if total_bytes_read != msg.header.msg_len { - return Err(Error::MsgLen); - } - - Ok(None) + Message::Headers(headers) => { + adapter.headers_received(&headers, &self.peer_info, self.header_cache_size)?; + Consumed::None } - Type::GetPeerAddrs => { - let get_peers: GetPeerAddrs = msg.body()?; + Message::GetPeerAddrs(get_peers) => { let peers = adapter.find_peer_addrs(get_peers.capabilities & !Capabilities::TOR_ADDRESS); @@ -314,15 +261,14 @@ impl MessageHandler for Protocol { peers }; - Ok(Some(Msg::new( + Consumed::Response(Msg::new( Type::PeerAddrs, PeerAddrs { peers }, self.peer_info.version, - )?)) + )?) } - Type::PeerAddrs => { - let peer_addrs: PeerAddrs = msg.body()?; + Message::PeerAddrs(peer_addrs) => { let mut peers: Vec = Vec::new(); for peer in peer_addrs.peers { match peer.clone() { @@ -344,10 +290,9 @@ impl MessageHandler for Protocol { } } adapter.peer_addrs_received(peers); - Ok(None) + Consumed::None } - Type::TxHashSetRequest => { - let sm_req: TxHashSetRequest = msg.body()?; + Message::TxHashSetRequest(sm_req) => { debug!( "handle_payload: txhashset req for {} at {}", sm_req.hash, sm_req.height @@ -369,14 +314,13 @@ impl MessageHandler for Protocol { self.peer_info.version, )?; resp.add_attachment(txhashset.reader); - Ok(Some(resp)) + Consumed::Response(resp) } else { - Ok(None) + Consumed::None } } - Type::TxHashSetArchive => { - let sm_arch: TxHashSetArchive = msg.body()?; + Message::TxHashSetArchive(sm_arch) => { info!( "handle_payload: txhashset archive for {} at {}. size={}", sm_arch.hash, sm_arch.height, sm_arch.bytes, @@ -394,95 +338,120 @@ impl MessageHandler for Protocol { // Update the sync state requested status self.state_sync_requested.store(false, Ordering::Relaxed); - let download_start_time = Utc::now(); + let start_time = Utc::now(); self.adapter - .txhashset_download_update(download_start_time, 0, sm_arch.bytes); + .txhashset_download_update(start_time, 0, sm_arch.bytes); let nonce: u32 = thread_rng().gen_range(0, 1_000_000); - let tmp = self.adapter.get_tmpfile_pathname(format!( + let path = self.adapter.get_tmpfile_pathname(format!( "txhashset-{}-{}.zip", - download_start_time.timestamp(), + start_time.timestamp(), nonce )); - let mut now = Instant::now(); - let mut save_txhashset_to_file = |file| -> Result<(), Error> { - let mut tmp_zip = - BufWriter::new(OpenOptions::new().write(true).create_new(true).open(file)?); - let total_size = sm_arch.bytes as usize; - let mut downloaded_size: usize = 0; - let mut request_size = cmp::min(48_000, total_size); - while request_size > 0 { - let size = msg.copy_attachment(request_size, &mut tmp_zip)?; - downloaded_size += size; - request_size = cmp::min(48_000, total_size - downloaded_size); - self.adapter.txhashset_download_update( - download_start_time, - downloaded_size as u64, - total_size as u64, - ); - if now.elapsed().as_secs() > 10 { - now = Instant::now(); - debug!( - "handle_payload: txhashset archive: {}/{}", - downloaded_size, total_size - ); - } - // Increase received bytes quietly (without affecting the counters). - // Otherwise we risk banning a peer as "abusive". - tracker.inc_quiet_received(size as u64); - - // check the close channel - if stopped.load(Ordering::Relaxed) { - debug!("stopping txhashset download early"); - return Err(Error::ConnectionClose); - } - } - debug!( - "handle_payload: txhashset archive: {}/{} ... DONE", - downloaded_size, total_size - ); - tmp_zip - .into_inner() - .map_err(|e| { - Error::Internal(format!("Unable to save txhashset data, {}", e)) - })? - .sync_all()?; - Ok(()) - }; - if let Err(e) = save_txhashset_to_file(tmp.clone()) { - error!( - "handle_payload: txhashset archive save to file fail. err={:?}", - e - ); - return Err(e); - } - - trace!( - "handle_payload: txhashset archive save to file {:?} success", - tmp, - ); - - let tmp_zip = File::open(tmp.clone())?; - let res = self - .adapter - .txhashset_write(sm_arch.hash, tmp_zip, &self.peer_info)?; + let file = fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(path.clone())?; + + let meta = AttachmentMeta { + size: sm_arch.bytes as usize, + hash: sm_arch.hash, + height: sm_arch.height, + start_time, + path, + }; - info!( - "handle_payload: txhashset archive for {} at {}, DONE. Data Ok: {}", - sm_arch.hash, sm_arch.height, res - ); + Consumed::Attachment(Arc::new(meta), file) + } - if let Err(e) = fs::remove_file(tmp.clone()) { - warn!("fail to remove tmp file: {:?}. err: {}", tmp, e); + Message::GetOutputBitmapSegment(req) => { + let SegmentRequest { + block_hash, + identifier, + } = req; + if let Ok((segment, output_root)) = + self.adapter.get_bitmap_segment(block_hash, identifier) + { + Consumed::Response(Msg::new( + Type::OutputBitmapSegment, + OutputBitmapSegmentResponse { + block_hash, + segment: segment.into(), + output_root, + }, + self.peer_info.version, + )?) + } else { + Consumed::None } - - Ok(None) } - Type::Error | Type::Hand | Type::Shake => { - debug!("Received an unexpected msg: {:?}", msg.header.msg_type); - Ok(None) + Message::GetOutputSegment(req) => { + let SegmentRequest { + block_hash, + identifier, + } = req; + if let Ok((segment, output_bitmap_root)) = + self.adapter.get_output_segment(block_hash, identifier) + { + Consumed::Response(Msg::new( + Type::OutputSegment, + OutputSegmentResponse { + response: SegmentResponse { + block_hash, + segment, + }, + output_bitmap_root, + }, + self.peer_info.version, + )?) + } else { + Consumed::None + } } - } + Message::GetRangeProofSegment(req) => { + let SegmentRequest { + block_hash, + identifier, + } = req; + if let Ok(segment) = self.adapter.get_rangeproof_segment(block_hash, identifier) { + Consumed::Response(Msg::new( + Type::RangeProofSegment, + SegmentResponse { + block_hash, + segment, + }, + self.peer_info.version, + )?) + } else { + Consumed::None + } + } + Message::GetKernelSegment(req) => { + let SegmentRequest { + block_hash, + identifier, + } = req; + if let Ok(segment) = self.adapter.get_kernel_segment(block_hash, identifier) { + Consumed::Response(Msg::new( + Type::KernelSegment, + SegmentResponse { + block_hash, + segment, + }, + self.peer_info.version, + )?) + } else { + Consumed::None + } + } + Message::OutputBitmapSegment(_) + | Message::OutputSegment(_) + | Message::RangeProofSegment(_) + | Message::KernelSegment(_) => Consumed::None, + + Message::Unknown(_) => Consumed::None, + }; + Ok(consumed) } } diff --git a/p2p/src/serv.rs b/p2p/src/serv.rs index 2201b83c3d..789c4055c1 100644 --- a/p2p/src/serv.rs +++ b/p2p/src/serv.rs @@ -22,8 +22,10 @@ use std::thread; use std::time::Duration; use crate::chain; +use crate::chain::txhashset::BitmapChunk; use crate::core::core; use crate::core::core::hash::Hash; +use crate::core::core::{OutputIdentifier, Segment, SegmentIdentifier, TxKernel}; use crate::core::global; use crate::core::pow::Difficulty; use crate::handshake::Handshake; @@ -34,6 +36,7 @@ use crate::types::{ Capabilities, ChainAdapter, Error, NetAdapter, P2PConfig, PeerAddr, PeerInfo, ReasonForBan, TxHashSetRead, }; +use crate::util::secp::pedersen::RangeProof; use crate::util::StopState; use chrono::prelude::{DateTime, Utc}; @@ -477,6 +480,38 @@ impl ChainAdapter for DummyAdapter { fn get_tmpfile_pathname(&self, _tmpfile_name: String) -> PathBuf { unimplemented!() } + + fn get_kernel_segment( + &self, + _hash: Hash, + _id: SegmentIdentifier, + ) -> Result, chain::Error> { + unimplemented!() + } + + fn get_bitmap_segment( + &self, + _hash: Hash, + _id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + unimplemented!() + } + + fn get_output_segment( + &self, + _hash: Hash, + _id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + unimplemented!() + } + + fn get_rangeproof_segment( + &self, + _hash: Hash, + _id: SegmentIdentifier, + ) -> Result, chain::Error> { + unimplemented!() + } } impl NetAdapter for DummyAdapter { diff --git a/p2p/src/types.rs b/p2p/src/types.rs index e6191beb04..99d29766b0 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -33,12 +33,15 @@ use std::sync::atomic::AtomicUsize; use grin_store; use crate::chain; +use crate::chain::txhashset::BitmapChunk; use crate::core::core; use crate::core::core::hash::Hash; +use crate::core::core::{OutputIdentifier, Segment, SegmentIdentifier, TxKernel}; use crate::core::global; use crate::core::pow::Difficulty; use crate::core::ser::{self, ProtocolVersion, Readable, Reader, Writeable, Writer}; use crate::msg::PeerAddrs; +use crate::util::secp::pedersen::RangeProof; use crate::util::RwLock; use std::time::Instant; @@ -80,6 +83,8 @@ pub enum Error { /// Header type does not match the expected message type #[fail(display = "p2p bad message")] BadMessage, + #[fail(display = "p2p unexpected message {}", _0)] + UnexpectedMessage(String), #[fail(display = "p2p message Length error")] MsgLen, #[fail(display = "p2p banned")] @@ -762,6 +767,30 @@ pub trait ChainAdapter: Sync + Send { /// Get a tmp file path in above specific tmp dir (create tmp dir if not exist) /// Delete file if tmp file already exists fn get_tmpfile_pathname(&self, tmpfile_name: String) -> PathBuf; + + fn get_kernel_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error>; + + fn get_bitmap_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error>; + + fn get_output_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error>; + + fn get_rangeproof_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error>; } /// Additional methods required by the protocol that don't need to be @@ -780,3 +809,19 @@ pub trait NetAdapter: ChainAdapter { /// Is this peer currently banned? fn is_banned(&self, addr: PeerAddr) -> bool; } + +#[derive(Clone, Debug)] +pub struct AttachmentMeta { + pub size: usize, + pub hash: Hash, + pub height: u64, + pub start_time: DateTime, + pub path: PathBuf, +} + +#[derive(Clone, Debug)] +pub struct AttachmentUpdate { + pub read: usize, + pub left: usize, + pub meta: Arc, +} diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index df3d2a2afb..7dc6267a8e 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -22,6 +22,7 @@ use std::sync::{Arc, Weak}; use std::thread; use std::time::Instant; +use crate::chain::txhashset::BitmapChunk; use crate::chain::{ self, BlockStatus, ChainAdapter, Options, SyncState, SyncStatus, TxHashsetDownloadStats, }; @@ -33,20 +34,30 @@ use crate::common::types::{ChainValidationMode, DandelionEpoch, ServerConfig}; use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::transaction::Transaction; use crate::core::core::verifier_cache::VerifierCache; -use crate::core::core::{BlockHeader, BlockSums, CompactBlock, Inputs, OutputIdentifier}; +use crate::core::core::{ + BlockHeader, BlockSums, CompactBlock, Inputs, OutputIdentifier, Segment, SegmentIdentifier, + TxKernel, +}; use crate::core::pow::Difficulty; use crate::core::ser::ProtocolVersion; use crate::core::{core, global}; use crate::p2p; use crate::p2p::types::PeerInfo; use crate::pool::{self, BlockChain, PoolAdapter}; +use crate::util::secp::pedersen::RangeProof; use crate::util::OneTime; use chrono::prelude::*; use chrono::Duration; use rand::prelude::*; +use std::ops::Range; use std::sync::atomic::AtomicI64; use std::sync::atomic::Ordering; +const KERNEL_SEGMENT_HEIGHT_RANGE: Range = 9..14; +const BITMAP_SEGMENT_HEIGHT_RANGE: Range = 9..14; +const OUTPUT_SEGMENT_HEIGHT_RANGE: Range = 11..16; +const RANGEPROOF_SEGMENT_HEIGHT_RANGE: Range = 7..12; + // NetToChainAdapter need a memory cache to prevent data overloading for network core nodes (non leaf nodes) // This cache will drop sequense of the events during the second struct EventCache { @@ -727,6 +738,66 @@ where fn get_tmpfile_pathname(&self, tmpfile_name: String) -> PathBuf { self.chain().get_tmpfile_pathname(tmpfile_name) } + + fn get_kernel_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error> { + if !KERNEL_SEGMENT_HEIGHT_RANGE.contains(&id.height) { + return Err(chain::ErrorKind::InvalidSegmentHeight.into()); + } + let segmenter = self.chain().segmenter()?; + if segmenter.header().hash() != hash { + return Err(chain::ErrorKind::SegmenterHeaderMismatch.into()); + } + segmenter.kernel_segment(id) + } + + fn get_bitmap_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + if !BITMAP_SEGMENT_HEIGHT_RANGE.contains(&id.height) { + return Err(chain::ErrorKind::InvalidSegmentHeight.into()); + } + let segmenter = self.chain().segmenter()?; + if segmenter.header().hash() != hash { + return Err(chain::ErrorKind::SegmenterHeaderMismatch.into()); + } + segmenter.bitmap_segment(id) + } + + fn get_output_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result<(Segment, Hash), chain::Error> { + if !OUTPUT_SEGMENT_HEIGHT_RANGE.contains(&id.height) { + return Err(chain::ErrorKind::InvalidSegmentHeight.into()); + } + let segmenter = self.chain().segmenter()?; + if segmenter.header().hash() != hash { + return Err(chain::ErrorKind::SegmenterHeaderMismatch.into()); + } + segmenter.output_segment(id) + } + + fn get_rangeproof_segment( + &self, + hash: Hash, + id: SegmentIdentifier, + ) -> Result, chain::Error> { + if RANGEPROOF_SEGMENT_HEIGHT_RANGE.contains(&id.height) { + return Err(chain::ErrorKind::InvalidSegmentHeight.into()); + } + let segmenter = self.chain().segmenter()?; + if segmenter.header().hash() != hash { + return Err(chain::ErrorKind::SegmenterHeaderMismatch.into()); + } + segmenter.rangeproof_segment(id) + } } impl NetToChainAdapter From dc793c514749bc43b3e1acb1798b9e3e223a1288 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 13:56:59 -0700 Subject: [PATCH 14/96] grin v5.3 (0021) enable PIBD_HIST capability by default (#3500) --- p2p/src/types.rs | 3 +-- p2p/tests/capabilities.rs | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/p2p/src/types.rs b/p2p/src/types.rs index 99d29766b0..adc8c59a31 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -500,8 +500,7 @@ impl Default for Capabilities { | Capabilities::PEER_LIST | Capabilities::TX_KERNEL_HASH | Capabilities::TOR_ADDRESS - // To be enabled once we start supporting the various PIBD segment msgs. - // | Capabilities::PIBD_HIST + | Capabilities::PIBD_HIST } } diff --git a/p2p/tests/capabilities.rs b/p2p/tests/capabilities.rs index 3df837205e..155401d3b3 100644 --- a/p2p/tests/capabilities.rs +++ b/p2p/tests/capabilities.rs @@ -42,6 +42,7 @@ fn default_capabilities() { assert!(x.contains(Capabilities::PEER_LIST)); assert!(x.contains(Capabilities::TX_KERNEL_HASH)); assert!(x.contains(Capabilities::TOR_ADDRESS)); + assert!(x.contains(Capabilities::PIBD_HIST)); assert_eq!( x, @@ -50,5 +51,6 @@ fn default_capabilities() { | Capabilities::PEER_LIST | Capabilities::TX_KERNEL_HASH | Capabilities::TOR_ADDRESS + | Capabilities::PIBD_HIST ); } From 566151ffb4d00925b45a24758d94e3e1c6f9ebd0 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 15:30:12 -0700 Subject: [PATCH 15/96] grin v5.3 (0022) Fixfees (#3481) See explanation: https://github.com/mimblewimble/grin-rfcs/blob/master/text/0017-fix-fees.md * add FeeFields type * use FeeFields with ::zero and try_into().unwrap() * fixed tests * avoid 0 accept_base_fee * add aggregate_fee_fields method for transaction * implement std::fmt::Display trait for FeeFields * make base_fee argument non-optional in libtx::mod::tx_fee * add global and thread local accept_fee_base; use to simplify tests * set unusually high fee base for a change * revert to optional base fee argument; default coming from either grin-{server,wallet}.toml * remove optional base fee argument; can be set with global::set_local_accept_fee_base instead * define constant global::DEFAULT_ACCEPT_FEE_BASE and set global value * add Transaction::accept_fee() method and use * Manual (de)ser impl on FeeFields * fix comment bug * Serialize FeeFields as int in tx * allow feefields: u32:into() for tests * try adding height args everywhere * make FeeFields shift/fee methods height dependent * prior to hf4 feefield testing * rename selected fee_fields back to fee for serialization compatibility * fix test_fee_fields test, merge conflict, and doctest use of obsolete fee_fields * make accept_fee height dependent * Accept any u64 in FeeFields deser --- api/src/types.rs | 11 +- chain/src/pipe.rs | 2 +- chain/tests/mine_nrd_kernel.rs | 6 +- chain/tests/mine_simple_chain.rs | 9 +- chain/tests/nrd_validation_rules.rs | 8 +- chain/tests/process_block_cut_through.rs | 11 +- chain/tests/test_coinbase_maturity.rs | 10 +- core/src/consensus.rs | 6 +- core/src/core/block.rs | 9 +- core/src/core/transaction.rs | 422 +++++++++++++++++------ core/src/global.rs | 50 ++- core/src/libtx/aggsig.rs | 6 +- core/src/libtx/build.rs | 20 +- core/src/libtx/mod.rs | 25 +- core/tests/block.rs | 33 +- core/tests/common.rs | 13 +- core/tests/core.rs | 213 ++++++++---- core/tests/transaction.rs | 79 ++++- p2p/src/libp2p_connection.rs | 2 +- p2p/src/msg.rs | 2 +- pool/fuzz/fuzz_targets/common.rs | 4 +- pool/src/pool.rs | 60 ++-- pool/src/transaction_pool.rs | 33 +- pool/src/types.rs | 6 +- pool/tests/block_building.rs | 17 +- pool/tests/block_max_weight.rs | 55 +-- pool/tests/block_reconciliation.rs | 35 +- pool/tests/coinbase_maturity.rs | 1 + pool/tests/common.rs | 13 +- pool/tests/nrd_kernel_relative_height.rs | 23 +- pool/tests/nrd_kernels_disabled.rs | 9 +- pool/tests/nrd_kernels_enabled.rs | 16 +- pool/tests/transaction_pool.rs | 25 +- servers/src/grin/dandelion_monitor.rs | 1 + servers/src/mining/mine_block.rs | 2 +- src/bin/grin.rs | 12 +- 36 files changed, 876 insertions(+), 373 deletions(-) diff --git a/api/src/types.rs b/api/src/types.rs index c37214906f..ea4328e94d 100644 --- a/api/src/types.rs +++ b/api/src/types.rs @@ -15,7 +15,7 @@ use crate::chain; use crate::core::core::hash::Hashed; use crate::core::core::merkle_proof::MerkleProof; -use crate::core::core::{KernelFeatures, TxKernel}; +use crate::core::core::{FeeFields, KernelFeatures, TxKernel}; use crate::core::{core, ser}; use crate::p2p; use crate::util::secp::pedersen; @@ -528,6 +528,7 @@ impl<'de> serde::de::Deserialize<'de> for OutputPrintable { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct TxKernelPrintable { pub features: String, + pub fee_shift: u8, pub fee: u64, pub lock_height: u64, pub excess: String, @@ -537,17 +538,21 @@ pub struct TxKernelPrintable { impl TxKernelPrintable { pub fn from_txkernel(k: &core::TxKernel) -> TxKernelPrintable { let features = k.features.as_string(); - let (fee, lock_height) = match k.features { + let (fee_fields, lock_height) = match k.features { KernelFeatures::Plain { fee } => (fee, 0), - KernelFeatures::Coinbase => (0, 0), + KernelFeatures::Coinbase => (FeeFields::zero(), 0), KernelFeatures::HeightLocked { fee, lock_height } => (fee, lock_height), KernelFeatures::NoRecentDuplicate { fee, relative_height, } => (fee, relative_height.into()), }; + // Printing for the most advanced version that we have. In prev versions the shift is 0, we should be good + let fee = fee_fields.fee(u64::MAX); + let fee_shift: u8 = fee_fields.fee_shift(u64::MAX); TxKernelPrintable { features, + fee_shift, fee, lock_height, excess: k.excess.to_hex(), diff --git a/chain/src/pipe.rs b/chain/src/pipe.rs index 9834996422..8d43d0a147 100644 --- a/chain/src/pipe.rs +++ b/chain/src/pipe.rs @@ -484,7 +484,7 @@ fn validate_header(header: &BlockHeader, ctx: &mut BlockContext<'_>) -> Result<( } // Block header is invalid (and block is invalid) if this lower bound is too heavy for a full block. - let weight = TransactionBody::weight_as_block(0, num_outputs, num_kernels); + let weight = TransactionBody::weight_by_iok(0, num_outputs, num_kernels); if weight > global::max_block_weight() { return Err(ErrorKind::Block(block::Error::TooHeavy).into()); } diff --git a/chain/tests/mine_nrd_kernel.rs b/chain/tests/mine_nrd_kernel.rs index 59f2b68bfd..4f2bb6f277 100644 --- a/chain/tests/mine_nrd_kernel.rs +++ b/chain/tests/mine_nrd_kernel.rs @@ -33,7 +33,7 @@ where { let prev = chain.head_header().unwrap(); let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter().unwrap()); - let fee = txs.iter().map(|x| x.fee()).sum(); + let fee = txs.iter().map(|x| x.fee(prev.height + 1)).sum(); let reward = reward::output( keychain, &ProofBuilder::new(keychain), @@ -91,7 +91,7 @@ fn mine_block_with_nrd_kernel_and_nrd_feature_enabled() { let key_id2 = ExtKeychainPath::new(1, 2, 0, 0, 0).to_identifier(); let tx = build::transaction( KernelFeatures::NoRecentDuplicate { - fee: 20000, + fee: 20000.into(), relative_height: NRDRelativeHeight::new(1440).unwrap(), }, &[ @@ -138,7 +138,7 @@ fn mine_invalid_block_with_nrd_kernel_and_nrd_feature_enabled_before_hf() { let key_id2 = ExtKeychainPath::new(1, 2, 0, 0, 0).to_identifier(); let tx = build::transaction( KernelFeatures::NoRecentDuplicate { - fee: 20000, + fee: 20000.into(), relative_height: NRDRelativeHeight::new(1440).unwrap(), }, &[ diff --git a/chain/tests/mine_simple_chain.rs b/chain/tests/mine_simple_chain.rs index 685d1687d5..f727ece8a7 100644 --- a/chain/tests/mine_simple_chain.rs +++ b/chain/tests/mine_simple_chain.rs @@ -569,7 +569,7 @@ fn spend_rewind_spend() { let key_id30 = ExtKeychainPath::new(1, 30, 0, 0, 0).to_identifier(); let tx1 = build::transaction( - KernelFeatures::Plain { fee: 20000 }, + KernelFeatures::Plain { fee: 20000.into() }, &[ build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id_coinbase.clone()), build::output(consensus::MWC_FIRST_GROUP_REWARD - 20000, key_id30.clone()), @@ -645,7 +645,7 @@ fn spend_in_fork_and_compact() { let key_id31 = ExtKeychainPath::new(1, 31, 0, 0, 0).to_identifier(); let tx1 = build::transaction( - KernelFeatures::Plain { fee: 20000 }, + KernelFeatures::Plain { fee: 20000.into() }, &[ build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id2.clone()), build::output(consensus::MWC_FIRST_GROUP_REWARD - 20000, key_id30.clone()), @@ -663,7 +663,7 @@ fn spend_in_fork_and_compact() { chain.validate(false).unwrap(); let tx2 = build::transaction( - KernelFeatures::Plain { fee: 20000 }, + KernelFeatures::Plain { fee: 20000.into() }, &[ build::input(consensus::MWC_FIRST_GROUP_REWARD - 20000, key_id30.clone()), build::output(consensus::MWC_FIRST_GROUP_REWARD - 40000, key_id31.clone()), @@ -899,7 +899,8 @@ where let proof_size = global::proofsize(); let key_id = ExtKeychainPath::new(1, key_idx, 0, 0, 0).to_identifier(); - let fees = txs.iter().map(|tx| tx.fee()).sum(); + let height = prev.height + 1; + let fees = txs.iter().map(|tx| tx.fee(height)).sum(); let reward = libtx::reward::output( kc, &libtx::ProofBuilder::new(kc), diff --git a/chain/tests/nrd_validation_rules.rs b/chain/tests/nrd_validation_rules.rs index c52d357c9e..2f67524972 100644 --- a/chain/tests/nrd_validation_rules.rs +++ b/chain/tests/nrd_validation_rules.rs @@ -54,7 +54,7 @@ where { let next_header_info = consensus::next_difficulty(prev.height, chain.difficulty_iter().unwrap()); - let fee = txs.iter().map(|x| x.fee()).sum(); + let fee = txs.iter().map(|x| x.fee(prev.height + 1)).sum(); let reward = reward::output( keychain, &ProofBuilder::new(keychain), @@ -107,7 +107,7 @@ fn process_block_nrd_validation() -> Result<(), Error> { assert_eq!(chain.head()?.height, 8); let mut kernel = TxKernel::with_features(KernelFeatures::NoRecentDuplicate { - fee: 20000, + fee: 20000.into(), relative_height: NRDRelativeHeight::new(2)?, }); @@ -223,7 +223,7 @@ fn process_block_nrd_validation_relative_height_1() -> Result<(), Error> { assert_eq!(chain.head()?.height, 8); let mut kernel = TxKernel::with_features(KernelFeatures::NoRecentDuplicate { - fee: 20000, + fee: 20000.into(), relative_height: NRDRelativeHeight::new(1)?, }); @@ -322,7 +322,7 @@ fn process_block_nrd_validation_fork() -> Result<(), Error> { assert_eq!(header_8.height, 8); let mut kernel = TxKernel::with_features(KernelFeatures::NoRecentDuplicate { - fee: 20000, + fee: 20000.into(), relative_height: NRDRelativeHeight::new(2)?, }); diff --git a/chain/tests/process_block_cut_through.rs b/chain/tests/process_block_cut_through.rs index 2dde2759a6..33c20acc9b 100644 --- a/chain/tests/process_block_cut_through.rs +++ b/chain/tests/process_block_cut_through.rs @@ -23,7 +23,7 @@ use self::chain_test_helper::{clean_output_dir, genesis_block, init_chain}; use crate::chain::{pipe, Chain, Options}; use crate::core::core::verifier_cache::LruVerifierCache; use crate::core::core::{block, pmmr, transaction}; -use crate::core::core::{Block, KernelFeatures, Transaction, Weighting}; +use crate::core::core::{Block, FeeFields, KernelFeatures, Transaction, Weighting}; use crate::core::libtx::{build, reward, ProofBuilder}; use crate::core::{consensus, global, pow}; use crate::keychain::{ExtKeychain, ExtKeychainPath, Keychain, SwitchCommitmentType}; @@ -43,7 +43,7 @@ where let prev = chain.head_header().unwrap(); let next_height = prev.height + 1; let next_header_info = consensus::next_difficulty(1, chain.difficulty_iter()?); - let fee = txs.iter().map(|x| x.fee()).sum(); + let fee = txs.iter().map(|x| x.fee(next_height)).sum(); let key_id = ExtKeychainPath::new(1, next_height as u32, 0, 0, 0).to_identifier(); let reward = reward::output( keychain, @@ -114,7 +114,9 @@ fn process_block_cut_through() -> Result<(), chain::Error> { // Note: We reuse key_ids resulting in an input and an output sharing the same commitment. // The input is coinbase and the output is plain. let tx = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[ build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id1.clone()), build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id2.clone()), @@ -143,8 +145,9 @@ fn process_block_cut_through() -> Result<(), chain::Error> { let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Transaction is invalid due to cut-through. + let height = 7; assert_eq!( - tx.validate(Weighting::AsTransaction, verifier_cache.clone()), + tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height), Err(transaction::Error::CutThrough), ); diff --git a/chain/tests/test_coinbase_maturity.rs b/chain/tests/test_coinbase_maturity.rs index d90607d025..4f4cfaf005 100644 --- a/chain/tests/test_coinbase_maturity.rs +++ b/chain/tests/test_coinbase_maturity.rs @@ -100,7 +100,7 @@ fn test_coinbase_maturity() { // here we build a tx that attempts to spend the earlier coinbase output // this is not a valid tx as the coinbase output cannot be spent yet let coinbase_txn = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[ build::coinbase_input(amount, key_id1.clone()), build::output(amount - 2, key_id2.clone()), @@ -111,7 +111,7 @@ fn test_coinbase_maturity() { .unwrap(); let txs = &[coinbase_txn.clone()]; - let fees = txs.iter().map(|tx| tx.fee()).sum(); + let fees = txs.iter().map(|tx| tx.fee(prev.height + 1)).sum(); let reward = libtx::reward::output(&keychain, &builder, &key_id3, fees, false, 1).unwrap(); let next_header_info = consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); @@ -186,7 +186,7 @@ fn test_coinbase_maturity() { // here we build a tx that attempts to spend the earlier coinbase output // this is not a valid tx as the coinbase output cannot be spent yet let coinbase_txn = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[ build::coinbase_input(amount, key_id1.clone()), build::output(amount - 2, key_id2.clone()), @@ -197,7 +197,7 @@ fn test_coinbase_maturity() { .unwrap(); let txs = &[coinbase_txn.clone()]; - let fees = txs.iter().map(|tx| tx.fee()).sum(); + let fees = txs.iter().map(|tx| tx.fee(prev.height + 1)).sum(); let reward = libtx::reward::output(&keychain, &builder, &key_id3, fees, false, 1).unwrap(); let next_header_info = @@ -267,7 +267,7 @@ fn test_coinbase_maturity() { .unwrap(); let txs = &[coinbase_txn]; - let fees = txs.iter().map(|tx| tx.fee()).sum(); + let fees = txs.iter().map(|tx| tx.fee(prev.height + 1)).sum(); let next_header_info = consensus::next_difficulty(prev.height + 1, chain.difficulty_iter().unwrap()); let reward = diff --git a/core/src/consensus.rs b/core/src/consensus.rs index f0f90f40b5..fe548a7f8c 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -113,13 +113,13 @@ pub const CUT_THROUGH_HORIZON: u32 = WEEK_HEIGHT as u32; pub const STATE_SYNC_THRESHOLD: u32 = 2 * DAY_HEIGHT as u32; /// Weight of an input when counted against the max block weight capacity -pub const BLOCK_INPUT_WEIGHT: u64 = 1; +pub const INPUT_WEIGHT: u64 = 1; /// Weight of an output when counted against the max block weight capacity -pub const BLOCK_OUTPUT_WEIGHT: u64 = 21; +pub const OUTPUT_WEIGHT: u64 = 21; /// Weight of a kernel when counted against the max block weight capacity -pub const BLOCK_KERNEL_WEIGHT: u64 = 3; +pub const KERNEL_WEIGHT: u64 = 3; /// Total maximum block weight. At current sizes, this means a maximum /// theoretical size of: diff --git a/core/src/core/block.rs b/core/src/core/block.rs index 6cd2315477..64b8a1a1a1 100644 --- a/core/src/core/block.rs +++ b/core/src/core/block.rs @@ -503,11 +503,8 @@ impl Readable for UntrustedBlockHeader { } // Validate global output and kernel MMR sizes against upper bounds based on block height. - let global_weight = TransactionBody::weight_as_block( - 0, - header.output_mmr_count(), - header.kernel_mmr_count(), - ); + let global_weight = + TransactionBody::weight_by_iok(0, header.output_mmr_count(), header.kernel_mmr_count()); if global_weight > global::max_block_weight() * (header.height + 1) { return Err(ser::Error::CorruptedData( "Tx global weight is exceed the limit".to_string(), @@ -736,7 +733,7 @@ impl Block { /// Sum of all fees (inputs less outputs) in the block pub fn total_fees(&self) -> u64 { - self.body.fee() + self.body.fee(self.header.height) } /// "Lightweight" validation that we can perform quickly during read/deserialization. diff --git a/core/src/core/transaction.rs b/core/src/core/transaction.rs index e4afbcf1f3..db367f782d 100644 --- a/core/src/core/transaction.rs +++ b/core/src/core/transaction.rs @@ -14,6 +14,7 @@ //! Transactions +use crate::core::block::HeaderVersion; use crate::core::hash::{DefaultHashable, Hashed}; use crate::core::verifier_cache::VerifierCache; use crate::core::{committed, Committed}; @@ -25,9 +26,13 @@ use crate::ser::{ use crate::{consensus, global}; use enum_primitive::FromPrimitive; use keychain::{self, BlindingFactor}; +use serde::de; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::cmp::Ordering; use std::cmp::{max, min}; use std::convert::{TryFrom, TryInto}; +use std::fmt; +use std::fmt::Display; use std::sync::Arc; use util; use util::secp; @@ -36,6 +41,187 @@ use util::static_secp_instance; use util::RwLock; use util::ToHex; +/// Fee fields as in fix-fees RFC: { future_use: 20, fee_shift: 4, fee: 40 } +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct FeeFields(u64); + +impl DefaultHashable for FeeFields {} + +impl Writeable for FeeFields { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + writer.write_u64(self.0) + } +} + +impl Readable for FeeFields { + fn read(reader: &mut R) -> Result { + let fee_fields = reader.read_u64()?; + Ok(Self(fee_fields)) + } +} + +impl Display for FeeFields { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl Serialize for FeeFields { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.0) + } +} + +impl<'de> Deserialize<'de> for FeeFields { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct FeeFieldsVisitor; + impl<'de> de::Visitor<'de> for FeeFieldsVisitor { + type Value = FeeFields; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("an 64-bit integer") + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + let value = value + .parse() + .map_err(|_| E::custom(format!("invalid fee field")))?; + self.visit_u64(value) + } + + fn visit_u64(self, value: u64) -> Result + where + E: de::Error, + { + Ok(FeeFields(value)) + } + } + + deserializer.deserialize_any(FeeFieldsVisitor) + } +} + +/// Conversion from a valid fee to a FeeFields with 0 fee_shift +/// The valid fee range is 1..FEE_MASK +impl TryFrom for FeeFields { + type Error = Error; + + fn try_from(fee: u64) -> Result { + if fee == 0 { + Err(Error::InvalidFeeFields(format!("fee is zero"))) + } else if fee > FeeFields::FEE_MASK { + Err(Error::InvalidFeeFields(format!("fee {} is too high", fee))) + } else { + Ok(Self(fee)) + } + } +} + +/// Conversion from a 32-bit fee to a FeeFields with 0 fee_shift +/// For use exclusively in tests with constant fees +impl From for FeeFields { + fn from(fee: u32) -> Self { + Self(fee as u64) + } +} + +impl From for u64 { + fn from(fee_fields: FeeFields) -> Self { + fee_fields.0 as u64 + } +} + +impl FeeFields { + /// Fees are limited to 40 bits + const FEE_BITS: u32 = 40; + /// Used to extract fee field + const FEE_MASK: u64 = (1u64 << FeeFields::FEE_BITS) - 1; + + /// Fee shifts are limited to 4 bits + pub const FEE_SHIFT_BITS: u32 = 4; + /// Used to extract fee_shift field + pub const FEE_SHIFT_MASK: u64 = (1u64 << FeeFields::FEE_SHIFT_BITS) - 1; + + /// Create a zero FeeFields with 0 fee and 0 fee_shift + pub fn zero() -> Self { + Self(0) + } + + /// Create a new FeeFields from the provided shift and fee + /// Checks both are valid (in range) + pub fn new(fee_shift: u64, fee: u64) -> Result { + if fee == 0 { + Err(Error::InvalidFeeFields(format!("fee is zero"))) + } else if fee > FeeFields::FEE_MASK { + Err(Error::InvalidFeeFields(format!("fee {} is too high", fee))) + } else if fee_shift > FeeFields::FEE_SHIFT_MASK { + Err(Error::InvalidFeeFields(format!( + "fee_shift {} is too high", + fee_shift + ))) + } else { + Ok(Self((fee_shift << FeeFields::FEE_BITS) | fee)) + } + } + + /// Extract fee_shift field + pub fn fee_shift(&self, height: u64) -> u8 { + if consensus::header_version(height) < HeaderVersion(5) { + 0 + } else { + ((self.0 >> FeeFields::FEE_BITS) & FeeFields::FEE_SHIFT_MASK) as u8 + } + } + + /// Extract fee field + pub fn fee(&self, height: u64) -> u64 { + if consensus::header_version(height) < HeaderVersion(3) { + self.0 + } else { + self.0 & FeeFields::FEE_MASK + } + } + + /// Extract bitfields fee_shift and fee into tuple + /// ignore upper 64-FEE_BITS-FEE_SHIFT_BITS bits + pub fn as_tuple(&self) -> (u64, u64) { + let fee = self.0 & FeeFields::FEE_MASK; + let fee_shift = (self.0 >> FeeFields::FEE_BITS) & FeeFields::FEE_SHIFT_MASK; + (fee, fee_shift) + } + + /// Turn a zero `FeeField` into a `None`, any other value into a `Some`. + /// We need this because a zero `FeeField` cannot be deserialized. + pub fn as_opt(&self) -> Option { + if self.is_zero() { + None + } else { + Some(*self) + } + } + + /// Check if the `FeeFields` is set to zero + pub fn is_zero(&self) -> bool { + self.0 == 0 + } +} + +fn fee_fields_as_int(fee_fields: &FeeFields, serializer: S) -> Result +where + S: Serializer, +{ + serializer.serialize_u64(fee_fields.0) +} + /// Relative height field on NRD kernel variant. /// u16 representing a height between 1 and MAX (consensus::WEEK_HEIGHT). #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] @@ -108,21 +294,24 @@ pub enum KernelFeatures { /// Plain kernel (the default for Grin txs). Plain { /// Plain kernels have fees. - fee: u64, + #[serde(serialize_with = "fee_fields_as_int")] + fee: FeeFields, }, /// A coinbase kernel. Coinbase, /// A kernel with an explicit lock height (and fee). HeightLocked { /// Height locked kernels have fees. - fee: u64, + #[serde(serialize_with = "fee_fields_as_int")] + fee: FeeFields, /// Height locked kernels have lock heights. lock_height: u64, }, /// "No Recent Duplicate" (NRD) kernels enforcing relative lock height between instances. NoRecentDuplicate { /// These have fees. - fee: u64, + #[serde(serialize_with = "fee_fields_as_int")] + fee: FeeFields, /// Relative lock height. relative_height: NRDRelativeHeight, }, @@ -155,10 +344,10 @@ impl KernelFeatures { } } - /// msg = hash(features) for coinbase kernels - /// hash(features || fee) for plain kernels - /// hash(features || fee || lock_height) for height locked kernels - /// hash(features || fee || relative_height) for NRD kernels + /// msg = hash(features) for coinbase kernels + /// hash(features || fee_fields) for plain kernels + /// hash(features || fee_fields || lock_height) for height locked kernels + /// hash(features || fee_fields || relative_height) for NRD kernels pub fn kernel_sig_msg(&self) -> Result { let x = self.as_u8(); let hash = match self { @@ -176,38 +365,39 @@ impl KernelFeatures { } /// Get paid fee for this kernel - pub fn get_fee(&self) -> u64 { + /// Pessimistic because returned value can be higher then real fee if shift in not 0 + /// For out use case it is ok, there is no transaction priority or whatever + pub fn get_fee_pessimistic(&self) -> u64 { match self { - KernelFeatures::Plain { fee } => fee, - KernelFeatures::Coinbase => &0, + KernelFeatures::Plain { fee } => fee.0, + KernelFeatures::Coinbase => 0, KernelFeatures::HeightLocked { fee, lock_height: _, - } => fee, + } => fee.0, KernelFeatures::NoRecentDuplicate { fee, relative_height: _, - } => fee, + } => fee.0, } - .clone() } /// Write tx kernel features out in v1 protocol format. - /// Always include the fee and lock_height, writing 0 value if unused. + /// Always include the fee_fields and lock_height, writing 0 value if unused. fn write_v1(&self, writer: &mut W) -> Result<(), ser::Error> { writer.write_u8(self.as_u8())?; match self { KernelFeatures::Plain { fee } => { - writer.write_u64(*fee)?; + fee.write(writer)?; // Write "empty" bytes for feature specific data (8 bytes). writer.write_empty_bytes(8)?; } KernelFeatures::Coinbase => { - // Write "empty" bytes for fee (8 bytes) and feature specific data (8 bytes). + // Write "empty" bytes for fee_fields (8 bytes) and feature specific data (8 bytes). writer.write_empty_bytes(16)?; } KernelFeatures::HeightLocked { fee, lock_height } => { - writer.write_u64(*fee)?; + fee.write(writer)?; // 8 bytes of feature specific data containing the lock height as big-endian u64. writer.write_u64(*lock_height)?; } @@ -215,7 +405,7 @@ impl KernelFeatures { fee, relative_height, } => { - writer.write_u64(*fee)?; + fee.write(writer)?; // 8 bytes of feature specific data. First 6 bytes are empty. // Last 2 bytes contain the relative lock height as big-endian u16. @@ -230,20 +420,20 @@ impl KernelFeatures { /// Write tx kernel features out in v2 protocol format. /// These are variable sized based on feature variant. - /// Only write fee out for feature variants that support it. + /// Only write fee_fields out for feature variants that support it. /// Only write lock_height out for feature variants that support it. fn write_v2(&self, writer: &mut W) -> Result<(), ser::Error> { writer.write_u8(self.as_u8())?; match self { KernelFeatures::Plain { fee } => { // Fee only, no additional data on plain kernels. - writer.write_u64(*fee)?; + fee.write(writer)?; } KernelFeatures::Coinbase => { // No additional data. } KernelFeatures::HeightLocked { fee, lock_height } => { - writer.write_u64(*fee)?; + fee.write(writer)?; // V2 height locked kernels use 8 bytes for the lock height. writer.write_u64(*lock_height)?; } @@ -251,7 +441,7 @@ impl KernelFeatures { fee, relative_height, } => { - writer.write_u64(*fee)?; + fee.write(writer)?; // V2 NRD kernels use 2 bytes for the relative lock height. relative_height.write(writer)?; } @@ -259,7 +449,7 @@ impl KernelFeatures { Ok(()) } - // Always read feature byte, 8 bytes for fee and 8 bytes for additional data + // Always read feature byte, 8 bytes for fee_fields and 8 bytes for additional data // representing lock height or relative height. // Fee and additional data may be unused for some kernel variants but we need // to read these bytes and verify they are 0 if unused. @@ -267,19 +457,19 @@ impl KernelFeatures { let feature_byte = reader.read_u8()?; let features = match feature_byte { KernelFeatures::PLAIN_U8 => { - let fee = reader.read_u64()?; + let fee = FeeFields::read(reader)?; // 8 "empty" bytes as additional data is not used. reader.read_empty_bytes(8)?; KernelFeatures::Plain { fee } } KernelFeatures::COINBASE_U8 => { - // 8 "empty" bytes as fee is not used. + // 8 "empty" bytes as fee_fields is not used. // 8 "empty" bytes as additional data is not used. reader.read_empty_bytes(16)?; KernelFeatures::Coinbase } KernelFeatures::HEIGHT_LOCKED_U8 => { - let fee = reader.read_u64()?; + let fee = FeeFields::read(reader)?; // 8 bytes of feature specific data, lock height as big-endian u64. let lock_height = reader.read_u64()?; KernelFeatures::HeightLocked { fee, lock_height } @@ -290,7 +480,7 @@ impl KernelFeatures { return Err(ser::Error::CorruptedData("NRD is disabled".to_string())); } - let fee = reader.read_u64()?; + let fee = FeeFields::read(reader)?; // 8 bytes of feature specific data. // The first 6 bytes must be "empty". @@ -317,12 +507,12 @@ impl KernelFeatures { fn read_v2(reader: &mut R) -> Result { let features = match reader.read_u8()? { KernelFeatures::PLAIN_U8 => { - let fee = reader.read_u64()?; + let fee = FeeFields::read(reader)?; KernelFeatures::Plain { fee } } KernelFeatures::COINBASE_U8 => KernelFeatures::Coinbase, KernelFeatures::HEIGHT_LOCKED_U8 => { - let fee = reader.read_u64()?; + let fee = FeeFields::read(reader)?; let lock_height = reader.read_u64()?; KernelFeatures::HeightLocked { fee, lock_height } } @@ -332,7 +522,7 @@ impl KernelFeatures { return Err(ser::Error::CorruptedData("NRD is disabled".to_string())); } - let fee = reader.read_u64()?; + let fee = FeeFields::read(reader)?; let relative_height = NRDRelativeHeight::read(reader)?; KernelFeatures::NoRecentDuplicate { fee, @@ -421,6 +611,9 @@ pub enum Error { /// It is invalid for a transaction to contain a coinbase kernel, for example. #[fail(display = "Tx Invalid kernel feature")] InvalidKernelFeatures, + /// feeshift is limited to 4 bits and fee must be positive and fit in 40 bits. + #[fail(display = "Invalid Fee Fields, {}", _0)] + InvalidFeeFields(String), /// NRD kernel relative height is limited to 1 week duration and must be greater than 0. #[fail(display = "Invalid NRD kernel relative height")] InvalidNRDRelativeHeight, @@ -459,7 +652,7 @@ impl From for Error { /// A proof that a transaction sums to zero. Includes both the transaction's /// Pedersen commitment and the signature, that guarantees that the commitments /// amount to zero. -/// The signature signs the fee and the lock_height, which are retained for +/// The signature signs the fee_fields and the lock_height, which are retained for /// signature validation. #[derive(Serialize, Deserialize, Debug, Clone, Copy)] pub struct TxKernel { @@ -474,7 +667,7 @@ pub struct TxKernel { )] pub excess: Commitment, /// The signature proving the excess is a valid public key, which signs - /// the transaction fee. + /// the transaction fee_fields. #[serde(with = "secp_ser::sig_serde")] pub excess_sig: secp::Signature, } @@ -586,14 +779,14 @@ impl TxKernel { } /// The msg signed as part of the tx kernel. - /// Based on kernel features and associated fields (fee and lock_height). + /// Based on kernel features and associated fields (fee_fields and lock_height). pub fn msg_to_sign(&self) -> Result { let msg = self.features.kernel_sig_msg()?; Ok(msg) } /// Verify the transaction proof validity. Entails handling the commitment - /// as a public key and checking the signature verifies with the fee as + /// as a public key and checking the signature verifies with the fee_fields as /// message. pub fn verify(&self) -> Result<(), Error> { let secp = static_secp_instance(); @@ -640,7 +833,9 @@ impl TxKernel { /// Build an empty tx kernel with zero values. pub fn empty() -> TxKernel { - TxKernel::with_features(KernelFeatures::Plain { fee: 0 }) + TxKernel::with_features(KernelFeatures::Plain { + fee: FeeFields::zero(), + }) } /// Build an empty tx kernel with the provided kernel features. @@ -723,8 +918,7 @@ impl Readable for TransactionBody { // Quick block weight check before proceeding. // Note: We use weight_as_block here (inputs have weight). - let tx_block_weight = - TransactionBody::weight_as_block(num_inputs, num_outputs, num_kernels); + let tx_block_weight = TransactionBody::weight_by_iok(num_inputs, num_outputs, num_kernels); if num_inputs > ser::READ_VEC_SIZE_LIMIT || num_outputs > ser::READ_VEC_SIZE_LIMIT @@ -912,7 +1106,7 @@ impl TransactionBody { } /// Total fee for a TransactionBody is the sum of fees of all fee carrying kernels. - pub fn fee(&self) -> u64 { + pub fn fee(&self, height: u64) -> u64 { self.kernels .iter() .filter_map(|k| match k.features { @@ -921,49 +1115,57 @@ impl TransactionBody { KernelFeatures::HeightLocked { fee, .. } => Some(fee), KernelFeatures::NoRecentDuplicate { fee, .. } => Some(fee), }) - .fold(0, |acc, fee| acc.saturating_add(fee)) + .fold(0, |acc, fee_fields| { + acc.saturating_add(fee_fields.fee(height)) + }) } - fn overage(&self) -> i64 { - self.fee() as i64 + /// fee_shift for a TransactionBody is the maximum of fee_shifts of all fee carrying kernels. + pub fn fee_shift(&self, height: u64) -> u8 { + self.kernels + .iter() + .filter_map(|k| match k.features { + KernelFeatures::Coinbase => None, + KernelFeatures::Plain { fee } => Some(fee), + KernelFeatures::HeightLocked { fee, .. } => Some(fee), + KernelFeatures::NoRecentDuplicate { fee, .. } => Some(fee), + }) + .fold(0, |acc, fee_fields| max(acc, fee_fields.fee_shift(height))) } - /// Calculate transaction weight - pub fn body_weight(&self) -> u64 { - TransactionBody::weight( - self.inputs.len() as u64, - self.outputs.len() as u64, - self.kernels.len() as u64, - ) + /// Shifted fee for a TransactionBody is the sum of fees shifted right by the maximum fee_shift + /// this is used to determine whether a tx can be relayed or accepted in a mempool + /// where transactions can specify a higher block-inclusion priority as a positive shift up to 15 + /// but are required to overpay the minimum required fees by a factor of 2^priority + pub fn shifted_fee(&self, height: u64) -> u64 { + self.fee(height) >> self.fee_shift(height) + } + + /// aggregate fee_fields from all appropriate kernels in TransactionBody into one, if possible + pub fn aggregate_fee_fields(&self, height: u64) -> Result { + FeeFields::new(self.fee_shift(height) as u64, self.fee(height)) + } + + fn overage(&self, height: u64) -> i64 { + self.fee(height) as i64 } /// Calculate weight of transaction using block weighing - pub fn body_weight_as_block(&self) -> u64 { - TransactionBody::weight_as_block( + pub fn weight(&self) -> u64 { + TransactionBody::weight_by_iok( self.inputs.len() as u64, self.outputs.len() as u64, self.kernels.len() as u64, ) } - /// Calculate transaction weight from transaction details. This is non - /// consensus critical and compared to block weight, incentivizes spending - /// more outputs (to lower the fee). - pub fn weight(num_inputs: u64, num_outputs: u64, num_kernels: u64) -> u64 { - let body_weight = num_outputs - .saturating_mul(4) - .saturating_add(num_kernels) - .saturating_sub(num_inputs); - max(body_weight, 1) - } - /// Calculate transaction weight using block weighing from transaction /// details. Consensus critical and uses consensus weight values. - pub fn weight_as_block(num_inputs: u64, num_outputs: u64, num_kernels: u64) -> u64 { + pub fn weight_by_iok(num_inputs: u64, num_outputs: u64, num_kernels: u64) -> u64 { num_inputs - .saturating_mul(consensus::BLOCK_INPUT_WEIGHT as u64) - .saturating_add(num_outputs.saturating_mul(consensus::BLOCK_OUTPUT_WEIGHT as u64)) - .saturating_add(num_kernels.saturating_mul(consensus::BLOCK_KERNEL_WEIGHT as u64)) + .saturating_mul(consensus::INPUT_WEIGHT as u64) + .saturating_add(num_outputs.saturating_mul(consensus::OUTPUT_WEIGHT as u64)) + .saturating_add(num_kernels.saturating_mul(consensus::KERNEL_WEIGHT as u64)) } /// Lock height of a body is the max lock height of the kernels. @@ -983,7 +1185,7 @@ impl TransactionBody { fn verify_weight(&self, weighting: Weighting) -> Result<(), Error> { // A coinbase reward is a single output and a single kernel (for now). // We need to account for this when verifying max tx weights. - let coinbase_weight = consensus::BLOCK_OUTPUT_WEIGHT + consensus::BLOCK_KERNEL_WEIGHT; + let coinbase_weight = consensus::OUTPUT_WEIGHT + consensus::KERNEL_WEIGHT; // If "tx" body then remember to reduce the max_block_weight by the weight of a kernel. // If "limited tx" then compare against the provided max_weight. @@ -994,7 +1196,7 @@ impl TransactionBody { // for the additional coinbase reward (1 output + 1 kernel). // let max_weight = match weighting { - Weighting::AsTransaction => global::max_block_weight().saturating_sub(coinbase_weight), + Weighting::AsTransaction => global::max_tx_weight(), Weighting::AsLimitedTransaction(max_weight) => { min(global::max_block_weight(), max_weight).saturating_sub(coinbase_weight) } @@ -1005,7 +1207,7 @@ impl TransactionBody { } }; - if self.body_weight_as_block() > max_weight { + if self.weight() > max_weight { return Err(Error::TooHeavy); } Ok(()) @@ -1291,13 +1493,23 @@ impl Transaction { } /// Total fee for a transaction is the sum of fees of all kernels. - pub fn fee(&self) -> u64 { - self.body.fee() + pub fn fee(&self, height: u64) -> u64 { + self.body.fee(height) + } + + /// Shifted fee for a transaction is the sum of fees of all kernels shifted right by the maximum fee shift + pub fn shifted_fee(&self, height: u64) -> u64 { + self.body.shifted_fee(height) + } + + /// aggregate fee_fields from all appropriate kernels in transaction into one + pub fn aggregate_fee_fields(&self, height: u64) -> Result { + self.body.aggregate_fee_fields(height) } /// Total overage across all kernels. - pub fn overage(&self) -> i64 { - self.body.overage() + pub fn overage(&self, height: u64) -> i64 { + self.body.overage(height) } /// Lock height of a transaction is the max lock height of the kernels. @@ -1323,32 +1535,50 @@ impl Transaction { &self, weighting: Weighting, verifier: Arc>, + height: u64, ) -> Result<(), Error> { self.body.verify_features()?; self.body.validate(weighting, verifier)?; - self.verify_kernel_sums(self.overage(), self.offset.clone())?; + self.verify_kernel_sums(self.overage(height), self.offset.clone())?; Ok(()) } - /// Can be used to compare txs by their fee/weight ratio. + /// Can be used to compare txs by their fee/weight ratio, aka feerate. /// Don't use these values for anything else though due to precision multiplier. - pub fn fee_to_weight(&self) -> u64 { - self.fee() * 1_000 / self.tx_weight() as u64 + pub fn fee_rate(&self, height: u64) -> u64 { + self.fee(height) / self.weight() as u64 } /// Calculate transaction weight - pub fn tx_weight(&self) -> u64 { - self.body.body_weight() + pub fn weight(&self) -> u64 { + self.body.weight() + } + + /// Transaction minimum acceptable fee + pub fn accept_fee(&self, height: u64) -> u64 { + if consensus::header_version(height) < HeaderVersion(5) { + Transaction::old_weight_by_iok( + self.body.inputs.len() as u64, + self.body.outputs.len() as u64, + self.body.kernels.len() as u64, + ) * consensus::MILLI_GRIN + } else { + self.weight() * global::get_accept_fee_base() + } } - /// Calculate transaction weight as a block - pub fn tx_weight_as_block(&self) -> u64 { - self.body.body_weight_as_block() + /// Old weight definition for pool acceptance + pub fn old_weight_by_iok(num_inputs: u64, num_outputs: u64, num_kernels: u64) -> u64 { + let body_weight = num_outputs + .saturating_mul(4) + .saturating_add(num_kernels) + .saturating_sub(num_inputs); + max(body_weight, 1) } /// Calculate transaction weight from transaction details - pub fn weight(num_inputs: u64, num_outputs: u64, num_kernels: u64) -> u64 { - TransactionBody::weight(num_inputs, num_outputs, num_kernels) + pub fn weight_by_iok(num_inputs: u64, num_outputs: u64, num_kernels: u64) -> u64 { + TransactionBody::weight_by_iok(num_inputs, num_outputs, num_kernels) } } @@ -2150,7 +2380,7 @@ mod test { let sig = secp::Signature::from_raw_data(&[0; 64]).unwrap(); let kernel = TxKernel { - features: KernelFeatures::Plain { fee: 10 }, + features: KernelFeatures::Plain { fee: 10.into() }, excess: commit, excess_sig: sig.clone(), }; @@ -2160,7 +2390,7 @@ mod test { let mut vec = vec![]; ser::serialize(&mut vec, version, &kernel).expect("serialized failed"); let kernel2: TxKernel = ser::deserialize(&mut &vec[..], version).unwrap(); - assert_eq!(kernel2.features, KernelFeatures::Plain { fee: 10 }); + assert_eq!(kernel2.features, KernelFeatures::Plain { fee: 10.into() }); assert_eq!(kernel2.excess, commit); assert_eq!(kernel2.excess_sig, sig.clone()); } @@ -2169,7 +2399,7 @@ mod test { let mut vec = vec![]; ser::serialize_default(&mut vec, &kernel).expect("serialized failed"); let kernel2: TxKernel = ser::deserialize_default(&mut &vec[..]).unwrap(); - assert_eq!(kernel2.features, KernelFeatures::Plain { fee: 10 }); + assert_eq!(kernel2.features, KernelFeatures::Plain { fee: 10.into() }); assert_eq!(kernel2.excess, commit); assert_eq!(kernel2.excess_sig, sig.clone()); } @@ -2188,7 +2418,7 @@ mod test { // now check a kernel with lock_height serialize/deserialize correctly let kernel = TxKernel { features: KernelFeatures::HeightLocked { - fee: 10, + fee: 10.into(), lock_height: 100, }, excess: commit, @@ -2230,7 +2460,7 @@ mod test { // now check an NRD kernel will serialize/deserialize correctly let kernel = TxKernel { features: KernelFeatures::NoRecentDuplicate { - fee: 10, + fee: 10.into(), relative_height: NRDRelativeHeight(100), }, excess: commit, @@ -2262,7 +2492,7 @@ mod test { let key_id = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); let mut kernel = TxKernel::with_features(KernelFeatures::NoRecentDuplicate { - fee: 10, + fee: 10.into(), relative_height: NRDRelativeHeight(100), }); @@ -2288,25 +2518,25 @@ mod test { // Modify the fee and check signature no longer verifies. kernel.features = KernelFeatures::NoRecentDuplicate { - fee: 9, + fee: 9.into(), relative_height: NRDRelativeHeight(100), }; assert_eq!(kernel.verify(), Err(Error::IncorrectSignature)); // Modify the relative_height and check signature no longer verifies. kernel.features = KernelFeatures::NoRecentDuplicate { - fee: 10, + fee: 10.into(), relative_height: NRDRelativeHeight(101), }; assert_eq!(kernel.verify(), Err(Error::IncorrectSignature)); // Swap the features out for something different and check signature no longer verifies. - kernel.features = KernelFeatures::Plain { fee: 10 }; + kernel.features = KernelFeatures::Plain { fee: 10.into() }; assert_eq!(kernel.verify(), Err(Error::IncorrectSignature)); // Check signature verifies if we use the original features. kernel.features = KernelFeatures::NoRecentDuplicate { - fee: 10, + fee: 10.into(), relative_height: NRDRelativeHeight(100), }; assert_eq!(kernel.verify(), Ok(())); @@ -2367,7 +2597,7 @@ mod test { let mut vec = vec![]; ser::serialize_default(&mut vec, &(0u8, 10u64, 0u64))?; let features: KernelFeatures = ser::deserialize_default(&mut &vec[..])?; - assert_eq!(features, KernelFeatures::Plain { fee: 10 }); + assert_eq!(features, KernelFeatures::Plain { fee: 10.into() }); let mut vec = vec![]; ser::serialize_default(&mut vec, &(1u8, 0u64, 0u64))?; @@ -2380,7 +2610,7 @@ mod test { assert_eq!( features, KernelFeatures::HeightLocked { - fee: 10, + fee: 10.into(), lock_height: 100 } ); @@ -2420,7 +2650,7 @@ mod test { assert_eq!( features, KernelFeatures::NoRecentDuplicate { - fee: 10, + fee: 10.into(), relative_height: NRDRelativeHeight(100) } ); diff --git a/core/src/global.rs b/core/src/global.rs index e0e25c49ed..71c0d35907 100644 --- a/core/src/global.rs +++ b/core/src/global.rs @@ -16,10 +16,11 @@ //! having to pass them all over the place, but aren't consensus values. //! should be used sparingly. +use crate::consensus; use crate::consensus::{ - graph_weight, HeaderInfo, BASE_EDGE_BITS, BLOCK_KERNEL_WEIGHT, BLOCK_OUTPUT_WEIGHT, - BLOCK_TIME_SEC, COINBASE_MATURITY, CUT_THROUGH_HORIZON, DAY_HEIGHT, DEFAULT_MIN_EDGE_BITS, - DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, MAX_BLOCK_WEIGHT, PROOFSIZE, + graph_weight, HeaderInfo, BASE_EDGE_BITS, BLOCK_TIME_SEC, COINBASE_MATURITY, + CUT_THROUGH_HORIZON, DAY_HEIGHT, DEFAULT_MIN_EDGE_BITS, DIFFICULTY_ADJUST_WINDOW, GRIN_BASE, + INITIAL_DIFFICULTY, KERNEL_WEIGHT, MAX_BLOCK_WEIGHT, OUTPUT_WEIGHT, PROOFSIZE, SECOND_POW_EDGE_BITS, STATE_SYNC_THRESHOLD, }; use crate::pow::{self, new_cuckarood_ctx, new_cuckatoo_ctx, BitVec, PoWContext}; @@ -79,6 +80,9 @@ pub const TESTING_INITIAL_DIFFICULTY: u64 = 1; /// Testing max_block_weight (artifically low, just enough to support a few txs). pub const TESTING_MAX_BLOCK_WEIGHT: u64 = 250; +/// Default unit of fee per tx weight, making each output cost about a Grincent +pub const DEFAULT_ACCEPT_FEE_BASE: u64 = consensus::MILLI_GRIN; // Keeping default base is same, no changes for MWC GRIN_BASE / 100 / 20; // 500_000 + /// If a peer's last updated difficulty is 2 hours ago and its difficulty's lower than ours, /// we're sure this peer is a stuck node, and we will kick out such kind of stuck peers. pub const STUCK_PEER_KICK_TIME: i64 = 2 * 3600 * 1000; @@ -163,6 +167,12 @@ lazy_static! { /// to be overridden on a per-thread basis (for testing). pub static ref GLOBAL_CHAIN_TYPE: OneTime = OneTime::new(); + /// Global acccept fee base that must be initialized once on node startup. + /// This is accessed via get_acccept_fee_base() which allows the global value + /// to be overridden on a per-thread basis (for testing). + pub static ref GLOBAL_ACCEPT_FEE_BASE: OneTime = OneTime::new(); + + /// Global feature flag for NRD kernel support. /// If enabled NRD kernels are treated as valid after HF3 (based on header version). /// If disabled NRD kernels are invalid regardless of header version or block height. @@ -177,6 +187,9 @@ thread_local! { /// Mainnet|Floonet|UserTesting|AutomatedTesting pub static CHAIN_TYPE: Cell> = Cell::new(None); + /// minimum transaction fee per unit of transaction weight for mempool acceptance + pub static ACCEPT_FEE_BASE: Cell> = Cell::new(None); + /// Local feature flag for NRD kernel support. pub static NRD_FEATURE_ENABLED: Cell> = Cell::new(None); } @@ -238,6 +251,35 @@ pub fn is_nrd_enabled() -> bool { }) } +/// One time initialization of the global accept fee base +/// Will panic if we attempt to re-initialize this (via OneTime). +pub fn init_global_accept_fee_base(new_base: u64) { + GLOBAL_ACCEPT_FEE_BASE.init(new_base) +} + +/// Set the accept fee base on a per-thread basis via thread_local storage. +pub fn set_local_accept_fee_base(new_base: u64) { + ACCEPT_FEE_BASE.with(|base| base.set(Some(new_base))) +} + +/// Accept Fee Base +/// Look at thread local config first. If not set fallback to global config. +/// Default to grin-cent/20 if global config unset. +pub fn get_accept_fee_base() -> u64 { + ACCEPT_FEE_BASE.with(|base| match base.get() { + None => { + let base = if GLOBAL_ACCEPT_FEE_BASE.is_init() { + GLOBAL_ACCEPT_FEE_BASE.borrow() + } else { + DEFAULT_ACCEPT_FEE_BASE + }; + set_local_accept_fee_base(base); + base + } + Some(base) => base, + }) +} + /// Return either a cuckoo context or a cuckatoo context /// Single change point /// MWC: We modify this to launch with cuckarood only on both floonet and mainnet @@ -331,7 +373,7 @@ pub fn max_block_weight() -> u64 { /// Maximum allowed transaction weight (1 weight unit ~= 32 bytes) pub fn max_tx_weight() -> u64 { - let coinbase_weight = BLOCK_OUTPUT_WEIGHT + BLOCK_KERNEL_WEIGHT; + let coinbase_weight = OUTPUT_WEIGHT + KERNEL_WEIGHT; max_block_weight().saturating_sub(coinbase_weight) as u64 } diff --git a/core/src/libtx/aggsig.rs b/core/src/libtx/aggsig.rs index 8595b9fd0c..3d8091cb7d 100644 --- a/core/src/libtx/aggsig.rs +++ b/core/src/libtx/aggsig.rs @@ -226,6 +226,7 @@ pub fn verify_partial_sig( /// use core::core::transaction::KernelFeatures; /// use core::core::{Output, OutputFeatures}; /// use keychain::{Keychain, ExtKeychain, SwitchCommitmentType}; +/// use std::convert::TryInto; /// use core::global; /// /// global::set_local_chain_type(global::ChainTypes::Floonet); @@ -242,7 +243,7 @@ pub fn verify_partial_sig( /// let height = 20; /// let over_commit = secp.commit_value(reward(fees, height)).unwrap(); /// let out_commit = output.commitment(); -/// let features = KernelFeatures::HeightLocked{fee: 0, lock_height: height}; +/// let features = KernelFeatures::HeightLocked{fee: 1.into(), lock_height: height}; /// let msg = features.kernel_sig_msg().unwrap(); /// let excess = Secp256k1::commit_sum(vec![out_commit], vec![over_commit]).unwrap(); /// let pubkey = excess.to_pubkey().unwrap(); @@ -290,6 +291,7 @@ where /// use core::core::transaction::KernelFeatures; /// use core::core::{Output, OutputFeatures}; /// use keychain::{Keychain, ExtKeychain, SwitchCommitmentType}; +/// use std::convert::TryInto; /// use core::global; /// /// // Create signature @@ -307,7 +309,7 @@ where /// let height = 20; /// let over_commit = secp.commit_value(reward(fees, height)).unwrap(); /// let out_commit = output.commitment(); -/// let features = KernelFeatures::HeightLocked{fee: 0, lock_height: height}; +/// let features = KernelFeatures::HeightLocked{fee: 1.into(), lock_height: height}; /// let msg = features.kernel_sig_msg().unwrap(); /// let excess = Secp256k1::commit_sum(vec![out_commit], vec![over_commit]).unwrap(); /// let pubkey = excess.to_pubkey().unwrap(); diff --git a/core/src/libtx/build.rs b/core/src/libtx/build.rs index a827eb9083..1e9ff51c2b 100644 --- a/core/src/libtx/build.rs +++ b/core/src/libtx/build.rs @@ -23,7 +23,7 @@ //! //! Example: //! build::transaction( -//! KernelFeatures::Plain{ fee: 2 }, +//! KernelFeatures::Plain{ fee: 2.try_into().unwrap() }, //! vec![ //! input_rand(75), //! output_rand(42), @@ -279,14 +279,16 @@ mod test { let vc = verifier_cache(); let tx = transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(10, key_id1), input(12, key_id2), output(20, key_id3)], &keychain, &builder, ) .unwrap(); - tx.validate(Weighting::AsTransaction, vc.clone()).unwrap(); + let height = 42; // arbitrary + tx.validate(Weighting::AsTransaction, vc.clone(), height) + .unwrap(); } #[test] @@ -301,14 +303,16 @@ mod test { let vc = verifier_cache(); let tx = transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(10, key_id1), input(12, key_id2), output(20, key_id3)], &keychain, &builder, ) .unwrap(); - tx.validate(Weighting::AsTransaction, vc.clone()).unwrap(); + let height = 42; // arbitrary + tx.validate(Weighting::AsTransaction, vc.clone(), height) + .unwrap(); } #[test] @@ -322,13 +326,15 @@ mod test { let vc = verifier_cache(); let tx = transaction( - KernelFeatures::Plain { fee: 4 }, + KernelFeatures::Plain { fee: 4.into() }, &[input(6, key_id1), output(2, key_id2)], &keychain, &builder, ) .unwrap(); - tx.validate(Weighting::AsTransaction, vc.clone()).unwrap(); + let height = 42; // arbitrary + tx.validate(Weighting::AsTransaction, vc.clone(), height) + .unwrap(); } } diff --git a/core/src/libtx/mod.rs b/core/src/libtx/mod.rs index b2e2e41df8..c7080d3064 100644 --- a/core/src/libtx/mod.rs +++ b/core/src/libtx/mod.rs @@ -28,26 +28,19 @@ pub mod proof; pub mod reward; pub mod secp_ser; -use crate::consensus; use crate::core::Transaction; +use crate::global::get_accept_fee_base; pub use self::proof::ProofBuilder; pub use crate::libtx::error::{Error, ErrorKind}; -/// Fee base. Currently 0.001 MWC. The minimal tx fee will be scaled to this value -pub const DEFAULT_BASE_FEE: u64 = consensus::MILLI_GRIN; - -/// Transaction fee calculation -pub fn tx_fee( - input_len: usize, - output_len: usize, - kernel_len: usize, - base_fee: Option, -) -> u64 { - let use_base_fee = match base_fee { - Some(bf) => bf, - None => DEFAULT_BASE_FEE, - }; +/// Transaction fee calculation given numbers of inputs, outputs, and kernels +pub fn tx_fee(input_len: usize, output_len: usize, kernel_len: usize) -> u64 { + Transaction::weight_by_iok(input_len as u64, output_len as u64, kernel_len as u64) + * get_accept_fee_base() +} - Transaction::weight(input_len as u64, output_len as u64, kernel_len as u64) * use_base_fee +/// Transaction fee calculation given transaction +pub fn accept_fee(tx: Transaction, height: u64) -> u64 { + tx.accept_fee(height) } diff --git a/core/tests/block.rs b/core/tests/block.rs index 2be6d1bf63..7f4350763a 100644 --- a/core/tests/block.rs +++ b/core/tests/block.rs @@ -14,12 +14,13 @@ mod common; use crate::common::{new_block, tx1i2o, tx2i1o, txspend1i1o}; -use crate::core::consensus::{self, BLOCK_OUTPUT_WEIGHT}; +use crate::core::consensus::{self, OUTPUT_WEIGHT}; use crate::core::core::block::{Block, BlockHeader, Error, HeaderVersion, UntrustedBlockHeader}; use crate::core::core::hash::Hashed; use crate::core::core::id::ShortIdentifiable; use crate::core::core::transaction::{ - self, KernelFeatures, NRDRelativeHeight, Output, OutputFeatures, OutputIdentifier, Transaction, + self, FeeFields, KernelFeatures, NRDRelativeHeight, Output, OutputFeatures, OutputIdentifier, + Transaction, }; use crate::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; use crate::core::core::{Committed, CompactBlock}; @@ -47,7 +48,7 @@ fn too_large_block() { test_setup(); let keychain = ExtKeychain::from_random_seed(false).unwrap(); let builder = ProofBuilder::new(&keychain); - let max_out = global::max_block_weight() / BLOCK_OUTPUT_WEIGHT; + let max_out = global::max_block_weight() / OUTPUT_WEIGHT; let mut pks = vec![]; for n in 0..(max_out + 1) { @@ -61,7 +62,7 @@ fn too_large_block() { parts.append(&mut vec![input(500000, pks.pop().unwrap())]); let tx = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &parts, &keychain, &builder, @@ -103,7 +104,7 @@ fn block_with_nrd_kernel_pre_post_hf3() { let tx = build::transaction( KernelFeatures::NoRecentDuplicate { - fee: 2, + fee: 2.into(), relative_height: NRDRelativeHeight::new(1440).unwrap(), }, &[input(7, key_id1), output(5, key_id2)], @@ -188,7 +189,7 @@ fn block_with_nrd_kernel_nrd_not_enabled() { let tx = build::transaction( KernelFeatures::NoRecentDuplicate { - fee: 2, + fee: 2.into(), relative_height: NRDRelativeHeight::new(1440).unwrap(), }, &[input(7, key_id1), output(5, key_id2)], @@ -276,7 +277,7 @@ fn block_with_cut_through() { let btx1 = tx2i1o(); let btx2 = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(7, key_id1), output(5, key_id2.clone())], &keychain, &builder, @@ -374,7 +375,9 @@ fn remove_coinbase_kernel_flag() { let mut b = new_block(&[], &keychain, &builder, &prev, &key_id); let mut kernel = b.kernels()[0].clone(); - kernel.features = KernelFeatures::Plain { fee: 0 }; + kernel.features = KernelFeatures::Plain { + fee: FeeFields::zero(), + }; b.body = b.body.replace_kernel(kernel); // Flipping the coinbase flag results in kernels not summing correctly. @@ -762,7 +765,7 @@ fn same_amount_outputs_copy_range_proof() { let key_id3 = keychain::ExtKeychain::derive_key_id(1, 3, 0, 0, 0); let tx = build::transaction( - KernelFeatures::Plain { fee: 1 }, + KernelFeatures::Plain { fee: 1.into() }, &[input(7, key_id1), output(3, key_id2), output(3, key_id3)], &keychain, &builder, @@ -803,7 +806,7 @@ fn wrong_amount_range_proof() { let key_id3 = keychain::ExtKeychain::derive_key_id(1, 3, 0, 0, 0); let tx1 = build::transaction( - KernelFeatures::Plain { fee: 1 }, + KernelFeatures::Plain { fee: 1.into() }, &[ input(7, key_id1.clone()), output(3, key_id2.clone()), @@ -814,7 +817,7 @@ fn wrong_amount_range_proof() { ) .unwrap(); let tx2 = build::transaction( - KernelFeatures::Plain { fee: 1 }, + KernelFeatures::Plain { fee: 1.into() }, &[input(7, key_id1), output(2, key_id2), output(4, key_id3)], &keychain, &builder, @@ -894,7 +897,9 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { let builder = ProofBuilder::new(&keychain); let tx = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[ build::input(10, key_id1.clone()), build::input(10, key_id2.clone()), @@ -958,7 +963,9 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { let builder = ProofBuilder::new(&keychain); let tx = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[ build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id1.clone()), build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id2.clone()), diff --git a/core/tests/common.rs b/core/tests/common.rs index b7e78218f3..b6d9ac602e 100644 --- a/core/tests/common.rs +++ b/core/tests/common.rs @@ -37,7 +37,7 @@ pub fn tx2i1o() -> Transaction { let key_id3 = keychain::ExtKeychain::derive_key_id(1, 3, 0, 0, 0); let tx = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(10, key_id1), input(11, key_id2), output(19, key_id3)], &keychain, &builder, @@ -56,7 +56,7 @@ pub fn tx1i1o() -> Transaction { let key_id2 = keychain::ExtKeychain::derive_key_id(1, 2, 0, 0, 0); let tx = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(5, key_id1), output(3, key_id2)], &keychain, &builder, @@ -96,7 +96,7 @@ pub fn tx1i2o() -> Transaction { let key_id3 = keychain::ExtKeychain::derive_key_id(1, 3, 0, 0, 0); let tx = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(6, key_id1), output(3, key_id2), output(1, key_id3)], &keychain, &builder, @@ -120,7 +120,10 @@ where K: Keychain, B: ProofBuild, { - let fees = txs.iter().map(|tx| tx.fee()).sum(); + let fees = txs + .iter() + .map(|tx| tx.fee(previous_header.height + 1)) + .sum(); let reward_output = reward::output( keychain, builder, @@ -148,7 +151,7 @@ where B: ProofBuild, { build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(v, key_id1), output(3, key_id2)], keychain, builder, diff --git a/core/tests/core.rs b/core/tests/core.rs index 6a5680c46b..2e519115af 100644 --- a/core/tests/core.rs +++ b/core/tests/core.rs @@ -21,8 +21,8 @@ use self::core::core::block::Error::KernelLockHeight; use self::core::core::hash::{Hashed, ZERO_HASH}; use self::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; use self::core::core::{ - aggregate, deaggregate, KernelFeatures, Output, OutputFeatures, OutputIdentifier, Transaction, - TxKernel, Weighting, + aggregate, deaggregate, FeeFields, KernelFeatures, Output, OutputFeatures, OutputIdentifier, + Transaction, TxKernel, Weighting, }; use self::core::libtx::build::{self, initial_tx, input, output, with_excess}; use self::core::libtx::{aggsig, ProofBuilder}; @@ -97,7 +97,8 @@ fn simple_tx_ser_deser() { let mut vec = Vec::new(); ser::serialize_default(&mut vec, &tx).expect("serialization failed"); let dtx: Transaction = ser::deserialize_default(&mut &vec[..]).unwrap(); - assert_eq!(dtx.fee(), 2); + let height = 42; // arbitrary + assert_eq!(dtx.fee(height), 2); assert_eq!(dtx.inputs().len(), 2); assert_eq!(dtx.outputs().len(), 1); assert_eq!(tx.hash(), dtx.hash()); @@ -130,7 +131,9 @@ fn test_zero_commit_fails() { // blinding should fail as signing with a zero r*G shouldn't work let res = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[input(10, key_id1.clone()), output(10, key_id1)], &keychain, &builder, @@ -153,7 +156,7 @@ fn build_tx_kernel() { // first build a valid tx with corresponding blinding factor let tx = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[input(10, key_id1), output(5, key_id2), output(3, key_id3)], &keychain, &builder, @@ -161,7 +164,8 @@ fn build_tx_kernel() { .unwrap(); // check the tx is valid - tx.validate(Weighting::AsTransaction, verifier_cache()) + let height = 42; // arbitrary + tx.validate(Weighting::AsTransaction, verifier_cache(), height) .unwrap(); // check the kernel is also itself valid @@ -169,8 +173,8 @@ fn build_tx_kernel() { let kern = &tx.kernels()[0]; kern.verify().unwrap(); - assert_eq!(kern.features, KernelFeatures::Plain { fee: 2 }); - assert_eq!(2, tx.fee()); + assert_eq!(kern.features, KernelFeatures::Plain { fee: 2.into() }); + assert_eq!(2, tx.fee(height)); } // Proof of concept demonstrating we can build two transactions that share @@ -192,7 +196,7 @@ fn build_two_half_kernels() { let key_id3 = ExtKeychain::derive_key_id(1, 3, 0, 0, 0); // build kernel with associated private excess - let mut kernel = TxKernel::with_features(KernelFeatures::Plain { fee: 2 }); + let mut kernel = TxKernel::with_features(KernelFeatures::Plain { fee: 2.into() }); // Construct the message to be signed. let msg = kernel.msg_to_sign().unwrap(); @@ -224,13 +228,14 @@ fn build_two_half_kernels() { ) .unwrap(); + let height = 42; // arbitrary assert_eq!( - tx1.validate(Weighting::AsTransaction, verifier_cache()), + tx1.validate(Weighting::AsTransaction, verifier_cache(), height), Ok(()), ); assert_eq!( - tx2.validate(Weighting::AsTransaction, verifier_cache()), + tx2.validate(Weighting::AsTransaction, verifier_cache(), height), Ok(()), ); @@ -256,11 +261,12 @@ fn transaction_cut_through() { let tx1 = tx1i2o(); let tx2 = tx2i1o(); + let height = 42; // arbitrary assert!(tx1 - .validate(Weighting::AsTransaction, verifier_cache()) + .validate(Weighting::AsTransaction, verifier_cache(), height) .is_ok()); assert!(tx2 - .validate(Weighting::AsTransaction, verifier_cache()) + .validate(Weighting::AsTransaction, verifier_cache(), height) .is_ok()); let vc = verifier_cache(); @@ -268,7 +274,9 @@ fn transaction_cut_through() { // now build a "cut_through" tx from tx1 and tx2 let tx3 = aggregate(&[tx1, tx2]).unwrap(); - assert!(tx3.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + assert!(tx3 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); } // Attempt to deaggregate a multi-kernel transaction in a different way @@ -282,31 +290,44 @@ fn multi_kernel_transaction_deaggregation() { let vc = verifier_cache(); - assert!(tx1.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx2.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx3.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx4.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + let height = 42; // arbitrary + assert!(tx1 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx2 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx3 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx4 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let tx1234 = aggregate(&[tx1.clone(), tx2.clone(), tx3.clone(), tx4.clone()]).unwrap(); let tx12 = aggregate(&[tx1, tx2]).unwrap(); let tx34 = aggregate(&[tx3, tx4]).unwrap(); assert!(tx1234 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx12 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx34 + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); - assert!(tx12.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx34.validate(Weighting::AsTransaction, vc.clone()).is_ok()); let deaggregated_tx34 = deaggregate(tx1234.clone(), &[tx12.clone()]).unwrap(); assert!(deaggregated_tx34 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx34, deaggregated_tx34); let deaggregated_tx12 = deaggregate(tx1234, &[tx34]).unwrap(); assert!(deaggregated_tx12 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx12, deaggregated_tx12); } @@ -320,19 +341,30 @@ fn multi_kernel_transaction_deaggregation_2() { let vc = verifier_cache(); - assert!(tx1.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx2.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx3.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + let height = 42; // arbitrary + assert!(tx1 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx2 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx3 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let tx123 = aggregate(&[tx1.clone(), tx2.clone(), tx3.clone()]).unwrap(); let tx12 = aggregate(&[tx1, tx2]).unwrap(); - assert!(tx123.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx12.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + assert!(tx123 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx12 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let deaggregated_tx3 = deaggregate(tx123, &[tx12]).unwrap(); assert!(deaggregated_tx3 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx3, deaggregated_tx3); } @@ -346,20 +378,31 @@ fn multi_kernel_transaction_deaggregation_3() { let vc = verifier_cache(); - assert!(tx1.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx2.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx3.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + let height = 42; // arbitrary + assert!(tx1 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx2 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx3 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let tx123 = aggregate(&[tx1.clone(), tx2.clone(), tx3.clone()]).unwrap(); let tx13 = aggregate(&[tx1, tx3]).unwrap(); let tx2 = aggregate(&[tx2]).unwrap(); - assert!(tx123.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx2.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + assert!(tx123 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx2 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let deaggregated_tx13 = deaggregate(tx123, &[tx2]).unwrap(); assert!(deaggregated_tx13 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx13, deaggregated_tx13); } @@ -375,11 +418,22 @@ fn multi_kernel_transaction_deaggregation_4() { let vc = verifier_cache(); - assert!(tx1.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx2.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx3.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx4.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx5.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + let height = 42; // arbitrary + assert!(tx1 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx2 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx3 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx4 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx5 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let tx12345 = aggregate(&[ tx1.clone(), @@ -390,12 +444,12 @@ fn multi_kernel_transaction_deaggregation_4() { ]) .unwrap(); assert!(tx12345 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); let deaggregated_tx5 = deaggregate(tx12345, &[tx1, tx2, tx3, tx4]).unwrap(); assert!(deaggregated_tx5 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx5, deaggregated_tx5); } @@ -411,11 +465,22 @@ fn multi_kernel_transaction_deaggregation_5() { let vc = verifier_cache(); - assert!(tx1.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx2.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx3.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx4.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx5.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + let height = 42; // arbitrary + assert!(tx1 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx2 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx3 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx4 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx5 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let tx12345 = aggregate(&[ tx1.clone(), @@ -429,12 +494,12 @@ fn multi_kernel_transaction_deaggregation_5() { let tx34 = aggregate(&[tx3, tx4]).unwrap(); assert!(tx12345 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); let deaggregated_tx5 = deaggregate(tx12345, &[tx12, tx34]).unwrap(); assert!(deaggregated_tx5 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx5, deaggregated_tx5); } @@ -448,25 +513,32 @@ fn basic_transaction_deaggregation() { let vc = verifier_cache(); - assert!(tx1.validate(Weighting::AsTransaction, vc.clone()).is_ok()); - assert!(tx2.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + let height = 42; // arbitrary + assert!(tx1 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); + assert!(tx2 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); // now build a "cut_through" tx from tx1 and tx2 let tx3 = aggregate(&[tx1.clone(), tx2.clone()]).unwrap(); - assert!(tx3.validate(Weighting::AsTransaction, vc.clone()).is_ok()); + assert!(tx3 + .validate(Weighting::AsTransaction, vc.clone(), height) + .is_ok()); let deaggregated_tx1 = deaggregate(tx3.clone(), &[tx2.clone()]).unwrap(); assert!(deaggregated_tx1 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx1, deaggregated_tx1); let deaggregated_tx2 = deaggregate(tx3, &[tx1]).unwrap(); assert!(deaggregated_tx2 - .validate(Weighting::AsTransaction, vc.clone()) + .validate(Weighting::AsTransaction, vc.clone(), height) .is_ok()); assert_eq!(tx2, deaggregated_tx2); } @@ -480,7 +552,7 @@ fn hash_output() { let key_id3 = ExtKeychain::derive_key_id(1, 3, 0, 0, 0); let tx = build::transaction( - KernelFeatures::Plain { fee: 1 }, + KernelFeatures::Plain { fee: 1.into() }, &[input(75, key_id1), output(42, key_id2), output(32, key_id3)], &keychain, &builder, @@ -496,8 +568,9 @@ fn hash_output() { #[test] fn blind_tx() { let btx = tx2i1o(); + let height = 42; // arbitrary assert!(btx - .validate(Weighting::AsTransaction, verifier_cache()) + .validate(Weighting::AsTransaction, verifier_cache(), height) .is_ok()); // Ignored for bullet proofs, because calling range_proof_info @@ -543,8 +616,9 @@ fn tx_build_exchange() { // Alice builds her transaction, with change, which also produces the sum // of blinding factors before they're obscured. - let tx = Transaction::empty() - .with_kernel(TxKernel::with_features(KernelFeatures::Plain { fee: 2 })); + let tx = Transaction::empty().with_kernel(TxKernel::with_features(KernelFeatures::Plain { + fee: 2.into(), + })); let (tx, sum) = build::partial_transaction(tx, &[in1, in2, output(1, key_id3)], &keychain, &builder) .unwrap(); @@ -556,7 +630,7 @@ fn tx_build_exchange() { // blinding factors. He adds his output, finalizes the transaction so it's // ready for broadcast. let tx_final = build::transaction( - KernelFeatures::Plain { fee: 2 }, + KernelFeatures::Plain { fee: 2.into() }, &[ initial_tx(tx_alice), with_excess(blind_sum), @@ -567,8 +641,9 @@ fn tx_build_exchange() { ) .unwrap(); + let height = 42; // arbitrary tx_final - .validate(Weighting::AsTransaction, verifier_cache()) + .validate(Weighting::AsTransaction, verifier_cache(), height) .unwrap(); } @@ -597,9 +672,13 @@ fn reward_with_tx_block() { let vc = verifier_cache(); let tx1 = tx2i1o(); - tx1.validate(Weighting::AsTransaction, vc.clone()).unwrap(); - let previous_header = BlockHeader::default(); + tx1.validate( + Weighting::AsTransaction, + vc.clone(), + previous_header.height + 1, + ) + .unwrap(); let block = new_block(&[tx1], &keychain, &builder, &previous_header, &key_id); block.validate(&BlindingFactor::zero(), vc.clone()).unwrap(); @@ -638,7 +717,7 @@ fn test_block_with_timelocked_tx() { // block height and that the resulting block is valid let tx1 = build::transaction( KernelFeatures::HeightLocked { - fee: 2, + fee: 2.into(), lock_height: 1, }, &[input(5, key_id1.clone()), output(3, key_id2.clone())], @@ -662,7 +741,7 @@ fn test_block_with_timelocked_tx() { // block height let tx1 = build::transaction( KernelFeatures::HeightLocked { - fee: 2, + fee: 2.into(), lock_height: 2, }, &[input(5, key_id1), output(3, key_id2)], @@ -686,7 +765,8 @@ fn test_block_with_timelocked_tx() { pub fn test_verify_1i1o_sig() { test_setup(); let tx = tx1i1o(); - tx.validate(Weighting::AsTransaction, verifier_cache()) + let height = 42; // arbitrary + tx.validate(Weighting::AsTransaction, verifier_cache(), height) .unwrap(); } @@ -694,6 +774,7 @@ pub fn test_verify_1i1o_sig() { pub fn test_verify_2i1o_sig() { test_setup(); let tx = tx2i1o(); - tx.validate(Weighting::AsTransaction, verifier_cache()) + let height = 42; // arbitrary + tx.validate(Weighting::AsTransaction, verifier_cache(), height) .unwrap(); } diff --git a/core/tests/transaction.rs b/core/tests/transaction.rs index 877d5a02a9..83adcd8cba 100644 --- a/core/tests/transaction.rs +++ b/core/tests/transaction.rs @@ -18,10 +18,12 @@ pub mod common; use crate::common::tx1i10_v2_compatible; use crate::core::core::transaction::{self, Error}; use crate::core::core::verifier_cache::LruVerifierCache; -use crate::core::core::{KernelFeatures, Output, OutputFeatures, Transaction, Weighting}; +use crate::core::core::{ + FeeFields, KernelFeatures, Output, OutputFeatures, Transaction, TxKernel, Weighting, +}; use crate::core::global; -use crate::core::libtx::build; use crate::core::libtx::proof::{self, ProofBuilder}; +use crate::core::libtx::{build, tx_fee}; use crate::core::{consensus, ser}; use grin_core as core; use keychain::{ExtKeychain, Keychain}; @@ -104,7 +106,9 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { let builder = proof::ProofBuilder::new(&keychain); let mut tx = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[ build::input(10, key_id1.clone()), build::input(10, key_id2.clone()), @@ -120,8 +124,9 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Transaction should fail validation due to cut-through. + let height = 42; // arbitrary assert_eq!( - tx.validate(Weighting::AsTransaction, verifier_cache.clone()), + tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height), Err(Error::CutThrough), ); @@ -139,7 +144,7 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { .replace_outputs(outputs); // Transaction validates successfully after applying cut-through. - tx.validate(Weighting::AsTransaction, verifier_cache.clone())?; + tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height)?; // Transaction validates via lightweight "read" validation as well. tx.validate_read()?; @@ -163,7 +168,9 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { let builder = ProofBuilder::new(&keychain); let mut tx = build::transaction( - KernelFeatures::Plain { fee: 0 }, + KernelFeatures::Plain { + fee: FeeFields::zero(), + }, &[ build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id1.clone()), build::coinbase_input(consensus::MWC_FIRST_GROUP_REWARD, key_id2.clone()), @@ -182,8 +189,9 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Transaction should fail validation due to cut-through. + let height = 42; // arbitrary assert_eq!( - tx.validate(Weighting::AsTransaction, verifier_cache.clone()), + tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height), Err(Error::CutThrough), ); @@ -201,10 +209,65 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { .replace_outputs(outputs); // Transaction validates successfully after applying cut-through. - tx.validate(Weighting::AsTransaction, verifier_cache.clone())?; + tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height)?; // Transaction validates via lightweight "read" validation as well. tx.validate_read()?; Ok(()) } + +// Test coverage for FeeFields +#[test] +fn test_fee_fields() -> Result<(), Error> { + global::set_local_chain_type(global::ChainTypes::UserTesting); + global::set_local_accept_fee_base(500_000); + + let keychain = ExtKeychain::from_random_seed(false)?; + + let key_id1 = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); + + let builder = ProofBuilder::new(&keychain); + + let mut tx = build::transaction( + KernelFeatures::Plain { + fee: FeeFields::new(1, 42).unwrap(), + }, + &[ + build::coinbase_input(consensus::REWARD, key_id1.clone()), + build::output(60_000_000_000 - 84 - 42 - 21, key_id1.clone()), + ], + &keychain, + &builder, + ) + .expect("valid tx"); + + let hf4_height = 4 * consensus::TESTING_HARD_FORK_INTERVAL; + assert_eq!( + tx.accept_fee(hf4_height), + (1 * 1 + 1 * 21 + 1 * 3) * 500_000 + ); + assert_eq!(tx.fee(hf4_height), 42); + assert_eq!(tx.fee(hf4_height), 42); + assert_eq!(tx.shifted_fee(hf4_height), 21); + assert_eq!( + tx.accept_fee(hf4_height - 1), + (1 * 4 + 1 * 1 - 1 * 1) * 1_000_000 + ); + assert_eq!(tx.fee(hf4_height - 1), 42 + (1u64 << 40)); + assert_eq!(tx.shifted_fee(hf4_height - 1), 42 + (1u64 << 40)); + + tx.body.kernels.append(&mut vec![ + TxKernel::with_features(KernelFeatures::Plain { + fee: FeeFields::new(2, 84).unwrap(), + }), + TxKernel::with_features(KernelFeatures::Plain { fee: 21.into() }), + ]); + + assert_eq!(tx.fee(hf4_height), 147); + assert_eq!(tx.shifted_fee(hf4_height), 36); + assert_eq!(tx.aggregate_fee_fields(hf4_height), FeeFields::new(2, 147)); + assert_eq!(tx_fee(1, 1, 3), 15_500_000); + + Ok(()) +} diff --git a/p2p/src/libp2p_connection.rs b/p2p/src/libp2p_connection.rs index f8af7de548..67b25b3664 100644 --- a/p2p/src/libp2p_connection.rs +++ b/p2p/src/libp2p_connection.rs @@ -890,7 +890,7 @@ pub fn validate_integrity_message( } }; - let integrity_fee = integrity_kernel.features.get_fee(); + let integrity_fee = integrity_kernel.features.get_fee_pessimistic(); if integrity_fee < fee_base * INTEGRITY_FEE_MIN_X { debug!( diff --git a/p2p/src/msg.rs b/p2p/src/msg.rs index aaba4fd9ed..1cddbf3577 100644 --- a/p2p/src/msg.rs +++ b/p2p/src/msg.rs @@ -89,7 +89,7 @@ enum_from_primitive! { /// Max theoretical size of a block filled with outputs. fn max_block_size() -> u64 { - (global::max_block_weight() / consensus::BLOCK_OUTPUT_WEIGHT * 708) as u64 + (global::max_block_weight() / consensus::OUTPUT_WEIGHT * 708) as u64 } // Max msg size when msg type is unknown. diff --git a/pool/fuzz/fuzz_targets/common.rs b/pool/fuzz/fuzz_targets/common.rs index d5e01f9185..047d74b56c 100644 --- a/pool/fuzz/fuzz_targets/common.rs +++ b/pool/fuzz/fuzz_targets/common.rs @@ -22,7 +22,7 @@ use self::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; use self::core::core::{Block, BlockHeader, BlockSums, KernelFeatures, Transaction}; use self::core::genesis; use self::core::global; -use self::core::libtx::{build, reward, ProofBuilder}; +use self::core::libtx::{build, reward, ProofBuilder, DEFAULT_BASE_FEE}; use self::core::pow; use self::keychain::{ExtKeychain, ExtKeychainPath, Keychain}; use self::pool::types::*; @@ -262,7 +262,7 @@ impl PoolFuzzer { { TransactionPool::new( PoolConfig { - accept_fee_base: 0, + accept_fee_base: DEFAULT_BASE_FEE, max_pool_size: 50, max_stempool_size: 50, mineable_max_weight: 10_000, diff --git a/pool/src/pool.rs b/pool/src/pool.rs index 2350975aaf..a68ff0deeb 100644 --- a/pool/src/pool.rs +++ b/pool/src/pool.rs @@ -127,13 +127,13 @@ where // * maintain dependency ordering // * maximize cut-through // * maximize overall fees + let header = self.blockchain.chain_head()?; let txs = self.bucket_transactions(weighting); // Iteratively apply the txs to the current chain state, // rejecting any that do not result in a valid state. // Verify these txs produce an aggregated tx below max_weight. // Return a vec of all the valid txs. - let header = self.blockchain.chain_head()?; let valid_txs = self.validate_raw_txs(&txs, None, &header, weighting)?; Ok(valid_txs) } @@ -160,7 +160,12 @@ where let tx = transaction::aggregate(&txs)?; // Validate the single aggregate transaction "as pool", not subject to tx weight limits. - tx.validate(Weighting::NoLimit, self.verifier_cache.clone())?; + let header = self.blockchain.chain_head()?; + tx.validate( + Weighting::NoLimit, + self.verifier_cache.clone(), + header.height, + )?; Ok(Some(tx)) } @@ -228,7 +233,7 @@ where ) -> Result { // Validate the tx, conditionally checking against weight limits, // based on weight verification type. - tx.validate(weighting, self.verifier_cache.clone())?; + tx.validate(weighting, self.verifier_cache.clone(), header.height)?; // Validate the tx against current chain state. // Check all inputs are in the current UTXO set. @@ -303,7 +308,7 @@ where tx: &Transaction, header: &BlockHeader, ) -> Result { - let overage = tx.overage(); + let overage = tx.overage(header.height); let offset = header.total_kernel_offset().add(&tx.offset)?; @@ -335,19 +340,19 @@ where // Use our bucket logic to identify the best transaction for eviction and evict it. // We want to avoid evicting a transaction where another transaction depends on it. - // We want to evict a transaction with low fee_to_weight. + // We want to evict a transaction with low fee_rate. pub fn evict_transaction(&mut self) { if let Some(evictable_transaction) = self.bucket_transactions(Weighting::NoLimit).last() { self.entries.retain(|x| x.tx != *evictable_transaction); }; } - /// Buckets consist of a vec of txs and track the aggregate fee_to_weight. + /// Buckets consist of a vec of txs and track the aggregate fee_rate. /// We aggregate (cut-through) dependent transactions within a bucket *unless* adding a tx - /// would reduce the aggregate fee_to_weight, in which case we start a new bucket. - /// Note this new bucket will by definition have a lower fee_to_weight than the bucket + /// would reduce the aggregate fee_rate, in which case we start a new bucket. + /// Note this new bucket will by definition have a lower fee_rate than the bucket /// containing the tx it depends on. - /// Sorting the buckets by fee_to_weight will therefore preserve dependency ordering, + /// Sorting the buckets by fee_rate will therefore preserve dependency ordering, /// maximizing both cut-through and overall fees. fn bucket_transactions(&self, weighting: Weighting) -> Vec { let mut tx_buckets: Vec = Vec::new(); @@ -389,13 +394,14 @@ where continue; } + let height = self.blockchain.chain_head().map(|x| x.height).unwrap_or(0); match insert_pos { None => { // No parent tx, just add to the end in its own bucket. // This is the common case for non 0-conf txs in the txpool. // We assume the tx is valid here as we validated it on the way into the txpool. insert_pos = Some(tx_buckets.len()); - tx_buckets.push(Bucket::new(entry.tx.clone(), tx_buckets.len())); + tx_buckets.push(Bucket::new(entry.tx.clone(), tx_buckets.len(), height)); } Some(pos) => { // We found a single parent tx, so aggregate in the bucket @@ -407,15 +413,20 @@ where entry.tx.clone(), weighting, self.verifier_cache.clone(), + height, ) { - if new_bucket.fee_to_weight >= bucket.fee_to_weight { - // Only aggregate if it would not reduce the fee_to_weight ratio. + if new_bucket.fee_rate >= bucket.fee_rate { + // Only aggregate if it would not reduce the fee_rate ratio. tx_buckets[pos] = new_bucket; } else { // Otherwise put it in its own bucket at the end. - // Note: This bucket will have a lower fee_to_weight + // Note: This bucket will have a lower fee_rate // than the bucket it depends on. - tx_buckets.push(Bucket::new(entry.tx.clone(), tx_buckets.len())); + tx_buckets.push(Bucket::new( + entry.tx.clone(), + tx_buckets.len(), + height, + )); } } else { // Aggregation failed so discard this new tx. @@ -437,11 +448,11 @@ where } } - // Sort buckets by fee_to_weight (descending) and age (oldest first). - // Txs with highest fee_to_weight will be prioritied. - // Aggregation that increases the fee_to_weight of a bucket will prioritize the bucket. + // Sort buckets by fee_rate (descending) and age (oldest first). + // Txs with highest fee_rate will be prioritied. + // Aggregation that increases the fee_rate of a bucket will prioritize the bucket. // Oldest (based on pool insertion time) will then be prioritized. - tx_buckets.sort_unstable_by_key(|x| (Reverse(x.fee_to_weight), x.age_idx)); + tx_buckets.sort_unstable_by_key(|x| (Reverse(x.fee_rate), x.age_idx)); tx_buckets.into_iter().flat_map(|x| x.raw_txs).collect() } @@ -499,18 +510,18 @@ where struct Bucket { raw_txs: Vec, - fee_to_weight: u64, + fee_rate: u64, age_idx: usize, } impl Bucket { /// Construct a new bucket with the given tx. /// also specifies an "age_idx" so we can sort buckets by age - /// as well as fee_to_weight. Txs are maintainedin the pool in insert order + /// as well as fee_rate. Txs are maintained in the pool in insert order /// so buckets with low age_idx contain oldest txs. - fn new(tx: Transaction, age_idx: usize) -> Bucket { + fn new(tx: Transaction, age_idx: usize, height: u64) -> Bucket { Bucket { - fee_to_weight: tx.fee_to_weight(), + fee_rate: tx.fee_rate(height), raw_txs: vec![tx], age_idx, } @@ -521,13 +532,14 @@ impl Bucket { new_tx: Transaction, weighting: Weighting, verifier_cache: Arc>, + height: u64, ) -> Result { let mut raw_txs = self.raw_txs.clone(); raw_txs.push(new_tx); let agg_tx = transaction::aggregate(&raw_txs)?; - agg_tx.validate(weighting, verifier_cache)?; + agg_tx.validate(weighting, verifier_cache, height)?; Ok(Bucket { - fee_to_weight: agg_tx.fee_to_weight(), + fee_rate: agg_tx.fee_rate(height), raw_txs: raw_txs, age_idx: self.age_idx, }) diff --git a/pool/src/transaction_pool.rs b/pool/src/transaction_pool.rs index f3b5de75a5..09c10690b5 100644 --- a/pool/src/transaction_pool.rs +++ b/pool/src/transaction_pool.rs @@ -187,7 +187,7 @@ where // NRD kernels only valid post HF3 and if NRD feature enabled. self.verify_kernel_variants(tx, header)?; - // Do we have the capacity to accept this transaction? + // Does this transaction pay the required fees and fit within the pool capacity? let acceptability = self.is_acceptable(tx, stem); let mut evict = false; if !stem && acceptability.as_ref().err() == Some(&PoolError::OverCapacity) { @@ -198,8 +198,12 @@ where // Make sure the transaction is valid before anything else. // Validate tx accounting for max tx weight. - tx.validate(Weighting::AsTransaction, self.verifier_cache.clone()) - .map_err(PoolError::InvalidTx)?; + tx.validate( + Weighting::AsTransaction, + self.verifier_cache.clone(), + header.height, + ) + .map_err(PoolError::InvalidTx)?; // Check the tx lock_time is valid based on current chain state. self.blockchain.verify_tx_lock_height(tx)?; @@ -298,14 +302,19 @@ where }; // Validate the tx to ensure our converted inputs are correct. - tx.validate(Weighting::AsTransaction, self.verifier_cache.clone())?; + let header = self.chain_head()?; + tx.validate( + Weighting::AsTransaction, + self.verifier_cache.clone(), + header.height, + )?; Ok(PoolEntry::new(tx, entry.src)) } // Evict a transaction from the txpool. // Uses bucket logic to identify the "last" transaction. - // No other tx depends on it and it has low fee_to_weight. + // No other tx depends on it and it has low fee_rate pub fn evict_from_txpool(&mut self) { self.txpool.evict_transaction() } @@ -422,14 +431,12 @@ where return Err(PoolError::OverCapacity); } - // for a basic transaction (1 input, 2 outputs) - - // (-1 * 1) + (4 * 2) + 1 = 8 - // 8 * 10 = 80 - if self.config.accept_fee_base > 0 { - let threshold = (tx.tx_weight() as u64) * self.config.accept_fee_base; - if tx.fee() < threshold { - return Err(PoolError::LowFeeTransaction(threshold)); - } + // weight for a basic transaction (2 inputs, 2 outputs, 1 kernel) - + // (2 * 1) + (2 * 21) + (1 * 3) = 47 + // minfees = 47 * 500_000 = 23_500_000 + let header = self.chain_head()?; + if tx.shifted_fee(header.height) < tx.accept_fee(header.height) { + return Err(PoolError::LowFeeTransaction(tx.shifted_fee(header.height))); } Ok(()) } diff --git a/pool/src/types.rs b/pool/src/types.rs index cbe8c410a5..1fce21d47a 100644 --- a/pool/src/types.rs +++ b/pool/src/types.rs @@ -21,6 +21,7 @@ use self::core::core::committed; use self::core::core::hash::Hash; use self::core::core::transaction::{self, Transaction}; use self::core::core::{BlockHeader, BlockSums, Inputs, OutputIdentifier}; +use self::core::global::DEFAULT_ACCEPT_FEE_BASE; use chrono::prelude::*; use failure::Fail; use grin_core as core; @@ -138,8 +139,9 @@ impl Default for PoolConfig { } } -fn default_accept_fee_base() -> u64 { - consensus::MILLI_GRIN +/// make output (of weight 21) cost about 1 Grin-cent by default, keeping a round number +pub fn default_accept_fee_base() -> u64 { + DEFAULT_ACCEPT_FEE_BASE } fn default_max_pool_size() -> usize { 150_000 diff --git a/pool/tests/block_building.rs b/pool/tests/block_building.rs index b9d8c70d3d..d7e7843415 100644 --- a/pool/tests/block_building.rs +++ b/pool/tests/block_building.rs @@ -31,6 +31,7 @@ use std::sync::Arc; fn test_transaction_pool_block_building() -> Result<(), PoolError> { util::init_test_logger(); global::set_local_chain_type(global::ChainTypes::AutomatedTesting); + global::set_local_accept_fee_base(1); let keychain: ExtKeychain = Keychain::from_random_seed(false).unwrap(); let db_root = "target/.block_building"; @@ -48,25 +49,27 @@ fn test_transaction_pool_block_building() -> Result<(), PoolError> { verifier_cache, ); - add_some_blocks(&chain, 3, &keychain); + // mine enough blocks to get past HF4 + add_some_blocks(&chain, 4 * 3, &keychain); let header_1 = chain.get_header_by_height(1).unwrap(); // Now create tx to spend an early coinbase (now matured). // Provides us with some useful outputs to test with. - let initial_tx = test_transaction_spending_coinbase(&keychain, &header_1, vec![10, 20, 30, 40]); + let initial_tx = + test_transaction_spending_coinbase(&keychain, &header_1, vec![100, 200, 300, 400]); // Mine that initial tx so we can spend it with multiple txs. add_block(&chain, &[initial_tx], &keychain); let header = chain.head_header().unwrap(); - let root_tx_1 = test_transaction(&keychain, vec![10, 20], vec![24]); - let root_tx_2 = test_transaction(&keychain, vec![30], vec![28]); - let root_tx_3 = test_transaction(&keychain, vec![40], vec![38]); + let root_tx_1 = test_transaction(&keychain, vec![100, 200], vec![240]); + let root_tx_2 = test_transaction(&keychain, vec![300], vec![270]); + let root_tx_3 = test_transaction(&keychain, vec![400], vec![370]); - let child_tx_1 = test_transaction(&keychain, vec![24], vec![22]); - let child_tx_2 = test_transaction(&keychain, vec![38], vec![32]); + let child_tx_1 = test_transaction(&keychain, vec![240], vec![210]); + let child_tx_2 = test_transaction(&keychain, vec![370], vec![320]); { // Add the three root txs to the pool. diff --git a/pool/tests/block_max_weight.rs b/pool/tests/block_max_weight.rs index 40747fbfa9..9928f990b7 100644 --- a/pool/tests/block_max_weight.rs +++ b/pool/tests/block_max_weight.rs @@ -30,6 +30,7 @@ use std::sync::Arc; fn test_block_building_max_weight() { util::init_test_logger(); global::set_local_chain_type(global::ChainTypes::AutomatedTesting); + global::set_local_accept_fee_base(1); let keychain: ExtKeychain = Keychain::from_random_seed(false).unwrap(); @@ -48,14 +49,18 @@ fn test_block_building_max_weight() { verifier_cache, ); - add_some_blocks(&chain, 3, &keychain); + // mine past HF4 to see effect of set_local_accept_fee_base + add_some_blocks(&chain, 4 * 3, &keychain); let header_1 = chain.get_header_by_height(1).unwrap(); // Now create tx to spend an early coinbase (now matured). // Provides us with some useful outputs to test with. - let initial_tx = - test_transaction_spending_coinbase(&keychain, &header_1, vec![100, 200, 300, 1000]); + let initial_tx = test_transaction_spending_coinbase( + &keychain, + &header_1, + vec![1_000_000, 2_000_000, 3_000_000, 10_000_000], + ); // Mine that initial tx so we can spend it with multiple txs. add_block(&chain, &[initial_tx], &keychain); @@ -65,26 +70,32 @@ fn test_block_building_max_weight() { // Build some dependent txs to add to the txpool. // We will build a block from a subset of these. let txs = vec![ - test_transaction(&keychain, vec![1000], vec![390, 130, 120, 110]), - test_transaction(&keychain, vec![100], vec![90, 1]), - test_transaction(&keychain, vec![90], vec![80, 2]), - test_transaction(&keychain, vec![200], vec![199]), - test_transaction(&keychain, vec![300], vec![290, 3]), - test_transaction(&keychain, vec![290], vec![280, 4]), + test_transaction( + &keychain, + vec![10_000_000], + vec![3_900_000, 1_300_000, 1_200_000, 1_100_000], + ), + test_transaction(&keychain, vec![1_000_000], vec![900_000, 10_000]), + test_transaction(&keychain, vec![900_000], vec![800_000, 20_000]), + test_transaction(&keychain, vec![2_000_000], vec![1_970_000]), + test_transaction(&keychain, vec![3_000_000], vec![2_900_000, 30_000]), + test_transaction(&keychain, vec![2_900_000], vec![2_800_000, 40_000]), ]; // Fees and weights of our original txs in insert order. assert_eq!( - txs.iter().map(|x| x.fee()).collect::>(), - [250, 9, 8, 1, 7, 6] + txs.iter().map(|x| x.fee(header.height)).collect::>(), + [2_500_000, 90_000, 80_000, 30_000, 70_000, 60_000] ); assert_eq!( - txs.iter().map(|x| x.tx_weight()).collect::>(), - [16, 8, 8, 4, 8, 8] + txs.iter().map(|x| x.weight()).collect::>(), + [88, 46, 46, 25, 46, 46] ); assert_eq!( - txs.iter().map(|x| x.fee_to_weight()).collect::>(), - [15625, 1125, 1000, 250, 875, 750] + txs.iter() + .map(|x| x.fee_rate(header.height)) + .collect::>(), + [28409, 1956, 1739, 1200, 1521, 1304] ); // Populate our txpool with the txs. @@ -101,16 +112,18 @@ fn test_block_building_max_weight() { // Fees and weights of the "mineable" txs. assert_eq!( - txs.iter().map(|x| x.fee()).collect::>(), - [250, 9, 8, 7] + txs.iter().map(|x| x.fee(header.height)).collect::>(), + [2_500_000, 90_000, 80_000, 70_000] ); assert_eq!( - txs.iter().map(|x| x.tx_weight()).collect::>(), - [16, 8, 8, 8] + txs.iter().map(|x| x.weight()).collect::>(), + [88, 46, 46, 46] ); assert_eq!( - txs.iter().map(|x| x.fee_to_weight()).collect::>(), - [15625, 1125, 1000, 875] + txs.iter() + .map(|x| x.fee_rate(header.height)) + .collect::>(), + [28409, 1956, 1739, 1521] ); add_block(&chain, &txs, &keychain); diff --git a/pool/tests/block_reconciliation.rs b/pool/tests/block_reconciliation.rs index 0250a55812..9ce20104ae 100644 --- a/pool/tests/block_reconciliation.rs +++ b/pool/tests/block_reconciliation.rs @@ -30,6 +30,7 @@ use std::sync::Arc; fn test_transaction_pool_block_reconciliation() { util::init_test_logger(); global::set_local_chain_type(global::ChainTypes::AutomatedTesting); + global::set_local_accept_fee_base(1); let keychain: ExtKeychain = Keychain::from_random_seed(false).unwrap(); let db_root = "target/.block_reconciliation"; @@ -47,13 +48,15 @@ fn test_transaction_pool_block_reconciliation() { verifier_cache, ); - add_some_blocks(&chain, 3, &keychain); + // mine past HF4 to see effect of set_local_accept_fee_base + add_some_blocks(&chain, 4 * 3, &keychain); let header_1 = chain.get_header_by_height(1).unwrap(); // Now create tx to spend an early coinbase (now matured). // Provides us with some useful outputs to test with. - let initial_tx = test_transaction_spending_coinbase(&keychain, &header_1, vec![10, 20, 30, 40]); + let initial_tx = + test_transaction_spending_coinbase(&keychain, &header_1, vec![1_000, 2_000, 3_000, 4_000]); // Mine that initial tx so we can spend it with multiple txs. add_block(&chain, &[initial_tx], &keychain); @@ -66,34 +69,34 @@ fn test_transaction_pool_block_reconciliation() { // 2. A transaction that should be invalidated because the input is // consumed in the block, although it is not exactly consumed. // 3. A transaction that should remain after block reconciliation. - let block_transaction = test_transaction(&keychain, vec![10], vec![8]); - let conflict_transaction = test_transaction(&keychain, vec![20], vec![12, 6]); - let valid_transaction = test_transaction(&keychain, vec![30], vec![13, 15]); + let block_transaction = test_transaction(&keychain, vec![1_000], vec![800]); + let conflict_transaction = test_transaction(&keychain, vec![2_000], vec![1_200, 600]); + let valid_transaction = test_transaction(&keychain, vec![3_000], vec![1_300, 1_500]); // We will also introduce a few children: // 4. A transaction that descends from transaction 1, that is in // turn exactly contained in the block. - let block_child = test_transaction(&keychain, vec![8], vec![5, 1]); + let block_child = test_transaction(&keychain, vec![800], vec![500, 100]); // 5. A transaction that descends from transaction 4, that is not // contained in the block at all and should be valid after // reconciliation. - let pool_child = test_transaction(&keychain, vec![5], vec![3]); + let pool_child = test_transaction(&keychain, vec![500], vec![300]); // 6. A transaction that descends from transaction 2 that does not // conflict with anything in the block in any way, but should be // invalidated (orphaned). - let conflict_child = test_transaction(&keychain, vec![12], vec![2]); + let conflict_child = test_transaction(&keychain, vec![1_200], vec![200]); // 7. A transaction that descends from transaction 2 that should be // valid due to its inputs being satisfied by the block. - let conflict_valid_child = test_transaction(&keychain, vec![6], vec![4]); + let conflict_valid_child = test_transaction(&keychain, vec![600], vec![400]); // 8. A transaction that descends from transaction 3 that should be // invalidated due to an output conflict. - let valid_child_conflict = test_transaction(&keychain, vec![13], vec![9]); + let valid_child_conflict = test_transaction(&keychain, vec![1_300], vec![900]); // 9. A transaction that descends from transaction 3 that should remain // valid after reconciliation. - let valid_child_valid = test_transaction(&keychain, vec![15], vec![11]); + let valid_child_valid = test_transaction(&keychain, vec![1_500], vec![1_100]); // 10. A transaction that descends from both transaction 6 and // transaction 9 - let mixed_child = test_transaction(&keychain, vec![2, 11], vec![7]); + let mixed_child = test_transaction(&keychain, vec![200, 1_100], vec![700]); let txs_to_add = vec![ block_transaction, @@ -122,13 +125,13 @@ fn test_transaction_pool_block_reconciliation() { // Now we prepare the block that will cause the above conditions to be met. // First, the transactions we want in the block: // - Copy of 1 - let block_tx_1 = test_transaction(&keychain, vec![10], vec![8]); + let block_tx_1 = test_transaction(&keychain, vec![1_000], vec![800]); // - Conflict w/ 2, satisfies 7 - let block_tx_2 = test_transaction(&keychain, vec![20], vec![6]); + let block_tx_2 = test_transaction(&keychain, vec![2_000], vec![600]); // - Copy of 4 - let block_tx_3 = test_transaction(&keychain, vec![8], vec![5, 1]); + let block_tx_3 = test_transaction(&keychain, vec![800], vec![500, 100]); // - Output conflict w/ 8 - let block_tx_4 = test_transaction(&keychain, vec![40], vec![9, 31]); + let block_tx_4 = test_transaction(&keychain, vec![4_000], vec![900, 2_900]); let block_txs = &[block_tx_1, block_tx_2, block_tx_3, block_tx_4]; add_block(&chain, block_txs, &keychain); diff --git a/pool/tests/coinbase_maturity.rs b/pool/tests/coinbase_maturity.rs index dfc2b2db2f..7d845f8389 100644 --- a/pool/tests/coinbase_maturity.rs +++ b/pool/tests/coinbase_maturity.rs @@ -31,6 +31,7 @@ use std::sync::Arc; fn test_coinbase_maturity() { util::init_test_logger(); global::set_local_chain_type(global::ChainTypes::AutomatedTesting); + global::set_local_accept_fee_base(50_000_000); let keychain: ExtKeychain = Keychain::from_random_seed(false).unwrap(); let db_root = "target/.coinbase_maturity"; diff --git a/pool/tests/common.rs b/pool/tests/common.rs index b26e996fc1..58a57b3bf3 100644 --- a/pool/tests/common.rs +++ b/pool/tests/common.rs @@ -36,6 +36,7 @@ use grin_core as core; use grin_keychain as keychain; use grin_pool as pool; use grin_util as util; +use std::convert::TryInto; use std::fs; use std::sync::Arc; @@ -80,7 +81,7 @@ where let prev = chain.head_header().unwrap(); let height = prev.height + 1; let next_header_info = consensus::next_difficulty(height, chain.difficulty_iter().unwrap()); - let fee = txs.iter().map(|x| x.fee()).sum(); + let fee = txs.iter().map(|x| x.fee(height)).sum(); let key_id = ExtKeychainPath::new(1, height as u32, 0, 0, 0).to_identifier(); let reward = reward::output( keychain, @@ -179,7 +180,7 @@ where { TransactionPool::new( PoolConfig { - accept_fee_base: 0, + accept_fee_base: default_accept_fee_base(), reorg_cache_timeout: 1_440, max_pool_size: 50, max_stempool_size: 50, @@ -220,7 +221,9 @@ where } build::transaction( - KernelFeatures::Plain { fee: fees as u64 }, + KernelFeatures::Plain { + fee: (fees as u64).try_into().unwrap(), + }, &tx_elements, keychain, &ProofBuilder::new(keychain), @@ -245,7 +248,9 @@ where keychain, input_values, output_values, - KernelFeatures::Plain { fee: fees as u64 }, + KernelFeatures::Plain { + fee: (fees as u64).try_into().unwrap(), + }, ) } diff --git a/pool/tests/nrd_kernel_relative_height.rs b/pool/tests/nrd_kernel_relative_height.rs index 33f156cbde..f387e4355b 100644 --- a/pool/tests/nrd_kernel_relative_height.rs +++ b/pool/tests/nrd_kernel_relative_height.rs @@ -34,6 +34,7 @@ use std::sync::Arc; fn test_nrd_kernel_relative_height() -> Result<(), PoolError> { util::init_test_logger(); global::set_local_chain_type(global::ChainTypes::AutomatedTesting); + global::set_local_accept_fee_base(10); global::set_local_nrd_enabled(true); let keychain: ExtKeychain = Keychain::from_random_seed(false).unwrap(); @@ -59,12 +60,14 @@ fn test_nrd_kernel_relative_height() -> Result<(), PoolError> { // Now create tx to spend an early coinbase (now matured). // Provides us with some useful outputs to test with. - let initial_tx = test_transaction_spending_coinbase(&keychain, &header_1, vec![10, 20, 30, 40]); + let initial_tx = + test_transaction_spending_coinbase(&keychain, &header_1, vec![1_000, 2_000, 3_000, 4_000]); // Mine that initial tx so we can spend it with multiple txs. add_block(&chain, &[initial_tx], &keychain); - add_some_blocks(&chain, 5, &keychain); + // mine past HF4 to see effect of set_local_accept_fee_base + add_some_blocks(&chain, 8, &keychain); let header = chain.head_header().unwrap(); @@ -73,7 +76,7 @@ fn test_nrd_kernel_relative_height() -> Result<(), PoolError> { let (tx1, tx2, tx3) = { let mut kernel = TxKernel::with_features(KernelFeatures::NoRecentDuplicate { - fee: 6, + fee: 600.into(), relative_height: NRDRelativeHeight::new(2)?, }); let msg = kernel.msg_to_sign().unwrap(); @@ -95,23 +98,23 @@ fn test_nrd_kernel_relative_height() -> Result<(), PoolError> { let tx1 = test_transaction_with_kernel( &keychain, - vec![10, 20], - vec![24], + vec![1_000, 2_000], + vec![2_400], kernel.clone(), excess.clone(), ); let tx2 = test_transaction_with_kernel( &keychain, - vec![24], - vec![18], + vec![2_400], + vec![1_800], kernel2.clone(), excess.clone(), ); // Now reuse kernel excess for tx3 but with NRD relative_height=1 (and different fee). let mut kernel_short = TxKernel::with_features(KernelFeatures::NoRecentDuplicate { - fee: 3, + fee: 300.into(), relative_height: NRDRelativeHeight::new(1)?, }); let msg_short = kernel_short.msg_to_sign().unwrap(); @@ -123,8 +126,8 @@ fn test_nrd_kernel_relative_height() -> Result<(), PoolError> { let tx3 = test_transaction_with_kernel( &keychain, - vec![18], - vec![15], + vec![1_800], + vec![1_500], kernel_short.clone(), excess.clone(), ); diff --git a/pool/tests/nrd_kernels_disabled.rs b/pool/tests/nrd_kernels_disabled.rs index 90d6ef0b5a..d96e68edd6 100644 --- a/pool/tests/nrd_kernels_disabled.rs +++ b/pool/tests/nrd_kernels_disabled.rs @@ -56,15 +56,16 @@ fn test_nrd_kernels_disabled() { // Spend the initial coinbase. let header_1 = chain.get_header_by_height(1).unwrap(); - let tx = test_transaction_spending_coinbase(&keychain, &header_1, vec![10, 20, 30, 40]); + let tx = + test_transaction_spending_coinbase(&keychain, &header_1, vec![1_000, 2_000, 3_000, 4_000]); add_block(&chain, &[tx], &keychain); let tx_1 = test_transaction_with_kernel_features( &keychain, - vec![10, 20], - vec![24], + vec![1_000, 2_000], + vec![2_400], KernelFeatures::NoRecentDuplicate { - fee: 6, + fee: 600.into(), relative_height: NRDRelativeHeight::new(1440).unwrap(), }, ); diff --git a/pool/tests/nrd_kernels_enabled.rs b/pool/tests/nrd_kernels_enabled.rs index 7fd77987ae..4f53f724aa 100644 --- a/pool/tests/nrd_kernels_enabled.rs +++ b/pool/tests/nrd_kernels_enabled.rs @@ -32,6 +32,7 @@ use std::sync::Arc; fn test_nrd_kernels_enabled() { util::init_test_logger(); global::set_local_chain_type(global::ChainTypes::AutomatedTesting); + global::set_local_accept_fee_base(10); global::set_local_nrd_enabled(true); let keychain: ExtKeychain = Keychain::from_random_seed(false).unwrap(); @@ -56,15 +57,20 @@ fn test_nrd_kernels_enabled() { // Spend the initial coinbase. let header_1 = chain.get_header_by_height(1).unwrap(); - let tx = test_transaction_spending_coinbase(&keychain, &header_1, vec![10, 20, 30, 40]); + let mg = consensus::MILLI_GRIN; + let tx = test_transaction_spending_coinbase( + &keychain, + &header_1, + vec![1_000 * mg, 2_000 * mg, 3_000 * mg, 4_000 * mg], + ); add_block(&chain, &[tx], &keychain); let tx_1 = test_transaction_with_kernel_features( &keychain, - vec![10, 20], - vec![24], + vec![1_000 * mg, 2_000 * mg], + vec![2_400 * mg], KernelFeatures::NoRecentDuplicate { - fee: 6, + fee: (600 * mg as u32).into(), relative_height: NRDRelativeHeight::new(1440).unwrap(), }, ); @@ -83,7 +89,7 @@ fn test_nrd_kernels_enabled() { assert_eq!(header.height, consensus::TESTING_THIRD_HARD_FORK); assert_eq!(header.version, HeaderVersion(4)); - // NRD kernel support not enabled via feature flag, so not valid. + // NRD kernel support enabled via feature flag, so valid. assert_eq!( pool.add_to_pool(test_source(), tx_1.clone(), false, &header), Ok(()) diff --git a/pool/tests/transaction_pool.rs b/pool/tests/transaction_pool.rs index 5c4b5016bf..61f4a4876b 100644 --- a/pool/tests/transaction_pool.rs +++ b/pool/tests/transaction_pool.rs @@ -32,6 +32,7 @@ use std::sync::Arc; fn test_the_transaction_pool() { util::init_test_logger(); global::set_local_chain_type(global::ChainTypes::AutomatedTesting); + global::set_local_accept_fee_base(1); let keychain: ExtKeychain = Keychain::from_random_seed(false).unwrap(); let db_root = "target/.transaction_pool"; @@ -49,7 +50,8 @@ fn test_the_transaction_pool() { verifier_cache.clone(), ); - add_some_blocks(&chain, 3, &keychain); + // mine past HF4 to see effect of set_local_accept_fee_base + add_some_blocks(&chain, 4 * 3, &keychain); let header = chain.head_header().unwrap(); let header_1 = chain.get_header_by_height(1).unwrap(); @@ -74,9 +76,9 @@ fn test_the_transaction_pool() { } // tx1 spends some outputs from the initial test tx. - let tx1 = test_transaction(&keychain, vec![500, 600], vec![499, 599]); + let tx1 = test_transaction(&keychain, vec![500, 600], vec![469, 569]); // tx2 spends some outputs from both tx1 and the initial test tx. - let tx2 = test_transaction(&keychain, vec![499, 700], vec![498]); + let tx2 = test_transaction(&keychain, vec![469, 700], vec![498]); { // Check we have a single initial tx in the pool. @@ -105,7 +107,7 @@ fn test_the_transaction_pool() { // Test adding a duplicate tx with the same input and outputs. // Note: not the *same* tx, just same underlying inputs/outputs. { - let tx1a = test_transaction(&keychain, vec![500, 600], vec![499, 599]); + let tx1a = test_transaction(&keychain, vec![500, 600], vec![469, 569]); assert!(pool .add_to_pool(test_source(), tx1a, false, &header) .is_err()); @@ -113,7 +115,7 @@ fn test_the_transaction_pool() { // Test adding a tx attempting to spend a non-existent output. { - let bad_tx = test_transaction(&keychain, vec![10_001], vec![10_000]); + let bad_tx = test_transaction(&keychain, vec![10_001], vec![9_900]); assert!(pool .add_to_pool(test_source(), bad_tx, false, &header) .is_err()); @@ -130,7 +132,7 @@ fn test_the_transaction_pool() { // Confirm the tx pool correctly identifies an invalid tx (already spent). { - let tx3 = test_transaction(&keychain, vec![500], vec![497]); + let tx3 = test_transaction(&keychain, vec![500], vec![467]); assert!(pool .add_to_pool(test_source(), tx3, false, &header) .is_err()); @@ -139,9 +141,9 @@ fn test_the_transaction_pool() { // Now add a couple of txs to the stempool (stem = true). { - let tx = test_transaction(&keychain, vec![599], vec![598]); + let tx = test_transaction(&keychain, vec![569], vec![538]); pool.add_to_pool(test_source(), tx, true, &header).unwrap(); - let tx2 = test_transaction(&keychain, vec![598], vec![597]); + let tx2 = test_transaction(&keychain, vec![538], vec![507]); pool.add_to_pool(test_source(), tx2, true, &header).unwrap(); assert_eq!(pool.total_size(), 3); assert_eq!(pool.stempool.size(), 2); @@ -165,7 +167,7 @@ fn test_the_transaction_pool() { // Adding a duplicate tx to the stempool will result in it being fluffed. // This handles the case of the stem path having a cycle in it. { - let tx = test_transaction(&keychain, vec![597], vec![596]); + let tx = test_transaction(&keychain, vec![507], vec![476]); pool.add_to_pool(test_source(), tx.clone(), true, &header) .unwrap(); assert_eq!(pool.total_size(), 4); @@ -185,14 +187,15 @@ fn test_the_transaction_pool() { // We will do this be adding a new tx to the pool // that is a superset of a tx already in the pool. { - let tx4 = test_transaction(&keychain, vec![800], vec![799]); + let tx4 = test_transaction(&keychain, vec![800], vec![769]); // tx1 and tx2 are already in the txpool (in aggregated form) // tx4 is the "new" part of this aggregated tx that we care about let agg_tx = transaction::aggregate(&[tx1.clone(), tx2.clone(), tx4]).unwrap(); + let height = 12 + 1; agg_tx - .validate(Weighting::AsTransaction, verifier_cache.clone()) + .validate(Weighting::AsTransaction, verifier_cache.clone(), height) .unwrap(); pool.add_to_pool(test_source(), agg_tx, false, &header) diff --git a/servers/src/grin/dandelion_monitor.rs b/servers/src/grin/dandelion_monitor.rs index 8b83dce12a..d138ff7de2 100644 --- a/servers/src/grin/dandelion_monitor.rs +++ b/servers/src/grin/dandelion_monitor.rs @@ -150,6 +150,7 @@ fn process_fluff_phase( agg_tx.validate( transaction::Weighting::AsTransaction, verifier_cache.clone(), + header.height, )?; tx_pool.add_to_pool(TxSource::Fluff, agg_tx, false, &header)?; diff --git a/servers/src/mining/mine_block.rs b/servers/src/mining/mine_block.rs index 2c2758d909..69e1c0bf6a 100644 --- a/servers/src/mining/mine_block.rs +++ b/servers/src/mining/mine_block.rs @@ -166,7 +166,7 @@ fn build_block( }; // build the coinbase and the block itself - let fees = txs.iter().map(|tx| tx.fee()).sum(); + let fees = txs.iter().map(|tx| tx.fee(head.height)).sum(); let height = head.height + 1; let block_fees = BlockFees { fees, diff --git a/src/bin/grin.rs b/src/bin/grin.rs index a77c43826a..2ad21fbabd 100644 --- a/src/bin/grin.rs +++ b/src/bin/grin.rs @@ -152,7 +152,7 @@ fn real_main() -> i32 { log_build_info(); - // Initialize our global chain_type and feature flags (NRD kernel support currently). + // Initialize our global chain_type and feature flags (NRD kernel support currently), accept_fee_base. // These are read via global and not read from config beyond this point. global::init_global_chain_type(config.members.unwrap().server.chain_type); info!("Chain: {:?}", global::get_chain_type()); @@ -166,6 +166,16 @@ fn real_main() -> i32 { global::init_global_nrd_enabled(true); } } + global::init_global_accept_fee_base( + config + .members + .as_ref() + .unwrap() + .server + .pool_config + .accept_fee_base, + ); + info!("Accept Fee Base: {:?}", global::get_accept_fee_base()); log_feature_flags(); // Execute subcommand From 465fe3e0e771b12014f4445353c33b7318929f43 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 15:39:18 -0700 Subject: [PATCH 16/96] grin v5.3 (0023) Bump version to 5.0.0-beta.1 (#3505) Update: Bumped to 5.0.0 --- Cargo.lock | 22 +++++++++++----------- Cargo.toml | 22 +++++++++++----------- api/Cargo.toml | 14 +++++++------- chain/Cargo.toml | 10 +++++----- config/Cargo.toml | 10 +++++----- core/Cargo.toml | 6 +++--- core/src/global.rs | 2 +- keychain/Cargo.toml | 4 ++-- p2p/Cargo.toml | 12 ++++++------ pool/Cargo.toml | 10 +++++----- servers/Cargo.toml | 18 +++++++++--------- store/Cargo.toml | 6 +++--- util/Cargo.toml | 2 +- 13 files changed, 69 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 197c6489c1..54fb004d37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1475,7 +1475,7 @@ dependencies = [ [[package]] name = "grin_api" -version = "4.4.2" +version = "5.0.0" dependencies = [ "bytes 0.5.6", "chrono", @@ -1509,7 +1509,7 @@ dependencies = [ [[package]] name = "grin_chain" -version = "4.4.2" +version = "5.0.0" dependencies = [ "bit-vec", "bitflags 1.2.1", @@ -1534,7 +1534,7 @@ dependencies = [ [[package]] name = "grin_config" -version = "4.4.2" +version = "5.0.0" dependencies = [ "dirs 2.0.2", "failure", @@ -1552,7 +1552,7 @@ dependencies = [ [[package]] name = "grin_core" -version = "4.4.2" +version = "5.0.0" dependencies = [ "blake2-rfc", "byteorder", @@ -1579,7 +1579,7 @@ dependencies = [ [[package]] name = "grin_keychain" -version = "4.4.2" +version = "5.0.0" dependencies = [ "blake2-rfc", "byteorder", @@ -1602,7 +1602,7 @@ dependencies = [ [[package]] name = "grin_p2p" -version = "4.4.2" +version = "5.0.0" dependencies = [ "async-std", "bitflags 1.2.1", @@ -1637,7 +1637,7 @@ dependencies = [ [[package]] name = "grin_pool" -version = "4.4.2" +version = "5.0.0" dependencies = [ "blake2-rfc", "chrono", @@ -1670,7 +1670,7 @@ dependencies = [ [[package]] name = "grin_servers" -version = "4.4.2" +version = "5.0.0" dependencies = [ "chrono", "dirs 1.0.5", @@ -1707,7 +1707,7 @@ dependencies = [ [[package]] name = "grin_store" -version = "4.4.2" +version = "5.0.0" dependencies = [ "byteorder", "chrono", @@ -1730,7 +1730,7 @@ dependencies = [ [[package]] name = "grin_util" -version = "4.4.2" +version = "5.0.0" dependencies = [ "backtrace", "base64 0.12.3", @@ -2658,7 +2658,7 @@ dependencies = [ [[package]] name = "mwc" -version = "4.4.2" +version = "5.0.0" dependencies = [ "blake2-rfc", "built", diff --git a/Cargo.toml b/Cargo.toml index 40042e5e9f..ca7fbd46db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mwc" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -34,14 +34,14 @@ serde_json = "1" term = "0.6" -grin_api = { path = "./api", version = "4.4.2" } -grin_config = { path = "./config", version = "4.4.2" } -grin_chain = { path = "./chain", version = "4.4.2" } -grin_core = { path = "./core", version = "4.4.2" } -grin_keychain = { path = "./keychain", version = "4.4.2" } -grin_p2p = { path = "./p2p", version = "4.4.2" } -grin_servers = { path = "./servers", version = "4.4.2" } -grin_util = { path = "./util", version = "4.4.2" } +grin_api = { path = "./api", version = "5.0.0" } +grin_config = { path = "./config", version = "5.0.0" } +grin_chain = { path = "./chain", version = "5.0.0" } +grin_core = { path = "./core", version = "5.0.0" } +grin_keychain = { path = "./keychain", version = "5.0.0" } +grin_p2p = { path = "./p2p", version = "5.0.0" } +grin_servers = { path = "./servers", version = "5.0.0" } +grin_util = { path = "./util", version = "5.0.0" } [dependencies.cursive] version = "0.15" @@ -52,5 +52,5 @@ features = ["pancurses-backend"] built = { version = "0.4", features = ["git2"]} [dev-dependencies] -grin_chain = { path = "./chain", version = "4.4.2" } -grin_store = { path = "./store", version = "4.4.2" } +grin_chain = { path = "./chain", version = "5.0.0" } +grin_store = { path = "./store", version = "5.0.0" } diff --git a/api/Cargo.toml b/api/Cargo.toml index 1b3c114570..c32801b9a9 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_api" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "APIs for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -31,12 +31,12 @@ url = "2.1" bytes = "0.5" chrono = { version = "0.4.11", features = ["serde"] } -grin_core = { path = "../core", version = "4.4.2" } -grin_chain = { path = "../chain", version = "4.4.2" } -grin_p2p = { path = "../p2p", version = "4.4.2" } -grin_pool = { path = "../pool", version = "4.4.2" } -grin_store = { path = "../store", version = "4.4.2" } -grin_util = { path = "../util", version = "4.4.2" } +grin_core = { path = "../core", version = "5.0.0" } +grin_chain = { path = "../chain", version = "5.0.0" } +grin_p2p = { path = "../p2p", version = "5.0.0" } +grin_pool = { path = "../pool", version = "5.0.0" } +grin_store = { path = "../store", version = "5.0.0" } +grin_util = { path = "../util", version = "5.0.0" } # NOTE. We can't have hyper-rustls the same version for Android and non android. because if how rust builds dependency. # Android must have v0.20+ diff --git a/chain/Cargo.toml b/chain/Cargo.toml index 4cac85a422..efb4ec11ba 100644 --- a/chain/Cargo.toml +++ b/chain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_chain" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -24,10 +24,10 @@ chrono = "0.4.11" lru-cache = "0.1" lazy_static = "1" -grin_core = { path = "../core", version = "4.4.2" } -grin_keychain = { path = "../keychain", version = "4.4.2" } -grin_store = { path = "../store", version = "4.4.2" } -grin_util = { path = "../util", version = "4.4.2" } +grin_core = { path = "../core", version = "5.0.0" } +grin_keychain = { path = "../keychain", version = "5.0.0" } +grin_store = { path = "../store", version = "5.0.0" } +grin_util = { path = "../util", version = "5.0.0" } [dev-dependencies] env_logger = "0.7" diff --git a/config/Cargo.toml b/config/Cargo.toml index 215d180ca8..fa6879c802 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_config" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Configuration for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -18,10 +18,10 @@ dirs = "2.0" failure = "0.1" failure_derive = "0.1" -grin_core = { path = "../core", version = "4.4.2" } -grin_servers = { path = "../servers", version = "4.4.2" } -grin_p2p = { path = "../p2p", version = "4.4.2" } -grin_util = { path = "../util", version = "4.4.2" } +grin_core = { path = "../core", version = "5.0.0" } +grin_servers = { path = "../servers", version = "5.0.0" } +grin_p2p = { path = "../p2p", version = "5.0.0" } +grin_util = { path = "../util", version = "5.0.0" } [dev-dependencies] pretty_assertions = "0.6.1" diff --git a/core/Cargo.toml b/core/Cargo.toml index 8af93bdc0f..b321c337e3 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_core" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -29,8 +29,8 @@ chrono = { version = "0.4.11", features = ["serde"] } zeroize = { version = "1.1", features =["zeroize_derive"] } bytes = "0.5" -keychain = { package = "grin_keychain", path = "../keychain", version = "4.4.2" } -util = { package = "grin_util", path = "../util", version = "4.4.2" } +keychain = { package = "grin_keychain", path = "../keychain", version = "5.0.0" } +util = { package = "grin_util", path = "../util", version = "5.0.0" } [dev-dependencies] serde_json = "1" diff --git a/core/src/global.rs b/core/src/global.rs index 71c0d35907..7959fec870 100644 --- a/core/src/global.rs +++ b/core/src/global.rs @@ -19,7 +19,7 @@ use crate::consensus; use crate::consensus::{ graph_weight, HeaderInfo, BASE_EDGE_BITS, BLOCK_TIME_SEC, COINBASE_MATURITY, - CUT_THROUGH_HORIZON, DAY_HEIGHT, DEFAULT_MIN_EDGE_BITS, DIFFICULTY_ADJUST_WINDOW, GRIN_BASE, + CUT_THROUGH_HORIZON, DAY_HEIGHT, DEFAULT_MIN_EDGE_BITS, DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, KERNEL_WEIGHT, MAX_BLOCK_WEIGHT, OUTPUT_WEIGHT, PROOFSIZE, SECOND_POW_EDGE_BITS, STATE_SYNC_THRESHOLD, }; diff --git a/keychain/Cargo.toml b/keychain/Cargo.toml index aa5071cbbe..437c2c6512 100644 --- a/keychain/Cargo.toml +++ b/keychain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_keychain" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -28,4 +28,4 @@ ripemd160 = "0.9" sha2 = "0.9" pbkdf2 = "0.8" -grin_util = { path = "../util", version = "4.4.2" } +grin_util = { path = "../util", version = "5.0.0" } diff --git a/p2p/Cargo.toml b/p2p/Cargo.toml index b1b4e33fff..a2ff98ffe4 100644 --- a/p2p/Cargo.toml +++ b/p2p/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_p2p" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -37,10 +37,10 @@ ed25519-dalek = "1" serde_json = "1" bytes = "0.5" -grin_core = { path = "../core", version = "4.4.2" } -grin_store = { path = "../store", version = "4.4.2" } -grin_util = { path = "../util", version = "4.4.2" } -grin_chain = { path = "../chain", version = "4.4.2" } +grin_core = { path = "../core", version = "5.0.0" } +grin_store = { path = "../store", version = "5.0.0" } +grin_util = { path = "../util", version = "5.0.0" } +grin_chain = { path = "../chain", version = "5.0.0" } [dev-dependencies] -grin_pool = { path = "../pool", version = "4.4.2" } \ No newline at end of file +grin_pool = { path = "../pool", version = "5.0.0" } \ No newline at end of file diff --git a/pool/Cargo.toml b/pool/Cargo.toml index bfe429a46a..4e4267926f 100644 --- a/pool/Cargo.toml +++ b/pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_pool" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -20,9 +20,9 @@ chrono = "0.4.11" failure = "0.1" failure_derive = "0.1" -grin_core = { path = "../core", version = "4.4.2" } -grin_keychain = { path = "../keychain", version = "4.4.2" } -grin_util = { path = "../util", version = "4.4.2" } +grin_core = { path = "../core", version = "5.0.0" } +grin_keychain = { path = "../keychain", version = "5.0.0" } +grin_util = { path = "../util", version = "5.0.0" } [dev-dependencies] -grin_chain = { path = "../chain", version = "4.4.2" } +grin_chain = { path = "../chain", version = "5.0.0" } diff --git a/servers/Cargo.toml b/servers/Cargo.toml index 03312b627e..a8703e034f 100644 --- a/servers/Cargo.toml +++ b/servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_servers" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -32,14 +32,14 @@ sysinfo = "0.9" dirs = "1.0.3" timer = "0.2" -grin_api = { path = "../api", version = "4.4.2" } -grin_chain = { path = "../chain", version = "4.4.2" } -grin_core = { path = "../core", version = "4.4.2" } -grin_keychain = { path = "../keychain", version = "4.4.2" } -grin_p2p = { path = "../p2p", version = "4.4.2" } -grin_pool = { path = "../pool", version = "4.4.2" } -grin_store = { path = "../store", version = "4.4.2" } -grin_util = { path = "../util", version = "4.4.2" } +grin_api = { path = "../api", version = "5.0.0" } +grin_chain = { path = "../chain", version = "5.0.0" } +grin_core = { path = "../core", version = "5.0.0" } +grin_keychain = { path = "../keychain", version = "5.0.0" } +grin_p2p = { path = "../p2p", version = "5.0.0" } +grin_pool = { path = "../pool", version = "5.0.0" } +grin_store = { path = "../store", version = "5.0.0" } +grin_util = { path = "../util", version = "5.0.0" } # NOTE. We can't have hyper-rustls the same version for Android and non android. because if how rust builds dependency. # Android must have v0.20+ diff --git a/store/Cargo.toml b/store/Cargo.toml index 7bac99329e..fecd74b32c 100644 --- a/store/Cargo.toml +++ b/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_store" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -22,8 +22,8 @@ serde = "1" serde_derive = "1" log = "0.4" -grin_core = { path = "../core", version = "4.4.2" } -grin_util = { path = "../util", version = "4.4.2" } +grin_core = { path = "../core", version = "5.0.0" } +grin_util = { path = "../util", version = "5.0.0" } [dev-dependencies] chrono = "0.4.11" diff --git a/util/Cargo.toml b/util/Cargo.toml index 8e93dd5acb..2947ff42a6 100644 --- a/util/Cargo.toml +++ b/util/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_util" -version = "4.4.2" +version = "5.0.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" From edb6aa4c0219ae59c073d5da479e3f8a220a5bfe Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 15:41:59 -0700 Subject: [PATCH 17/96] grin v5.3 (0026) Block migration db flag (only migrate once) (#3512) * rework migrate_db_v2_v3 * db flag to track block migration --- chain/src/chain.rs | 53 ++++++++++++++++++++++++++++++++-------------- chain/src/store.rs | 50 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 17 deletions(-) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 2a2ced4063..328ee5d878 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -1614,32 +1614,53 @@ impl Chain { /// Migrate our local db from v2 to v3. /// "commit only" inputs. fn migrate_db_v2_v3(store: &ChainStore) -> Result<(), Error> { + if store.batch()?.is_blocks_v3_migrated()? { + // Previously migrated so skipping. + debug!("migrate_db_v2_v3: previously migrated, skipping"); + return Ok(()); + } + let mut total = 0; let mut keys_to_migrate = vec![]; for (k, v) in store.batch()?.blocks_raw_iter()? { + total += 1; + // We want to migrate all blocks that cannot be read via v3 protocol version. - let block_v2: Result = - ser::deserialize(&mut Cursor::new(&v), ProtocolVersion(2)); let block_v3: Result = ser::deserialize(&mut Cursor::new(&v), ProtocolVersion(3)); - if let (Ok(_), Err(_)) = (block_v2, block_v3) { - keys_to_migrate.push(k); + if block_v3.is_err() { + let block_v2: Result = + ser::deserialize(&mut Cursor::new(&v), ProtocolVersion(2)); + if block_v2.is_ok() { + keys_to_migrate.push(k); + } } } debug!( - "migrate_db_v2_v3: {} blocks to migrate", - keys_to_migrate.len() + "migrate_db_v2_v3: {} (of {}) blocks to migrate", + keys_to_migrate.len(), + total, ); let mut count = 0; - keys_to_migrate.chunks(100).try_for_each(|keys| { - let batch = store.batch()?; - for key in keys { - batch.migrate_block(&key, ProtocolVersion(2), ProtocolVersion(3))?; - count += 1; - } - batch.commit()?; - debug!("migrate_db_v2_v3: successfully migrated {} blocks", count); - Ok(()) - }) + keys_to_migrate + .chunks(100) + .try_for_each(|keys| { + let batch = store.batch()?; + for key in keys { + batch.migrate_block(&key, ProtocolVersion(2), ProtocolVersion(3))?; + count += 1; + } + batch.commit()?; + debug!("migrate_db_v2_v3: successfully migrated {} blocks", count); + Ok(()) + }) + .and_then(|_| { + // Set flag to indicate we have migrated all blocks in the db. + // We will skip migration in the future. + let batch = store.batch()?; + batch.set_blocks_v3_migrated(true)?; + batch.commit()?; + Ok(()) + }) } /// Gets the block header in which a given output appears in the txhashset. diff --git a/chain/src/store.rs b/chain/src/store.rs index 5229bd5dd1..bf148355ba 100644 --- a/chain/src/store.rs +++ b/chain/src/store.rs @@ -18,7 +18,7 @@ use crate::core::consensus::HeaderInfo; use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::{Block, BlockHeader, BlockSums, Inputs}; use crate::core::pow::Difficulty; -use crate::core::ser::ProtocolVersion; +use crate::core::ser::{ProtocolVersion, Readable, Writeable}; use crate::linked_list::MultiIndex; use crate::types::{CommitPos, HashHeight, Tip}; use crate::util::secp::pedersen::Commitment; @@ -49,6 +49,11 @@ const BLOCK_SUMS_PREFIX: u8 = b'M'; const BLOCK_SPENT_PREFIX: u8 = b'S'; const BLOCK_SPENT_COMMITMENT_PREFIX: u8 = b'C'; +/// Prefix for various boolean flags stored in the db. +const BOOL_FLAG_PREFIX: u8 = b'B'; +/// Boolean flag for v3 migration. +const BLOCKS_V3_MIGRATED: &str = "blocks_v3_migrated"; + /// All chain-related database operations pub struct ChainStore { db: store::Store, @@ -252,6 +257,27 @@ impl<'a> Batch<'a> { // self.db.iter(&key) // } + /// DB flag representing full migration of blocks to v3 version. + /// Default to false if flag not present. + pub fn is_blocks_v3_migrated(&self) -> Result { + let migrated: Option = self + .db + .get_ser(&to_key(BOOL_FLAG_PREFIX, BLOCKS_V3_MIGRATED))?; + match migrated { + None => Ok(false), + Some(x) => Ok(x.into()), + } + } + + /// Set DB flag representing full migration of blocks to v3 version. + pub fn set_blocks_v3_migrated(&self, migrated: bool) -> Result<(), Error> { + self.db.put_ser( + &to_key(BOOL_FLAG_PREFIX, BLOCKS_V3_MIGRATED)[..], + &BoolFlag(migrated), + )?; + Ok(()) + } + /// Migrate a block stored in the db reading from one protocol version and writing /// with new protocol version. pub fn migrate_block( @@ -591,3 +617,25 @@ impl<'a> Iterator for DifficultyIter<'a> { pub fn nrd_recent_kernel_index() -> MultiIndex { MultiIndex::init(NRD_KERNEL_LIST_PREFIX, NRD_KERNEL_ENTRY_PREFIX) } + +struct BoolFlag(bool); + +impl From for bool { + fn from(b: BoolFlag) -> Self { + b.0 + } +} + +impl Readable for BoolFlag { + fn read(reader: &mut R) -> Result { + let x = reader.read_u8()?; + Ok(BoolFlag(1 & x == 1)) + } +} + +impl Writeable for BoolFlag { + fn write(&self, writer: &mut W) -> Result<(), ser::Error> { + writer.write_u8(self.0.into())?; + Ok(()) + } +} From aa43610ada61069217159000d4fc7193f96fb9e6 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 15:42:51 -0700 Subject: [PATCH 18/96] grin v5.3 (0027) remove unused function (#3509) --- core/src/core/transaction.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/core/src/core/transaction.rs b/core/src/core/transaction.rs index db367f782d..93f5809a90 100644 --- a/core/src/core/transaction.rs +++ b/core/src/core/transaction.rs @@ -191,14 +191,6 @@ impl FeeFields { } } - /// Extract bitfields fee_shift and fee into tuple - /// ignore upper 64-FEE_BITS-FEE_SHIFT_BITS bits - pub fn as_tuple(&self) -> (u64, u64) { - let fee = self.0 & FeeFields::FEE_MASK; - let fee_shift = (self.0 >> FeeFields::FEE_BITS) & FeeFields::FEE_SHIFT_MASK; - (fee, fee_shift) - } - /// Turn a zero `FeeField` into a `None`, any other value into a `Some`. /// We need this because a zero `FeeField` cannot be deserialized. pub fn as_opt(&self) -> Option { From f1778fed4879d0bcbc817bc0c2aab6dd458e3649 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 17:52:18 -0700 Subject: [PATCH 19/96] grin v5.3 (0028) prefer outbound peers when syncing (consistently) (#3521) but use inbound peer for header and body sync if necessary sync state from inbound peer if no outbound peers to sync from --- p2p/src/peers.rs | 7 ------- servers/src/grin/seed.rs | 14 +++++--------- servers/src/grin/sync/body_sync.rs | 27 +++++++++++++++++++-------- servers/src/grin/sync/state_sync.rs | 27 ++++++++++++++++++--------- servers/src/grin/sync/syncer.rs | 11 +++++++++-- 5 files changed, 51 insertions(+), 35 deletions(-) diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index fcd7b7d349..c414707acb 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -143,13 +143,6 @@ impl Peers { self.iter().connected().by_addr(addr) } - pub fn max_peer_difficulty(&self) -> Difficulty { - self.iter() - .connected() - .max_difficulty() - .unwrap_or(Difficulty::zero()) - } - pub fn is_banned(&self, peer_addr: PeerAddr) -> bool { if let Ok(peer) = self.store.get_peer(peer_addr) { return peer.flags == State::Banned; diff --git a/servers/src/grin/seed.rs b/servers/src/grin/seed.rs index 6d0521198b..a044b533b2 100644 --- a/servers/src/grin/seed.rs +++ b/servers/src/grin/seed.rs @@ -17,6 +17,7 @@ //! configurable with either no peers, a user-defined list or a preset //! list of DNS records (the default). +use crate::core::pow::Difficulty; use chrono::prelude::{DateTime, Utc}; use chrono::{Duration, MIN_DATE}; use grin_p2p::PeerAddr::Onion; @@ -202,15 +203,10 @@ fn monitor_peers( total_count += 1; } - let peers_count = peers.iter().connected().count(); - - let max_diff = peers.max_peer_difficulty(); - let most_work_count = peers - .iter() - .outbound() - .with_difficulty(|x| x >= max_diff) - .connected() - .count(); + let peers_iter = || peers.iter().connected(); + let peers_count = peers_iter().count(); + let max_diff = peers_iter().max_difficulty().unwrap_or(Difficulty::zero()); + let most_work_count = peers_iter().with_difficulty(|x| x >= max_diff).count(); debug!( "monitor_peers: on {}:{}, {} connected ({} most_work). \ diff --git a/servers/src/grin/sync/body_sync.rs b/servers/src/grin/sync/body_sync.rs index 65f7c417f0..6a048c5a06 100644 --- a/servers/src/grin/sync/body_sync.rs +++ b/servers/src/grin/sync/body_sync.rs @@ -93,14 +93,25 @@ impl BodySync { let head = self.chain.head()?; // Find connected peers with strictly greater difficulty than us. - let peers: Vec<_> = self - .peers - .iter() - .outbound() - .with_difficulty(|x| x > head.total_difficulty) - .connected() - .into_iter() - .collect(); + let peers_iter = || { + self.peers + .iter() + .with_difficulty(|x| x > head.total_difficulty) + .connected() + }; + + // We prefer outbound peers with greater difficulty. + let mut peers: Vec<_> = peers_iter().outbound().into_iter().collect(); + if peers.is_empty() { + debug!("no outbound peers with more work, considering inbound"); + peers = peers_iter().inbound().into_iter().collect(); + } + + // If we have no peers (outbound or inbound) then we are done for now. + if peers.is_empty() { + debug!("no peers (inbound or outbound) with more work"); + return Ok(false); + } // if we have 5 peers to sync from then ask for 50 blocks total (peer_count * // 10) max will be 80 if all 8 peers are advertising more work diff --git a/servers/src/grin/sync/state_sync.rs b/servers/src/grin/sync/state_sync.rs index c385fbc289..69353b618a 100644 --- a/servers/src/grin/sync/state_sync.rs +++ b/servers/src/grin/sync/state_sync.rs @@ -19,6 +19,7 @@ use std::sync::Arc; use crate::chain::{self, SyncState, SyncStatus}; use crate::core::core::hash::Hashed; use crate::core::global; +use crate::core::pow::Difficulty; use crate::p2p::{self, Capabilities, Peer}; /// Fast sync has 3 "states": @@ -150,15 +151,23 @@ impl StateSync { let mut txhashset_height = header_head.height.saturating_sub(threshold); txhashset_height = txhashset_height.saturating_sub(txhashset_height % archive_interval); - let max_diff = self.peers.max_peer_difficulty(); - let peer = self - .peers - .iter() - .outbound() - .with_capabilities(Capabilities::TXHASHSET_HIST) - .with_difficulty(|x| x >= max_diff) - .connected() - .choose_random(); + let peers_iter = || { + self.peers + .iter() + .with_capabilities(Capabilities::TXHASHSET_HIST) + .connected() + }; + + // Filter peers further based on max difficulty. + let max_diff = peers_iter().max_difficulty().unwrap_or(Difficulty::zero()); + let peers_iter = || peers_iter().with_difficulty(|x| x >= max_diff); + + // Choose a random "most work" peer, preferring outbound if at all possible. + let peer = peers_iter().outbound().choose_random().or_else(|| { + warn!("no suitable outbound peer for state sync, considering inbound"); + peers_iter().inbound().choose_random() + }); + if let Some(peer) = peer { // ask for txhashset at state_sync_threshold let mut txhashset_head = self diff --git a/servers/src/grin/sync/syncer.rs b/servers/src/grin/sync/syncer.rs index edd994f64c..7e9db168b6 100644 --- a/servers/src/grin/sync/syncer.rs +++ b/servers/src/grin/sync/syncer.rs @@ -241,11 +241,18 @@ impl SyncRunner { let mut is_syncing = self.sync_state.is_syncing(); // Find a peer with greatest known difficulty. - let max_diff = self.peers.max_peer_difficulty(); + // Consider all peers, both inbound and outbound. + // We will prioritize syncing against outbound peers exclusively when possible. + // But we do support syncing against an inbound peer if greater work than any outbound peers. + let max_diff = self + .peers + .iter() + .connected() + .max_difficulty() + .unwrap_or(Difficulty::zero()); let peer = self .peers .iter() - .outbound() .with_difficulty(|x| x >= max_diff) .connected() .choose_random(); From c9c417028c531a12edf7793297dd3ee141d13e5e Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 17:56:01 -0700 Subject: [PATCH 20/96] grin v5.3 (0029) Bump master version to 5.1.0 (#3510) --- Cargo.lock | 22 +++++++++++----------- Cargo.toml | 22 +++++++++++----------- api/Cargo.toml | 14 +++++++------- chain/Cargo.toml | 10 +++++----- config/Cargo.toml | 10 +++++----- core/Cargo.toml | 6 +++--- keychain/Cargo.toml | 4 ++-- p2p/Cargo.toml | 12 ++++++------ pool/Cargo.toml | 10 +++++----- servers/Cargo.toml | 18 +++++++++--------- store/Cargo.toml | 6 +++--- util/Cargo.toml | 2 +- 12 files changed, 68 insertions(+), 68 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 54fb004d37..9c32b1cb56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1475,7 +1475,7 @@ dependencies = [ [[package]] name = "grin_api" -version = "5.0.0" +version = "5.1.0" dependencies = [ "bytes 0.5.6", "chrono", @@ -1509,7 +1509,7 @@ dependencies = [ [[package]] name = "grin_chain" -version = "5.0.0" +version = "5.1.0" dependencies = [ "bit-vec", "bitflags 1.2.1", @@ -1534,7 +1534,7 @@ dependencies = [ [[package]] name = "grin_config" -version = "5.0.0" +version = "5.1.0" dependencies = [ "dirs 2.0.2", "failure", @@ -1552,7 +1552,7 @@ dependencies = [ [[package]] name = "grin_core" -version = "5.0.0" +version = "5.1.0" dependencies = [ "blake2-rfc", "byteorder", @@ -1579,7 +1579,7 @@ dependencies = [ [[package]] name = "grin_keychain" -version = "5.0.0" +version = "5.1.0" dependencies = [ "blake2-rfc", "byteorder", @@ -1602,7 +1602,7 @@ dependencies = [ [[package]] name = "grin_p2p" -version = "5.0.0" +version = "5.1.0" dependencies = [ "async-std", "bitflags 1.2.1", @@ -1637,7 +1637,7 @@ dependencies = [ [[package]] name = "grin_pool" -version = "5.0.0" +version = "5.1.0" dependencies = [ "blake2-rfc", "chrono", @@ -1670,7 +1670,7 @@ dependencies = [ [[package]] name = "grin_servers" -version = "5.0.0" +version = "5.1.0" dependencies = [ "chrono", "dirs 1.0.5", @@ -1707,7 +1707,7 @@ dependencies = [ [[package]] name = "grin_store" -version = "5.0.0" +version = "5.1.0" dependencies = [ "byteorder", "chrono", @@ -1730,7 +1730,7 @@ dependencies = [ [[package]] name = "grin_util" -version = "5.0.0" +version = "5.1.0" dependencies = [ "backtrace", "base64 0.12.3", @@ -2658,7 +2658,7 @@ dependencies = [ [[package]] name = "mwc" -version = "5.0.0" +version = "5.1.0" dependencies = [ "blake2-rfc", "built", diff --git a/Cargo.toml b/Cargo.toml index ca7fbd46db..71fbdd2643 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mwc" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -34,14 +34,14 @@ serde_json = "1" term = "0.6" -grin_api = { path = "./api", version = "5.0.0" } -grin_config = { path = "./config", version = "5.0.0" } -grin_chain = { path = "./chain", version = "5.0.0" } -grin_core = { path = "./core", version = "5.0.0" } -grin_keychain = { path = "./keychain", version = "5.0.0" } -grin_p2p = { path = "./p2p", version = "5.0.0" } -grin_servers = { path = "./servers", version = "5.0.0" } -grin_util = { path = "./util", version = "5.0.0" } +grin_api = { path = "./api", version = "5.1.0" } +grin_config = { path = "./config", version = "5.1.0" } +grin_chain = { path = "./chain", version = "5.1.0" } +grin_core = { path = "./core", version = "5.1.0" } +grin_keychain = { path = "./keychain", version = "5.1.0" } +grin_p2p = { path = "./p2p", version = "5.1.0" } +grin_servers = { path = "./servers", version = "5.1.0" } +grin_util = { path = "./util", version = "5.1.0" } [dependencies.cursive] version = "0.15" @@ -52,5 +52,5 @@ features = ["pancurses-backend"] built = { version = "0.4", features = ["git2"]} [dev-dependencies] -grin_chain = { path = "./chain", version = "5.0.0" } -grin_store = { path = "./store", version = "5.0.0" } +grin_chain = { path = "./chain", version = "5.1.0" } +grin_store = { path = "./store", version = "5.1.0" } diff --git a/api/Cargo.toml b/api/Cargo.toml index c32801b9a9..b20ffcf593 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_api" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "APIs for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -31,12 +31,12 @@ url = "2.1" bytes = "0.5" chrono = { version = "0.4.11", features = ["serde"] } -grin_core = { path = "../core", version = "5.0.0" } -grin_chain = { path = "../chain", version = "5.0.0" } -grin_p2p = { path = "../p2p", version = "5.0.0" } -grin_pool = { path = "../pool", version = "5.0.0" } -grin_store = { path = "../store", version = "5.0.0" } -grin_util = { path = "../util", version = "5.0.0" } +grin_core = { path = "../core", version = "5.1.0" } +grin_chain = { path = "../chain", version = "5.1.0" } +grin_p2p = { path = "../p2p", version = "5.1.0" } +grin_pool = { path = "../pool", version = "5.1.0" } +grin_store = { path = "../store", version = "5.1.0" } +grin_util = { path = "../util", version = "5.1.0" } # NOTE. We can't have hyper-rustls the same version for Android and non android. because if how rust builds dependency. # Android must have v0.20+ diff --git a/chain/Cargo.toml b/chain/Cargo.toml index efb4ec11ba..3c04b325ec 100644 --- a/chain/Cargo.toml +++ b/chain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_chain" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -24,10 +24,10 @@ chrono = "0.4.11" lru-cache = "0.1" lazy_static = "1" -grin_core = { path = "../core", version = "5.0.0" } -grin_keychain = { path = "../keychain", version = "5.0.0" } -grin_store = { path = "../store", version = "5.0.0" } -grin_util = { path = "../util", version = "5.0.0" } +grin_core = { path = "../core", version = "5.1.0" } +grin_keychain = { path = "../keychain", version = "5.1.0" } +grin_store = { path = "../store", version = "5.1.0" } +grin_util = { path = "../util", version = "5.1.0" } [dev-dependencies] env_logger = "0.7" diff --git a/config/Cargo.toml b/config/Cargo.toml index fa6879c802..5a17fb3643 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_config" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Configuration for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -18,10 +18,10 @@ dirs = "2.0" failure = "0.1" failure_derive = "0.1" -grin_core = { path = "../core", version = "5.0.0" } -grin_servers = { path = "../servers", version = "5.0.0" } -grin_p2p = { path = "../p2p", version = "5.0.0" } -grin_util = { path = "../util", version = "5.0.0" } +grin_core = { path = "../core", version = "5.1.0" } +grin_servers = { path = "../servers", version = "5.1.0" } +grin_p2p = { path = "../p2p", version = "5.1.0" } +grin_util = { path = "../util", version = "5.1.0" } [dev-dependencies] pretty_assertions = "0.6.1" diff --git a/core/Cargo.toml b/core/Cargo.toml index b321c337e3..a4a12c1dd3 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_core" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -29,8 +29,8 @@ chrono = { version = "0.4.11", features = ["serde"] } zeroize = { version = "1.1", features =["zeroize_derive"] } bytes = "0.5" -keychain = { package = "grin_keychain", path = "../keychain", version = "5.0.0" } -util = { package = "grin_util", path = "../util", version = "5.0.0" } +keychain = { package = "grin_keychain", path = "../keychain", version = "5.1.0" } +util = { package = "grin_util", path = "../util", version = "5.1.0" } [dev-dependencies] serde_json = "1" diff --git a/keychain/Cargo.toml b/keychain/Cargo.toml index 437c2c6512..6999875e9f 100644 --- a/keychain/Cargo.toml +++ b/keychain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_keychain" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -28,4 +28,4 @@ ripemd160 = "0.9" sha2 = "0.9" pbkdf2 = "0.8" -grin_util = { path = "../util", version = "5.0.0" } +grin_util = { path = "../util", version = "5.1.0" } diff --git a/p2p/Cargo.toml b/p2p/Cargo.toml index a2ff98ffe4..db1f16b07c 100644 --- a/p2p/Cargo.toml +++ b/p2p/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_p2p" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -37,10 +37,10 @@ ed25519-dalek = "1" serde_json = "1" bytes = "0.5" -grin_core = { path = "../core", version = "5.0.0" } -grin_store = { path = "../store", version = "5.0.0" } -grin_util = { path = "../util", version = "5.0.0" } -grin_chain = { path = "../chain", version = "5.0.0" } +grin_core = { path = "../core", version = "5.1.0" } +grin_store = { path = "../store", version = "5.1.0" } +grin_util = { path = "../util", version = "5.1.0" } +grin_chain = { path = "../chain", version = "5.1.0" } [dev-dependencies] -grin_pool = { path = "../pool", version = "5.0.0" } \ No newline at end of file +grin_pool = { path = "../pool", version = "5.1.0" } \ No newline at end of file diff --git a/pool/Cargo.toml b/pool/Cargo.toml index 4e4267926f..676101d1a0 100644 --- a/pool/Cargo.toml +++ b/pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_pool" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -20,9 +20,9 @@ chrono = "0.4.11" failure = "0.1" failure_derive = "0.1" -grin_core = { path = "../core", version = "5.0.0" } -grin_keychain = { path = "../keychain", version = "5.0.0" } -grin_util = { path = "../util", version = "5.0.0" } +grin_core = { path = "../core", version = "5.1.0" } +grin_keychain = { path = "../keychain", version = "5.1.0" } +grin_util = { path = "../util", version = "5.1.0" } [dev-dependencies] -grin_chain = { path = "../chain", version = "5.0.0" } +grin_chain = { path = "../chain", version = "5.1.0" } diff --git a/servers/Cargo.toml b/servers/Cargo.toml index a8703e034f..f359cf01bd 100644 --- a/servers/Cargo.toml +++ b/servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_servers" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -32,14 +32,14 @@ sysinfo = "0.9" dirs = "1.0.3" timer = "0.2" -grin_api = { path = "../api", version = "5.0.0" } -grin_chain = { path = "../chain", version = "5.0.0" } -grin_core = { path = "../core", version = "5.0.0" } -grin_keychain = { path = "../keychain", version = "5.0.0" } -grin_p2p = { path = "../p2p", version = "5.0.0" } -grin_pool = { path = "../pool", version = "5.0.0" } -grin_store = { path = "../store", version = "5.0.0" } -grin_util = { path = "../util", version = "5.0.0" } +grin_api = { path = "../api", version = "5.1.0" } +grin_chain = { path = "../chain", version = "5.1.0" } +grin_core = { path = "../core", version = "5.1.0" } +grin_keychain = { path = "../keychain", version = "5.1.0" } +grin_p2p = { path = "../p2p", version = "5.1.0" } +grin_pool = { path = "../pool", version = "5.1.0" } +grin_store = { path = "../store", version = "5.1.0" } +grin_util = { path = "../util", version = "5.1.0" } # NOTE. We can't have hyper-rustls the same version for Android and non android. because if how rust builds dependency. # Android must have v0.20+ diff --git a/store/Cargo.toml b/store/Cargo.toml index fecd74b32c..2265ae8e1a 100644 --- a/store/Cargo.toml +++ b/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_store" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -22,8 +22,8 @@ serde = "1" serde_derive = "1" log = "0.4" -grin_core = { path = "../core", version = "5.0.0" } -grin_util = { path = "../util", version = "5.0.0" } +grin_core = { path = "../core", version = "5.1.0" } +grin_util = { path = "../util", version = "5.1.0" } [dev-dependencies] chrono = "0.4.11" diff --git a/util/Cargo.toml b/util/Cargo.toml index 2947ff42a6..fdc65a023a 100644 --- a/util/Cargo.toml +++ b/util/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_util" -version = "5.0.0" +version = "5.1.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" From 209d53d1772767a51487b5de8fa4aa04788f7fa6 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:00:31 -0700 Subject: [PATCH 21/96] grin v5.3 (0032) Safety: check length during deserialization (#3551) --- core/src/libtx/secp_ser.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/libtx/secp_ser.rs b/core/src/libtx/secp_ser.rs index 74755a0f50..42455b0bc2 100644 --- a/core/src/libtx/secp_ser.rs +++ b/core/src/libtx/secp_ser.rs @@ -81,6 +81,9 @@ pub mod option_sig_serde { Error::custom(format!("Fail to parse signature HEX {}, {}", string, err)) }) .and_then(|bytes: Vec| { + if bytes.len() < 64 { + return Err(Error::invalid_length(bytes.len(), &"64 bytes")); + } let mut b = [0u8; 64]; b.copy_from_slice(&bytes[0..64]); secp::Signature::from_compact(&b) @@ -123,6 +126,9 @@ pub mod option_seckey_serde { Error::custom(format!("Fail to parse key from HEX {}, {}", string, err)) }) .and_then(|bytes: Vec| { + if bytes.len() < 32 { + return Err(Error::invalid_length(bytes.len(), &"32 bytes")); + } let mut b = [0u8; 32]; b.copy_from_slice(&bytes[0..32]); secp::key::SecretKey::from_slice(&b) @@ -160,6 +166,9 @@ pub mod sig_serde { }) }) .and_then(|bytes: Vec| { + if bytes.len() < 64 { + return Err(Error::invalid_length(bytes.len(), &"64 bytes")); + } let mut b = [0u8; 64]; b.copy_from_slice(&bytes[0..64]); secp::Signature::from_compact(&b) From f3f117475593406712df8fcb54b0a88bca044eef Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:04:57 -0700 Subject: [PATCH 22/96] grin v5.3 (0033) fix for missing block under certain startup conditions (#3555) --- chain/src/chain.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 328ee5d878..0d040780e6 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -247,8 +247,7 @@ impl Chain { // In reality we will do this based on PIBD segment requests. // Initialization (once per 12 hour period) will not be this slow once lmdb and PMMRs // are warmed up. - { - let segmenter = chain.segmenter()?; + if let Ok(segmenter) = chain.segmenter() { let _ = segmenter.kernel_segment(SegmentIdentifier { height: 9, idx: 0 }); let _ = segmenter.bitmap_segment(SegmentIdentifier { height: 9, idx: 0 }); let _ = segmenter.output_segment(SegmentIdentifier { height: 11, idx: 0 }); From 7eb94d97a7d04272f9c41f1d3aeb75613c6b902d Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:09:32 -0700 Subject: [PATCH 23/96] grin v5.3 (0034) Block sync hash traversal perf (#3558) * sync traversal performance improvements * rework how body_sync determines block hashes to request --- chain/src/chain.rs | 114 +++++------------------------ servers/src/grin/sync/body_sync.rs | 65 ++++++++-------- 2 files changed, 53 insertions(+), 126 deletions(-) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 0d040780e6..54ecc2ab54 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -15,7 +15,7 @@ //! Facade and handler for the rest of the blockchain implementation //! and mostly the chain pipeline. -use crate::core::core::hash::{Hash, Hashed, ZERO_HASH}; +use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::merkle_proof::MerkleProof; use crate::core::core::verifier_cache::VerifierCache; use crate::core::core::{ @@ -1088,100 +1088,26 @@ impl Chain { Ok(()) } - /// Check chain status whether a txhashset downloading is needed - pub fn check_txhashset_needed( - &self, - caller: String, - hashes: &mut Option>, - ) -> Result { - let horizon = global::cut_through_horizon() as u64; + /// Finds the "fork point" where header chain diverges from full block chain. + /// If we are syncing this will correspond to the last full block where + /// the next header is known but we do not yet have the full block. + /// i.e. This is the last known full block and all subsequent blocks are missing. + pub fn fork_point(&self) -> Result { let body_head = self.head()?; - let header_head = self.header_head()?; - let sync_head = self.get_sync_head()?; - - debug!( - "{}: body_head - {}, {}, header_head - {}, {}, sync_head - {}, {}", - caller, - body_head.last_block_h, - body_head.height, - header_head.last_block_h, - header_head.height, - sync_head.last_block_h, - sync_head.height, - ); - - if body_head.total_difficulty >= header_head.total_difficulty { - debug!( - "{}: no need txhashset. header_head.total_difficulty: {} <= body_head.total_difficulty: {}", - caller, header_head.total_difficulty, body_head.total_difficulty, - ); - return Ok(false); - } - - let mut oldest_height = 0; - let mut oldest_hash = ZERO_HASH; - - // Start with body_head (head of the full block chain) - let mut current = self.get_block_header(&body_head.last_block_h); - if current.is_err() { - error!( - "{}: body_head not found in chain db: {} at {}", - caller, body_head.last_block_h, body_head.height, - ); - return Ok(false); - } - - // - // TODO - Investigate finding the "common header" by comparing header_mmr and - // sync_mmr (bytes will be identical up to the common header). - // - // Traverse back through the full block chain from body head until we find a header - // that "is on current chain", which is the "fork point" between existing header chain - // and full block chain. - while let Ok(header) = current { - // break out of the while loop when we find a header common - // between the header chain and the current body chain - if self.is_on_current_chain(&header).is_ok() { - oldest_height = header.height; - oldest_hash = header.hash(); - break; - } - - current = self.get_previous_header(&header); - } - - // Traverse back through the header chain from header_head back to this fork point. - // These are the blocks that we need to request in body sync (we have the header but not the full block). - if let Some(hs) = hashes { - let mut h = self.get_block_header(&header_head.last_block_h); - while let Ok(header) = h { - if header.height <= oldest_height { - break; - } - hs.push(header.hash()); - h = self.get_previous_header(&header); - } + let mut current = self.get_block_header(&body_head.hash())?; + while !self.is_on_current_chain(¤t).is_ok() { + current = self.get_previous_header(¤t)?; } + Ok(current) + } - if oldest_height < header_head.height.saturating_sub(horizon) { - if oldest_hash != ZERO_HASH { - // this is the normal case. for example: - // body head height is 1 (and not a fork), oldest_height will be 1 - // body head height is 0 (a typical fresh node), oldest_height will be 0 - // body head height is 10,001 (but at a fork with depth 1), oldest_height will be 10,000 - // body head height is 10,005 (but at a fork with depth 5), oldest_height will be 10,000 - debug!( - "{}: need a state sync for txhashset. oldest block which is not on local chain: {} at {}", - caller, oldest_hash, oldest_height, - ); - } else { - // this is the abnormal case, when is_on_current_chain() always return Err, and even for genesis block. - error!("{}: corrupted storage? state sync is needed", caller); - } - Ok(true) - } else { - Ok(false) - } + /// Compare fork point to our horizon. + /// If beyond the horizon then we cannot sync via recent full blocks + /// and we need a state (txhashset) sync. + pub fn check_txhashset_needed(&self, fork_point: &BlockHeader) -> Result { + let header_head = self.header_head()?; + let horizon = global::cut_through_horizon() as u64; + Ok(fork_point.height < header_head.height.saturating_sub(horizon)) } /// Clean the temporary sandbox folder @@ -1233,8 +1159,8 @@ impl Chain { status.on_setup(); // Initial check whether this txhashset is needed or not - let mut hashes: Option> = None; - if !self.check_txhashset_needed("txhashset_write".to_owned(), &mut hashes)? { + let fork_point = self.fork_point()?; + if !self.check_txhashset_needed(&fork_point)? { warn!("txhashset_write: txhashset received but it's not needed! ignored."); return Err(ErrorKind::InvalidTxHashSet("not needed".to_owned()).into()); } diff --git a/servers/src/grin/sync/body_sync.rs b/servers/src/grin/sync/body_sync.rs index 6a048c5a06..e78441f787 100644 --- a/servers/src/grin/sync/body_sync.rs +++ b/servers/src/grin/sync/body_sync.rs @@ -18,8 +18,9 @@ use rand::prelude::*; use std::cmp; use std::sync::Arc; -use crate::chain::{self, SyncState, SyncStatus}; -use crate::core::core::hash::Hash; +use crate::chain::{self, SyncState, SyncStatus, Tip}; +use crate::core::core::hash::{Hash, Hashed}; +use crate::core::core::BlockHeader; use crate::p2p; pub struct BodySync { @@ -71,27 +72,19 @@ impl BodySync { } /// Return true if txhashset download is needed (when requested block is under the horizon). + /// Otherwise go request some missing blocks and return false. fn body_sync(&mut self) -> Result { - let mut hashes: Option> = Some(vec![]); - let txhashset_needed = self - .chain - .check_txhashset_needed("body_sync".to_owned(), &mut hashes)?; + let head = self.chain.head()?; + let header_head = self.chain.header_head()?; + let fork_point = self.chain.fork_point()?; - if txhashset_needed { + if self.chain.check_txhashset_needed(&fork_point)? { debug!( "body_sync: cannot sync full blocks earlier than horizon. will request txhashset", ); return Ok(true); } - let mut hashes = hashes.ok_or_else(|| { - chain::ErrorKind::SyncError("Got no hashes for body sync".to_string()) - })?; - - hashes.reverse(); - - let head = self.chain.head()?; - // Find connected peers with strictly greater difficulty than us. let peers_iter = || { self.peers @@ -121,25 +114,14 @@ impl BodySync { chain::MAX_ORPHAN_SIZE.saturating_sub(self.chain.orphans_len()) + 1, ); - let hashes_to_get = hashes - .iter() - .filter(|x| { - // only ask for blocks that we have not yet processed - // either successfully stored or in our orphan list - self.chain.get_block(x).is_err() && !self.chain.is_orphan(x) - }) - .take(block_count) - .collect::>(); - - if !hashes_to_get.is_empty() { - let body_head = self.chain.head()?; - let header_head = self.chain.header_head()?; + let hashes = self.block_hashes_to_sync(&fork_point, &header_head, block_count as u64)?; + if !hashes.is_empty() { debug!( "block_sync: {}/{} requesting blocks {:?} from {} peers", - body_head.height, + head.height, header_head.height, - hashes_to_get, + hashes, peers.len(), ); @@ -148,9 +130,9 @@ impl BodySync { self.receive_timeout = Utc::now() + Duration::seconds(6); let mut rng = rand::thread_rng(); - for hash in hashes_to_get.clone() { + for hash in hashes { if let Some(peer) = peers.choose(&mut rng) { - if let Err(e) = peer.send_block_request(*hash, chain::Options::SYNC) { + if let Err(e) = peer.send_block_request(hash, chain::Options::SYNC) { debug!("Skipped request to {}: {:?}", peer.info.addr, e); peer.stop(); } else { @@ -162,6 +144,25 @@ impl BodySync { return Ok(false); } + fn block_hashes_to_sync( + &self, + fork_point: &BlockHeader, + header_head: &Tip, + count: u64, + ) -> Result, chain::Error> { + let mut hashes = vec![]; + let max_height = cmp::min(fork_point.height + count, header_head.height); + let mut current = self.chain.get_header_by_height(max_height)?; + while current.height > fork_point.height { + if !self.chain.is_orphan(¤t.hash()) { + hashes.push(current.hash()); + } + current = self.chain.get_previous_header(¤t)?; + } + hashes.reverse(); + Ok(hashes) + } + // Should we run block body sync and ask for more full blocks? fn body_sync_due(&mut self) -> Result { let blocks_received = self.blocks_received()?; From 78ecd66f46face5fc6506e4f7cfae58d71621f1b Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:11:09 -0700 Subject: [PATCH 24/96] grin v5.3 (0035) add rate limiting to outbound p2p msg sending (#3560) treat peers as abusive based on incoming msgs, not outgoing msg rates --- p2p/src/msg.rs | 13 ++++++++++++- p2p/src/peer.rs | 24 +++++------------------- p2p/src/peers.rs | 12 ++++++------ servers/src/common/stats.rs | 4 ++-- util/src/rate_counter.rs | 8 ++++++++ 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/p2p/src/msg.rs b/p2p/src/msg.rs index 1cddbf3577..cd8fcc8313 100644 --- a/p2p/src/msg.rs +++ b/p2p/src/msg.rs @@ -34,10 +34,10 @@ use crate::types::{ use crate::util::secp::pedersen::RangeProof; use bytes::Bytes; use num::FromPrimitive; -use std::fmt; use std::fs::File; use std::io::{Read, Write}; use std::sync::Arc; +use std::{fmt, thread, time::Duration}; /// Grin's user agent with current version pub const USER_AGENT: &str = concat!("MW/MWC ", env!("CARGO_PKG_VERSION")); @@ -241,6 +241,17 @@ pub fn write_message( msg: &Msg, tracker: Arc, ) -> Result<(), Error> { + // Introduce a delay so messages are spaced at least 150ms apart. + // This gives a max msg rate of 60000/150 = 400 messages per minute. + // Exceeding 500 messages per minute will result in being banned as abusive. + if let Some(elapsed) = tracker.sent_bytes.read().elapsed_since_last_msg() { + let min_interval: u64 = 150; + let sleep_ms = min_interval.saturating_sub(elapsed); + if sleep_ms > 0 { + thread::sleep(Duration::from_millis(sleep_ms)) + } + } + let mut buf = ser::ser_vec(&msg.header, msg.version)?; buf.extend(&msg.body[..]); stream.write_all(&buf[..])?; diff --git a/p2p/src/peer.rs b/p2p/src/peer.rs index fc64745790..f2a8c6006a 100644 --- a/p2p/src/peer.rs +++ b/p2p/src/peer.rs @@ -239,27 +239,13 @@ impl Peer { /// Whether the peer is considered abusive, mostly for spammy nodes pub fn is_abusive(&self) -> bool { - let rec = self.tracker.received_bytes.read(); - let sent = self.tracker.sent_bytes.read(); - rec.count_per_min() > MAX_PEER_MSG_PER_MIN || sent.count_per_min() > MAX_PEER_MSG_PER_MIN + let rec = self.tracker().received_bytes.read(); + rec.count_per_min() > MAX_PEER_MSG_PER_MIN } - /// Number of bytes sent to the peer - pub fn last_min_sent_bytes(&self) -> Option { - let sent_bytes = self.tracker.sent_bytes.read(); - Some(sent_bytes.bytes_per_min()) - } - - /// Number of bytes received from the peer - pub fn last_min_received_bytes(&self) -> Option { - let received_bytes = self.tracker.received_bytes.read(); - Some(received_bytes.bytes_per_min()) - } - - pub fn last_min_message_counts(&self) -> Option<(u64, u64)> { - let received_bytes = self.tracker.received_bytes.read(); - let sent_bytes = self.tracker.sent_bytes.read(); - Some((sent_bytes.count_per_min(), received_bytes.count_per_min())) + /// Tracker tracks sent/received bytes and message counts per minute. + pub fn tracker(&self) -> &conn::Tracker { + &self.tracker } /// Set this peer status to banned diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index c414707acb..0c107e0a0f 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -339,12 +339,12 @@ impl Peers { debug!("clean_peers {:?}, not connected", peer.info.addr); rm.push(peer.info.addr.clone()); } else if peer.is_abusive() { - if let Some(counts) = peer.last_min_message_counts() { - debug!( - "clean_peers {:?}, abusive ({} sent, {} recv)", - peer.info.addr, counts.0, counts.1, - ); - } + let received = peer.tracker().received_bytes.read().count_per_min(); + let sent = peer.tracker().sent_bytes.read().count_per_min(); + debug!( + "clean_peers {:?}, abusive ({} sent, {} recv)", + peer.info.addr, sent, received, + ); let _ = self.update_state(peer.info.addr.clone(), State::Banned); rm.push(peer.info.addr.clone()); } else { diff --git a/servers/src/common/stats.rs b/servers/src/common/stats.rs index 2a961caa0b..d67882483b 100644 --- a/servers/src/common/stats.rs +++ b/servers/src/common/stats.rs @@ -292,8 +292,8 @@ impl PeerStats { height: peer.info.height(), direction: direction.to_string(), last_seen: peer.info.last_seen(), - sent_bytes_per_sec: peer.last_min_sent_bytes().unwrap_or(0) / 60, - received_bytes_per_sec: peer.last_min_received_bytes().unwrap_or(0) / 60, + sent_bytes_per_sec: peer.tracker().sent_bytes.read().bytes_per_min() / 60, + received_bytes_per_sec: peer.tracker().received_bytes.read().bytes_per_min() / 60, capabilities: peer.info.capabilities, } } diff --git a/util/src/rate_counter.rs b/util/src/rate_counter.rs index aa84ced963..0a9c92e1e8 100644 --- a/util/src/rate_counter.rs +++ b/util/src/rate_counter.rs @@ -99,6 +99,14 @@ impl RateCounter { .filter(|x| !x.is_quiet()) .count() as u64 } + + /// Elapsed time in ms since the last entry. + /// We use this to rate limit when sending. + pub fn elapsed_since_last_msg(&self) -> Option { + self.last_min_entries + .last() + .map(|x| millis_since_epoch().saturating_sub(x.timestamp)) + } } // turns out getting the millisecs since epoch in Rust isn't as easy as it From 2381f1d02dcf9eb34dac1669a9dca61f90c66a2f Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:12:14 -0700 Subject: [PATCH 25/96] grin v5.3 (0036) pibd capabilities test was only relevant temporarily (#3565) --- p2p/tests/ser_deser.rs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/p2p/tests/ser_deser.rs b/p2p/tests/ser_deser.rs index 70ba0583e8..7d0767f625 100644 --- a/p2p/tests/ser_deser.rs +++ b/p2p/tests/ser_deser.rs @@ -74,13 +74,3 @@ fn test_capabilities() { .contains(p2p::types::Capabilities::TX_KERNEL_HASH) ); } - -// Default capabilities do not currently include PIBD_HIST -// but it is a supported capability bit flag (currently unused). -#[test] -fn test_pibd_capabilities() { - assert_eq!( - p2p::types::Capabilities::default() | p2p::types::Capabilities::PIBD_HIST, - p2p::types::Capabilities::from_bits_truncate(0b11111111 as u32), - ); -} From 6628433ada9e83902ac6a1cfe1b1166b3166e8cb Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:16:10 -0700 Subject: [PATCH 26/96] grin v5.3 (0037) inc quietly on small batches of headers (#3564) --- p2p/src/codec.rs | 38 +++++++++++++++++++++++++++++++++----- p2p/src/conn.rs | 9 +++++++++ p2p/src/msg.rs | 13 ++++++++++++- p2p/src/protocol.rs | 4 ++-- 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/p2p/src/codec.rs b/p2p/src/codec.rs index 217210c3cb..3594c3beb1 100644 --- a/p2p/src/codec.rs +++ b/p2p/src/codec.rs @@ -1,8 +1,33 @@ -use crate::core::core::block::{BlockHeader, UntrustedBlockHeader}; +// Copyright 2020 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Provides a connection wrapper that handles the lower level tasks in sending +//! or receiving data from the TCP socket, as well as dealing with timeouts. +//! +//! Because of a few idiosyncracies in the Rust `TcpStream`, this has to use +//! async I/O to be able to both read *and* write on the connection. Which +//! forces us to go through some additional gymnastic to loop over the async +//! stream and make sure we get the right number of bytes out. + use crate::core::global::header_size_bytes; use crate::core::ser::{BufReader, ProtocolVersion, Readable}; use crate::msg::{Message, MsgHeader, MsgHeaderWrapper, Type}; use crate::types::{AttachmentMeta, AttachmentUpdate, Error}; +use crate::{ + core::core::block::{BlockHeader, UntrustedBlockHeader}, + msg::HeadersData, +}; use bytes::{Buf, BufMut, Bytes, BytesMut}; use core::ser::Reader; use std::cmp::min; @@ -169,18 +194,21 @@ impl Codec { headers.push(header.into()); *bytes_left = bytes_left.saturating_sub(bytes_read); *items_left -= 1; - - if headers.len() == HEADER_BATCH_SIZE || *items_left == 0 { + let remaining = *items_left as u64; + if headers.len() == HEADER_BATCH_SIZE || remaining == 0 { let mut h = Vec::with_capacity(min(HEADER_BATCH_SIZE, *items_left)); mem::swap(headers, &mut h); - if *items_left == 0 { + if remaining == 0 { let bytes_left = *bytes_left; self.state = None; if bytes_left > 0 { return Err(Error::BadMessage); } } - return Ok(Message::Headers(h)); + return Ok(Message::Headers(HeadersData { + headers: h, + remaining, + })); } } Attachment(left, meta, now) => { diff --git a/p2p/src/conn.rs b/p2p/src/conn.rs index 1ef5ea8cfd..703eb22fd3 100644 --- a/p2p/src/conn.rs +++ b/p2p/src/conn.rs @@ -249,6 +249,15 @@ where // increase the appropriate counter match &next { Ok(Message::Attachment(_, _)) => reader_tracker.inc_quiet_received(bytes_read), + Ok(Message::Headers(data)) => { + // We process a full 512 headers locally in smaller 32 header batches. + // We only want to increment the msg count once for the full 512 headers. + if data.remaining == 0 { + reader_tracker.inc_received(bytes_read); + } else { + reader_tracker.inc_quiet_received(bytes_read); + } + } _ => reader_tracker.inc_received(bytes_read), } diff --git a/p2p/src/msg.rs b/p2p/src/msg.rs index cd8fcc8313..d57de76706 100644 --- a/p2p/src/msg.rs +++ b/p2p/src/msg.rs @@ -877,7 +877,7 @@ pub enum Message { CompactBlock(UntrustedCompactBlock), GetHeaders(Locator), Header(UntrustedBlockHeader), - Headers(Vec), + Headers(HeadersData), GetPeerAddrs(GetPeerAddrs), PeerAddrs(PeerAddrs), TxHashSetRequest(TxHashSetRequest), @@ -894,6 +894,17 @@ pub enum Message { KernelSegment(SegmentResponse), } +/// We receive 512 headers from a peer. +/// But we process them in smaller batches of 32 headers. +/// HeadersData wraps the current batch and a count of the headers remaining after this batch. +pub struct HeadersData { + /// Batch of headers currently being processed. + pub headers: Vec, + /// Number of headers stil to be processed after this current batch. + /// 0 indicates this is the final batch from the larger set of headers received from the peer. + pub remaining: u64, +} + impl fmt::Display for Message { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { diff --git a/p2p/src/protocol.rs b/p2p/src/protocol.rs index bf940fe356..ef0fd0ec1a 100644 --- a/p2p/src/protocol.rs +++ b/p2p/src/protocol.rs @@ -235,8 +235,8 @@ impl MessageHandler for Protocol { Consumed::None } - Message::Headers(headers) => { - adapter.headers_received(&headers, &self.peer_info, self.header_cache_size)?; + Message::Headers(data) => { + adapter.headers_received(&data.headers, &self.peer_info, self.header_cache_size)?; Consumed::None } From 259a823d4ce0bfa81dc5f79782dde751aea56a58 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:22:30 -0700 Subject: [PATCH 27/96] grin v5.3 (0040) inefficient locking on recv of peers lists can result in failure to get peers lock (#3566) (#3570) * fix for: inefficient locking of peers lists can result in failure to get peers lock * dont hold the peers Vec lock while writing to the peers lmdb --- p2p/src/peers.rs | 55 +++++++++++++++++++++++++++++------------------- p2p/src/store.rs | 9 ++++++++ 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index 0c107e0a0f..c21c7b3e6a 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -67,27 +67,29 @@ impl Peers { /// Adds the peer to our internal peer mapping. Note that the peer is still /// returned so the server can run it. pub fn add_connected(&self, peer: Arc) -> Result<(), Error> { - let mut peers = self.peers.try_write_for(LOCK_TIMEOUT).ok_or_else(|| { - error!("add_connected: failed to get peers lock"); - Error::Timeout - })?; - - if self.is_banned(peer.info.addr.clone()) { - return Err(Error::Banned); + let peer_data: PeerData; + { + // Scope for peers vector lock - dont hold the peers lock while adding to lmdb + let mut peers = self.peers.try_write_for(LOCK_TIMEOUT).ok_or_else(|| { + error!("add_connected: failed to get peers lock"); + Error::Timeout + })?; + peer_data = PeerData { + addr: peer.info.addr, + capabilities: peer.info.capabilities, + user_agent: peer.info.user_agent.clone(), + flags: State::Healthy, + last_banned: 0, + ban_reason: ReasonForBan::None, + last_connected: Utc::now().timestamp(), + }; + debug!("Adding newly connected peer {}.", peer_data.addr); + peers.insert(peer_data.addr, peer); } - let peer_data = PeerData { - addr: peer.info.addr.clone(), - capabilities: peer.info.capabilities, - user_agent: peer.info.user_agent.clone(), - flags: State::Healthy, - last_banned: 0, - ban_reason: ReasonForBan::None, - last_connected: Utc::now().timestamp(), - }; debug!("Saving newly connected peer {}.", peer_data.addr); - self.save_peer(&peer_data)?; - peers.insert(peer_data.addr, peer); - + if let Err(e) = self.save_peer(&peer_data) { + error!("Could not save connected peer address: {:?}", e); + } Ok(()) } @@ -151,8 +153,10 @@ impl Peers { } /// Ban a peer, disconnecting it if we're currently connected pub fn ban_peer(&self, peer_addr: PeerAddr, ban_reason: ReasonForBan) -> Result<(), Error> { + // Update the peer in peers db self.update_state(peer_addr.clone(), State::Banned)?; + // Update the peer in the peers Vec match self.get_connected_peer(peer_addr.clone()) { Some(peer) => { info!("Banning peer {}, ban_reason {:?}", peer_addr, ban_reason); @@ -310,6 +314,11 @@ impl Peers { self.store.save_peer(p).map_err(From::from) } + /// Saves updated information about mulitple peers in batch + pub fn save_peers(&self, p: Vec) -> Result<(), Error> { + self.store.save_peers(p).map_err(From::from) + } + /// Updates the state of a peer in store pub fn update_state(&self, peer_addr: PeerAddr, new_state: State) -> Result<(), Error> { self.store @@ -677,6 +686,7 @@ impl NetAdapter for Peers { /// A list of peers has been received from one of our peers. fn peer_addrs_received(&self, peer_addrs: Vec) { trace!("Received {} peer addrs, saving.", peer_addrs.len()); + let mut to_save: Vec = Vec::new(); for pa in peer_addrs { if let Ok(e) = self.exists_peer(pa.clone()) { if e { @@ -692,9 +702,10 @@ impl NetAdapter for Peers { ban_reason: ReasonForBan::None, last_connected: Utc::now().timestamp(), }; - if let Err(e) = self.save_peer(&peer) { - error!("Could not save received peer address: {:?}", e); - } + to_save.push(peer); + } + if let Err(e) = self.save_peers(to_save) { + error!("Could not save received peer addresses: {:?}", e); } } diff --git a/p2p/src/store.rs b/p2p/src/store.rs index 4e2145693a..5492ba62f1 100644 --- a/p2p/src/store.rs +++ b/p2p/src/store.rs @@ -139,6 +139,15 @@ impl PeerStore { batch.commit() } + pub fn save_peers(&self, p: Vec) -> Result<(), Error> { + let batch = self.db.batch()?; + for pd in p { + debug!("save_peers: {:?} marked {:?}", pd.addr, pd.flags); + batch.put_ser(&peer_key(pd.addr)[..], &pd)?; + } + batch.commit() + } + pub fn get_peer(&self, peer_addr: PeerAddr) -> Result { option_to_not_found(self.db.get_ser(&peer_key(peer_addr.clone())[..]), || { format!("Peer at address: {}", peer_addr) From b805ae3015d059852b3dc6e384f665f17fbcab79 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:25:08 -0700 Subject: [PATCH 28/96] grin v5.3 (0041) Refactor prune file replace (#3571) * split prune file rewrite into two steps only one needs a mut ref to self * write both tmp files then replace --- store/src/pmmr.rs | 22 ++++++++++----- store/src/types.rs | 67 ++++++++++++++++++++++++++-------------------- 2 files changed, 53 insertions(+), 36 deletions(-) diff --git a/store/src/pmmr.rs b/store/src/pmmr.rs index b5d4d2e386..07ac444121 100644 --- a/store/src/pmmr.rs +++ b/store/src/pmmr.rs @@ -392,17 +392,17 @@ impl PMMRBackend { // on the cutoff_pos provided. let (leaves_removed, pos_to_rm) = self.pos_to_rm(cutoff_pos, rewind_rm_pos); - // 1. Save compact copy of the hash file, skipping removed data. + // Save compact copy of the hash file, skipping removed data. { let pos_to_rm = map_vec!(pos_to_rm, |pos1| { let shift = self.prune_list.get_shift(pos1 as u64 - 1); pos1 as u64 - shift }); - self.hash_file.save_prune(&pos_to_rm)?; + self.hash_file.write_tmp_pruned(&pos_to_rm)?; } - // 2. Save compact copy of the data file, skipping removed leaves. + // Save compact copy of the data file, skipping removed leaves. { let leaf_pos_to_rm = pos_to_rm .iter() @@ -416,10 +416,19 @@ impl PMMRBackend { flat_pos - shift }); - self.data_file.save_prune(&pos_to_rm)?; + self.data_file.write_tmp_pruned(&pos_to_rm)?; } - // 3. Update the prune list and write to disk. + // Replace hash and data files with compact copies. + // Rebuild and intialize from the new files. + { + debug!("compact: about to replace hash and data files and rebuild..."); + self.hash_file.replace_with_tmp()?; + self.data_file.replace_with_tmp()?; + debug!("compact: ...finished replacing and rebuilding"); + } + + // Update the prune list and write to disk. { let mut bitmap = self.prune_list.bitmap(); bitmap.or_inplace(&leaves_removed); @@ -427,11 +436,10 @@ impl PMMRBackend { self.prune_list.flush()?; } - // 4. Write the leaf_set to disk. + // Write the leaf_set to disk. // Optimize the bitmap storage in the process. self.leaf_set.flush()?; - // 5. cleanup rewind files self.clean_rewind_files()?; Ok(true) diff --git a/store/src/types.rs b/store/src/types.rs index 307518dc92..f5a5ed1d5d 100644 --- a/store/src/types.rs +++ b/store/src/types.rs @@ -154,10 +154,16 @@ where } /// Write the file out to disk, pruning removed elements. - pub fn save_prune(&mut self, prune_pos: &[u64]) -> io::Result<()> { + pub fn write_tmp_pruned(&self, prune_pos: &[u64]) -> io::Result<()> { // Need to convert from 1-index to 0-index (don't ask). let prune_idx: Vec<_> = prune_pos.iter().map(|x| x - 1).collect(); - self.file.save_prune(prune_idx.as_slice()) + self.file.write_tmp_pruned(prune_idx.as_slice()) + } + + /// Replace with file at tmp path. + /// Rebuild and initialize from new file. + pub fn replace_with_tmp(&mut self) -> io::Result<()> { + self.file.replace_with_tmp() } } @@ -489,40 +495,43 @@ where Ok(file) } + fn tmp_path(&self) -> PathBuf { + self.path.with_extension("tmp") + } + /// Saves a copy of the current file content, skipping data at the provided /// prune positions. prune_pos must be ordered. - pub fn save_prune(&mut self, prune_pos: &[u64]) -> io::Result<()> { - let tmp_path = self.path.with_extension("tmp"); - - // Scope the reader and writer to within the block so we can safely replace files later on. - { - let reader = File::open(&self.path)?; - let mut buf_reader = BufReader::new(reader); - let mut streaming_reader = StreamingReader::new(&mut buf_reader, self.version); - - let mut buf_writer = BufWriter::new(File::create(&tmp_path)?); - let mut bin_writer = BinWriter::new(&mut buf_writer, self.version); - - let mut current_pos = 0; - let mut prune_pos = prune_pos; - while let Ok(elmt) = T::read(&mut streaming_reader) { - if prune_pos.contains(¤t_pos) { - // Pruned pos, moving on. - prune_pos = &prune_pos[1..]; - } else { - // Not pruned, write to file. - elmt.write(&mut bin_writer).map_err(|e| { - io::Error::new(io::ErrorKind::Other, format!("Fail to write prune, {}", e)) - })?; - } - current_pos += 1; + pub fn write_tmp_pruned(&self, prune_pos: &[u64]) -> io::Result<()> { + let reader = File::open(&self.path)?; + let mut buf_reader = BufReader::new(reader); + let mut streaming_reader = StreamingReader::new(&mut buf_reader, self.version); + + let mut buf_writer = BufWriter::new(File::create(&self.tmp_path())?); + let mut bin_writer = BinWriter::new(&mut buf_writer, self.version); + + let mut current_pos = 0; + let mut prune_pos = prune_pos; + while let Ok(elmt) = T::read(&mut streaming_reader) { + if prune_pos.contains(¤t_pos) { + // Pruned pos, moving on. + prune_pos = &prune_pos[1..]; + } else { + // Not pruned, write to file. + elmt.write(&mut bin_writer) + .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; } - buf_writer.flush()?; + current_pos += 1; } + buf_writer.flush()?; + Ok(()) + } + /// Replace the underlying file with the file at tmp path. + /// Rebuild and initialize from the new file. + pub fn replace_with_tmp(&mut self) -> io::Result<()> { // Replace the underlying file - // pmmr_data.tmp -> pmmr_data.bin - self.replace(&tmp_path)?; + self.replace(&self.tmp_path())?; // Now rebuild our size file to reflect the pruned data file. // This will replace the underlying file internally. From d971853eac96dc831957106b183f4da50f63598a Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:27:29 -0700 Subject: [PATCH 29/96] grin v5.3 (0042) add BLOCK_HIST capabilities on startup if config archive_mode=true (#3563) --- p2p/src/types.rs | 2 ++ servers/src/grin/server.rs | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/p2p/src/types.rs b/p2p/src/types.rs index adc8c59a31..9eb9d5c142 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -489,6 +489,8 @@ bitflags! { const TOR_ADDRESS = 0b0001_0000; /// Can provide PIBD segments during initial byte download (fast sync). const PIBD_HIST = 0b0010_0000; + /// Can provide historical blocks for archival sync. + const BLOCK_HIST = 0b0100_0000; } } diff --git a/servers/src/grin/server.rs b/servers/src/grin/server.rs index b08bd5e28e..710ed8efe4 100644 --- a/servers/src/grin/server.rs +++ b/servers/src/grin/server.rs @@ -508,9 +508,13 @@ impl Server { })?; } - // Use our default capabilities here. - // We will advertize these to our peers during hand/shake. - let capabilities = Capabilities::default(); + // Initialize our capabilities. + // Currently either "default" or with optional "archive_mode" (block history) support enabled. + let capabilities = if let Some(true) = config.archive_mode { + Capabilities::default() | Capabilities::BLOCK_HIST + } else { + Capabilities::default() + }; debug!("Capabilities: {:?}", capabilities); let p2p_server = Arc::new(p2p::Server::new( From d5e44322c73c7373a6816a7b9056da41e267ed30 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 10 Jun 2024 18:43:48 -0700 Subject: [PATCH 30/96] grin v5.3 (0043) Retire pruned cache (#3573) --- core/tests/pmmr.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/tests/pmmr.rs b/core/tests/pmmr.rs index ff1e493d33..603948fe5f 100644 --- a/core/tests/pmmr.rs +++ b/core/tests/pmmr.rs @@ -100,6 +100,18 @@ fn test_bintree_range() { assert_eq!(pmmr::bintree_range(6), 0..7); } +#[test] +fn test_bintree_range() { + assert_eq!(pmmr::bintree_range(0), 0..1); + assert_eq!(pmmr::bintree_range(1), 1..2); + assert_eq!(pmmr::bintree_range(2), 2..3); + assert_eq!(pmmr::bintree_range(3), 1..4); + assert_eq!(pmmr::bintree_range(4), 4..5); + assert_eq!(pmmr::bintree_range(5), 5..6); + assert_eq!(pmmr::bintree_range(6), 4..7); + assert_eq!(pmmr::bintree_range(7), 1..8); +} + // The pos of the rightmost leaf for the provided MMR size (last leaf in subtree). #[test] fn test_bintree_rightmost() { From 1d8b31f6738ef3186ff7fe5316a71fd351f4b7d0 Mon Sep 17 00:00:00 2001 From: bayk Date: Tue, 11 Jun 2024 21:49:35 -0700 Subject: [PATCH 31/96] grin v5.3 (0043) Fix build issues --- p2p/src/peers.rs | 5 ++--- p2p/src/store.rs | 2 +- store/src/types.rs | 8 ++++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index c21c7b3e6a..ffc67a8f9a 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -75,7 +75,7 @@ impl Peers { Error::Timeout })?; peer_data = PeerData { - addr: peer.info.addr, + addr: peer.info.addr.clone(), capabilities: peer.info.capabilities, user_agent: peer.info.user_agent.clone(), flags: State::Healthy, @@ -84,9 +84,8 @@ impl Peers { last_connected: Utc::now().timestamp(), }; debug!("Adding newly connected peer {}.", peer_data.addr); - peers.insert(peer_data.addr, peer); + peers.insert(peer_data.addr.clone(), peer); } - debug!("Saving newly connected peer {}.", peer_data.addr); if let Err(e) = self.save_peer(&peer_data) { error!("Could not save connected peer address: {:?}", e); } diff --git a/p2p/src/store.rs b/p2p/src/store.rs index 5492ba62f1..33e3274635 100644 --- a/p2p/src/store.rs +++ b/p2p/src/store.rs @@ -143,7 +143,7 @@ impl PeerStore { let batch = self.db.batch()?; for pd in p { debug!("save_peers: {:?} marked {:?}", pd.addr, pd.flags); - batch.put_ser(&peer_key(pd.addr)[..], &pd)?; + batch.put_ser(&peer_key(pd.addr.clone())[..], &pd)?; } batch.commit() } diff --git a/store/src/types.rs b/store/src/types.rs index f5a5ed1d5d..a397421cc7 100644 --- a/store/src/types.rs +++ b/store/src/types.rs @@ -517,8 +517,12 @@ where prune_pos = &prune_pos[1..]; } else { // Not pruned, write to file. - elmt.write(&mut bin_writer) - .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; + elmt.write(&mut bin_writer).map_err(|e| { + io::Error::new( + io::ErrorKind::Other, + format!("Fail to write at write_tmp_pruned, {}", e), + ) + })?; } current_pos += 1; } From 31931c7d7b511ca7969e31ddf8455474190ea9d0 Mon Sep 17 00:00:00 2001 From: bayk Date: Wed, 12 Jun 2024 20:56:21 -0700 Subject: [PATCH 32/96] grin v5.3 (0048) more consistent handling of peers_preferred during startup (#3578) --- p2p/src/msg.rs | 34 ++++++++++++++++++ p2p/src/peers.rs | 5 ++- servers/src/grin/seed.rs | 71 +++++++++++++++++++++----------------- servers/src/grin/server.rs | 11 ++---- 4 files changed, 80 insertions(+), 41 deletions(-) diff --git a/p2p/src/msg.rs b/p2p/src/msg.rs index d57de76706..cb7d9e25e0 100644 --- a/p2p/src/msg.rs +++ b/p2p/src/msg.rs @@ -555,6 +555,40 @@ impl Readable for PeerAddrs { } } +impl IntoIterator for PeerAddrs { + type Item = PeerAddr; + type IntoIter = std::vec::IntoIter; + fn into_iter(self) -> Self::IntoIter { + self.peers.into_iter() + } +} + +impl Default for PeerAddrs { + fn default() -> Self { + PeerAddrs { peers: vec![] } + } +} + +impl PeerAddrs { + pub fn as_slice(&self) -> &[PeerAddr] { + self.peers.as_slice() + } + + pub fn contains(&self, addr: &PeerAddr) -> bool { + self.peers.contains(addr) + } + + pub fn difference(&self, other: &[PeerAddr]) -> PeerAddrs { + let peers = self + .peers + .iter() + .filter(|x| !other.contains(x)) + .cloned() + .collect(); + PeerAddrs { peers } + } +} + /// We found some issue in the communication, sending an error back, usually /// followed by closing the connection. pub struct PeerError { diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index ffc67a8f9a..288dd15067 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -27,6 +27,7 @@ use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::{OutputIdentifier, Segment, SegmentIdentifier, TxKernel}; use crate::core::global; use crate::core::pow::Difficulty; +use crate::msg::PeerAddrs; use crate::peer::Peer; use crate::store::{PeerData, PeerStore, State}; use crate::types::{ @@ -332,8 +333,10 @@ impl Peers { &self, max_inbound_count: usize, max_outbound_count: usize, - preferred_peers: &[PeerAddr], + config: P2PConfig, ) { + let preferred_peers = config.peers_preferred.unwrap_or(PeerAddrs::default()); + let mut rm = vec![]; // build a list of peers to be cleaned up diff --git a/servers/src/grin/seed.rs b/servers/src/grin/seed.rs index a044b533b2..86cc1741c5 100644 --- a/servers/src/grin/seed.rs +++ b/servers/src/grin/seed.rs @@ -21,6 +21,7 @@ use crate::core::pow::Difficulty; use chrono::prelude::{DateTime, Utc}; use chrono::{Duration, MIN_DATE}; use grin_p2p::PeerAddr::Onion; +use grin_p2p::{msg::PeerAddrs, P2PConfig}; use rand::prelude::*; use std::collections::HashMap; use std::net::ToSocketAddrs; @@ -38,12 +39,10 @@ use crate::util::StopState; pub fn connect_and_monitor( p2p_server: Arc, seed_list: Box Vec + Send>, - preferred_peers: &[PeerAddr], + config: P2PConfig, stop_state: Arc, header_cache_size: u64, ) -> std::io::Result> { - let preferred_peers = preferred_peers.to_vec(); - thread::Builder::new() .name("seed".to_string()) .spawn(move || { @@ -56,11 +55,11 @@ pub fn connect_and_monitor( let seed_list = seed_list(); // check seeds first - connect_to_seeds_and_preferred_peers( + connect_to_seeds_and_peers( peers.clone(), tx.clone(), seed_list.clone(), - &preferred_peers, + config.clone(), ); libp2p_connection::set_seed_list(&seed_list, true); @@ -89,11 +88,11 @@ pub fn connect_and_monitor( if connected_peers == 0 { info!("No peers connected, trying to reconnect to seeds!"); - connect_to_seeds_and_preferred_peers( + connect_to_seeds_and_peers( peers.clone(), tx.clone(), seed_list.clone(), - &preferred_peers, + config.clone(), ); thread::sleep(time::Duration::from_secs(1)); @@ -137,12 +136,7 @@ pub fn connect_and_monitor( } // monitor additional peers if we need to add more - monitor_peers( - peers.clone(), - p2p_server.config.clone(), - tx.clone(), - &preferred_peers, - ); + monitor_peers(peers.clone(), p2p_server.config.clone(), tx.clone()); } if peer_count == 0 { @@ -167,12 +161,7 @@ pub fn connect_and_monitor( }) } -fn monitor_peers( - peers: Arc, - config: p2p::P2PConfig, - tx: mpsc::Sender, - preferred_peers: &[PeerAddr], -) { +fn monitor_peers(peers: Arc, config: p2p::P2PConfig, tx: mpsc::Sender) { // regularly check if we need to acquire more peers and if so, gets // them from db let mut total_count = 0; @@ -225,7 +214,7 @@ fn monitor_peers( peers.clean_peers( config.peer_max_inbound_count() as usize, config.peer_max_outbound_count() as usize, - preferred_peers, + config.clone(), ); if peers.enough_outbound_peers() { @@ -251,13 +240,14 @@ fn monitor_peers( } // Attempt to connect to any preferred peers. - for p in preferred_peers { + let peers_preferred = config.peers_preferred.unwrap_or(PeerAddrs::default()); + for p in peers_preferred { if !connected_peers.is_empty() { - if !connected_peers.contains(p) { - tx.send(p.clone()).unwrap(); + if !connected_peers.contains(&p) { + let _ = tx.send(p); } } else { - tx.send(p.clone()).unwrap(); + let _ = tx.send(p); } } @@ -291,33 +281,50 @@ fn monitor_peers( // Check if we have any pre-existing peer in db. If so, start with those, // otherwise use the seeds provided. -fn connect_to_seeds_and_preferred_peers( +fn connect_to_seeds_and_peers( peers: Arc, tx: mpsc::Sender, seed_list: Vec, - peers_preferred: &[PeerAddr], + config: P2PConfig, ) { + let peers_deny = config.peers_deny.unwrap_or(PeerAddrs::default()); + + // If "peers_allow" is explicitly configured then just use this list + // remembering to filter out "peers_deny". + if let Some(peers) = config.peers_allow { + for addr in peers.difference(peers_deny.as_slice()) { + let _ = tx.send(addr); + } + return; + } + + // Always try our "peers_preferred" remembering to filter out "peers_deny". + if let Some(peers) = config.peers_preferred { + for addr in peers.difference(peers_deny.as_slice()) { + let _ = tx.send(addr); + } + } + // check if we have some peers in db // look for peers that are able to give us other peers (via PEER_LIST capability) let peers = peers.find_peers(p2p::State::Healthy, p2p::Capabilities::PEER_LIST, 100); // if so, get their addresses, otherwise use our seeds - let mut peer_addrs = if peers.len() > 3 { + let peer_addrs = if peers.len() > 3 { peers.iter().map(|p| p.addr.clone()).collect::>() } else { seed_list }; - // If we have preferred peers add them to the initial list - peer_addrs.extend_from_slice(peers_preferred); - if peer_addrs.is_empty() { warn!("No seeds were retrieved."); } - // connect to this first set of addresses + // connect to this initial set of peer addresses (either seeds or from our local db). for addr in peer_addrs { - tx.send(addr).unwrap(); + if !peers_deny.as_slice().contains(&addr) { + let _ = tx.send(addr); + } } } diff --git a/servers/src/grin/server.rs b/servers/src/grin/server.rs index 710ed8efe4..8cca8e2395 100644 --- a/servers/src/grin/server.rs +++ b/servers/src/grin/server.rs @@ -536,7 +536,7 @@ impl Server { let mut connect_thread = None; if config.p2p_config.seeding_type != p2p::Seeding::Programmatic { - let seeder = match config.p2p_config.seeding_type { + let seed_list = match config.p2p_config.seeding_type { p2p::Seeding::None => { warn!("No seed configured, will stay solo until connected to"); seed::predefined_seeds(vec![]) @@ -553,15 +553,10 @@ impl Server { _ => unreachable!(), }; - let preferred_peers = match &config.p2p_config.peers_preferred { - Some(addrs) => addrs.peers.clone(), - None => vec![], - }; - connect_thread = Some(seed::connect_and_monitor( p2p_server.clone(), - seeder, - &preferred_peers, + seed_list, + config.p2p_config.clone(), stop_state.clone(), header_cache_size, )?); From 2ea7a6b20de7d874c378c73e83ef7cf2846b6a53 Mon Sep 17 00:00:00 2001 From: bayk Date: Wed, 12 Jun 2024 21:02:57 -0700 Subject: [PATCH 33/96] grin v5.3 (0049) Update to cursive 0.16 (#3547) * Update to cursive 0.16 * Switch to upstream table view * Use TableView::set_items_stable --- Cargo.lock | 185 +++---- Cargo.toml | 4 +- src/bin/tui/mining.rs | 6 +- src/bin/tui/mod.rs | 1 - src/bin/tui/peers.rs | 4 +- src/bin/tui/table.rs | 1068 ----------------------------------------- src/bin/tui/ui.rs | 7 +- 7 files changed, 77 insertions(+), 1198 deletions(-) delete mode 100644 src/bin/tui/table.rs diff --git a/Cargo.lock b/Cargo.lock index 9c32b1cb56..5cc2d88212 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,11 +73,13 @@ dependencies = [ [[package]] name = "ahash" -version = "0.4.7" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" +checksum = "796540673305a66d127804eef19ad696f1f204b8c1025aaca4958c17eab32877" dependencies = [ - "const-random", + "getrandom 0.2.3", + "once_cell", + "version_check", ] [[package]] @@ -254,7 +256,7 @@ dependencies = [ "async-global-executor", "async-io", "async-lock", - "crossbeam-utils 0.8.5", + "crossbeam-utils", "futures-channel", "futures-core", "futures-io", @@ -636,28 +638,6 @@ dependencies = [ "cache-padded", ] -[[package]] -name = "const-random" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f590d95d011aa80b063ffe3253422ed5aa462af4e9867d43ce8337562bac77c4" -dependencies = [ - "const-random-macro", - "proc-macro-hack", -] - -[[package]] -name = "const-random-macro" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615f6e27d000a2bffbc7f2f6a8669179378fa27ee4d0a509e985dfc0a7defb40" -dependencies = [ - "getrandom 0.2.3", - "lazy_static", - "proc-macro-hack", - "tiny-keccak", -] - [[package]] name = "constant_time_eq" version = "0.1.5" @@ -723,16 +703,6 @@ dependencies = [ "cc", ] -[[package]] -name = "crossbeam-channel" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" -dependencies = [ - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - [[package]] name = "crossbeam-channel" version = "0.5.1" @@ -740,7 +710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", + "crossbeam-utils", ] [[package]] @@ -751,7 +721,7 @@ checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", - "crossbeam-utils 0.8.5", + "crossbeam-utils", ] [[package]] @@ -761,23 +731,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", + "crossbeam-utils", "lazy_static", "memoffset", "scopeguard", ] -[[package]] -name = "crossbeam-utils" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -dependencies = [ - "autocfg 1.0.1", - "cfg-if 0.1.10", - "lazy_static", -] - [[package]] name = "crossbeam-utils" version = "0.8.5" @@ -864,15 +823,14 @@ dependencies = [ [[package]] name = "cursive" -version = "0.15.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ceb8704199492858fea2cedf8d9adde0db27755bc4313d771923087f30fbc6" +checksum = "6593c3409eb794bf22090bec60dda1e19d1def284478bec7e5a92da3cf977c52" dependencies = [ "ahash", - "cfg-if 0.1.10", - "crossbeam-channel 0.4.4", + "cfg-if 1.0.0", + "crossbeam-channel", "cursive_core", - "enumset", "lazy_static", "libc", "log", @@ -882,30 +840,40 @@ dependencies = [ "term_size", "unicode-segmentation", "unicode-width", + "wasmer_enumset", ] [[package]] name = "cursive_core" -version = "0.1.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158e802c91192df6ecd1b9a9f2cbb711fab744ed5ca154f8b47339b83dc5cfb2" +checksum = "025ac0bcd21ced752d27b70e6aa2285a3513d07b5a0c7f89e71121d20ca1429d" dependencies = [ "ahash", "chrono", - "crossbeam-channel 0.4.4", + "crossbeam-channel", "enum-map", - "enumset", "lazy_static", "libc", "log", "num 0.3.1", "owning_ref", - "signal-hook", + "syn 1.0.74", "unicode-segmentation", "unicode-width", + "wasmer_enumset", "xi-unicode", ] +[[package]] +name = "cursive_table_view" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d378a3626928480ca02040934e145991f6256318891c1eb7c48a502321f0cc" +dependencies = [ + "cursive_core", +] + [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -921,9 +889,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ "darling_core", "darling_macro", @@ -931,23 +899,23 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ "fnv", "ident_case", "proc-macro2 1.0.28", "quote 1.0.9", - "strsim 0.10.0", + "strsim 0.9.3", "syn 1.0.74", ] [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ "darling_core", "quote 1.0.9", @@ -1112,27 +1080,6 @@ dependencies = [ "num-traits 0.1.43", ] -[[package]] -name = "enumset" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e76129da36102af021b8e5000dab2c1c30dbef85c1e482beeff8da5dde0e0b0" -dependencies = [ - "enumset_derive", -] - -[[package]] -name = "enumset_derive" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" -dependencies = [ - "darling", - "proc-macro2 1.0.28", - "quote 1.0.9", - "syn 1.0.74", -] - [[package]] name = "env_logger" version = "0.7.1" @@ -2493,12 +2440,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - [[package]] name = "memchr" version = "2.4.0" @@ -2666,6 +2607,7 @@ dependencies = [ "clap", "ctrlc", "cursive", + "cursive_table_view", "failure", "failure_derive", "futures 0.3.21", @@ -3220,12 +3162,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - [[package]] name = "proc-macro2" version = "0.4.30" @@ -3537,9 +3473,9 @@ version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ - "crossbeam-channel 0.5.1", + "crossbeam-channel", "crossbeam-deque", - "crossbeam-utils 0.8.5", + "crossbeam-utils", "lazy_static", "num_cpus", ] @@ -3650,7 +3586,7 @@ dependencies = [ "base64 0.13.0", "blake2b_simd", "constant_time_eq", - "crossbeam-utils 0.8.5", + "crossbeam-utils", ] [[package]] @@ -3890,9 +3826,9 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.1.17" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", @@ -4018,9 +3954,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "strsim" -version = "0.10.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "subtle" @@ -4189,15 +4125,6 @@ dependencies = [ "chrono", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinyvec" version = "1.3.1" @@ -4668,6 +4595,28 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmer_enumset" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf088cc1f7d247fd96dff0df46fb1bbb747d8a69ae1ecd71aed55c55e354b2d8" +dependencies = [ + "num-traits 0.2.14", + "wasmer_enumset_derive", +] + +[[package]] +name = "wasmer_enumset_derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1b32d98e11194200baf6d3f85eb2d6cfe56f6d9af0dd617f90ca48f958a88" +dependencies = [ + "darling", + "proc-macro2 1.0.28", + "quote 1.0.9", + "syn 1.0.74", +] + [[package]] name = "web-sys" version = "0.3.52" @@ -4792,9 +4741,9 @@ dependencies = [ [[package]] name = "xi-unicode" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e71b85d8b1b8bfaf4b5c834187554d201a8cd621c2bbfa33efd41a3ecabd48b2" +checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" [[package]] name = "yaml-rust" diff --git a/Cargo.toml b/Cargo.toml index 71fbdd2643..61a98500b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ log = "0.4" serde = "1" serde_json = "1" term = "0.6" - +cursive_table_view = "0.13.2" grin_api = { path = "./api", version = "5.1.0" } grin_config = { path = "./config", version = "5.1.0" } @@ -44,7 +44,7 @@ grin_servers = { path = "./servers", version = "5.1.0" } grin_util = { path = "./util", version = "5.1.0" } [dependencies.cursive] -version = "0.15" +version = "0.16" default-features = false features = ["pancurses-backend"] diff --git a/src/bin/tui/mining.rs b/src/bin/tui/mining.rs index 75e0f675d6..e10ee14ee0 100644 --- a/src/bin/tui/mining.rs +++ b/src/bin/tui/mining.rs @@ -34,7 +34,7 @@ use crate::tui::constants::{ use crate::tui::types::TUIStatusListener; use crate::servers::{DiffBlock, ServerStats, WorkerStats}; -use crate::tui::table::{TableView, TableViewItem}; +use cursive_table_view::{TableView, TableViewItem}; #[derive(Copy, Clone, PartialEq, Eq, Hash)] enum StratumWorkerColumn { @@ -334,7 +334,7 @@ impl TUIStatusListener for TUIMiningView { let _ = c.call_on_name( TABLE_MINING_DIFF_STATUS, |t: &mut TableView| { - t.set_items(diff_stats); + t.set_items_stable(diff_stats); }, ); let stratum_stats = &stats.stratum_stats; @@ -396,7 +396,7 @@ impl TUIStatusListener for TUIMiningView { let _ = c.call_on_name( TABLE_MINING_STATUS, |t: &mut TableView| { - t.set_items(worker_stats); + t.set_items_stable(worker_stats); }, ); } diff --git a/src/bin/tui/mod.rs b/src/bin/tui/mod.rs index 367db379c4..8a2f98575e 100644 --- a/src/bin/tui/mod.rs +++ b/src/bin/tui/mod.rs @@ -22,7 +22,6 @@ mod menu; mod mining; mod peers; mod status; -pub mod table; mod types; pub mod ui; mod version; diff --git a/src/bin/tui/peers.rs b/src/bin/tui/peers.rs index 672d1cc6d0..2909e99aec 100644 --- a/src/bin/tui/peers.rs +++ b/src/bin/tui/peers.rs @@ -29,8 +29,8 @@ use cursive::views::{Dialog, LinearLayout, OnEventView, ResizedView, TextView}; use cursive::Cursive; use crate::tui::constants::{MAIN_MENU, TABLE_PEER_STATUS, VIEW_PEER_SYNC}; -use crate::tui::table::{TableView, TableViewItem}; use crate::tui::types::TUIStatusListener; +use cursive_table_view::{TableView, TableViewItem}; #[derive(Copy, Clone, PartialEq, Eq, Hash)] pub enum PeerColumn { @@ -190,7 +190,7 @@ impl TUIStatusListener for TUIPeerView { let _ = c.call_on_name( TABLE_PEER_STATUS, |t: &mut TableView| { - t.set_items(stats.peer_stats.clone()); + t.set_items_stable(stats.peer_stats.clone()); }, ); let _ = c.call_on_name("peers_total", |t: &mut TextView| { diff --git a/src/bin/tui/table.rs b/src/bin/tui/table.rs deleted file mode 100644 index 694452069a..0000000000 --- a/src/bin/tui/table.rs +++ /dev/null @@ -1,1068 +0,0 @@ -// Copyright 2020 The Grin Developers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Copyright (c) 2015-2017 Ivo Wetzel -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -//! Adapted from https://github.com/behnam/rust-cursive-table-view -//! A basic table view implementation for [cursive](https://crates.io/crates/cursive). - -#![deny( - missing_docs, - missing_copy_implementations, - trivial_casts, - trivial_numeric_casts, - unsafe_code, - unused_import_braces, - unused_qualifications -)] - -// Crate Dependencies --------------------------------------------------------- -use cursive; - -// STD Dependencies ----------------------------------------------------------- -use std::cmp::{self, Ordering}; -use std::collections::HashMap; -use std::hash::Hash; -use std::rc::Rc; - -// External Dependencies ------------------------------------------------------ -use cursive::align::HAlign; -use cursive::direction::Direction; -use cursive::event::{Callback, Event, EventResult, Key}; -use cursive::theme::ColorStyle; -use cursive::theme::PaletteColor::{Highlight, HighlightInactive, Primary}; -use cursive::vec::Vec2; -use cursive::view::{ScrollBase, View}; -use cursive::With; -use cursive::{Cursive, Printer}; - -/// A trait for displaying and sorting items inside a -/// [`TableView`](struct.TableView.html). -pub trait TableViewItem: Clone + Sized -where - H: Eq + Hash + Copy + Clone + 'static, -{ - /// Method returning a string representation of the item for the - /// specified column from type `H`. - fn to_column(&self, column: H) -> String; - - /// Method comparing two items via their specified column from type `H`. - fn cmp(&self, other: &Self, column: H) -> Ordering - where - Self: Sized; -} - -/// View to select an item among a list, supporting multiple columns for -/// sorting. -/// -/// # Examples -/// -/// ```rust -/// # extern crate cursive; -/// # extern crate cursive_table_view; -/// # use std::cmp::Ordering; -/// # use cursive_table_view::{TableView, TableViewItem}; -/// # use cursive::align::HAlign; -/// # fn main() { -/// // Provide a type for the table's columns -/// #[derive(Copy, Clone, PartialEq, Eq, Hash)] -/// enum BasicColumn { -/// Name, -/// Count, -/// Rate -/// } -/// -/// // Define the item type -/// #[derive(Clone, Debug)] -/// struct Foo { -/// name: String, -/// count: usize, -/// rate: usize -/// } -/// -/// impl TableViewItem for Foo { -/// -/// fn to_column(&self, column: BasicColumn) -> String { -/// match column { -/// BasicColumn::Name => self.name.to_string(), -/// BasicColumn::Count => format!("{}", self.count), -/// BasicColumn::Rate => format!("{}", self.rate) -/// } -/// } -/// -/// fn cmp(&self, other: &Self, column: BasicColumn) -> Ordering where Self: Sized { -/// match column { -/// BasicColumn::Name => self.name.cmp(&other.name), -/// BasicColumn::Count => self.count.cmp(&other.count), -/// BasicColumn::Rate => self.rate.cmp(&other.rate) -/// } -/// } -/// -/// } -/// -/// // Configure the actual table -/// let table = TableView::::new() -/// .column(BasicColumn::Name, "Name", |c| c.width(20)) -/// .column(BasicColumn::Count, "Count", |c| c.align(HAlign::Center)) -/// .column(BasicColumn::Rate, "Rate", |c| { -/// c.ordering(Ordering::Greater).align(HAlign::Right).width(20) -/// }) -/// .default_column(BasicColumn::Name); -/// # } -/// ``` -pub struct TableView + PartialEq, H: Eq + Hash + Copy + Clone + 'static> { - enabled: bool, - scrollbase: ScrollBase, - last_size: Vec2, - - column_select: bool, - columns: Vec>, - column_indices: HashMap, - - focus: usize, - items: Vec, - rows_to_items: Vec, - - on_sort: Option>, - // TODO Pass drawing offsets into the handlers so a popup menu - // can be created easily? - on_submit: Option>, - on_select: Option>, -} - -impl + PartialEq, H: Eq + Hash + Copy + Clone + 'static> TableView { - /// Creates a new empty `TableView` without any columns. - /// - /// A TableView should be accompanied by a enum of type `H` representing - /// the table columns. - pub fn new() -> Self { - Self { - enabled: true, - scrollbase: ScrollBase::new(), - last_size: Vec2::new(0, 0), - - column_select: false, - columns: Vec::new(), - column_indices: HashMap::new(), - - focus: 0, - items: Vec::new(), - rows_to_items: Vec::new(), - - on_sort: None, - on_submit: None, - on_select: None, - } - } - - /// Adds a column for the specified table column from type `H` along with - /// a title for its visual display. - /// - /// The provided callback can be used to further configure the - /// created [`TableColumn`](struct.TableColumn.html). - pub fn column, C: FnOnce(TableColumn) -> TableColumn>( - mut self, - column: H, - title: S, - callback: C, - ) -> Self { - self.column_indices.insert(column, self.columns.len()); - self.columns - .push(callback(TableColumn::new(column, title.into()))); - - // Make the first column the default one - if self.columns.len() == 1 { - self.default_column(column) - } else { - self - } - } - - /// Sets the initially active column of the table. - pub fn default_column(mut self, column: H) -> Self { - if self.column_indices.contains_key(&column) { - for c in &mut self.columns { - c.selected = c.column == column; - if c.selected { - c.order = c.default_order; - } else { - c.order = Ordering::Equal; - } - } - } - self - } - - /// Sorts the table using the specified table `column` and the passed - /// `order`. - pub fn sort_by(&mut self, column: H, order: Ordering) { - if self.column_indices.contains_key(&column) { - for c in &mut self.columns { - if c.column == column { - c.order = order; - } else { - c.order = Ordering::Equal; - } - } - } - - self.sort_items(column, order); - } - - /// Sorts the table using the currently active column and its - /// ordering. - pub fn sort(&mut self) { - if let Some((column, order)) = self.order() { - self.sort_items(column, order); - } - } - - /// Returns the currently active column that is used for sorting - /// along with its ordering. - /// - /// Might return `None` if there are currently no items in the table - /// and it has not been sorted yet. - pub fn order(&self) -> Option<(H, Ordering)> { - for c in &self.columns { - if c.order != Ordering::Equal { - return Some((c.column, c.order)); - } - } - None - } - - /// Disables this view. - /// - /// A disabled view cannot be selected. - pub fn disable(&mut self) { - self.enabled = false; - } - - /// Re-enables this view. - pub fn enable(&mut self) { - self.enabled = true; - } - - /// Enable or disable this view. - pub fn set_enabled(&mut self, enabled: bool) { - self.enabled = enabled; - } - - /// Returns `true` if this view is enabled. - pub fn is_enabled(&self) -> bool { - self.enabled - } - - /// Sets a callback to be used when a selected column is sorted by - /// pressing ``. - /// - /// # Example - /// - /// ```norun - /// rt(|siv: &mut Cursive, column: BasicColumn, order: Ordering| {}); - /// ``` - pub fn set_on_sort(&mut self, cb: F) - where - F: Fn(&mut Cursive, H, Ordering) + 'static, - { - self.on_sort = Some(Rc::new(move |s, h, o| cb(s, h, o))); - } - - /// Sets a callback to be used when a selected column is sorted by - /// pressing ``. - /// - /// Chainable variant. - /// - /// # Example - /// - /// ```norun - /// siv: &mut Cursive, column: BasicColumn, order: Ordering| {}); - /// ``` - pub fn on_sort(self, cb: F) -> Self - where - F: Fn(&mut Cursive, H, Ordering) + 'static, - { - self.with(|t| t.set_on_sort(cb)) - } - - /// Sets a callback to be used when `` is pressed while an item - /// is selected. - /// - /// Both the currently selected row and the index of the corresponding item - /// within the underlying storage vector will be given to the callback. - /// - /// # Example - /// - /// ```norun - /// bmit(|siv: &mut Cursive, row: usize, index: usize| {}); - /// ``` - pub fn set_on_submit(&mut self, cb: F) - where - F: Fn(&mut Cursive, usize, usize) + 'static, - { - self.on_submit = Some(Rc::new(move |s, row, index| cb(s, row, index))); - } - - /// Sets a callback to be used when `` is pressed while an item - /// is selected. - /// - /// Both the currently selected row and the index of the corresponding item - /// within the underlying storage vector will be given to the callback. - /// - /// Chainable variant. - /// - /// # Example - /// - /// ```norun - /// (|siv: &mut Cursive, row: usize, index: usize| {}); - /// ``` - pub fn on_submit(self, cb: F) -> Self - where - F: Fn(&mut Cursive, usize, usize) + 'static, - { - self.with(|t| t.set_on_submit(cb)) - } - - /// Sets a callback to be used when an item is selected. - /// - /// Both the currently selected row and the index of the corresponding item - /// within the underlying storage vector will be given to the callback. - /// - /// # Example - /// - /// ```norun - /// lect(|siv: &mut Cursive, row: usize, index: usize| {}); - /// ``` - pub fn set_on_select(&mut self, cb: F) - where - F: Fn(&mut Cursive, usize, usize) + 'static, - { - self.on_select = Some(Rc::new(move |s, row, index| cb(s, row, index))); - } - - /// Sets a callback to be used when an item is selected. - /// - /// Both the currently selected row and the index of the corresponding item - /// within the underlying storage vector will be given to the callback. - /// - /// Chainable variant. - /// - /// # Example - /// - /// ```norun - /// (|siv: &mut Cursive, row: usize, index: usize| {}); - /// ``` - pub fn on_select(self, cb: F) -> Self - where - F: Fn(&mut Cursive, usize, usize) + 'static, - { - self.with(|t| t.set_on_select(cb)) - } - - /// Removes all items from this view. - pub fn clear(&mut self) { - self.items.clear(); - self.rows_to_items.clear(); - self.focus = 0; - } - - /// Returns the number of items in this table. - pub fn len(&self) -> usize { - self.items.len() - } - - /// Returns `true` if this table has no items. - pub fn is_empty(&self) -> bool { - self.items.is_empty() - } - - /// Returns the index of the currently selected table row. - pub fn row(&self) -> Option { - if self.items.is_empty() { - None - } else { - Some(self.focus) - } - } - - /// Selects the row at the specified index. - pub fn set_selected_row(&mut self, row_index: usize) { - self.focus = row_index; - self.scrollbase.scroll_to(row_index); - } - - /// Selects the row at the specified index. - /// - /// Chainable variant. - pub fn selected_row(self, row_index: usize) -> Self { - self.with(|t| t.set_selected_row(row_index)) - } - - /// Sets the contained items of the table. - /// - /// The currently active sort order is preserved and will be applied to all - /// items. The selected item will also be preserved. - pub fn set_items(&mut self, items: Vec) { - let mut new_location = 0; - if let Some(old_item_location) = self.item() { - let old_item = self.items.get(old_item_location).unwrap(); - for (i, new_item) in items.iter().enumerate() { - if old_item == new_item { - new_location = i; - break; - } - } - } - - self.items = items; - self.rows_to_items = Vec::with_capacity(self.items.len()); - - for i in 0..self.items.len() { - self.rows_to_items.push(i); - } - - if let Some((column, order)) = self.order() { - self.sort_by(column, order); - } - - self.scrollbase - .set_heights(self.last_size.y.saturating_sub(2), self.rows_to_items.len()); - - self.set_selected_item(new_location); - } - - /// Sets the contained items of the table. - /// - /// The order of the items will be preserved even when the table is sorted. - /// - /// Chainable variant. - pub fn items(self, items: Vec) -> Self { - self.with(|t| t.set_items(items)) - } - - /// Returns a immutable reference to the item at the specified index - /// within the underlying storage vector. - pub fn borrow_item(&mut self, index: usize) -> Option<&T> { - self.items.get(index) - } - - /// Returns a mutable reference to the item at the specified index within - /// the underlying storage vector. - pub fn borrow_item_mut(&mut self, index: usize) -> Option<&mut T> { - self.items.get_mut(index) - } - - /// Returns a immutable reference to the items contained within the table. - pub fn borrow_items(&mut self) -> &[T] { - &self.items - } - - /// Returns a mutable reference to the items contained within the table. - /// - /// Can be used to modify the items in place. - pub fn borrow_items_mut(&mut self) -> &mut [T] { - &mut self.items - } - - /// Returns the index of the currently selected item within the underlying - /// storage vector. - pub fn item(&self) -> Option { - if self.items.is_empty() || self.focus >= self.rows_to_items.len() { - None - } else { - Some(self.rows_to_items[self.focus]) - } - } - - /// Selects the item at the specified index within the underlying storage - /// vector. - pub fn set_selected_item(&mut self, item_index: usize) { - // TODO optimize the performance for very large item lists - if item_index < self.items.len() { - for (row, item) in self.rows_to_items.iter().enumerate() { - if *item == item_index { - self.focus = row; - self.scrollbase.scroll_to(row); - break; - } - } - } - } - - /// Selects the item at the specified index within the underlying storage - /// vector. - /// - /// Chainable variant. - pub fn selected_item(self, item_index: usize) -> Self { - self.with(|t| t.set_selected_item(item_index)) - } - - /// Inserts a new item into the table. - /// - /// The currently active sort order is preserved and will be applied to the - /// newly inserted item. - pub fn insert_item(&mut self, item: T) { - self.items.push(item); - self.rows_to_items.push(self.items.len()); - - self.scrollbase - .set_heights(self.last_size.y.saturating_sub(2), self.rows_to_items.len()); - - if let Some((column, order)) = self.order() { - self.sort_by(column, order); - } - } - - /// Removes the item at the specified index within the underlying storage - /// vector and returns it. - pub fn remove_item(&mut self, item_index: usize) -> Option { - if item_index < self.items.len() { - // Move the selection if the currently selected item gets removed - if let Some(selected_index) = self.item() { - if selected_index == item_index { - self.focus_up(1); - } - } - - // Remove the sorted reference to the item - self.rows_to_items.retain(|i| *i != item_index); - - // Adjust remaining references - for ref_index in &mut self.rows_to_items { - if *ref_index > item_index { - *ref_index -= 1; - } - } - - // Update scroll height to prevent out of index drawing - self.scrollbase - .set_heights(self.last_size.y.saturating_sub(2), self.rows_to_items.len()); - - // Remove actual item from the underlying storage - Some(self.items.remove(item_index)) - } else { - None - } - } - - /// Removes all items from the underlying storage and returns them. - pub fn take_items(&mut self) -> Vec { - self.scrollbase - .set_heights(self.last_size.y.saturating_sub(2), 0); - self.set_selected_row(0); - self.rows_to_items.clear(); - self.items.drain(0..).collect() - } -} - -impl + PartialEq, H: Eq + Hash + Copy + Clone + 'static> TableView { - fn draw_columns, &TableColumn)>( - &self, - printer: &Printer<'_, '_>, - sep: &str, - callback: C, - ) { - let mut column_offset = 0; - let column_count = self.columns.len(); - for (index, column) in self.columns.iter().enumerate() { - let printer = &printer.offset((column_offset, 0)).focused(true); - - callback(printer, column); - - if index < column_count - 1 { - printer.print((column.width + 1, 0), sep); - } - - column_offset += column.width + 3; - } - } - - fn sort_items(&mut self, column: H, order: Ordering) { - if !self.is_empty() { - let old_item = self.item(); - - let mut rows_to_items = self.rows_to_items.clone(); - rows_to_items.sort_by(|a, b| { - if order == Ordering::Less { - self.items[*a].cmp(&self.items[*b], column) - } else { - self.items[*b].cmp(&self.items[*a], column) - } - }); - self.rows_to_items = rows_to_items; - if let Some(o) = old_item { - self.set_selected_item(o) - } - } - } - - fn draw_item(&self, printer: &Printer<'_, '_>, i: usize) { - self.draw_columns(printer, "┆ ", |printer, column| { - let value = self.items[self.rows_to_items[i]].to_column(column.column); - column.draw_row(printer, value.as_str()); - }); - } - - fn focus_up(&mut self, n: usize) { - self.focus -= cmp::min(self.focus, n); - } - - fn focus_down(&mut self, n: usize) { - self.focus = cmp::min(self.focus + n, self.items.len() - 1); - } - - fn active_column(&self) -> usize { - self.columns.iter().position(|c| c.selected).unwrap_or(0) - } - - fn column_cancel(&mut self) { - self.column_select = false; - for column in &mut self.columns { - column.selected = column.order != Ordering::Equal; - } - } - - fn column_next(&mut self) -> bool { - let column = self.active_column(); - if column < self.columns.len() - 1 { - self.columns[column].selected = false; - self.columns[column + 1].selected = true; - true - } else { - false - } - } - - fn column_prev(&mut self) -> bool { - let column = self.active_column(); - if column > 0 { - self.columns[column].selected = false; - self.columns[column - 1].selected = true; - true - } else { - false - } - } - - fn column_select(&mut self) { - let next = self.active_column(); - let column = self.columns[next].column; - let current = self - .columns - .iter() - .position(|c| c.order != Ordering::Equal) - .unwrap_or(0); - - let order = if current != next { - self.columns[next].default_order - } else if self.columns[current].order == Ordering::Less { - Ordering::Greater - } else { - Ordering::Less - }; - - self.sort_by(column, order); - } -} - -impl + PartialEq + 'static, H: Eq + Hash + Copy + Clone + 'static> View - for TableView -{ - fn draw(&self, printer: &Printer<'_, '_>) { - self.draw_columns(printer, "╷ ", |printer, column| { - let color = if column.order != Ordering::Equal || column.selected { - if self.column_select && column.selected && self.enabled && printer.focused { - Highlight - } else { - HighlightInactive - } - } else { - Primary - }; - - printer.with_color(ColorStyle::from(color), |printer| { - column.draw_header(printer); - }); - }); - - self.draw_columns( - &printer.offset((0, 1)).focused(true), - "┴─", - |printer, column| { - printer.print_hline((0, 0), column.width + 1, "─"); - }, - ); - - let printer = &printer.offset((0, 2)).focused(true); - self.scrollbase.draw(printer, |printer, i| { - let color = if i == self.focus { - if !self.column_select && self.enabled && printer.focused { - Highlight - } else { - HighlightInactive - } - } else { - Primary - }; - - printer.with_color(ColorStyle::from(color), |printer| { - self.draw_item(printer, i); - }); - }); - } - - fn layout(&mut self, size: Vec2) { - if size == self.last_size { - return; - } - - let item_count = self.items.len(); - let column_count = self.columns.len(); - - // Split up all columns into sized / unsized groups - let (mut sized, mut usized): (Vec<&mut TableColumn>, Vec<&mut TableColumn>) = self - .columns - .iter_mut() - .partition(|c| c.requested_width.is_some()); - - // Subtract one for the separators between our columns (that's column_count - 1) - let mut available_width = size.x.saturating_sub(column_count.saturating_sub(1) * 3); - - // Reduce the with in case we are displaying a scrollbar - if size.y.saturating_sub(1) < item_count { - available_width = available_width.saturating_sub(2); - } - - // Calculate widths for all requested columns - let mut remaining_width = available_width; - for column in &mut sized { - column.width = match *column.requested_width.as_ref().unwrap() { - TableColumnWidth::Percent(width) => cmp::min( - (size.x as f32 / 100.0 * width as f32).ceil() as usize, - remaining_width, - ), - TableColumnWidth::Absolute(width) => width, - }; - remaining_width = remaining_width.saturating_sub(column.width); - } - - // Spread the remaining with across the unsized columns - let remaining_columns = usized.len(); - for column in &mut usized { - column.width = (remaining_width as f32 / remaining_columns as f32).floor() as usize; - } - - self.scrollbase - .set_heights(size.y.saturating_sub(2), item_count); - self.last_size = size; - } - - fn take_focus(&mut self, _: Direction) -> bool { - self.enabled && !self.items.is_empty() - } - - fn on_event(&mut self, event: Event) -> EventResult { - if !self.enabled { - return EventResult::Ignored; - } - - let last_focus = self.focus; - match event { - Event::Key(Key::Right) => { - if self.column_select { - if !self.column_next() { - return EventResult::Ignored; - } - } else { - self.column_select = true; - } - } - Event::Key(Key::Left) => { - if self.column_select { - if !self.column_prev() { - return EventResult::Ignored; - } - } else { - self.column_select = true; - } - } - Event::Key(Key::Up) if self.focus > 0 || self.column_select => { - if self.column_select { - self.column_cancel(); - } else { - self.focus_up(1); - } - } - Event::Key(Key::Down) if self.focus + 1 < self.items.len() || self.column_select => { - if self.column_select { - self.column_cancel(); - } else { - self.focus_down(1); - } - } - Event::Key(Key::PageUp) => { - self.column_cancel(); - self.focus_up(10); - } - Event::Key(Key::PageDown) => { - self.column_cancel(); - self.focus_down(10); - } - Event::Key(Key::Home) => { - self.column_cancel(); - self.focus = 0; - } - Event::Key(Key::End) => { - self.column_cancel(); - self.focus = self.items.len() - 1; - } - Event::Key(Key::Enter) => { - if self.column_select { - self.column_select(); - - if self.on_sort.is_some() { - let c = &self.columns[self.active_column()]; - let column = c.column; - let order = c.order; - - let cb = self.on_sort.clone().unwrap(); - return EventResult::Consumed(Some(Callback::from_fn(move |s| { - cb(s, column, order) - }))); - } - } else if !self.is_empty() && self.on_submit.is_some() { - let cb = self.on_submit.clone().unwrap(); - let row = self.row().unwrap(); - let index = self.item().unwrap(); - return EventResult::Consumed(Some(Callback::from_fn(move |s| { - cb(s, row, index) - }))); - } - } - _ => return EventResult::Ignored, - } - - let focus = self.focus; - self.scrollbase.scroll_to(focus); - - if self.column_select { - EventResult::Consumed(None) - } else if !self.is_empty() && last_focus != focus { - let row = self.row().unwrap(); - let index = self.item().unwrap(); - EventResult::Consumed( - self.on_select - .clone() - .map(|cb| Callback::from_fn(move |s| cb(s, row, index))), - ) - } else { - EventResult::Ignored - } - } -} - -/// A type used for the construction of columns in a -/// [`TableView`](struct.TableView.html). -pub struct TableColumn { - column: H, - title: String, - selected: bool, - alignment: HAlign, - order: Ordering, - width: usize, - default_order: Ordering, - requested_width: Option, -} - -enum TableColumnWidth { - Percent(usize), - Absolute(usize), -} - -impl TableColumn { - /// Sets the default ordering of the column. - pub fn ordering(mut self, order: Ordering) -> Self { - self.default_order = order; - self - } - - /// Sets the horizontal text alignment of the column. - pub fn align(mut self, alignment: HAlign) -> Self { - self.alignment = alignment; - self - } - - /// Sets how many characters of width this column will try to occupy. - pub fn width(mut self, width: usize) -> Self { - self.requested_width = Some(TableColumnWidth::Absolute(width)); - self - } - - /// Sets what percentage of the width of the entire table this column will - /// try to occupy. - pub fn width_percent(mut self, width: usize) -> Self { - self.requested_width = Some(TableColumnWidth::Percent(width)); - self - } - - fn new(column: H, title: String) -> Self { - Self { - column: column, - title: title, - selected: false, - alignment: HAlign::Left, - order: Ordering::Equal, - width: 0, - default_order: Ordering::Less, - requested_width: None, - } - } - - fn draw_header(&self, printer: &Printer<'_, '_>) { - let order = match self.order { - Ordering::Less => "^", - Ordering::Greater => "v", - Ordering::Equal => " ", - }; - - let header = match self.alignment { - HAlign::Left => format!( - "{: format!( - "{:>width$} [{}]", - self.title, - order, - width = self.width.saturating_sub(4) - ), - HAlign::Center => format!( - "{:^width$} [{}]", - self.title, - order, - width = self.width.saturating_sub(4) - ), - }; - printer.print((0, 0), header.as_str()); - } - - fn draw_row(&self, printer: &Printer<'_, '_>, value: &str) { - let value = match self.alignment { - HAlign::Left => format!("{: format!("{:>width$} ", value, width = self.width), - HAlign::Center => format!("{:^width$} ", value, width = self.width), - }; - printer.print((0, 0), value.as_str()); - } -} - -#[cfg(test)] -mod test { - use crate::p2p::Capabilities; - use crate::tui::peers::PeerColumn; - use crate::tui::table::TableView; - use chrono::Utc; - use grin_core::ser::ProtocolVersion; - use grin_servers::PeerStats; - use std::cmp::Ordering; - - #[test] - pub fn test_set_items_preserves_selected_item() { - let mut table = TableView::::new(); - let ps1 = PeerStats { - addr: "123.0.0.1".to_string(), - ..TestPeerStats::default() - }; - let ps2 = PeerStats { - addr: "123.0.0.2".to_string(), - ..TestPeerStats::default() - }; - - let mut items = vec![ps1, ps2]; - table.set_items(items.clone()); - assert_eq!(table.item().unwrap(), 0); - - items.reverse(); - table.set_items(items); - assert_eq!(table.item().unwrap(), 1); - } - - #[test] - pub fn test_set_items_preserves_order() { - let mut table = TableView::::new(); - let ps1 = PeerStats { - addr: "123.0.0.1".to_string(), - received_bytes_per_sec: 10, - ..TestPeerStats::default() - }; - let ps2 = PeerStats { - addr: "123.0.0.2".to_string(), - received_bytes_per_sec: 80, - ..TestPeerStats::default() - }; - - let items = vec![ps1, ps2]; - table.set_items(items); - assert_eq!(table.rows_to_items[0], 0); - table.sort_by(PeerColumn::UsedBandwidth, Ordering::Greater); - - assert_eq!(table.rows_to_items[0], 1); - } - - struct TestPeerStats(PeerStats); - - impl TestPeerStats { - fn default() -> PeerStats { - PeerStats { - state: "Connected".to_string(), - addr: "127.0.0.1".to_string(), - version: ProtocolVersion::local(), - user_agent: "".to_string(), - total_difficulty: 0, - height: 0, - direction: "Outbound".to_string(), - last_seen: Utc::now(), - sent_bytes_per_sec: 0, - received_bytes_per_sec: 0, - capabilities: Capabilities::default(), - } - } - } -} diff --git a/src/bin/tui/ui.rs b/src/bin/tui/ui.rs index b76bce0493..9a17fb5167 100644 --- a/src/bin/tui/ui.rs +++ b/src/bin/tui/ui.rs @@ -29,8 +29,7 @@ use cursive::utils::markup::StyledString; use cursive::views::{ CircularFocus, Dialog, LinearLayout, Panel, SelectView, StackView, TextView, ViewRef, }; -use cursive::Cursive; -use cursive::CursiveExt; +use cursive::{CursiveRunnable, CursiveRunner}; use std::sync::mpsc; use std::{thread, time}; @@ -44,7 +43,7 @@ use grin_core::global; use grin_util::logger::LogEntry; pub struct UI { - cursive: Cursive, + cursive: CursiveRunner, ui_rx: mpsc::Receiver, ui_tx: mpsc::Sender, controller_tx: mpsc::Sender, @@ -72,7 +71,7 @@ impl UI { let (ui_tx, ui_rx) = mpsc::channel::(); let mut grin_ui = UI { - cursive: Cursive::default(), + cursive: cursive::default().into_runner(), ui_tx, ui_rx, controller_tx, From e72e1403e9abb3876fa0213541364db1f079f988 Mon Sep 17 00:00:00 2001 From: bayk Date: Thu, 13 Jun 2024 15:02:21 -0700 Subject: [PATCH 34/96] grin v5.3 (0051) Update Tokio, hyper versions (#3580) --- api/src/rest.rs | 6 +++++- pool/fuzz/Cargo.lock | 16 +++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/api/src/rest.rs b/api/src/rest.rs index 5d145e711c..3a758fe27b 100644 --- a/api/src/rest.rs +++ b/api/src/rest.rs @@ -38,6 +38,7 @@ use std::sync::Arc; use std::{io, thread}; use tokio::net::TcpListener; use tokio::runtime::Runtime; +use tokio::stream::StreamExt; use tokio_rustls::TlsAcceptor; /// Errors that can be returned by an ApiEndpoint implementation. @@ -293,7 +294,10 @@ impl ApiServer { .spawn(move || { let server = async move { let mut listener = TcpListener::bind(&addr).await.expect("failed to bind"); - let listener = listener.incoming().and_then(move |s| acceptor.accept(s)); + let listener = listener + .incoming() + .and_then(move |s| acceptor.accept(s)) + .filter(|r| r.is_ok()); let server = Server::builder(accept::from_stream(listener)) .serve(make_service_fn(move |_| { diff --git a/pool/fuzz/Cargo.lock b/pool/fuzz/Cargo.lock index e679a69562..18aafdd1d7 100644 --- a/pool/fuzz/Cargo.lock +++ b/pool/fuzz/Cargo.lock @@ -139,7 +139,7 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", "regex", "rustc-hash", @@ -365,7 +365,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", "syn 1.0.34", "synstructure 0.12.4", @@ -1267,6 +1267,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" + [[package]] name = "serde-value" version = "0.6.0" @@ -1283,7 +1289,7 @@ version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", "syn 1.0.34", ] @@ -1370,7 +1376,7 @@ version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "936cae2873c940d92e697597c5eee105fb570cd5689c695806f672883653349b" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", "unicode-xid 0.2.1", ] @@ -1393,7 +1399,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.24", "quote 1.0.7", "syn 1.0.34", "unicode-xid 0.2.1", From b7b83e951270ec5b07254e900e296301fd382979 Mon Sep 17 00:00:00 2001 From: bayk Date: Thu, 13 Jun 2024 15:06:45 -0700 Subject: [PATCH 35/96] grin v5.3 (0053) Fix PIBD segments (#3532) (#3583) --- chain/src/txhashset/bitmap_accumulator.rs | 4 ++-- core/src/core/pmmr/segment.rs | 7 +++++-- servers/src/common/adapters.rs | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/chain/src/txhashset/bitmap_accumulator.rs b/chain/src/txhashset/bitmap_accumulator.rs index 2464b6518a..52da8798b1 100644 --- a/chain/src/txhashset/bitmap_accumulator.rs +++ b/chain/src/txhashset/bitmap_accumulator.rs @@ -346,7 +346,7 @@ impl From for Segment { } for (block_idx, block) in blocks.into_iter().enumerate() { - assert_eq!(block.inner.len(), BitmapBlock::NBITS as usize); + assert!(block.inner.len() <= BitmapBlock::NBITS as usize); let offset = block_idx * BitmapBlock::NCHUNKS; for (i, _) in block.inner.iter().enumerate().filter(|&(_, v)| v) { chunks @@ -418,7 +418,7 @@ impl Writeable for BitmapBlock { // Write raw bytes Writeable::write(&BitmapBlockSerialization::Raw, writer)?; let bytes = self.inner.to_bytes(); - assert_eq!(bytes.len(), Self::NBITS as usize / 8); + assert!(bytes.len() <= Self::NBITS as usize / 8); writer.write_fixed_bytes(&bytes)?; } diff --git a/core/src/core/pmmr/segment.rs b/core/src/core/pmmr/segment.rs index e813e3721f..4450061be3 100644 --- a/core/src/core/pmmr/segment.rs +++ b/core/src/core/pmmr/segment.rs @@ -464,6 +464,7 @@ where mmr_size: u64, bitmap: Option<&Bitmap>, mmr_root: Hash, + hash_last_pos: u64, other_root: Hash, other_is_left: bool, ) -> Result<(), SegmentError> { @@ -476,6 +477,7 @@ where last, segment_root, segment_unpruned_pos, + hash_last_pos, other_root, other_is_left, ) @@ -715,6 +717,7 @@ impl SegmentProof { segment_last_pos: u64, segment_root: Hash, segment_unpruned_pos: u64, + hash_last_pos: u64, other_root: Hash, other_is_left: bool, ) -> Result<(), SegmentError> { @@ -726,9 +729,9 @@ impl SegmentProof { segment_unpruned_pos, )?; let root = if other_is_left { - (other_root, root).hash_with_index(last_pos) + (other_root, root).hash_with_index(hash_last_pos) } else { - (root, other_root).hash_with_index(last_pos) + (root, other_root).hash_with_index(hash_last_pos) }; if root == mmr_root { Ok(()) diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index 7dc6267a8e..6d99af36c0 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -789,7 +789,7 @@ where hash: Hash, id: SegmentIdentifier, ) -> Result, chain::Error> { - if RANGEPROOF_SEGMENT_HEIGHT_RANGE.contains(&id.height) { + if !RANGEPROOF_SEGMENT_HEIGHT_RANGE.contains(&id.height) { return Err(chain::ErrorKind::InvalidSegmentHeight.into()); } let segmenter = self.chain().segmenter()?; From 5f4511197c0965b674e89270533899d73cd4e592 Mon Sep 17 00:00:00 2001 From: bayk Date: Thu, 13 Jun 2024 16:16:27 -0700 Subject: [PATCH 36/96] grin v5.3 (0054) Mining tui updates (#3584) * add column ordering, set mining workers table to sort the connected workers to the top by default * add column ordering, set mining workers table to sort the connected workers to the top by default * Mining TUI fixes and updates --- Cargo.lock | 7 ++ servers/Cargo.toml | 1 + servers/src/common/stats.rs | 28 ++--- servers/src/grin/server.rs | 3 +- servers/src/mining/stratum_data.rs | 29 ++++- servers/src/mining/stratumserver.rs | 30 ++++-- src/bin/tui/mining.rs | 160 ++++++++++++++-------------- 7 files changed, 151 insertions(+), 107 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5cc2d88212..fde19719c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,6 +307,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" +[[package]] +name = "atomic_float" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c4b08ed8a30ff7320117c190eb4d73d47f0ac0c930ab853b8224cef7cd9a5e7" + [[package]] name = "atty" version = "0.2.14" @@ -1619,6 +1625,7 @@ dependencies = [ name = "grin_servers" version = "5.1.0" dependencies = [ + "atomic_float", "chrono", "dirs 1.0.5", "ed25519-dalek", diff --git a/servers/Cargo.toml b/servers/Cargo.toml index f359cf01bd..05713e0d86 100644 --- a/servers/Cargo.toml +++ b/servers/Cargo.toml @@ -31,6 +31,7 @@ regex = "1.3" sysinfo = "0.9" dirs = "1.0.3" timer = "0.2" +atomic_float = "1.0" grin_api = { path = "../api", version = "5.1.0" } grin_chain = { path = "../chain", version = "5.1.0" } diff --git a/servers/src/common/stats.rs b/servers/src/common/stats.rs index d67882483b..538f6dd500 100644 --- a/servers/src/common/stats.rs +++ b/servers/src/common/stats.rs @@ -16,11 +16,11 @@ //! to collect information about server status use crate::util::RwLock; +use atomic_float::AtomicF64; use std::sync::atomic::*; use std::sync::Arc; use std::time::SystemTime; -use crate::core::consensus::graph_weight; use crate::core::core::hash::Hash; use crate::core::ser::ProtocolVersion; @@ -130,8 +130,14 @@ pub struct StratumStats { pub block_height: AtomicU64, /// current network difficulty we're working on pub network_difficulty: AtomicU64, - /// cuckoo size used for mining + /// cuckoo size of last share submitted pub edge_bits: AtomicU16, + /// Number of blocks found by all workers + pub blocks_found: AtomicUsize, + /// current network Hashrate (for edge_bits) + pub network_hashrate: atomic_float::AtomicF64, + /// The minimum acceptable share difficulty to request from miners + pub minimum_share_difficulty: AtomicU64, /// Individual worker status worker_stats: RwLock>, } @@ -216,16 +222,9 @@ impl PartialEq for DiffBlock { } impl StratumStats { - /// Calculate network hashrate - pub fn network_hashrate(&self, height: u64) -> f64 { - 42.0 * (self.network_difficulty.load(Ordering::Relaxed) as f64 - / graph_weight(height, self.edge_bits.load(Ordering::Relaxed) as u8) as f64) - / 60.0 - } - /// Allocate a new slot for the worker. Assuming that caller will never fail. /// returns worker Id for the Worker tist - pub fn allocate_new_worker(&self) -> usize { + pub fn allocate_new_worker(&self, pow_difficulty: u64) -> usize { let mut worker_stats = self.worker_stats.write(); let worker_id = worker_stats @@ -236,7 +235,7 @@ impl StratumStats { let mut stats = WorkerStats::default(); stats.is_connected = true; stats.id = worker_id.to_string(); - stats.pow_difficulty = 1; + stats.pow_difficulty = pow_difficulty; if worker_id < worker_stats.len() { worker_stats[worker_id] = stats; @@ -322,8 +321,11 @@ impl Default for StratumStats { is_running: AtomicBool::new(false), num_workers: AtomicUsize::new(0), block_height: AtomicU64::new(0), - network_difficulty: AtomicU64::new(1000), - edge_bits: AtomicU16::new(29), + network_difficulty: AtomicU64::new(0), + edge_bits: AtomicU16::new(0), + blocks_found: AtomicUsize::new(0), + network_hashrate: AtomicF64::new(0.0), + minimum_share_difficulty: AtomicU64::new(1), worker_stats: RwLock::new(Vec::new()), } } diff --git a/servers/src/grin/server.rs b/servers/src/grin/server.rs index 8cca8e2395..9f20379e49 100644 --- a/servers/src/grin/server.rs +++ b/servers/src/grin/server.rs @@ -814,7 +814,6 @@ impl Server { config: StratumServerConfig, ip_pool: Arc, ) { - let edge_bits = global::min_edge_bits(); let proof_size = global::proofsize(); let sync_state = self.sync_state.clone(); @@ -829,7 +828,7 @@ impl Server { let _ = thread::Builder::new() .name("stratum_server".to_string()) .spawn(move || { - stratum_server.run_loop(edge_bits as u32, proof_size, sync_state); + stratum_server.run_loop(proof_size, sync_state); }); } diff --git a/servers/src/mining/stratum_data.rs b/servers/src/mining/stratum_data.rs index 7a9c3fffcd..719cf22cf6 100644 --- a/servers/src/mining/stratum_data.rs +++ b/servers/src/mining/stratum_data.rs @@ -18,6 +18,7 @@ // Worker Object - a connected stratum client - a miner, pool, proxy, etc... use crate::common::stats::{StratumStats, WorkerStats}; +use crate::core::consensus::graph_weight; use crate::util::RwLock; use chrono::prelude::Utc; use futures::channel::mpsc; @@ -159,7 +160,11 @@ impl WorkersList { // Or just somebody want to attack the mining pool. // let worker_id = stratum_stats.worker_stats.len(); - let worker_id = self.stratum_stats.allocate_new_worker(); + let worker_id = self.stratum_stats.allocate_new_worker( + self.stratum_stats + .minimum_share_difficulty + .load(Ordering::Relaxed), + ); let worker = Worker::new(worker_id, ip, tx, kill_switch); let num_workers = self.workers_map.add(&worker_id, worker); @@ -253,4 +258,26 @@ impl WorkersList { .network_difficulty .store(difficulty, Ordering::Relaxed); } + + pub fn update_network_hashrate(&self) { + let network_hashrate = 42.0 + * (self + .stratum_stats + .network_difficulty + .load(Ordering::Relaxed) as f64 + / graph_weight( + self.stratum_stats.block_height.load(Ordering::Relaxed), + self.stratum_stats.edge_bits.load(Ordering::Relaxed) as u8, + ) as f64) / 60.0; + + self.stratum_stats + .network_hashrate + .store(network_hashrate, Ordering::Relaxed); + } + + pub fn update_edge_bits(&self, edge_bits: u16) { + self.stratum_stats + .edge_bits + .store(edge_bits, Ordering::Relaxed); + } } diff --git a/servers/src/mining/stratumserver.rs b/servers/src/mining/stratumserver.rs index 33e9b4dfd2..cbe85f7a95 100644 --- a/servers/src/mining/stratumserver.rs +++ b/servers/src/mining/stratumserver.rs @@ -38,6 +38,7 @@ use crate::common::stats::StratumStats; use crate::common::types::StratumServerConfig; use crate::core::core::hash::Hashed; use crate::core::core::Block; +use crate::core::global; use crate::core::stratum::connections; use crate::core::{pow, ser}; use crate::keychain; @@ -516,6 +517,7 @@ impl Handler { } } // Log this as a valid share + self.workers.update_edge_bits(params.edge_bits as u16); if let Some(worker) = self.workers.get_worker(&worker_id) { let submitted_by = match worker.login { None => worker.id.to_string(), @@ -597,10 +599,9 @@ impl Handler { head = self.chain.head().unwrap(); let latest_hash = head.last_block_h; - // Build a new block if: - // There is a new block on the chain - // or We are rebuilding the current one to include new transactions - // and there is at least one worker connected + // Build a new block if there is at least one worker and + // There is a new block on the chain or its time to rebuild + // the current one to include new transactions if (current_hash != latest_hash || Utc::now().timestamp() >= deadline) && self.workers.count() > 0 { @@ -611,7 +612,7 @@ impl Handler { } else { None }; - // If this is a new block, clear the current_block version history + // If this is a new block we will clear the current_block version history let clear_blocks = current_hash != latest_hash; // Build the new block (version) @@ -644,6 +645,12 @@ impl Handler { self.workers .update_network_difficulty(self.current_state.read().current_difficulty); + // Update the mining stats + self.workers.update_block_height(new_block.header.height); + let difficulty = new_block.header.total_difficulty() - head.total_difficulty; + self.workers.update_network_difficulty(difficulty.to_num()); + self.workers.update_network_hashrate(); + { let mut state = self.current_state.write(); @@ -652,8 +659,8 @@ impl Handler { } state.current_block_versions.push(new_block); } - // Send this job to all connected workers } + // Send this job to all connected workers self.broadcast_job(); } @@ -926,10 +933,10 @@ impl StratumServer { /// existing chain anytime required and sending that to the connected /// stratum miner, proxy, or pool, and accepts full solutions to /// be submitted. - pub fn run_loop(&mut self, edge_bits: u32, proof_size: usize, sync_state: Arc) { + pub fn run_loop(&mut self, proof_size: usize, sync_state: Arc) { info!( - "(Server ID: {}) Starting stratum server with edge_bits = {}, proof_size = {}, config: {:?}", - self.id, edge_bits, proof_size, self.config + "(Server ID: {}) Starting stratum server with proof_size = {}", + self.id, proof_size ); self.sync_state = sync_state; @@ -953,7 +960,10 @@ impl StratumServer { self.stratum_stats.is_running.store(true, Ordering::Relaxed); self.stratum_stats .edge_bits - .store(edge_bits as u16, Ordering::Relaxed); + .store(global::min_edge_bits() as u16 + 1, Ordering::Relaxed); + self.stratum_stats + .minimum_share_difficulty + .store(self.config.minimum_share_difficulty, Ordering::Relaxed); warn!( "Stratum server started on {}", diff --git a/src/bin/tui/mining.rs b/src/bin/tui/mining.rs index e10ee14ee0..97a3a7257b 100644 --- a/src/bin/tui/mining.rs +++ b/src/bin/tui/mining.rs @@ -51,7 +51,7 @@ enum StratumWorkerColumn { impl StratumWorkerColumn { fn _as_str(&self) -> &str { match *self { - StratumWorkerColumn::Id => "Worker ID", + StratumWorkerColumn::Id => "ID", StratumWorkerColumn::IsConnected => "Connected", StratumWorkerColumn::LastSeen => "Last Seen", StratumWorkerColumn::PowDifficulty => "PowDifficulty", @@ -86,19 +86,21 @@ impl TableViewItem for WorkerStats { } } - fn cmp(&self, _other: &Self, column: StratumWorkerColumn) -> Ordering + fn cmp(&self, other: &Self, column: StratumWorkerColumn) -> Ordering where Self: Sized, { match column { - StratumWorkerColumn::Id => Ordering::Equal, - StratumWorkerColumn::IsConnected => Ordering::Equal, - StratumWorkerColumn::LastSeen => Ordering::Equal, - StratumWorkerColumn::PowDifficulty => Ordering::Equal, - StratumWorkerColumn::NumAccepted => Ordering::Equal, - StratumWorkerColumn::NumRejected => Ordering::Equal, - StratumWorkerColumn::NumStale => Ordering::Equal, - StratumWorkerColumn::NumBlocksFound => Ordering::Equal, + StratumWorkerColumn::Id => self.id.cmp(&other.id), + StratumWorkerColumn::IsConnected => self.is_connected.cmp(&other.is_connected), + StratumWorkerColumn::LastSeen => self.last_seen.cmp(&other.last_seen), + StratumWorkerColumn::PowDifficulty => self.pow_difficulty.cmp(&other.pow_difficulty), + StratumWorkerColumn::NumAccepted => self.num_accepted.cmp(&other.num_accepted), + StratumWorkerColumn::NumRejected => self.num_rejected.cmp(&other.num_rejected), + StratumWorkerColumn::NumStale => self.num_stale.cmp(&other.num_stale), + StratumWorkerColumn::NumBlocksFound => { + self.num_blocks_found.cmp(&other.num_blocks_found) + } } } } @@ -106,9 +108,7 @@ impl TableViewItem for WorkerStats { enum DiffColumn { Height, Hash, - PoWType, Difficulty, - SecondaryScaling, Time, Duration, } @@ -118,9 +118,7 @@ impl DiffColumn { match *self { DiffColumn::Height => "Height", DiffColumn::Hash => "Hash", - DiffColumn::PoWType => "Type", DiffColumn::Difficulty => "Network Difficulty", - DiffColumn::SecondaryScaling => "Sec. Scaling", DiffColumn::Time => "Block Time", DiffColumn::Duration => "Duration", } @@ -131,35 +129,26 @@ impl TableViewItem for DiffBlock { fn to_column(&self, column: DiffColumn) -> String { let naive_datetime = NaiveDateTime::from_timestamp(self.time as i64, 0); let datetime: DateTime = DateTime::from_utc(naive_datetime, Utc); - let pow_type = if self.is_secondary { - String::from("Secondary") - } else { - String::from("Primary") - }; match column { DiffColumn::Height => self.block_height.to_string(), DiffColumn::Hash => self.block_hash.to_string(), - DiffColumn::PoWType => pow_type, DiffColumn::Difficulty => self.difficulty.to_string(), - DiffColumn::SecondaryScaling => self.secondary_scaling.to_string(), DiffColumn::Time => format!("{}", datetime), DiffColumn::Duration => format!("{}s", self.duration), } } - fn cmp(&self, _other: &Self, column: DiffColumn) -> Ordering + fn cmp(&self, other: &Self, column: DiffColumn) -> Ordering where Self: Sized, { match column { - DiffColumn::Height => Ordering::Equal, - DiffColumn::Hash => Ordering::Equal, - DiffColumn::PoWType => Ordering::Equal, - DiffColumn::Difficulty => Ordering::Equal, - DiffColumn::SecondaryScaling => Ordering::Equal, - DiffColumn::Time => Ordering::Equal, - DiffColumn::Duration => Ordering::Equal, + DiffColumn::Height => self.block_height.cmp(&other.block_height), + DiffColumn::Hash => self.block_hash.cmp(&other.block_hash), + DiffColumn::Difficulty => self.difficulty.cmp(&other.difficulty), + DiffColumn::Time => self.time.cmp(&other.time), + DiffColumn::Duration => self.duration.cmp(&other.duration), } } } @@ -186,29 +175,31 @@ impl TUIMiningView { .child(Panel::new(devices_button)) .child(Panel::new(difficulty_button)); - let table_view = TableView::::new() - .column(StratumWorkerColumn::Id, "Worker ID", |c| c.width_percent(8)) + let mut table_view = TableView::::new() + .column(StratumWorkerColumn::Id, "ID", |c| c.width_percent(6)) .column(StratumWorkerColumn::IsConnected, "Connected", |c| { - c.width_percent(8) + c.width_percent(14) }) .column(StratumWorkerColumn::LastSeen, "Last Seen", |c| { - c.width_percent(16) - }) - .column(StratumWorkerColumn::PowDifficulty, "Pow Difficulty", |c| { - c.width_percent(12) + c.width_percent(20) }) - .column(StratumWorkerColumn::NumAccepted, "Num Accepted", |c| { + .column(StratumWorkerColumn::PowDifficulty, "Difficulty", |c| { c.width_percent(10) }) - .column(StratumWorkerColumn::NumRejected, "Num Rejected", |c| { - c.width_percent(10) + .column(StratumWorkerColumn::NumAccepted, "Accepted", |c| { + c.width_percent(5) }) - .column(StratumWorkerColumn::NumStale, "Num Stale", |c| { - c.width_percent(10) + .column(StratumWorkerColumn::NumRejected, "Rejected", |c| { + c.width_percent(5) + }) + .column(StratumWorkerColumn::NumStale, "Stale", |c| { + c.width_percent(5) }) .column(StratumWorkerColumn::NumBlocksFound, "Blocks Found", |c| { - c.width_percent(10) - }); + c.width_percent(35) + }) + .default_column(StratumWorkerColumn::IsConnected); + table_view.sort_by(StratumWorkerColumn::IsConnected, Ordering::Greater); let status_view = LinearLayout::new(Orientation::Vertical) .child( @@ -229,15 +220,15 @@ impl TUIMiningView { ) .child( LinearLayout::new(Orientation::Horizontal) - .child(TextView::new(" ").with_name("stratum_network_difficulty_status")), + .child(TextView::new(" ").with_name("stratum_blocks_found_status")), ) .child( LinearLayout::new(Orientation::Horizontal) - .child(TextView::new(" ").with_name("stratum_network_hashrate")), + .child(TextView::new(" ").with_name("stratum_network_difficulty_status")), ) .child( LinearLayout::new(Orientation::Horizontal) - .child(TextView::new(" ").with_name("stratum_edge_bits_status")), + .child(TextView::new(" ").with_name("stratum_network_hashrate")), ); let mining_device_view = LinearLayout::new(Orientation::Vertical) @@ -271,17 +262,14 @@ impl TUIMiningView { ); let diff_table_view = TableView::::new() - .column(DiffColumn::Height, "Height", |c| c.width_percent(10)) - .column(DiffColumn::Hash, "Hash", |c| c.width_percent(10)) - .column(DiffColumn::PoWType, "Type", |c| c.width_percent(10)) + .column(DiffColumn::Height, "Height", |c| c.width_percent(15)) + .column(DiffColumn::Hash, "Hash", |c| c.width_percent(15)) .column(DiffColumn::Difficulty, "Network Difficulty", |c| { c.width_percent(15) }) - .column(DiffColumn::SecondaryScaling, "Sec. Scaling", |c| { - c.width_percent(10) - }) - .column(DiffColumn::Time, "Block Time", |c| c.width_percent(25)) - .column(DiffColumn::Duration, "Duration", |c| c.width_percent(25)); + .column(DiffColumn::Time, "Block Time", |c| c.width_percent(30)) + .column(DiffColumn::Duration, "Duration", |c| c.width_percent(25)) + .default_column(DiffColumn::Height); let mining_difficulty_view = LinearLayout::new(Orientation::Vertical) .child(diff_status_view) @@ -334,16 +322,10 @@ impl TUIStatusListener for TUIMiningView { let _ = c.call_on_name( TABLE_MINING_DIFF_STATUS, |t: &mut TableView| { - t.set_items_stable(diff_stats); + t.set_items(diff_stats); }, ); let stratum_stats = &stats.stratum_stats; - let stratum_network_hashrate = format!( - "Network Hashrate: {:.*}", - 2, - stratum_stats - .network_hashrate(stratum_stats.block_height.load(atomic::Ordering::Relaxed)) - ); let worker_stats = stratum_stats.get_worker_stats(); let stratum_enabled = format!( "Mining server enabled: {}", @@ -353,25 +335,41 @@ impl TUIStatusListener for TUIMiningView { "Mining server running: {}", stratum_stats.is_running.load(atomic::Ordering::Relaxed) ); - let stratum_num_workers = format!( - "Number of workers: {}", - stratum_stats.num_workers.load(atomic::Ordering::Relaxed) - ); - let stratum_block_height = format!( - "Solving Block Height: {}", - stratum_stats.block_height.load(atomic::Ordering::Relaxed) - ); - let stratum_network_difficulty = format!( - "Network Difficulty: {}", - stratum_stats - .network_difficulty - .load(atomic::Ordering::Relaxed) - ); - let stratum_edge_bits = format!( - "Cuckoo Size: {}", - stratum_stats.edge_bits.load(atomic::Ordering::Relaxed) + let num_workers = stratum_stats.num_workers.load(atomic::Ordering::Relaxed); + let stratum_num_workers = format!("Active workers: {}", num_workers); + let stratum_blocks_found = format!( + "Blocks Found: {}", + stratum_stats.blocks_found.load(atomic::Ordering::Relaxed) ); + let stratum_block_height = match num_workers { + 0 => "Solving Block Height: n/a".to_string(), + _ => format!( + "Solving Block Height: {}", + stratum_stats.block_height.load(atomic::Ordering::Relaxed) + ), + }; + let stratum_network_difficulty = match num_workers { + 0 => "Network Difficulty: n/a".to_string(), + _ => format!( + "Network Difficulty: {}", + stratum_stats + .network_difficulty + .load(atomic::Ordering::Relaxed) + ), + }; + let stratum_network_hashrate = match num_workers { + 0 => "Network Hashrate: n/a".to_string(), + _ => format!( + "Network Hashrate C{}: {:.*}", + stratum_stats.edge_bits.load(atomic::Ordering::Relaxed), + 2, + stratum_stats + .network_hashrate + .load(atomic::Ordering::Relaxed) + ), + }; + c.call_on_name("stratum_config_status", |t: &mut TextView| { t.set_content(stratum_enabled); }); @@ -381,6 +379,9 @@ impl TUIStatusListener for TUIMiningView { c.call_on_name("stratum_num_workers_status", |t: &mut TextView| { t.set_content(stratum_num_workers); }); + c.call_on_name("stratum_blocks_found_status", |t: &mut TextView| { + t.set_content(stratum_blocks_found); + }); c.call_on_name("stratum_block_height_status", |t: &mut TextView| { t.set_content(stratum_block_height); }); @@ -390,9 +391,6 @@ impl TUIStatusListener for TUIMiningView { c.call_on_name("stratum_network_hashrate", |t: &mut TextView| { t.set_content(stratum_network_hashrate); }); - c.call_on_name("stratum_edge_bits_status", |t: &mut TextView| { - t.set_content(stratum_edge_bits); - }); let _ = c.call_on_name( TABLE_MINING_STATUS, |t: &mut TableView| { From 0c978e2f05e4a5142f3deee7dc7ecf0b970ed2e3 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 10:21:21 -0700 Subject: [PATCH 37/96] grin v5.3 (0055) Update and do not use serve private export (#3585) --- core/src/ser.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core/src/ser.rs b/core/src/ser.rs index 4073997a74..9b0ce07c6f 100644 --- a/core/src/ser.rs +++ b/core/src/ser.rs @@ -24,12 +24,10 @@ use crate::global::PROTOCOL_VERSION; use byteorder::{BigEndian, ByteOrder, ReadBytesExt}; use bytes::Buf; use keychain::{BlindingFactor, Identifier, IDENTIFIER_SIZE}; -use serde::__private::from_utf8_lossy; use std::convert::TryInto; use std::fmt::{self, Debug}; use std::io::{self, Read, Write}; -use std::marker::PhantomData; -use std::{cmp, marker}; +use std::{cmp, marker, string}; use util::secp::constants::{ AGG_SIGNATURE_SIZE, COMPRESSED_PUBLIC_KEY_SIZE, MAX_PROOF_SIZE, PEDERSEN_COMMITMENT_SIZE, SECRET_KEY_SIZE, @@ -1197,7 +1195,7 @@ where b"Other" => Ok(Field::field16), b"UnexpectedEof" => Ok(Field::field17), _ => { - let value = &from_utf8_lossy(value); + let value = &string::String::from_utf8_lossy(value); Err(serde::de::Error::unknown_variant(value, VARIANTS)) } } @@ -1213,13 +1211,13 @@ where } } struct Visitor<'de> { - marker: PhantomData, - lifetime: PhantomData<&'de ()>, + marker: marker::PhantomData, + lifetime: marker::PhantomData<&'de ()>, } impl<'de> serde::de::Visitor<'de> for Visitor<'de> { type Value = io::ErrorKind; - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - std::fmt::Formatter::write_str(formatter, "enum io::ErrorKind") + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + fmt::Formatter::write_str(formatter, "enum io::ErrorKind") } fn visit_enum(self, data: A) -> Result where @@ -1421,8 +1419,8 @@ where "ErrorKind", VARIANTS, Visitor { - marker: PhantomData::, - lifetime: PhantomData, + marker: marker::PhantomData::, + lifetime: marker::PhantomData, }, ) } From 21bd823bf8f6130cac120c2a8a7a2337ba070712 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 10:36:50 -0700 Subject: [PATCH 38/96] grin v5.3 (0057) Remove unused imports (#3589) --- core/src/core/committed.rs | 1 - core/src/genesis.rs | 1 - core/src/lib.rs | 1 - core/src/libtx/error.rs | 1 - core/src/pow.rs | 2 -- core/src/pow/common.rs | 2 +- keychain/src/mnemonic.rs | 2 +- src/build/build.rs | 2 -- 8 files changed, 2 insertions(+), 10 deletions(-) diff --git a/core/src/core/committed.rs b/core/src/core/committed.rs index a0c5f4802e..7bf2215e2d 100644 --- a/core/src/core/committed.rs +++ b/core/src/core/committed.rs @@ -15,7 +15,6 @@ //! The Committed trait and associated errors. use failure::Fail; -use keychain; use keychain::BlindingFactor; use util::secp::key::SecretKey; use util::secp::pedersen::Commitment; diff --git a/core/src/genesis.rs b/core/src/genesis.rs index 91011c675e..3bdf61f58f 100644 --- a/core/src/genesis.rs +++ b/core/src/genesis.rs @@ -24,7 +24,6 @@ use crate::core::hash::Hash; use crate::pow::{Difficulty, Proof, ProofOfWork}; use chrono::prelude::{TimeZone, Utc}; use keychain::BlindingFactor; -use util; use util::secp::constants::SINGLE_BULLET_PROOF_SIZE; use util::secp::pedersen::{Commitment, RangeProof}; use util::secp::Signature; diff --git a/core/src/lib.rs b/core/src/lib.rs index 4e4d43ce10..6092ab9093 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -30,7 +30,6 @@ extern crate serde_derive; use serde; #[macro_use] extern crate log; -use failure; #[macro_use] extern crate failure_derive; #[macro_use] diff --git a/core/src/libtx/error.rs b/core/src/libtx/error.rs index 5b78ea951c..08238f94a7 100644 --- a/core/src/libtx/error.rs +++ b/core/src/libtx/error.rs @@ -15,7 +15,6 @@ //! libtx specific errors use crate::core::transaction; use failure::{Backtrace, Context, Fail}; -use keychain; use std::fmt::{self, Display}; use util::secp; diff --git a/core/src/pow.rs b/core/src/pow.rs index 1446214d34..8045da4b3c 100644 --- a/core/src/pow.rs +++ b/core/src/pow.rs @@ -33,8 +33,6 @@ pub use self::types::*; use crate::core::{Block, BlockHeader}; use crate::genesis; use crate::global; -use chrono; -use num; #[macro_use] mod common; diff --git a/core/src/pow/common.rs b/core/src/pow/common.rs index ddb24eb862..ddd0875b37 100644 --- a/core/src/pow/common.rs +++ b/core/src/pow/common.rs @@ -15,10 +15,10 @@ //! Common types and traits for cuckoo family of solvers use crate::pow::error::Error; -use crate::pow::num::{PrimInt, ToPrimitive}; use crate::pow::siphash::siphash24; use blake2::blake2b::blake2b; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; +use num::{PrimInt, ToPrimitive}; use std::fmt; use std::hash::Hash; use std::io::Cursor; diff --git a/keychain/src/mnemonic.rs b/keychain/src/mnemonic.rs index 51ef3d86dd..a62d1fc4f1 100644 --- a/keychain/src/mnemonic.rs +++ b/keychain/src/mnemonic.rs @@ -91,7 +91,7 @@ pub fn to_entropy(mnemonic: &str) -> Result, Error> { let mut hash = [0; 32]; let mut sha2sum = Sha256::default(); - sha2sum.update(&entropy.clone()); + sha2sum.update(&entropy); hash.copy_from_slice(sha2sum.finalize().as_slice()); let actual = (hash[0] >> (8 - checksum_bits)) & mask; diff --git a/src/build/build.rs b/src/build/build.rs index 44e2674e67..78655c4402 100644 --- a/src/build/build.rs +++ b/src/build/build.rs @@ -14,8 +14,6 @@ //! Build hooks to spit out version+build time info -use built; - use std::env; use std::path::{Path, PathBuf}; use std::process::Command; From 3ce3b06d41cdc2e841c00381db25eefbcbdd0756 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 10:41:51 -0700 Subject: [PATCH 39/96] grin v5.3 (0058) Remove imports and cleanups (#3590) --- api/src/client.rs | 2 -- api/src/lib.rs | 1 - api/src/rest.rs | 1 - api/src/router.rs | 1 - api/src/web.rs | 1 - chain/src/lib.rs | 1 - chain/src/txhashset/txhashset.rs | 1 - config/src/config.rs | 2 -- core/src/core/transaction.rs | 11 +++++------ p2p/src/types.rs | 2 -- servers/src/mining/stratumserver.rs | 2 -- src/bin/cmd/server.rs | 1 - src/bin/tui/mining.rs | 2 +- src/bin/tui/mod.rs | 4 ---- src/bin/tui/peers.rs | 2 +- store/src/lib.rs | 1 - store/src/types.rs | 1 - 17 files changed, 7 insertions(+), 29 deletions(-) diff --git a/api/src/client.rs b/api/src/client.rs index 4a1254ce81..ee68248dd3 100644 --- a/api/src/client.rs +++ b/api/src/client.rs @@ -22,10 +22,8 @@ use http::uri::{InvalidUri, Uri}; use hyper::body; use hyper::header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE, USER_AGENT}; use hyper::{Body, Client, Request}; -use hyper_rustls; use hyper_timeout::TimeoutConnector; use serde::{Deserialize, Serialize}; -use serde_json; use std::time::Duration; use tokio::runtime::Builder; diff --git a/api/src/lib.rs b/api/src/lib.rs index 278e88c98d..1e0cc7aa86 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -19,7 +19,6 @@ use grin_pool as pool; use grin_util as util; -use failure; #[macro_use] extern crate failure_derive; #[macro_use] diff --git a/api/src/rest.rs b/api/src/rest.rs index 3a758fe27b..3ca08d138b 100644 --- a/api/src/rest.rs +++ b/api/src/rest.rs @@ -27,7 +27,6 @@ use futures::TryStreamExt; use hyper::server::accept; use hyper::service::make_service_fn; use hyper::{Body, Request, Server, StatusCode}; -use rustls; use rustls::internal::pemfile; use rustls::{NoClientAuth, ServerConfig}; use std::convert::Infallible; diff --git a/api/src/router.rs b/api/src/router.rs index 68c45d2bbc..3bcd48f4eb 100644 --- a/api/src/router.rs +++ b/api/src/router.rs @@ -13,7 +13,6 @@ // limitations under the License. use futures::future::{self, Future}; -use hyper; use hyper::service::Service; use hyper::{Body, Method, Request, Response, StatusCode}; use std::collections::hash_map::DefaultHasher; diff --git a/api/src/web.rs b/api/src/web.rs index 49fb148d8e..e7b69c2940 100644 --- a/api/src/web.rs +++ b/api/src/web.rs @@ -5,7 +5,6 @@ use futures::future::ok; use hyper::body; use hyper::{Body, Request, Response, StatusCode}; use serde::{Deserialize, Serialize}; -use serde_json; use std::collections::HashMap; use std::fmt::Debug; use url::form_urlencoded; diff --git a/chain/src/lib.rs b/chain/src/lib.rs index 61a05fac78..de2fb5f8ea 100644 --- a/chain/src/lib.rs +++ b/chain/src/lib.rs @@ -33,7 +33,6 @@ extern crate log; #[macro_use] extern crate lazy_static; -use failure; use grin_core as core; use grin_keychain as keychain; use grin_util as util; diff --git a/chain/src/txhashset/txhashset.rs b/chain/src/txhashset/txhashset.rs index fe0cc06759..9876cc18c4 100644 --- a/chain/src/txhashset/txhashset.rs +++ b/chain/src/txhashset/txhashset.rs @@ -34,7 +34,6 @@ use crate::types::{CommitPos, HashHeight, OutputRoots, Tip, TxHashSetRoots, TxHa use crate::util::secp::pedersen::{Commitment, RangeProof}; use crate::util::{file, secp_static, zip}; use croaring::Bitmap; -use grin_store; use grin_store::pmmr::{clean_files_by_prefix, PMMRBackend}; use std::fs::{self, File}; use std::path::{Path, PathBuf}; diff --git a/config/src/config.rs b/config/src/config.rs index 5e8b588ff6..dcabbdf1f8 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -14,7 +14,6 @@ //! Configuration file management -use dirs; use rand::distributions::{Alphanumeric, Distribution}; use rand::thread_rng; use std::env; @@ -23,7 +22,6 @@ use std::io::prelude::*; use std::io::BufReader; use std::io::Read; use std::path::PathBuf; -use toml; use crate::comments::insert_comments; use crate::core::global; diff --git a/core/src/core/transaction.rs b/core/src/core/transaction.rs index 93f5809a90..f0b744150d 100644 --- a/core/src/core/transaction.rs +++ b/core/src/core/transaction.rs @@ -242,12 +242,11 @@ impl TryFrom for NRDRelativeHeight { type Error = Error; fn try_from(height: u16) -> Result { - if height == 0 { - Err(Error::InvalidNRDRelativeHeight) - } else if height - > NRDRelativeHeight::MAX - .try_into() - .expect("WEEK_HEIGHT const should fit in u16") + if height == 0 + || height + > NRDRelativeHeight::MAX + .try_into() + .expect("WEEK_HEIGHT const should fit in u16") { Err(Error::InvalidNRDRelativeHeight) } else { diff --git a/p2p/src/types.rs b/p2p/src/types.rs index 9eb9d5c142..c8f2f967d2 100644 --- a/p2p/src/types.rs +++ b/p2p/src/types.rs @@ -30,8 +30,6 @@ use serde::de::{SeqAccess, Visitor}; use serde::{Deserialize, Deserializer}; use std::sync::atomic::AtomicUsize; -use grin_store; - use crate::chain; use crate::chain::txhashset::BitmapChunk; use crate::core::core; diff --git a/servers/src/mining/stratumserver.rs b/servers/src/mining/stratumserver.rs index cbe85f7a95..b491738b10 100644 --- a/servers/src/mining/stratumserver.rs +++ b/servers/src/mining/stratumserver.rs @@ -23,8 +23,6 @@ use tokio_util::codec::{Framed, LinesCodec}; use crate::util::RwLock; use chrono::prelude::Utc; -use serde; -use serde_json; use serde_json::Value; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::sync::atomic::{AtomicI32, Ordering}; diff --git a/src/bin/cmd/server.rs b/src/bin/cmd/server.rs index f51849a3b4..c46b3b442c 100644 --- a/src/bin/cmd/server.rs +++ b/src/bin/cmd/server.rs @@ -18,7 +18,6 @@ use std::thread; use std::time::Duration; use clap::ArgMatches; -use ctrlc; use futures::channel::oneshot; use crate::config::GlobalConfig; diff --git a/src/bin/tui/mining.rs b/src/bin/tui/mining.rs index 97a3a7257b..da39c2c1a5 100644 --- a/src/bin/tui/mining.rs +++ b/src/bin/tui/mining.rs @@ -16,7 +16,7 @@ use std::cmp::Ordering; -use crate::tui::chrono::prelude::{DateTime, NaiveDateTime, Utc}; +use chrono::prelude::{DateTime, NaiveDateTime, Utc}; use cursive::direction::Orientation; use cursive::event::Key; use cursive::traits::{Boxable, Identifiable}; diff --git a/src/bin/tui/mod.rs b/src/bin/tui/mod.rs index 8a2f98575e..a1d3b7040d 100644 --- a/src/bin/tui/mod.rs +++ b/src/bin/tui/mod.rs @@ -12,10 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Grin TUI -use chrono; -use humansize; -// mod constants; mod logs; mod menu; diff --git a/src/bin/tui/peers.rs b/src/bin/tui/peers.rs index 2909e99aec..4292d929f5 100644 --- a/src/bin/tui/peers.rs +++ b/src/bin/tui/peers.rs @@ -18,8 +18,8 @@ use std::cmp::Ordering; use crate::servers::{PeerStats, ServerStats}; -use crate::tui::humansize::{file_size_opts::CONVENTIONAL, FileSize}; use chrono::prelude::*; +use humansize::{file_size_opts::CONVENTIONAL, FileSize}; use cursive::direction::Orientation; use cursive::event::Key; diff --git a/store/src/lib.rs b/store/src/lib.rs index b7a0607fd4..a5cefcf818 100644 --- a/store/src/lib.rs +++ b/store/src/lib.rs @@ -22,7 +22,6 @@ #[macro_use] extern crate log; -use failure; #[macro_use] extern crate failure_derive; #[macro_use] diff --git a/store/src/types.rs b/store/src/types.rs index a397421cc7..82e1c7bc97 100644 --- a/store/src/types.rs +++ b/store/src/types.rs @@ -12,7 +12,6 @@ // limitations under the License. //! Common storage-related types -use memmap; use tempfile::tempfile; use crate::core::ser::{ From b6c9b8c2f9bec05bba60875327b5f7804d6e8a31 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 16:31:39 -0700 Subject: [PATCH 40/96] grin v5.3 (0060) fix for missing increment of stratum stats blocks_found (#3593) --- servers/src/mining/stratum_data.rs | 6 ++++++ servers/src/mining/stratumserver.rs | 1 + 2 files changed, 7 insertions(+) diff --git a/servers/src/mining/stratum_data.rs b/servers/src/mining/stratum_data.rs index 719cf22cf6..0550408455 100644 --- a/servers/src/mining/stratum_data.rs +++ b/servers/src/mining/stratum_data.rs @@ -280,4 +280,10 @@ impl WorkersList { .edge_bits .store(edge_bits, Ordering::Relaxed); } + + pub fn increment_block_found(&self) { + self.stratum_stats + .blocks_found + .fetch_add(1, Ordering::Relaxed); + } } diff --git a/servers/src/mining/stratumserver.rs b/servers/src/mining/stratumserver.rs index b491738b10..5d8d39df11 100644 --- a/servers/src/mining/stratumserver.rs +++ b/servers/src/mining/stratumserver.rs @@ -481,6 +481,7 @@ impl Handler { share_is_block = true; self.workers .update_stats(worker_id, |worker_stats| worker_stats.num_blocks_found += 1); + self.workers.increment_block_found(); // Log message to make it obvious we found a block let stats = self .workers From e9d68fd4728eb32bc7107d301d9e1246fb6c486f Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 16:37:28 -0700 Subject: [PATCH 41/96] grin v5.3 (0061) Enable block archival sync (#3579) * wip - body sync for full archive * allow chain compaction during sync * placeholder for logic to ensure archive nodes sync from archive nodes * body sync from archival peers * allow chain compaction during sync * placeholder for logic to ensure archive nodes sync from archive nodes --- chain/src/chain.rs | 15 ++++++-- servers/src/common/adapters.rs | 5 --- servers/src/grin/sync/body_sync.rs | 55 ++++++++++++++++++++---------- 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 54ecc2ab54..c0e26af76d 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -257,6 +257,11 @@ impl Chain { Ok(chain) } + /// Are we running with archive_mode enabled? + pub fn archive_mode(&self) -> bool { + self.archive_mode + } + /// Return our shared header MMR handle. pub fn header_pmmr(&self) -> Arc>> { self.header_pmmr.clone() @@ -1105,6 +1110,11 @@ impl Chain { /// If beyond the horizon then we cannot sync via recent full blocks /// and we need a state (txhashset) sync. pub fn check_txhashset_needed(&self, fork_point: &BlockHeader) -> Result { + if self.archive_mode() { + debug!("check_txhashset_needed: we are running with archive_mode=true, not needed"); + return Ok(false); + } + let header_head = self.header_head()?; let horizon = global::cut_through_horizon() as u64; Ok(fork_point.height < header_head.height.saturating_sub(horizon)) @@ -1291,7 +1301,7 @@ impl Chain { header_pmmr: &txhashset::PMMRHandle, batch: &store::Batch<'_>, ) -> Result<(), Error> { - if self.archive_mode { + if self.archive_mode() { return Ok(()); } @@ -1377,13 +1387,14 @@ impl Chain { } // If we are not in archival mode remove historical blocks from the db. - if !self.archive_mode { + if !self.archive_mode() { self.remove_historical_blocks(&header_pmmr, &batch)?; } // Make sure our output_pos index is consistent with the UTXO set. txhashset.init_output_pos_index(&header_pmmr, &batch)?; + // TODO - Why is this part of chain compaction? // Rebuild our NRD kernel_pos index based on recent kernel history. txhashset.init_recent_kernel_pos_index(&header_pmmr, &batch)?; diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index 6d99af36c0..2f12176259 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -958,11 +958,6 @@ where } fn check_compact(&self) { - // Skip compaction if we are syncing. - if self.sync_state.is_syncing() { - return; - } - // Roll the dice to trigger compaction at 1/COMPACTION_CHECK chance per block, // uses a different thread to avoid blocking the caller thread (likely a peer) let mut rng = thread_rng(); diff --git a/servers/src/grin/sync/body_sync.rs b/servers/src/grin/sync/body_sync.rs index e78441f787..cd0f5de06d 100644 --- a/servers/src/grin/sync/body_sync.rs +++ b/servers/src/grin/sync/body_sync.rs @@ -14,6 +14,7 @@ use chrono::prelude::{DateTime, Utc}; use chrono::Duration; +use p2p::Capabilities; use rand::prelude::*; use std::cmp; use std::sync::Arc; @@ -71,6 +72,11 @@ impl BodySync { Ok(false) } + /// Is our local node running in archive_mode? + fn archive_mode(&self) -> bool { + self.chain.archive_mode() + } + /// Return true if txhashset download is needed (when requested block is under the horizon). /// Otherwise go request some missing blocks and return false. fn body_sync(&mut self) -> Result { @@ -85,26 +91,39 @@ impl BodySync { return Ok(true); } - // Find connected peers with strictly greater difficulty than us. - let peers_iter = || { - self.peers - .iter() - .with_difficulty(|x| x > head.total_difficulty) - .connected() - }; + let peers = { + // Find connected peers with strictly greater difficulty than us. + let peers_iter = || { + // If we are running with archive mode enabled we only want to sync + // from other archive nodes. + let cap = if self.archive_mode() { + Capabilities::BLOCK_HIST + } else { + Capabilities::UNKNOWN + }; + + self.peers + .iter() + .with_capabilities(cap) + .with_difficulty(|x| x > head.total_difficulty) + .connected() + }; + + // We prefer outbound peers with greater difficulty. + let mut peers: Vec<_> = peers_iter().outbound().into_iter().collect(); + if peers.is_empty() { + debug!("no outbound peers with more work, considering inbound"); + peers = peers_iter().inbound().into_iter().collect(); + } - // We prefer outbound peers with greater difficulty. - let mut peers: Vec<_> = peers_iter().outbound().into_iter().collect(); - if peers.is_empty() { - debug!("no outbound peers with more work, considering inbound"); - peers = peers_iter().inbound().into_iter().collect(); - } + // If we have no peers (outbound or inbound) then we are done for now. + if peers.is_empty() { + debug!("no peers (inbound or outbound) with more work"); + return Ok(false); + } - // If we have no peers (outbound or inbound) then we are done for now. - if peers.is_empty() { - debug!("no peers (inbound or outbound) with more work"); - return Ok(false); - } + peers + }; // if we have 5 peers to sync from then ask for 50 blocks total (peer_count * // 10) max will be 80 if all 8 peers are advertising more work From 2c25a618b332ac2e6cb02523403a570acd8502da Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 17:30:19 -0700 Subject: [PATCH 42/96] grin v5.3 (0069) cleanup and stop wrapping errors in other/unfit (#3616) --- chain/src/chain.rs | 67 ++++++++++------------------------------------ src/bin/grin.rs | 2 +- 2 files changed, 15 insertions(+), 54 deletions(-) diff --git a/chain/src/chain.rs b/chain/src/chain.rs index c0e26af76d..b93f616904 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -539,72 +539,33 @@ impl Chain { // This conversion also ensures a block received in "v2" has valid input features (prevents malleability). let b = self.convert_block_v2(b)?; - let (maybe_new_head, prev_head) = { + let (head, fork_point, prev_head) = { let mut header_pmmr = self.header_pmmr.write(); let mut txhashset = self.txhashset.write(); let batch = self.store.batch()?; let prev_head = batch.head()?; let mut ctx = self.new_ctx(opts, batch, &mut header_pmmr, &mut txhashset)?; - let maybe_new_head = pipe::process_block(&b, &mut ctx); + let (head, fork_point) = pipe::process_block(&b, &mut ctx)?; - // We have flushed txhashset extension changes to disk - // but not yet committed the batch. - // A node shutdown at this point can be catastrophic... - // We prevent this via the stop_lock (see above). - if maybe_new_head.is_ok() { - ctx.batch.commit()?; - } + ctx.batch.commit()?; // release the lock and let the batch go before post-processing - (maybe_new_head, prev_head) + (head, fork_point, prev_head) }; - match maybe_new_head { - Ok((head, fork_point)) => { - let prev = self.get_previous_header(&b.header)?; - let status = self.determine_status( - head, - Tip::from_header(&prev), - prev_head, - Tip::from_header(&fork_point), - ); + let prev = self.get_previous_header(&b.header)?; + let status = self.determine_status( + head, + Tip::from_header(&prev), + prev_head, + Tip::from_header(&fork_point), + ); - // notifying other parts of the system of the update - self.adapter.block_accepted(&b, status, opts); + // notifying other parts of the system of the update + self.adapter.block_accepted(&b, status, opts); - Ok(head) - } - Err(e) => match e.kind() { - ErrorKind::InvalidBlockProof(err) => { - debug!( - "Block {} at {}: block proof error: {:?}", - b.hash(), - b.header.height, - &err - ); - Err(e) - } - ErrorKind::Unfit(ref msg) => { - debug!( - "Block {} at {} is unfit at this time: {}", - b.hash(), - b.header.height, - msg - ); - Err(ErrorKind::Unfit(msg.clone()).into()) - } - _ => { - info!( - "Rejected block {} at {}: {:?}", - b.hash(), - b.header.height, - e - ); - Err(ErrorKind::Other(format!("Rejected block, {:?}", e)).into()) - } - }, - } + Ok(head) } /// Process a block header received during "header first" propagation. diff --git a/src/bin/grin.rs b/src/bin/grin.rs index 2ad21fbabd..6a2a96eae4 100644 --- a/src/bin/grin.rs +++ b/src/bin/grin.rs @@ -154,7 +154,7 @@ fn real_main() -> i32 { // Initialize our global chain_type and feature flags (NRD kernel support currently), accept_fee_base. // These are read via global and not read from config beyond this point. - global::init_global_chain_type(config.members.unwrap().server.chain_type); + global::init_global_chain_type(config.members.as_ref().unwrap().server.chain_type); info!("Chain: {:?}", global::get_chain_type()); match global::get_chain_type() { global::ChainTypes::Mainnet => { From 6237f54f06a4b76ef00fc67eda4d87f9c11f68e9 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 17:31:14 -0700 Subject: [PATCH 43/96] grin v5.3 (0070) enhance comment describing how a pow is hashed (#3623) --- core/src/pow/types.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/pow/types.rs b/core/src/pow/types.rs index 83ba200703..9cbb239d52 100644 --- a/core/src/pow/types.rs +++ b/core/src/pow/types.rs @@ -303,8 +303,11 @@ impl ProofOfWork { /// /// The hash of the `Proof` is the hash of its packed nonces when serializing /// them at their exact bit size. The resulting bit sequence is padded to be -/// byte-aligned. -/// +/// byte-aligned. We form a PROOFSIZE*edge_bits integer by packing the PROOFSIZE edge +/// indices together, with edge index i occupying bits i * edge_bits through +/// (i+1) * edge_bits - 1, padding it with up to 7 0-bits to a multiple of 8 bits, +/// writing as a little endian byte array, and hashing with blake2b using 256 bit digest. + #[derive(Clone, PartialOrd, PartialEq, Serialize)] pub struct Proof { /// Power of 2 used for the size of the cuckoo graph From 2d8a6feb2d195ea6de134dc930314379ca7688df Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 18:10:43 -0700 Subject: [PATCH 44/96] grin v5.3 (0071) never speak of the verifier cache again (#3628) --- api/src/foreign.rs | 11 +- api/src/foreign_rpc.rs | 4 +- api/src/handlers.rs | 24 +-- api/src/handlers/pool_api.rs | 30 ++- chain/src/chain.rs | 5 - chain/src/pipe.rs | 8 +- chain/tests/chain_test_helper.rs | 5 - chain/tests/mine_simple_chain.rs | 5 - chain/tests/process_block_cut_through.rs | 9 +- chain/tests/test_coinbase_maturity.rs | 5 - core/src/consensus.rs | 3 + core/src/core.rs | 1 - core/src/core/block.rs | 11 +- core/src/core/transaction.rs | 18 +- core/src/core/verifier_cache.rs | 103 ---------- core/src/libtx/build.rs | 23 +-- core/tests/block.rs | 51 ++--- core/tests/core.rs | 229 ++++++----------------- core/tests/pmmr.rs | 12 -- core/tests/transaction.rs | 17 +- core/tests/verifier_cache.rs | 61 ------ etc/gen_gen/src/bin/gen_gen.rs | 11 +- p2p/src/libp2p_connection.rs | 4 +- pool/fuzz/fuzz_targets/common.rs | 21 +-- pool/src/pool.rs | 33 +--- pool/src/transaction_pool.rs | 42 +---- pool/tests/block_building.rs | 12 +- pool/tests/block_max_weight.rs | 12 +- pool/tests/block_reconciliation.rs | 12 +- pool/tests/coinbase_maturity.rs | 12 +- pool/tests/common.rs | 12 +- pool/tests/nrd_kernel_relative_height.rs | 12 +- pool/tests/nrd_kernels_disabled.rs | 12 +- pool/tests/nrd_kernels_enabled.rs | 12 +- pool/tests/transaction_pool.rs | 16 +- servers/src/common/adapters.rs | 35 ++-- servers/src/grin/dandelion_monitor.rs | 28 +-- servers/src/grin/server.rs | 20 +- servers/src/lib.rs | 2 +- servers/src/mining/mine_block.rs | 22 +-- servers/src/mining/stratumserver.rs | 15 +- servers/src/mining/test_miner.rs | 6 +- 42 files changed, 203 insertions(+), 783 deletions(-) delete mode 100644 core/src/core/verifier_cache.rs delete mode 100644 core/tests/verifier_cache.rs diff --git a/api/src/foreign.rs b/api/src/foreign.rs index e29f1d2322..e9208a832b 100644 --- a/api/src/foreign.rs +++ b/api/src/foreign.rs @@ -18,7 +18,6 @@ use crate::chain::{Chain, SyncState}; use crate::core::core::hash::Hash; use crate::core::core::hash::Hashed; use crate::core::core::transaction::Transaction; -use crate::core::core::verifier_cache::VerifierCache; use crate::handlers::blocks_api::{BlockHandler, HeaderHandler}; use crate::handlers::chain_api::{ChainHandler, KernelHandler, OutputHandler}; use crate::handlers::pool_api::PoolHandler; @@ -43,23 +42,21 @@ use std::sync::Weak; /// Methods in this API are intended to be 'single use'. /// -pub struct Foreign +pub struct Foreign where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { pub peers: Weak, pub chain: Weak, - pub tx_pool: Weak>>, + pub tx_pool: Weak>>, pub sync_state: Weak, } -impl Foreign +impl Foreign where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { /// Create a new API instance with the chain, transaction pool, peers and `sync_state`. All subsequent /// API calls will operate on this instance of node API. @@ -78,7 +75,7 @@ where pub fn new( peers: Weak, chain: Weak, - tx_pool: Weak>>, + tx_pool: Weak>>, sync_state: Weak, ) -> Self { Foreign { diff --git a/api/src/foreign_rpc.rs b/api/src/foreign_rpc.rs index f33c271302..2d38642b5c 100644 --- a/api/src/foreign_rpc.rs +++ b/api/src/foreign_rpc.rs @@ -16,7 +16,6 @@ use crate::core::core::hash::Hash; use crate::core::core::transaction::Transaction; -use crate::core::core::verifier_cache::VerifierCache; use crate::foreign::Foreign; use crate::pool::PoolEntry; use crate::pool::{BlockChain, PoolAdapter}; @@ -904,11 +903,10 @@ pub trait ForeignRpc: Sync + Send { fn get_libp2p_messages(&self) -> Result; } -impl ForeignRpc for Foreign +impl ForeignRpc for Foreign where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { fn get_header( &self, diff --git a/api/src/handlers.rs b/api/src/handlers.rs index e1787c05a2..2c75bf575b 100644 --- a/api/src/handlers.rs +++ b/api/src/handlers.rs @@ -42,7 +42,6 @@ use crate::auth::{ }; use crate::chain; use crate::chain::{Chain, SyncState}; -use crate::core::core::verifier_cache::VerifierCache; use crate::core::global; use crate::core::stratum; use crate::foreign::Foreign; @@ -71,10 +70,10 @@ use std::thread; /// Listener version, providing same API but listening for requests on a /// port and wrapping the calls -pub fn node_apis( +pub fn node_apis( addr: &str, chain: Arc, - tx_pool: Arc>>, + tx_pool: Arc>>, peers: Arc, sync_state: Arc, api_secret: Option, @@ -88,7 +87,6 @@ pub fn node_apis( where B: BlockChain + 'static, P: PoolAdapter + 'static, - V: VerifierCache + 'static, { // Manually build router when getting rid of v1 //let mut router = Router::new(); @@ -241,29 +239,27 @@ impl crate::router::Handler for OwnerAPIHandlerV2 { } /// V2 API Handler/Wrapper for foreign functions -pub struct ForeignAPIHandlerV2 +pub struct ForeignAPIHandlerV2 where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { pub peers: Weak, pub chain: Weak, - pub tx_pool: Weak>>, + pub tx_pool: Weak>>, pub sync_state: Weak, } -impl ForeignAPIHandlerV2 +impl ForeignAPIHandlerV2 where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { /// Create a new foreign API handler for GET methods pub fn new( peers: Weak, chain: Weak, - tx_pool: Weak>>, + tx_pool: Weak>>, sync_state: Weak, ) -> Self { ForeignAPIHandlerV2 { @@ -275,11 +271,10 @@ where } } -impl crate::router::Handler for ForeignAPIHandlerV2 +impl crate::router::Handler for ForeignAPIHandlerV2 where B: BlockChain + 'static, P: PoolAdapter + 'static, - V: VerifierCache + 'static, { fn post(&self, req: Request) -> ResponseFuture { let api = Foreign::new( @@ -425,9 +420,9 @@ fn response>(status: StatusCode, text: T) -> Response { since = "4.0.0", note = "The V1 Node API will be removed in grin 5.0.0. Please migrate to the V2 API as soon as possible." )]*/ -pub fn build_router( +pub fn build_router( chain: Arc, - tx_pool: Arc>>, + tx_pool: Arc>>, peers: Arc, sync_state: Arc, allow_to_stop: bool, @@ -435,7 +430,6 @@ pub fn build_router( where B: BlockChain + 'static, P: PoolAdapter + 'static, - V: VerifierCache + 'static, { let route_list = vec![ "get blocks".to_string(), diff --git a/api/src/handlers/pool_api.rs b/api/src/handlers/pool_api.rs index a9d5630e7d..f8a46bfb33 100644 --- a/api/src/handlers/pool_api.rs +++ b/api/src/handlers/pool_api.rs @@ -14,7 +14,6 @@ use super::utils::w; use crate::core::core::hash::Hashed; -use crate::core::core::verifier_cache::VerifierCache; use crate::core::core::Transaction; use crate::core::ser::{self, ProtocolVersion}; use crate::pool::{self, BlockChain, PoolAdapter, PoolEntry}; @@ -29,20 +28,18 @@ use std::sync::Weak; /// Get basic information about the transaction pool. /// GET /v1/pool -pub struct PoolInfoHandler +pub struct PoolInfoHandler where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { - pub tx_pool: Weak>>, + pub tx_pool: Weak>>, } -impl Handler for PoolInfoHandler +impl Handler for PoolInfoHandler where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { fn get(&self, _req: Request) -> ResponseFuture { let pool_arc = w_fut!(&self.tx_pool); @@ -54,20 +51,18 @@ where } } -pub struct PoolHandler +pub struct PoolHandler where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { - pub tx_pool: Weak>>, + pub tx_pool: Weak>>, } -impl PoolHandler +impl PoolHandler where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { pub fn get_pool_size(&self) -> Result { let pool_arc = w(&self.tx_pool)?; @@ -121,23 +116,21 @@ struct TxWrapper { /// Push new transaction to our local transaction pool. /// POST /v1/pool/push_tx -pub struct PoolPushHandler +pub struct PoolPushHandler where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { - pub tx_pool: Weak>>, + pub tx_pool: Weak>>, } -async fn update_pool( - pool: Weak>>, +async fn update_pool( + pool: Weak>>, req: Request, ) -> Result<(), Error> where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { let pool = w(&pool)?; let params = QueryParams::from(req.uri().query()); @@ -181,11 +174,10 @@ where Ok(()) } -impl Handler for PoolPushHandler +impl Handler for PoolPushHandler where B: BlockChain + 'static, P: PoolAdapter + 'static, - V: VerifierCache + 'static, { fn post(&self, req: Request) -> ResponseFuture { let pool = self.tx_pool.clone(); diff --git a/chain/src/chain.rs b/chain/src/chain.rs index b93f616904..506fe50a5c 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -17,7 +17,6 @@ use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::merkle_proof::MerkleProof; -use crate::core::core::verifier_cache::VerifierCache; use crate::core::core::{ Block, BlockHeader, BlockSums, Committed, Inputs, KernelFeatures, Output, OutputIdentifier, SegmentIdentifier, Transaction, TxKernel, @@ -156,7 +155,6 @@ pub struct Chain { txhashset: Arc>, header_pmmr: Arc>>, sync_pmmr: Arc>>, - verifier_cache: Arc>, pibd_segmenter: Arc>>, // POW verification function pow_verifier: fn(&BlockHeader) -> Result<(), pow::Error>, @@ -173,7 +171,6 @@ impl Chain { adapter: Arc, genesis: Block, pow_verifier: fn(&BlockHeader) -> Result<(), pow::Error>, - verifier_cache: Arc>, archive_mode: bool, ) -> Result { let store = Arc::new(store::ChainStore::new(&db_root)?); @@ -225,7 +222,6 @@ impl Chain { sync_pmmr: Arc::new(RwLock::new(sync_pmmr)), pibd_segmenter: Arc::new(RwLock::new(None)), pow_verifier, - verifier_cache, archive_mode, genesis: genesis.header, }; @@ -614,7 +610,6 @@ impl Chain { Ok(pipe::BlockContext { opts, pow_verifier: self.pow_verifier, - verifier_cache: self.verifier_cache.clone(), header_pmmr, txhashset, batch, diff --git a/chain/src/pipe.rs b/chain/src/pipe.rs index 8d43d0a147..8e69d5decf 100644 --- a/chain/src/pipe.rs +++ b/chain/src/pipe.rs @@ -16,7 +16,6 @@ use crate::core::consensus; use crate::core::core::hash::Hashed; -use crate::core::core::verifier_cache::VerifierCache; use crate::core::core::Committed; use crate::core::core::{ block, Block, BlockHeader, BlockSums, HeaderVersion, OutputIdentifier, TransactionBody, @@ -27,11 +26,10 @@ use crate::error::{Error, ErrorKind}; use crate::store; use crate::txhashset; use crate::types::{CommitPos, Options, Tip}; -use crate::util::RwLock; use grin_core::core::hash::Hash; +use grin_util::RwLock; use std::collections::HashSet; use std::iter::FromIterator; -use std::sync::Arc; /// Contextual information required to process a new block and either reject or /// accept it. @@ -46,8 +44,6 @@ pub struct BlockContext<'a> { pub header_pmmr: &'a mut txhashset::PMMRHandle, /// The active batch to use for block processing. pub batch: store::Batch<'a>, - /// The verifier cache (caching verifier for rangeproofs and kernel signatures) - pub verifier_cache: Arc>, } lazy_static! { @@ -540,7 +536,7 @@ fn validate_header(header: &BlockHeader, ctx: &mut BlockContext<'_>) -> Result<( fn validate_block(block: &Block, ctx: &mut BlockContext<'_>) -> Result<(), Error> { let prev = ctx.batch.get_previous_header(&block.header)?; block - .validate(&prev.total_kernel_offset, ctx.verifier_cache.clone()) + .validate(&prev.total_kernel_offset) .map_err(ErrorKind::InvalidBlockProof)?; Ok(()) } diff --git a/chain/tests/chain_test_helper.rs b/chain/tests/chain_test_helper.rs index 72ecb59817..c9e33c75fe 100644 --- a/chain/tests/chain_test_helper.rs +++ b/chain/tests/chain_test_helper.rs @@ -16,19 +16,16 @@ use self::chain::types::NoopAdapter; use self::chain::types::Options; use self::chain::Chain; use self::core::core::hash::Hashed; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::core::Block; use self::core::genesis; use self::core::global::ChainTypes; use self::core::libtx::{self, reward}; use self::core::{consensus, global, pow}; use self::keychain::{ExtKeychainPath, Keychain}; -use self::util::RwLock; use chrono::Duration; use grin_chain as chain; use grin_core as core; use grin_keychain as keychain; -use grin_util as util; use std::fs; use std::sync::Arc; @@ -37,13 +34,11 @@ pub fn clean_output_dir(dir_name: &str) { } pub fn init_chain(dir_name: &str, genesis: Block) -> Chain { - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); Chain::init( dir_name.to_string(), Arc::new(NoopAdapter {}), genesis, pow::verify_size, - verifier_cache, false, ) .unwrap() diff --git a/chain/tests/mine_simple_chain.rs b/chain/tests/mine_simple_chain.rs index f727ece8a7..2d3dc30557 100644 --- a/chain/tests/mine_simple_chain.rs +++ b/chain/tests/mine_simple_chain.rs @@ -15,7 +15,6 @@ use self::chain::types::{NoopAdapter, Tip}; use self::chain::Chain; use self::core::core::hash::Hashed; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::core::{Block, BlockHeader, KernelFeatures, Transaction}; use self::core::global::ChainTypes; use self::core::libtx::{self, build, ProofBuilder}; @@ -56,13 +55,11 @@ impl ChainAdapter for StatusAdapter { fn setup_with_status_adapter(dir_name: &str, genesis: Block, adapter: Arc) -> Chain { util::init_test_logger(); clean_output_dir(dir_name); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); let chain = chain::Chain::init( dir_name.to_string(), adapter, genesis, pow::verify_size, - verifier_cache, false, ) .unwrap(); @@ -925,13 +922,11 @@ where fn actual_diff_iter_output() { global::set_local_chain_type(ChainTypes::AutomatedTesting); let genesis_block = pow::mine_genesis_block().unwrap(); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); let chain = chain::Chain::init( "../.mwc".to_string(), Arc::new(NoopAdapter {}), genesis_block, pow::verify_size, - verifier_cache, false, ) .unwrap(); diff --git a/chain/tests/process_block_cut_through.rs b/chain/tests/process_block_cut_through.rs index 33c20acc9b..ad26f9c512 100644 --- a/chain/tests/process_block_cut_through.rs +++ b/chain/tests/process_block_cut_through.rs @@ -21,15 +21,12 @@ use grin_util as util; use self::chain_test_helper::{clean_output_dir, genesis_block, init_chain}; use crate::chain::{pipe, Chain, Options}; -use crate::core::core::verifier_cache::LruVerifierCache; use crate::core::core::{block, pmmr, transaction}; use crate::core::core::{Block, FeeFields, KernelFeatures, Transaction, Weighting}; use crate::core::libtx::{build, reward, ProofBuilder}; use crate::core::{consensus, global, pow}; use crate::keychain::{ExtKeychain, ExtKeychainPath, Keychain, SwitchCommitmentType}; -use crate::util::RwLock; use chrono::Duration; -use std::sync::Arc; fn build_block( chain: &Chain, @@ -142,12 +139,10 @@ fn process_block_cut_through() -> Result<(), chain::Error> { .iter() .any(|output| output.commitment() == commit)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); - // Transaction is invalid due to cut-through. let height = 7; assert_eq!( - tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height), + tx.validate(Weighting::AsTransaction, height), Err(transaction::Error::CutThrough), ); @@ -163,7 +158,7 @@ fn process_block_cut_through() -> Result<(), chain::Error> { // The block is invalid due to cut-through. let prev = chain.head_header()?; assert_eq!( - block.validate(&prev.total_kernel_offset(), verifier_cache), + block.validate(&prev.total_kernel_offset()), Err(block::Error::Transaction(transaction::Error::CutThrough)) ); diff --git a/chain/tests/test_coinbase_maturity.rs b/chain/tests/test_coinbase_maturity.rs index 4f4cfaf005..19f2f59945 100644 --- a/chain/tests/test_coinbase_maturity.rs +++ b/chain/tests/test_coinbase_maturity.rs @@ -14,14 +14,12 @@ use self::chain::types::NoopAdapter; use self::chain::ErrorKind; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::core::KernelFeatures; use self::core::global::{self, ChainTypes}; use self::core::libtx::{self, build, ProofBuilder}; use self::core::pow::Difficulty; use self::core::{consensus, pow}; use self::keychain::{ExtKeychain, ExtKeychainPath, Keychain}; -use self::util::RwLock; use chrono::Duration; use grin_chain as chain; use grin_core as core; @@ -43,15 +41,12 @@ fn test_coinbase_maturity() { let genesis_block = pow::mine_genesis_block().unwrap(); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); - { let chain = chain::Chain::init( chain_dir.to_string(), Arc::new(NoopAdapter {}), genesis_block, pow::verify_size, - verifier_cache, false, ) .unwrap(); diff --git a/core/src/consensus.rs b/core/src/consensus.rs index fe548a7f8c..e082c54bef 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -145,6 +145,9 @@ pub const TESTING_SECOND_HARD_FORK: u64 = 6; /// AutomatedTesting and UserTesting HF3 height. pub const TESTING_THIRD_HARD_FORK: u64 = 9; +/// Fork every 3 blocks +pub const TESTING_HARD_FORK_INTERVAL: u64 = 3; + /// Check whether the block version is valid at a given height /// MWC doesn't want like grin change the algorithms for mining. So version is constant pub fn header_version(height: u64) -> HeaderVersion { diff --git a/core/src/core.rs b/core/src/core.rs index 2984f9fda7..b7f4b28100 100644 --- a/core/src/core.rs +++ b/core/src/core.rs @@ -23,7 +23,6 @@ pub mod id; pub mod merkle_proof; pub mod pmmr; pub mod transaction; -pub mod verifier_cache; use crate::consensus::GRIN_BASE; use util::secp::pedersen::Commitment; diff --git a/core/src/core/block.rs b/core/src/core/block.rs index 64b8a1a1a1..21dd78889c 100644 --- a/core/src/core/block.rs +++ b/core/src/core/block.rs @@ -18,7 +18,6 @@ use crate::consensus::{self, calc_mwc_block_overage, calc_mwc_block_reward, rewa use crate::core::committed::{self, Committed}; use crate::core::compact_block::CompactBlock; use crate::core::hash::{DefaultHashable, Hash, Hashed, ZERO_HASH}; -use crate::core::verifier_cache::VerifierCache; use crate::core::{ pmmr, transaction, Commitment, Inputs, KernelFeatures, Output, Transaction, TransactionBody, TxKernel, Weighting, @@ -34,9 +33,7 @@ use chrono::Duration; use failure::Fail; use keychain::{self, BlindingFactor}; use std::convert::TryInto; -use std::sync::Arc; use util::from_hex; -use util::RwLock; use util::{secp, static_secp_instance}; /// Errors thrown by Block validation @@ -768,12 +765,8 @@ impl Block { /// Validates all the elements in a block that can be checked without /// additional data. Includes commitment sums and kernels, Merkle /// trees, reward, etc. - pub fn validate( - &self, - prev_kernel_offset: &BlindingFactor, - verifier: Arc>, - ) -> Result { - self.body.validate(Weighting::AsBlock, verifier)?; + pub fn validate(&self, prev_kernel_offset: &BlindingFactor) -> Result { + self.body.validate(Weighting::AsBlock)?; self.verify_kernel_lock_heights()?; self.verify_nrd_kernels_for_header_version()?; diff --git a/core/src/core/transaction.rs b/core/src/core/transaction.rs index f0b744150d..fdc51c36ee 100644 --- a/core/src/core/transaction.rs +++ b/core/src/core/transaction.rs @@ -16,7 +16,6 @@ use crate::core::block::HeaderVersion; use crate::core::hash::{DefaultHashable, Hashed}; -use crate::core::verifier_cache::VerifierCache; use crate::core::{committed, Committed}; use crate::libtx::{aggsig, secp_ser}; use crate::ser::{ @@ -33,12 +32,10 @@ use std::cmp::{max, min}; use std::convert::{TryFrom, TryInto}; use std::fmt; use std::fmt::Display; -use std::sync::Arc; use util; use util::secp; use util::secp::pedersen::{Commitment, RangeProof}; use util::static_secp_instance; -use util::RwLock; use util::ToHex; /// Fee fields as in fix-fees RFC: { future_use: 20, fee_shift: 4, fee: 40 } @@ -1306,11 +1303,7 @@ impl TransactionBody { /// Validates all relevant parts of a transaction body. Checks the /// excess value against the signature as well as range proofs for each /// output. - pub fn validate( - &self, - weighting: Weighting, - _verifier: Arc>, - ) -> Result<(), Error> { + pub fn validate(&self, weighting: Weighting) -> Result<(), Error> { self.validate_read(weighting)?; // Now batch verify all those unverified rangeproofs @@ -1522,14 +1515,9 @@ impl Transaction { /// Validates all relevant parts of a fully built transaction. Checks the /// excess value against the signature as well as range proofs for each /// output. - pub fn validate( - &self, - weighting: Weighting, - verifier: Arc>, - height: u64, - ) -> Result<(), Error> { + pub fn validate(&self, weighting: Weighting, height: u64) -> Result<(), Error> { self.body.verify_features()?; - self.body.validate(weighting, verifier)?; + self.body.validate(weighting)?; self.verify_kernel_sums(self.overage(height), self.offset.clone())?; Ok(()) } diff --git a/core/src/core/verifier_cache.rs b/core/src/core/verifier_cache.rs deleted file mode 100644 index 6e1a0836e9..0000000000 --- a/core/src/core/verifier_cache.rs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2020 The Grin Developers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! VerifierCache trait for batch verifying outputs and kernels. -//! We pass a "caching verifier" into the block validation processing with this. - -use crate::core::hash::{Hash, Hashed}; -use crate::core::{Output, TxKernel}; -use lru_cache::LruCache; - -/// Verifier cache for caching expensive verification results. -/// Specifically the following - -/// * kernel signature verification -/// * output rangeproof verification -pub trait VerifierCache: Sync + Send { - /// Takes a vec of tx kernels and returns those kernels - /// that have not yet been verified. - fn filter_kernel_sig_unverified(&mut self, kernels: &[TxKernel]) -> Vec; - /// Takes a vec of tx outputs and returns those outputs - /// that have not yet had their rangeproofs verified. - fn filter_rangeproof_unverified(&mut self, outputs: &[Output]) -> Vec; - /// Adds a vec of tx kernels to the cache (used in conjunction with the the filter above). - fn add_kernel_sig_verified(&mut self, kernels: Vec); - /// Adds a vec of outputs to the cache (used in conjunction with the the filter above). - fn add_rangeproof_verified(&mut self, outputs: Vec); -} - -/// An implementation of verifier_cache using lru_cache. -/// Caches tx kernels by kernel hash. -/// Caches outputs by output rangeproof hash (rangeproofs are committed to separately). -pub struct LruVerifierCache { - kernel_sig_verification_cache: LruCache, - rangeproof_verification_cache: LruCache, -} - -impl LruVerifierCache { - /// TODO how big should these caches be? - /// They need to be *at least* large enough to cover a maxed out block. - pub fn new() -> LruVerifierCache { - LruVerifierCache { - kernel_sig_verification_cache: LruCache::new(50_000), - rangeproof_verification_cache: LruCache::new(50_000), - } - } -} - -impl VerifierCache for LruVerifierCache { - fn filter_kernel_sig_unverified(&mut self, kernels: &[TxKernel]) -> Vec { - let res = kernels - .iter() - .filter(|x| !self.kernel_sig_verification_cache.contains_key(&x.hash())) - .cloned() - .collect::>(); - trace!( - "lru_verifier_cache: kernel sigs: {}, not cached (must verify): {}", - kernels.len(), - res.len() - ); - res - } - - fn filter_rangeproof_unverified(&mut self, outputs: &[Output]) -> Vec { - let res = outputs - .iter() - .filter(|x| { - !self - .rangeproof_verification_cache - .contains_key(&x.proof.hash()) - }) - .cloned() - .collect::>(); - trace!( - "lru_verifier_cache: rangeproofs: {}, not cached (must verify): {}", - outputs.len(), - res.len() - ); - res - } - - fn add_kernel_sig_verified(&mut self, kernels: Vec) { - for k in kernels { - self.kernel_sig_verification_cache.insert(k.hash(), ()); - } - } - - fn add_rangeproof_verified(&mut self, outputs: Vec) { - for o in outputs { - self.rangeproof_verification_cache - .insert(o.proof.hash(), ()); - } - } -} diff --git a/core/src/libtx/build.rs b/core/src/libtx/build.rs index 1e9ff51c2b..236aa1fd72 100644 --- a/core/src/libtx/build.rs +++ b/core/src/libtx/build.rs @@ -253,20 +253,12 @@ where // Just a simple test, most exhaustive tests in the core. #[cfg(test)] mod test { - use std::sync::Arc; - use util::RwLock; - use super::*; use crate::core::transaction::Weighting; - use crate::core::verifier_cache::{LruVerifierCache, VerifierCache}; use crate::global; use crate::libtx::ProofBuilder; use keychain::{ExtKeychain, ExtKeychainPath}; - fn verifier_cache() -> Arc> { - Arc::new(RwLock::new(LruVerifierCache::new())) - } - #[test] fn blind_simple_tx() { global::set_local_chain_type(global::ChainTypes::AutomatedTesting); @@ -276,8 +268,6 @@ mod test { let key_id2 = ExtKeychainPath::new(1, 2, 0, 0, 0).to_identifier(); let key_id3 = ExtKeychainPath::new(1, 3, 0, 0, 0).to_identifier(); - let vc = verifier_cache(); - let tx = transaction( KernelFeatures::Plain { fee: 2.into() }, &[input(10, key_id1), input(12, key_id2), output(20, key_id3)], @@ -287,8 +277,7 @@ mod test { .unwrap(); let height = 42; // arbitrary - tx.validate(Weighting::AsTransaction, vc.clone(), height) - .unwrap(); + tx.validate(Weighting::AsTransaction, height).unwrap(); } #[test] @@ -300,8 +289,6 @@ mod test { let key_id2 = ExtKeychainPath::new(1, 2, 0, 0, 0).to_identifier(); let key_id3 = ExtKeychainPath::new(1, 3, 0, 0, 0).to_identifier(); - let vc = verifier_cache(); - let tx = transaction( KernelFeatures::Plain { fee: 2.into() }, &[input(10, key_id1), input(12, key_id2), output(20, key_id3)], @@ -311,8 +298,7 @@ mod test { .unwrap(); let height = 42; // arbitrary - tx.validate(Weighting::AsTransaction, vc.clone(), height) - .unwrap(); + tx.validate(Weighting::AsTransaction, height).unwrap(); } #[test] @@ -323,8 +309,6 @@ mod test { let key_id1 = ExtKeychainPath::new(1, 1, 0, 0, 0).to_identifier(); let key_id2 = ExtKeychainPath::new(1, 2, 0, 0, 0).to_identifier(); - let vc = verifier_cache(); - let tx = transaction( KernelFeatures::Plain { fee: 4.into() }, &[input(6, key_id1), output(2, key_id2)], @@ -334,7 +318,6 @@ mod test { .unwrap(); let height = 42; // arbitrary - tx.validate(Weighting::AsTransaction, vc.clone(), height) - .unwrap(); + tx.validate(Weighting::AsTransaction, height).unwrap(); } } diff --git a/core/tests/block.rs b/core/tests/block.rs index 7f4350763a..37e055ec86 100644 --- a/core/tests/block.rs +++ b/core/tests/block.rs @@ -22,7 +22,6 @@ use crate::core::core::transaction::{ self, FeeFields, KernelFeatures, NRDRelativeHeight, Output, OutputFeatures, OutputIdentifier, Transaction, }; -use crate::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; use crate::core::core::{Committed, CompactBlock}; use crate::core::libtx::build::{self, input, output}; use crate::core::libtx::ProofBuilder; @@ -30,8 +29,7 @@ use crate::core::{global, pow, ser}; use chrono::Duration; use grin_core as core; use keychain::{BlindingFactor, ExtKeychain, Keychain}; -use std::sync::Arc; -use util::{secp, RwLock, ToHex}; +use util::{secp, ToHex}; // Setup test with AutomatedTesting chain_type; fn test_setup() { @@ -39,10 +37,6 @@ fn test_setup() { global::set_local_chain_type(global::ChainTypes::AutomatedTesting); } -fn verifier_cache() -> Arc> { - Arc::new(RwLock::new(LruVerifierCache::new())) -} - #[test] fn too_large_block() { test_setup(); @@ -72,9 +66,7 @@ fn too_large_block() { let prev = BlockHeader::default(); let key_id = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); let b = new_block(&[tx], &keychain, &builder, &prev, &key_id); - assert!(b - .validate(&BlindingFactor::zero(), verifier_cache()) - .is_err()); + assert!(b.validate(&BlindingFactor::zero()).is_err()); } #[test] @@ -131,7 +123,7 @@ fn block_with_nrd_kernel_pre_post_hf3() { // Block is invalid at header version 3 if it contains an NRD kernel. assert_eq!(b.header.version, HeaderVersion(3)); assert_eq!( - b.validate(&BlindingFactor::zero(), verifier_cache()), + b.validate(&BlindingFactor::zero()), Err(Error::NRDKernelPreHF3) ); @@ -152,9 +144,7 @@ fn block_with_nrd_kernel_pre_post_hf3() { // Block is valid at header version 4 (at HF height) if it contains an NRD kernel. assert_eq!(b.header.height, consensus::TESTING_THIRD_HARD_FORK); assert_eq!(b.header.version, HeaderVersion(4)); - assert!(b - .validate(&BlindingFactor::zero(), verifier_cache()) - .is_ok()); + assert!(b.validate(&BlindingFactor::zero()).is_ok()); let prev_height = consensus::TESTING_THIRD_HARD_FORK; let prev = BlockHeader { @@ -172,9 +162,7 @@ fn block_with_nrd_kernel_pre_post_hf3() { // Block is valid at header version 4 if it contains an NRD kernel. assert_eq!(b.header.version, HeaderVersion(4)); - assert!(b - .validate(&BlindingFactor::zero(), verifier_cache()) - .is_ok()); + assert!(b.validate(&BlindingFactor::zero()).is_ok()); } #[test] @@ -217,7 +205,7 @@ fn block_with_nrd_kernel_nrd_not_enabled() { // Block is invalid as NRD not enabled. assert_eq!(b.header.version, HeaderVersion(3)); assert_eq!( - b.validate(&BlindingFactor::zero(), verifier_cache()), + b.validate(&BlindingFactor::zero()), Err(Error::NRDKernelNotEnabled) ); @@ -239,7 +227,7 @@ fn block_with_nrd_kernel_nrd_not_enabled() { assert_eq!(b.header.height, consensus::TESTING_THIRD_HARD_FORK); assert_eq!(b.header.version, HeaderVersion(4)); assert_eq!( - b.validate(&BlindingFactor::zero(), verifier_cache()), + b.validate(&BlindingFactor::zero()), Err(Error::NRDKernelNotEnabled) ); @@ -260,7 +248,7 @@ fn block_with_nrd_kernel_nrd_not_enabled() { // Block is invalid as NRD not enabled. assert_eq!(b.header.version, HeaderVersion(4)); assert_eq!( - b.validate(&BlindingFactor::zero(), verifier_cache()), + b.validate(&BlindingFactor::zero()), Err(Error::NRDKernelNotEnabled) ); } @@ -293,8 +281,7 @@ fn block_with_cut_through() { // block should have been automatically compacted (including reward // output) and should still be valid - b.validate(&BlindingFactor::zero(), verifier_cache()) - .unwrap(); + b.validate(&BlindingFactor::zero()).unwrap(); assert_eq!(b.inputs().len(), 3); assert_eq!(b.outputs().len(), 3); } @@ -330,9 +317,7 @@ fn empty_block_with_coinbase_is_valid() { // the block should be valid here (single coinbase output with corresponding // txn kernel) - assert!(b - .validate(&BlindingFactor::zero(), verifier_cache()) - .is_ok()); + assert!(b.validate(&BlindingFactor::zero()).is_ok()); } #[test] @@ -358,7 +343,7 @@ fn remove_coinbase_output_flag() { .verify_kernel_sums(b.header.overage(), b.header.total_kernel_offset()) .is_ok()); assert_eq!( - b.validate(&BlindingFactor::zero(), verifier_cache()), + b.validate(&BlindingFactor::zero()), Err(Error::CoinbaseSumMismatch) ); } @@ -389,7 +374,7 @@ fn remove_coinbase_kernel_flag() { // Also results in the block no longer validating correctly // because the message being signed on each tx kernel includes the kernel features. assert_eq!( - b.validate(&BlindingFactor::zero(), verifier_cache()), + b.validate(&BlindingFactor::zero()), Err(Error::Transaction(transaction::Error::IncorrectSignature)) ); } @@ -789,7 +774,7 @@ fn same_amount_outputs_copy_range_proof() { // block should have been automatically compacted (including reward // output) and should still be valid - match b.validate(&BlindingFactor::zero(), verifier_cache()) { + match b.validate(&BlindingFactor::zero()) { Err(Error::Transaction(transaction::Error::Secp(secp::Error::InvalidRangeProof))) => {} _ => panic!("Bad range proof should be invalid"), } @@ -841,7 +826,7 @@ fn wrong_amount_range_proof() { // block should have been automatically compacted (including reward // output) and should still be valid - match b.validate(&BlindingFactor::zero(), verifier_cache()) { + match b.validate(&BlindingFactor::zero()) { Err(Error::Transaction(transaction::Error::Secp(secp::Error::InvalidRangeProof))) => {} _ => panic!("Bad range proof should be invalid"), } @@ -918,7 +903,7 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { // The block should fail validation due to cut-through. assert_eq!( - block.validate(&BlindingFactor::zero(), verifier_cache()), + block.validate(&BlindingFactor::zero()), Err(Error::Transaction(transaction::Error::CutThrough)) ); @@ -939,7 +924,7 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { .replace_outputs(outputs); // Block validates successfully after applying cut-through. - block.validate(&BlindingFactor::zero(), verifier_cache())?; + block.validate(&BlindingFactor::zero())?; // Block validates via lightweight "read" validation. block.validate_read()?; @@ -987,7 +972,7 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { // The block should fail validation due to cut-through. assert_eq!( - block.validate(&BlindingFactor::zero(), verifier_cache()), + block.validate(&BlindingFactor::zero()), Err(Error::Transaction(transaction::Error::CutThrough)) ); @@ -1008,7 +993,7 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { .replace_outputs(outputs); // Block validates successfully after applying cut-through. - block.validate(&BlindingFactor::zero(), verifier_cache())?; + block.validate(&BlindingFactor::zero())?; // Block validates via lightweight "read" validation. block.validate_read()?; diff --git a/core/tests/core.rs b/core/tests/core.rs index 2e519115af..02c71c3a27 100644 --- a/core/tests/core.rs +++ b/core/tests/core.rs @@ -19,7 +19,6 @@ pub mod common; use self::core::core::block::BlockHeader; use self::core::core::block::Error::KernelLockHeight; use self::core::core::hash::{Hashed, ZERO_HASH}; -use self::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; use self::core::core::{ aggregate, deaggregate, FeeFields, KernelFeatures, Output, OutputFeatures, OutputIdentifier, Transaction, TxKernel, Weighting, @@ -30,9 +29,7 @@ use self::core::{global, ser}; use crate::common::{new_block, tx1i1o, tx1i2o, tx2i1o}; use grin_core as core; use keychain::{BlindingFactor, ExtKeychain, Keychain}; -use std::sync::Arc; use util::static_secp_instance; -use util::RwLock; // Setup test with AutomatedTesting chain_type; fn test_setup() { @@ -141,10 +138,6 @@ fn test_zero_commit_fails() { assert!(res.is_err()); } -fn verifier_cache() -> Arc> { - Arc::new(RwLock::new(LruVerifierCache::new())) -} - #[test] fn build_tx_kernel() { test_setup(); @@ -165,8 +158,7 @@ fn build_tx_kernel() { // check the tx is valid let height = 42; // arbitrary - tx.validate(Weighting::AsTransaction, verifier_cache(), height) - .unwrap(); + tx.validate(Weighting::AsTransaction, height).unwrap(); // check the kernel is also itself valid assert_eq!(tx.kernels().len(), 1); @@ -229,15 +221,9 @@ fn build_two_half_kernels() { .unwrap(); let height = 42; // arbitrary - assert_eq!( - tx1.validate(Weighting::AsTransaction, verifier_cache(), height), - Ok(()), - ); + assert_eq!(tx1.validate(Weighting::AsTransaction, height), Ok(()),); - assert_eq!( - tx2.validate(Weighting::AsTransaction, verifier_cache(), height), - Ok(()), - ); + assert_eq!(tx2.validate(Weighting::AsTransaction, height), Ok(()),); // The transactions share an identical kernel. assert_eq!(tx1.kernels()[0], tx2.kernels()[0]); @@ -262,21 +248,13 @@ fn transaction_cut_through() { let tx2 = tx2i1o(); let height = 42; // arbitrary - assert!(tx1 - .validate(Weighting::AsTransaction, verifier_cache(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, verifier_cache(), height) - .is_ok()); - - let vc = verifier_cache(); + assert!(tx1.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); // now build a "cut_through" tx from tx1 and tx2 let tx3 = aggregate(&[tx1, tx2]).unwrap(); - assert!(tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx3.validate(Weighting::AsTransaction, height).is_ok()); } // Attempt to deaggregate a multi-kernel transaction in a different way @@ -288,46 +266,30 @@ fn multi_kernel_transaction_deaggregation() { let tx3 = tx1i1o(); let tx4 = tx1i1o(); - let vc = verifier_cache(); - let height = 42; // arbitrary - assert!(tx1 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx4 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx1.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx3.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx4.validate(Weighting::AsTransaction, height).is_ok()); let tx1234 = aggregate(&[tx1.clone(), tx2.clone(), tx3.clone(), tx4.clone()]).unwrap(); let tx12 = aggregate(&[tx1, tx2]).unwrap(); let tx34 = aggregate(&[tx3, tx4]).unwrap(); - assert!(tx1234 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx12 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx34 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx1234.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx12.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx34.validate(Weighting::AsTransaction, height).is_ok()); let deaggregated_tx34 = deaggregate(tx1234.clone(), &[tx12.clone()]).unwrap(); assert!(deaggregated_tx34 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx34, deaggregated_tx34); let deaggregated_tx12 = deaggregate(tx1234, &[tx34]).unwrap(); assert!(deaggregated_tx12 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx12, deaggregated_tx12); } @@ -339,32 +301,20 @@ fn multi_kernel_transaction_deaggregation_2() { let tx2 = tx1i1o(); let tx3 = tx1i1o(); - let vc = verifier_cache(); - let height = 42; // arbitrary - assert!(tx1 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx1.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx3.validate(Weighting::AsTransaction, height).is_ok()); let tx123 = aggregate(&[tx1.clone(), tx2.clone(), tx3.clone()]).unwrap(); let tx12 = aggregate(&[tx1, tx2]).unwrap(); - assert!(tx123 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx12 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx123.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx12.validate(Weighting::AsTransaction, height).is_ok()); let deaggregated_tx3 = deaggregate(tx123, &[tx12]).unwrap(); assert!(deaggregated_tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx3, deaggregated_tx3); } @@ -376,33 +326,21 @@ fn multi_kernel_transaction_deaggregation_3() { let tx2 = tx1i1o(); let tx3 = tx1i1o(); - let vc = verifier_cache(); - let height = 42; // arbitrary - assert!(tx1 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx1.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx3.validate(Weighting::AsTransaction, height).is_ok()); let tx123 = aggregate(&[tx1.clone(), tx2.clone(), tx3.clone()]).unwrap(); let tx13 = aggregate(&[tx1, tx3]).unwrap(); let tx2 = aggregate(&[tx2]).unwrap(); - assert!(tx123 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx123.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); let deaggregated_tx13 = deaggregate(tx123, &[tx2]).unwrap(); assert!(deaggregated_tx13 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx13, deaggregated_tx13); } @@ -416,24 +354,12 @@ fn multi_kernel_transaction_deaggregation_4() { let tx4 = tx1i1o(); let tx5 = tx1i1o(); - let vc = verifier_cache(); - let height = 42; // arbitrary - assert!(tx1 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx4 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx5 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx1.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx3.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx4.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx5.validate(Weighting::AsTransaction, height).is_ok()); let tx12345 = aggregate(&[ tx1.clone(), @@ -443,13 +369,11 @@ fn multi_kernel_transaction_deaggregation_4() { tx5.clone(), ]) .unwrap(); - assert!(tx12345 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx12345.validate(Weighting::AsTransaction, height).is_ok()); let deaggregated_tx5 = deaggregate(tx12345, &[tx1, tx2, tx3, tx4]).unwrap(); assert!(deaggregated_tx5 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx5, deaggregated_tx5); } @@ -463,24 +387,12 @@ fn multi_kernel_transaction_deaggregation_5() { let tx4 = tx1i1o(); let tx5 = tx1i1o(); - let vc = verifier_cache(); - let height = 42; // arbitrary - assert!(tx1 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx4 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx5 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx1.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx3.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx4.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx5.validate(Weighting::AsTransaction, height).is_ok()); let tx12345 = aggregate(&[ tx1.clone(), @@ -493,13 +405,11 @@ fn multi_kernel_transaction_deaggregation_5() { let tx12 = aggregate(&[tx1, tx2]).unwrap(); let tx34 = aggregate(&[tx3, tx4]).unwrap(); - assert!(tx12345 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx12345.validate(Weighting::AsTransaction, height).is_ok()); let deaggregated_tx5 = deaggregate(tx12345, &[tx12, tx34]).unwrap(); assert!(deaggregated_tx5 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx5, deaggregated_tx5); } @@ -511,34 +421,26 @@ fn basic_transaction_deaggregation() { let tx1 = tx1i2o(); let tx2 = tx2i1o(); - let vc = verifier_cache(); - let height = 42; // arbitrary - assert!(tx1 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); - assert!(tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx1.validate(Weighting::AsTransaction, height).is_ok()); + assert!(tx2.validate(Weighting::AsTransaction, height).is_ok()); // now build a "cut_through" tx from tx1 and tx2 let tx3 = aggregate(&[tx1.clone(), tx2.clone()]).unwrap(); - assert!(tx3 - .validate(Weighting::AsTransaction, vc.clone(), height) - .is_ok()); + assert!(tx3.validate(Weighting::AsTransaction, height).is_ok()); let deaggregated_tx1 = deaggregate(tx3.clone(), &[tx2.clone()]).unwrap(); assert!(deaggregated_tx1 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx1, deaggregated_tx1); let deaggregated_tx2 = deaggregate(tx3, &[tx1]).unwrap(); assert!(deaggregated_tx2 - .validate(Weighting::AsTransaction, vc.clone(), height) + .validate(Weighting::AsTransaction, height) .is_ok()); assert_eq!(tx2, deaggregated_tx2); } @@ -569,9 +471,7 @@ fn hash_output() { fn blind_tx() { let btx = tx2i1o(); let height = 42; // arbitrary - assert!(btx - .validate(Weighting::AsTransaction, verifier_cache(), height) - .is_ok()); + assert!(btx.validate(Weighting::AsTransaction, height).is_ok()); // Ignored for bullet proofs, because calling range_proof_info // with a bullet proof causes painful errors @@ -642,9 +542,7 @@ fn tx_build_exchange() { .unwrap(); let height = 42; // arbitrary - tx_final - .validate(Weighting::AsTransaction, verifier_cache(), height) - .unwrap(); + tx_final.validate(Weighting::AsTransaction, height).unwrap(); } #[test] @@ -658,8 +556,7 @@ fn reward_empty_block() { let b = new_block(&[], &keychain, &builder, &previous_header, &key_id); - b.validate(&BlindingFactor::zero(), verifier_cache()) - .unwrap(); + b.validate(&BlindingFactor::zero()).unwrap(); } #[test] @@ -669,19 +566,13 @@ fn reward_with_tx_block() { let builder = ProofBuilder::new(&keychain); let key_id = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); - let vc = verifier_cache(); - let tx1 = tx2i1o(); let previous_header = BlockHeader::default(); - tx1.validate( - Weighting::AsTransaction, - vc.clone(), - previous_header.height + 1, - ) - .unwrap(); + tx1.validate(Weighting::AsTransaction, previous_header.height + 1) + .unwrap(); let block = new_block(&[tx1], &keychain, &builder, &previous_header, &key_id); - block.validate(&BlindingFactor::zero(), vc.clone()).unwrap(); + block.validate(&BlindingFactor::zero()).unwrap(); } #[test] @@ -691,15 +582,13 @@ fn simple_block() { let builder = ProofBuilder::new(&keychain); let key_id = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); - let vc = verifier_cache(); - let tx1 = tx2i1o(); let tx2 = tx1i1o(); let previous_header = BlockHeader::default(); let b = new_block(&[tx1, tx2], &keychain, &builder, &previous_header, &key_id); - b.validate(&BlindingFactor::zero(), vc.clone()).unwrap(); + b.validate(&BlindingFactor::zero()).unwrap(); } #[test] @@ -711,8 +600,6 @@ fn test_block_with_timelocked_tx() { let key_id2 = ExtKeychain::derive_key_id(1, 2, 0, 0, 0); let key_id3 = ExtKeychain::derive_key_id(1, 3, 0, 0, 0); - let vc = verifier_cache(); - // first check we can add a timelocked tx where lock height matches current // block height and that the resulting block is valid let tx1 = build::transaction( @@ -735,7 +622,7 @@ fn test_block_with_timelocked_tx() { &previous_header, &key_id3.clone(), ); - b.validate(&BlindingFactor::zero(), vc.clone()).unwrap(); + b.validate(&BlindingFactor::zero()).unwrap(); // now try adding a timelocked tx where lock height is greater than current // block height @@ -753,7 +640,7 @@ fn test_block_with_timelocked_tx() { let previous_header = BlockHeader::default(); let b = new_block(&[tx1], &keychain, &builder, &previous_header, &key_id3); - match b.validate(&BlindingFactor::zero(), vc.clone()) { + match b.validate(&BlindingFactor::zero()) { Err(KernelLockHeight(height, _)) => { assert_eq!(height, 2); } @@ -766,8 +653,7 @@ pub fn test_verify_1i1o_sig() { test_setup(); let tx = tx1i1o(); let height = 42; // arbitrary - tx.validate(Weighting::AsTransaction, verifier_cache(), height) - .unwrap(); + tx.validate(Weighting::AsTransaction, height).unwrap(); } #[test] @@ -775,6 +661,5 @@ pub fn test_verify_2i1o_sig() { test_setup(); let tx = tx2i1o(); let height = 42; // arbitrary - tx.validate(Weighting::AsTransaction, verifier_cache(), height) - .unwrap(); + tx.validate(Weighting::AsTransaction, height).unwrap(); } diff --git a/core/tests/pmmr.rs b/core/tests/pmmr.rs index 603948fe5f..ff1e493d33 100644 --- a/core/tests/pmmr.rs +++ b/core/tests/pmmr.rs @@ -100,18 +100,6 @@ fn test_bintree_range() { assert_eq!(pmmr::bintree_range(6), 0..7); } -#[test] -fn test_bintree_range() { - assert_eq!(pmmr::bintree_range(0), 0..1); - assert_eq!(pmmr::bintree_range(1), 1..2); - assert_eq!(pmmr::bintree_range(2), 2..3); - assert_eq!(pmmr::bintree_range(3), 1..4); - assert_eq!(pmmr::bintree_range(4), 4..5); - assert_eq!(pmmr::bintree_range(5), 5..6); - assert_eq!(pmmr::bintree_range(6), 4..7); - assert_eq!(pmmr::bintree_range(7), 1..8); -} - // The pos of the rightmost leaf for the provided MMR size (last leaf in subtree). #[test] fn test_bintree_rightmost() { diff --git a/core/tests/transaction.rs b/core/tests/transaction.rs index 83adcd8cba..a3ac110643 100644 --- a/core/tests/transaction.rs +++ b/core/tests/transaction.rs @@ -17,7 +17,6 @@ pub mod common; use crate::common::tx1i10_v2_compatible; use crate::core::core::transaction::{self, Error}; -use crate::core::core::verifier_cache::LruVerifierCache; use crate::core::core::{ FeeFields, KernelFeatures, Output, OutputFeatures, Transaction, TxKernel, Weighting, }; @@ -27,8 +26,6 @@ use crate::core::libtx::{build, tx_fee}; use crate::core::{consensus, ser}; use grin_core as core; use keychain::{ExtKeychain, Keychain}; -use std::sync::Arc; -use util::RwLock; // We use json serialization between wallet->node when pushing transactions to the network. // This test ensures we exercise this serialization/deserialization code. @@ -121,12 +118,10 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { ) .expect("valid tx"); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); - // Transaction should fail validation due to cut-through. let height = 42; // arbitrary assert_eq!( - tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height), + tx.validate(Weighting::AsTransaction, height), Err(Error::CutThrough), ); @@ -144,7 +139,7 @@ fn test_verify_cut_through_plain() -> Result<(), Error> { .replace_outputs(outputs); // Transaction validates successfully after applying cut-through. - tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height)?; + tx.validate(Weighting::AsTransaction, height)?; // Transaction validates via lightweight "read" validation as well. tx.validate_read()?; @@ -186,12 +181,10 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { ) .expect("valid tx"); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); - // Transaction should fail validation due to cut-through. let height = 42; // arbitrary assert_eq!( - tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height), + tx.validate(Weighting::AsTransaction, height), Err(Error::CutThrough), ); @@ -209,7 +202,7 @@ fn test_verify_cut_through_coinbase() -> Result<(), Error> { .replace_outputs(outputs); // Transaction validates successfully after applying cut-through. - tx.validate(Weighting::AsTransaction, verifier_cache.clone(), height)?; + tx.validate(Weighting::AsTransaction, height)?; // Transaction validates via lightweight "read" validation as well. tx.validate_read()?; @@ -234,7 +227,7 @@ fn test_fee_fields() -> Result<(), Error> { fee: FeeFields::new(1, 42).unwrap(), }, &[ - build::coinbase_input(consensus::REWARD, key_id1.clone()), + build::coinbase_input(consensus::calc_mwc_block_reward(1), key_id1.clone()), build::output(60_000_000_000 - 84 - 42 - 21, key_id1.clone()), ], &keychain, diff --git a/core/tests/verifier_cache.rs b/core/tests/verifier_cache.rs deleted file mode 100644 index 92bc3763fc..0000000000 --- a/core/tests/verifier_cache.rs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2020 The Grin Developers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod common; - -use self::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; -use self::core::core::{Output, OutputFeatures}; -use self::core::libtx::proof; -use grin_core as core; -use keychain::{ExtKeychain, Keychain, SwitchCommitmentType}; -use std::sync::Arc; -use util::RwLock; - -fn verifier_cache() -> Arc> { - Arc::new(RwLock::new(LruVerifierCache::new())) -} - -#[test] -fn test_verifier_cache_rangeproofs() { - let cache = verifier_cache(); - - let keychain = ExtKeychain::from_random_seed(false).unwrap(); - let key_id = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); - let switch = SwitchCommitmentType::Regular; - let commit = keychain.commit(5, &key_id, switch).unwrap(); - let builder = proof::ProofBuilder::new(&keychain); - let proof = proof::create(&keychain, &builder, 5, &key_id, switch, commit, None).unwrap(); - - let out = Output::new(OutputFeatures::Plain, commit, proof); - - // Check our output is not verified according to the cache. - { - let mut cache = cache.write(); - let unverified = cache.filter_rangeproof_unverified(&[out]); - assert_eq!(unverified, vec![out]); - } - - // Add our output to the cache. - { - let mut cache = cache.write(); - cache.add_rangeproof_verified(vec![out]); - } - - // Check it shows as verified according to the cache. - { - let mut cache = cache.write(); - let unverified = cache.filter_rangeproof_unverified(&[out]); - assert_eq!(unverified, vec![]); - } -} diff --git a/etc/gen_gen/src/bin/gen_gen.rs b/etc/gen_gen/src/bin/gen_gen.rs index 324891166f..4d6ed8b5b7 100644 --- a/etc/gen_gen/src/bin/gen_gen.rs +++ b/etc/gen_gen/src/bin/gen_gen.rs @@ -33,7 +33,6 @@ use grin_util::{self as util, ToHex}; use grin_wallet as wallet; use grin_core::core::hash::Hashed; -use grin_core::core::verifier_cache::LruVerifierCache; use grin_keychain::{BlindingFactor, ExtKeychain, Keychain}; static BCHAIN_INFO_URL: &str = "https://blockchain.info/latestblock"; @@ -141,11 +140,7 @@ fn main() { assert!(gen.header.pow.is_secondary(), "Not a secondary header"); println!("Built genesis:\n{:?}", gen); core::pow::verify_size(&gen.header).unwrap(); - gen.validate( - &BlindingFactor::zero(), - Arc::new(util::RwLock::new(LruVerifierCache::new())), - ) - .unwrap(); + gen.validate(&BlindingFactor::zero()).unwrap(); println!("\nFinal genesis cyclehash: {}", gen.hash().to_hex()); let gen_bin = core::ser::ser_vec(&gen).unwrap(); @@ -269,9 +264,6 @@ fn update_genesis_rs(gen: &core::core::Block) { fn setup_chain(dir_name: &str, genesis: core::core::Block) -> chain::Chain { util::init_test_logger(); let _ = fs::remove_dir_all(dir_name); - let verifier_cache = Arc::new(util::RwLock::new( - core::core::verifier_cache::LruVerifierCache::new(), - )); let db_env = Arc::new(store::new_env(dir_name.to_string())); chain::Chain::init( dir_name.to_string(), @@ -279,7 +271,6 @@ fn setup_chain(dir_name: &str, genesis: core::core::Block) -> chain::Chain { Arc::new(chain::types::NoopAdapter {}), genesis, core::pow::verify_size, - verifier_cache, false, Arc::new(util::StopState::new()), ) diff --git a/p2p/src/libp2p_connection.rs b/p2p/src/libp2p_connection.rs index 67b25b3664..819bc52be6 100644 --- a/p2p/src/libp2p_connection.rs +++ b/p2p/src/libp2p_connection.rs @@ -1010,7 +1010,9 @@ fn test_integrity() -> Result<(), Error> { valid_kernels.insert( integrity_kernel, TxKernel::with_features(KernelFeatures::Plain { - fee: paid_integrity_fee, + fee: paid_integrity_fee + .try_into() + .expect("Failed to convert the paid_integrity_fee"), }), ); let output_validation_fn = |commit: &Commitment| -> Result, Error> { diff --git a/pool/fuzz/fuzz_targets/common.rs b/pool/fuzz/fuzz_targets/common.rs index 047d74b56c..c623073cbf 100644 --- a/pool/fuzz/fuzz_targets/common.rs +++ b/pool/fuzz/fuzz_targets/common.rs @@ -18,7 +18,6 @@ use self::chain::types::{NoopAdapter, Options}; use self::chain::Chain; use self::core::consensus; use self::core::core::hash::Hash; -use self::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; use self::core::core::{Block, BlockHeader, BlockSums, KernelFeatures, Transaction}; use self::core::genesis; use self::core::global; @@ -120,7 +119,7 @@ pub fn clean_output_dir(db_root: String) { pub struct PoolFuzzer { pub chain: Arc, pub keychain: ExtKeychain, - pub pool: TransactionPool, + pub pool: TransactionPool, } impl PoolFuzzer { @@ -131,15 +130,11 @@ impl PoolFuzzer { let genesis = genesis_block(&keychain); let chain = Arc::new(Self::init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let pool = Self::init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache.clone(), - ); + let pool = Self::init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); let ret = Self { chain, @@ -239,26 +234,20 @@ impl PoolFuzzer { } fn init_chain(dir_name: &str, genesis: Block) -> Chain { - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); Chain::init( dir_name.to_string(), Arc::new(NoopAdapter {}), genesis, pow::verify_size, - verifier_cache, false, ) .unwrap() } // Same as from pool/tests/common.rs - fn init_transaction_pool( - chain: Arc, - verifier_cache: Arc>, - ) -> TransactionPool + fn init_transaction_pool(chain: Arc) -> TransactionPool where B: BlockChain, - V: VerifierCache + 'static, { TransactionPool::new( PoolConfig { diff --git a/pool/src/pool.rs b/pool/src/pool.rs index a68ff0deeb..851ce4175a 100644 --- a/pool/src/pool.rs +++ b/pool/src/pool.rs @@ -18,41 +18,34 @@ use self::core::core::hash::{Hash, Hashed}; use self::core::core::id::{ShortId, ShortIdentifiable}; use self::core::core::transaction; -use self::core::core::verifier_cache::VerifierCache; use self::core::core::{ Block, BlockHeader, BlockSums, Committed, OutputIdentifier, Transaction, TxKernel, Weighting, }; -use self::util::RwLock; use crate::types::{BlockChain, PoolEntry, PoolError}; use grin_core as core; -use grin_util as util; use std::cmp::Reverse; use std::collections::{HashMap, HashSet}; use std::sync::Arc; -pub struct Pool +pub struct Pool where B: BlockChain, - V: VerifierCache, { /// Entries in the pool (tx + info + timer) in simple insertion order. pub entries: Vec, /// The blockchain pub blockchain: Arc, - pub verifier_cache: Arc>, pub name: String, } -impl Pool +impl Pool where B: BlockChain, - V: VerifierCache + 'static, { - pub fn new(chain: Arc, verifier_cache: Arc>, name: String) -> Self { + pub fn new(chain: Arc, name: String) -> Self { Pool { entries: vec![], blockchain: chain, - verifier_cache, name, } } @@ -161,11 +154,7 @@ where // Validate the single aggregate transaction "as pool", not subject to tx weight limits. let header = self.blockchain.chain_head()?; - tx.validate( - Weighting::NoLimit, - self.verifier_cache.clone(), - header.height, - )?; + tx.validate(Weighting::NoLimit, header.height)?; Ok(Some(tx)) } @@ -233,7 +222,7 @@ where ) -> Result { // Validate the tx, conditionally checking against weight limits, // based on weight verification type. - tx.validate(weighting, self.verifier_cache.clone(), header.height)?; + tx.validate(weighting, header.height)?; // Validate the tx against current chain state. // Check all inputs are in the current UTXO set. @@ -409,12 +398,9 @@ where // Otherwise discard and let the next block pick this tx up. let bucket = &tx_buckets[pos]; - if let Ok(new_bucket) = bucket.aggregate_with_tx( - entry.tx.clone(), - weighting, - self.verifier_cache.clone(), - height, - ) { + if let Ok(new_bucket) = + bucket.aggregate_with_tx(entry.tx.clone(), weighting, height) + { if new_bucket.fee_rate >= bucket.fee_rate { // Only aggregate if it would not reduce the fee_rate ratio. tx_buckets[pos] = new_bucket; @@ -531,13 +517,12 @@ impl Bucket { &self, new_tx: Transaction, weighting: Weighting, - verifier_cache: Arc>, height: u64, ) -> Result { let mut raw_txs = self.raw_txs.clone(); raw_txs.push(new_tx); let agg_tx = transaction::aggregate(&raw_txs)?; - agg_tx.validate(weighting, verifier_cache, height)?; + agg_tx.validate(weighting, height)?; Ok(Bucket { fee_rate: agg_tx.fee_rate(height), raw_txs: raw_txs, diff --git a/pool/src/transaction_pool.rs b/pool/src/transaction_pool.rs index 09c10690b5..45e4caf6ad 100644 --- a/pool/src/transaction_pool.rs +++ b/pool/src/transaction_pool.rs @@ -19,7 +19,6 @@ use self::core::core::hash::{Hash, Hashed}; use self::core::core::id::ShortId; -use self::core::core::verifier_cache::VerifierCache; use self::core::core::{ transaction, Block, BlockHeader, HeaderVersion, OutputIdentifier, Transaction, Weighting, }; @@ -37,53 +36,40 @@ use std::collections::VecDeque; use std::sync::Arc; /// Transaction pool implementation. -pub struct TransactionPool +pub struct TransactionPool where B: BlockChain, P: PoolAdapter, - V: VerifierCache, { /// Pool Config pub config: PoolConfig, /// Our transaction pool. - pub txpool: Pool, + pub txpool: Pool, /// Our Dandelion "stempool". - pub stempool: Pool, + pub stempool: Pool, /// Cache of previous txs in case of a re-org. pub reorg_cache: Arc>>, /// The blockchain pub blockchain: Arc, - pub verifier_cache: Arc>, /// The pool adapter pub adapter: Arc

, ///the replay attack cache pub replay_verifier_cache: Arc>>, } -impl TransactionPool +impl TransactionPool where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { /// Create a new transaction pool - pub fn new( - config: PoolConfig, - chain: Arc, - verifier_cache: Arc>, - adapter: Arc

, - ) -> Self { + pub fn new(config: PoolConfig, chain: Arc, adapter: Arc

) -> Self { TransactionPool { config, - txpool: Pool::new(chain.clone(), verifier_cache.clone(), "txpool".to_string()), - stempool: Pool::new( - chain.clone(), - verifier_cache.clone(), - "stempool".to_string(), - ), + txpool: Pool::new(chain.clone(), "txpool".to_string()), + stempool: Pool::new(chain.clone(), "stempool".to_string()), reorg_cache: Arc::new(RwLock::new(VecDeque::new())), blockchain: chain, - verifier_cache, adapter, replay_verifier_cache: Arc::new(RwLock::new(LruCache::new(100))), } @@ -198,12 +184,8 @@ where // Make sure the transaction is valid before anything else. // Validate tx accounting for max tx weight. - tx.validate( - Weighting::AsTransaction, - self.verifier_cache.clone(), - header.height, - ) - .map_err(PoolError::InvalidTx)?; + tx.validate(Weighting::AsTransaction, header.height) + .map_err(PoolError::InvalidTx)?; // Check the tx lock_time is valid based on current chain state. self.blockchain.verify_tx_lock_height(tx)?; @@ -303,11 +285,7 @@ where // Validate the tx to ensure our converted inputs are correct. let header = self.chain_head()?; - tx.validate( - Weighting::AsTransaction, - self.verifier_cache.clone(), - header.height, - )?; + tx.validate(Weighting::AsTransaction, header.height)?; Ok(PoolEntry::new(tx, entry.src)) } diff --git a/pool/tests/block_building.rs b/pool/tests/block_building.rs index d7e7843415..080bba627f 100644 --- a/pool/tests/block_building.rs +++ b/pool/tests/block_building.rs @@ -15,11 +15,9 @@ pub mod common; use self::core::core::hash::Hashed; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::global; use self::keychain::{ExtKeychain, Keychain}; use self::pool::PoolError; -use self::util::RwLock; use crate::common::*; use grin_core as core; use grin_keychain as keychain; @@ -39,15 +37,11 @@ fn test_transaction_pool_block_building() -> Result<(), PoolError> { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache, - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); // mine enough blocks to get past HF4 add_some_blocks(&chain, 4 * 3, &keychain); diff --git a/pool/tests/block_max_weight.rs b/pool/tests/block_max_weight.rs index 9928f990b7..5f05c2f5e9 100644 --- a/pool/tests/block_max_weight.rs +++ b/pool/tests/block_max_weight.rs @@ -16,10 +16,8 @@ pub mod common; use self::core::core::hash::Hashed; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::global; use self::keychain::{ExtKeychain, Keychain}; -use self::util::RwLock; use crate::common::*; use grin_core as core; use grin_keychain as keychain; @@ -39,15 +37,11 @@ fn test_block_building_max_weight() { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache, - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); // mine past HF4 to see effect of set_local_accept_fee_base add_some_blocks(&chain, 4 * 3, &keychain); diff --git a/pool/tests/block_reconciliation.rs b/pool/tests/block_reconciliation.rs index 9ce20104ae..9b8bfab647 100644 --- a/pool/tests/block_reconciliation.rs +++ b/pool/tests/block_reconciliation.rs @@ -15,10 +15,8 @@ pub mod common; use self::core::core::hash::Hashed; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::global; use self::keychain::{ExtKeychain, Keychain}; -use self::util::RwLock; use crate::common::ChainAdapter; use crate::common::*; use grin_core as core; @@ -38,15 +36,11 @@ fn test_transaction_pool_block_reconciliation() { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache, - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); // mine past HF4 to see effect of set_local_accept_fee_base add_some_blocks(&chain, 4 * 3, &keychain); diff --git a/pool/tests/coinbase_maturity.rs b/pool/tests/coinbase_maturity.rs index 7d845f8389..4b3bf09899 100644 --- a/pool/tests/coinbase_maturity.rs +++ b/pool/tests/coinbase_maturity.rs @@ -14,11 +14,9 @@ pub mod common; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::global; use self::keychain::{ExtKeychain, Keychain}; use self::pool::types::PoolError; -use self::util::RwLock; use crate::common::*; use grin_core as core; use grin_keychain as keychain; @@ -39,15 +37,11 @@ fn test_coinbase_maturity() { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache, - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); // Add a single block, introducing coinbase output to be spent later. add_block(&chain, &[], &keychain); diff --git a/pool/tests/common.rs b/pool/tests/common.rs index 58a57b3bf3..1e33b50bcc 100644 --- a/pool/tests/common.rs +++ b/pool/tests/common.rs @@ -18,7 +18,6 @@ use self::chain::types::{NoopAdapter, Options}; use self::chain::Chain; use self::core::consensus; use self::core::core::hash::Hash; -use self::core::core::verifier_cache::{LruVerifierCache, VerifierCache}; use self::core::core::{ Block, BlockHeader, BlockSums, Inputs, KernelFeatures, OutputIdentifier, Transaction, TxKernel, }; @@ -29,13 +28,11 @@ use self::core::pow; use self::keychain::{BlindingFactor, ExtKeychain, ExtKeychainPath, Keychain}; use self::pool::types::*; use self::pool::TransactionPool; -use self::util::RwLock; use chrono::Duration; use grin_chain as chain; use grin_core as core; use grin_keychain as keychain; use grin_pool as pool; -use grin_util as util; use std::convert::TryInto; use std::fs; use std::sync::Arc; @@ -53,13 +50,11 @@ where } pub fn init_chain(dir_name: &str, genesis: Block) -> Chain { - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); Chain::init( dir_name.to_string(), Arc::new(NoopAdapter {}), genesis, pow::verify_size, - verifier_cache, false, ) .unwrap() @@ -170,13 +165,9 @@ impl BlockChain for ChainAdapter { } } -pub fn init_transaction_pool( - chain: Arc, - verifier_cache: Arc>, -) -> TransactionPool +pub fn init_transaction_pool(chain: Arc) -> TransactionPool where B: BlockChain, - V: VerifierCache + 'static, { TransactionPool::new( PoolConfig { @@ -187,7 +178,6 @@ where mineable_max_weight: 10_000, }, chain.clone(), - verifier_cache.clone(), Arc::new(NoopPoolAdapter {}), ) } diff --git a/pool/tests/nrd_kernel_relative_height.rs b/pool/tests/nrd_kernel_relative_height.rs index f387e4355b..d6f04e84ef 100644 --- a/pool/tests/nrd_kernel_relative_height.rs +++ b/pool/tests/nrd_kernel_relative_height.rs @@ -16,13 +16,11 @@ pub mod common; use self::core::consensus; use self::core::core::hash::Hashed; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::core::{HeaderVersion, KernelFeatures, NRDRelativeHeight, TxKernel}; use self::core::global; use self::core::libtx::aggsig; use self::keychain::{BlindingFactor, ExtKeychain, Keychain}; use self::pool::types::PoolError; -use self::util::RwLock; use crate::common::*; use grin_core as core; use grin_keychain as keychain; @@ -44,15 +42,11 @@ fn test_nrd_kernel_relative_height() -> Result<(), PoolError> { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache, - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); add_some_blocks(&chain, 3, &keychain); diff --git a/pool/tests/nrd_kernels_disabled.rs b/pool/tests/nrd_kernels_disabled.rs index d96e68edd6..4640513250 100644 --- a/pool/tests/nrd_kernels_disabled.rs +++ b/pool/tests/nrd_kernels_disabled.rs @@ -15,12 +15,10 @@ pub mod common; use self::core::consensus; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::core::{HeaderVersion, KernelFeatures, NRDRelativeHeight}; use self::core::global; use self::keychain::{ExtKeychain, Keychain}; use self::pool::types::PoolError; -use self::util::RwLock; use crate::common::*; use grin_core as core; use grin_keychain as keychain; @@ -41,15 +39,11 @@ fn test_nrd_kernels_disabled() { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache, - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); // Add some blocks. add_some_blocks(&chain, 3, &keychain); diff --git a/pool/tests/nrd_kernels_enabled.rs b/pool/tests/nrd_kernels_enabled.rs index 4f53f724aa..f2d38e17ec 100644 --- a/pool/tests/nrd_kernels_enabled.rs +++ b/pool/tests/nrd_kernels_enabled.rs @@ -15,12 +15,10 @@ pub mod common; use self::core::consensus; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::core::{HeaderVersion, KernelFeatures, NRDRelativeHeight}; use self::core::global; use self::keychain::{ExtKeychain, Keychain}; use self::pool::types::PoolError; -use self::util::RwLock; use crate::common::*; use grin_core as core; use grin_keychain as keychain; @@ -42,15 +40,11 @@ fn test_nrd_kernels_enabled() { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache, - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); // Add some blocks. add_some_blocks(&chain, 3, &keychain); diff --git a/pool/tests/transaction_pool.rs b/pool/tests/transaction_pool.rs index 61f4a4876b..5f3cd7d1b1 100644 --- a/pool/tests/transaction_pool.rs +++ b/pool/tests/transaction_pool.rs @@ -14,12 +14,10 @@ pub mod common; -use self::core::core::verifier_cache::LruVerifierCache; use self::core::core::{transaction, Weighting}; use self::core::global; use self::keychain::{ExtKeychain, Keychain}; use self::pool::TxSource; -use self::util::RwLock; use crate::common::*; use grin_core as core; use grin_keychain as keychain; @@ -40,15 +38,11 @@ fn test_the_transaction_pool() { let genesis = genesis_block(&keychain); let chain = Arc::new(init_chain(db_root, genesis)); - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); // Initialize a new pool with our chain adapter. - let mut pool = init_transaction_pool( - Arc::new(ChainAdapter { - chain: chain.clone(), - }), - verifier_cache.clone(), - ); + let mut pool = init_transaction_pool(Arc::new(ChainAdapter { + chain: chain.clone(), + })); // mine past HF4 to see effect of set_local_accept_fee_base add_some_blocks(&chain, 4 * 3, &keychain); @@ -194,9 +188,7 @@ fn test_the_transaction_pool() { let agg_tx = transaction::aggregate(&[tx1.clone(), tx2.clone(), tx4]).unwrap(); let height = 12 + 1; - agg_tx - .validate(Weighting::AsTransaction, verifier_cache.clone(), height) - .unwrap(); + agg_tx.validate(Weighting::AsTransaction, height).unwrap(); pool.add_to_pool(test_source(), agg_tx, false, &header) .unwrap(); diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index 2f12176259..a8c65b380d 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -33,7 +33,6 @@ use crate::common::hooks::{ChainEvents, NetEvents}; use crate::common::types::{ChainValidationMode, DandelionEpoch, ServerConfig}; use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::transaction::Transaction; -use crate::core::core::verifier_cache::VerifierCache; use crate::core::core::{ BlockHeader, BlockSums, CompactBlock, Inputs, OutputIdentifier, Segment, SegmentIdentifier, TxKernel, @@ -100,16 +99,14 @@ impl EventCache { /// Implementation of the NetAdapter for the . Gets notified when new /// blocks and transactions are received and forwards to the chain and pool /// implementations. -pub struct NetToChainAdapter +pub struct NetToChainAdapter where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { sync_state: Arc, chain: Weak, - tx_pool: Arc>>, - verifier_cache: Arc>, + tx_pool: Arc>>, peers: OneTime>, config: ServerConfig, hooks: Vec>, @@ -124,11 +121,10 @@ where reset_tip: Arc>, } -impl p2p::ChainAdapter for NetToChainAdapter +impl p2p::ChainAdapter for NetToChainAdapter where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { fn total_difficulty(&self) -> Result { Ok(self.chain().head()?.total_difficulty) @@ -319,10 +315,7 @@ where }; if let Ok(prev) = self.chain().get_previous_header(&cb.header) { - if block - .validate(&prev.total_kernel_offset, self.verifier_cache.clone()) - .is_ok() - { + if block.validate(&prev.total_kernel_offset).is_ok() { debug!( "successfully hydrated block: {} at {} ({})", block.header.hash(), @@ -800,18 +793,16 @@ where } } -impl NetToChainAdapter +impl NetToChainAdapter where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { /// Construct a new NetToChainAdapter instance pub fn new( sync_state: Arc, chain: Arc, - tx_pool: Arc>>, - verifier_cache: Arc>, + tx_pool: Arc>>, config: ServerConfig, hooks: Vec>, ) -> Self { @@ -819,7 +810,6 @@ where sync_state, chain: Arc::downgrade(&chain), tx_pool, - verifier_cache, peers: OneTime::new(), config, hooks, @@ -1041,22 +1031,20 @@ where /// Implementation of the ChainAdapter for the network. Gets notified when the /// accepted a new block, asking the pool to update its state and /// the network to broadcast the block -pub struct ChainToPoolAndNetAdapter +pub struct ChainToPoolAndNetAdapter where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { - tx_pool: Arc>>, + tx_pool: Arc>>, peers: OneTime>, hooks: Vec>, } -impl ChainAdapter for ChainToPoolAndNetAdapter +impl ChainAdapter for ChainToPoolAndNetAdapter where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { fn block_accepted(&self, b: &core::Block, status: BlockStatus, opts: Options) { // Trigger all registered "on_block_accepted" hooks (logging and webhooks). @@ -1099,15 +1087,14 @@ where } } -impl ChainToPoolAndNetAdapter +impl ChainToPoolAndNetAdapter where B: BlockChain, P: PoolAdapter, - V: VerifierCache + 'static, { /// Construct a ChainToPoolAndNetAdapter instance. pub fn new( - tx_pool: Arc>>, + tx_pool: Arc>>, hooks: Vec>, ) -> Self { ChainToPoolAndNetAdapter { diff --git a/servers/src/grin/dandelion_monitor.rs b/servers/src/grin/dandelion_monitor.rs index d138ff7de2..27d82400e7 100644 --- a/servers/src/grin/dandelion_monitor.rs +++ b/servers/src/grin/dandelion_monitor.rs @@ -21,10 +21,9 @@ use std::time::{Duration, Instant}; use crate::common::adapters::DandelionAdapter; use crate::core::core::hash::Hashed; use crate::core::core::transaction; -use crate::core::core::verifier_cache::VerifierCache; use crate::pool::{BlockChain, DandelionConfig, Pool, PoolEntry, PoolError, TxSource}; use crate::util::StopState; -use crate::{ServerTxPool, ServerVerifierCache}; +use crate::ServerTxPool; /// A process to monitor transactions in the stempool. /// With Dandelion, transaction can be broadcasted in stem or fluff phase. @@ -38,7 +37,6 @@ pub fn monitor_transactions( dandelion_config: DandelionConfig, tx_pool: ServerTxPool, adapter: Arc, - verifier_cache: ServerVerifierCache, stop_state: Arc, ) -> std::io::Result> { debug!("Started Dandelion transaction monitor."); @@ -58,15 +56,11 @@ pub fn monitor_transactions( if last_run.elapsed() > run_interval { if !adapter.is_stem() { - let _ = process_fluff_phase( - &dandelion_config, - &tx_pool, - &adapter, - &verifier_cache, - ) - .map_err(|e| { - error!("dand_mon: Problem processing fluff phase. {}", e); - }); + let _ = process_fluff_phase(&dandelion_config, &tx_pool, &adapter).map_err( + |e| { + error!("dand_mon: Problem processing fluff phase. {}", e); + }, + ); } // Now find all expired entries based on embargo timer. @@ -91,10 +85,9 @@ pub fn monitor_transactions( // Query the pool for transactions older than the cutoff. // Used for both periodic fluffing and handling expired embargo timer. -fn select_txs_cutoff(pool: &Pool, cutoff_secs: u16) -> Vec +fn select_txs_cutoff(pool: &Pool, cutoff_secs: u16) -> Vec where B: BlockChain, - V: VerifierCache, { let cutoff = Utc::now().timestamp() - cutoff_secs as i64; pool.entries @@ -108,7 +101,6 @@ fn process_fluff_phase( dandelion_config: &DandelionConfig, tx_pool: &ServerTxPool, adapter: &Arc, - verifier_cache: &ServerVerifierCache, ) -> Result<(), PoolError> { // Take a write lock on the txpool for the duration of this processing. let mut tx_pool = tx_pool.write(); @@ -147,11 +139,7 @@ fn process_fluff_phase( ); let agg_tx = transaction::aggregate(&fluffable_txs)?; - agg_tx.validate( - transaction::Weighting::AsTransaction, - verifier_cache.clone(), - header.height, - )?; + agg_tx.validate(transaction::Weighting::AsTransaction, header.height)?; tx_pool.add_to_pool(TxSource::Fluff, agg_tx, false, &header)?; Ok(()) diff --git a/servers/src/grin/server.rs b/servers/src/grin/server.rs index 9f20379e49..6c7307db09 100644 --- a/servers/src/grin/server.rs +++ b/servers/src/grin/server.rs @@ -51,7 +51,6 @@ use crate::common::stats::{ use crate::common::types::{Error, ServerConfig, StratumServerConfig}; use crate::core::core::hash::Hashed; -use crate::core::core::verifier_cache::LruVerifierCache; use crate::core::ser::ProtocolVersion; use crate::core::stratum::connections; use crate::core::{consensus, genesis, global, pow}; @@ -80,10 +79,7 @@ use grin_util::secp::pedersen::Commitment; use std::collections::HashMap; /// Arcified thread-safe TransactionPool with type parameters used by server components -pub type ServerTxPool = - Arc>>; -/// Arcified thread-safe LruVerifierCache -pub type ServerVerifierCache = Arc>; +pub type ServerTxPool = Arc>>; /// Grin server holding internal structures. pub struct Server { @@ -95,9 +91,6 @@ pub struct Server { pub chain: Arc, /// in-memory transaction pool pub tx_pool: ServerTxPool, - /// Shared cache for verification results when - /// verifying rangeproof and kernel signatures. - verifier_cache: ServerVerifierCache, /// Whether we're currently syncing pub sync_state: Arc, /// To be passed around to collect stats and info @@ -246,16 +239,11 @@ impl Server { Arc::new(StopState::new()) }; - // Shared cache for verification results. - // We cache rangeproof verification and kernel signature verification. - let verifier_cache = Arc::new(RwLock::new(LruVerifierCache::new())); - let pool_adapter = Arc::new(PoolToChainAdapter::new()); let pool_net_adapter = Arc::new(PoolToNetAdapter::new(config.dandelion_config.clone())); let tx_pool = Arc::new(RwLock::new(pool::TransactionPool::new( config.pool_config.clone(), pool_adapter.clone(), - verifier_cache.clone(), pool_net_adapter.clone(), ))); @@ -280,7 +268,6 @@ impl Server { chain_adapter.clone(), genesis.clone(), pow::verify_size, - verifier_cache.clone(), archive_mode, )?); @@ -290,7 +277,6 @@ impl Server { sync_state.clone(), shared_chain.clone(), tx_pool.clone(), - verifier_cache.clone(), config.clone(), init_net_hooks(&config), )); @@ -621,7 +607,6 @@ impl Server { config.dandelion_config.clone(), tx_pool.clone(), pool_net_adapter, - verifier_cache.clone(), stop_state.clone(), )?; @@ -631,7 +616,6 @@ impl Server { p2p: p2p_server, chain: shared_chain, tx_pool, - verifier_cache, sync_state, state_info: ServerStateInfo { ..Default::default() @@ -821,7 +805,6 @@ impl Server { config, self.chain.clone(), self.tx_pool.clone(), - self.verifier_cache.clone(), self.state_info.stratum_stats.clone(), ip_pool, ); @@ -869,7 +852,6 @@ impl Server { config, self.chain.clone(), self.tx_pool.clone(), - self.verifier_cache.clone(), stop_state, sync_state, ); diff --git a/servers/src/lib.rs b/servers/src/lib.rs index eb4cc30887..abb24815c1 100644 --- a/servers/src/lib.rs +++ b/servers/src/lib.rs @@ -46,4 +46,4 @@ mod tor; pub use crate::common::stats::{DiffBlock, PeerStats, ServerStats, StratumStats, WorkerStats}; pub use crate::common::types::{ServerConfig, StratumServerConfig}; pub use crate::core::global::{FLOONET_DNS_SEEDS, MAINNET_DNS_SEEDS}; -pub use crate::grin::server::{Server, ServerTxPool, ServerVerifierCache}; +pub use crate::grin::server::{Server, ServerTxPool}; diff --git a/servers/src/mining/mine_block.rs b/servers/src/mining/mine_block.rs index 69e1c0bf6a..ca83665a5e 100644 --- a/servers/src/mining/mine_block.rs +++ b/servers/src/mining/mine_block.rs @@ -30,7 +30,7 @@ use crate::core::libtx::secp_ser; use crate::core::libtx::ProofBuilder; use crate::core::{consensus, core, global}; use crate::keychain::{ExtKeychain, Identifier, Keychain}; -use crate::{ServerTxPool, ServerVerifierCache}; +use crate::ServerTxPool; /// Fees in block to use for coinbase amount calculation /// (Duplicated from Grin wallet project) @@ -70,19 +70,12 @@ pub struct CbData { pub fn get_block( chain: &Arc, tx_pool: &ServerTxPool, - verifier_cache: ServerVerifierCache, key_id: Option, wallet_listener_url: Option, ) -> (core::Block, BlockFees) { let wallet_retry_interval = 5; // get the latest chain state and build a block on top of it - let mut result = build_block( - chain, - tx_pool, - verifier_cache.clone(), - key_id.clone(), - wallet_listener_url.clone(), - ); + let mut result = build_block(chain, tx_pool, key_id.clone(), wallet_listener_url.clone()); while let Err(e) = result { let mut new_key_id = key_id.to_owned(); match e { @@ -116,13 +109,7 @@ pub fn get_block( thread::sleep(Duration::from_millis(100)); } - result = build_block( - chain, - tx_pool, - verifier_cache.clone(), - new_key_id, - wallet_listener_url.clone(), - ); + result = build_block(chain, tx_pool, new_key_id, wallet_listener_url.clone()); } return result.unwrap(); } @@ -132,7 +119,6 @@ pub fn get_block( fn build_block( chain: &Arc, tx_pool: &ServerTxPool, - verifier_cache: ServerVerifierCache, key_id: Option, wallet_listener_url: Option, ) -> Result<(core::Block, BlockFees), Error> { @@ -178,7 +164,7 @@ fn build_block( let mut b = core::Block::from_reward(&head, &txs, output, kernel, difficulty.difficulty)?; // making sure we're not spending time mining a useless block - b.validate(&head.total_kernel_offset, verifier_cache)?; + b.validate(&head.total_kernel_offset)?; b.header.pow.nonce = thread_rng().gen(); b.header.pow.secondary_scaling = difficulty.secondary_scaling; diff --git a/servers/src/mining/stratumserver.rs b/servers/src/mining/stratumserver.rs index 5d8d39df11..7e212d9857 100644 --- a/servers/src/mining/stratumserver.rs +++ b/servers/src/mining/stratumserver.rs @@ -43,7 +43,7 @@ use crate::keychain; use crate::mining::mine_block; use crate::util; use crate::util::ToHex; -use crate::{ServerTxPool, ServerVerifierCache}; +use crate::ServerTxPool; use std::cmp::min; // ---------------------------------------- @@ -572,12 +572,7 @@ impl Handler { self.workers.broadcast(job_request_json); } - pub fn run( - &self, - config: &StratumServerConfig, - tx_pool: &ServerTxPool, - verifier_cache: ServerVerifierCache, - ) { + pub fn run(&self, config: &StratumServerConfig, tx_pool: &ServerTxPool) { debug!("Run main loop"); let mut deadline: i64 = 0; let mut head = self.chain.head().unwrap(); @@ -618,7 +613,6 @@ impl Handler { let (new_block, block_fees) = mine_block::get_block( &self.chain, tx_pool, - verifier_cache.clone(), self.current_state.read().current_key_id.clone(), wallet_listener_url, ); @@ -897,7 +891,6 @@ pub struct StratumServer { config: StratumServerConfig, chain: Arc, pub tx_pool: ServerTxPool, - verifier_cache: ServerVerifierCache, sync_state: Arc, stratum_stats: Arc, ip_pool: Arc, @@ -910,7 +903,6 @@ impl StratumServer { config: StratumServerConfig, chain: Arc, tx_pool: ServerTxPool, - verifier_cache: ServerVerifierCache, stratum_stats: Arc, ip_pool: Arc, ) -> StratumServer { @@ -919,7 +911,6 @@ impl StratumServer { config, chain, tx_pool, - verifier_cache, sync_state: Arc::new(SyncState::new()), stratum_stats: stratum_stats, ip_pool, @@ -974,7 +965,7 @@ impl StratumServer { thread::sleep(Duration::from_millis(50)); } - handler.run(&self.config, &self.tx_pool, self.verifier_cache.clone()); + handler.run(&self.config, &self.tx_pool); } // fn run_loop() } // StratumServer diff --git a/servers/src/mining/test_miner.rs b/servers/src/mining/test_miner.rs index a1b12126d2..3515b2bb67 100644 --- a/servers/src/mining/test_miner.rs +++ b/servers/src/mining/test_miner.rs @@ -27,7 +27,7 @@ use crate::core::core::{Block, BlockHeader}; use crate::core::global; use crate::mining::mine_block; use crate::util::StopState; -use crate::{ServerTxPool, ServerVerifierCache}; +use crate::ServerTxPool; use grin_chain::SyncState; use std::thread; use std::time::Duration; @@ -36,7 +36,6 @@ pub struct Miner { config: StratumServerConfig, chain: Arc, tx_pool: ServerTxPool, - verifier_cache: ServerVerifierCache, stop_state: Arc, sync_state: Arc, // Just to hold the port we're on, so this miner can be identified @@ -51,7 +50,6 @@ impl Miner { config: StratumServerConfig, chain: Arc, tx_pool: ServerTxPool, - verifier_cache: ServerVerifierCache, stop_state: Arc, sync_state: Arc, ) -> Miner { @@ -59,7 +57,6 @@ impl Miner { config, chain, tx_pool, - verifier_cache, debug_output_id: String::from("none"), stop_state, sync_state, @@ -156,7 +153,6 @@ impl Miner { let (mut b, block_fees) = mine_block::get_block( &self.chain, &self.tx_pool, - self.verifier_cache.clone(), key_id.clone(), wallet_listener_url.clone(), ); From 308966c4d4683a38cb46802021c50bba705af1b1 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 18:13:28 -0700 Subject: [PATCH 45/96] grin v5.3 (0072) Add test for duplicate rangeproof inflation bug (#3630) * invalid range proof test * create output with 1 million grin * Move `output_negative` into `tests/` So it cannot be called from outside of tests!* Verify InvalidBlockProof & InvalidRangeProof types --- chain/tests/mine_simple_chain.rs | 154 ++++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 3 deletions(-) diff --git a/chain/tests/mine_simple_chain.rs b/chain/tests/mine_simple_chain.rs index 2d3dc30557..6461cc0e68 100644 --- a/chain/tests/mine_simple_chain.rs +++ b/chain/tests/mine_simple_chain.rs @@ -15,12 +15,18 @@ use self::chain::types::{NoopAdapter, Tip}; use self::chain::Chain; use self::core::core::hash::Hashed; -use self::core::core::{Block, BlockHeader, KernelFeatures, Transaction}; +use self::core::core::{ + block, transaction, Block, BlockHeader, KernelFeatures, Output, OutputFeatures, Transaction, +}; use self::core::global::ChainTypes; -use self::core::libtx::{self, build, ProofBuilder}; +use self::core::libtx::build::{self, Append}; +use self::core::libtx::proof::{self, ProofBuild}; +use self::core::libtx::{self, Error, ProofBuilder}; use self::core::pow::Difficulty; use self::core::{consensus, global, pow}; -use self::keychain::{ExtKeychain, ExtKeychainPath, Keychain}; +use self::keychain::{ + BlindSum, ExtKeychain, ExtKeychainPath, Identifier, Keychain, SwitchCommitmentType, +}; use self::util::RwLock; use chrono::Duration; use grin_chain as chain; @@ -828,6 +834,148 @@ fn output_header_mappings() { clean_output_dir(".mwc_header_for_output"); } +/// Build a negative output. This function must not be used outside of tests. +/// The commitment will be an inversion of the value passed in and the value is +/// subtracted from the sum. +fn build_output_negative(value: u64, key_id: Identifier) -> Box> +where + K: Keychain, + B: ProofBuild, +{ + Box::new( + move |build, acc| -> Result<(Transaction, BlindSum), Error> { + let (tx, sum) = acc?; + + // TODO: proper support for different switch commitment schemes + let switch = SwitchCommitmentType::Regular; + + let commit = build.keychain.commit(value, &key_id, switch)?; + + // invert commitment + let commit = build.keychain.secp().commit_sum(vec![], vec![commit])?; + + eprintln!("Building output: {}, {:?}", value, commit); + + // build a proof with a rangeproof of 0 as a placeholder + // the test will replace this later + let proof = proof::create( + build.keychain, + build.builder, + 0, + &key_id, + switch, + commit, + None, + )?; + + // we return the output and the value is subtracted instead of added + Ok(( + tx.with_output(Output::new(OutputFeatures::Plain, commit, proof)), + sum.sub_key_id(key_id.to_value_path(value)), + )) + }, + ) +} + +/// Test the duplicate rangeproof bug +#[test] +fn test_overflow_cached_rangeproof() { + clean_output_dir(".grin_overflow"); + global::set_local_chain_type(ChainTypes::AutomatedTesting); + + util::init_test_logger(); + { + let chain = init_chain(".grin_overflow", pow::mine_genesis_block().unwrap()); + let prev = chain.head_header().unwrap(); + let kc = ExtKeychain::from_random_seed(false).unwrap(); + let pb = ProofBuilder::new(&kc); + + let mut head = prev; + + // mine the first block and keep track of the block_hash + // so we can spend the coinbase later + let b = prepare_block(&kc, &head, &chain, 2); + + assert!(b.outputs()[0].is_coinbase()); + head = b.header.clone(); + chain + .process_block(b.clone(), chain::Options::SKIP_POW) + .unwrap(); + + // now mine three further blocks + for n in 3..6 { + let b = prepare_block(&kc, &head, &chain, n); + head = b.header.clone(); + chain.process_block(b, chain::Options::SKIP_POW).unwrap(); + } + + // create a few keys for use in txns + let key_id2 = ExtKeychainPath::new(1, 2, 0, 0, 0).to_identifier(); + let key_id30 = ExtKeychainPath::new(1, 30, 0, 0, 0).to_identifier(); + let key_id31 = ExtKeychainPath::new(1, 31, 0, 0, 0).to_identifier(); + let key_id32 = ExtKeychainPath::new(1, 32, 0, 0, 0).to_identifier(); + + // build a regular transaction so we have a rangeproof to copy + let tx1 = build::transaction( + KernelFeatures::Plain { fee: 20000.into() }, + &[ + build::coinbase_input(consensus::REWARD, key_id2.clone()), + build::output(consensus::REWARD - 20000, key_id30.clone()), + ], + &kc, + &pb, + ) + .unwrap(); + + // mine block with tx1 + let next = prepare_block_tx(&kc, &head, &chain, 7, &[tx1.clone()]); + let prev_main = next.header.clone(); + chain + .process_block(next.clone(), chain::Options::SKIP_POW) + .unwrap(); + chain.validate(false).unwrap(); + + // create a second tx that contains a negative output + // and a positive output for 1m grin + let mut tx2 = build::transaction( + KernelFeatures::Plain { fee: 0.into() }, + &[ + build::input(consensus::REWARD - 20000, key_id30.clone()), + build::output( + consensus::REWARD - 20000 + 1_000_000_000_000_000, + key_id31.clone(), + ), + build_output_negative(1_000_000_000_000_000, key_id32.clone()), + ], + &kc, + &pb, + ) + .unwrap(); + + // make sure tx1 only has one output as expected + assert_eq!(tx1.body.outputs.len(), 1); + let last_rp = tx1.body.outputs[0].proof; + + // overwrite all our rangeproofs with the rangeproof from last block + for i in 0..tx2.body.outputs.len() { + tx2.body.outputs[i].proof = last_rp; + } + + let next = prepare_block_tx(&kc, &prev_main, &chain, 8, &[tx2.clone()]); + // process_block fails with verifier_cache disabled or with correct verifier_cache + // implementations + let res = chain.process_block(next, chain::Options::SKIP_POW); + + assert_eq!( + res.unwrap_err().kind(), + chain::ErrorKind::InvalidBlockProof(block::Error::Transaction( + transaction::Error::Secp(util::secp::Error::InvalidRangeProof) + )) + ); + } + clean_output_dir(".grin_overflow"); +} + // Use diff as both diff *and* key_idx for convenience (deterministic private key for test blocks) fn prepare_block(kc: &K, prev: &BlockHeader, chain: &Chain, diff: u64) -> Block where From 521421f72e935cf551781f401e628197b9849837 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 18:48:22 -0700 Subject: [PATCH 46/96] grin v5.3 (0075) Update zip dependency and fix deprecation warnings (#3617) --- util/src/zip.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/src/zip.rs b/util/src/zip.rs index 5979021d92..7ac75cd1f9 100644 --- a/util/src/zip.rs +++ b/util/src/zip.rs @@ -59,7 +59,7 @@ pub fn extract_files(from_archive: File, dest: &Path, files: Vec) -> io let mut archive = zip_rs::ZipArchive::new(from_archive).expect("archive file exists"); for x in files { if let Ok(file) = archive.by_name(x.to_str().expect("valid path")) { - let path = dest.join(file.name()); + let path = dest.join(file.mangled_name()); let parent_dir = path.parent().expect("valid parent dir"); fs::create_dir_all(&parent_dir).expect("create parent dir"); let outfile = fs::File::create(&path).expect("file created"); From d71a4484406ba3d98aadf72bf0e6c13835ac98aa Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 19:15:47 -0700 Subject: [PATCH 47/96] grin v5.3 (0076) fix share difficulty validation - compare stratum server minimum_share_difficulty as unscaled difficulty (#3624) --- core/src/pow/types.rs | 6 ++++++ servers/src/mining/stratumserver.rs | 29 +++++++++++++++-------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/core/src/pow/types.rs b/core/src/pow/types.rs index 9cbb239d52..4e9f18faa3 100644 --- a/core/src/pow/types.rs +++ b/core/src/pow/types.rs @@ -275,6 +275,12 @@ impl ProofOfWork { } } + /// Maximum unscaled difficulty this proof of work can achieve + pub fn to_unscaled_difficulty(&self) -> Difficulty { + // using scale = 1 gives "unscaled" value + Difficulty::from_num(self.proof.scaled_difficulty(1u64)) + } + /// The edge_bits used for the cuckoo cycle size on this proof pub fn edge_bits(&self) -> u8 { self.proof.edge_bits diff --git a/servers/src/mining/stratumserver.rs b/servers/src/mining/stratumserver.rs index 7e212d9857..825e92b8df 100644 --- a/servers/src/mining/stratumserver.rs +++ b/servers/src/mining/stratumserver.rs @@ -184,8 +184,8 @@ struct State { // nothing has changed. We only want to create a key_id for each new block, // and reuse it when we rebuild the current block to add new tx. current_key_id: Option, - current_difficulty: u64, - minimum_share_difficulty: u64, + current_difficulty: u64, // scaled + minimum_share_difficulty: u64, // unscaled } impl State { @@ -419,7 +419,8 @@ impl Handler { return Err(RpcError::too_late()); } - let share_difficulty: u64; + let scaled_share_difficulty: u64; + let unscaled_share_difficulty: u64; let mut share_is_block = false; let mut b: Block = b.unwrap().clone(); @@ -439,18 +440,17 @@ impl Handler { return Err(RpcError::cannot_validate()); } - // Get share difficulty - share_difficulty = b.header.pow.to_difficulty(b.header.height).to_num(); + // Get share difficulty values + scaled_share_difficulty = b.header.pow.to_difficulty(b.header.height).to_num(); + unscaled_share_difficulty = b.header.pow.to_unscaled_difficulty().to_num(); + // Note: state.minimum_share_difficulty is unscaled + // state.current_difficulty is scaled // If the difficulty is too low its an error - if (b.header.pow.is_primary() && share_difficulty < minimum_share_difficulty * 7_936) - || b.header.pow.is_secondary() - && share_difficulty - < minimum_share_difficulty * b.header.pow.secondary_scaling as u64 - { + if unscaled_share_difficulty < minimum_share_difficulty { // Return error status error!( "(Server ID: {}) Share at height {}, hash {}, edge_bits {}, nonce {}, job_id {} rejected due to low difficulty: {}/{}", - self.id, params.height, b.hash(), params.edge_bits, params.nonce, params.job_id, share_difficulty, minimum_share_difficulty, + self.id, params.height, b.hash(), params.edge_bits, params.nonce, params.job_id, unscaled_share_difficulty, minimum_share_difficulty, ); self.workers .update_stats(worker_id, |worker_stats| worker_stats.num_rejected += 1); @@ -458,7 +458,7 @@ impl Handler { } // If the difficulty is high enough, submit it (which also validates it) - if share_difficulty >= current_difficulty { + if scaled_share_difficulty >= current_difficulty { // This is a full solution, submit it to the network let res = self.chain.process_block(b.clone(), chain::Options::MINE); if let Err(e) = res { @@ -531,7 +531,7 @@ impl Handler { b.header.pow.proof.edge_bits, b.header.pow.nonce, params.job_id, - share_difficulty, + scaled_share_difficulty, current_difficulty, submitted_by, ); @@ -620,13 +620,14 @@ impl Handler { { let mut state = self.current_state.write(); + // scaled difficulty state.current_difficulty = (new_block.header.total_difficulty() - head.total_difficulty).to_num(); state.current_key_id = block_fees.key_id(); current_hash = latest_hash; - // set the minimum acceptable share difficulty for this block + // set the minimum acceptable share unscaled difficulty for this block state.minimum_share_difficulty = cmp::min(config.minimum_share_difficulty, state.current_difficulty); } From fbabbfff02d1bf3fa743b714ea1594679b0b463e Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 19:30:34 -0700 Subject: [PATCH 48/96] grin v5.3 (0077) Add migration to `config_file_version = 2` (#3634) For MWC, no migration is made, keep that code in order need to migrate in the future. --- config/src/comments.rs | 10 ++++++-- config/src/config.rs | 54 ++++++++++++++++++++++++++++++++++++++---- config/src/types.rs | 2 ++ 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/config/src/comments.rs b/config/src/comments.rs index 082756a9c0..9610482011 100644 --- a/config/src/comments.rs +++ b/config/src/comments.rs @@ -19,7 +19,7 @@ use std::collections::HashMap; fn comments() -> HashMap { let mut retval = HashMap::new(); retval.insert( - "[server]".to_string(), + "config_file_version".to_string(), " # Generated Server Configuration File for MWC # @@ -31,7 +31,13 @@ fn comments() -> HashMap { # -[user home]/.mwc # -######################################### +" + .to_string(), + ); + + retval.insert( + "[server]".to_string(), + "######################################### ### SERVER CONFIGURATION ### ######################################### diff --git a/config/src/config.rs b/config/src/config.rs index dcabbdf1f8..fbe6be024b 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -20,7 +20,6 @@ use std::env; use std::fs::{self, File}; use std::io::prelude::*; use std::io::BufReader; -use std::io::Read; use std::path::PathBuf; use crate::comments::insert_comments; @@ -141,6 +140,7 @@ pub fn initial_setup_server(chain_type: &global::ChainTypes) -> Result ConfigMembers { ConfigMembers { + config_file_version: Some(1), server: ServerConfig::default(), logging: Some(LoggingConfig::default()), } @@ -224,10 +224,14 @@ impl GlobalConfig { /// Read config fn read_config(mut self) -> Result { - let mut file = File::open(self.config_file_path.as_mut().unwrap())?; - let mut contents = String::new(); - file.read_to_string(&mut contents)?; - let fixed = GlobalConfig::fix_warning_level(contents); + let config_file_path = self.config_file_path.as_ref().unwrap(); + let contents = fs::read_to_string(config_file_path)?; + let migrated = GlobalConfig::migrate_config_file_version_none_to_2(contents.clone()); + if contents != migrated { + fs::write(config_file_path, &migrated)?; + } + + let fixed = GlobalConfig::fix_warning_level(migrated); let decoded: Result = toml::from_str(&fixed); match decoded { Ok(gc) => { @@ -307,6 +311,46 @@ impl GlobalConfig { Ok(()) } + /// It is placeholder for the future migration. Please check how it is done at grin + /// MWC doesn't have anything to migrate yet + fn migrate_config_file_version_none_to_2(config_str: String) -> String { + // Parse existing config and return unchanged if not eligible for migration + + // Nothing to migrate in MWC. Keeping commented code as example + /*let mut config: ConfigMembers = + toml::from_str(&GlobalConfig::fix_warning_level(config_str.clone())).unwrap(); + if config.config_file_version != None { + return config_str; + } + + // Apply changes both textually and structurally + + let config_str = config_str.replace("\n#########################################\n### SERVER CONFIGURATION ###", "\nconfig_file_version = 2\n\n#########################################\n### SERVER CONFIGURATION ###"); + config.config_file_version = Some(2); + + let config_str = config_str.replace( + "\naccept_fee_base = 1000000\n", + "\naccept_fee_base = 500000\n", + ); + if config.server.pool_config.accept_fee_base == 1000000 { + config.server.pool_config.accept_fee_base = 500000; + } + + let config_str = config_str.replace( + "\n#a setting to 1000000 will be overridden to 500000 to respect the fixfees RFC\n", + "\n", + ); + + // Verify equivalence + + assert_eq!( + config, + toml::from_str(&GlobalConfig::fix_warning_level(config_str.clone())).unwrap() + );*/ + + config_str + } + // For forwards compatibility old config needs `Warning` log level changed to standard log::Level `WARN` fn fix_warning_level(conf: String) -> String { conf.replace("Warning", "WARN") diff --git a/config/src/types.rs b/config/src/types.rs index 0b83ac43d1..45835a1f72 100644 --- a/config/src/types.rs +++ b/config/src/types.rs @@ -71,6 +71,8 @@ pub struct GlobalConfig { /// want serialised or deserialised #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct ConfigMembers { + /// Config file version (None == version 1) + pub config_file_version: Option, /// Server config #[serde(default)] pub server: ServerConfig, From 8fa7ee89075e1f822e3c5ca29e071029d2978768 Mon Sep 17 00:00:00 2001 From: bayk Date: Sun, 16 Jun 2024 21:04:58 -0700 Subject: [PATCH 49/96] grin v5.3 (0078) client invalidateheader and resetchainhead (#3618) * wip - "reset_head" via owner api functionality * jsonrpc pass hash in as a string * sort of works * not a reorg if we simply accept several blocks at once * remember to reset header MMR separately as it is readonly when interacting with txhashset extension * basic client integration needs error handling etc. * reset sync status when reset chain head * track "denylist" (todo) and validate headers against this via the ctx * track denylist (header hashes) in chain itself * header denylist in play * expose invalidateheader as client cmd * rework reset_chain_head - rewind txhashset then header MMR --- api/src/handlers/chain_api.rs | 25 +++++- api/src/owner.rs | 23 +++++- api/src/owner_rpc.rs | 12 +++ chain/src/chain.rs | 136 +++++++++++++++++++++++++------ chain/src/pipe.rs | 58 +++++++++++-- chain/src/txhashset/txhashset.rs | 4 - chain/src/types.rs | 33 +++++--- servers/src/common/adapters.rs | 5 +- src/bin/cmd/client.rs | 28 +++++++ src/bin/mwc.yml | 12 +++ 10 files changed, 289 insertions(+), 47 deletions(-) diff --git a/api/src/handlers/chain_api.rs b/api/src/handlers/chain_api.rs index 09af5b8633..a827f94d44 100644 --- a/api/src/handlers/chain_api.rs +++ b/api/src/handlers/chain_api.rs @@ -14,7 +14,7 @@ use super::utils::{get_output, get_output_v2, w}; use crate::chain; -use crate::core::core::hash::Hashed; +use crate::core::core::hash::{Hash, Hashed}; use crate::rest::*; use crate::router::{Handler, ResponseFuture}; use crate::types::*; @@ -71,6 +71,29 @@ impl Handler for ChainValidationHandler { } } +pub struct ChainResetHandler { + pub chain: Weak, + pub sync_state: Weak, +} + +impl ChainResetHandler { + pub fn reset_chain_head(&self, hash: Hash) -> Result<(), Error> { + let chain = w(&self.chain)?; + let header = chain.get_block_header(&hash)?; + chain.reset_chain_head(&header)?; + + // Reset the sync status and clear out any sync error. + w(&self.sync_state)?.reset(); + Ok(()) + } + + pub fn invalidate_header(&self, hash: Hash) -> Result<(), Error> { + let chain = w(&self.chain)?; + chain.invalidate_header(hash)?; + Ok(()) + } +} + /// Chain compaction handler. Trigger a compaction of the chain state to regain /// storage space. /// POST /v1/chain/compact diff --git a/api/src/owner.rs b/api/src/owner.rs index 54c7f4876a..c600a0e528 100644 --- a/api/src/owner.rs +++ b/api/src/owner.rs @@ -15,7 +15,8 @@ //! Owner API External Definition use crate::chain::{Chain, SyncState}; -use crate::handlers::chain_api::{ChainCompactHandler, ChainValidationHandler}; +use crate::core::core::hash::Hash; +use crate::handlers::chain_api::{ChainCompactHandler, ChainResetHandler, ChainValidationHandler}; use crate::handlers::peers_api::{PeerHandler, PeersConnectedHandler}; use crate::handlers::server_api::StatusHandler; use crate::p2p::{self, PeerData}; @@ -128,6 +129,26 @@ impl Owner { chain_compact_handler.compact_chain() } + pub fn reset_chain_head(&self, hash: String) -> Result<(), Error> { + let hash = Hash::from_hex(&hash) + .map_err(|_| ErrorKind::RequestError("invalid header hash".into()))?; + let handler = ChainResetHandler { + chain: self.chain.clone(), + sync_state: self.sync_state.clone(), + }; + handler.reset_chain_head(hash) + } + + pub fn invalidate_header(&self, hash: String) -> Result<(), Error> { + let hash = Hash::from_hex(&hash) + .map_err(|_| ErrorKind::RequestError("invalid header hash".into()))?; + let handler = ChainResetHandler { + chain: self.chain.clone(), + sync_state: self.sync_state.clone(), + }; + handler.invalidate_header(hash) + } + /// Retrieves information about stored peers. /// If `None` is provided, will list all stored peers. /// diff --git a/api/src/owner_rpc.rs b/api/src/owner_rpc.rs index d04aa9fbe4..6388fca799 100644 --- a/api/src/owner_rpc.rs +++ b/api/src/owner_rpc.rs @@ -132,6 +132,10 @@ pub trait OwnerRpc: Sync + Send { */ fn compact_chain(&self) -> Result<(), ErrorKind>; + fn reset_chain_head(&self, hash: String) -> Result<(), ErrorKind>; + + fn invalidate_header(&self, hash: String) -> Result<(), ErrorKind>; + /** Networked version of [Owner::get_peers](struct.Owner.html#method.get_peers). @@ -363,6 +367,14 @@ impl OwnerRpc for Owner { Owner::validate_chain(self, assume_valid_rangeproofs_kernels).map_err(|e| e.kind().clone()) } + fn reset_chain_head(&self, hash: String) -> Result<(), ErrorKind> { + Owner::reset_chain_head(self, hash).map_err(|e| e.kind().clone()) + } + + fn invalidate_header(&self, hash: String) -> Result<(), ErrorKind> { + Owner::invalidate_header(self, hash).map_err(|e| e.kind().clone()) + } + fn compact_chain(&self) -> Result<(), ErrorKind> { Owner::compact_chain(self).map_err(|e| e.kind().clone()) } diff --git a/chain/src/chain.rs b/chain/src/chain.rs index 506fe50a5c..bd87591555 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -15,7 +15,6 @@ //! Facade and handler for the rest of the blockchain implementation //! and mostly the chain pipeline. -use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::merkle_proof::MerkleProof; use crate::core::core::{ Block, BlockHeader, BlockSums, Committed, Inputs, KernelFeatures, Output, OutputIdentifier, @@ -35,6 +34,11 @@ use crate::types::{ use crate::util::secp::pedersen::{Commitment, RangeProof}; use crate::util::RwLock; use crate::ChainStore; +use crate::{ + core::core::hash::{Hash, Hashed}, + store::Batch, + txhashset::{ExtensionPair, HeaderExtension}, +}; use grin_core::ser; use grin_store::Error::NotFoundErr; use grin_util::ToHex; @@ -158,6 +162,7 @@ pub struct Chain { pibd_segmenter: Arc>>, // POW verification function pow_verifier: fn(&BlockHeader) -> Result<(), pow::Error>, + denylist: Arc>>, archive_mode: bool, genesis: BlockHeader, } @@ -222,6 +227,7 @@ impl Chain { sync_pmmr: Arc::new(RwLock::new(sync_pmmr)), pibd_segmenter: Arc::new(RwLock::new(None)), pow_verifier, + denylist: Arc::new(RwLock::new(vec![])), archive_mode, genesis: genesis.header, }; @@ -253,6 +259,51 @@ impl Chain { Ok(chain) } + /// Add provided header hash to our "denylist". + /// The header corresponding to any "denied" hash will be rejected + /// and the peer subsequently banned. + pub fn invalidate_header(&self, hash: Hash) -> Result<(), Error> { + self.denylist.write().push(hash); + Ok(()) + } + + /// Reset both head and header_head to the provided header. + /// Handles simple rewind and more complex fork scenarios. + /// Used by the reset_chain_head owner api endpoint. + pub fn reset_chain_head>(&self, head: T) -> Result<(), Error> { + let head = head.into(); + + let mut header_pmmr = self.header_pmmr.write(); + let mut txhashset = self.txhashset.write(); + let mut batch = self.store.batch()?; + + let header = batch.get_block_header(&head.hash())?; + + // Rewind and reapply blocks to reset the output/rangeproof/kernel MMR. + txhashset::extending( + &mut header_pmmr, + &mut txhashset, + &mut batch, + |ext, batch| { + self.rewind_and_apply_fork(&header, ext, batch)?; + batch.save_body_head(&head)?; + Ok(()) + }, + )?; + + // If the rewind of full blocks was successful then we can rewind the header MMR. + // Rewind and reapply headers to reset the header MMR. + txhashset::header_extending(&mut header_pmmr, &mut batch, |ext, batch| { + self.rewind_and_apply_header_fork(&header, ext, batch)?; + batch.save_header_head(&head)?; + Ok(()) + })?; + + batch.commit()?; + + Ok(()) + } + /// Are we running with archive_mode enabled? pub fn archive_mode(&self) -> bool { self.archive_mode @@ -278,7 +329,7 @@ impl Chain { let hash = Hash::from_hex(BLOCK_TO_BAN)?; if let Ok(header) = self.get_block_header(&hash) { - if self.is_on_current_chain(&header).is_ok() { + if self.is_on_current_chain(&header, self.head()?).is_ok() { debug!( "rewind_bad_block: found header: {} at {}", header.hash(), @@ -313,7 +364,7 @@ impl Chain { &mut txhashset, &mut batch, |ext, batch| { - pipe::rewind_and_apply_fork(&prev_header, ext, batch)?; + self.rewind_and_apply_fork(&prev_header, ext, batch)?; // Reset chain head. batch.save_body_head(&new_head)?; @@ -341,7 +392,7 @@ impl Chain { let old_header_head = batch.header_head()?; txhashset::header_extending(&mut header_pmmr, &mut batch, |ext, batch| { - pipe::rewind_and_apply_header_fork(&prev_header, ext, batch)?; + self.rewind_and_apply_header_fork(&prev_header, ext, batch)?; // Reset chain head. batch.save_header_head(&new_head)?; @@ -426,7 +477,7 @@ impl Chain { let inputs: Vec<_> = txhashset::extending_readonly(&mut header_pmmr, &mut txhashset, |ext, batch| { let previous_header = batch.get_previous_header(&block.header)?; - pipe::rewind_and_apply_fork(&previous_header, ext, batch)?; + self.rewind_and_apply_fork(&previous_header, ext, batch)?; ext.extension .utxo_view(ext.header_extension) .validate_inputs(&block.inputs(), batch) @@ -449,7 +500,7 @@ impl Chain { // If head is updated then we are either "next" block or we just experienced a "reorg" to new head. // Otherwise this is a "fork" off the main chain. if let Some(head) = head { - if head.prev_block_h == prev_head.last_block_h { + if self.is_on_current_chain(prev_head, head).is_ok() { BlockStatus::Next { prev } } else { BlockStatus::Reorg { @@ -468,7 +519,8 @@ impl Chain { } /// Quick check for "known" duplicate block up to and including current chain head. - fn is_known(&self, header: &BlockHeader) -> Result<(), Error> { + /// Returns an error if this block is "known". + pub fn is_known(&self, header: &BlockHeader) -> Result<(), Error> { let head = self.head()?; if head.hash() == header.hash() { return Err(ErrorKind::Unfit("duplicate block".into()).into()); @@ -518,14 +570,14 @@ impl Chain { /// Returns true if it has been added to the longest chain /// or false if it has added to a fork (or orphan?). fn process_block_single(&self, b: Block, opts: Options) -> Result, Error> { - // Check if we already know about this block. - self.is_known(&b.header)?; - // Process the header first. // If invalid then fail early. // If valid then continue with block processing with header_head committed to db etc. self.process_block_header(&b.header, opts)?; + // Check if we already know about this full block. + self.is_known(&b.header)?; + // Check if this block is an orphan. // Only do this once we know the header PoW is valid. self.check_orphan(&b, opts)?; @@ -607,9 +659,13 @@ impl Chain { header_pmmr: &'a mut txhashset::PMMRHandle, txhashset: &'a mut txhashset::TxHashSet, ) -> Result, Error> { + let denylist = self.denylist.read().clone(); Ok(pipe::BlockContext { opts, pow_verifier: self.pow_verifier, + header_allowed: Box::new(move |header| { + pipe::validate_header_denylist(header, &denylist) + }), header_pmmr, txhashset, batch, @@ -809,7 +865,7 @@ impl Chain { // latest block header. Rewind the extension to the specified header to // ensure the view is consistent. txhashset::extending_readonly(&mut header_pmmr, &mut txhashset, |ext, batch| { - pipe::rewind_and_apply_fork(&header, ext, batch)?; + self.rewind_and_apply_fork(&header, ext, batch)?; ext.extension .validate(&self.genesis, fast_validation, &NoStatus, &header)?; Ok(()) @@ -822,7 +878,7 @@ impl Chain { let prev_root = txhashset::header_extending_readonly(&mut header_pmmr, &self.store(), |ext, batch| { let prev_header = batch.get_previous_header(header)?; - pipe::rewind_and_apply_header_fork(&prev_header, ext, batch)?; + self.rewind_and_apply_header_fork(&prev_header, ext, batch)?; ext.root() })?; @@ -841,7 +897,7 @@ impl Chain { let (prev_root, roots, sizes) = txhashset::extending_readonly(&mut header_pmmr, &mut txhashset, |ext, batch| { let previous_header = batch.get_previous_header(&b.header)?; - pipe::rewind_and_apply_fork(&previous_header, ext, batch)?; + self.rewind_and_apply_fork(&previous_header, ext, batch)?; let extension = &mut ext.extension; let header_extension = &mut ext.header_extension; @@ -886,7 +942,7 @@ impl Chain { let mut txhashset = self.txhashset.write(); let merkle_proof = txhashset::extending_readonly(&mut header_pmmr, &mut txhashset, |ext, batch| { - pipe::rewind_and_apply_fork(&header, ext, batch)?; + self.rewind_and_apply_fork(&header, ext, batch)?; ext.extension.merkle_proof(out_id, batch) })?; @@ -900,6 +956,35 @@ impl Chain { txhashset.merkle_proof(commit) } + /// Rewind and apply fork with the chain specific header validation (denylist) rules. + /// If we rewind and re-apply a "denied" block then validation will fail. + fn rewind_and_apply_fork( + &self, + header: &BlockHeader, + ext: &mut ExtensionPair, + batch: &Batch, + ) -> Result { + let denylist = self.denylist.read().clone(); + let (header, _) = pipe::rewind_and_apply_fork(header, ext, batch, &|header| { + pipe::validate_header_denylist(header, &denylist) + })?; + Ok(header) + } + + /// Rewind and apply fork with the chain specific header validation (denylist) rules. + /// If we rewind and re-apply a "denied" header then validation will fail. + fn rewind_and_apply_header_fork( + &self, + header: &BlockHeader, + ext: &mut HeaderExtension, + batch: &Batch, + ) -> Result<(), Error> { + let denylist = self.denylist.read().clone(); + pipe::rewind_and_apply_header_fork(header, ext, batch, &|header| { + pipe::validate_header_denylist(header, &denylist) + }) + } + /// Provides a reading view into the current txhashset state as well as /// the required indexes for a consumer to rewind to a consistent state /// at the provided block hash. @@ -913,8 +998,9 @@ impl Chain { let mut header_pmmr = self.header_pmmr.write(); let mut txhashset = self.txhashset.write(); + txhashset::extending_readonly(&mut header_pmmr, &mut txhashset, |ext, batch| { - pipe::rewind_and_apply_fork(&header, ext, batch)?; + self.rewind_and_apply_fork(&header, ext, batch)?; ext.extension.snapshot(batch)?; // prepare the zip @@ -1042,7 +1128,7 @@ impl Chain { let mut batch = self.store.batch()?; let header = batch.get_block_header(&head.hash())?; txhashset::header_extending(&mut sync_pmmr, &mut batch, |ext, batch| { - pipe::rewind_and_apply_header_fork(&header, ext, batch)?; + self.rewind_and_apply_header_fork(&header, ext, batch)?; Ok(()) })?; batch.commit()?; @@ -1056,7 +1142,7 @@ impl Chain { pub fn fork_point(&self) -> Result { let body_head = self.head()?; let mut current = self.get_block_header(&body_head.hash())?; - while !self.is_on_current_chain(¤t).is_ok() { + while !self.is_on_current_chain(¤t, body_head).is_ok() { current = self.get_previous_header(¤t)?; } Ok(current) @@ -1666,9 +1752,13 @@ impl Chain { /// Verifies the given block header is actually on the current chain. /// Checks the header_by_height index to verify the header is where we say /// it is - pub fn is_on_current_chain(&self, header: &BlockHeader) -> Result<(), Error> { - let chain_header = self.get_header_by_height(header.height)?; - if chain_header.hash() == header.hash() { + fn is_on_current_chain>(&self, x: T, head: Tip) -> Result<(), Error> { + let x: Tip = x.into(); + if x.height > head.height { + return Err(ErrorKind::Other("not on current chain".to_string()).into()); + } + + if x.hash() == self.get_header_hash_by_height(x.height)? { Ok(()) } else { Err(ErrorKind::Other(format!("header is not on current chain")).into()) @@ -1690,7 +1780,7 @@ impl Chain { let mut header_pmmr = self.header_pmmr.write(); txhashset::header_extending_readonly(&mut header_pmmr, &self.store(), |ext, batch| { let header = batch.get_block_header(&sync_head.hash())?; - pipe::rewind_and_apply_header_fork(&header, ext, batch)?; + self.rewind_and_apply_header_fork(&header, ext, batch)?; let hashes = heights .iter() @@ -1774,7 +1864,7 @@ fn setup_head( let header = batch.get_block_header(&head.last_block_h)?; let res = txhashset::extending(header_pmmr, txhashset, &mut batch, |ext, batch| { - pipe::rewind_and_apply_fork(&header, ext, batch)?; + pipe::rewind_and_apply_fork(&header, ext, batch, &|_| Ok(()))?; let extension = &mut ext.extension; @@ -1822,7 +1912,7 @@ fn setup_head( let prev_header = batch.get_block_header(&head.prev_block_h)?; txhashset::extending(header_pmmr, txhashset, &mut batch, |ext, batch| { - pipe::rewind_and_apply_fork(&prev_header, ext, batch) + pipe::rewind_and_apply_fork(&prev_header, ext, batch, &|_| Ok(())) })?; // Now "undo" the latest block and forget it ever existed. diff --git a/chain/src/pipe.rs b/chain/src/pipe.rs index 8e69d5decf..df99e073d9 100644 --- a/chain/src/pipe.rs +++ b/chain/src/pipe.rs @@ -15,7 +15,7 @@ //! Implementation of the chain block acceptance (or refusal) pipeline. use crate::core::consensus; -use crate::core::core::hash::Hashed; +use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::Committed; use crate::core::core::{ block, Block, BlockHeader, BlockSums, HeaderVersion, OutputIdentifier, TransactionBody, @@ -26,7 +26,6 @@ use crate::error::{Error, ErrorKind}; use crate::store; use crate::txhashset; use crate::types::{CommitPos, Options, Tip}; -use grin_core::core::hash::Hash; use grin_util::RwLock; use std::collections::HashSet; use std::iter::FromIterator; @@ -38,6 +37,8 @@ pub struct BlockContext<'a> { pub opts: Options, /// The pow verifier to use when processing a block. pub pow_verifier: fn(&BlockHeader) -> Result<(), pow::Error>, + /// Custom fn allowing arbitrary header validation rules (denylist) to be applied. + pub header_allowed: Box Result<(), Error>>, /// The active txhashset (rewindable MMRs) to use for block processing. pub txhashset: &'a mut txhashset::TxHashSet, /// The active header MMR handle. @@ -202,8 +203,10 @@ pub fn process_block( let header_pmmr = &mut ctx.header_pmmr; let txhashset = &mut ctx.txhashset; let batch = &mut ctx.batch; + let ctx_specific_validation = &ctx.header_allowed; let fork_point = txhashset::extending(header_pmmr, txhashset, batch, |ext, batch| { - let fork_point_local_blocks = rewind_and_apply_fork(&prev, ext, batch)?; + let fork_point_local_blocks = + rewind_and_apply_fork(&prev, ext, batch, ctx_specific_validation)?; let fork_point = fork_point_local_blocks.0; let local_branch_blocks = fork_point_local_blocks.1; @@ -305,9 +308,11 @@ pub fn process_block_headers( add_block_header(header, &ctx.batch)?; } + let ctx_specific_validation = &ctx.header_allowed; + // Now apply this entire chunk of headers to the header MMR. txhashset::header_extending(&mut ctx.header_pmmr, &mut ctx.batch, |ext, batch| { - rewind_and_apply_header_fork(&last_header, ext, batch)?; + rewind_and_apply_header_fork(&last_header, ext, batch, ctx_specific_validation)?; // If previous sync_head is not on the "current" chain then // these headers are on an alternative fork to sync_head. let alt_fork = !ext.is_on_current_chain(sync_head, batch)?; @@ -361,10 +366,12 @@ pub fn process_block_header(header: &BlockHeader, ctx: &mut BlockContext<'_>) -> // We want to validate this individual header before applying it to our header PMMR. validate_header(header, ctx)?; + let ctx_specific_validation = &ctx.header_allowed; + // Apply the header to the header PMMR, making sure we put the extension in the correct state // based on previous header first. txhashset::header_extending(&mut ctx.header_pmmr, &mut ctx.batch, |ext, batch| { - rewind_and_apply_header_fork(&prev_header, ext, batch)?; + rewind_and_apply_header_fork(&prev_header, ext, batch, ctx_specific_validation)?; ext.validate_root(header)?; ext.apply_header(header)?; if !has_more_work(&header, &header_head) { @@ -439,10 +446,42 @@ fn check_bad_header(header: &BlockHeader) -> Result<(), Error> { } } +/// Apply any "header_invalidated" (aka denylist) rules provided as part of the context. +fn validate_header_ctx(header: &BlockHeader, ctx: &mut BlockContext<'_>) -> Result<(), Error> { + // Apply any custom header validation rules via the context. + (ctx.header_allowed)(header) +} + +/// Validate header against an explicit "denylist" of header hashes. +/// Returns a "Block" error which is "bad_data" and will result in peer being banned. +pub fn validate_header_denylist(header: &BlockHeader, denylist: &[Hash]) -> Result<(), Error> { + if denylist.is_empty() { + return Ok(()); + } + + // Assume our denylist is a manageable size for now. + // Log it here to occasionally remind us. + debug!( + "validate_header_denylist: {} at {}, denylist: {:?}", + header.hash(), + header.height, + denylist + ); + + if denylist.contains(&header.hash()) { + return Err(ErrorKind::Block(block::Error::Other("header hash denied".into())).into()); + } else { + return Ok(()); + } +} + /// First level of block validation that only needs to act on the block header /// to make it as cheap as possible. The different validations are also /// arranged by order of cost to have as little DoS surface as possible. fn validate_header(header: &BlockHeader, ctx: &mut BlockContext<'_>) -> Result<(), Error> { + // Apply any ctx specific header validation (denylist) rules. + validate_header_ctx(header, ctx)?; + // First I/O cost, delayed as late as possible. let prev = prev_header_store(header, &mut ctx.batch)?; @@ -655,6 +694,7 @@ pub fn rewind_and_apply_header_fork( header: &BlockHeader, ext: &mut txhashset::HeaderExtension<'_>, batch: &store::Batch<'_>, + ctx_specific_validation: &dyn Fn(&BlockHeader) -> Result<(), Error>, ) -> Result<(), Error> { let mut fork_hashes = vec![]; let mut current = header.clone(); @@ -674,6 +714,11 @@ pub fn rewind_and_apply_header_fork( let header = batch .get_block_header(&h) .map_err(|e| ErrorKind::StoreErr(e, "getting forked headers".to_string()))?; + + // Re-validate every header being re-applied. + // This makes it possible to check all header hashes against the ctx specific "denylist". + (ctx_specific_validation)(&header)?; + ext.validate_root(&header)?; ext.apply_header(&header)?; } @@ -690,12 +735,13 @@ pub fn rewind_and_apply_fork( header: &BlockHeader, ext: &mut txhashset::ExtensionPair<'_>, batch: &store::Batch<'_>, + ctx_specific_validation: &dyn Fn(&BlockHeader) -> Result<(), Error>, ) -> Result<(BlockHeader, Vec), Error> { let extension = &mut ext.extension; let header_extension = &mut ext.header_extension; // Prepare the header MMR. - rewind_and_apply_header_fork(header, header_extension, batch)?; + rewind_and_apply_header_fork(header, header_extension, batch, ctx_specific_validation)?; // Rewind the txhashset extension back to common ancestor based on header MMR. let mut current = batch.head_header()?; diff --git a/chain/src/txhashset/txhashset.rs b/chain/src/txhashset/txhashset.rs index 9876cc18c4..36c2b890a7 100644 --- a/chain/src/txhashset/txhashset.rs +++ b/chain/src/txhashset/txhashset.rs @@ -802,8 +802,6 @@ where { let batch = store.batch()?; - // Note: Extending either the sync_head or header_head MMR here. - // Use underlying MMR to determine the "head". let head = match handle.head_hash() { Ok(hash) => { let header = batch.get_block_header(&hash)?; @@ -840,8 +838,6 @@ where // index saving can be undone let child_batch = batch.child()?; - // Note: Extending either the sync_head or header_head MMR here. - // Use underlying MMR to determine the "head". let head = match handle.head_hash() { Ok(hash) => { if let Ok(header) = child_batch.get_block_header(&hash) { diff --git a/chain/src/types.rs b/chain/src/types.rs index dc1248cb58..42f155f44e 100644 --- a/chain/src/types.rs +++ b/chain/src/types.rs @@ -134,6 +134,12 @@ impl SyncState { } } + /// Reset sync status to NoSync. + pub fn reset(&self) { + self.clear_sync_error(); + self.update(SyncStatus::NoSync); + } + /// Whether the current state matches any active syncing operation. /// Note: This includes our "initial" state. pub fn is_syncing(&self) -> bool { @@ -390,6 +396,23 @@ impl Tip { } } +impl From for Tip { + fn from(header: BlockHeader) -> Self { + Self::from(&header) + } +} + +impl From<&BlockHeader> for Tip { + fn from(header: &BlockHeader) -> Self { + Tip { + height: header.height, + last_block_h: header.hash(), + prev_block_h: header.prev_hash, + total_difficulty: header.total_difficulty(), + } + } +} + impl Hashed for Tip { /// The hash of the underlying block. fn hash(&self) -> Hash { @@ -407,16 +430,6 @@ impl Default for Tip { } } } -impl From<&BlockHeader> for Tip { - fn from(header: &BlockHeader) -> Tip { - Tip { - height: header.height, - last_block_h: header.hash(), - prev_block_h: header.prev_hash, - total_difficulty: header.total_difficulty(), - } - } -} /// Serialization of a tip, required to save to datastore. impl ser::Writeable for Tip { diff --git a/servers/src/common/adapters.rs b/servers/src/common/adapters.rs index a8c65b380d..77b05fd514 100644 --- a/servers/src/common/adapters.rs +++ b/servers/src/common/adapters.rs @@ -211,7 +211,7 @@ where debug!("block_received, cache for {} OK", b_hash); } - if self.chain().block_exists(b.hash())? { + if self.chain().is_known(&b.header).is_err() { return Ok(true); } @@ -234,9 +234,10 @@ where peer_info: &PeerInfo, ) -> Result { // No need to process this compact block if we have previously accepted the _full block_. - if self.chain().block_exists(cb.hash())? { + if self.chain().is_known(&cb.header).is_err() { return Ok(true); } + let bhash = cb.hash(); debug!( "Received compact_block {} at {} from {} [out/kern/kern_ids: {}/{}/{}] going to process.", diff --git a/src/bin/cmd/client.rs b/src/bin/cmd/client.rs index a68bed5427..05bb0ceeb4 100644 --- a/src/bin/cmd/client.rs +++ b/src/bin/cmd/client.rs @@ -159,6 +159,26 @@ impl HTTPNodeClient { e.reset().unwrap(); } + pub fn reset_chain_head(&self, hash: String) { + let mut e = term::stdout().unwrap(); + let params = json!([hash]); + match self.send_json_request::<()>("reset_chain_head", ¶ms) { + Ok(_) => writeln!(e, "Successfully reset chain head {}", hash).unwrap(), + Err(_) => writeln!(e, "Failed to reset chain head {}", hash).unwrap(), + } + e.reset().unwrap(); + } + + pub fn invalidate_header(&self, hash: String) { + let mut e = term::stdout().unwrap(); + let params = json!([hash]); + match self.send_json_request::<()>("invalidate_header", ¶ms) { + Ok(_) => writeln!(e, "Successfully invalidated header: {}", hash).unwrap(), + Err(_) => writeln!(e, "Failed to invalidate header: {}", hash).unwrap(), + } + e.reset().unwrap(); + } + pub fn ban_peer(&self, peer_addr: &SocketAddr) { let mut e = term::stdout().unwrap(); let params = json!([peer_addr]); @@ -197,6 +217,14 @@ pub fn client_command(client_args: &ArgMatches<'_>, global_config: GlobalConfig) let assume_valid_rangeproofs_kernels = args.is_present("fast"); node_client.verify_chain(assume_valid_rangeproofs_kernels); } + ("resetchainhead", Some(args)) => { + let hash = args.value_of("hash").unwrap(); + node_client.reset_chain_head(hash.to_string()); + } + ("invalidateheader", Some(args)) => { + let hash = args.value_of("hash").unwrap(); + node_client.invalidate_header(hash.to_string()); + } ("ban", Some(peer_args)) => { let peer = peer_args.value_of("peer").unwrap(); diff --git a/src/bin/mwc.yml b/src/bin/mwc.yml index cca84d4963..67063b962c 100644 --- a/src/bin/mwc.yml +++ b/src/bin/mwc.yml @@ -85,3 +85,15 @@ subcommands: short: f long: fast takes_value: false + - resetchainhead: + about: Resets the local chain head + args: + - hash: + help: The header hash to reset to + required: true + - invalidateheader: + about: Adds header hash to denylist + args: + - hash: + help: The header hash to invalidate + required: true From 2a1206a15db0b50d194dae812644a7d183d92721 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 17 Jun 2024 15:02:20 -0700 Subject: [PATCH 50/96] Test to validate the calc_mwc_block_reward & calc_mwc_block_overage methods, that needs to be in sync. Added to support PR https://github.com/mwcproject/mwc-node/pull/49 --- core/src/consensus.rs | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/core/src/consensus.rs b/core/src/consensus.rs index e082c54bef..63d543dcee 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -1133,4 +1133,77 @@ mod test { // Expected 20M in total. The coin base is exactly 20M assert_eq!(total_blocks_reward, 20000000000000000); } + + // Brute force test to validate that calc_mwc_block_reward and calc_mwc_block_overage are in sync fo all blocks + // Please note, the test is slow, it checking values for every block that will be generated until reward will be gone + // Test is 'ignore' because it takes about an hour to run + #[test] + #[ignore] + fn test_rewards_full_cycle() { + global::set_local_chain_type(global::ChainTypes::Mainnet); + + let mut total_coins: u64 = GENESIS_BLOCK_REWARD; + let mut height: u64 = 0; + let mut zero_reward_blocks = 0; + + let total_blocks = get_epoch_block_offset(12); + + while zero_reward_blocks < 100 { + assert_eq!(calc_mwc_block_overage(height, true), total_coins); + height += 1; + let r = calc_mwc_block_reward(height); + total_coins += r; + if r == 0 { + zero_reward_blocks += 1; + } + if height % 1000000 == 0 { + println!( + "Current height={}, reward={}, coins={}, progress={:.1}%", + height, + r, + total_coins, + height as f64 / total_blocks as f64 * 100.0 + ); + } + } + + println!( + "Finished with height={}, reward={}, coins={}", + height, + calc_mwc_block_reward(height), + total_coins + ); + + assert_eq!(total_coins, 20000000000000000); + assert!(height > get_epoch_block_offset(12) + 99); + + // Test finished with output: + // Current height=884000000, reward=10000000, coins=19970529927788020, progress=99.7% + // Current height=885000000, reward=10000000, coins=19980529927788020, progress=99.8% + // Current height=886000000, reward=10000000, coins=19990529927788020, progress=99.9% + // Finished with height=886947108, reward=0, coins=20000000000000000 + // test consensus::test::test_rewards_full_cycle ... ok + } + + // Testing last 1M blocks, srating from the event: height=886000000, reward=10000000, coins=19990529927788020, progress=99.9% + #[test] + fn test_last_epoch() { + global::set_local_chain_type(global::ChainTypes::Mainnet); + + let mut total_coins: u64 = 19990529927788020; + let mut height: u64 = 886000000; + let mut zero_reward_blocks = 0; + + while zero_reward_blocks < 100 { + assert_eq!(calc_mwc_block_overage(height, true), total_coins); + height += 1; + let r = calc_mwc_block_reward(height); + total_coins += r; + if r == 0 { + zero_reward_blocks += 1; + } + } + assert_eq!(total_coins, 20000000000000000); + assert!(height > get_epoch_block_offset(12) + 99); + } } From 67e44a3b13b062a599127100335ce26ed73ea9fd Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 17 Jun 2024 15:21:27 -0700 Subject: [PATCH 51/96] grin v5.3 (0078) bump to 5.2.0-alpha.1 on master (#3640) Bumped to 5.2.0 --- Cargo.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fde19719c2..fe5950bafe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1428,7 +1428,7 @@ dependencies = [ [[package]] name = "grin_api" -version = "5.1.0" +version = "5.2.0" dependencies = [ "bytes 0.5.6", "chrono", @@ -1462,7 +1462,7 @@ dependencies = [ [[package]] name = "grin_chain" -version = "5.1.0" +version = "5.2.0" dependencies = [ "bit-vec", "bitflags 1.2.1", @@ -1487,7 +1487,7 @@ dependencies = [ [[package]] name = "grin_config" -version = "5.1.0" +version = "5.2.0" dependencies = [ "dirs 2.0.2", "failure", @@ -1505,7 +1505,7 @@ dependencies = [ [[package]] name = "grin_core" -version = "5.1.0" +version = "5.2.0" dependencies = [ "blake2-rfc", "byteorder", @@ -1532,7 +1532,7 @@ dependencies = [ [[package]] name = "grin_keychain" -version = "5.1.0" +version = "5.2.0" dependencies = [ "blake2-rfc", "byteorder", @@ -1555,7 +1555,7 @@ dependencies = [ [[package]] name = "grin_p2p" -version = "5.1.0" +version = "5.2.0" dependencies = [ "async-std", "bitflags 1.2.1", @@ -1590,7 +1590,7 @@ dependencies = [ [[package]] name = "grin_pool" -version = "5.1.0" +version = "5.2.0" dependencies = [ "blake2-rfc", "chrono", @@ -1623,7 +1623,7 @@ dependencies = [ [[package]] name = "grin_servers" -version = "5.1.0" +version = "5.2.0" dependencies = [ "atomic_float", "chrono", @@ -1661,7 +1661,7 @@ dependencies = [ [[package]] name = "grin_store" -version = "5.1.0" +version = "5.2.0" dependencies = [ "byteorder", "chrono", @@ -1684,7 +1684,7 @@ dependencies = [ [[package]] name = "grin_util" -version = "5.1.0" +version = "5.2.0" dependencies = [ "backtrace", "base64 0.12.3", @@ -2606,7 +2606,7 @@ dependencies = [ [[package]] name = "mwc" -version = "5.1.0" +version = "5.2.0" dependencies = [ "blake2-rfc", "built", From 32b9c282bae267dbd99dc8cdfd687a2bd3d38f59 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 17 Jun 2024 15:21:32 -0700 Subject: [PATCH 52/96] grin v5.3 (0078) bump to 5.2.0-alpha.1 on master (#3640) Bumped to 5.2.0 --- Cargo.toml | 22 +++++++++++----------- api/Cargo.toml | 14 +++++++------- chain/Cargo.toml | 10 +++++----- config/Cargo.toml | 10 +++++----- core/Cargo.toml | 6 +++--- keychain/Cargo.toml | 4 ++-- p2p/Cargo.toml | 12 ++++++------ pool/Cargo.toml | 10 +++++----- servers/Cargo.toml | 18 +++++++++--------- store/Cargo.toml | 6 +++--- util/Cargo.toml | 2 +- 11 files changed, 57 insertions(+), 57 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 61a98500b4..960069765a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mwc" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -34,14 +34,14 @@ serde_json = "1" term = "0.6" cursive_table_view = "0.13.2" -grin_api = { path = "./api", version = "5.1.0" } -grin_config = { path = "./config", version = "5.1.0" } -grin_chain = { path = "./chain", version = "5.1.0" } -grin_core = { path = "./core", version = "5.1.0" } -grin_keychain = { path = "./keychain", version = "5.1.0" } -grin_p2p = { path = "./p2p", version = "5.1.0" } -grin_servers = { path = "./servers", version = "5.1.0" } -grin_util = { path = "./util", version = "5.1.0" } +grin_api = { path = "./api", version = "5.2.0" } +grin_config = { path = "./config", version = "5.2.0" } +grin_chain = { path = "./chain", version = "5.2.0" } +grin_core = { path = "./core", version = "5.2.0" } +grin_keychain = { path = "./keychain", version = "5.2.0" } +grin_p2p = { path = "./p2p", version = "5.2.0" } +grin_servers = { path = "./servers", version = "5.2.0" } +grin_util = { path = "./util", version = "5.2.0" } [dependencies.cursive] version = "0.16" @@ -52,5 +52,5 @@ features = ["pancurses-backend"] built = { version = "0.4", features = ["git2"]} [dev-dependencies] -grin_chain = { path = "./chain", version = "5.1.0" } -grin_store = { path = "./store", version = "5.1.0" } +grin_chain = { path = "./chain", version = "5.2.0" } +grin_store = { path = "./store", version = "5.2.0" } diff --git a/api/Cargo.toml b/api/Cargo.toml index b20ffcf593..35612247f0 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_api" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "APIs for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -31,12 +31,12 @@ url = "2.1" bytes = "0.5" chrono = { version = "0.4.11", features = ["serde"] } -grin_core = { path = "../core", version = "5.1.0" } -grin_chain = { path = "../chain", version = "5.1.0" } -grin_p2p = { path = "../p2p", version = "5.1.0" } -grin_pool = { path = "../pool", version = "5.1.0" } -grin_store = { path = "../store", version = "5.1.0" } -grin_util = { path = "../util", version = "5.1.0" } +grin_core = { path = "../core", version = "5.2.0" } +grin_chain = { path = "../chain", version = "5.2.0" } +grin_p2p = { path = "../p2p", version = "5.2.0" } +grin_pool = { path = "../pool", version = "5.2.0" } +grin_store = { path = "../store", version = "5.2.0" } +grin_util = { path = "../util", version = "5.2.0" } # NOTE. We can't have hyper-rustls the same version for Android and non android. because if how rust builds dependency. # Android must have v0.20+ diff --git a/chain/Cargo.toml b/chain/Cargo.toml index 3c04b325ec..a53238e895 100644 --- a/chain/Cargo.toml +++ b/chain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_chain" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -24,10 +24,10 @@ chrono = "0.4.11" lru-cache = "0.1" lazy_static = "1" -grin_core = { path = "../core", version = "5.1.0" } -grin_keychain = { path = "../keychain", version = "5.1.0" } -grin_store = { path = "../store", version = "5.1.0" } -grin_util = { path = "../util", version = "5.1.0" } +grin_core = { path = "../core", version = "5.2.0" } +grin_keychain = { path = "../keychain", version = "5.2.0" } +grin_store = { path = "../store", version = "5.2.0" } +grin_util = { path = "../util", version = "5.2.0" } [dev-dependencies] env_logger = "0.7" diff --git a/config/Cargo.toml b/config/Cargo.toml index 5a17fb3643..4a447f166b 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_config" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Configuration for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -18,10 +18,10 @@ dirs = "2.0" failure = "0.1" failure_derive = "0.1" -grin_core = { path = "../core", version = "5.1.0" } -grin_servers = { path = "../servers", version = "5.1.0" } -grin_p2p = { path = "../p2p", version = "5.1.0" } -grin_util = { path = "../util", version = "5.1.0" } +grin_core = { path = "../core", version = "5.2.0" } +grin_servers = { path = "../servers", version = "5.2.0" } +grin_p2p = { path = "../p2p", version = "5.2.0" } +grin_util = { path = "../util", version = "5.2.0" } [dev-dependencies] pretty_assertions = "0.6.1" diff --git a/core/Cargo.toml b/core/Cargo.toml index a4a12c1dd3..198db36c26 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_core" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -29,8 +29,8 @@ chrono = { version = "0.4.11", features = ["serde"] } zeroize = { version = "1.1", features =["zeroize_derive"] } bytes = "0.5" -keychain = { package = "grin_keychain", path = "../keychain", version = "5.1.0" } -util = { package = "grin_util", path = "../util", version = "5.1.0" } +keychain = { package = "grin_keychain", path = "../keychain", version = "5.2.0" } +util = { package = "grin_util", path = "../util", version = "5.2.0" } [dev-dependencies] serde_json = "1" diff --git a/keychain/Cargo.toml b/keychain/Cargo.toml index 6999875e9f..729c9a6fb1 100644 --- a/keychain/Cargo.toml +++ b/keychain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_keychain" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -28,4 +28,4 @@ ripemd160 = "0.9" sha2 = "0.9" pbkdf2 = "0.8" -grin_util = { path = "../util", version = "5.1.0" } +grin_util = { path = "../util", version = "5.2.0" } diff --git a/p2p/Cargo.toml b/p2p/Cargo.toml index db1f16b07c..e4dd8118de 100644 --- a/p2p/Cargo.toml +++ b/p2p/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_p2p" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -37,10 +37,10 @@ ed25519-dalek = "1" serde_json = "1" bytes = "0.5" -grin_core = { path = "../core", version = "5.1.0" } -grin_store = { path = "../store", version = "5.1.0" } -grin_util = { path = "../util", version = "5.1.0" } -grin_chain = { path = "../chain", version = "5.1.0" } +grin_core = { path = "../core", version = "5.2.0" } +grin_store = { path = "../store", version = "5.2.0" } +grin_util = { path = "../util", version = "5.2.0" } +grin_chain = { path = "../chain", version = "5.2.0" } [dev-dependencies] -grin_pool = { path = "../pool", version = "5.1.0" } \ No newline at end of file +grin_pool = { path = "../pool", version = "5.2.0" } diff --git a/pool/Cargo.toml b/pool/Cargo.toml index 676101d1a0..de030563d1 100644 --- a/pool/Cargo.toml +++ b/pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_pool" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Chain implementation for grin, a simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -20,9 +20,9 @@ chrono = "0.4.11" failure = "0.1" failure_derive = "0.1" -grin_core = { path = "../core", version = "5.1.0" } -grin_keychain = { path = "../keychain", version = "5.1.0" } -grin_util = { path = "../util", version = "5.1.0" } +grin_core = { path = "../core", version = "5.2.0" } +grin_keychain = { path = "../keychain", version = "5.2.0" } +grin_util = { path = "../util", version = "5.2.0" } [dev-dependencies] -grin_chain = { path = "../chain", version = "5.1.0" } +grin_chain = { path = "../chain", version = "5.2.0" } diff --git a/servers/Cargo.toml b/servers/Cargo.toml index 05713e0d86..96f14e2f4d 100644 --- a/servers/Cargo.toml +++ b/servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_servers" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -33,14 +33,14 @@ dirs = "1.0.3" timer = "0.2" atomic_float = "1.0" -grin_api = { path = "../api", version = "5.1.0" } -grin_chain = { path = "../chain", version = "5.1.0" } -grin_core = { path = "../core", version = "5.1.0" } -grin_keychain = { path = "../keychain", version = "5.1.0" } -grin_p2p = { path = "../p2p", version = "5.1.0" } -grin_pool = { path = "../pool", version = "5.1.0" } -grin_store = { path = "../store", version = "5.1.0" } -grin_util = { path = "../util", version = "5.1.0" } +grin_api = { path = "../api", version = "5.2.0" } +grin_chain = { path = "../chain", version = "5.2.0" } +grin_core = { path = "../core", version = "5.2.0" } +grin_keychain = { path = "../keychain", version = "5.2.0" } +grin_p2p = { path = "../p2p", version = "5.2.0" } +grin_pool = { path = "../pool", version = "5.2.0" } +grin_store = { path = "../store", version = "5.2.0" } +grin_util = { path = "../util", version = "5.2.0" } # NOTE. We can't have hyper-rustls the same version for Android and non android. because if how rust builds dependency. # Android must have v0.20+ diff --git a/store/Cargo.toml b/store/Cargo.toml index 2265ae8e1a..0283063c0d 100644 --- a/store/Cargo.toml +++ b/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_store" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" @@ -22,8 +22,8 @@ serde = "1" serde_derive = "1" log = "0.4" -grin_core = { path = "../core", version = "5.1.0" } -grin_util = { path = "../util", version = "5.1.0" } +grin_core = { path = "../core", version = "5.2.0" } +grin_util = { path = "../util", version = "5.2.0" } [dev-dependencies] chrono = "0.4.11" diff --git a/util/Cargo.toml b/util/Cargo.toml index fdc65a023a..d137a6779f 100644 --- a/util/Cargo.toml +++ b/util/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "grin_util" -version = "5.1.0" +version = "5.2.0" authors = ["Grin Developers "] description = "Simple, private and scalable cryptocurrency implementation based on the MimbleWimble chain format." license = "Apache-2.0" From cf0e2b5895314c93094f3892b893f8d4fae69a09 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 17 Jun 2024 15:35:44 -0700 Subject: [PATCH 53/96] grin v5.3 (0083) Spelling Improvements (#3642) --- doc/intro.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/intro.md b/doc/intro.md index caf56e83d8..c12469bd1c 100644 --- a/doc/intro.md +++ b/doc/intro.md @@ -26,7 +26,7 @@ The main goal and characteristics of the MWC project are: A detailed post on the step-by-step of how MWC transactions work (with graphics) can be found [in this Medium post](https://medium.com/@brandonarvanaghi/grin-transactions-explained-step-by-step-fdceb905a853). -## Tongue Tying for Everyone +## Tongue-Tying for Everyone This document is targeted at readers with a good understanding of blockchains and basic cryptography. With that in mind, we attempt @@ -292,7 +292,7 @@ Recall that a transaction consists of the following: * kernel excess (the public key corresponding to the excess value) * transaction signature signed by the excess value (and verifies with the kernel excess) -(the presentation above did not explicitly include the kernel excess in the transaction, because it can be computed from the inputs and outputs. This paragrpah shows the benefit in including it, for aggregation within block construction.) +(The presentation above did not explicitly include the kernel excess in the transaction, because it can be computed from the inputs and outputs. This paragrpah shows the benefit in including it, for aggregation within block construction.) We can say the following is true for any valid transaction (ignoring fees for simplicity): From 9dcf2809fa1760e04895afb80a15ca8fa3c672f2 Mon Sep 17 00:00:00 2001 From: bayk Date: Mon, 17 Jun 2024 15:53:49 -0700 Subject: [PATCH 54/96] grin v5.3 (0092) Chain Segmenter Validation Test + Block Archive Horizon Change (#3665) --- chain/src/chain.rs | 31 +-- chain/src/txhashset/bitmap_accumulator.rs | 10 + .../header/header_head/pmmr_data.bin | Bin 0 -> 55862 bytes .../header/header_head/pmmr_hash.bin | Bin 0 -> 67296 bytes .../test_data/chain_compacted/lmdb/data.mdb | Bin 0 -> 3256320 bytes .../test_data/chain_compacted/lmdb/lock.mdb | Bin 0 -> 8192 bytes .../txhashset/kernel/pmmr_data.bin | Bin 0 -> 103194 bytes .../txhashset/kernel/pmmr_hash.bin | Bin 0 -> 67232 bytes .../txhashset/kernel/pmmr_size.bin | Bin 0 -> 10530 bytes .../txhashset/output/pmmr_data.bin | Bin 0 -> 35802 bytes .../txhashset/output/pmmr_hash.bin | Bin 0 -> 67232 bytes .../txhashset/output/pmmr_leaf.bin | Bin 0 -> 2122 bytes .../txhashset/output/pmmr_prun.bin | Bin 0 -> 8 bytes .../txhashset/rangeproof/pmmr_data.bin | Bin 0 -> 719199 bytes .../txhashset/rangeproof/pmmr_hash.bin | Bin 0 -> 67232 bytes .../txhashset/rangeproof/pmmr_leaf.bin | Bin 0 -> 2122 bytes .../txhashset/rangeproof/pmmr_prun.bin | Bin 0 -> 8 bytes .../header/header_head/pmmr_data.bin | Bin 0 -> 55862 bytes .../header/header_head/pmmr_hash.bin | Bin 0 -> 67296 bytes chain/tests/test_data/chain_raw/lmdb/data.mdb | Bin 0 -> 3104768 bytes chain/tests/test_data/chain_raw/lmdb/lock.mdb | Bin 0 -> 8192 bytes .../chain_raw/txhashset/kernel/pmmr_data.bin | Bin 0 -> 103194 bytes .../chain_raw/txhashset/kernel/pmmr_hash.bin | Bin 0 -> 67232 bytes .../chain_raw/txhashset/kernel/pmmr_size.bin | Bin 0 -> 10530 bytes .../chain_raw/txhashset/output/pmmr_data.bin | Bin 0 -> 35802 bytes .../chain_raw/txhashset/output/pmmr_hash.bin | Bin 0 -> 67232 bytes .../chain_raw/txhashset/output/pmmr_leaf.bin | Bin 0 -> 2122 bytes .../txhashset/rangeproof/pmmr_data.bin | Bin 0 -> 719199 bytes .../txhashset/rangeproof/pmmr_hash.bin | Bin 0 -> 67232 bytes .../txhashset/rangeproof/pmmr_leaf.bin | Bin 0 -> 2122 bytes chain/tests/test_pibd_validation.rs | 235 ++++++++++++++++++ core/src/core/pmmr/segment.rs | 22 ++ 32 files changed, 280 insertions(+), 18 deletions(-) create mode 100644 chain/tests/test_data/chain_compacted/header/header_head/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_compacted/header/header_head/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_compacted/lmdb/data.mdb create mode 100644 chain/tests/test_data/chain_compacted/lmdb/lock.mdb create mode 100644 chain/tests/test_data/chain_compacted/txhashset/kernel/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/kernel/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/kernel/pmmr_size.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/output/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/output/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/output/pmmr_leaf.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/output/pmmr_prun.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/rangeproof/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/rangeproof/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/rangeproof/pmmr_leaf.bin create mode 100644 chain/tests/test_data/chain_compacted/txhashset/rangeproof/pmmr_prun.bin create mode 100644 chain/tests/test_data/chain_raw/header/header_head/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_raw/header/header_head/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_raw/lmdb/data.mdb create mode 100644 chain/tests/test_data/chain_raw/lmdb/lock.mdb create mode 100644 chain/tests/test_data/chain_raw/txhashset/kernel/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/kernel/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/kernel/pmmr_size.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/output/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/output/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/output/pmmr_leaf.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/rangeproof/pmmr_data.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/rangeproof/pmmr_hash.bin create mode 100644 chain/tests/test_data/chain_raw/txhashset/rangeproof/pmmr_leaf.bin create mode 100644 chain/tests/test_pibd_validation.rs diff --git a/chain/src/chain.rs b/chain/src/chain.rs index bd87591555..cdee10568b 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -18,7 +18,7 @@ use crate::core::core::merkle_proof::MerkleProof; use crate::core::core::{ Block, BlockHeader, BlockSums, Committed, Inputs, KernelFeatures, Output, OutputIdentifier, - SegmentIdentifier, Transaction, TxKernel, + Transaction, TxKernel, }; use crate::core::global; use crate::core::pow; @@ -241,21 +241,6 @@ impl Chain { chain.log_heads()?; - // Temporarily exercising the initialization process. - // Note: This is *really* slow because we are starting from cold. - // - // This is not required as we will lazily initialize our segmenter as required - // once we start receiving PIBD segment requests. - // In reality we will do this based on PIBD segment requests. - // Initialization (once per 12 hour period) will not be this slow once lmdb and PMMRs - // are warmed up. - if let Ok(segmenter) = chain.segmenter() { - let _ = segmenter.kernel_segment(SegmentIdentifier { height: 9, idx: 0 }); - let _ = segmenter.bitmap_segment(SegmentIdentifier { height: 9, idx: 0 }); - let _ = segmenter.output_segment(SegmentIdentifier { height: 11, idx: 0 }); - let _ = segmenter.rangeproof_segment(SegmentIdentifier { height: 7, idx: 0 }); - } - Ok(chain) } @@ -1347,7 +1332,8 @@ impl Chain { return Ok(()); } - let horizon = global::cut_through_horizon() as u64; + let mut horizon = global::cut_through_horizon() as u64; + let head = batch.head()?; let tail = match batch.tail() { @@ -1355,7 +1341,16 @@ impl Chain { Err(_) => Tip::from_header(&self.genesis), }; - let cutoff = head.height.saturating_sub(horizon); + let mut cutoff = head.height.saturating_sub(horizon); + + // TODO: Check this, compaction selects a different horizon + // block from txhashset horizon/PIBD segmenter when using + // Automated testing chain + let archive_header = self.txhashset_archive_header()?; + if archive_header.height < cutoff { + cutoff = archive_header.height; + horizon = head.height - archive_header.height; + } debug!( "remove_historical_blocks: head height: {}, tail height: {}, horizon: {}, cutoff: {}", diff --git a/chain/src/txhashset/bitmap_accumulator.rs b/chain/src/txhashset/bitmap_accumulator.rs index 52da8798b1..fe2aea1846 100644 --- a/chain/src/txhashset/bitmap_accumulator.rs +++ b/chain/src/txhashset/bitmap_accumulator.rs @@ -221,6 +221,16 @@ impl BitmapChunk { pub fn any(&self) -> bool { self.0.any() } + + /// Iterator over the integer set represented by this chunk, applying the given + /// offset to the values + pub fn set_iter(&self, idx_offset: usize) -> impl Iterator + '_ { + self.0 + .iter() + .enumerate() + .filter(|(_, val)| *val) + .map(move |(idx, _)| (idx as u32 + idx_offset as u32)) + } } impl PMMRable for BitmapChunk { diff --git a/chain/tests/test_data/chain_compacted/header/header_head/pmmr_data.bin b/chain/tests/test_data/chain_compacted/header/header_head/pmmr_data.bin new file mode 100644 index 0000000000000000000000000000000000000000..fc4b2f52e373bee83d5e40a143f7cee85063861a GIT binary patch literal 55862 zcmXur2RM~)9|!P
y-os~-eaO^!Z3sLqS*%a9#DvJ)a($_ybKl$lxP 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%0Dbs3 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

r)Ws;yy0YUU#})gyt%kK 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


H5x)bmZhj&tR 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ⅈpQYd1xbWDwr={(0G0=rcQ7+N!kSx; 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 HpmsLZ*%w- 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­J0$6L{gkm?=B3Ml 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∓E|#sDE)AKz#&8YAP>%ix0nj|sy0kVDrB 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஑Kv+H5@4arrBigwX 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�aNrH(hA@(y#+ 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

Q;FVxGl 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

-{OtN$m>d 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

eOSyzXB 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

?TS|;J`bU|3`H9!g^C?hOc+n~b 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
ZR~1T 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

^&4qRVVm+ddR0X)a>wC7W*9 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�G{=)k|n|Ct2AA9KjtcE>N1Hq!t? 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 z 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 lA_d6e;X37yc)l{z{;ny2i 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

90=GeeK^OY^J4mK*-X_!{O<8*pW}f zD}au%eFdFTM##M%z=Hb;E-$_V0v1%#Zd2sM<@4HR2GMv;SV`=YfCpJDhV*df!WDZb z_)0*gb+OPvSHwz1hAqYZf{!QCFWp>#Z(n*D6{RF})0$LyX~3^Gm$$Mj%7o;>2fC_7 zRYsgPJPCM^#TNN``<)+9=dA-3R=M1}4$yL_LjPPekkdv6@ddPo8=w%OmUVld6jKsn z?pMrPgr0I-2m8@1BxM=E)lcg+JNqXA53<;EW^Azeaj8K>8@WDFd6Pykv*D06N{H0g z;a@J!#BV{DbWs$Kx3O}^u+I+p%%xCB< z`@+>_Qs*ZD53<-$u+{iSY`4Z$2=I5T>d6R1oS6wO>B34*VkAN{YhOd_5%1ctbHt#y z(0h0l;9FhosoUOMTXkMmiK9d09z!iY33!mjK4#^`;lmgu*Q1&&)=WwV{Br$X$Q`Fl z5m$G-lWW)?I-`fO_okV75*Iq$mYG70LpT*9NTnsONUA^*8+7N(^^<@{vKodJ(qCxi zp3~WxaA7ElCN6xEP{sPzBX0*9SWLE83eB^il(;22z0TDcYr!Loio(6S;ulN!s#jL4 z-fd=2@W+#YN3zN^wbf=T<06j9>fl-!6>>!f)OJmFKmXKxW|LBs&<5?3oYt$IpcSIo zNSW->eLSMLjq1V4#d7M+hZR4r4$AW+;E^nxA27PF5ykp~mtn>-q)97+rb52oZe?6> zMgVIY5J`bz*0uxoFY|RrNDZEynN0A!Ru0||ihJ|QJK`+23L}~ANx*|Fwobcng7CSF zIRX>74Xl`JngOGvMn26nc9kCslCSfU^RYutplqu#I+tf^Lh~?t3@ZCc^U*&? zUG@O#;%aBrRjJjh~gByHt)R@I=4 zdG)OP6OdF0(Z7Q^+gV3@#FOL-CS^?1}WULg>J>gY$4h!;tD|6V;beRwowh7xBeZ zK=|9AUwm9SobDK7Yhnv0=wXUsrND)178~kFF zj!Vuh`0Y9??^_7}B4&OADOfB4so zxy%12;nztya{4y5txR4k5Uuu%#$4Y&6WhxgeDEuo+mOni$N@l_8DdkavJPlMQv58M zIe$F>A%7yy8T8vTo=Izm);rg&u6VRb_OWl9oi+_@#hJ|;vZJJO3|E-17pFuC`LI)% zp2^KuIw5dCHSzK-LK71}5u@|e^R$Itfqj&~x8T?I_YNx84*U4Rt^i34G`b|t;(DeY zMIdkj?5!JeT}&}I`Bu*KQ0TOPE@ZLX0x;+Z>I>FpwMfk_R|N9g=_Xjvx)-P-KhWHL zb$W9W4g{HO(Bx<2sW;x{VIXpya za_pZgV5;E^iVTe5k1Y^3*33)iU$o&qi_JqH%jv>|w`LnC?B@2lo#SuiKDG@_jgp+h zUAs0{h`{EEldR<6I_Hh2Kz@fybIE>{=T28yv%xRPC!dKe1b={(A}0e@#r^mkZD=j6ThQmB&}80b<)>y2!|-3EMdaVGgW$_1!v$l>O`f*e1jwyujEK( z{^)j4!}^8zXe+lV+$w!!iykt)ZhLNghy~ zb96L}p;`Or6aF3-9cS0nKPiyBho_CqGjTha^G@lC$Tp3aXdEU=JeKJ|fnS$qcV9W5 zTq+)(y3Qui*ipgaB&IQk^k#B6n9h8R;t^HHc$?}$Lc3+;eR@djpmdYyj*w@)p;3

u1Al7QOOUW!sFu1Lw~E|6Ttt7k~rx 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�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

sySuiGKge#GhM0|be?1M94M!3 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 b1Z1&MJcRG7{~01E)ZPFjkNcx*C$Ys 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

YKPR6hCQ=vZ#c%p^j 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