Skip to content

Commit 8fe4663

Browse files
Create TN11 KIP10 HF activation and KIP9 beta switch (#595)
* Create TN11 KIP10 HF activation and KIP9 beta switch * kip9 alpha to beta hf: final fixes for adjusting bbt txs if needed * Update target TN11 HF date * Also activate payload on same TN11 HF date * Param adjustments and HF delay * Version bump to 0.15.4 * Doc cleanup * Write new disqualified status and increase counter only if needed (previous code rewrites and counts repeatedly if this chain forward path is revisited) * Revert "kip9 alpha to beta hf: final fixes for adjusting bbt txs if needed" This reverts commit dcc0c15. * Remove KIP9 Alpha version references * storage mass tests can all be preserved --------- Co-authored-by: Michael Sutton <msutton@cs.huji.ac.il>
1 parent 233552b commit 8fe4663

File tree

17 files changed

+164
-232
lines changed

17 files changed

+164
-232
lines changed

Cargo.lock

+58-58
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+56-56
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ members = [
6363

6464
[workspace.package]
6565
rust-version = "1.82.0"
66-
version = "0.15.3"
66+
version = "0.15.4"
6767
authors = ["Kaspa developers"]
6868
license = "ISC"
6969
repository = "https://github.com/kaspanet/rusty-kaspa"
@@ -80,61 +80,61 @@ include = [
8080
]
8181

8282
[workspace.dependencies]
83-
# kaspa-testing-integration = { version = "0.15.3", path = "testing/integration" }
84-
kaspa-addresses = { version = "0.15.3", path = "crypto/addresses" }
85-
kaspa-addressmanager = { version = "0.15.3", path = "components/addressmanager" }
86-
kaspa-bip32 = { version = "0.15.3", path = "wallet/bip32" }
87-
kaspa-cli = { version = "0.15.3", path = "cli" }
88-
kaspa-connectionmanager = { version = "0.15.3", path = "components/connectionmanager" }
89-
kaspa-consensus = { version = "0.15.3", path = "consensus" }
90-
kaspa-consensus-core = { version = "0.15.3", path = "consensus/core" }
91-
kaspa-consensus-client = { version = "0.15.3", path = "consensus/client" }
92-
kaspa-consensus-notify = { version = "0.15.3", path = "consensus/notify" }
93-
kaspa-consensus-wasm = { version = "0.15.3", path = "consensus/wasm" }
94-
kaspa-consensusmanager = { version = "0.15.3", path = "components/consensusmanager" }
95-
kaspa-core = { version = "0.15.3", path = "core" }
96-
kaspa-daemon = { version = "0.15.3", path = "daemon" }
97-
kaspa-database = { version = "0.15.3", path = "database" }
98-
kaspa-grpc-client = { version = "0.15.3", path = "rpc/grpc/client" }
99-
kaspa-grpc-core = { version = "0.15.3", path = "rpc/grpc/core" }
100-
kaspa-grpc-server = { version = "0.15.3", path = "rpc/grpc/server" }
101-
kaspa-hashes = { version = "0.15.3", path = "crypto/hashes" }
102-
kaspa-index-core = { version = "0.15.3", path = "indexes/core" }
103-
kaspa-index-processor = { version = "0.15.3", path = "indexes/processor" }
104-
kaspa-math = { version = "0.15.3", path = "math" }
105-
kaspa-merkle = { version = "0.15.3", path = "crypto/merkle" }
106-
kaspa-metrics-core = { version = "0.15.3", path = "metrics/core" }
107-
kaspa-mining = { version = "0.15.3", path = "mining" }
108-
kaspa-mining-errors = { version = "0.15.3", path = "mining/errors" }
109-
kaspa-muhash = { version = "0.15.3", path = "crypto/muhash" }
110-
kaspa-notify = { version = "0.15.3", path = "notify" }
111-
kaspa-p2p-flows = { version = "0.15.3", path = "protocol/flows" }
112-
kaspa-p2p-lib = { version = "0.15.3", path = "protocol/p2p" }
113-
kaspa-perf-monitor = { version = "0.15.3", path = "metrics/perf_monitor" }
114-
kaspa-pow = { version = "0.15.3", path = "consensus/pow" }
115-
kaspa-rpc-core = { version = "0.15.3", path = "rpc/core" }
116-
kaspa-rpc-macros = { version = "0.15.3", path = "rpc/macros" }
117-
kaspa-rpc-service = { version = "0.15.3", path = "rpc/service" }
118-
kaspa-txscript = { version = "0.15.3", path = "crypto/txscript" }
119-
kaspa-txscript-errors = { version = "0.15.3", path = "crypto/txscript/errors" }
120-
kaspa-utils = { version = "0.15.3", path = "utils" }
121-
kaspa-utils-tower = { version = "0.15.3", path = "utils/tower" }
122-
kaspa-utxoindex = { version = "0.15.3", path = "indexes/utxoindex" }
123-
kaspa-wallet = { version = "0.15.3", path = "wallet/native" }
124-
kaspa-wallet-cli-wasm = { version = "0.15.3", path = "wallet/wasm" }
125-
kaspa-wallet-keys = { version = "0.15.3", path = "wallet/keys" }
126-
kaspa-wallet-pskt = { version = "0.15.3", path = "wallet/pskt" }
127-
kaspa-wallet-core = { version = "0.15.3", path = "wallet/core" }
128-
kaspa-wallet-macros = { version = "0.15.3", path = "wallet/macros" }
129-
kaspa-wasm = { version = "0.15.3", path = "wasm" }
130-
kaspa-wasm-core = { version = "0.15.3", path = "wasm/core" }
131-
kaspa-wrpc-client = { version = "0.15.3", path = "rpc/wrpc/client" }
132-
kaspa-wrpc-proxy = { version = "0.15.3", path = "rpc/wrpc/proxy" }
133-
kaspa-wrpc-server = { version = "0.15.3", path = "rpc/wrpc/server" }
134-
kaspa-wrpc-wasm = { version = "0.15.3", path = "rpc/wrpc/wasm" }
135-
kaspa-wrpc-example-subscriber = { version = "0.15.3", path = "rpc/wrpc/examples/subscriber" }
136-
kaspad = { version = "0.15.3", path = "kaspad" }
137-
kaspa-alloc = { version = "0.15.3", path = "utils/alloc" }
83+
# kaspa-testing-integration = { version = "0.15.4", path = "testing/integration" }
84+
kaspa-addresses = { version = "0.15.4", path = "crypto/addresses" }
85+
kaspa-addressmanager = { version = "0.15.4", path = "components/addressmanager" }
86+
kaspa-bip32 = { version = "0.15.4", path = "wallet/bip32" }
87+
kaspa-cli = { version = "0.15.4", path = "cli" }
88+
kaspa-connectionmanager = { version = "0.15.4", path = "components/connectionmanager" }
89+
kaspa-consensus = { version = "0.15.4", path = "consensus" }
90+
kaspa-consensus-core = { version = "0.15.4", path = "consensus/core" }
91+
kaspa-consensus-client = { version = "0.15.4", path = "consensus/client" }
92+
kaspa-consensus-notify = { version = "0.15.4", path = "consensus/notify" }
93+
kaspa-consensus-wasm = { version = "0.15.4", path = "consensus/wasm" }
94+
kaspa-consensusmanager = { version = "0.15.4", path = "components/consensusmanager" }
95+
kaspa-core = { version = "0.15.4", path = "core" }
96+
kaspa-daemon = { version = "0.15.4", path = "daemon" }
97+
kaspa-database = { version = "0.15.4", path = "database" }
98+
kaspa-grpc-client = { version = "0.15.4", path = "rpc/grpc/client" }
99+
kaspa-grpc-core = { version = "0.15.4", path = "rpc/grpc/core" }
100+
kaspa-grpc-server = { version = "0.15.4", path = "rpc/grpc/server" }
101+
kaspa-hashes = { version = "0.15.4", path = "crypto/hashes" }
102+
kaspa-index-core = { version = "0.15.4", path = "indexes/core" }
103+
kaspa-index-processor = { version = "0.15.4", path = "indexes/processor" }
104+
kaspa-math = { version = "0.15.4", path = "math" }
105+
kaspa-merkle = { version = "0.15.4", path = "crypto/merkle" }
106+
kaspa-metrics-core = { version = "0.15.4", path = "metrics/core" }
107+
kaspa-mining = { version = "0.15.4", path = "mining" }
108+
kaspa-mining-errors = { version = "0.15.4", path = "mining/errors" }
109+
kaspa-muhash = { version = "0.15.4", path = "crypto/muhash" }
110+
kaspa-notify = { version = "0.15.4", path = "notify" }
111+
kaspa-p2p-flows = { version = "0.15.4", path = "protocol/flows" }
112+
kaspa-p2p-lib = { version = "0.15.4", path = "protocol/p2p" }
113+
kaspa-perf-monitor = { version = "0.15.4", path = "metrics/perf_monitor" }
114+
kaspa-pow = { version = "0.15.4", path = "consensus/pow" }
115+
kaspa-rpc-core = { version = "0.15.4", path = "rpc/core" }
116+
kaspa-rpc-macros = { version = "0.15.4", path = "rpc/macros" }
117+
kaspa-rpc-service = { version = "0.15.4", path = "rpc/service" }
118+
kaspa-txscript = { version = "0.15.4", path = "crypto/txscript" }
119+
kaspa-txscript-errors = { version = "0.15.4", path = "crypto/txscript/errors" }
120+
kaspa-utils = { version = "0.15.4", path = "utils" }
121+
kaspa-utils-tower = { version = "0.15.4", path = "utils/tower" }
122+
kaspa-utxoindex = { version = "0.15.4", path = "indexes/utxoindex" }
123+
kaspa-wallet = { version = "0.15.4", path = "wallet/native" }
124+
kaspa-wallet-cli-wasm = { version = "0.15.4", path = "wallet/wasm" }
125+
kaspa-wallet-keys = { version = "0.15.4", path = "wallet/keys" }
126+
kaspa-wallet-pskt = { version = "0.15.4", path = "wallet/pskt" }
127+
kaspa-wallet-core = { version = "0.15.4", path = "wallet/core" }
128+
kaspa-wallet-macros = { version = "0.15.4", path = "wallet/macros" }
129+
kaspa-wasm = { version = "0.15.4", path = "wasm" }
130+
kaspa-wasm-core = { version = "0.15.4", path = "wasm/core" }
131+
kaspa-wrpc-client = { version = "0.15.4", path = "rpc/wrpc/client" }
132+
kaspa-wrpc-proxy = { version = "0.15.4", path = "rpc/wrpc/proxy" }
133+
kaspa-wrpc-server = { version = "0.15.4", path = "rpc/wrpc/server" }
134+
kaspa-wrpc-wasm = { version = "0.15.4", path = "rpc/wrpc/wasm" }
135+
kaspa-wrpc-example-subscriber = { version = "0.15.4", path = "rpc/wrpc/examples/subscriber" }
136+
kaspad = { version = "0.15.4", path = "kaspad" }
137+
kaspa-alloc = { version = "0.15.4", path = "utils/alloc" }
138138

139139
# external
140140
aes = "0.8.3"

consensus/core/src/config/constants.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ pub mod perf {
116116

117117
/// The default slack interval used by the reachability
118118
/// algorithm to encounter for blocks out of the selected chain.
119-
pub const DEFAULT_REINDEX_SLACK: u64 = 1 << 12;
119+
pub const DEFAULT_REINDEX_SLACK: u64 = 1 << 14;
120120

121121
const BASELINE_HEADER_DATA_CACHE_SIZE: usize = 10_000;
122122
const BASELINE_BLOCK_DATA_CACHE_SIZE: usize = 200;

consensus/core/src/config/params.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -533,12 +533,12 @@ pub const TESTNET11_PARAMS: Params = Params {
533533

534534
storage_mass_parameter: STORAGE_MASS_PARAMETER,
535535
storage_mass_activation: ForkActivation::always(),
536-
kip10_activation: ForkActivation::never(),
536+
// Roughly at Dec 3, 2024 1800 UTC
537+
kip10_activation: ForkActivation::new(287238000),
538+
payload_activation: ForkActivation::new(287238000),
537539

538540
skip_proof_of_work: false,
539541
max_block_level: 250,
540-
541-
payload_activation: ForkActivation::never(),
542542
};
543543

544544
pub const SIMNET_PARAMS: Params = Params {

consensus/core/src/mass/mod.rs

+16-53
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,6 @@ use crate::{
55
};
66
use kaspa_hashes::HASH_SIZE;
77

8-
/// Temp enum for the transition phases of KIP9
9-
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
10-
pub enum Kip9Version {
11-
/// Initial KIP9 mass calculation, w/o the relaxed formula and summing storage mass and compute mass
12-
Alpha,
13-
14-
/// Currently proposed KIP9 mass calculation, with the relaxed formula (for the cases `|O| = 1 OR |O| <= |I| <= 2`),
15-
/// and using a maximum operator over storage and compute mass
16-
Beta,
17-
}
18-
198
// transaction_estimated_serialized_size is the estimated size of a transaction in some
209
// serialization. This has to be deterministic, but not necessarily accurate, since
2110
// it's only used as the size component in the transaction and block mass limit
@@ -121,32 +110,18 @@ impl MassCalculator {
121110
/// 2. At least one input (unless coinbase)
122111
///
123112
/// Otherwise this function should never fail.
124-
pub fn calc_tx_storage_mass(&self, tx: &impl VerifiableTransaction, version: Kip9Version) -> Option<u64> {
113+
pub fn calc_tx_storage_mass(&self, tx: &impl VerifiableTransaction) -> Option<u64> {
125114
calc_storage_mass(
126115
tx.is_coinbase(),
127116
tx.populated_inputs().map(|(_, entry)| entry.amount),
128117
tx.outputs().iter().map(|out| out.value),
129-
version,
130118
self.storage_mass_parameter,
131119
)
132120
}
133121

134122
/// Calculates the overall mass of this transaction, combining both compute and storage masses.
135-
/// The combination strategy depends on the version passed.
136-
pub fn calc_tx_overall_mass(
137-
&self,
138-
tx: &impl VerifiableTransaction,
139-
cached_compute_mass: Option<u64>,
140-
version: Kip9Version,
141-
) -> Option<u64> {
142-
match version {
143-
Kip9Version::Alpha => self
144-
.calc_tx_storage_mass(tx, version)
145-
.and_then(|mass| mass.checked_add(cached_compute_mass.unwrap_or_else(|| self.calc_tx_compute_mass(tx.tx())))),
146-
Kip9Version::Beta => self
147-
.calc_tx_storage_mass(tx, version)
148-
.map(|mass| mass.max(cached_compute_mass.unwrap_or_else(|| self.calc_tx_compute_mass(tx.tx())))),
149-
}
123+
pub fn calc_tx_overall_mass(&self, tx: &impl VerifiableTransaction, cached_compute_mass: Option<u64>) -> Option<u64> {
124+
self.calc_tx_storage_mass(tx).map(|mass| mass.max(cached_compute_mass.unwrap_or_else(|| self.calc_tx_compute_mass(tx.tx()))))
150125
}
151126
}
152127

@@ -160,7 +135,6 @@ pub fn calc_storage_mass(
160135
is_coinbase: bool,
161136
input_values: impl ExactSizeIterator<Item = u64>,
162137
output_values: impl ExactSizeIterator<Item = u64>,
163-
version: Kip9Version,
164138
storage_mass_parameter: u64,
165139
) -> Option<u64> {
166140
if is_coinbase {
@@ -199,7 +173,7 @@ pub fn calc_storage_mass(
199173
Note: in the case |I| = 1 both formulas are equal, yet the following code (harmonic_ins) is a bit more efficient.
200174
Hence, we transform the condition to |O| = 1 OR |I| = 1 OR |O| = |I| = 2 which is equivalent (and faster).
201175
*/
202-
if version == Kip9Version::Beta && (outs_len == 1 || ins_len == 1 || (outs_len == 2 && ins_len == 2)) {
176+
if outs_len == 1 || ins_len == 1 || (outs_len == 2 && ins_len == 2) {
203177
let harmonic_ins =
204178
input_values.map(|value| storage_mass_parameter / value).fold(0u64, |total, current| total.saturating_add(current)); // C·|I|/H(I)
205179
return Some(harmonic_outs.saturating_sub(harmonic_ins)); // max( 0 , C·( |O|/H(O) - |I|/H(I) ) );
@@ -230,70 +204,59 @@ mod tests {
230204
fn test_mass_storage() {
231205
// Tx with less outs than ins
232206
let mut tx = generate_tx_from_amounts(&[100, 200, 300], &[300, 300]);
233-
let test_version = Kip9Version::Alpha;
234207

208+
//
235209
// Assert the formula: max( 0 , C·( |O|/H(O) - |I|/A(I) ) )
210+
//
236211

237-
let storage_mass =
238-
MassCalculator::new(0, 0, 0, 10u64.pow(12)).calc_tx_storage_mass(&tx.as_verifiable(), test_version).unwrap();
212+
let storage_mass = MassCalculator::new(0, 0, 0, 10u64.pow(12)).calc_tx_storage_mass(&tx.as_verifiable()).unwrap();
239213
assert_eq!(storage_mass, 0); // Compounds from 3 to 2, with symmetric outputs and no fee, should be zero
240214

241215
// Create asymmetry
242216
tx.tx.outputs[0].value = 50;
243217
tx.tx.outputs[1].value = 550;
244218
let storage_mass_parameter = 10u64.pow(12);
245-
let storage_mass =
246-
MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable(), test_version).unwrap();
219+
let storage_mass = MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable()).unwrap();
247220
assert_eq!(storage_mass, storage_mass_parameter / 50 + storage_mass_parameter / 550 - 3 * (storage_mass_parameter / 200));
248221

249222
// Create a tx with more outs than ins
250223
let base_value = 10_000 * SOMPI_PER_KASPA;
251224
let mut tx = generate_tx_from_amounts(&[base_value, base_value, base_value * 2], &[base_value; 4]);
252225
let storage_mass_parameter = STORAGE_MASS_PARAMETER;
253-
let storage_mass =
254-
MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable(), test_version).unwrap();
226+
let storage_mass = MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable()).unwrap();
255227
assert_eq!(storage_mass, 4); // Inputs are above C so they don't contribute negative mass, 4 outputs exactly equal C each charge 1
256228

257229
let mut tx2 = tx.clone();
258230
tx2.tx.outputs[0].value = 10 * SOMPI_PER_KASPA;
259-
let storage_mass =
260-
MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx2.as_verifiable(), test_version).unwrap();
231+
let storage_mass = MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx2.as_verifiable()).unwrap();
261232
assert_eq!(storage_mass, 1003);
262233

263234
// Increase values over the lim
264235
for out in tx.tx.outputs.iter_mut() {
265236
out.value += 1
266237
}
267238
tx.entries[0].as_mut().unwrap().amount += tx.tx.outputs.len() as u64;
268-
let storage_mass =
269-
MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable(), test_version).unwrap();
239+
let storage_mass = MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable()).unwrap();
270240
assert_eq!(storage_mass, 0);
271-
}
272241

273-
#[test]
274-
fn test_mass_storage_beta() {
275-
// 2:2 transaction
242+
// Now create 2:2 transaction
243+
// Assert the formula: max( 0 , C·( |O|/H(O) - |I|/H(I) ) )
276244
let mut tx = generate_tx_from_amounts(&[100, 200], &[50, 250]);
277245
let storage_mass_parameter = 10u64.pow(12);
278-
let test_version = Kip9Version::Beta;
279-
// Assert the formula: max( 0 , C·( |O|/H(O) - |I|/O(I) ) )
280246

281-
let storage_mass =
282-
MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable(), test_version).unwrap();
247+
let storage_mass = MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable()).unwrap();
283248
assert_eq!(storage_mass, 9000000000);
284249

285250
// Set outputs to be equal to inputs
286251
tx.tx.outputs[0].value = 100;
287252
tx.tx.outputs[1].value = 200;
288-
let storage_mass =
289-
MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable(), test_version).unwrap();
253+
let storage_mass = MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable()).unwrap();
290254
assert_eq!(storage_mass, 0);
291255

292256
// Remove an output and make sure the other is small enough to make storage mass greater than zero
293257
tx.tx.outputs.pop();
294258
tx.tx.outputs[0].value = 50;
295-
let storage_mass =
296-
MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable(), test_version).unwrap();
259+
let storage_mass = MassCalculator::new(0, 0, 0, storage_mass_parameter).calc_tx_storage_mass(&tx.as_verifiable()).unwrap();
297260
assert_eq!(storage_mass, 5000000000);
298261
}
299262

