minisketch-rs

minisketch-rs is a wrapper around minisketch, a C library by Pieter Wuille for efficient set reconciliation.

minisketch is proposed as 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.

Example

Cargo.toml: toml [dependencies] minisketch-rs = "0.1"

Example of simple set reconciliation between Alice and Bob: ```rust use minisketch_rs::Minisketch;

// Alice's side let mut sketcha = Minisketch::trynew(12, 0, 4).unwrap();

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()).unwrap();

println!("Message: {}, {:?}", bufa.len(), bufa);

// Bob's side { // Bob's sketch println!("Bob's set:"); let mut sketchb = Minisketch::trynew(12, 0, 4).unwrap(); for i in 3002..3012 { println!("{}", i); sketch_b.add(i); }

// Alice's sketch
let mut sketch_a = Minisketch::try_new(12, 0, 4).unwrap();
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).unwrap();

let mut differences = [0u64; 4];
let num_differences = sketch_b.decode(&mut differences[..]).unwrap();

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