On 10/03/15 15:13, Natanael wrote:
>
> Den 10 mar 2015 14:52 skrev "Ximin Luo" <[email protected]
> <mailto:[email protected]>>:
>>
>> On 10/03/15 14:42, Natanael wrote:
>> >
>> > Den 10 mar 2015 09:49 skrev "Ximin Luo" <[email protected]
>> > <mailto:[email protected]> <mailto:[email protected]
>> > <mailto:[email protected]>>>:
>> >> Has there been any research on merging when only *partial* history is
>> >> available, even when different users have different subsets of the
>> >> history?
>> >
>> > See IBLT (Invertible Bloom filter Lookup Tables), being implemented for
>> > communicating between Bitcoin nodes. The basic idea - if you know that all
>> > pending transactions you hold are valid, you don't need to verify them
>> > again OR receive them when a block including them is created.
>> >
>> > So to save bandwidth, you need to compare your set of transactions with
>> > that of the node you get the block from. And all you need is data the size
>> > of the diff between your and their transaction set.
>> >
>> > So one IBLT blob equal to or greater in size than the difference between
>> > your locally known transactions and those that are new in the block allows
>> > you to reconstruct the block.
>> >
>> > This is probably the most bandwidth efficient set merging algorithm
>> > possible (you probably have a magic compression algorithm if you can do
>> > better).
>> >
>> > If you can accurately estimate how large the difference will be between
>> > the sets held by two nodes, you can create an IBLT blob that allows the
>> > other node to reconstruct what you have that they miss.
>> >
>>
>> Ah, I should have been more clear - in Bitcoin, git, CT, and pretty much any
>> other system I can think of that has strong ordering, all events are
>> authorised to be seen by everyone. So I guess that even with IBLT, you still
>> need to have seen the old history in the past, even if you don't need to
>> store it. Other designs for bitcoin clients delegate the storing of old
>> history to trusted 3rd parties, and then you (the client) lose some
>> confidence in the security (freshness, consistency, authenticity) of the
>> head of the chain.
>>
>> However, with a private group chat, incoming new members are *not allowed*
>> to see old history. Yet we would still like them to be able to authenticate
>> *for themselves, without trusting anyone else* that merges are carried out
>> correctly, and be able to do merges themselves correctly.
>>
>> Ximin
>
> Merge *what*? I think the biggest problem here is definitions.
>
Merge the unordered set of members.
In the following diagrams, the node labels (e.g. "bd") represent the set of
members ("b", "d") at a given message/node/event. Someone wants to merge the
blue nodes, which are the same message in both diagrams. Black edges are
1-parent messages, grey edges represent merge messages that don't include a
further membership operation. (If it is unrealistic to imagine membership
operations taking only one event to complete, then instead imagine extra
messages in between the nodes.)
>From b's point of view, they have full visibility of the history, and can
>execute the merge as normal:
https://people.torproject.org/~infinity0/res/mcrypt/partial-vis-1.png [1]
But when d executes the merge, they have an incomplete view of history, giving
a different result:
https://people.torproject.org/~infinity0/res/mcrypt/partial-vis-0.png [0]
The problem is to resolve this difference, somehow. I suspect it's impossible
in the general case; the "solution" I had been playing with is (roughly) to
detect "impossible" conditions and wait until it is possible.
I agree with the rest of what you said, and have implemented it in a prototype.
X
[1] partial-vis-1.dot
rankdir=BT;
node [style="filled"];
O [label="b"];
A [label="abc"];
A1 [label="ab"];
A2 [label="bc"];
B [label="bd"];
C [label="abd",fillcolor="#6666ff"];
D [label="bcd",fillcolor="#6666ff"];
X [label="bd",fillcolor="#66ff66"];
A -> O [label="+ac"];
B -> O [label="+d"];
A1 -> A [label="-c"];
A2 -> A [label="-a"];
C -> B [color="#666666"];
D -> B [color="#666666"];
C -> A1 [color="#666666"];
D -> A2 [color="#666666"];
X -> C [color="#666666"];
X -> D [color="#666666"];
[0] partial-vis-0.dot
rankdir=BT;
node [style="filled"];
B0 [label="bd"];
C0 [label="abd",fillcolor="#6666ff"];
D0 [label="bcd",fillcolor="#6666ff"];
X0 [label="abcd",fillcolor="#66ff66"];
C0 -> B0 [label="+a"];
D0 -> B0 [label="+c"];
X0 -> C0 [color="#666666"];
X0 -> D0 [color="#666666"];
(both from
https://raw.githubusercontent.com/infinity0/msg-notes/master/causal/05-visibility.rst
but it is horrendously incomplete at the time of writing)
--
GPG: 4096R/1318EFAC5FBBDBCE
git://github.com/infinity0/pubkeys.git
_______________________________________________
Messaging mailing list
[email protected]
https://moderncrypto.org/mailman/listinfo/messaging