Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
df41a8b
poc
D-Stacks Dec 23, 2025
6adf26b
add stats, fix bugs.
D-Stacks Dec 25, 2025
2bb60d2
Merge branch 'master' of https://github.com/kaspanet/rusty-kaspa into…
D-Stacks Dec 25, 2025
e6bb9ab
handle rounds more consistently. force an outbound connection type wh…
D-Stacks Dec 25, 2025
84985d6
fix round frequency.
D-Stacks Dec 25, 2025
384c3ff
fix outbound handling include Other peers.
D-Stacks Dec 25, 2025
53dcb93
fix round activation, excess trimming, and stat display.
D-Stacks Dec 25, 2025
5dafd50
clean up.
D-Stacks Dec 25, 2025
16e22d1
Merge branch 'master' into perigee
D-Stacks Dec 25, 2025
e2b26af
fix
D-Stacks Dec 25, 2025
236cb56
fix --pergiee-round-frequency flag.
D-Stacks Dec 25, 2025
ccfbb00
fix algo to adopt minimization instead of masking.. removing over-sen…
D-Stacks Dec 26, 2025
da7fe48
tie break beyond p90.. fix assertion error on start up.
D-Stacks Dec 26, 2025
ba5a0f9
fix bug for sync from scratch.
D-Stacks Dec 27, 2025
8228ece
Make perigee sensitive to network conditions, i.e. skip exploitation …
D-Stacks Dec 30, 2025
c9b015c
fmt / clippy.
D-Stacks Dec 30, 2025
7e8df2c
fmt again.
D-Stacks Dec 30, 2025
6cf1430
Merge branch 'master' into perigee
D-Stacks Dec 30, 2025
e0fc2f1
Merge branch 'master' into perigee
D-Stacks Dec 31, 2025
6cf6b18
Merge branch 'master' into perigee
D-Stacks Jan 2, 2026
17348a2
Merge branch 'master' into perigee
D-Stacks Jan 3, 2026
b85e944
spawn tasks, remove unneeded receiver in loop.
D-Stacks Jan 4, 2026
e8c2140
Merge branch 'perigee' of https://github.com/D-Stacks/rusty-kaspa int…
D-Stacks Jan 4, 2026
824f937
Merge branch 'master' into perigee
D-Stacks Jan 5, 2026
54ef021
more clean-up and refractor.
D-Stacks Jan 5, 2026
8c9809e
rename "exploit" to "leverage" (avoid negative connotations).
D-Stacks Jan 5, 2026
1c458b6
rename "exploit" to "leverage" (avoid negative connotations).
D-Stacks Jan 5, 2026
a35599c
keep a tighter on cm and p2p adapter synchronization.
D-Stacks Jan 5, 2026
1b12847
keep a tighter grip on cm and p2p adapter synchronization.
D-Stacks Jan 5, 2026
ce59256
fmt
D-Stacks Jan 5, 2026
ae96cdf
Merge branch 'master' into perigee
D-Stacks Jan 8, 2026
5534952
Merge branch 'master' into perigee
D-Stacks Jan 8, 2026
8f1a70e
some betterments
D-Stacks Jan 9, 2026
f1c2e0d
document with more comments, change leverage algo to be "safer" and m…
D-Stacks Jan 9, 2026
d43b768
document with more comments, change leverage algo to be "safer" and m…
D-Stacks Jan 9, 2026
4ef24f2
fix out of bounds in algo.
D-Stacks Jan 9, 2026
46c814f
fix comment a bit, remove needless sanity check.
D-Stacks Jan 9, 2026
28ffbd7
reword the comment a bit, fix an off by one error.
D-Stacks Jan 9, 2026
9677d85
make info comments easier to read. remove excess info comments.
D-Stacks Jan 9, 2026
305f448
quick fix: wrong cmp.
D-Stacks Jan 9, 2026
5933df7
quick fix again.
D-Stacks Jan 9, 2026
1983833
fix out of bounds again.
D-Stacks Jan 9, 2026
b9209b3
fix out of bounds again.
D-Stacks Jan 9, 2026
ed261f8
fix eviction.
D-Stacks Jan 9, 2026
8625e72
fix retriving by rank in address db.
D-Stacks Jan 10, 2026
9320de9
Merge branch 'master' into perigee
D-Stacks Jan 12, 2026
0409e75
clean-up.
D-Stacks Jan 13, 2026
ab56629
change args to absolute specifications, instead of ratios.. refractor…
D-Stacks Jan 13, 2026
ab82e4f
Merge branch 'master' of https://github.com/kaspanet/rusty-kaspa into…
D-Stacks Jan 13, 2026
40d1cf7
fix log parsing.
D-Stacks Jan 13, 2026
2bbfffc
fix address store.
D-Stacks Jan 13, 2026
f44a02e
fix address store 2.
D-Stacks Jan 13, 2026
5856990
Merge branch 'master' into perigee
D-Stacks Jan 13, 2026
1b2ea04
fix address store 3.
D-Stacks Jan 13, 2026
41a5569
apply proper endianness.
D-Stacks Jan 14, 2026
2db3c1a
Merge branch 'master' into perigee
D-Stacks Jan 14, 2026
c16f8c3
fmt
D-Stacks Jan 14, 2026
62e1adc
rename args to blk perigee (as a future may have tx_perigee as well).
D-Stacks Jan 19, 2026
f69f531
rename args to blk perigee (as a future may have tx_perigee as well).…
D-Stacks Jan 19, 2026
97ecac3
change logs, extract data from peer struct, no longer a need for peri…
D-Stacks Jan 20, 2026
a7ea16f
add main eval test to perigee.
D-Stacks Jan 20, 2026
4fd4cdc
add more tests.
D-Stacks Jan 20, 2026
3ddeee6
add some header comments.
D-Stacks Jan 20, 2026
479169e
add a way to reset the perigee store, and add a test for it.
D-Stacks Jan 20, 2026
479f15a
Merge branch 'master' into perigee
D-Stacks Jan 20, 2026
dfa6371
merge master.
D-Stacks Jan 20, 2026
412829c
merge master.
D-Stacks Jan 20, 2026
5a957c0
Fix formatting for kaspa-perigeemanager dependency
D-Stacks Jan 20, 2026
1703a3a
Merge pull request #13 from D-Stacks/perigee-dev
D-Stacks Jan 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ kaspa-p2p-flows = { version = "1.1.0-rc.2", path = "protocol/flows" }
kaspa-p2p-lib = { version = "1.1.0-rc.2", path = "protocol/p2p" }
kaspa-p2p-mining = { version = "1.1.0-rc.2", path = "protocol/mining" }
kaspa-perf-monitor = { version = "1.1.0-rc.2", path = "metrics/perf_monitor" }
kaspa-perigeemanager = {version = "1.1.0-rc.2", path = "components/perigeemanager" }
kaspa-pow = { version = "1.1.0-rc.2", path = "consensus/pow" }
kaspa-rpc-core = { version = "1.1.0-rc.2", path = "rpc/core" }
kaspa-rpc-macros = { version = "1.1.0-rc.2", path = "rpc/macros" }
Expand Down
93 changes: 77 additions & 16 deletions components/addressmanager/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,12 @@ impl AddressManager {
self.address_store.iterate_addresses()
}

