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:

  1. 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 heights H + 1 and H + 2 (where H = \operatorname{highest\_target}(\sigma)) cannot create any new double-vote or surround-vote violation. The proof is a 3 \times 3 case 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 heights H + 1, H + 2 are 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)).

  2. Extension construction (plausible_liveness_construct_extension): assembles the extended state \sigma' from the highest justified block, two fresh quorums from two_thirds_good, and two new supermajority links built by supermajority_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 height H + 1, and the finalizing link goes from (\mathit{nf}, H{+}1) to (\mathit{nc}, H{+}2), matching the definition of finalized at depth k = 1.

  3. Coq-compatible wrapper (plausible_liveness_from_coq_blocks_exist): replaces the corrected block-existence hypothesis with the Coq-faithful one via blocks_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 => hlt
lt_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 65,4 ∀I (_ : Unit), LT.lt a b 73,6 lt_of_eq_left.match_1 LT.lt c b 80,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_left
lt_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
65,4        ∀I                                            (_ : Unit), LT.lt a b
73,6        lt_of_eq_left.match_1 LT.lt c b
80,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 => hlt
lt_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 65,4 ∀I (_ : Unit), LT.lt a b 73,6 lt_of_eq_left.match_1 LT.lt a c 80,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_right
lt_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
65,4        ∀I                                            (_ : Unit), LT.lt a b
73,6        lt_of_eq_left.match_1 LT.lt a c
80,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 53,4 ∀I (_ : Unit), LE.le a a 62,5 lt_of_eq_left.match_1 LE.le b a 70,1,2,6∀I {a b : Nat}, Eq a b LE.le b a #detail_explode le_of_eq
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
53,4    ∀I                                            (_ : Unit), LE.le a a
62,5    lt_of_eq_left.match_1 LE.le b a
70,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 => hle
le_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 54,3 ∀I (_ : Unit), LE.le th H 62,5 lt_of_eq_left.match_1 LE.le (HAdd.hAdd H (1 : Nat)) H 70,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_one
le_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
54,3      ∀I                                            (_ : Unit), LE.le th H
62,5      lt_of_eq_left.match_1 LE.le (HAdd.hAdd H (1 : Nat)) H
70,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 => hle
le_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 54,3 ∀I (_ : Unit), LE.le th H 62,5 lt_of_eq_left.match_1 LE.le (HAdd.hAdd H (2 : Nat)) H 70,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_two
le_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
54,3      ∀I                                            (_ : Unit), LE.le th H
62,5      lt_of_eq_left.match_1 LE.le (HAdd.hAdd H (2 : Nat)) H
70,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 => rfl
eq_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 106,4,9 eq_of_eq_right.match_1 │ │ Eq a b 116,10 ∀I Eq b a Eq a b 124,5,11 eq_of_eq_right.match_2 Eq a b 130,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_right
eq_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
106,4,9         eq_of_eq_right.match_1 │ │ Eq a b
116,10          ∀I                                            Eq b a  Eq a b
124,5,11        eq_of_eq_right.match_2 Eq a b
130,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 => hz
eq_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 65,4 ∀I (_ : Unit), Eq x z 73,6 lt_of_eq_left.match_1 Eq y z 80,1,2,3,4,7∀I {x y z : Nat}, Eq x y Eq x z Eq y z #detail_explode eq_of_eq_left
eq_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
65,4        ∀I                                            (_ : Unit), Eq x z
73,6        lt_of_eq_left.match_1 Eq y z
80,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 \sigma has 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 H or H + 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_2 contradicts t_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 10099 not_add_two_le_self │ │ │ │ False 101100 False.elim │ │ │ │ slashed_double_vote st v 10297,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)) 10896,107 eq_of_eq_left │ │ │ │ Eq (HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat)) 109108 add_two_ne_add_one │ │ │ │ False 110109 False.elim │ │ │ │ slashed_double_vote st v 111103,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)) 11794,114 eq_of_eq_right │ │ │ │ Eq ta tb 11818,117 ∀E │ │ │ │ False 119118 False.elim │ │ │ │ slashed_double_vote st v 120112,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 12128,102,111,120 no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote st v 12292,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 12326,60,91,122 no_new_double_vote_two_link_extension.match_1 │ │ slashed_double_vote st v 12416,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 12515,124 no_new_double_vote_two_link_extension.match_2 slashed_double_vote st v 1260,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_extension
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
10099                                       not_add_two_le_self                           │ │ │ │ False
101100                                      False.elim                                                           │ │ │ │ slashed_double_vote
  st v
