Replies: 4 comments 6 replies
-
Do you mean this: "In turn, P150 could send P2 D_b as the data it received from P1, while sending D_a to every other node. In this case, P2 would be the only node to report P1, and would get (unfairly) slashed."? |
Beta Was this translation helpful? Give feedback.
-
What is the form that you expect the data to have here? It's difficult to say how hard it would be without some more information on any transformations that the SC might have to apply in order to verify the condition. |
Beta Was this translation helpful? Give feedback.
-
The problem this is trying to solve is not really clear to me - my response is based on what I think this is trying to solve. If A broadcasts D to everyone except B, and broadcasts D' to B, then A can be slashed for this, right? If B assumes it receives the correct data from A, and uses it, the network will see that the data B is using is incorrect. It seems there's an assumption that we always slash on nodes that use the incorrect data, and so we should always avoid using incorrect data (i.e. by doing something like you've described above, and check immediately). I'd argue this is more costly than necessary. The assumption that B is automatically the malicious node if it is using incorrect data should not be the case. B might be malicious, but B can also provide a defence, by providing the data signed by A, that was invalid. No consensus is required, it's cryptographically true. |
Beta Was this translation helpful? Give feedback.
-
I wonder why we care about this? If P2 receives two pieces of data signed by the same Validator, for the same ceremony, the State Chain can verify this and automatically slash the signer. Why do you think we might need to differentiate majority/minority voters here? The point of a signature is to commit to some data. If you have committed to two pieces of data which contradict each other, we don't need a vote to slash you. |
Beta Was this translation helpful? Give feedback.
-
Most (if not all) literature on distributed key generation/signing assume a reliable broadcast channel (to ensure that all parties see the same data, otherwise we might have an aggregate key that can't be used). We don't have this luxury (we probably don't want to use blockchain for this...), so we need to come up with a way to achieve the same functionality over p2p.
Consider a scenario where node P1 needs to "broadcast" data
M
. We assume that all data send over p2p is signed:D = (M, signature)
.Option 1. Nodes retransmit received "broadcast" data to each other in an additional p2p round
For simplicity, assume only three parties: P1, P2 and P3.
D
to P2 andD'
to P3. (D' = optionally_tamper_with(M)
- which changes D)D'
to P2, and P2 sendsD
to P3.D == D'
. If equal, P2 considersD
properly broadcast. If not equal, it reports P1 to the blockchian (it can be confident that P1 is cheating asD
andD'
are both signed and correspond to the samekey_id
).One potential issue with this approach is, it is enough for two nodes, say P1 and P150, (assume 150 parties now) to collude to get an honest node slashed: P1 could generate and sign
D_a
andD_b
send both to P150, but only "broadcast"D_a
. In turn, P150 could sendD_b
to P2 as the data it received from P1, while sendingD_a
to every other node. In this case, P2 would be the only node to report P1, and would get (unfairly) slashed. The solution, I think, is to submit the to contradicting signed pieces of data along with the report, so a single report would be enough since all other nodes could verify it. Would this verification be hard/annoying to do on SC?Option 2. Use a semi-trusted cooridnator
D
to P2D
P3, P4, ..., PND
is signed, other nodes can be certain that it came from P1.Again, P1 and P2 can collude to distribute inconsistent (but signed) data. In this case, however, we wouldn't be able to detect the fact of collusion (so Option 2 is not really viable, I guess).
Any feedback on the above is appreciated.
Update: after disucssing this with a developer from thorchain, It looks like there is a better way to simulate a reliable broadcast, presented as Option 3.
Option 3.
In this case we consider N = 150 with parties
P_i (i \in 1..N)
. We want partyP_1
to broadcast messageM
to all other nodes. We will denote the message sent to partyP_j
asM_j
as we don't want to assume thatM_j = M
(i.e.P_1
may be dishonest).P_1
sendsM_j
toP_j (j != 1)
P_j (j != 1)
hashesM_j
to produceH_j = Hash(M_j)
and "broadcasts"H_j
by sending(j, H_j)
toP_k (k != j)
P_i
holdsN
pieces of data:M_i
and 149H_j (j != i)
. Next they copmuteH_i = Hash(M_i)
and check ifH_i
matches at least 67% ofH_j
. If it does,P_i
assumes that the broadcast has been successful. Otherwise,P_i
reportsP_1
to SC and abort the ceremony.P_1
is removed from the next ceremony (and is potentially slashed) if it is reported by a majority of validators on SC.Beta Was this translation helpful? Give feedback.
All reactions