-
GasperBeaconChain -
Core -
Theories - PlausibleLiveness: Plausible liveness
Plausible liveness
This file proves the plausible-liveness theorem: under the standing hypotheses (no slashing, good votes, quorum nonemptiness, two-thirds-good validators, and blocks at arbitrary heights), the protocol state can always be extended with two new supermajority links that finalize a new block — without introducing any new slashing.
This formalises Casper FFG's Theorem 2 (Plausible Liveness) / Gasper's Theorem 6.1: regardless of any previous events, it is always possible for new blocks to be finalized, provided that new blocks can be created by the underlying blockchain. The emphasis is that honest validators are never forced to violate a slashing condition in order to make progress — the protocol cannot "deadlock" into a state where finalization requires voluntary slashing. This is a purely non-probabilistic property about the logic of the protocol, requiring no synchrony assumptions.
Structure
The proof proceeds in three stages:
-
No new slashing (
no_new_double_vote_two_link_extension,no_new_surround_vote_two_link_extension,no_new_slashed_two_link_extension): adding two carefully-chosen vote batches at heightsH + 1andH + 2(whereH = \operatorname{highest\_target}(\sigma)) cannot create any new double-vote or surround-vote violation. The proof is a3 \times 3case matrix (old / link-1 / link-2 for each of the two conflicting votes), with each off-diagonal cell ruled out by a height argument. The key insight is that the two new target heightsH + 1, H + 2are strictly above every existing target height\le H, so they cannot collide with old votes (for (S1)) and cannot be surrounded by old votes (for (S2)). -
Extension construction (
plausible_liveness_construct_extension): assembles the extended state\sigma'from the highest justified block, two fresh quorums fromtwo_thirds_good, and two new supermajority links built bysupermajority_link_of_quorum_votes. Verifies all five conditions: vote inclusion, well-formedness, no new slashing, justification of the new finalized block, and the finalizing parent edge. This is a 1-finalization construction: the new finalized block\mathit{nf}is justified at heightH + 1, and the finalizing link goes from(\mathit{nf}, H{+}1)to(\mathit{nc}, H{+}2), matching the definition offinalizedat depthk = 1. -
Coq-compatible wrapper (
plausible_liveness_from_coq_blocks_exist): replaces the corrected block-existence hypothesis with the Coq-faithful one viablocks_exist_high_over_of_coq.
Non-goals of this file
This file proves plausible liveness only — it shows that finalization is always possible. It does not prove probabilistic liveness (that finalization is likely under synchrony assumptions), which is a separate, stronger result discussed in Gasper's Section 7 but not formalised in this development.
variable {Validator : Type u}variable {Hash : Type v}variable [DecidableEq Validator]variable [DecidableEq Hash]Height-transport helpers
The following private lemmas transport strict/non-strict
inequalities and equalities across height-level identifications
(e.g. th = H + 1). They are used in the 3 \times 3 case
matrix of no_new_double_vote_two_link_extension and
no_new_surround_vote_two_link_extension to derive
contradictions when two votes from different height levels would
need to share a target or source height.
Transport a < b along a = c to get c < b.
private theorem lt_of_eq_left {a b c : Nat} (ha : a = c) (hlt : a < b) : c < b :=
match ha with | rfl => hltlt_of_eq_left : ∀ {a b c : Nat}, Eq a c → LT.lt a b → LT.lt c b
0│ │ a ├ Nat
1│ │ b ├ Nat
2│ │ c ├ Nat
3│ │ ha ├ Eq a c
4│ │ hlt ├ LT.lt a b
5│ │ _ │ ┌ Unit
6│5,4 │ ∀I │ ∀ (_ : Unit), LT.lt a b
7│3,6 │ lt_of_eq_left.match_1 │ LT.lt c b
8│0,1,2,3,4,7│ ∀I │ ∀ {a b c : Nat}, Eq a c → LT.lt a b → LT.lt c b
#detail_explode lt_of_eq_leftlt_of_eq_left : ∀ {a b c : Nat}, Eq a c → LT.lt a b → LT.lt c b
0│ │ a ├ Nat
1│ │ b ├ Nat
2│ │ c ├ Nat
3│ │ ha ├ Eq a c
4│ │ hlt ├ LT.lt a b
5│ │ _ │ ┌ Unit
6│5,4 │ ∀I │ ∀ (_ : Unit), LT.lt a b
7│3,6 │ lt_of_eq_left.match_1 │ LT.lt c b
8│0,1,2,3,4,7│ ∀I │ ∀ {a b c : Nat}, Eq a c → LT.lt a b → LT.lt c b
Transport a < b along b = c to get a < c.
private theorem lt_of_eq_right {a b c : Nat} (hb : b = c) (hlt : a < b) : a < c :=
match hb with | rfl => hltlt_of_eq_right : ∀ {a b c : Nat}, Eq b c → LT.lt a b → LT.lt a c
0│ │ a ├ Nat
1│ │ b ├ Nat
2│ │ c ├ Nat
3│ │ hb ├ Eq b c
4│ │ hlt ├ LT.lt a b
5│ │ _ │ ┌ Unit
6│5,4 │ ∀I │ ∀ (_ : Unit), LT.lt a b
7│3,6 │ lt_of_eq_left.match_1 │ LT.lt a c
8│0,1,2,3,4,7│ ∀I │ ∀ {a b c : Nat}, Eq b c → LT.lt a b → LT.lt a c
#detail_explode lt_of_eq_rightlt_of_eq_right : ∀ {a b c : Nat}, Eq b c → LT.lt a b → LT.lt a c
0│ │ a ├ Nat
1│ │ b ├ Nat
2│ │ c ├ Nat
3│ │ hb ├ Eq b c
4│ │ hlt ├ LT.lt a b
5│ │ _ │ ┌ Unit
6│5,4 │ ∀I │ ∀ (_ : Unit), LT.lt a b
7│3,6 │ lt_of_eq_left.match_1 │ LT.lt a c
8│0,1,2,3,4,7│ ∀I │ ∀ {a b c : Nat}, Eq b c → LT.lt a b → LT.lt a c
From a = b derive b \le a.
private theorem le_of_eq {a b : Nat} (h : a = b) : b ≤ a :=
match h with | rfl => Nat.le_refl _le_of_eq : ∀ {a b : Nat}, Eq a b → LE.le b a
0│ │ a ├ Nat
1│ │ b ├ Nat
2│ │ h ├ Eq a b
3│ │ _ │ ┌ Unit
4│ │ Nat.le_refl │ │ LE.le a a
5│3,4 │ ∀I │ ∀ (_ : Unit), LE.le a a
6│2,5 │ lt_of_eq_left.match_1 │ LE.le b a
7│0,1,2,6│ ∀I │ ∀ {a b : Nat}, Eq a b → LE.le b a
#detail_explode le_of_eqle_of_eq : ∀ {a b : Nat}, Eq a b → LE.le b a
0│ │ a ├ Nat
1│ │ b ├ Nat
2│ │ h ├ Eq a b
3│ │ _ │ ┌ Unit
4│ │ Nat.le_refl │ │ LE.le a a
5│3,4 │ ∀I │ ∀ (_ : Unit), LE.le a a
6│2,5 │ lt_of_eq_left.match_1 │ LE.le b a
7│0,1,2,6│ ∀I │ ∀ {a b : Nat}, Eq a b → LE.le b a
From th = H + 1 and th \le H derive H + 1 \le H (absurd).
private theorem le_of_height_eq_add_one
{th H : Nat} (hth : th = H + 1) (hle : th ≤ H) : H + 1 ≤ H :=
match hth with | rfl => hlele_of_height_eq_add_one : ∀ {th H : Nat}, Eq th (HAdd.hAdd H (1 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (1 : Nat)) H
0│ │ th ├ Nat
1│ │ H ├ Nat
2│ │ hth ├ Eq th (HAdd.hAdd H (1 : Nat))
3│ │ hle ├ LE.le th H
4│ │ _ │ ┌ Unit
5│4,3 │ ∀I │ ∀ (_ : Unit), LE.le th H
6│2,5 │ lt_of_eq_left.match_1 │ LE.le (HAdd.hAdd H (1 : Nat)) H
7│0,1,2,3,6│ ∀I │ ∀ {th H : Nat},
Eq th (HAdd.hAdd H (1 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (1 : Nat)) H
#detail_explode le_of_height_eq_add_onele_of_height_eq_add_one : ∀ {th H : Nat}, Eq th (HAdd.hAdd H (1 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (1 : Nat)) H
0│ │ th ├ Nat
1│ │ H ├ Nat
2│ │ hth ├ Eq th (HAdd.hAdd H (1 : Nat))
3│ │ hle ├ LE.le th H
4│ │ _ │ ┌ Unit
5│4,3 │ ∀I │ ∀ (_ : Unit), LE.le th H
6│2,5 │ lt_of_eq_left.match_1 │ LE.le (HAdd.hAdd H (1 : Nat)) H
7│0,1,2,3,6│ ∀I │ ∀ {th H : Nat},
Eq th (HAdd.hAdd H (1 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (1 : Nat)) H
From th = H + 2 and th \le H derive H + 2 \le H (absurd).
private theorem le_of_height_eq_add_two
{th H : Nat} (hth : th = H + 2) (hle : th ≤ H) : H + 2 ≤ H :=
match hth with | rfl => hlele_of_height_eq_add_two : ∀ {th H : Nat}, Eq th (HAdd.hAdd H (2 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (2 : Nat)) H
0│ │ th ├ Nat
1│ │ H ├ Nat
2│ │ hth ├ Eq th (HAdd.hAdd H (2 : Nat))
3│ │ hle ├ LE.le th H
4│ │ _ │ ┌ Unit
5│4,3 │ ∀I │ ∀ (_ : Unit), LE.le th H
6│2,5 │ lt_of_eq_left.match_1 │ LE.le (HAdd.hAdd H (2 : Nat)) H
7│0,1,2,3,6│ ∀I │ ∀ {th H : Nat},
Eq th (HAdd.hAdd H (2 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (2 : Nat)) H
#detail_explode le_of_height_eq_add_twole_of_height_eq_add_two : ∀ {th H : Nat}, Eq th (HAdd.hAdd H (2 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (2 : Nat)) H
0│ │ th ├ Nat
1│ │ H ├ Nat
2│ │ hth ├ Eq th (HAdd.hAdd H (2 : Nat))
3│ │ hle ├ LE.le th H
4│ │ _ │ ┌ Unit
5│4,3 │ ∀I │ ∀ (_ : Unit), LE.le th H
6│2,5 │ lt_of_eq_left.match_1 │ LE.le (HAdd.hAdd H (2 : Nat)) H
7│0,1,2,3,6│ ∀I │ ∀ {th H : Nat},
Eq th (HAdd.hAdd H (2 : Nat)) → LE.le th H → LE.le (HAdd.hAdd H (2 : Nat)) H
From a = c and b = c derive a = b.
private theorem eq_of_eq_right
{α : Type*} {a b c : α} (ha : a = c) (hb : b = c) : a = b :=
match ha with | rfl => match hb with | rfl => rfleq_of_eq_right : ∀ {α : Type u_1} {a b c : α}, Eq a c → Eq b c → Eq a b
0 │ │ α ├ Type u_1
1 │ │ a ├ α
2 │ │ b ├ α
3 │ │ c ├ α
4 │ │ ha ├ Eq a c
5 │ │ hb ├ Eq b c
6 │ │ hb │ ┌ Eq b a
7 │ │ ha │ │ ┌ Eq b c
8 │ │ rfl │ │ │ Eq b b
9 │7,8 │ ∀I │ │ Eq b c → Eq b b
10│6,4,9 │ eq_of_eq_right.match_1 │ │ Eq a b
11│6,10 │ ∀I │ Eq b a → Eq a b
12│4,5,11 │ eq_of_eq_right.match_2 │ Eq a b
13│0,1,2,3,4,5,12│ ∀I │ ∀ {α : Type u_1} {a b c : α},
Eq a c → Eq b c → Eq a b
#detail_explode eq_of_eq_righteq_of_eq_right : ∀ {α : Type u_1} {a b c : α}, Eq a c → Eq b c → Eq a b
0 │ │ α ├ Type u_1
1 │ │ a ├ α
2 │ │ b ├ α
3 │ │ c ├ α
4 │ │ ha ├ Eq a c
5 │ │ hb ├ Eq b c
6 │ │ hb │ ┌ Eq b a
7 │ │ ha │ │ ┌ Eq b c
8 │ │ rfl │ │ │ Eq b b
9 │7,8 │ ∀I │ │ Eq b c → Eq b b
10│6,4,9 │ eq_of_eq_right.match_1 │ │ Eq a b
11│6,10 │ ∀I │ Eq b a → Eq a b
12│4,5,11 │ eq_of_eq_right.match_2 │ Eq a b
13│0,1,2,3,4,5,12│ ∀I │ ∀ {α : Type u_1} {a b c : α},
Eq a c → Eq b c → Eq a b
From x = y and x = z derive y = z.
private theorem eq_of_eq_left
{x y z : Nat} (hy : x = y) (hz : x = z) : y = z :=
match hy with | rfl => hzeq_of_eq_left : ∀ {x y z : Nat}, Eq x y → Eq x z → Eq y z
0│ │ x ├ Nat
1│ │ y ├ Nat
2│ │ z ├ Nat
3│ │ hy ├ Eq x y
4│ │ hz ├ Eq x z
5│ │ _ │ ┌ Unit
6│5,4 │ ∀I │ ∀ (_ : Unit), Eq x z
7│3,6 │ lt_of_eq_left.match_1 │ Eq y z
8│0,1,2,3,4,7│ ∀I │ ∀ {x y z : Nat}, Eq x y → Eq x z → Eq y z
#detail_explode eq_of_eq_lefteq_of_eq_left : ∀ {x y z : Nat}, Eq x y → Eq x z → Eq y z
0│ │ x ├ Nat
1│ │ y ├ Nat
2│ │ z ├ Nat
3│ │ hy ├ Eq x y
4│ │ hz ├ Eq x z
5│ │ _ │ ┌ Unit
6│5,4 │ ∀I │ ∀ (_ : Unit), Eq x z
7│3,6 │ lt_of_eq_left.match_1 │ Eq y z
8│0,1,2,3,4,7│ ∀I │ ∀ {x y z : Nat}, Eq x y → Eq x z → Eq y z
Adding two links at heights H+1 and H+2 creates no new double vote
Statement
\operatorname{slashed\_double\_vote}\bigl(\sigma \uplus V_1 \uplus V_2,\; v\bigr) \;\implies\; \operatorname{slashed\_double\_vote}(\sigma, v)
where V_1 = \operatorname{votes\_for\_link}(q_1, s_1, t_1, s_{1,h}, H{+}1)
and V_2 = \operatorname{votes\_for\_link}(q_2, s_2, t_2, H{+}1, H{+}2).
Any double vote in the extended state was already a double vote in
the original state.
Assumptions
-
hBound— every vote in\sigmahas target height\le H(target_height_bound); -
hdbl— the double-vote witness in the extended state.
Proof idea
Classify each of the two conflicting votes as old / from link 1 /
from link 2 via vote_msg_extend_classify, yielding a
3 \times 3 case matrix. The three target-height levels are
\le H (old votes, by target_height_bound), H + 1
(link 1), and H + 2 (link 2). A double vote requires a shared
target height, so:
-
old × old: the pre-existing double vote is returned.
-
old × link or link × old (4 cells): the shared target height would force
H + 1 \le HorH + 2 \le H, both absurd (Nat.not_add_one_le_self,not_add_two_le_self). -
link 1 × link 2 or link 2 × link 1 (2 cells): the shared target height would force
H + 1 = H + 2, absurd (add_one_ne_add_two). -
link 1 × link 1 or link 2 × link 2 (2 cells): both votes target the same block, so
t_1 = t_2contradictst_1 \ne t_2(eq_of_eq_right).
theorem no_new_double_vote_two_link_extension
{st : State Validator Hash}
{q1 q2 : Finset Validator}
{s1 t1 s2 t2 : Hash}
{s1_h : Nat} {H : Nat} {v : Validator}
(hBound : target_height_bound st H)
(hdbl : slashed_double_vote
(extend_state_with_two_vote_sets st
(votes_for_link q1 s1 t1 s1_h (H + 1))
(votes_for_link q2 s2 t2 (H + 1) (H + 2))) v) :
slashed_double_vote st v :=
match hdbl with
| ⟨ta, tb, hneq, sa, sha, sb, shb, th, hvA, hvB⟩ =>
match vote_msg_extend_classify hvA with
| Or.inl hOldA =>
match vote_msg_extend_classify hvB with
| Or.inl hOldB =>
⟨ta, tb, hneq, sa, sha, sb, shb, th, hOldA, hOldB⟩
| Or.inr (Or.inl ⟨_, _, _, _, hthB⟩) =>
False.elim ((Nat.not_add_one_le_self H)
(le_of_height_eq_add_one hthB (target_height_le_of_vote_msg hBound hOldA)))
| Or.inr (Or.inr ⟨_, _, _, _, hthB⟩) =>
False.elim ((not_add_two_le_self H)
(le_of_height_eq_add_two hthB (target_height_le_of_vote_msg hBound hOldA)))
| Or.inr (Or.inl ⟨_, _, htaA, _, hthA⟩) =>
match vote_msg_extend_classify hvB with
| Or.inl hOldB =>
False.elim ((Nat.not_add_one_le_self H)
(le_of_height_eq_add_one hthA (target_height_le_of_vote_msg hBound hOldB)))
| Or.inr (Or.inl ⟨_, _, htbB, _, _⟩) =>
False.elim (hneq (eq_of_eq_right htaA htbB))
| Or.inr (Or.inr ⟨_, _, _, _, hthB⟩) =>
False.elim ((add_one_ne_add_two H) (eq_of_eq_left hthA hthB))
| Or.inr (Or.inr ⟨_, _, htaA, _, hthA⟩) =>
match vote_msg_extend_classify hvB with
| Or.inl hOldB =>
False.elim ((not_add_two_le_self H)
(le_of_height_eq_add_two hthA (target_height_le_of_vote_msg hBound hOldB)))
| Or.inr (Or.inl ⟨_, _, _, _, hthB⟩) =>
False.elim ((add_two_ne_add_one H) (eq_of_eq_left hthA hthB))
| Or.inr (Or.inr ⟨_, _, htbB, _, _⟩) =>
False.elim (hneq (eq_of_eq_right htaA htbB))no_new_double_vote_two_link_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] {st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 s2 t2 : Hash} {s1_h H : Nat}
{v : Validator},
target_height_bound st H →
slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_double_vote st v
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝¹ ├ DecidableEq
Validator
3 │ │ inst✝ ├ DecidableEq
Hash
4 │ │ st ├ State
Validator Hash
5 │ │ q1 ├ Finset
Validator
6 │ │ q2 ├ Finset
Validator
7 │ │ s1 ├ Hash
8 │ │ t1 ├ Hash
9 │ │ s2 ├ Hash
10 │ │ t2 ├ Hash
11 │ │ s1_h ├ Nat
12 │ │ H ├ Nat
13 │ │ v ├ Validator
14 │ │ hBound ├ target_height_bound
st H
15 │ │ hdbl ├ slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v
16 │ │ ta │ ┌ Hash
17 │ │ tb │ ├ Hash
18 │ │ hneq │ ├ Ne
ta tb
19 │ │ sa │ ├ Hash
20 │ │ sha │ ├ Nat
21 │ │ sb │ ├ Hash
22 │ │ shb │ ├ Nat
23 │ │ th │ ├ Nat
24 │ │ hvA │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sa ta sha th
25 │ │ hvB │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sb tb shb th
26 │24 │ vote_msg_extend_classify │ │ Or
(vote_msg st v sa ta sha th)
(Or (And (Membership.mem q1 v) (And (Eq sa s1) (And (Eq ta t1) (And (Eq sha s1_h) (Eq th (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq sa s2) (And (Eq ta t2) (And (Eq sha (HAdd.hAdd H (1 : Nat))) (Eq th (HAdd.hAdd H (2 : Nat))))))))
27 │ │ hOldA │ │ ┌ vote_msg
st v sa ta sha th
28 │25 │ vote_msg_extend_classify │ │ │ Or
(vote_msg st v sb tb shb th)
(Or (And (Membership.mem q1 v) (And (Eq sb s1) (And (Eq tb t1) (And (Eq shb s1_h) (Eq th (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq sb s2) (And (Eq tb t2) (And (Eq shb (HAdd.hAdd H (1 : Nat))) (Eq th (HAdd.hAdd H (2 : Nat))))))))
29 │ │ hOldB │ │ │ ┌ vote_msg
st v sb tb shb th
30 │27,29 │ And.intro │ │ │ │ And
(vote_msg st v sa ta sha th) (vote_msg st v sb tb shb th)
31 │30 │ Exists.intro │ │ │ │ Exists
fun (t_h : Nat) => And (vote_msg st v sa ta sha t_h) (vote_msg st v sb tb shb t_h)
32 │31 │ Exists.intro │ │ │ │ Exists
fun (s₂_h : Nat) => Exists fun (t_h : Nat) => And (vote_msg st v sa ta sha t_h) (vote_msg st v sb tb s₂_h t_h)
33 │32 │ Exists.intro │ │ │ │ Exists
fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) => Exists fun (t_h : Nat) => And (vote_msg st v sa ta sha t_h) (vote_msg st v s₂ tb s₂_h t_h)
34 │33 │ Exists.intro │ │ │ │ Exists
fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v sa ta s₁_h t_h) (vote_msg st v s₂ tb s₂_h t_h)
35 │34 │ Exists.intro │ │ │ │ Exists
fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ ta s₁_h t_h) (vote_msg st v s₂ tb s₂_h t_h)
36 │18,35 │ And.intro │ │ │ │ And
(Ne ta tb)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ ta s₁_h t_h) (vote_msg st v s₂ tb s₂_h t_h))
37 │36 │ Exists.intro │ │ │ │ Exists
fun (t₂ : Hash) =>
And (Ne ta t₂)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ ta s₁_h t_h) (vote_msg st v s₂ t₂ s₂_h t_h))
38 │37 │ Exists.intro │ │ │ │ Exists
fun (t₁ : Hash) =>
Exists fun (t₂ : Hash) =>
And (Ne t₁ t₂)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ t₁ s₁_h t_h) (vote_msg st v s₂ t₂ s₂_h t_h))
39 │29,38 │ ∀I │ │ │ vote_msg
st v sb tb shb th →
Exists fun (t₁ : Hash) =>
Exists fun (t₂ : Hash) =>
And (Ne t₁ t₂)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ t₁ s₁_h t_h) (vote_msg st v s₂ t₂ s₂_h t_h))
40 │ │ left✝³ │ │ │ ┌ Membership.mem
q1 v
41 │ │ left✝² │ │ │ ├ Eq
sb s1
42 │ │ left✝¹ │ │ │ ├ Eq
tb t1
43 │ │ left✝ │ │ │ ├ Eq
shb s1_h
44 │ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
45 │14,27 │ target_height_le_of_vote_msg │ │ │ │ LE.le th H
46 │44,45 │ le_of_height_eq_add_one │ │ │ │ LE.le
(HAdd.hAdd H (1 : Nat)) H
47 │46 │ Nat.not_add_one_le_self │ │ │ │ False
48 │47 │ False.elim │ │ │ │ slashed_double_vote
st v
49 │40,41,42,43,44,48 │ ∀I │ │ │ Membership.mem
q1 v →
Eq sb s1 → Eq tb t1 → Eq shb s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
50 │ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
51 │ │ left✝² │ │ │ ├ Eq
sb s2
52 │ │ left✝¹ │ │ │ ├ Eq
tb t2
53 │ │ left✝ │ │ │ ├ Eq
shb (HAdd.hAdd H (1 : Nat))
54 │ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
55 │54,45 │ le_of_height_eq_add_two │ │ │ │ LE.le
(HAdd.hAdd H (2 : Nat)) H
56 │55 │ not_add_two_le_self │ │ │ │ False
57 │56 │ False.elim │ │ │ │ slashed_double_vote
st v
58 │50,51,52,53,54,57 │ ∀I │ │ │ Membership.mem
q2 v →
Eq sb s2 → Eq tb t2 → Eq shb (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
59 │28,39,49,58 │ no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote
st v
60 │27,59 │ ∀I │ │ vote_msg
st v sa ta sha th →
slashed_double_vote st v
61 │ │ left✝² │ │ ┌ Membership.mem
q1 v
62 │ │ left✝¹ │ │ ├ Eq
sa s1
63 │ │ htaA │ │ ├ Eq
ta t1
64 │ │ left✝ │ │ ├ Eq
sha s1_h
65 │ │ hthA │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
66 │ │ hOldB │ │ │ ┌ vote_msg
st v sb tb shb th
67 │14,66 │ target_height_le_of_vote_msg │ │ │ │ LE.le th H
68 │65,67 │ le_of_height_eq_add_one │ │ │ │ LE.le
(HAdd.hAdd H (1 : Nat)) H
69 │68 │ Nat.not_add_one_le_self │ │ │ │ False
70 │69 │ False.elim │ │ │ │ slashed_double_vote
st v
71 │66,70 │ ∀I │ │ │ vote_msg
st v sb tb shb th →
slashed_double_vote st v
72 │ │ left✝² │ │ │ ┌ Membership.mem
q1 v
73 │ │ left✝¹ │ │ │ ├ Eq
sb s1
74 │ │ htbB │ │ │ ├ Eq
tb t1
75 │ │ left✝ │ │ │ ├ Eq
shb s1_h
76 │ │ right✝ │ │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
77 │63,74 │ eq_of_eq_right │ │ │ │ Eq ta tb
78 │18,77 │ ∀E │ │ │ │ False
79 │78 │ False.elim │ │ │ │ slashed_double_vote
st v
80 │72,73,74,75,76,79 │ ∀I │ │ │ Membership.mem
q1 v →
Eq sb s1 → Eq tb t1 → Eq shb s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
81 │ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
82 │ │ left✝² │ │ │ ├ Eq
sb s2
83 │ │ left✝¹ │ │ │ ├ Eq
tb t2
84 │ │ left✝ │ │ │ ├ Eq
shb (HAdd.hAdd H (1 : Nat))
85 │ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
86 │65,85 │ eq_of_eq_left │ │ │ │ Eq
(HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))
87 │86 │ add_one_ne_add_two │ │ │ │ False
88 │87 │ False.elim │ │ │ │ slashed_double_vote
st v
89 │81,82,83,84,85,88 │ ∀I │ │ │ Membership.mem
q2 v →
Eq sb s2 → Eq tb t2 → Eq shb (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
90 │28,71,80,89 │ no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote
st v
91 │61,62,63,64,65,90 │ ∀I │ │ Membership.mem
q1 v →
Eq sa s1 → Eq ta t1 → Eq sha s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
92 │ │ left✝² │ │ ┌ Membership.mem
q2 v
93 │ │ left✝¹ │ │ ├ Eq
sa s2
94 │ │ htaA │ │ ├ Eq
ta t2
95 │ │ left✝ │ │ ├ Eq
sha (HAdd.hAdd H (1 : Nat))
96 │ │ hthA │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
97 │ │ hOldB │ │ │ ┌ vote_msg
st v sb tb shb th
98 │14,97 │ target_height_le_of_vote_msg │ │ │ │ LE.le th H
99 │96,98 │ le_of_height_eq_add_two │ │ │ │ LE.le
(HAdd.hAdd H (2 : Nat)) H
100│99 │ not_add_two_le_self │ │ │ │ False
101│100 │ False.elim │ │ │ │ slashed_double_vote
st v
102│97,101 │ ∀I │ │ │ vote_msg
st v sb tb shb th →
slashed_double_vote st v
103│ │ left✝³ │ │ │ ┌ Membership.mem
q1 v
104│ │ left✝² │ │ │ ├ Eq
sb s1
105│ │ left✝¹ │ │ │ ├ Eq
tb t1
106│ │ left✝ │ │ │ ├ Eq
shb s1_h
107│ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
108│96,107 │ eq_of_eq_left │ │ │ │ Eq
(HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat))
109│108 │ add_two_ne_add_one │ │ │ │ False
110│109 │ False.elim │ │ │ │ slashed_double_vote
st v
111│103,104,105,106,107,110 │ ∀I │ │ │ Membership.mem
q1 v →
Eq sb s1 → Eq tb t1 → Eq shb s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
112│ │ left✝² │ │ │ ┌ Membership.mem
q2 v
113│ │ left✝¹ │ │ │ ├ Eq
sb s2
114│ │ htbB │ │ │ ├ Eq
tb t2
115│ │ left✝ │ │ │ ├ Eq
shb (HAdd.hAdd H (1 : Nat))
116│ │ right✝ │ │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
117│94,114 │ eq_of_eq_right │ │ │ │ Eq ta tb
118│18,117 │ ∀E │ │ │ │ False
119│118 │ False.elim │ │ │ │ slashed_double_vote
st v
120│112,113,114,115,116,119 │ ∀I │ │ │ Membership.mem
q2 v →
Eq sb s2 → Eq tb t2 → Eq shb (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
121│28,102,111,120 │ no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote
st v
122│92,93,94,95,96,121 │ ∀I │ │ Membership.mem
q2 v →
Eq sa s2 → Eq ta t2 → Eq sha (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
123│26,60,91,122 │ no_new_double_vote_two_link_extension.match_1 │ │ slashed_double_vote st
v
124│16,17,18,19,20,21,22,23,24,25,123 │ ∀I │ ∀
(ta tb : Hash),
Ne ta tb →
∀ (sa : Hash) (sha : Nat) (sb : Hash) (shb th : Nat),
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sa ta sha th →
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sb tb shb th →
slashed_double_vote st v
125│15,124 │ no_new_double_vote_two_link_extension.match_2 │ slashed_double_vote st v
126│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,125│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
{st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 s2 t2 : Hash} {s1_h H : Nat} {v : Validator},
target_height_bound st H →
slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_double_vote st v
#detail_explode no_new_double_vote_two_link_extensionno_new_double_vote_two_link_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] {st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 s2 t2 : Hash} {s1_h H : Nat}
{v : Validator},
target_height_bound st H →
slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_double_vote st v
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝¹ ├ DecidableEq
Validator
3 │ │ inst✝ ├ DecidableEq
Hash
4 │ │ st ├ State
Validator Hash
5 │ │ q1 ├ Finset
Validator
6 │ │ q2 ├ Finset
Validator
7 │ │ s1 ├ Hash
8 │ │ t1 ├ Hash
9 │ │ s2 ├ Hash
10 │ │ t2 ├ Hash
11 │ │ s1_h ├ Nat
12 │ │ H ├ Nat
13 │ │ v ├ Validator
14 │ │ hBound ├ target_height_bound
st H
15 │ │ hdbl ├ slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v
16 │ │ ta │ ┌ Hash
17 │ │ tb │ ├ Hash
18 │ │ hneq │ ├ Ne
ta tb
19 │ │ sa │ ├ Hash
20 │ │ sha │ ├ Nat
21 │ │ sb │ ├ Hash
22 │ │ shb │ ├ Nat
23 │ │ th │ ├ Nat
24 │ │ hvA │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sa ta sha th
25 │ │ hvB │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sb tb shb th
26 │24 │ vote_msg_extend_classify │ │ Or
(vote_msg st v sa ta sha th)
(Or (And (Membership.mem q1 v) (And (Eq sa s1) (And (Eq ta t1) (And (Eq sha s1_h) (Eq th (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq sa s2) (And (Eq ta t2) (And (Eq sha (HAdd.hAdd H (1 : Nat))) (Eq th (HAdd.hAdd H (2 : Nat))))))))
27 │ │ hOldA │ │ ┌ vote_msg
st v sa ta sha th
28 │25 │ vote_msg_extend_classify │ │ │ Or
(vote_msg st v sb tb shb th)
(Or (And (Membership.mem q1 v) (And (Eq sb s1) (And (Eq tb t1) (And (Eq shb s1_h) (Eq th (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq sb s2) (And (Eq tb t2) (And (Eq shb (HAdd.hAdd H (1 : Nat))) (Eq th (HAdd.hAdd H (2 : Nat))))))))
29 │ │ hOldB │ │ │ ┌ vote_msg
st v sb tb shb th
30 │27,29 │ And.intro │ │ │ │ And
(vote_msg st v sa ta sha th) (vote_msg st v sb tb shb th)
31 │30 │ Exists.intro │ │ │ │ Exists
fun (t_h : Nat) => And (vote_msg st v sa ta sha t_h) (vote_msg st v sb tb shb t_h)
32 │31 │ Exists.intro │ │ │ │ Exists
fun (s₂_h : Nat) => Exists fun (t_h : Nat) => And (vote_msg st v sa ta sha t_h) (vote_msg st v sb tb s₂_h t_h)
33 │32 │ Exists.intro │ │ │ │ Exists
fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) => Exists fun (t_h : Nat) => And (vote_msg st v sa ta sha t_h) (vote_msg st v s₂ tb s₂_h t_h)
34 │33 │ Exists.intro │ │ │ │ Exists
fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v sa ta s₁_h t_h) (vote_msg st v s₂ tb s₂_h t_h)
35 │34 │ Exists.intro │ │ │ │ Exists
fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ ta s₁_h t_h) (vote_msg st v s₂ tb s₂_h t_h)
36 │18,35 │ And.intro │ │ │ │ And
(Ne ta tb)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ ta s₁_h t_h) (vote_msg st v s₂ tb s₂_h t_h))
37 │36 │ Exists.intro │ │ │ │ Exists
fun (t₂ : Hash) =>
And (Ne ta t₂)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ ta s₁_h t_h) (vote_msg st v s₂ t₂ s₂_h t_h))
38 │37 │ Exists.intro │ │ │ │ Exists
fun (t₁ : Hash) =>
Exists fun (t₂ : Hash) =>
And (Ne t₁ t₂)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ t₁ s₁_h t_h) (vote_msg st v s₂ t₂ s₂_h t_h))
39 │29,38 │ ∀I │ │ │ vote_msg
st v sb tb shb th →
Exists fun (t₁ : Hash) =>
Exists fun (t₂ : Hash) =>
And (Ne t₁ t₂)
(Exists fun (s₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t_h : Nat) => And (vote_msg st v s₁ t₁ s₁_h t_h) (vote_msg st v s₂ t₂ s₂_h t_h))
40 │ │ left✝³ │ │ │ ┌ Membership.mem
q1 v
41 │ │ left✝² │ │ │ ├ Eq
sb s1
42 │ │ left✝¹ │ │ │ ├ Eq
tb t1
43 │ │ left✝ │ │ │ ├ Eq
shb s1_h
44 │ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
45 │14,27 │ target_height_le_of_vote_msg │ │ │ │ LE.le th H
46 │44,45 │ le_of_height_eq_add_one │ │ │ │ LE.le
(HAdd.hAdd H (1 : Nat)) H
47 │46 │ Nat.not_add_one_le_self │ │ │ │ False
48 │47 │ False.elim │ │ │ │ slashed_double_vote
st v
49 │40,41,42,43,44,48 │ ∀I │ │ │ Membership.mem
q1 v →
Eq sb s1 → Eq tb t1 → Eq shb s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
50 │ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
51 │ │ left✝² │ │ │ ├ Eq
sb s2
52 │ │ left✝¹ │ │ │ ├ Eq
tb t2
53 │ │ left✝ │ │ │ ├ Eq
shb (HAdd.hAdd H (1 : Nat))
54 │ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
55 │54,45 │ le_of_height_eq_add_two │ │ │ │ LE.le
(HAdd.hAdd H (2 : Nat)) H
56 │55 │ not_add_two_le_self │ │ │ │ False
57 │56 │ False.elim │ │ │ │ slashed_double_vote
st v
58 │50,51,52,53,54,57 │ ∀I │ │ │ Membership.mem
q2 v →
Eq sb s2 → Eq tb t2 → Eq shb (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
59 │28,39,49,58 │ no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote
st v
60 │27,59 │ ∀I │ │ vote_msg
st v sa ta sha th →
slashed_double_vote st v
61 │ │ left✝² │ │ ┌ Membership.mem
q1 v
62 │ │ left✝¹ │ │ ├ Eq
sa s1
63 │ │ htaA │ │ ├ Eq
ta t1
64 │ │ left✝ │ │ ├ Eq
sha s1_h
65 │ │ hthA │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
66 │ │ hOldB │ │ │ ┌ vote_msg
st v sb tb shb th
67 │14,66 │ target_height_le_of_vote_msg │ │ │ │ LE.le th H
68 │65,67 │ le_of_height_eq_add_one │ │ │ │ LE.le
(HAdd.hAdd H (1 : Nat)) H
69 │68 │ Nat.not_add_one_le_self │ │ │ │ False
70 │69 │ False.elim │ │ │ │ slashed_double_vote
st v
71 │66,70 │ ∀I │ │ │ vote_msg
st v sb tb shb th →
slashed_double_vote st v
72 │ │ left✝² │ │ │ ┌ Membership.mem
q1 v
73 │ │ left✝¹ │ │ │ ├ Eq
sb s1
74 │ │ htbB │ │ │ ├ Eq
tb t1
75 │ │ left✝ │ │ │ ├ Eq
shb s1_h
76 │ │ right✝ │ │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
77 │63,74 │ eq_of_eq_right │ │ │ │ Eq ta tb
78 │18,77 │ ∀E │ │ │ │ False
79 │78 │ False.elim │ │ │ │ slashed_double_vote
st v
80 │72,73,74,75,76,79 │ ∀I │ │ │ Membership.mem
q1 v →
Eq sb s1 → Eq tb t1 → Eq shb s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
81 │ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
82 │ │ left✝² │ │ │ ├ Eq
sb s2
83 │ │ left✝¹ │ │ │ ├ Eq
tb t2
84 │ │ left✝ │ │ │ ├ Eq
shb (HAdd.hAdd H (1 : Nat))
85 │ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
86 │65,85 │ eq_of_eq_left │ │ │ │ Eq
(HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))
87 │86 │ add_one_ne_add_two │ │ │ │ False
88 │87 │ False.elim │ │ │ │ slashed_double_vote
st v
89 │81,82,83,84,85,88 │ ∀I │ │ │ Membership.mem
q2 v →
Eq sb s2 → Eq tb t2 → Eq shb (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
90 │28,71,80,89 │ no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote
st v
91 │61,62,63,64,65,90 │ ∀I │ │ Membership.mem
q1 v →
Eq sa s1 → Eq ta t1 → Eq sha s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
92 │ │ left✝² │ │ ┌ Membership.mem
q2 v
93 │ │ left✝¹ │ │ ├ Eq
sa s2
94 │ │ htaA │ │ ├ Eq
ta t2
95 │ │ left✝ │ │ ├ Eq
sha (HAdd.hAdd H (1 : Nat))
96 │ │ hthA │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
97 │ │ hOldB │ │ │ ┌ vote_msg
st v sb tb shb th
98 │14,97 │ target_height_le_of_vote_msg │ │ │ │ LE.le th H
99 │96,98 │ le_of_height_eq_add_two │ │ │ │ LE.le
(HAdd.hAdd H (2 : Nat)) H
100│99 │ not_add_two_le_self │ │ │ │ False
101│100 │ False.elim │ │ │ │ slashed_double_vote
st v
102│97,101 │ ∀I │ │ │ vote_msg
st v sb tb shb th →
slashed_double_vote st v
103│ │ left✝³ │ │ │ ┌ Membership.mem
q1 v
104│ │ left✝² │ │ │ ├ Eq
sb s1
105│ │ left✝¹ │ │ │ ├ Eq
tb t1
106│ │ left✝ │ │ │ ├ Eq
shb s1_h
107│ │ hthB │ │ │ ├ Eq
th (HAdd.hAdd H (1 : Nat))
108│96,107 │ eq_of_eq_left │ │ │ │ Eq
(HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat))
109│108 │ add_two_ne_add_one │ │ │ │ False
110│109 │ False.elim │ │ │ │ slashed_double_vote
st v
111│103,104,105,106,107,110 │ ∀I │ │ │ Membership.mem
q1 v →
Eq sb s1 → Eq tb t1 → Eq shb s1_h → Eq th (HAdd.hAdd H (1 : Nat)) → slashed_double_vote st v
112│ │ left✝² │ │ │ ┌ Membership.mem
q2 v
113│ │ left✝¹ │ │ │ ├ Eq
sb s2
114│ │ htbB │ │ │ ├ Eq
tb t2
115│ │ left✝ │ │ │ ├ Eq
shb (HAdd.hAdd H (1 : Nat))
116│ │ right✝ │ │ │ ├ Eq
th (HAdd.hAdd H (2 : Nat))
117│94,114 │ eq_of_eq_right │ │ │ │ Eq ta tb
118│18,117 │ ∀E │ │ │ │ False
119│118 │ False.elim │ │ │ │ slashed_double_vote
st v
120│112,113,114,115,116,119 │ ∀I │ │ │ Membership.mem
q2 v →
Eq sb s2 → Eq tb t2 → Eq shb (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
121│28,102,111,120 │ no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote
st v
122│92,93,94,95,96,121 │ ∀I │ │ Membership.mem
q2 v →
Eq sa s2 → Eq ta t2 → Eq sha (HAdd.hAdd H (1 : Nat)) → Eq th (HAdd.hAdd H (2 : Nat)) → slashed_double_vote st v
123│26,60,91,122 │ no_new_double_vote_two_link_extension.match_1 │ │ slashed_double_vote st
v
124│16,17,18,19,20,21,22,23,24,25,123 │ ∀I │ ∀
(ta tb : Hash),
Ne ta tb →
∀ (sa : Hash) (sha : Nat) (sb : Hash) (shb th : Nat),
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sa ta sha th →
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v sb tb shb th →
slashed_double_vote st v
125│15,124 │ no_new_double_vote_two_link_extension.match_2 │ slashed_double_vote st v
126│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,125│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
{st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 s2 t2 : Hash} {s1_h H : Nat} {v : Validator},
target_height_bound st H →
slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 s2 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_double_vote st v
variable [Fintype Validator]
Adding two links at heights H+1 and H+2 creates no new surround vote
Statement
\operatorname{slashed\_surround\_vote}\bigl(\sigma \uplus V_1 \uplus V_2,\; v\bigr) \;\implies\; \operatorname{slashed\_surround\_vote}(\sigma, v)
Any surround vote in the extended state was already a surround vote in the original state.
Assumptions
-
hBound— target-height bound: every vote in\sigmahas target height\le H; -
hJustBound— justified-height bound: every justified block in\sigmahas height\le H(needed for the link 2 O\timesold I cell, where the inner vote's justified source height is bounded byHwhile the outer source height isH + 1); -
hHighest— the blocks_1at heights_{1,h}is the unique highest justified block (needed for the link 1 O\timesold I cell); -
hGood— good votes: every quorum member's votes have justified sources and forward links (extracts the inner vote's source justification from the outer quorum membership); -
hq1,hq2—q_1,q_2are\frac{2}{3}-quorums att_1,t_2respectively; -
hs1_le—s_{1,h} \le H(the highest justified height does not exceed the target bound).
Proof idea
Same 3 \times 3 case matrix as the double-vote theorem (outer
vote O × inner vote I, each classified as old / link 1 / link 2),
but for the surround condition (h_{s_O} < h_{s_I} and
h_{t_I} < h_{t_O}).
-
old × old: the pre-existing surround vote is returned.
-
old O × new I (2 cells): the inner vote's target height (
H+1orH+2) exceeds the outer vote's target height (\le H), contradictingh_{t_I} < h_{t_O}. -
link 1 O × old I: the critical cell. The outer vote is from
q_1, sogood_votesgives\operatorname{justified}(\sigma, \mathit{is}, \mathit{ish})for the inner vote's source.highest_justifiedthen forces\mathit{ish} \le s_{1,h}, but the surround's source ordering givess_{1,h} < \mathit{ish}— a contradiction. -
link 2 O × old I: similar, but uses
hJustBound(\mathit{ish} \le H) againstH + 1 < \mathit{ish}from the source ordering. -
link 1 O × link 1 I: both source heights equal
s_{1,h}, givings_{1,h} < s_{1,h}— absurd (Nat.lt_irrefl). -
link 2 O × link 1 I:
s_{1,h} \le Hcombined withH + 1 < s_{1,h}via the source ordering — absurd. -
link 1 O × link 2 I or link 2 O × link 2 I: target heights give
H + 2 < H + 1orH + 2 < H + 2, both absurd.
theorem no_new_surround_vote_two_link_extension
(τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator)
(parent : HashParent Hash)
(genesis : Hash)
{st : State Validator Hash}
{q1 q2 : Finset Validator}
{s1 t1 t2 : Hash} {s1_h : Nat} {H : Nat} {v : Validator}
(hBound : target_height_bound st H)
(hJustBound : ∀ {b : Hash} {h : Nat},
justified τ stake vset parent genesis st b h → h ≤ H)
(hHighest : highest_justified τ stake vset parent genesis st s1 s1_h)
(hGood : good_votes τ stake vset parent genesis st)
(hq1 : quorum_2 τ stake vset q1 t1)
(hq2 : quorum_2 τ stake vset q2 t2)
(hs1_le : s1_h ≤ H)
(hsurr : slashed_surround_vote
(extend_state_with_two_vote_sets st
(votes_for_link q1 s1 t1 s1_h (H + 1))
(votes_for_link q2 t1 t2 (H + 1) (H + 2))) v) :
slashed_surround_vote st v :=
match hsurr with
| ⟨os, ot, osh, oth, is_, it_, ish, ith, hvO, hvI, hlt_src, hlt_tgt⟩ =>
match vote_msg_extend_classify hvO with
| Or.inl hOldO =>
match vote_msg_extend_classify hvI with
| Or.inl hOldI =>
⟨os, ot, osh, oth, is_, it_, ish, ith, hOldO, hOldI, hlt_src, hlt_tgt⟩
| Or.inr (Or.inl ⟨_, _, _, _, hthI⟩) =>
False.elim (not_add_one_lt_of_le (target_height_le_of_vote_msg hBound hOldO)
(lt_of_eq_left hthI hlt_tgt))
| Or.inr (Or.inr ⟨_, _, _, _, hthI⟩) =>
False.elim (not_add_two_lt_of_le (target_height_le_of_vote_msg hBound hOldO)
(lt_of_eq_left hthI hlt_tgt))
| Or.inr (Or.inl ⟨hvqO, _, _, hoshO, hthO⟩) =>
match vote_msg_extend_classify hvI with
| Or.inl hOldI =>
have hjs : justified τ stake vset parent genesis st is_ ish :=
match hGood _ q1 hq1 v hvqO with
| ⟨hjs_src, _⟩ => hjs_src is_ it_ ish ith hOldI
match hHighest is_ ish (Nat.le_of_lt (lt_of_eq_left hoshO hlt_src)) hjs with
| ⟨_, hEq⟩ => False.elim ((Nat.not_lt.mpr (Nat.le_of_eq hEq)) (lt_of_eq_left hoshO hlt_src))
| Or.inr (Or.inl ⟨_, _, _, hishI, _⟩) =>
False.elim (Nat.lt_irrefl _ (lt_of_eq_left hoshO (lt_of_eq_right hishI hlt_src)))
| Or.inr (Or.inr ⟨_, _, _, _, hthI⟩) =>
False.elim (not_add_two_lt_add_one H
(lt_of_eq_left hthI (lt_of_eq_right hthO hlt_tgt)))
| Or.inr (Or.inr ⟨hvqO, _, _, hoshO, hthO⟩) =>
match vote_msg_extend_classify hvI with
| Or.inl hOldI =>
have hjs : justified τ stake vset parent genesis st is_ ish :=
match hGood _ q2 hq2 v hvqO with
| ⟨hjs_src, _⟩ => hjs_src is_ it_ ish ith hOldI
False.elim (not_add_one_lt_of_le (hJustBound hjs) (lt_of_eq_left hoshO hlt_src))
| Or.inr (Or.inl ⟨_, _, _, hishI, _⟩) =>
False.elim (not_add_one_lt_of_le hs1_le (lt_of_eq_left hoshO (lt_of_eq_right hishI hlt_src)))
| Or.inr (Or.inr ⟨_, _, _, _, hthI⟩) =>
False.elim (Nat.lt_irrefl _
(lt_of_eq_left hthI (lt_of_eq_right hthO hlt_tgt)))no_new_surround_vote_two_link_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash}
{q1 q2 : Finset Validator} {s1 t1 t2 : Hash} {s1_h H : Nat} {v : Validator},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_surround_vote st v
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10 │ │ st ├ State
Validator Hash
11 │ │ q1 ├ Finset
Validator
12 │ │ q2 ├ Finset
Validator
13 │ │ s1 ├ Hash
14 │ │ t1 ├ Hash
15 │ │ t2 ├ Hash
16 │ │ s1_h ├ Nat
17 │ │ H ├ Nat
18 │ │ v ├ Validator
19 │ │ hBound ├ target_height_bound
st H
20 │ │ hJustBound ├ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H
21 │ │ hHighest ├ highest_justified
τ stake vset parent genesis st s1 s1_h
22 │ │ hGood ├ good_votes
τ stake vset parent genesis st
23 │ │ hq1 ├ quorum_2
τ stake vset q1 t1
24 │ │ hq2 ├ quorum_2
τ stake vset q2 t2
25 │ │ hs1_le ├ LE.le
s1_h H
26 │ │ hsurr ├ slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v
27 │ │ os │ ┌ Hash
28 │ │ ot │ ├ Hash
29 │ │ osh │ ├ Nat
30 │ │ oth │ ├ Nat
31 │ │ is_ │ ├ Hash
32 │ │ it_ │ ├ Hash
33 │ │ ish │ ├ Nat
34 │ │ ith │ ├ Nat
35 │ │ hvO │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v os ot osh oth
36 │ │ hvI │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v is_ it_ ish ith
37 │ │ hlt_src │ ├ LT.lt
osh ish
38 │ │ hlt_tgt │ ├ LT.lt
ith oth
39 │35 │ vote_msg_extend_classify │ │ Or
(vote_msg st v os ot osh oth)
(Or (And (Membership.mem q1 v) (And (Eq os s1) (And (Eq ot t1) (And (Eq osh s1_h) (Eq oth (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq os t1) (And (Eq ot t2) (And (Eq osh (HAdd.hAdd H (1 : Nat))) (Eq oth (HAdd.hAdd H (2 : Nat))))))))
40 │ │ hOldO │ │ ┌ vote_msg
st v os ot osh oth
41 │36 │ vote_msg_extend_classify │ │ │ Or
(vote_msg st v is_ it_ ish ith)
(Or
(And (Membership.mem q1 v) (And (Eq is_ s1) (And (Eq it_ t1) (And (Eq ish s1_h) (Eq ith (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq is_ t1) (And (Eq it_ t2) (And (Eq ish (HAdd.hAdd H (1 : Nat))) (Eq ith (HAdd.hAdd H (2 : Nat))))))))
42 │ │ hOldI │ │ │ ┌ vote_msg
st v is_ it_ ish ith
43 │37,38 │ And.intro │ │ │ │ And
(LT.lt osh ish) (LT.lt ith oth)
44 │42,43 │ And.intro │ │ │ │ And
(vote_msg st v is_ it_ ish ith) (And (LT.lt osh ish) (LT.lt ith oth))
45 │40,44 │ And.intro │ │ │ │ And
(vote_msg st v os ot osh oth) (And (vote_msg st v is_ it_ ish ith) (And (LT.lt osh ish) (LT.lt ith oth)))
46 │45 │ Exists.intro │ │ │ │ Exists
fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v is_ it_ ish t₂_h) (And (LT.lt osh ish) (LT.lt t₂_h oth)))
47 │46 │ Exists.intro │ │ │ │ Exists
fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v is_ it_ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h oth)))
48 │47 │ Exists.intro │ │ │ │ Exists
fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v is_ t₂ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h oth)))
49 │48 │ Exists.intro │ │ │ │ Exists
fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h oth)))
50 │49 │ Exists.intro │ │ │ │ Exists
fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h t₁_h)))
51 │50 │ Exists.intro │ │ │ │ Exists
fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
52 │51 │ Exists.intro │ │ │ │ Exists
fun (t₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os t₁ s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
53 │52 │ Exists.intro │ │ │ │ Exists
fun (s₁ : Hash) =>
Exists fun (t₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v s₁ t₁ s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
54 │42,53 │ ∀I │ │ │ vote_msg
st v is_ it_ ish ith →
Exists fun (s₁ : Hash) =>
Exists fun (t₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v s₁ t₁ s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
55 │ │ left✝³ │ │ │ ┌ Membership.mem
q1 v
56 │ │ left✝² │ │ │ ├ Eq
is_ s1
57 │ │ left✝¹ │ │ │ ├ Eq
it_ t1
58 │ │ left✝ │ │ │ ├ Eq
ish s1_h
59 │ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (1 : Nat))
60 │19,40 │ target_height_le_of_vote_msg │ │ │ │ LE.le
oth H
61 │59,38 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (1 : Nat)) oth
62 │60,61 │ not_add_one_lt_of_le │ │ │ │ False
63 │62 │ False.elim │ │ │ │ slashed_surround_vote
st v
64 │55,56,57,58,59,63 │ ∀I │ │ │ Membership.mem
q1 v →
Eq is_ s1 → Eq it_ t1 → Eq ish s1_h → Eq ith (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
65 │ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
66 │ │ left✝² │ │ │ ├ Eq
is_ t1
67 │ │ left✝¹ │ │ │ ├ Eq
it_ t2
68 │ │ left✝ │ │ │ ├ Eq
ish (HAdd.hAdd H (1 : Nat))
69 │ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (2 : Nat))
70 │69,38 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (2 : Nat)) oth
71 │60,70 │ not_add_two_lt_of_le │ │ │ │ False
72 │71 │ False.elim │ │ │ │ slashed_surround_vote
st v
73 │65,66,67,68,69,72 │ ∀I │ │ │ Membership.mem
q2 v →
Eq is_ t1 → Eq it_ t2 → Eq ish (HAdd.hAdd H (1 : Nat)) → Eq ith (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
74 │41,54,64,73 │ no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
st v
75 │40,74 │ ∀I │ │ vote_msg
st v os ot osh oth →
slashed_surround_vote st v
76 │ │ hvqO │ │ ┌ Membership.mem
q1 v
77 │ │ left✝¹ │ │ ├ Eq
os s1
78 │ │ left✝ │ │ ├ Eq
ot t1
79 │ │ hoshO │ │ ├ Eq
osh s1_h
80 │ │ hthO │ │ ├ Eq
oth (HAdd.hAdd H (1 : Nat))
81 │ │ hOldI │ │ │ ┌ vote_msg
st v is_ it_ ish ith
82 │22,23,76 │ ∀E │ │ │ │ And
(justified_source_votes τ stake vset parent genesis st v) (forward_link_votes parent st v)
83 │ │ hjs_src │ │ │ │ ┌ justified_source_votes
τ stake vset parent genesis st v
84 │ │ right✝ │ │ │ │ ├ forward_link_votes
parent st v
85 │83,81 │ ∀E │ │ │ │ │ justified
τ stake vset parent genesis st is_ ish
86 │83,84,85 │ ∀I │ │ │ │ justified_source_votes
τ stake vset parent genesis st v →
forward_link_votes parent st v → justified τ stake vset parent genesis st is_ ish
87 │82,86 │ no_new_surround_vote_two_link_extension.match_2 │ │ │ │ justified
τ stake vset parent genesis st is_ ish
89 │79,37 │ lt_of_eq_left │ │ │ │ LT.lt
s1_h ish
90 │89 │ Nat.le_of_lt │ │ │ │ LE.le
s1_h ish
91 │21,90,87 │ ∀E │ │ │ │ And
(Eq is_ s1) (Eq ish s1_h)
92 │ │ left✝ │ │ │ │ ┌ Eq
is_ s1
93 │ │ hEq │ │ │ │ ├ Eq
ish s1_h
94 │ │ Nat.not_lt │ │ │ │ │ Iff
(Not (LT.lt s1_h ish)) (LE.le ish s1_h)
95 │93 │ Nat.le_of_eq │ │ │ │ │ LE.le
ish s1_h
96 │94,95,89 │ Iff.mpr │ │ │ │ │ False
97 │96 │ False.elim │ │ │ │ │ slashed_surround_vote
st v
98 │92,93,97 │ ∀I │ │ │ │ Eq
is_ s1 →
Eq ish s1_h → slashed_surround_vote st v
99 │91,98 │ no_new_surround_vote_two_link_extension.match_3 │ │ │ │ slashed_surround_vote
st v
100│81,99 │ ∀I │ │ │ vote_msg
st v is_ it_ ish ith →
slashed_surround_vote st v
101│ │ left✝² │ │ │ ┌ Membership.mem
q1 v
102│ │ left✝¹ │ │ │ ├ Eq
is_ s1
103│ │ left✝ │ │ │ ├ Eq
it_ t1
104│ │ hishI │ │ │ ├ Eq
ish s1_h
105│ │ right✝ │ │ │ ├ Eq
ith (HAdd.hAdd H (1 : Nat))
106│104,37 │ lt_of_eq_right │ │ │ │ LT.lt
osh s1_h
107│79,106 │ lt_of_eq_left │ │ │ │ LT.lt
s1_h s1_h
108│107 │ Nat.lt_irrefl │ │ │ │ False
109│108 │ False.elim │ │ │ │ slashed_surround_vote
st v
110│101,102,103,104,105,109 │ ∀I │ │ │ Membership.mem
q1 v →
Eq is_ s1 → Eq it_ t1 → Eq ish s1_h → Eq ith (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
111│ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
112│ │ left✝² │ │ │ ├ Eq
is_ t1
113│ │ left✝¹ │ │ │ ├ Eq
it_ t2
114│ │ left✝ │ │ │ ├ Eq
ish (HAdd.hAdd H (1 : Nat))
115│ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (2 : Nat))
116│80,38 │ lt_of_eq_right │ │ │ │ LT.lt
ith (HAdd.hAdd H (1 : Nat))
117│115,116 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat))
118│117 │ not_add_two_lt_add_one │ │ │ │ False
119│118 │ False.elim │ │ │ │ slashed_surround_vote
st v
120│111,112,113,114,115,119 │ ∀I │ │ │ Membership.mem
q2 v →
Eq is_ t1 → Eq it_ t2 → Eq ish (HAdd.hAdd H (1 : Nat)) → Eq ith (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
121│41,100,110,120 │ no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
st v
122│76,77,78,79,80,121 │ ∀I │ │ Membership.mem
q1 v →
Eq os s1 → Eq ot t1 → Eq osh s1_h → Eq oth (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
123│ │ hvqO │ │ ┌ Membership.mem
q2 v
124│ │ left✝¹ │ │ ├ Eq
os t1
125│ │ left✝ │ │ ├ Eq
ot t2
126│ │ hoshO │ │ ├ Eq
osh (HAdd.hAdd H (1 : Nat))
127│ │ hthO │ │ ├ Eq
oth (HAdd.hAdd H (2 : Nat))
128│ │ hOldI │ │ │ ┌ vote_msg
st v is_ it_ ish ith
129│22,24,123 │ ∀E │ │ │ │ And
(justified_source_votes τ stake vset parent genesis st v) (forward_link_votes parent st v)
130│ │ hjs_src │ │ │ │ ┌ justified_source_votes
τ stake vset parent genesis st v
131│ │ right✝ │ │ │ │ ├ forward_link_votes
parent st v
132│130,128 │ ∀E │ │ │ │ │ justified
τ stake vset parent genesis st is_ ish
133│130,131,132 │ ∀I │ │ │ │ justified_source_votes
τ stake vset parent genesis st v →
forward_link_votes parent st v → justified τ stake vset parent genesis st is_ ish
134│129,133 │ no_new_surround_vote_two_link_extension.match_2 │ │ │ │ justified
τ stake vset parent genesis st is_ ish
136│20,134 │ ∀E │ │ │ │ LE.le
ish H
137│126,37 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (1 : Nat)) ish
138│136,137 │ not_add_one_lt_of_le │ │ │ │ False
139│138 │ False.elim │ │ │ │ slashed_surround_vote
st v
140│128,139 │ ∀I │ │ │ vote_msg
st v is_ it_ ish ith →
slashed_surround_vote st v
141│ │ left✝² │ │ │ ┌ Membership.mem
q1 v
142│ │ left✝¹ │ │ │ ├ Eq
is_ s1
143│ │ left✝ │ │ │ ├ Eq
it_ t1
144│ │ hishI │ │ │ ├ Eq
ish s1_h
145│ │ right✝ │ │ │ ├ Eq
ith (HAdd.hAdd H (1 : Nat))
146│144,37 │ lt_of_eq_right │ │ │ │ LT.lt
osh s1_h
147│126,146 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (1 : Nat)) s1_h
148│25,147 │ not_add_one_lt_of_le │ │ │ │ False
149│148 │ False.elim │ │ │ │ slashed_surround_vote
st v
150│141,142,143,144,145,149 │ ∀I │ │ │ Membership.mem
q1 v →
Eq is_ s1 → Eq it_ t1 → Eq ish s1_h → Eq ith (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
151│ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
152│ │ left✝² │ │ │ ├ Eq
is_ t1
153│ │ left✝¹ │ │ │ ├ Eq
it_ t2
154│ │ left✝ │ │ │ ├ Eq
ish (HAdd.hAdd H (1 : Nat))
155│ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (2 : Nat))
156│127,38 │ lt_of_eq_right │ │ │ │ LT.lt
ith (HAdd.hAdd H (2 : Nat))
157│155,156 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (2 : Nat))
158│157 │ Nat.lt_irrefl │ │ │ │ False
159│158 │ False.elim │ │ │ │ slashed_surround_vote
st v
160│151,152,153,154,155,159 │ ∀I │ │ │ Membership.mem
q2 v →
Eq is_ t1 → Eq it_ t2 → Eq ish (HAdd.hAdd H (1 : Nat)) → Eq ith (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
161│41,140,150,160 │ no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
st v
162│123,124,125,126,127,161 │ ∀I │ │ Membership.mem
q2 v →
Eq os t1 → Eq ot t2 → Eq osh (HAdd.hAdd H (1 : Nat)) → Eq oth (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
163│39,75,122,162 │ no_new_surround_vote_two_link_extension.match_1 │ │ slashed_surround_vote
st v
164│27,28,29,30,31,32,33,34,35,36,37,38,163 │ ∀I │ ∀
(os ot : Hash) (osh oth : Nat) (is_ it_ : Hash) (ish ith : Nat),
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v os ot osh oth →
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v is_ it_ ish ith →
LT.lt osh ish → LT.lt ith oth → slashed_surround_vote st v
165│26,164 │ no_new_surround_vote_two_link_extension.match_4 │ slashed_surround_vote
st v
166│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,165│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 t2 : Hash}
{s1_h H : Nat} {v : Validator},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_surround_vote st v
#detail_explode no_new_surround_vote_two_link_extensionno_new_surround_vote_two_link_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash}
{q1 q2 : Finset Validator} {s1 t1 t2 : Hash} {s1_h H : Nat} {v : Validator},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_surround_vote st v
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10 │ │ st ├ State
Validator Hash
11 │ │ q1 ├ Finset
Validator
12 │ │ q2 ├ Finset
Validator
13 │ │ s1 ├ Hash
14 │ │ t1 ├ Hash
15 │ │ t2 ├ Hash
16 │ │ s1_h ├ Nat
17 │ │ H ├ Nat
18 │ │ v ├ Validator
19 │ │ hBound ├ target_height_bound
st H
20 │ │ hJustBound ├ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H
21 │ │ hHighest ├ highest_justified
τ stake vset parent genesis st s1 s1_h
22 │ │ hGood ├ good_votes
τ stake vset parent genesis st
23 │ │ hq1 ├ quorum_2
τ stake vset q1 t1
24 │ │ hq2 ├ quorum_2
τ stake vset q2 t2
25 │ │ hs1_le ├ LE.le
s1_h H
26 │ │ hsurr ├ slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v
27 │ │ os │ ┌ Hash
28 │ │ ot │ ├ Hash
29 │ │ osh │ ├ Nat
30 │ │ oth │ ├ Nat
31 │ │ is_ │ ├ Hash
32 │ │ it_ │ ├ Hash
33 │ │ ish │ ├ Nat
34 │ │ ith │ ├ Nat
35 │ │ hvO │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v os ot osh oth
36 │ │ hvI │ ├ vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v is_ it_ ish ith
37 │ │ hlt_src │ ├ LT.lt
osh ish
38 │ │ hlt_tgt │ ├ LT.lt
ith oth
39 │35 │ vote_msg_extend_classify │ │ Or
(vote_msg st v os ot osh oth)
(Or (And (Membership.mem q1 v) (And (Eq os s1) (And (Eq ot t1) (And (Eq osh s1_h) (Eq oth (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq os t1) (And (Eq ot t2) (And (Eq osh (HAdd.hAdd H (1 : Nat))) (Eq oth (HAdd.hAdd H (2 : Nat))))))))
40 │ │ hOldO │ │ ┌ vote_msg
st v os ot osh oth
41 │36 │ vote_msg_extend_classify │ │ │ Or
(vote_msg st v is_ it_ ish ith)
(Or
(And (Membership.mem q1 v) (And (Eq is_ s1) (And (Eq it_ t1) (And (Eq ish s1_h) (Eq ith (HAdd.hAdd H (1 : Nat)))))))
(And (Membership.mem q2 v)
(And (Eq is_ t1) (And (Eq it_ t2) (And (Eq ish (HAdd.hAdd H (1 : Nat))) (Eq ith (HAdd.hAdd H (2 : Nat))))))))
42 │ │ hOldI │ │ │ ┌ vote_msg
st v is_ it_ ish ith
43 │37,38 │ And.intro │ │ │ │ And
(LT.lt osh ish) (LT.lt ith oth)
44 │42,43 │ And.intro │ │ │ │ And
(vote_msg st v is_ it_ ish ith) (And (LT.lt osh ish) (LT.lt ith oth))
45 │40,44 │ And.intro │ │ │ │ And
(vote_msg st v os ot osh oth) (And (vote_msg st v is_ it_ ish ith) (And (LT.lt osh ish) (LT.lt ith oth)))
46 │45 │ Exists.intro │ │ │ │ Exists
fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v is_ it_ ish t₂_h) (And (LT.lt osh ish) (LT.lt t₂_h oth)))
47 │46 │ Exists.intro │ │ │ │ Exists
fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v is_ it_ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h oth)))
48 │47 │ Exists.intro │ │ │ │ Exists
fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v is_ t₂ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h oth)))
49 │48 │ Exists.intro │ │ │ │ Exists
fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh oth) (And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h oth)))
50 │49 │ Exists.intro │ │ │ │ Exists
fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot osh t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt osh s₂_h) (LT.lt t₂_h t₁_h)))
51 │50 │ Exists.intro │ │ │ │ Exists
fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os ot s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
52 │51 │ Exists.intro │ │ │ │ Exists
fun (t₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v os t₁ s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
53 │52 │ Exists.intro │ │ │ │ Exists
fun (s₁ : Hash) =>
Exists fun (t₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v s₁ t₁ s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
54 │42,53 │ ∀I │ │ │ vote_msg
st v is_ it_ ish ith →
Exists fun (s₁ : Hash) =>
Exists fun (t₁ : Hash) =>
Exists fun (s₁_h : Nat) =>
Exists fun (t₁_h : Nat) =>
Exists fun (s₂ : Hash) =>
Exists fun (t₂ : Hash) =>
Exists fun (s₂_h : Nat) =>
Exists fun (t₂_h : Nat) =>
And (vote_msg st v s₁ t₁ s₁_h t₁_h)
(And (vote_msg st v s₂ t₂ s₂_h t₂_h) (And (LT.lt s₁_h s₂_h) (LT.lt t₂_h t₁_h)))
55 │ │ left✝³ │ │ │ ┌ Membership.mem
q1 v
56 │ │ left✝² │ │ │ ├ Eq
is_ s1
57 │ │ left✝¹ │ │ │ ├ Eq
it_ t1
58 │ │ left✝ │ │ │ ├ Eq
ish s1_h
59 │ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (1 : Nat))
60 │19,40 │ target_height_le_of_vote_msg │ │ │ │ LE.le
oth H
61 │59,38 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (1 : Nat)) oth
62 │60,61 │ not_add_one_lt_of_le │ │ │ │ False
63 │62 │ False.elim │ │ │ │ slashed_surround_vote
st v
64 │55,56,57,58,59,63 │ ∀I │ │ │ Membership.mem
q1 v →
Eq is_ s1 → Eq it_ t1 → Eq ish s1_h → Eq ith (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
65 │ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
66 │ │ left✝² │ │ │ ├ Eq
is_ t1
67 │ │ left✝¹ │ │ │ ├ Eq
it_ t2
68 │ │ left✝ │ │ │ ├ Eq
ish (HAdd.hAdd H (1 : Nat))
69 │ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (2 : Nat))
70 │69,38 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (2 : Nat)) oth
71 │60,70 │ not_add_two_lt_of_le │ │ │ │ False
72 │71 │ False.elim │ │ │ │ slashed_surround_vote
st v
73 │65,66,67,68,69,72 │ ∀I │ │ │ Membership.mem
q2 v →
Eq is_ t1 → Eq it_ t2 → Eq ish (HAdd.hAdd H (1 : Nat)) → Eq ith (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
74 │41,54,64,73 │ no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
st v
75 │40,74 │ ∀I │ │ vote_msg
st v os ot osh oth →
slashed_surround_vote st v
76 │ │ hvqO │ │ ┌ Membership.mem
q1 v
77 │ │ left✝¹ │ │ ├ Eq
os s1
78 │ │ left✝ │ │ ├ Eq
ot t1
79 │ │ hoshO │ │ ├ Eq
osh s1_h
80 │ │ hthO │ │ ├ Eq
oth (HAdd.hAdd H (1 : Nat))
81 │ │ hOldI │ │ │ ┌ vote_msg
st v is_ it_ ish ith
82 │22,23,76 │ ∀E │ │ │ │ And
(justified_source_votes τ stake vset parent genesis st v) (forward_link_votes parent st v)
83 │ │ hjs_src │ │ │ │ ┌ justified_source_votes
τ stake vset parent genesis st v
84 │ │ right✝ │ │ │ │ ├ forward_link_votes
parent st v
85 │83,81 │ ∀E │ │ │ │ │ justified
τ stake vset parent genesis st is_ ish
86 │83,84,85 │ ∀I │ │ │ │ justified_source_votes
τ stake vset parent genesis st v →
forward_link_votes parent st v → justified τ stake vset parent genesis st is_ ish
87 │82,86 │ no_new_surround_vote_two_link_extension.match_2 │ │ │ │ justified
τ stake vset parent genesis st is_ ish
89 │79,37 │ lt_of_eq_left │ │ │ │ LT.lt
s1_h ish
90 │89 │ Nat.le_of_lt │ │ │ │ LE.le
s1_h ish
91 │21,90,87 │ ∀E │ │ │ │ And
(Eq is_ s1) (Eq ish s1_h)
92 │ │ left✝ │ │ │ │ ┌ Eq
is_ s1
93 │ │ hEq │ │ │ │ ├ Eq
ish s1_h
94 │ │ Nat.not_lt │ │ │ │ │ Iff
(Not (LT.lt s1_h ish)) (LE.le ish s1_h)
95 │93 │ Nat.le_of_eq │ │ │ │ │ LE.le
ish s1_h
96 │94,95,89 │ Iff.mpr │ │ │ │ │ False
97 │96 │ False.elim │ │ │ │ │ slashed_surround_vote
st v
98 │92,93,97 │ ∀I │ │ │ │ Eq
is_ s1 →
Eq ish s1_h → slashed_surround_vote st v
99 │91,98 │ no_new_surround_vote_two_link_extension.match_3 │ │ │ │ slashed_surround_vote
st v
100│81,99 │ ∀I │ │ │ vote_msg
st v is_ it_ ish ith →
slashed_surround_vote st v
101│ │ left✝² │ │ │ ┌ Membership.mem
q1 v
102│ │ left✝¹ │ │ │ ├ Eq
is_ s1
103│ │ left✝ │ │ │ ├ Eq
it_ t1
104│ │ hishI │ │ │ ├ Eq
ish s1_h
105│ │ right✝ │ │ │ ├ Eq
ith (HAdd.hAdd H (1 : Nat))
106│104,37 │ lt_of_eq_right │ │ │ │ LT.lt
osh s1_h
107│79,106 │ lt_of_eq_left │ │ │ │ LT.lt
s1_h s1_h
108│107 │ Nat.lt_irrefl │ │ │ │ False
109│108 │ False.elim │ │ │ │ slashed_surround_vote
st v
110│101,102,103,104,105,109 │ ∀I │ │ │ Membership.mem
q1 v →
Eq is_ s1 → Eq it_ t1 → Eq ish s1_h → Eq ith (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
111│ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
112│ │ left✝² │ │ │ ├ Eq
is_ t1
113│ │ left✝¹ │ │ │ ├ Eq
it_ t2
114│ │ left✝ │ │ │ ├ Eq
ish (HAdd.hAdd H (1 : Nat))
115│ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (2 : Nat))
116│80,38 │ lt_of_eq_right │ │ │ │ LT.lt
ith (HAdd.hAdd H (1 : Nat))
117│115,116 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat))
118│117 │ not_add_two_lt_add_one │ │ │ │ False
119│118 │ False.elim │ │ │ │ slashed_surround_vote
st v
120│111,112,113,114,115,119 │ ∀I │ │ │ Membership.mem
q2 v →
Eq is_ t1 → Eq it_ t2 → Eq ish (HAdd.hAdd H (1 : Nat)) → Eq ith (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
121│41,100,110,120 │ no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
st v
122│76,77,78,79,80,121 │ ∀I │ │ Membership.mem
q1 v →
Eq os s1 → Eq ot t1 → Eq osh s1_h → Eq oth (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
123│ │ hvqO │ │ ┌ Membership.mem
q2 v
124│ │ left✝¹ │ │ ├ Eq
os t1
125│ │ left✝ │ │ ├ Eq
ot t2
126│ │ hoshO │ │ ├ Eq
osh (HAdd.hAdd H (1 : Nat))
127│ │ hthO │ │ ├ Eq
oth (HAdd.hAdd H (2 : Nat))
128│ │ hOldI │ │ │ ┌ vote_msg
st v is_ it_ ish ith
129│22,24,123 │ ∀E │ │ │ │ And
(justified_source_votes τ stake vset parent genesis st v) (forward_link_votes parent st v)
130│ │ hjs_src │ │ │ │ ┌ justified_source_votes
τ stake vset parent genesis st v
131│ │ right✝ │ │ │ │ ├ forward_link_votes
parent st v
132│130,128 │ ∀E │ │ │ │ │ justified
τ stake vset parent genesis st is_ ish
133│130,131,132 │ ∀I │ │ │ │ justified_source_votes
τ stake vset parent genesis st v →
forward_link_votes parent st v → justified τ stake vset parent genesis st is_ ish
134│129,133 │ no_new_surround_vote_two_link_extension.match_2 │ │ │ │ justified
τ stake vset parent genesis st is_ ish
136│20,134 │ ∀E │ │ │ │ LE.le
ish H
137│126,37 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (1 : Nat)) ish
138│136,137 │ not_add_one_lt_of_le │ │ │ │ False
139│138 │ False.elim │ │ │ │ slashed_surround_vote
st v
140│128,139 │ ∀I │ │ │ vote_msg
st v is_ it_ ish ith →
slashed_surround_vote st v
141│ │ left✝² │ │ │ ┌ Membership.mem
q1 v
142│ │ left✝¹ │ │ │ ├ Eq
is_ s1
143│ │ left✝ │ │ │ ├ Eq
it_ t1
144│ │ hishI │ │ │ ├ Eq
ish s1_h
145│ │ right✝ │ │ │ ├ Eq
ith (HAdd.hAdd H (1 : Nat))
146│144,37 │ lt_of_eq_right │ │ │ │ LT.lt
osh s1_h
147│126,146 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (1 : Nat)) s1_h
148│25,147 │ not_add_one_lt_of_le │ │ │ │ False
149│148 │ False.elim │ │ │ │ slashed_surround_vote
st v
150│141,142,143,144,145,149 │ ∀I │ │ │ Membership.mem
q1 v →
Eq is_ s1 → Eq it_ t1 → Eq ish s1_h → Eq ith (HAdd.hAdd H (1 : Nat)) → slashed_surround_vote st v
151│ │ left✝³ │ │ │ ┌ Membership.mem
q2 v
152│ │ left✝² │ │ │ ├ Eq
is_ t1
153│ │ left✝¹ │ │ │ ├ Eq
it_ t2
154│ │ left✝ │ │ │ ├ Eq
ish (HAdd.hAdd H (1 : Nat))
155│ │ hthI │ │ │ ├ Eq
ith (HAdd.hAdd H (2 : Nat))
156│127,38 │ lt_of_eq_right │ │ │ │ LT.lt
ith (HAdd.hAdd H (2 : Nat))
157│155,156 │ lt_of_eq_left │ │ │ │ LT.lt
(HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (2 : Nat))
158│157 │ Nat.lt_irrefl │ │ │ │ False
159│158 │ False.elim │ │ │ │ slashed_surround_vote
st v
160│151,152,153,154,155,159 │ ∀I │ │ │ Membership.mem
q2 v →
Eq is_ t1 → Eq it_ t2 → Eq ish (HAdd.hAdd H (1 : Nat)) → Eq ith (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
161│41,140,150,160 │ no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
st v
162│123,124,125,126,127,161 │ ∀I │ │ Membership.mem
q2 v →
Eq os t1 → Eq ot t2 → Eq osh (HAdd.hAdd H (1 : Nat)) → Eq oth (HAdd.hAdd H (2 : Nat)) → slashed_surround_vote st v
163│39,75,122,162 │ no_new_surround_vote_two_link_extension.match_1 │ │ slashed_surround_vote
st v
164│27,28,29,30,31,32,33,34,35,36,37,38,163 │ ∀I │ ∀
(os ot : Hash) (osh oth : Nat) (is_ it_ : Hash) (ish ith : Nat),
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v os ot osh oth →
vote_msg
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v is_ it_ ish ith →
LT.lt osh ish → LT.lt ith oth → slashed_surround_vote st v
165│26,164 │ no_new_surround_vote_two_link_extension.match_4 │ slashed_surround_vote
st v
166│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,165│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 t2 : Hash}
{s1_h H : Nat} {v : Validator},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
v →
slashed_surround_vote st v
Adding two links creates no new slashing (either condition)
Statement
\operatorname{no\_new\_slashed}\bigl(\sigma,\; \sigma \uplus V_1 \uplus V_2\bigr)
Every slashed validator in the extended state was already
slashed in the original state \sigma.
Interpretation
This is the disjunctive combination: a slashing witness in the
extended state is either a double vote (handled by
no_new_double_vote_two_link_extension) or a surround vote
(handled by no_new_surround_vote_two_link_extension). In
both cases, the slashing already existed in \sigma.
Proof idea
Given a slashing witness hslash in the extended state,
case-split on the slashed disjunction. The left branch
(double vote) delegates to
no_new_double_vote_two_link_extension; the right branch
(surround vote) delegates to
no_new_surround_vote_two_link_extension, passing through
all six standing hypotheses.
Role in the development
One of the two conditions (together with
unslashed_can_extend_two_vote_sets) that the
plausible-liveness construction must verify for the extended state.
Consumed directly by
plausible_liveness_construct_extension.
theorem no_new_slashed_two_link_extension
(τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator)
(parent : HashParent Hash)
(genesis : Hash)
{st : State Validator Hash}
{q1 q2 : Finset Validator}
{s1 t1 t2 : Hash} {s1_h : Nat} {H : Nat}
(hBound : target_height_bound st H)
(hJustBound : ∀ {b : Hash} {h : Nat},
justified τ stake vset parent genesis st b h → h ≤ H)
(hHighest : highest_justified τ stake vset parent genesis st s1 s1_h)
(hGood : good_votes τ stake vset parent genesis st)
(hq1 : quorum_2 τ stake vset q1 t1)
(hq2 : quorum_2 τ stake vset q2 t2)
(hs1_le : s1_h ≤ H) :
no_new_slashed st
(extend_state_with_two_vote_sets st
(votes_for_link q1 s1 t1 s1_h (H + 1))
(votes_for_link q2 t1 t2 (H + 1) (H + 2))) :=
fun _ hslash => hslash.elim
(fun hdbl => Or.inl (no_new_double_vote_two_link_extension hBound hdbl))
(fun hsurr => Or.inr (no_new_surround_vote_two_link_extension
τ stake vset parent genesis hBound hJustBound hHighest hGood hq1 hq2 hs1_le hsurr))no_new_slashed_two_link_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash}
{q1 q2 : Finset Validator} {s1 t1 t2 : Hash} {s1_h H : Nat},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
no_new_slashed st
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10│ │ st ├ State
Validator Hash
11│ │ q1 ├ Finset
Validator
12│ │ q2 ├ Finset
Validator
13│ │ s1 ├ Hash
14│ │ t1 ├ Hash
15│ │ t2 ├ Hash
16│ │ s1_h ├ Nat
17│ │ H ├ Nat
18│ │ hBound ├ target_height_bound
st H
19│ │ hJustBound ├ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H
20│ │ hHighest ├ highest_justified
τ stake vset parent genesis st s1 s1_h
21│ │ hGood ├ good_votes
τ stake vset parent genesis st
22│ │ hq1 ├ quorum_2
τ stake vset q1 t1
23│ │ hq2 ├ quorum_2
τ stake vset q2 t2
24│ │ hs1_le ├ LE.le
s1_h H
25│ │ x✝ ├ Validator
26│ │ hslash ├ slashed
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝
27│ │ hdbl │ ┌ slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝
28│18,27 │ no_new_double_vote_two_link_extension │ │ slashed_double_vote
st x✝
29│28 │ Or.inl │ │ Or
(slashed_double_vote st x✝) (slashed_surround_vote st x✝)
30│27,29 │ ∀I │ slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝ →
Or (slashed_double_vote st x✝) (slashed_surround_vote st x✝)
31│ │ hsurr │ ┌ slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝
32│ │ b✝ │ │ ┌ Hash
33│ │ h✝ │ │ ├ Nat
34│19 │ ∀E │ │ │ justified
τ stake vset parent genesis st b✝ h✝ →
LE.le h✝ H
35│32,33,34 │ ∀I │ │ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H
36│18,35,20,21,22,23,24,31 │ no_new_surround_vote_two_link_extension │ │ slashed_surround_vote
st x✝
37│36 │ Or.inr │ │ Or
(slashed_double_vote st x✝) (slashed_surround_vote st x✝)
38│31,37 │ ∀I │ slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝ →
Or (slashed_double_vote st x✝) (slashed_surround_vote st x✝)
39│26,30,38 │ Or.elim │ slashed
st x✝
40│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,39│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 t2 : Hash}
{s1_h H : Nat},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
∀ (x : Validator),
slashed
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x →
slashed st x
#detail_explode no_new_slashed_two_link_extensionno_new_slashed_two_link_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash}
{q1 q2 : Finset Validator} {s1 t1 t2 : Hash} {s1_h H : Nat},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
no_new_slashed st
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10│ │ st ├ State
Validator Hash
11│ │ q1 ├ Finset
Validator
12│ │ q2 ├ Finset
Validator
13│ │ s1 ├ Hash
14│ │ t1 ├ Hash
15│ │ t2 ├ Hash
16│ │ s1_h ├ Nat
17│ │ H ├ Nat
18│ │ hBound ├ target_height_bound
st H
19│ │ hJustBound ├ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H
20│ │ hHighest ├ highest_justified
τ stake vset parent genesis st s1 s1_h
21│ │ hGood ├ good_votes
τ stake vset parent genesis st
22│ │ hq1 ├ quorum_2
τ stake vset q1 t1
23│ │ hq2 ├ quorum_2
τ stake vset q2 t2
24│ │ hs1_le ├ LE.le
s1_h H
25│ │ x✝ ├ Validator
26│ │ hslash ├ slashed
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝
27│ │ hdbl │ ┌ slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝
28│18,27 │ no_new_double_vote_two_link_extension │ │ slashed_double_vote
st x✝
29│28 │ Or.inl │ │ Or
(slashed_double_vote st x✝) (slashed_surround_vote st x✝)
30│27,29 │ ∀I │ slashed_double_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝ →
Or (slashed_double_vote st x✝) (slashed_surround_vote st x✝)
31│ │ hsurr │ ┌ slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝
32│ │ b✝ │ │ ┌ Hash
33│ │ h✝ │ │ ├ Nat
34│19 │ ∀E │ │ │ justified
τ stake vset parent genesis st b✝ h✝ →
LE.le h✝ H
35│32,33,34 │ ∀I │ │ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H
36│18,35,20,21,22,23,24,31 │ no_new_surround_vote_two_link_extension │ │ slashed_surround_vote
st x✝
37│36 │ Or.inr │ │ Or
(slashed_double_vote st x✝) (slashed_surround_vote st x✝)
38│31,37 │ ∀I │ slashed_surround_vote
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x✝ →
Or (slashed_double_vote st x✝) (slashed_surround_vote st x✝)
39│26,30,38 │ Or.elim │ slashed
st x✝
40│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,39│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) {st : State Validator Hash} {q1 q2 : Finset Validator} {s1 t1 t2 : Hash}
{s1_h H : Nat},
target_height_bound st H →
(∀ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h H) →
highest_justified τ stake vset parent genesis st s1 s1_h →
good_votes τ stake vset parent genesis st →
quorum_2 τ stake vset q1 t1 →
quorum_2 τ stake vset q2 t2 →
LE.le s1_h H →
∀ (x : Validator),
slashed
(extend_state_with_two_vote_sets st (votes_for_link q1 s1 t1 s1_h (HAdd.hAdd H (1 : Nat)))
(votes_for_link q2 t1 t2 (HAdd.hAdd H (1 : Nat)) (HAdd.hAdd H (2 : Nat))))
x →
slashed st x
Plausible liveness: construction of the extension (main theorem)
Statement
\exists\, \sigma',\;\; \operatorname{unslashed\_can\_extend}(\sigma, \sigma') \;\wedge\; \operatorname{no\_new\_slashed}(\sigma, \sigma') \;\wedge\; \exists\, \mathit{nf}\, \mathit{nc}\, h,\;\; \operatorname{justified}(\sigma', \mathit{nf}, h) \;\wedge\; \mathit{nf} \to \mathit{nc} \;\wedge\; \operatorname{supermajority\_link}(\sigma', \mathit{nf}, \mathit{nc}, h, h{+}1)
Interpretation
Under the standing hypotheses, the protocol can always extend
the current state to finalize a new block — no matter what has
happened previously (attacks, latency, etc.). The extended state
\sigma' satisfies three properties simultaneously: (1) only
unslashed validators contribute new votes, (2) no validator becomes
newly slashed, and (3) a fresh block \mathit{nf} becomes both
justified and equipped with a finalizing supermajority link to its
child \mathit{nc}. This is a constructive existence proof:
the state \sigma' and the blocks \mathit{nf}, \mathit{nc}
are explicitly assembled from the existing state, not merely
asserted to exist. The construction produces a 1-finalization
(the simplest case of k_finalized at k = 1).
Proof idea
Let H = \operatorname{highest\_target}(\sigma).
-
highest_existsproduces the unique highest justified block(jm, jmh)withjmh \le H(justified_height_le_highest_target). -
blocks_exist_extract_new_final_pairextracts two blocks\mathit{nf}, \mathit{nc}withjm \xrightarrow{H + 1 - jmh} \mathit{nf}and\mathit{nf} \to \mathit{nc}in the block tree. -
two_thirds_goodsupplies two fresh\frac{2}{3}-quorumsq_f \subseteq V(\mathit{nf})andq_c \subseteq V(\mathit{nc}), each consisting of unslashed validators. -
The extended state is
\sigma' = (\sigma \uplus V_1) \uplus V_2whereV_1 = \operatorname{votes\_for\_link}(q_f, jm, \mathit{nf}, jmh, H{+}1)andV_2 = \operatorname{votes\_for\_link}(q_c, \mathit{nf}, \mathit{nc}, H{+}1, H{+}2). -
Verify the five conjuncts:
-
unslashed_can_extend— each new voter is unslashed in\sigma(unslashed_can_extend_two_vote_sets); -
no_new_slashed— the two new links at heightsH{+}1andH{+}2cannot create a double vote or surround vote with old votes whose target heights are\le H(no_new_slashed_two_link_extension); -
justification of
\mathit{nf}at heightH{+}1— carryjm's justification from\sigmato\sigma'viajustified_weaken, then applyjustified_linkwith the first supermajority link (built bysupermajority_link_of_quorum_votesfromq_f); -
parent edge
\mathit{nf} \to \mathit{nc}— from step 2; -
finalizing supermajority link from
(\mathit{nf}, H{+}1)to(\mathit{nc}, H{+}2)— built by a second application ofsupermajority_link_of_quorum_votesfromq_c.
-
Assumptions
-
QuorumContext— quorum nonemptiness; -
two_thirds_good— fresh unslashed quorums exist at each block; -
\neg\,\operatorname{q\_intersection\_slashed}— no slashing in\sigma(used byhighest_existsfor uniqueness); -
good_votes— quorum voters have justified sources and forward links (used byhighest_existsandno_new_slashed_two_link_extension); -
votes_from_target_vset_property— vote well-formedness of\sigma(used byjustified_weakenandsupermajority_link_of_quorum_votes); -
block-existence hypothesis — blocks at arbitrarily large heights above the highest justified block (used by
blocks_exist_extract_new_final_pair).
Non-assumptions
-
no assumption about the content of
\sigmabeyond the standing hypotheses — the construction works regardless of how many votes or links the state already contains; -
the new finalized block
\mathit{nf}is not assumed to be previously known or justified — its justification is constructed in the proof; -
no specific value of
Horjmhis required — the proof adapts to whatever the current highest target and highest justified height happen to be.
theorem plausible_liveness_construct_extension
(τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator)
(parent : HashParent Hash)
(genesis : Hash) (st : State Validator Hash)
(qctx : QuorumContext τ stake vset)
(htwothirds : two_thirds_good τ stake vset st)
(hunslashed : ¬ q_intersection_slashed τ stake vset st)
(hgood : good_votes τ stake vset parent genesis st)
(hwf_st : votes_from_target_vset_property vset st)
(hheight : ∀ b b_h,
highest_justified τ stake vset parent genesis st b b_h →
blocks_exist_high_over parent b) :
∃ st' : State Validator Hash,
unslashed_can_extend st st' ∧
no_new_slashed st st' ∧
∃ nf nc : Hash, ∃ nh : Nat,
justified τ stake vset parent genesis st' nf nh ∧
parent nf nc ∧
supermajority_link τ stake vset st' nf nc nh (nh + 1) :=
match highest_exists τ stake vset parent genesis st qctx hunslashed hgood with
| ⟨jm, jmh, hjm_j, hjm_high⟩ =>
have hjmh_le : jmh ≤ highest_target st :=
justified_height_le_highest_target τ stake vset parent genesis st qctx hjm_j
match blocks_exist_extract_new_final_pair parent st
(hheight jm jmh hjm_high) hjmh_le with
| ⟨nf, nc, hnth, hpar⟩ =>
match htwothirds nf, htwothirds nc with
| ⟨qf, hqf, hunsf⟩, ⟨qc, hqc, hunsc⟩ =>
match hqf, hqc with
| ⟨hqf_sub, _⟩, ⟨hqc_sub, _⟩ =>
have hsub : ∀ vote, vote ∈ st → vote ∈
extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1)) :=
fun _ h => old_votes_subset_extended h
have hwf' : votes_from_target_vset_property vset
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1))) :=
votes_from_target_vset_extend_two_vote_sets vset hwf_st hqf_sub hqc_sub
have huce : unslashed_can_extend st
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1))) :=
unslashed_can_extend_two_vote_sets hunsf hunsc
have hNoNew : no_new_slashed st
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1))) :=
no_new_slashed_two_link_extension τ stake vset parent genesis
(highest_target_is_bound st)
(fun hj => justified_height_le_highest_target τ stake vset parent genesis st qctx hj)
hjm_high hgood hqf hqc hjmh_le
have hjm' : justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1)))
jm jmh :=
justified_weaken τ stake vset parent genesis hsub hwf' hjm_j
have hv1_sub : votes_for_link qf jm nf jmh (highest_target st + 1) ⊆
extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1)) :=
fun _ h => first_new_votes_subset_extended h
have hsm1 : supermajority_link τ stake vset
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1)))
jm nf jmh (highest_target st + 1) :=
supermajority_link_of_quorum_votes τ stake vset hqf hv1_sub hwf'
have hfwd : jmh < highest_target st + 1 := height_lt_highest_target_succ st hjmh_le
have hjnf : justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1)))
nf (highest_target st + 1) :=
justified.justified_link hjm' ⟨hfwd, hnth, hsm1⟩
have hv2_sub : votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1) ⊆
extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1)) :=
fun _ h => second_new_votes_subset_extended h
have hsm2 : supermajority_link τ stake vset
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (highest_target st + 1))
(votes_for_link qc nf nc (highest_target st + 1) (highest_target st + 1 + 1)))
nf nc (highest_target st + 1) (highest_target st + 1 + 1) :=
supermajority_link_of_quorum_votes τ stake vset hqc hv2_sub hwf'
⟨_, huce, hNoNew, nf, nc, highest_target st + 1, hjnf, hpar, hsm2⟩plausible_liveness_construct_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10 │ │ st ├ State
Validator Hash
11 │ │ qctx ├ QuorumContext
τ stake vset
12 │ │ htwothirds ├ two_thirds_good
τ stake vset st
13 │ │ hunslashed ├ Not
(q_intersection_slashed τ stake vset st)
14 │ │ hgood ├ good_votes
τ stake vset parent genesis st
15 │ │ hwf_st ├ votes_from_target_vset_property
vset st
16 │ │ hheight ├ ∀
(b : Hash) (b_h : Nat), highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b
17 │11,13,14 │ highest_exists │ Exists
fun (b : Hash) =>
Exists fun (b_h : Nat) =>
And (justified τ stake vset parent genesis st b b_h) (highest_justified τ stake vset parent genesis st b b_h)
18 │ │ jm │ ┌ Hash
19 │ │ jmh │ ├ Nat
20 │ │ hjm_j │ ├ justified
τ stake vset parent genesis st jm jmh
21 │ │ hjm_high │ ├ highest_justified
τ stake vset parent genesis st jm jmh
22 │11,20 │ justified_height_le_highest_target │ │ LE.le jmh
(highest_target st)
24 │16,21 │ ∀E │ │ blocks_exist_high_over
parent jm
25 │24,22 │ blocks_exist_extract_new_final_pair │ │ Exists
fun (new_finalized : Hash) =>
Exists fun (new_final_child : Hash) =>
And (nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm new_finalized)
(parent new_finalized new_final_child)
26 │ │ nf │ │ ┌ Hash
27 │ │ nc │ │ ├ Hash
28 │ │ hnth │ │ ├ nth_ancestor
parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf
29 │ │ hpar │ │ ├ parent
nf nc
30 │12 │ ∀E │ │ │ Exists
fun (q2 : Finset Validator) =>
And (quorum_2 τ stake vset q2 nf) (∀ (v : Validator), Membership.mem q2 v → Not (slashed st v))
31 │12 │ ∀E │ │ │ Exists
fun (q2 : Finset Validator) =>
And (quorum_2 τ stake vset q2 nc) (∀ (v : Validator), Membership.mem q2 v → Not (slashed st v))
32 │ │ qf │ │ │ ┌ Finset
Validator
33 │ │ hqf │ │ │ ├ quorum_2
τ stake vset qf nf
34 │ │ hunsf │ │ │ ├ ∀
(v : Validator), Membership.mem qf v → Not (slashed st v)
35 │ │ qc │ │ │ ├ Finset
Validator
36 │ │ hqc │ │ │ ├ quorum_2
τ stake vset qc nc
37 │ │ hunsc │ │ │ ├ ∀
(v : Validator), Membership.mem qc v → Not (slashed st v)
38 │ │ hqf_sub │ │ │ │ ┌ Subset
qf (vset nf)
39 │ │ right✝¹ │ │ │ │ ├ LE.le
(Threshold.two_third τ (wt stake (vset nf))) (wt stake qf)
40 │ │ hqc_sub │ │ │ │ ├ Subset
qc (vset nc)
41 │ │ right✝ │ │ │ │ ├ LE.le
(Threshold.two_third τ (wt stake (vset nc))) (wt stake qc)
42 │ │ x✝ │ │ │ │ │ ┌ Vote
Validator Hash
43 │ │ h │ │ │ │ │ ├ Membership.mem
st x✝
44 │43 │ old_votes_subset_extended │ │ │ │ │ │ Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x✝
45 │42,43,44 │ ∀I │ │ │ │ │ ∀
(x : Vote Validator Hash),
Membership.mem st x →
Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x
47 │ │ x✝ │ │ │ │ │ ┌ Validator
48 │ │ s✝ │ │ │ │ │ ├ Hash
49 │ │ t✝ │ │ │ │ │ ├ Hash
50 │ │ s_h✝ │ │ │ │ │ ├ Nat
51 │ │ t_h✝ │ │ │ │ │ ├ Nat
52 │ │ x✝ │ │ │ │ │ │ ┌ Validator
53 │ │ s✝ │ │ │ │ │ │ ├ Hash
54 │ │ t✝ │ │ │ │ │ │ ├ Hash
55 │ │ s_h✝ │ │ │ │ │ │ ├ Nat
56 │ │ t_h✝ │ │ │ │ │ │ ├ Nat
57 │15 │ ∀E │ │ │ │ │ │ │ Membership.mem
(link_supporters st s✝ t✝ s_h✝ t_h✝) x✝ →
Membership.mem (vset t✝) x✝
58 │52,53,54,55,56,57 │ ∀I │ │ │ │ │ │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem (link_supporters st s t s_h t_h) x → Membership.mem (vset t) x
59 │58,38,40 │ votes_from_target_vset_extend_two_vote_sets │ │ │ │ │ │ Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s✝ t✝ s_h✝ t_h✝)
x✝ →
Membership.mem (vset t✝) x✝
60 │47,48,49,50,51,59 │ ∀I │ │ │ │ │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s t s_h t_h)
x →
Membership.mem (vset t) x
62 │34,37 │ unslashed_can_extend_two_vote_sets │ │ │ │ │ unslashed_can_extend
st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
64 │ │ highest_target_is_bound │ │ │ │ │ target_height_bound
st (highest_target st)
65 │ │ b✝ │ │ │ │ │ ┌ Hash
66 │ │ h✝ │ │ │ │ │ ├ Nat
67 │ │ hj │ │ │ │ │ ├ justified
τ stake vset parent genesis st b✝ h✝
68 │11,67 │ justified_height_le_highest_target │ │ │ │ │ │ LE.le h✝
(highest_target st)
69 │65,66,67,68 │ ∀I │ │ │ │ │ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h (highest_target st)
70 │64,69,21,14,33,36,22 │ no_new_slashed_two_link_extension │ │ │ │ │ no_new_slashed
st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (highest_target st) (2 : Nat))))
72 │ │ x✝ │ │ │ │ │ ┌ Validator
73 │ │ s✝ │ │ │ │ │ ├ Hash
74 │ │ t✝ │ │ │ │ │ ├ Hash
75 │ │ s_h✝ │ │ │ │ │ ├ Nat
76 │ │ t_h✝ │ │ │ │ │ ├ Nat
77 │60 │ ∀E │ │ │ │ │ │ Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s✝ t✝ s_h✝ t_h✝)
x✝ →
Membership.mem (vset t✝) x✝
78 │72,73,74,75,76,77 │ ∀I │ │ │ │ │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s t s_h t_h)
x →
Membership.mem (vset t) x
79 │45,78,20 │ justified_weaken │ │ │ │ │ justified τ
stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm jmh
81 │ │ x✝ │ │ │ │ │ ┌ Vote
Validator Hash
82 │ │ h │ │ │ │ │ ├ Membership.mem
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))) x✝
83 │82 │ first_new_votes_subset_extended │ │ │ │ │ │ Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x✝
84 │81,82,83 │ ∀I │ │ │ │ │ ∀
(x : Vote Validator Hash),
Membership.mem (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))) x →
Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x
86 │33,84,78 │ supermajority_link_of_quorum_votes │ │ │ │ │ supermajority_link
τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))
88 │22 │ height_lt_highest_target_succ │ │ │ │ │ LT.lt jmh
(HAdd.hAdd (highest_target st) (1 : Nat))
90 │28,86 │ And.intro │ │ │ │ │ And
(nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
91 │88,90 │ And.intro │ │ │ │ │ And
(LT.lt jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(And (nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))))
92 │79,91 │ justified.justified_link │ │ │ │ │ justified τ
stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf (HAdd.hAdd (highest_target st) (1 : Nat))
94 │ │ x✝ │ │ │ │ │ ┌ Vote
Validator Hash
95 │ │ h │ │ │ │ │ ├ Membership.mem
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))
x✝
96 │95 │ second_new_votes_subset_extended │ │ │ │ │ │ Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x✝
97 │94,95,96 │ ∀I │ │ │ │ │ ∀
(x : Vote Validator Hash),
Membership.mem
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))
x →
Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x
99 │36,97,78 │ supermajority_link_of_quorum_votes │ │ │ │ │ supermajority_link
τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))
101│29,99 │ And.intro │ │ │ │ │ And
(parent nf nc)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))
102│92,101 │ And.intro │ │ │ │ │ And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf (HAdd.hAdd (highest_target st) (1 : Nat)))
(And (parent nf nc)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
103│102 │ Exists.intro │ │ │ │ │ Exists
fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc nh (HAdd.hAdd nh (1 : Nat))))
104│103 │ Exists.intro │ │ │ │ │ Exists
fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nh)
(And (parent nf nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc_1 nh (HAdd.hAdd nh (1 : Nat))))
105│104 │ Exists.intro │ │ │ │ │ Exists
fun (nf_1 : Hash) =>
Exists fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nh)
(And (parent nf_1 nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nc_1 nh (HAdd.hAdd nh (1 : Nat))))
106│70,105 │ And.intro │ │ │ │ │ And
(no_new_slashed st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))))
(Exists fun (nf_1 : Hash) =>
Exists fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nh)
(And (parent nf_1 nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nc_1 nh (HAdd.hAdd nh (1 : Nat)))))
107│62,106 │ And.intro │ │ │ │ │ And
(unslashed_can_extend st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))))
(And
(no_new_slashed st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))))
(Exists fun (nf_1 : Hash) =>
Exists fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nh)
(And (parent nf_1 nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nc_1 nh (HAdd.hAdd nh (1 : Nat))))))
108│107 │ Exists.intro │ │ │ │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
109│38,39,40,41,108 │ ∀I │ │ │ │ Subset
qf (vset nf) →
LE.le (Threshold.two_third τ (wt stake (vset nf))) (wt stake qf) →
Subset qc (vset nc) →
LE.le (Threshold.two_third τ (wt stake (vset nc))) (wt stake qc) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
110│33,36,109 │ plausible_liveness_construct_extension.match_1 │ │ │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
111│32,33,34,35,36,37,110 │ ∀I │ │ │ ∀
(qf : Finset Validator),
quorum_2 τ stake vset qf nf →
(∀ (v : Validator), Membership.mem qf v → Not (slashed st v)) →
∀ (qc : Finset Validator),
quorum_2 τ stake vset qc nc →
(∀ (v : Validator), Membership.mem qc v → Not (slashed st v)) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
112│30,31,111 │ plausible_liveness_construct_extension.match_2 │ │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
113│26,27,28,29,112 │ ∀I │ │ ∀
(nf nc : Hash),
nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf →
parent nf nc →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
114│25,113 │ plausible_liveness_construct_extension.match_3 │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
115│18,19,20,21,114 │ ∀I │ ∀
(jm : Hash) (jmh : Nat),
justified τ stake vset parent genesis st jm jmh →
highest_justified τ stake vset parent genesis st jm jmh →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
116│17,115 │ plausible_liveness_construct_extension.match_4 │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
117│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,116│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
#detail_explode plausible_liveness_construct_extensionplausible_liveness_construct_extension : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
0 │ │ Validator ├ Type
u
1 │ │ Hash ├ Type
v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10 │ │ st ├ State
Validator Hash
11 │ │ qctx ├ QuorumContext
τ stake vset
12 │ │ htwothirds ├ two_thirds_good
τ stake vset st
13 │ │ hunslashed ├ Not
(q_intersection_slashed τ stake vset st)
14 │ │ hgood ├ good_votes
τ stake vset parent genesis st
15 │ │ hwf_st ├ votes_from_target_vset_property
vset st
16 │ │ hheight ├ ∀
(b : Hash) (b_h : Nat), highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b
17 │11,13,14 │ highest_exists │ Exists
fun (b : Hash) =>
Exists fun (b_h : Nat) =>
And (justified τ stake vset parent genesis st b b_h) (highest_justified τ stake vset parent genesis st b b_h)
18 │ │ jm │ ┌ Hash
19 │ │ jmh │ ├ Nat
20 │ │ hjm_j │ ├ justified
τ stake vset parent genesis st jm jmh
21 │ │ hjm_high │ ├ highest_justified
τ stake vset parent genesis st jm jmh
22 │11,20 │ justified_height_le_highest_target │ │ LE.le jmh
(highest_target st)
24 │16,21 │ ∀E │ │ blocks_exist_high_over
parent jm
25 │24,22 │ blocks_exist_extract_new_final_pair │ │ Exists
fun (new_finalized : Hash) =>
Exists fun (new_final_child : Hash) =>
And (nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm new_finalized)
(parent new_finalized new_final_child)
26 │ │ nf │ │ ┌ Hash
27 │ │ nc │ │ ├ Hash
28 │ │ hnth │ │ ├ nth_ancestor
parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf
29 │ │ hpar │ │ ├ parent
nf nc
30 │12 │ ∀E │ │ │ Exists
fun (q2 : Finset Validator) =>
And (quorum_2 τ stake vset q2 nf) (∀ (v : Validator), Membership.mem q2 v → Not (slashed st v))
31 │12 │ ∀E │ │ │ Exists
fun (q2 : Finset Validator) =>
And (quorum_2 τ stake vset q2 nc) (∀ (v : Validator), Membership.mem q2 v → Not (slashed st v))
32 │ │ qf │ │ │ ┌ Finset
Validator
33 │ │ hqf │ │ │ ├ quorum_2
τ stake vset qf nf
34 │ │ hunsf │ │ │ ├ ∀
(v : Validator), Membership.mem qf v → Not (slashed st v)
35 │ │ qc │ │ │ ├ Finset
Validator
36 │ │ hqc │ │ │ ├ quorum_2
τ stake vset qc nc
37 │ │ hunsc │ │ │ ├ ∀
(v : Validator), Membership.mem qc v → Not (slashed st v)
38 │ │ hqf_sub │ │ │ │ ┌ Subset
qf (vset nf)
39 │ │ right✝¹ │ │ │ │ ├ LE.le
(Threshold.two_third τ (wt stake (vset nf))) (wt stake qf)
40 │ │ hqc_sub │ │ │ │ ├ Subset
qc (vset nc)
41 │ │ right✝ │ │ │ │ ├ LE.le
(Threshold.two_third τ (wt stake (vset nc))) (wt stake qc)
42 │ │ x✝ │ │ │ │ │ ┌ Vote
Validator Hash
43 │ │ h │ │ │ │ │ ├ Membership.mem
st x✝
44 │43 │ old_votes_subset_extended │ │ │ │ │ │ Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x✝
45 │42,43,44 │ ∀I │ │ │ │ │ ∀
(x : Vote Validator Hash),
Membership.mem st x →
Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x
47 │ │ x✝ │ │ │ │ │ ┌ Validator
48 │ │ s✝ │ │ │ │ │ ├ Hash
49 │ │ t✝ │ │ │ │ │ ├ Hash
50 │ │ s_h✝ │ │ │ │ │ ├ Nat
51 │ │ t_h✝ │ │ │ │ │ ├ Nat
52 │ │ x✝ │ │ │ │ │ │ ┌ Validator
53 │ │ s✝ │ │ │ │ │ │ ├ Hash
54 │ │ t✝ │ │ │ │ │ │ ├ Hash
55 │ │ s_h✝ │ │ │ │ │ │ ├ Nat
56 │ │ t_h✝ │ │ │ │ │ │ ├ Nat
57 │15 │ ∀E │ │ │ │ │ │ │ Membership.mem
(link_supporters st s✝ t✝ s_h✝ t_h✝) x✝ →
Membership.mem (vset t✝) x✝
58 │52,53,54,55,56,57 │ ∀I │ │ │ │ │ │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem (link_supporters st s t s_h t_h) x → Membership.mem (vset t) x
59 │58,38,40 │ votes_from_target_vset_extend_two_vote_sets │ │ │ │ │ │ Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s✝ t✝ s_h✝ t_h✝)
x✝ →
Membership.mem (vset t✝) x✝
60 │47,48,49,50,51,59 │ ∀I │ │ │ │ │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s t s_h t_h)
x →
Membership.mem (vset t) x
62 │34,37 │ unslashed_can_extend_two_vote_sets │ │ │ │ │ unslashed_can_extend
st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
64 │ │ highest_target_is_bound │ │ │ │ │ target_height_bound
st (highest_target st)
65 │ │ b✝ │ │ │ │ │ ┌ Hash
66 │ │ h✝ │ │ │ │ │ ├ Nat
67 │ │ hj │ │ │ │ │ ├ justified
τ stake vset parent genesis st b✝ h✝
68 │11,67 │ justified_height_le_highest_target │ │ │ │ │ │ LE.le h✝
(highest_target st)
69 │65,66,67,68 │ ∀I │ │ │ │ │ ∀
{b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h → LE.le h (highest_target st)
70 │64,69,21,14,33,36,22 │ no_new_slashed_two_link_extension │ │ │ │ │ no_new_slashed
st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (highest_target st) (2 : Nat))))
72 │ │ x✝ │ │ │ │ │ ┌ Validator
73 │ │ s✝ │ │ │ │ │ ├ Hash
74 │ │ t✝ │ │ │ │ │ ├ Hash
75 │ │ s_h✝ │ │ │ │ │ ├ Nat
76 │ │ t_h✝ │ │ │ │ │ ├ Nat
77 │60 │ ∀E │ │ │ │ │ │ Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s✝ t✝ s_h✝ t_h✝)
x✝ →
Membership.mem (vset t✝) x✝
78 │72,73,74,75,76,77 │ ∀I │ │ │ │ │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem
(link_supporters
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
s t s_h t_h)
x →
Membership.mem (vset t) x
79 │45,78,20 │ justified_weaken │ │ │ │ │ justified τ
stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm jmh
81 │ │ x✝ │ │ │ │ │ ┌ Vote
Validator Hash
82 │ │ h │ │ │ │ │ ├ Membership.mem
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))) x✝
83 │82 │ first_new_votes_subset_extended │ │ │ │ │ │ Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x✝
84 │81,82,83 │ ∀I │ │ │ │ │ ∀
(x : Vote Validator Hash),
Membership.mem (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))) x →
Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x
86 │33,84,78 │ supermajority_link_of_quorum_votes │ │ │ │ │ supermajority_link
τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))
88 │22 │ height_lt_highest_target_succ │ │ │ │ │ LT.lt jmh
(HAdd.hAdd (highest_target st) (1 : Nat))
90 │28,86 │ And.intro │ │ │ │ │ And
(nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
91 │88,90 │ And.intro │ │ │ │ │ And
(LT.lt jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(And (nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat))))
92 │79,91 │ justified.justified_link │ │ │ │ │ justified τ
stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf (HAdd.hAdd (highest_target st) (1 : Nat))
94 │ │ x✝ │ │ │ │ │ ┌ Vote
Validator Hash
95 │ │ h │ │ │ │ │ ├ Membership.mem
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))
x✝
96 │95 │ second_new_votes_subset_extended │ │ │ │ │ │ Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x✝
97 │94,95,96 │ ∀I │ │ │ │ │ ∀
(x : Vote Validator Hash),
Membership.mem
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))
x →
Membership.mem
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
x
99 │36,97,78 │ supermajority_link_of_quorum_votes │ │ │ │ │ supermajority_link
τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))
101│29,99 │ And.intro │ │ │ │ │ And
(parent nf nc)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))
102│92,101 │ And.intro │ │ │ │ │ And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf (HAdd.hAdd (highest_target st) (1 : Nat)))
(And (parent nf nc)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc (HAdd.hAdd (highest_target st) (1 : Nat)) (HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
103│102 │ Exists.intro │ │ │ │ │ Exists
fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc nh (HAdd.hAdd nh (1 : Nat))))
104│103 │ Exists.intro │ │ │ │ │ Exists
fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nh)
(And (parent nf nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf nc_1 nh (HAdd.hAdd nh (1 : Nat))))
105│104 │ Exists.intro │ │ │ │ │ Exists
fun (nf_1 : Hash) =>
Exists fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nh)
(And (parent nf_1 nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nc_1 nh (HAdd.hAdd nh (1 : Nat))))
106│70,105 │ And.intro │ │ │ │ │ And
(no_new_slashed st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))))
(Exists fun (nf_1 : Hash) =>
Exists fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nh)
(And (parent nf_1 nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nc_1 nh (HAdd.hAdd nh (1 : Nat)))))
107│62,106 │ And.intro │ │ │ │ │ And
(unslashed_can_extend st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))))
(And
(no_new_slashed st
(extend_state_with_two_vote_sets st (votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat)))))
(Exists fun (nf_1 : Hash) =>
Exists fun (nc_1 : Hash) =>
Exists fun (nh : Nat) =>
And
(justified τ stake vset parent genesis
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nh)
(And (parent nf_1 nc_1)
(supermajority_link τ stake vset
(extend_state_with_two_vote_sets st
(votes_for_link qf jm nf jmh (HAdd.hAdd (highest_target st) (1 : Nat)))
(votes_for_link qc nf nc (HAdd.hAdd (highest_target st) (1 : Nat))
(HAdd.hAdd (HAdd.hAdd (highest_target st) (1 : Nat)) (1 : Nat))))
nf_1 nc_1 nh (HAdd.hAdd nh (1 : Nat))))))
108│107 │ Exists.intro │ │ │ │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
109│38,39,40,41,108 │ ∀I │ │ │ │ Subset
qf (vset nf) →
LE.le (Threshold.two_third τ (wt stake (vset nf))) (wt stake qf) →
Subset qc (vset nc) →
LE.le (Threshold.two_third τ (wt stake (vset nc))) (wt stake qc) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
110│33,36,109 │ plausible_liveness_construct_extension.match_1 │ │ │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
111│32,33,34,35,36,37,110 │ ∀I │ │ │ ∀
(qf : Finset Validator),
quorum_2 τ stake vset qf nf →
(∀ (v : Validator), Membership.mem qf v → Not (slashed st v)) →
∀ (qc : Finset Validator),
quorum_2 τ stake vset qc nc →
(∀ (v : Validator), Membership.mem qc v → Not (slashed st v)) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
112│30,31,111 │ plausible_liveness_construct_extension.match_2 │ │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
113│26,27,28,29,112 │ ∀I │ │ ∀
(nf nc : Hash),
nth_ancestor parent (HSub.hSub (HAdd.hAdd (highest_target st) (1 : Nat)) jmh) jm nf →
parent nf nc →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
114│25,113 │ plausible_liveness_construct_extension.match_3 │ │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
115│18,19,20,21,114 │ ∀I │ ∀
(jm : Hash) (jmh : Nat),
justified τ stake vset parent genesis st jm jmh →
highest_justified τ stake vset parent genesis st jm jmh →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
116│17,115 │ plausible_liveness_construct_extension.match_4 │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
117│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,116│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
Plausible liveness (Coq-compatible block-existence hypothesis)
Statement
The same conclusion as
plausible_liveness_construct_extension — existence of an
extended state with no new slashing, a justified new finalized
block, and a finalizing supermajority link — but with the
block-existence hypothesis stated in the Coq-faithful form
blocks_exist_high_over_coq rather than the corrected
blocks_exist_high_over.
Interpretation
A compatibility wrapper: the Coq formulation of block existence
places the height guard 1 < n inside the existential, making it
unsatisfiable as written (see
not_blocks_exist_high_over_coq). Nevertheless, this
theorem accepts the Coq predicate as input and converts it via
blocks_exist_high_over_of_coq before delegating to the
main construction. This preserves a faithful interface for
comparison with the Coq development while using the corrected
formulation internally.
Non-assumptions
All hypotheses are identical to those of
plausible_liveness_construct_extension except for the
block-existence predicate. In particular, no additional
assumptions are introduced by the Coq-compatibility wrapping.
theorem plausible_liveness_from_coq_blocks_exist
(τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator)
(parent : HashParent Hash)
(genesis : Hash) (st : State Validator Hash)
(qctx : QuorumContext τ stake vset)
(htwothirds : two_thirds_good τ stake vset st)
(hunslashed : ¬ q_intersection_slashed τ stake vset st)
(hgood : good_votes τ stake vset parent genesis st)
(hwf_st : votes_from_target_vset_property vset st)
(hheight : ∀ b b_h,
highest_justified τ stake vset parent genesis st b b_h →
blocks_exist_high_over_coq parent b) :
∃ st' : State Validator Hash,
unslashed_can_extend st st' ∧
no_new_slashed st st' ∧
∃ nf nc : Hash, ∃ nh : Nat,
justified τ stake vset parent genesis st' nf nh ∧
parent nf nc ∧
supermajority_link τ stake vset st' nf nc nh (nh + 1) :=
plausible_liveness_construct_extension
τ stake vset parent genesis st qctx htwothirds hunslashed hgood hwf_st
(fun b b_h hh => blocks_exist_high_over_of_coq (hheight b b_h hh))plausible_liveness_from_coq_blocks_exist : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over_coq parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
0 │ │ Validator ├ Type u
1 │ │ Hash ├ Type v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10│ │ st ├ State
Validator Hash
11│ │ qctx ├ QuorumContext
τ stake vset
12│ │ htwothirds ├ two_thirds_good
τ stake vset st
13│ │ hunslashed ├ Not
(q_intersection_slashed τ stake vset st)
14│ │ hgood ├ good_votes
τ stake vset parent genesis st
15│ │ hwf_st ├ votes_from_target_vset_property
vset st
16│ │ hheight ├ ∀
(b : Hash) (b_h : Nat), highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over_coq parent b
17│ │ x✝ │ ┌ Validator
18│ │ s✝ │ ├ Hash
19│ │ t✝ │ ├ Hash
20│ │ s_h✝ │ ├ Nat
21│ │ t_h✝ │ ├ Nat
22│15 │ ∀E │ │ Membership.mem
(link_supporters st s✝ t✝ s_h✝ t_h✝) x✝ →
Membership.mem (vset t✝) x✝
23│17,18,19,20,21,22 │ ∀I │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem (link_supporters st s t s_h t_h) x → Membership.mem (vset t) x
24│ │ b │ ┌ Hash
25│ │ b_h │ ├ Nat
26│ │ hh │ ├ highest_justified
τ stake vset parent genesis st b b_h
27│16,26 │ ∀E │ │ blocks_exist_high_over_coq
parent b
28│27 │ blocks_exist_high_over_of_coq │ │ blocks_exist_high_over parent
b
29│24,25,26,28 │ ∀I │ ∀
(b : Hash) (b_h : Nat), highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b
30│11,12,13,14,23,29 │ plausible_liveness_construct_extension │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
31│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,30│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over_coq parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
#detail_explode plausible_liveness_from_coq_blocks_existplausible_liveness_from_coq_blocks_exist : ∀ {Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator]
[inst_1 : DecidableEq Hash] [inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat)
(vset : Hash → Finset Validator) (parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over_coq parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
0 │ │ Validator ├ Type u
1 │ │ Hash ├ Type v
2 │ │ inst✝² ├ DecidableEq
Validator
3 │ │ inst✝¹ ├ DecidableEq
Hash
4 │ │ inst✝ ├ Fintype
Validator
5 │ │ τ ├ Threshold
6 │ │ stake ├ Validator →
Nat
7 │ │ vset ├ Hash →
Finset Validator
8 │ │ parent ├ HashParent
Hash
9 │ │ genesis ├ Hash
10│ │ st ├ State
Validator Hash
11│ │ qctx ├ QuorumContext
τ stake vset
12│ │ htwothirds ├ two_thirds_good
τ stake vset st
13│ │ hunslashed ├ Not
(q_intersection_slashed τ stake vset st)
14│ │ hgood ├ good_votes
τ stake vset parent genesis st
15│ │ hwf_st ├ votes_from_target_vset_property
vset st
16│ │ hheight ├ ∀
(b : Hash) (b_h : Nat), highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over_coq parent b
17│ │ x✝ │ ┌ Validator
18│ │ s✝ │ ├ Hash
19│ │ t✝ │ ├ Hash
20│ │ s_h✝ │ ├ Nat
21│ │ t_h✝ │ ├ Nat
22│15 │ ∀E │ │ Membership.mem
(link_supporters st s✝ t✝ s_h✝ t_h✝) x✝ →
Membership.mem (vset t✝) x✝
23│17,18,19,20,21,22 │ ∀I │ ∀
{x : Validator} {s t : Hash} {s_h t_h : Nat},
Membership.mem (link_supporters st s t s_h t_h) x → Membership.mem (vset t) x
24│ │ b │ ┌ Hash
25│ │ b_h │ ├ Nat
26│ │ hh │ ├ highest_justified
τ stake vset parent genesis st b b_h
27│16,26 │ ∀E │ │ blocks_exist_high_over_coq
parent b
28│27 │ blocks_exist_high_over_of_coq │ │ blocks_exist_high_over parent
b
29│24,25,26,28 │ ∀I │ ∀
(b : Hash) (b_h : Nat), highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over parent b
30│11,12,13,14,23,29 │ plausible_liveness_construct_extension │ Exists
fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc) (supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))
31│0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,30│ ∀I │ ∀
{Validator : Type u} {Hash : Type v} [inst : DecidableEq Validator] [inst_1 : DecidableEq Hash]
[inst_2 : Fintype Validator] (τ : Threshold) (stake : Validator → Nat) (vset : Hash → Finset Validator)
(parent : HashParent Hash) (genesis : Hash) (st : State Validator Hash),
QuorumContext τ stake vset →
two_thirds_good τ stake vset st →
Not (q_intersection_slashed τ stake vset st) →
good_votes τ stake vset parent genesis st →
votes_from_target_vset_property vset st →
(∀ (b : Hash) (b_h : Nat),
highest_justified τ stake vset parent genesis st b b_h → blocks_exist_high_over_coq parent b) →
Exists fun (st' : State Validator Hash) =>
And (unslashed_can_extend st st')
(And (no_new_slashed st st')
(Exists fun (nf : Hash) =>
Exists fun (nc : Hash) =>
Exists fun (nh : Nat) =>
And (justified τ stake vset parent genesis st' nf nh)
(And (parent nf nc)
(supermajority_link τ stake vset st' nf nc nh (HAdd.hAdd nh (1 : Nat))))))