pub fn iterate_prioritized_random_addresses(&self, exceptions: HashSet<NetAddress>) -> impl ExactSizeIterator<Item = NetAddress> {
self.address_store.iterate_prioritized_random_addresses(exceptions)
pub fn iterate_prioritized_random_addresses(
&self,
priorities: Vec<NetAddress>,
exceptions: HashSet<NetAddress>,
) -> impl ExactSizeIterator<Item = NetAddress> {
self.address_store.iterate_prioritized_random_addresses(priorities, exceptions)
}

pub fn ban(&mut self, ip: IpAddress) {
Expand Down Expand Up @@ -325,6 +329,18 @@ impl AddressManager {
pub fn get_all_banned_addresses(&self) -> Vec<IpAddress> {
self.banned_address_store.iterator().map(|x| IpAddress::from(x.unwrap().0)).collect_vec()
}

pub fn set_new_perigee_addresses(&mut self, addresses: Vec<NetAddress>) {
self.address_store.set_new_perigee_addresses(addresses);
}

pub fn get_perigee_addresses(&mut self) -> Vec<NetAddress> {
self.address_store.get_perigee_addresses().unwrap()
}

pub fn reset_perigee_data(&mut self) {
self.address_store.reset_perigee_data();
}
}

mod address_store_with_cache {
Expand All @@ -346,7 +362,7 @@ mod address_store_with_cache {

use crate::{
stores::{
address_store::{AddressesStore, DbAddressesStore, Entry},
address_store::{AddressesStore, AddressesStoreReader, DbAddressesStore, Entry},
AddressKey,
},
NetAddress, MAX_ADDRESSES, MAX_CONNECTION_FAILED_COUNT,
Expand All @@ -369,6 +385,18 @@ mod address_store_with_cache {
Self { db_store, addresses }
}

pub fn set_new_perigee_addresses(&mut self, addresses: Vec<NetAddress>) {
self.db_store.set_new_perigee_addresses(addresses).unwrap();
}

pub fn get_perigee_addresses(&mut self) -> Option<Vec<NetAddress>> {
self.db_store.get_perigee_addresses().ok()
}

pub fn reset_perigee_data(&mut self) {
self.db_store.reset_perigee_data().unwrap();
}

pub fn has(&mut self, address: NetAddress) -> bool {
self.addresses.contains_key(&address.into())
}
Expand Down Expand Up @@ -427,9 +455,11 @@ mod address_store_with_cache {
///```
pub fn iterate_prioritized_random_addresses(
&self,
priorities: Vec<NetAddress>,
exceptions: HashSet<NetAddress>,
) -> impl ExactSizeIterator<Item = NetAddress> {
let exceptions: HashSet<AddressKey> = exceptions.into_iter().map(|addr| addr.into()).collect();
let exceptions: HashSet<AddressKey> =
exceptions.into_iter().chain(priorities.iter().cloned()).map(|addr| addr.into()).collect();
let mut prefix_counter: HashMap<PrefixBucket, usize> = HashMap::new();
let (mut weights, filtered_addresses): (Vec<f64>, Vec<NetAddress>) = self
.addresses
Expand All @@ -447,7 +477,7 @@ mod address_store_with_cache {
*weights.get_mut(i).unwrap() /= *prefix_counter.get(&address.prefix_bucket()).unwrap() as f64;
}

RandomWeightedIterator::new(weights, filtered_addresses)
RandomWeightedIteratorWithPriorities::new(weights, filtered_addresses, priorities)
}

pub fn remove_by_ip(&mut self, ip: IpAddr) {
Expand All @@ -461,30 +491,34 @@ mod address_store_with_cache {
Store::new(db)
}

pub struct RandomWeightedIterator {
pub struct RandomWeightedIteratorWithPriorities {
weighted_index: Option<WeightedIndex<f64>>,
remaining: usize,
addresses: Vec<NetAddress>,
priorities: Vec<NetAddress>,
}

impl RandomWeightedIterator {
pub fn new(weights: Vec<f64>, addresses: Vec<NetAddress>) -> Self {
impl RandomWeightedIteratorWithPriorities {
pub fn new(weights: Vec<f64>, addresses: Vec<NetAddress>, priorities: Vec<NetAddress>) -> Self {
assert_eq!(weights.len(), addresses.len());
let remaining = weights.iter().filter(|&&w| w > 0.0).count();
let remaining = weights.iter().filter(|&&w| w > 0.0).count() + priorities.len();
let weighted_index = match WeightedIndex::new(weights) {
Ok(index) => Some(index),
Err(WeightedError::NoItem) => None,
Err(e) => panic!("{e}"),
};
Self { weighted_index, remaining, addresses }
Self { weighted_index, remaining, addresses, priorities: priorities.into_iter().rev().collect() }
}
}

impl Iterator for RandomWeightedIterator {
impl Iterator for RandomWeightedIteratorWithPriorities {
type Item = NetAddress;

fn next(&mut self) -> Option<Self::Item> {
if let Some(weighted_index) = self.weighted_index.as_mut() {
if !self.priorities.is_empty() {
self.remaining -= 1;
Some(self.priorities.pop().unwrap())
} else if let Some(weighted_index) = self.weighted_index.as_mut() {
let i = weighted_index.sample(&mut rand::thread_rng());
// Zero the selected address entry
match weighted_index.update_weights(&[(i, &0f64)]) {
Expand All @@ -507,7 +541,7 @@ mod address_store_with_cache {
}
}

impl ExactSizeIterator for RandomWeightedIterator {}
impl ExactSizeIterator for RandomWeightedIteratorWithPriorities {}

#[cfg(test)]
mod tests {
Expand All @@ -526,11 +560,11 @@ mod address_store_with_cache {
#[test]
fn test_weighted_iterator() {
let address = NetAddress::new(IpAddr::V6(Ipv6Addr::LOCALHOST).into(), 1);
let iter = RandomWeightedIterator::new(vec![0.2, 0.3, 0.0], vec![address, address, address]);
let iter = RandomWeightedIteratorWithPriorities::new(vec![0.2, 0.3, 0.0], vec![address, address, address], vec![]);
assert_eq!(iter.len(), 2);
assert_eq!(iter.count(), 2);

let iter = RandomWeightedIterator::new(vec![], vec![]);
let iter = RandomWeightedIteratorWithPriorities::new(vec![], vec![], vec![]);
assert_eq!(iter.len(), 0);
assert_eq!(iter.count(), 0);
}
Expand Down Expand Up @@ -603,7 +637,7 @@ mod address_store_with_cache {
// The weight sampled expected uniform distribution
let prioritized_address_distribution = am
.lock()
.iterate_prioritized_random_addresses(HashSet::new())
.iterate_prioritized_random_addresses(vec![], HashSet::new())
.take(num_of_buckets)
.map(|addr| addr.prefix_bucket().as_u64() as f64)
.collect_vec();
Expand All @@ -624,5 +658,32 @@ mod address_store_with_cache {
);
assert!(adjusted_p <= significance);
}

#[test]
fn test_perigee_data() {
let db = create_temp_db!(ConnBuilder::default().with_files_limit(10));
let config = Config::new(SIMNET_PARAMS);
let (am, _) = AddressManager::new(Arc::new(config), db.1, Arc::new(TickService::default()));

let mut am_guard = am.lock();

let perigee_addresses: Vec<NetAddress> = (0..10)
.map(|i| {
NetAddress::new(
IpAddress::from_str(&format!("{}.{}.{}.{}", i, i, i, i)).unwrap(),
SIMNET_PARAMS.default_p2p_port(),
)
})
.collect();
am_guard.set_new_perigee_addresses(perigee_addresses.clone());

let fetched_perigee_addresses = am_guard.get_perigee_addresses();
assert_eq!(fetched_perigee_addresses, perigee_addresses);

am_guard.reset_perigee_data();

let fetched_perigee_addresses_after_reset = am_guard.get_perigee_addresses();
assert!(fetched_perigee_addresses_after_reset.is_empty());
}
}
}
Loading