10297,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))
10896,107                                   eq_of_eq_left                                 │ │ │ │ Eq
  (HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat))
109108                                      add_two_ne_add_one                            │ │ │ │ False
110109                                      False.elim                                                           │ │ │ │ slashed_double_vote
  st v
111103,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))
11794,114                                   eq_of_eq_right                                │ │ │ │ Eq ta tb
11818,117                                   ∀E                                                                   │ │ │ │ False
119118                                      False.elim                                                           │ │ │ │ slashed_double_vote
  st v
120112,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
12128,102,111,120                           no_new_double_vote_two_link_extension.match_1 │ │ │ slashed_double_vote
  st v
12292,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
12326,60,91,122                             no_new_double_vote_two_link_extension.match_1 │ │ slashed_double_vote st
  v
12416,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
12515,124                                   no_new_double_vote_two_link_extension.match_2 slashed_double_vote st v
1260,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 \sigma has target height \le H;

  • hJustBound — justified-height bound: every justified block in \sigma has height \le H (needed for the link 2 O \times old I cell, where the inner vote's justified source height is bounded by H while the outer source height is H + 1);

  • hHighest — the block s_1 at height s_{1,h} is the unique highest justified block (needed for the link 1 O \times old 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, hq2q_1, q_2 are \frac{2}{3}-quorums at t_1, t_2 respectively;

  • hs1_les_{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+1 or H+2) exceeds the outer vote's target height (\le H), contradicting h_{t_I} < h_{t_O}.

  • link 1 O × old I: the critical cell. The outer vote is from q_1, so good_votes gives \operatorname{justified}(\sigma, \mathit{is}, \mathit{ish}) for the inner vote's source. highest_justified then forces \mathit{ish} \le s_{1,h}, but the surround's source ordering gives s_{1,h} < \mathit{ish} — a contradiction.

  • link 2 O × old I: similar, but uses hJustBound (\mathit{ish} \le H) against H + 1 < \mathit{ish} from the source ordering.

  • link 1 O × link 1 I: both source heights equal s_{1,h}, giving s_{1,h} < s_{1,h} — absurd (Nat.lt_irrefl).

  • link 2 O × link 1 I: s_{1,h} \le H combined with H + 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 + 1 or H + 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 10081,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)) 106104,37 lt_of_eq_right │ │ │ │ LT.lt osh s1_h 10779,106 lt_of_eq_left │ │ │ │ LT.lt s1_h s1_h 108107 Nat.lt_irrefl │ │ │ │ False 109108 False.elim │ │ │ │ slashed_surround_vote st v 110101,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)) 11680,38 lt_of_eq_right │ │ │ │ LT.lt ith (HAdd.hAdd H (1 : Nat)) 117115,116 lt_of_eq_left │ │ │ │ LT.lt (HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat)) 118117 not_add_two_lt_add_one │ │ │ │ False 119118 False.elim │ │ │ │ slashed_surround_vote st v 120111,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 12141,100,110,120 no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote st v 12276,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 12922,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 132130,128 ∀E │ │ │ │ │ justified τ stake vset parent genesis st is_ ish 133130,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 134129,133 no_new_surround_vote_two_link_extension.match_2 │ │ │ │ justified τ stake vset parent genesis st is_ ish 13620,134 ∀E │ │ │ │ LE.le ish H 137126,37 lt_of_eq_left │ │ │ │ LT.lt (HAdd.hAdd H (1 : Nat)) ish 138136,137 not_add_one_lt_of_le │ │ │ │ False 139138 False.elim │ │ │ │ slashed_surround_vote st v 140128,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)) 146144,37 lt_of_eq_right │ │ │ │ LT.lt osh s1_h 147126,146 lt_of_eq_left │ │ │ │ LT.lt (HAdd.hAdd H (1 : Nat)) s1_h 14825,147 not_add_one_lt_of_le │ │ │ │ False 149148 False.elim │ │ │ │ slashed_surround_vote st v 150141,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)) 156127,38 lt_of_eq_right │ │ │ │ LT.lt ith (HAdd.hAdd H (2 : Nat)) 157155,156 lt_of_eq_left │ │ │ │ LT.lt (HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (2 : Nat)) 158157 Nat.lt_irrefl │ │ │ │ False 159158 False.elim │ │ │ │ slashed_surround_vote st v 160151,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 16141,140,150,160 no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote st v 162123,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 16339,75,122,162 no_new_surround_vote_two_link_extension.match_1 │ │ slashed_surround_vote st v 16427,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 16526,164 no_new_surround_vote_two_link_extension.match_4 slashed_surround_vote st v 1660,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_extension
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
10081,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))
106104,37                                                                    lt_of_eq_right                                  │ │ │ │ LT.lt
  osh s1_h
