@@ -45,6 +45,7 @@ record LeiosState : Type where
45
45
Upkeep : ℙ SlotUpkeep
46
46
BaseState : B.State
47
47
votingState : VotingState
48
+ PubKeys : List PubKey
48
49
49
50
lookupEB : EBRef → Maybe EndorserBlock
50
51
lookupEB r = find (λ b → getEBRef b ≟ r) EBs
@@ -74,8 +75,8 @@ addUpkeep : LeiosState → SlotUpkeep → LeiosState
74
75
addUpkeep s u = let open LeiosState s in record s { Upkeep = Upkeep ∪ ❴ u ❵ }
75
76
{-# INJECTIVE_FOR_INFERENCE addUpkeep #-}
76
77
77
- initLeiosState : VTy → StakeDistr → B.State → LeiosState
78
- initLeiosState V SD bs = record
78
+ initLeiosState : VTy → StakeDistr → B.State → List PubKey → LeiosState
79
+ initLeiosState V SD bs pks = record
79
80
{ V = V
80
81
; SD = SD
81
82
; FFDState = FFD.initFFDState
@@ -90,8 +91,114 @@ initLeiosState V SD bs = record
90
91
; Upkeep = ∅
91
92
; BaseState = bs
92
93
; votingState = initVotingState
94
+ ; PubKeys = pks
93
95
}
94
96
97
+ stake' : PoolID → LeiosState → ℕ
98
+ stake' pid record { SD = SD } = TotalMap.lookup SD pid
99
+
100
+ stake'' : PubKey → LeiosState → ℕ
101
+ stake'' pk = stake' (poolID pk)
102
+
103
+ stake : LeiosState → ℕ
104
+ stake = stake' id
105
+
106
+ lookupPubKeyAndStake : ∀ {B} → ⦃ _ : IsBlock B ⦄ → LeiosState → B → Maybe (PubKey × ℕ)
107
+ lookupPubKeyAndStake s b =
108
+ L.head $
109
+ L.map (λ pk → (pk , stake'' pk s)) $
110
+ L.filter ((producerID b ≟_) ∘ poolID) (LeiosState.PubKeys s)
111
+
112
+ module _ (s : LeiosState) where
113
+
114
+ record ibHeaderValid (h : IBHeader) (pk : PubKey) (st : ℕ) : Type where
115
+ field lotteryPfValid : verify pk (slotNumber h) st (lotteryPf h)
116
+ signatureValid : verifySig pk (signature h)
117
+
118
+ record ibBodyValid (b : IBBody) : Type where
119
+
120
+ ibHeaderValid? : (h : IBHeader) (pk : PubKey) (st : ℕ) → Dec (ibHeaderValid h pk st)
121
+ ibHeaderValid? h pk st
122
+ with verify? pk (slotNumber h) st (lotteryPf h)
123
+ ... | no ¬p = no (¬p ∘ ibHeaderValid.lotteryPfValid)
124
+ ... | yes p
125
+ with verifySig? pk (signature h)
126
+ ... | yes q = yes (record { lotteryPfValid = p ; signatureValid = q })
127
+ ... | no ¬q = no (¬q ∘ ibHeaderValid.signatureValid)
128
+
129
+ ibBodyValid? : (b : IBBody) → Dec (ibBodyValid b)
130
+ ibBodyValid? _ = yes record {}
131
+
132
+ ibValid : InputBlock → Type
133
+ ibValid record { header = h ; body = b }
134
+ with lookupPubKeyAndStake s h
135
+ ... | just (pk , pid) = ibHeaderValid h pk (stake'' pk s) × ibBodyValid b
136
+ ... | nothing = ⊥
137
+
138
+ ibValid? : (ib : InputBlock) → Dec (ibValid ib)
139
+ ibValid? record { header = h ; body = b }
140
+ with lookupPubKeyAndStake s h
141
+ ... | just (pk , pid) = ibHeaderValid? h pk (stake'' pk s) ×-dec ibBodyValid? b
142
+ ... | nothing = no λ x → x
143
+
144
+ record ebValid (eb : EndorserBlock) (pk : PubKey) (st : ℕ) : Type where
145
+ field lotteryPfValid : verify pk (slotNumber eb) st (lotteryPf eb)
146
+ signatureValid : verifySig pk (signature eb)
147
+ -- TODO
148
+ -- ibRefsValid : ?
149
+ -- ebRefsValid : ?
150
+
151
+ ebValid? : (eb : EndorserBlock) (pk : PubKey) (st : ℕ) → Dec (ebValid eb pk st)
152
+ ebValid? h pk st
153
+ with verify? pk (slotNumber h) st (lotteryPf h)
154
+ ... | no ¬p = no (¬p ∘ ebValid.lotteryPfValid)
155
+ ... | yes p
156
+ with verifySig? pk (signature h)
157
+ ... | yes q = yes (record { lotteryPfValid = p ; signatureValid = q })
158
+ ... | no ¬q = no (¬q ∘ ebValid.signatureValid)
159
+
160
+ -- TODO
161
+ record vsValid (vs : List Vote) : Type where
162
+
163
+ vsValid? : (vs : List Vote) → Dec (vsValid vs)
164
+ vsValid? _ = yes record {}
165
+
166
+ headerValid : Header → Type
167
+ headerValid (ibHeader h)
168
+ with lookupPubKeyAndStake s h
169
+ ... | just (pk , pid) = ibHeaderValid h pk (stake'' pk s)
170
+ ... | nothing = ⊥
171
+ headerValid (ebHeader h)
172
+ with lookupPubKeyAndStake s h
173
+ ... | just (pk , pid) = ebValid h pk (stake'' pk s)
174
+ ... | nothing = ⊥
175
+ headerValid (vHeader h) = vsValid h
176
+
177
+ headerValid? : (h : Header) → Dec (headerValid h)
178
+ headerValid? (ibHeader h)
179
+ with lookupPubKeyAndStake s h
180
+ ... | just (pk , pid) = ibHeaderValid? h pk (stake'' pk s)
181
+ ... | nothing = no λ x → x
182
+ headerValid? (ebHeader h)
183
+ with lookupPubKeyAndStake s h
184
+ ... | just (pk , pid) = ebValid? h pk (stake'' pk s)
185
+ ... | nothing = no λ x → x
186
+ headerValid? (vHeader h) = vsValid? h
187
+
188
+ bodyValid : Body → Type
189
+ bodyValid (ibBody b) = ibBodyValid b
190
+
191
+ bodyValid? : (b : Body) → Dec (bodyValid b)
192
+ bodyValid? (ibBody b) = ibBodyValid? b
193
+
194
+ isValid : Header ⊎ Body → Type
195
+ isValid (inj₁ h) = headerValid h
196
+ isValid (inj₂ b) = bodyValid b
197
+
198
+ isValid? : ∀ (x : Header ⊎ Body) → Dec (isValid x)
199
+ isValid? (inj₁ h) = headerValid? h
200
+ isValid? (inj₂ b) = bodyValid? b
201
+
95
202
-- some predicates about EBs
96
203
module _ (s : LeiosState) (eb : EndorserBlock) where
97
204
open EndorserBlockOSig eb
@@ -100,9 +207,6 @@ module _ (s : LeiosState) (eb : EndorserBlock) where
100
207
allIBRefsKnown : Type
101
208
allIBRefsKnown = ∀[ ref ∈ fromList ibRefs ] ref ∈ˡ map getIBRef IBs
102
209
103
- stake : LeiosState → ℕ
104
- stake record { SD = SD } = TotalMap.lookup SD id
105
-
106
210
module _ (s : LeiosState) where
107
211
108
212
open LeiosState s
0 commit comments