consensus/src/consensus/storage.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ impl ConsensusStorage {
8888
// Budgets in bytes. All byte budgets overall sum up to ~1GB of memory (which obviously takes more low level alloc space)
8989
let daa_excluded_budget = scaled(30_000_000);
9090
let statuses_budget = scaled(30_000_000);
91-
let reachability_data_budget = scaled(20_000_000);
92-
let reachability_sets_budget = scaled(20_000_000); // x 2 for tree children and future covering set
91+
let reachability_data_budget = scaled(100_000_000);
92+
let reachability_sets_budget = scaled(100_000_000); // x 2 for tree children and future covering set
9393
let ghostdag_compact_budget = scaled(15_000_000);
9494
let headers_compact_budget = scaled(5_000_000);
95-
let parents_budget = scaled(40_000_000); // x 3 for reachability and levels
96-
let children_budget = scaled(5_000_000); // x 3 for reachability and levels
95+
let parents_budget = scaled(80_000_000); // x 3 for reachability and levels
96+
let children_budget = scaled(20_000_000); // x 3 for reachability and levels
9797
let ghostdag_budget = scaled(80_000_000); // x 2 for levels
9898
let headers_budget = scaled(80_000_000);
9999
let transactions_budget = scaled(40_000_000);

consensus/src/model/services/reachability.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@ pub trait ReachabilityService {
1313
/// Note that we use the graph theory convention here which defines that a block is also an ancestor of itself.
1414
fn is_chain_ancestor_of(&self, this: Hash, queried: Hash) -> bool;
1515

16-
/// Result version of [`is_dag_ancestor_of`] (avoids unwrapping internally)
16+
/// Result version of [`Self::is_dag_ancestor_of`] (avoids unwrapping internally)
1717
fn is_dag_ancestor_of_result(&self, this: Hash, queried: Hash) -> Result<bool>;
1818

1919
/// Returns true if `this` is a DAG ancestor of `queried` (i.e., `queried ∈ future(this) ∪ {this}`).
2020
/// Note: this method will return true if `this == queried`.
2121
/// The complexity of this method is `O(log(|future_covering_set(this)|))`
2222
fn is_dag_ancestor_of(&self, this: Hash, queried: Hash) -> bool;
2323

24-
/// Checks if `this` is DAG ancestor of any of the blocks in `queried`. See [`is_dag_ancestor_of`] as well.
24+
/// Checks if `this` is DAG ancestor of any of the blocks in `queried`. See [`Self::is_dag_ancestor_of`] as well.
2525
fn is_dag_ancestor_of_any(&self, this: Hash, queried: &mut impl Iterator<Item = Hash>) -> bool;
2626

27-
/// Checks if any of the blocks in `list` is DAG ancestor of `queried`. See [`is_dag_ancestor_of`] as well.
27+
/// Checks if any of the blocks in `list` is DAG ancestor of `queried`. See [`Self::is_dag_ancestor_of`] as well.
2828
fn is_any_dag_ancestor(&self, list: &mut impl Iterator<Item = Hash>, queried: Hash) -> bool;
2929

30-
/// Result version of [`is_any_dag_ancestor`] (avoids unwrapping internally)
30+
/// Result version of [`Self::is_any_dag_ancestor`] (avoids unwrapping internally)
3131
fn is_any_dag_ancestor_result(&self, list: &mut impl Iterator<Item = Hash>, queried: Hash) -> Result<bool>;
3232

3333
/// Finds the tree child of `ancestor` which is also a chain ancestor of `descendant`.

0 commit comments

Comments
 (0)