10779,106                                                                    lt_of_eq_left                                   │ │ │ │ LT.lt
  s1_h s1_h
108107                                                                       Nat.lt_irrefl                                                          │ │ │ │ False
109108                                                                       False.elim                                                             │ │ │ │ slashed_surround_vote
  st v
110101,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))
11680,38                                                                     lt_of_eq_right                                  │ │ │ │ LT.lt
  ith (HAdd.hAdd H (1 : Nat))
117115,116                                                                   lt_of_eq_left                                   │ │ │ │ LT.lt
  (HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (1 : Nat))
118117                                                                       not_add_two_lt_add_one                          │ │ │ │ False
119118                                                                       False.elim                                                             │ │ │ │ slashed_surround_vote
  st v
120111,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
12141,100,110,120                                                            no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
  st v
12276,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
12922,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
132130,128                                                                   ∀E                                                                     │ │ │ │ │ justified
  τ stake vset parent genesis st is_ ish
133130,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
134129,133                                                                   no_new_surround_vote_two_link_extension.match_2 │ │ │ │ justified
  τ stake vset parent genesis st is_ ish
13620,134                                                                    ∀E                                                                     │ │ │ │ LE.le
  ish H
137126,37                                                                    lt_of_eq_left                                   │ │ │ │ LT.lt
  (HAdd.hAdd H (1 : Nat)) ish
138136,137                                                                   not_add_one_lt_of_le                            │ │ │ │ False
139138                                                                       False.elim                                                             │ │ │ │ slashed_surround_vote
  st v
140128,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))
146144,37                                                                    lt_of_eq_right                                  │ │ │ │ LT.lt
  osh s1_h
147126,146                                                                   lt_of_eq_left                                   │ │ │ │ LT.lt
  (HAdd.hAdd H (1 : Nat)) s1_h
14825,147                                                                    not_add_one_lt_of_le                            │ │ │ │ False
149148                                                                       False.elim                                                             │ │ │ │ slashed_surround_vote
  st v
150141,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))
156127,38                                                                    lt_of_eq_right                                  │ │ │ │ LT.lt
  ith (HAdd.hAdd H (2 : Nat))
157155,156                                                                   lt_of_eq_left                                   │ │ │ │ LT.lt
  (HAdd.hAdd H (2 : Nat)) (HAdd.hAdd H (2 : Nat))
158157                                                                       Nat.lt_irrefl                                                          │ │ │ │ False
159158                                                                       False.elim                                                             │ │ │ │ slashed_surround_vote
  st v
160151,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
16141,140,150,160                                                            no_new_surround_vote_two_link_extension.match_1 │ │ │ slashed_surround_vote
  st v
162123,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
16339,75,122,162                                                             no_new_surround_vote_two_link_extension.match_1 │ │ slashed_surround_vote
  st v
16427,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
16526,164                                                                    no_new_surround_vote_two_link_extension.match_4 slashed_surround_vote
  st v
1660,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✝ 2818,27 no_new_double_vote_two_link_extension │ │ slashed_double_vote st x✝ 2928 Or.inl │ │ Or (slashed_double_vote st x✝) (slashed_surround_vote st x✝) 3027,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 3419 ∀E │ │ │ justified τ stake vset parent genesis st b✝ h✝ LE.le h✝ H 3532,33,34 ∀I │ │ {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h LE.le h H 3618,35,20,21,22,23,24,31 no_new_surround_vote_two_link_extension │ │ slashed_surround_vote st x✝ 3736 Or.inr │ │ Or (slashed_double_vote st x✝) (slashed_surround_vote st x✝) 3831,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✝) 3926,30,38 Or.elim slashed st x✝ 400,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_extension
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✝
2818,27                                                                    no_new_double_vote_two_link_extension   │ │ slashed_double_vote
  st x✝
