{-# OPTIONS --safe #-}
open import Prelude
open import Hash
open import Jolteon.Assumptions
module Jolteon.Properties.Steps.Certification (⋯ : _) (open Assumptions ⋯) where
open import Jolteon ⋯
open import Jolteon.Decidability.Core ⋯
open import Jolteon.Properties.Core ⋯
open import Jolteon.Properties.State ⋯
open import Jolteon.Properties.Steps.Core ⋯
open import Jolteon.Properties.Steps.Voting ⋯
open import Jolteon.Properties.Steps.Blocks ⋯
open import Jolteon.Properties.Votes ⋯
open import Jolteon.Properties.ValidQC ⋯
GCB⇒b∈ : ∀ {s} → Reachable s →
GloballyCertifiedBlockIn s b
────────────────────────────
b ∙∈ s .history
GCB⇒b∈ Rs (qc , bcert@(b≡ , _) , qc∈)
with b′ , b′∈ , b′≡ , _ ← qc∈⇒b∈ Rs (¬certified-by-genesis {qc = qc} bcert) qc∈
with refl ← ♯-inj {y = b′} (trans (sym b≡) b′≡)
= b′∈
GCB⇒qc∈ : ∀ {s} → Reachable s →
GloballyCertifiedBlockIn s b
────────────────────────────
b .blockQC ∙∈ s .history
GCB⇒qc∈ Rs = b∈⇒qc∈ ∘ GCB⇒b∈ Rs
GCB⇒ValidBlock : ∀ {s} → Reachable s →
GloballyCertifiedBlockIn s b
────────────────────────────
ValidBlock b
GCB⇒ValidBlock {b}{s} Rs gcb@(qc , cb , qc∈)
with p , p∈ , hp ← qc⇒hp qc
= QED
where
_sb = b signed-by roundLeader (b ∙round)
mᵖ = Propose _sb
mᵖ∈ : mᵖ ∈ ((s @ʰ hp) .db)
mᵖ∈ = StepVotes⇒db∋ {b = b} ⦃ hp ⦄ Rs (honest∈votes⇒StepVotes Rs hp (qc⇒vote ⦃ hp ⦄ Rs qc∈ p∈ cb))
srp : Rs ∋⋯ StepRegisterProposal p _sb
srp = sb∈⇒StepRegisterProposal {sb = _sb} ⦃ hp ⦄ Rs mᵖ∈
QED : ValidBlock b
QED
with _ , _ ⊢ RegisterProposal _ _ _ _ vp , _ , refl , refl , refl ← traceRs▷ Rs srp
= ValidProposal⇒ValidBlock vp
GCB⇒b∈h : ∀ {s} → Reachable s →
let mᵖ = Propose $ b signed-by roundLeader (b ∙round) in
GloballyCertifiedBlockIn s b
─────────────────────────────────────────────────
∃ λ p → ∃ λ (hp : Honest p) → mᵖ ∈ (s @ʰ hp) .db
GCB⇒b∈h {b}{s} Rs gcb
with p , hp , p∈ ← GCB⇒votes Rs gcb
= p , hp , b∈
where
b∈ : _ ∈ (s @ʰ hp) .db
b∈ = StepVotes⇒db∋ ⦃ hp ⦄ Rs $ honest∈votes⇒StepVotes Rs hp p∈
GCB-QCGenesis : ∀ {s} → Reachable s →
∙ GloballyCertifiedBlockIn s b
∙ Genesis (b . blockQC)
────────────────────────────
(b . blockQC) ∙round ≡ 0
GCB-QCGenesis Rs gcb id≡
using p , hp , b∈ ← GCB⇒b∈h Rs gcb
with isValidQC id≡⇒r≡ ← b∈⇒qcValid Rs ⦃ hp ⦄ b∈
= sym (id≡⇒r≡ [] (sym id≡))