Byzantine Fault Tolerance
Consensus Strikes Back (continued)
Byzantine Fault Tolerance Consensus Strikes Back (continued) - - PowerPoint PPT Presentation
Byzantine Fault Tolerance Consensus Strikes Back (continued) Announcements Lab 2 Due in approximately 5 hours. Lab 2 Due in approximately 5 hours. If you haven't started yet then ... I don't really know how to help. Lab 2 Due in
Consensus Strikes Back (continued)
1 2 3 4
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c1, 4 0->1: c1, 4 0->1: c1, 4 0->1: c1, 4
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c1, 4 0->1: c1, 4 0->1: c1, 4 0->1: c1, 4
1 2 3 4 2
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c0, 4 ??? ??? ???
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
h Arbitrary length input Fixed length output
h Arbitrary length input Fixed length output
h Arbitrary length input Fixed length output
h Arbitrary length input Fixed length output
h Arbitrary length input Fixed length output
f Input Signature g Input ✔ 𝙔
Signature g(m, s) = ✔ if and only if f(m) = s.
1 2 3 4
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c1, 4 0->1: c1, 4 0->1: c1, 4 0->1: c1, 4
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c1, 4 0->1: c1, 4 0->1: c1, 4 0->1: c1, 4
1 2 3 4 2
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c0, 4 ??? ??? ???
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
0->1: c0, 4 0->1: c0, 4 0->1: c0, 4 0->1: c0, 4
1 2 3 4
AppendEntries(..., [], leaderCommit = 4), Sig(pr1, success), Sig(pr2, success), Sig(pr3, success) Pr0 Pr1 Pr2 Pr3 Pr4
1 2 3 4
AppendEntries(..., [], leaderCommit = 4), Sig(pr1, success), Sig(pr2, success), Sig(pr3, success) Pr0 Pr1 Pr2 Pr3 Pr4
c 1 2 3 req, sigc(req)
c 1 2 3 pre-prepare(v, n, d) sig0(pre-prepare(v, n, d)) <req , sigc(req)> req, sigc(req) v = view n = slot d = D(<req, sigc(req)>)
c 1 2 3 req, sigc(req) prepare(v, n, d, 1) sig1(prepare(v, n, d, 1)) v = view n = slot d = D(<req, sigc(req)>)
c 1 2 3 req, sigc(req)
Wait for prepared to become true
f = maximum number of faulty nodes
c 1 2 3 req, sigc(req) commit(v, n, d, i) sig1(commit(v, n, d, i)) f = maximum number of faulty nodes
c 1 2 3 req, sigc(req)
Wait for committed
c 1 2 3 req, sigc(req) resp(r, v, 1) sig1(resp)
c 1 2 3 req, sigc(req)
c 1 2 3 req, sigc(req) resp(r, v, 0) sig1(resp)
c 1 2 3 req, sigc(req)
c 1 2 3 req, sigc(req)
c 1 2 3 req, sigc(req) req, sigc(req)
c 1 2 3 req, sigc(req) req, sigc(req)
c 1 2 3 req, sigc(req) req, sigc(req)
View Change
1 2 3 4 View 1
1 2 3 4 View 1 2
1 2 3 4 View 1 2 3 For view V, leader is V mod (# of peers) At most f view changes before arriving at a correct leader.
c 1 2 3 view-change(v+1, prepared, 1) sig1(view-change(v+1, prepared, i))
c 1 2 3 view-change(v+1, prepared, 1) sig1(view-change(v+1, prepared, 1)) prepared = [(pre-prepare(n, v, d), sig(pre-prepare(n, v, d), prepare(v, n, d, i0), sigi0(prepare(v, n, d, i0)), prepare(v, n, d, i1), sigi1(prepare(v, n, d, i1)), prepare(v, n, d, i2), sigi2(prepare(v, n, d, i2)), ...), (pre-prepare(n', v', d'), ...), ...]
prepared = [(pre-prepare(n, v, d), sig(pre-prepare(n, v, d), prepare(v, n, d, i0), sigi0(prepare(v, n, d, i0)), prepare(v, n, d, i1), sigi1(prepare(v, n, d, i1)), prepare(v, n, d, i2), sigi2(prepare(v, n, d, i2)), ...), (pre-prepare(n', v', d'), ...), ...]
prepared = [(pre-prepare(n, v, d), sig(pre-prepare(n, v, d), prepare(v, n, d, i0), sigi0(prepare(v, n, d, i0)), prepare(v, n, d, i1), sigi1(prepare(v, n, d, i1)), prepare(v, n, d, i2), sigi2(prepare(v, n, d, i2)), ...), (pre-prepare(n', v', d'), ...), ...] At slot n, prepared message with digest d, in view v.
prepared = [(pre-prepare(n, v, d), sig(pre-prepare(n, v, d), prepare(v, n, d, i0), sigi0(prepare(v, n, d, i0)), prepare(v, n, d, i1), sigi1(prepare(v, n, d, i1)), prepare(v, n, d, i2), sigi2(prepare(v, n, d, i2)), ...), (pre-prepare(n', v', d'), ...), ...] At slot n, prepared message with digest d, in view v. Here is evidence that I received the pre-prepare message.
prepared = [(pre-prepare(n, v, d), sig(pre-prepare(n, v, d), prepare(v, n, d, i0), sigi0(prepare(v, n, d, i0)), prepare(v, n, d, i1), sigi1(prepare(v, n, d, i1)), prepare(v, n, d, i2), sigi2(prepare(v, n, d, i2)), ...), (pre-prepare(n', v', d'), ...), ...] At slot n, prepared message with digest d, in view v. Here is evidence that I received the pre-prepare message. Received a prepare from i0
prepared = [(pre-prepare(n, v, d), sig(pre-prepare(n, v, d), prepare(v, n, d, i0), sigi0(prepare(v, n, d, i0)), prepare(v, n, d, i1), sigi1(prepare(v, n, d, i1)), prepare(v, n, d, i2), sigi2(prepare(v, n, d, i2)), ...), (pre-prepare(n', v', d'), ...), ...] At slot n, prepared message with digest d, in view v. Here is evidence that I received the pre-prepare message. Received a prepare from i0 Proof that I did the right thing in preparing this slot.
c 1 2 3
Send view-change requests on timeout. Why?
c 1 2 3
Leader of new view waits for 2f valid view changes. Why 2f?
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d'') (1, 0, d''')
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d'') (1, 0, d''')
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d)
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d) Is it possible that d != d'?
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d) (1, 1, e) (1, 2, f) (1, 5, g)
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d) (1, 1, e) (1, 2, f) (1, 5, g)
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d) (1, 1, e) (1, 2, f) (1, 5, g)
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d) (1, 1, e) (1, 2, f) (1, 5, g)
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d) (1, 1, e) (1, 2, f) (1, 5, g) Merged Log (3, 0, d') (3, 1, e) (3, 2, f) (3, 3, noop) (3, 4, noop) (3, 5, g)
Peer 0 Peer 1 Peer 2 Peer 3 Peer 4 (1, 0, d) (2, 0, d') Tuple form: (v, n, d) (2, 0, d') (1, 0, d) (1, 0, d) (1, 1, e) (1, 2, f) (1, 5, g) Merged Log (3, 0, d') (3, 1, e) (3, 2, f) (3, 3, noop) (3, 4, noop) (3, 5, g)
c 1 2 3 new-view(v+1, [prepared1, prepared2, prepared3], merged, 1) sig1(new-view(v+1, [prepared1, prepared2, prepared3], merged, 1))
c 1 2 3 pre-prepare(v, n, d) sig0(pre-prepare(v, n, d)) <req , sigc(req)> req, sigc(req) v = view n = slot d = D(<req, sigc(req)>) r = computed response spec-response(v, n, d, r, i) sigi(spec-response(v, n, d, r, i))
c 1 2 3 req, sigc(req) v = view n = slot d = D(<req, sigc(req)>) r = computed response commit-certificate(v, n, d, [sig0(spec-response(v, n, d, r, i)), ...]), sigc(commit-certificate)