2928                                                                       Or.inl                                                         │ │ Or
  (slashed_double_vote st x✝) (slashed_surround_vote st x✝)
3027,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
3419                                                                       ∀E                                                             │ │ │ justified
    τ stake vset parent genesis st b✝ h✝ 
  LE.le h✝ H
3532,33,34                                                                 ∀I                                                             │ │ 
  {b : Hash} {h : Nat}, justified τ stake vset parent genesis st b h  LE.le h H
3618,35,20,21,22,23,24,31                                                  no_new_surround_vote_two_link_extension │ │ slashed_surround_vote
  st x✝
3736                                                                       Or.inr                                                         │ │ Or
  (slashed_double_vote st x✝) (slashed_surround_vote st x✝)
3831,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✝)
3926,30,38                                                                 Or.elim                                                        slashed
  st x✝
400,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).

  1. highest_exists produces the unique highest justified block (jm, jmh) with jmh \le H (justified_height_le_highest_target).

  2. blocks_exist_extract_new_final_pair extracts two blocks \mathit{nf}, \mathit{nc} with jm \xrightarrow{H + 1 - jmh} \mathit{nf} and \mathit{nf} \to \mathit{nc} in the block tree.

  3. two_thirds_good supplies two fresh \frac{2}{3}-quorums q_f \subseteq V(\mathit{nf}) and q_c \subseteq V(\mathit{nc}), each consisting of unslashed validators.

  4. The extended state is \sigma' = (\sigma \uplus V_1) \uplus V_2 where V_1 = \operatorname{votes\_for\_link}(q_f, jm, \mathit{nf}, jmh, H{+}1) and V_2 = \operatorname{votes\_for\_link}(q_c, \mathit{nf}, \mathit{nc}, H{+}1, H{+}2).

  5. 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 heights H{+}1 and H{+}2 cannot 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 height H{+}1 — carry jm's justification from \sigma to \sigma' via justified_weaken, then apply justified_link with the first supermajority link (built by supermajority_link_of_quorum_votes from q_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 of supermajority_link_of_quorum_votes from q_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 by highest_exists for uniqueness);

  • good_votes — quorum voters have justified sources and forward links (used by highest_exists and no_new_slashed_two_link_extension);

  • votes_from_target_vset_property — vote well-formedness of \sigma (used by justified_weaken and supermajority_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 \sigma beyond 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 H or jmh is 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)) 10129,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))) 10292,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)))) 103102 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)))) 104103 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)))) 105104 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)))) 10670,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))))) 10762,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)))))) 108107 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)))))) 10938,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)))))) 11033,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)))))) 11132,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)))))) 11230,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)))))) 11326,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)))))) 11425,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)))))) 11518,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)))))) 11617,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)))))) 1170,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_extension
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))
10129,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)))
10292,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))))
103102                                         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))))
104103                                         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))))
105104                                         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))))
10670,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)))))
10762,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))))))
108107                                         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))))))
10938,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))))))
11033,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))))))
11132,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))))))
11230,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))))))
11326,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))))))
11425,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))))))
11518,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))))))
11617,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))))))
1170,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 2215 ∀E │ │ Membership.mem (link_supporters st s✝ t✝ s_h✝ t_h✝) x✝ Membership.mem (vset t✝) x✝ 2317,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 2716,26 ∀E │ │ blocks_exist_high_over_coq parent b 2827 blocks_exist_high_over_of_coq │ │ blocks_exist_high_over parent b 2924,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 3011,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)))))) 310,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_exist
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
2215                                         ∀E                                                            │ │ Membership.mem
    (link_supporters st s✝ t✝ s_h✝ t_h✝) x✝ 
  Membership.mem (vset t✝) x✝
2317,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
2716,26                                      ∀E                                                            │ │ blocks_exist_high_over_coq
  parent b
2827                                         blocks_exist_high_over_of_coq          │ │ blocks_exist_high_over parent
  b
2924,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
3011,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))))))
310,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))))))