minisketch-rs
is a wrapper around minisketch,
a C library by Pieter Wuille for efficient set reconciliation.
minisketch is proposed as a part of an Erlay technique for bandwidth-efficient TX propagation in Bitcoin.
This library exposes type-safe Rust bindings for all minisketch
functions by providing Minisketch
structure.
Cargo.toml:
toml
[dependencies]
minisketch-rs = "0.1"
Example of simple set reconciliation between Alice and Bob: ```rust // Alice's side let mut sketcha = Minisketch::trynew(12, 0, 4)?;
println!("Alice's set:"); for i in 3000..3010 { println!("{}", i); sketch_a.add(i); }
let sersize = sketcha.serializedsize(); assert_eq!(sersize, 12 * 4 / 8);
// Serialize message for Bob let mut bufa = vec![0u8; sersize]; sketcha.serialize(bufa.asmut_slice())?;
println!("Message: {}, {:?}", bufa.len(), bufa);
// Bob's side { // Bob's sketch println!("Bob's set:"); let mut sketchb = Minisketch::trynew(12, 0, 4)?; for i in 3002..3012 { println!("{}", i); sketch_b.add(i); }
// Alice's sketch
let mut sketch_a = Minisketch::try_new(12, 0, 4)?;
sketch_a.deserialize(&buf_a); // Load Alice's sketch
// Merge the elements from sketch_a into sketch_b. The result is a sketch_b
// which contains all elements that occurred in Alice's or Bob's sets, but not
// in both.
sketch_b.merge(&sketch_a)?;
let mut differences = [0u64; 4];
let num_differences = sketch_b.decode(&mut differences[..])?;
println!("Differences between Alice and Bob: {}", num_differences);
assert!(num_differences > 0);
// Sort differences since they may come in arbitrary order from minisketch_decode()
let mut differences = Vec::from(&differences[..]);
differences.sort();
for (i, diff) in differences.iter().enumerate() {
println!("Difference #{}: {}", (i + 1), diff);
}
assert_eq!(differences[0], 3_000);
assert_eq!(differences[1], 3_001);
assert_eq!(differences[2], 3_010);
assert_eq!(differences[3], 3_011);
} ```
Code snippet above will print:
Alice's set:
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
Message: 6, [1, 224, 210, 249, 116, 105]
Bob's set:
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
Differences between Alice and Bob: 4
Difference #1: 3000
Difference #2: 3001
Difference #3: 3010
Difference #4: 3011