Delete outdated `TODOs` refering to closed issues (#6732)
* ZIPs were updated to remove ambiguity, this was tracked in #1267. * #2105 was fixed by #3039 and #2379 was closed by #3069 * #2230 was a duplicate of #2231 which was closed by #2511 * #3235 was obsoleted by #2156 which was fixed by #3505 * #1850 was fixed by #2944, #1851 was fixed by #2961 and #2902 was fixed by #2969 * We migrated to Rust 2021 edition in Jan 2022 with #3332 * #1631 was closed as not needed * #338 was fixed by #3040 and #1162 was fixed by #3067 * #2079 was fixed by #2445 * #4794 was fixed by #6122 * #1678 stopped being an issue * #3151 was fixed by #3934 * #3204 was closed as not needed * #1213 was fixed by #4586 * #1774 was closed as not needed * #4633 was closed as not needed * Clarify behaviour of difficulty spacing Co-authored-by: teor <teor@riseup.net> * Update comment to reflect implemented behaviour Co-authored-by: teor <teor@riseup.net> * Update comment to reflect implemented behaviour when retrying block downloads Co-authored-by: teor <teor@riseup.net> * Update `TODO` to remove closed issue and clarify when we might want to fix Co-authored-by: teor <teor@riseup.net> * Update `TODO` to remove closed issue and clarify what we might want to change in future Co-authored-by: teor <teor@riseup.net> * Clarify benefits of how we do block verification Co-authored-by: teor <teor@riseup.net> * Fix rustfmt errors --------- Co-authored-by: teor <teor@riseup.net>
This commit is contained in:
parent
f2be848de0
commit
ec2e9ca276
|
|
@ -159,10 +159,6 @@ pub fn sinsemilla_hash(D: &[u8], M: &BitVec<u8, Lsb0>) -> Option<pallas::Base> {
|
||||||
extract_p_bottom(sinsemilla_hash_to_point(D, M))
|
extract_p_bottom(sinsemilla_hash_to_point(D, M))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: test the above correctness and compatibility with the zcash-hackworks test vectors
|
|
||||||
// https://github.com/ZcashFoundation/zebra/issues/2079
|
|
||||||
// https://github.com/zcash-hackworks/zcash-test-vectors/pulls
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -457,7 +457,9 @@ fn check_testnet_minimum_difficulty_block(height: block::Height) -> Result<(), R
|
||||||
.signed_duration_since(previous_block.header.time);
|
.signed_duration_since(previous_block.header.time);
|
||||||
|
|
||||||
// zcashd requires a gap that's strictly greater than 6 times the target
|
// zcashd requires a gap that's strictly greater than 6 times the target
|
||||||
// threshold, but ZIP-205 and ZIP-208 are ambiguous. See bug #1276.
|
// threshold, as documented in ZIP-205 and ZIP-208:
|
||||||
|
// https://zips.z.cash/zip-0205#change-to-difficulty-adjustment-on-testnet
|
||||||
|
// https://zips.z.cash/zip-0208#minimum-difficulty-blocks-on-testnet
|
||||||
match NetworkUpgrade::minimum_difficulty_spacing_for_height(Network::Testnet, height) {
|
match NetworkUpgrade::minimum_difficulty_spacing_for_height(Network::Testnet, height) {
|
||||||
None => Err(eyre!("the minimum difficulty rule is not active"))?,
|
None => Err(eyre!("the minimum difficulty rule is not active"))?,
|
||||||
Some(spacing) if (time_gap <= spacing) => Err(eyre!(
|
Some(spacing) if (time_gap <= spacing) => Err(eyre!(
|
||||||
|
|
|
||||||
|
|
@ -740,10 +740,6 @@ where
|
||||||
orchard_shielded_data,
|
orchard_shielded_data,
|
||||||
&shielded_sighash,
|
&shielded_sighash,
|
||||||
)?))
|
)?))
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// - verify orchard shielded pool (ZIP-224) (#2105)
|
|
||||||
// - shielded input and output limits? (#2379)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Verifies if a V5 `transaction` is supported by `network_upgrade`.
|
/// Verifies if a V5 `transaction` is supported by `network_upgrade`.
|
||||||
|
|
|
||||||
|
|
@ -347,7 +347,6 @@ impl<'de> Deserialize<'de> for Config {
|
||||||
|
|
||||||
let config = DConfig::deserialize(deserializer)?;
|
let config = DConfig::deserialize(deserializer)?;
|
||||||
|
|
||||||
// TODO: perform listener DNS lookups asynchronously with a timeout (#1631)
|
|
||||||
let listen_addr = match config.listen_addr.parse::<SocketAddr>() {
|
let listen_addr = match config.listen_addr.parse::<SocketAddr>() {
|
||||||
Ok(socket) => Ok(socket),
|
Ok(socket) => Ok(socket),
|
||||||
Err(_) => match config.listen_addr.parse::<IpAddr>() {
|
Err(_) => match config.listen_addr.parse::<IpAddr>() {
|
||||||
|
|
|
||||||
|
|
@ -178,8 +178,9 @@ impl Drop for ConnectionTracker {
|
||||||
|
|
||||||
// We ignore disconnected errors, because the receiver can be dropped
|
// We ignore disconnected errors, because the receiver can be dropped
|
||||||
// before some connections are dropped.
|
// before some connections are dropped.
|
||||||
|
// # Security
|
||||||
//
|
//
|
||||||
// TODO: This channel will be bounded by the connection limit (#1850, #1851, #2902).
|
// This channel is actually bounded by the inbound and outbound connection limit.
|
||||||
let _ = self.close_notification_tx.send(ConnectionClosed);
|
let _ = self.close_notification_tx.send(ConnectionClosed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -418,8 +418,6 @@ where
|
||||||
for guard in self.guards.iter() {
|
for guard in self.guards.iter() {
|
||||||
guard.abort();
|
guard.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: implement graceful shutdown for InventoryRegistry (#1678)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check busy peer services for request completion or errors.
|
/// Check busy peer services for request completion or errors.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
//! Fixed test vectors for unready services.
|
//! Fixed test vectors for unready services.
|
||||||
//!
|
|
||||||
//! TODO: test that inner service errors are handled correctly (#3204)
|
|
||||||
|
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,11 @@ impl<Req: Clone + std::fmt::Debug, Res, E: std::fmt::Debug> Policy<Req, Res, E>
|
||||||
// Let other tasks run, so we're more likely to choose a different peer,
|
// Let other tasks run, so we're more likely to choose a different peer,
|
||||||
// and so that any notfound inv entries win the race to the PeerSet.
|
// and so that any notfound inv entries win the race to the PeerSet.
|
||||||
//
|
//
|
||||||
// TODO: move syncer retries into the PeerSet,
|
// # Security
|
||||||
// so we always choose different peers (#3235)
|
//
|
||||||
|
// We want to choose different peers for retries, so we have a better chance of getting each block.
|
||||||
|
// This is implemented by the connection state machine sending synthetic `notfound`s to the
|
||||||
|
// `InventoryRegistry`, as well as forwarding actual `notfound`s from peers.
|
||||||
Box::pin(tokio::task::yield_now().map(move |()| retry_outcome)),
|
Box::pin(tokio::task::yield_now().map(move |()| retry_outcome)),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -184,10 +184,10 @@ impl Codec {
|
||||||
/// Obtain the size of the body of a given message. This will match the
|
/// Obtain the size of the body of a given message. This will match the
|
||||||
/// number of bytes written to the writer provided to `write_body` for the
|
/// number of bytes written to the writer provided to `write_body` for the
|
||||||
/// same message.
|
/// same message.
|
||||||
///
|
// # Performance TODO
|
||||||
/// TODO: Replace with a size estimate, to avoid multiple serializations
|
//
|
||||||
/// for large data structures like lists, blocks, and transactions.
|
// If this code shows up in profiles, replace with a size estimate or cached size,
|
||||||
/// See #1774.
|
// to avoid multiple serializations for large data structures like lists, blocks, and transactions.
|
||||||
fn body_length(&self, msg: &Message) -> usize {
|
fn body_length(&self, msg: &Message) -> usize {
|
||||||
let mut writer = FakeWriter(0);
|
let mut writer = FakeWriter(0);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -401,7 +401,7 @@ impl TryFrom<Message> for VersionMessage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: add tests for Error conversion and Reject message serialization (#4633)
|
// TODO: add tests for Error conversion and Reject message serialization
|
||||||
// (Zebra does not currently send reject messages, and it ignores received reject messages.)
|
// (Zebra does not currently send reject messages, and it ignores received reject messages.)
|
||||||
impl<E> From<E> for Message
|
impl<E> From<E> for Message
|
||||||
where
|
where
|
||||||
|
|
|
||||||
|
|
@ -110,8 +110,7 @@ pub trait GetBlockTemplateRpc {
|
||||||
/// - the parent block is a valid block that Zebra already has, or will receive soon.
|
/// - the parent block is a valid block that Zebra already has, or will receive soon.
|
||||||
///
|
///
|
||||||
/// Zebra verifies blocks in parallel, and keeps recent chains in parallel,
|
/// Zebra verifies blocks in parallel, and keeps recent chains in parallel,
|
||||||
/// so moving between chains is very cheap. (But forking a new chain may take some time,
|
/// so moving between chains and forking chains is very cheap.
|
||||||
/// until bug #4794 is fixed.)
|
|
||||||
///
|
///
|
||||||
/// This rpc method is available only if zebra is built with `--features getblocktemplate-rpcs`.
|
/// This rpc method is available only if zebra is built with `--features getblocktemplate-rpcs`.
|
||||||
#[rpc(name = "getblocktemplate")]
|
#[rpc(name = "getblocktemplate")]
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,7 @@ pub struct Config {
|
||||||
/// When Zebra's state format changes, it creates a new state subdirectory for that version,
|
/// When Zebra's state format changes, it creates a new state subdirectory for that version,
|
||||||
/// and re-syncs from genesis.
|
/// and re-syncs from genesis.
|
||||||
///
|
///
|
||||||
/// Old state versions are [not automatically deleted](https://github.com/ZcashFoundation/zebra/issues/1213).
|
/// It is ok to delete the entire cached state directory.
|
||||||
/// It is ok to manually delete old state versions.
|
|
||||||
///
|
|
||||||
/// It is also ok to delete the entire cached state directory.
|
|
||||||
/// If you do, Zebra will re-sync from genesis next time it is launched.
|
/// If you do, Zebra will re-sync from genesis next time it is launched.
|
||||||
///
|
///
|
||||||
/// The default directory is platform dependent, based on
|
/// The default directory is platform dependent, based on
|
||||||
|
|
|
||||||
|
|
@ -229,7 +229,6 @@ pub fn remaining_transaction_value(
|
||||||
utxos: &HashMap<transparent::OutPoint, transparent::OrderedUtxo>,
|
utxos: &HashMap<transparent::OutPoint, transparent::OrderedUtxo>,
|
||||||
) -> Result<(), ValidateContextError> {
|
) -> Result<(), ValidateContextError> {
|
||||||
for (tx_index_in_block, transaction) in prepared.block.transactions.iter().enumerate() {
|
for (tx_index_in_block, transaction) in prepared.block.transactions.iter().enumerate() {
|
||||||
// TODO: check coinbase transaction remaining value (#338, #1162)
|
|
||||||
if transaction.is_coinbase() {
|
if transaction.is_coinbase() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,6 @@ fn blocks_with_v5_transactions() -> Result<()> {
|
||||||
);
|
);
|
||||||
prop_assert_eq!(Some(height), state.finalized_tip_height());
|
prop_assert_eq!(Some(height), state.finalized_tip_height());
|
||||||
prop_assert_eq!(hash.unwrap(), block.hash);
|
prop_assert_eq!(hash.unwrap(), block.hash);
|
||||||
// TODO: check that the nullifiers were correctly inserted (#2230)
|
|
||||||
height = Height(height.0 + 1);
|
height = Height(height.0 + 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -253,7 +253,6 @@ fn snapshot_block_and_transaction_data(state: &FinalizedState) {
|
||||||
// test the rest of the chain data (value balance).
|
// test the rest of the chain data (value balance).
|
||||||
let history_tree_at_tip = state.history_tree();
|
let history_tree_at_tip = state.history_tree();
|
||||||
|
|
||||||
// TODO: split out block snapshots into their own function (#3151)
|
|
||||||
for query_height in 0..=max_height.0 {
|
for query_height in 0..=max_height.0 {
|
||||||
let query_height = Height(query_height);
|
let query_height = Height(query_height);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue