A chain is simply a sequence of blocks.
Chain = List Block
The genesis block is just the start of any chain, so it’s simpler to consider any empty chain to consist of just the genesis block.
genesisChain = Chain ∋ [] instance HasEpoch-Chain = HasEpoch Chain ∋ λ where ._∙epoch → λ where [] → 0 (b ∷ _) → b .epoch
Not all chains are valid though: each subsequent block must reference the latest block by hash and cannot decrease the epoch number.
record _-connects-to-_ (b : Block) (ch : Chain) : Type where
constructor connects∶
field hashesMatch : b .parentHash ≡ ch ♯
epochAdvances : b .epoch > ch ∙epoch
data ValidChain : Chain → Type where
[] :
───────────────────────
ValidChain genesisChain
_∷_⊣_ :
∀ b →
∙ ValidChain ch
∙ b -connects-to- ch
────────────────────
ValidChain (b ∷ ch)