Range-based Set Reconciliation in Rust. A protocol that allows two parties that have one set each to efficiently get the union of the two sets.
The core idea is that we have fingerprints that can be combined. That means that if I have one fingerprint for the set {A, B}
and one for {C, D}
. I can compute the figerprint for {A, B, C, D} without having to add each item individually. Because of this property, we call the fingerprints Monoid
in this crate. There are different ways to construct a monoid, which all have different consequences. The one in mulhash_xs233
should be secure against censorship attacks, which the others aren't!
It also is important to consider what A
, B
, C
and D
are. We call them Item
s and only place a few constraints on them: Copy
, Debug
and Ord
. In order to use use the protocol you'll also need to implement Peano
, which means you need a zero
function and a function that returns the element after the current one (in the order used by Ord
). Often, they will be the hash of the actual set member.
In order to use the protocol, the items need to be in a tree. The tree lives inside a Node
, which you can add items into. Note that in order to keep the datastructure pure, you have to keep the return value of the insert
function.
You need to wrap the Node
with a RangedNode
. Take a look at the tests how that is done. This is needed because the protocol needs to always know the smallest and largest element of any subtree.
Finally, use the first_message
and respond_to_message
functions in the proto
module to run the protocol. Getting the message to the other party is your business (: