1234567891011121314151617181920212223242526272829open import Leios.Preludeopen import Leios.Abstractopen import Leios.FFDopen import Tactic.Defaultsopen import Tactic.Derive.DecEq module Leios.Blocks (a : LeiosAbstract) (let open LeiosAbstract a) where -- IsBlock typeclass (could do a closed-world approach instead)-- Q: should votes have an instance of this class?record IsBlock (B : Type) : Type where field slotNumber : B → ℕ producerID : B → PoolID lotteryPf : B → VrfPf signature : B → Sig infix 4 _∈ᴮ_ _∈ᴮ_ : B → ℙ ℕ → Type b ∈ᴮ X = slotNumber b ∈ X areEquivocated : B → B → Type areEquivocated b b' = b ≢ b' × slotNumber b ≡ slotNumber b' × producerID b ≡ producerID b' open IsBlock ⦃...⦄ public EBRef = Hash
123456789101112131415161718192021222324252627282930313233record EndorserBlockOSig (sig : Type) : Type where field slotNumber : ℕ producerID : PoolID lotteryPf : VrfPf txs : List Tx signature : sig EndorserBlock = EndorserBlockOSig SigPreEndorserBlock = EndorserBlockOSig ⊤ instance Hashable-EndorserBlock : ⦃ Hashable PreEndorserBlock Hash ⦄ → Hashable EndorserBlock Hash Hashable-EndorserBlock .hash b = hash {T = PreEndorserBlock} record { EndorserBlockOSig b hiding (signature) ; signature = _ } IsBlock-EndorserBlock : IsBlock EndorserBlock IsBlock-EndorserBlock = record { EndorserBlockOSig } unquoteDecl DecEq-EndorserBlockOSig = derive-DecEq ((quote EndorserBlockOSig , DecEq-EndorserBlockOSig) ∷ []) mkEB : ⦃ Hashable PreEndorserBlock Hash ⦄ → ℕ → PoolID → VrfPf → PrivKey → List Tx → EndorserBlockmkEB slot id π pKey txs = record { signature = sign pKey (hash b) ; EndorserBlockOSig b } where b : PreEndorserBlock b = record { slotNumber = slot ; producerID = id ; lotteryPf = π ; txs = txs ; signature = _ } getEBRef : ⦃ Hashable PreEndorserBlock Hash ⦄ → EndorserBlock → EBRefgetEBRef = hash
1234567891011121314151617181920212223module GenFFD ⦃ _ : IsBlock (List Vote) ⦄ where data Header : Type where ebHeader : EndorserBlock → Header vtHeader : List Vote → Header Body = ⊤ unquoteDecl DecEq-Header = derive-DecEq ((quote Header , DecEq-Header) ∷ []) ID : Type ID = ℕ × PoolID match : Header → Body → Type match _ _ = ⊥ -- can we express uniqueness wrt pipelines as a property? msgID : Header → ID msgID (ebHeader h) = (slotNumber h , producerID h) msgID (vtHeader h) = (slotNumber h , producerID h) ffdAbstract : ⦃ _ : IsBlock (List Vote) ⦄ → FFDAbstractffdAbstract = record { GenFFD }