Skip to content

Commit 471a052

Browse files
committed
Remove vote delegated stake when dreps are unregistered in a tx (Conway)
1 parent e618858 commit 471a052

13 files changed

Lines changed: 191 additions & 216 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
## Conway spec
3535

36+
- Remove POST-CERT; delegated stake for voting is now removed by GOVCERT at the moment of deregistration
3637
- Move `txIns ∩ refInputs ≡ ∅` precondition to `allowedLanguages` to allow non-disjoint tx and ref. inputs for Plutus V1-V2
3738
- Require collateral inputs to be present in the UTxO set in the UTXO rule
3839
- State and prove the claim that a voter's (last) vote in a block is applied to the governance action (see #417)

src/Interface/ComputationalRelation.lagda.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,3 +583,27 @@ module _ {Init : C → S → ⊤ → S → Type} ⦃ _ : Computational Init Err
583583
| completeness {Err = Err} _ _ _ _ rtat
584584
... | success (t' , r) | refl = refl
585585
```
586+
587+
```agda
588+
module _ {Init : C → S → ⊤ → S → Type} ⦃ _ : Computational Init Err₂ ⦄ where
589+
module _ {Step : C → S → Sig → S → Type} ⦃ _ : Computational Step Err₁ ⦄
590+
⦃ _ : InjectError Err₁ Err ⦄ ⦃ _ : InjectError Err₂ Err ⦄ where
591+
592+
instance
593+
Computational-RunTraceAfter : Computational (RunTraceAfter Init Step) Err
594+
595+
Computational-RunTraceAfter .computeProof Γ s sigs
596+
with computeProof {STS = Init} Γ s tt
597+
... | failure e = failure (injectError it e)
598+
... | success (s' , h)
599+
with computeProof {STS = ReflexiveTransitiveClosure {sts = Step}} {Err = Err} Γ s' sigs
600+
... | failure e = failure e
601+
... | success (t , r) = success (t , run (h , r))
602+
603+
Computational-RunTraceAfter .completeness Γ s sigs t (run (init , rtc))
604+
with computeProof {STS = Init} Γ s tt | completeness _ _ _ _ init
605+
... | success (s' , h) | refl
606+
with computeProof {STS = ReflexiveTransitiveClosure {sts = Step}} {Err = Err} Γ s' sigs
607+
| completeness {Err = Err} _ _ _ _ rtc
608+
... | success (t' , r) | refl = refl
609+
```

src/Interface/STS.lagda.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ does—it processes a list of signals, transforming state.
4040
+ `RunTraceAfterAndThen`: run a given transition (`Init`), then run a transition
4141
(`Step`) for a each signal in a given list, then, once the list is empty, run a
4242
final (`Last`) transition.
43+
+ `RunTraceAfter`: run a given transition (`Init`), then run a transition (`Step`)
44+
for each signal in a given list. This is `RunTraceAfterAndThen` with a trivial
45+
final transition, built on the reflexive-transitive closure of `Step`.
4346

4447
## High-level picture
4548

@@ -142,6 +145,20 @@ ReflexiveTransitiveClosureᵢᵇ = _⊢_⇀⟦_⟧ᵢ*_
142145
ReflexiveTransitiveClosureᵇ = _⊢_⇀⟦_⟧*_
143146
```
144147

148+
### Running a Trace After an Initial Transition
149+
150+
```agda
151+
data RunTraceAfter (Init : C → S → ⊤ → S → Type)
152+
(Step : C → S → Sig → S → Type) :
153+
C → S → List Sig → S → Type where
154+
155+
run :
156+
∙ Init Γ s tt s'
157+
∙ ReflexiveTransitiveClosure {sts = Step} Γ s' sigs s''
158+
─────────────────────────────────────────────
159+
RunTraceAfter Init Step Γ s sigs s''
160+
```
161+
145162
## Totality
146163

147164
We say a single-step relation is **total** if every input has some output.

src/Ledger/Conway/Conformance/Certs.lagda.md

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ private module Certs = Ledger.Conway.Specification.Certs gs
1919
open Certs public
2020
hiding (DState; GState; CertState; HasCast-DState; HasCast-GState; HasCast-CertState;
2121
_⊢_⇀⦇_,DELEG⦈_; _⊢_⇀⦇_,GOVCERT⦈_;
22-
_⊢_⇀⦇_,CERT⦈_; _⊢_⇀⦇_,PRE-CERT⦈_; _⊢_⇀⦇_,POST-CERT⦈_; _⊢_⇀⦇_,CERTS⦈_; ⟦_,_,_⟧ᵈ)
22+
_⊢_⇀⦇_,CERT⦈_; _⊢_⇀⦇_,PRE-CERT⦈_; _⊢_⇀⦇_,CERTS⦈_; ⟦_,_,_⟧ᵈ)
2323
open RewardAddress
2424
2525
record DState : Type where
@@ -105,6 +105,7 @@ private variable
105105
stᵈ stᵈ' : DState
106106
stᵍ stᵍ' : GState
107107
stᵖ stᵖ' : PState
108+
stᶜ stᶜ' : CertState
108109
109110
open GovVote
110111
@@ -149,31 +150,31 @@ data _⊢_⇀⦇_,DELEG⦈_ where
149150
⟦ vDelegs , sDelegs , rwds ∪ˡ ❴ c , 0 ❵
150151
, updateCertDeposit pp (reg c d) dep ⟧
151152
152-
data _⊢_⇀⦇_,GOVCERT⦈_ : CertEnv → GState → DCert → GState → Type where
153+
data _⊢_⇀⦇_,GOVCERT⦈_ : CertEnv → CertState → DCert → CertState → Type where
153154
GOVCERT-regdrep : ∀ {pp} → let open PParams pp in
154155
∙ (d ≡ drepDeposit × c ∉ dom dReps) ⊎ (d ≡ 0 × c ∈ dom dReps)
155156
────────────────────────────────
156157
⟦ e , pp , vs , wdrls , cc ⟧ ⊢
157-
⟦ dReps , ccKeys , dep ⟧
158+
stᵈ , stᵖ , ⟦ dReps , ccKeys , dep
158159
⇀⦇ regdrep c d an ,GOVCERT⦈
159-
⟦ ❴ c , e + drepActivity ❵ ∪ˡ dReps , ccKeys
160-
, updateCertDeposit pp (regdrep c d an ) dep ⟧
160+
stᵈ , stᵖ , ⟦ ❴ c , e + drepActivity ❵ ∪ˡ dReps , ccKeys
161+
, updateCertDeposit pp (regdrep c d an ) dep ⟧
161162
162163
GOVCERT-deregdrep :
163164
∙ c ∈ dom dReps
164165
∙ (DRepDeposit c , d) ∈ dep
165166
────────────────────────────────
166-
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys , dep ⟧
167+
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ ⟦ vDelegs , sDelegs , rwds , ddep ⟧ᵈ , stᵖ , ⟦ dReps , ccKeys , dep
167168
⇀⦇ deregdrep c d ,GOVCERT⦈
168-
⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys , updateCertDeposit pp (deregdrep c d) dep ⟧
169+
⟦ vDelegs ∣^ ❴ vDelegCredential c ❵ ᶜ , sDelegs , rwds , ddep ⟧ᵈ , stᵖ , ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys , updateCertDeposit pp (deregdrep c d) dep
169170
170171
GOVCERT-ccreghot :
171172
∙ (c , nothing) ∉ ccKeys
172173
∙ c ∈ cc
173174
────────────────────────────────
174-
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys , dep ⟧
175+
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , ⟦ dReps , ccKeys , dep
175176
⇀⦇ ccreghot c mc ,GOVCERT⦈
176-
⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys , updateCertDeposit pp (ccreghot c mc) dep ⟧
177+
stᵈ , stᵖ , ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys , updateCertDeposit pp (ccreghot c mc) dep
177178
178179
data _⊢_⇀⦇_,CERT⦈_ : CertEnv → CertState → DCert → CertState → Type where
179180
CERT-deleg :
@@ -187,9 +188,9 @@ data _⊢_⇀⦇_,CERT⦈_ : CertEnv → CertState → DCert → CertState → T
187188
⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ' , stᵍ ⟧
188189
189190
CERT-vdel :
190-
∙ Γ ⊢ stᵍ ⇀⦇ dCert ,GOVCERT⦈ stᵍ'
191+
∙ Γ ⊢ stᶜ ⇀⦇ dCert ,GOVCERT⦈ stᶜ'
191192
────────────────────────────────
192-
Γ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ , stᵍ' ⟧
193+
Γ ⊢ stᶜ ⇀⦇ dCert ,CERT⦈ stᶜ'
193194
194195
data _⊢_⇀⦇_,PRE-CERT⦈_ : CertEnv → CertState → ⊤ → CertState → Type where
195196
@@ -206,15 +207,6 @@ data _⊢_⇀⦇_,PRE-CERT⦈_ : CertEnv → CertState → ⊤ → CertState →
206207
⇀⦇ _ ,PRE-CERT⦈
207208
⟦ ⟦ voteDelegs , stakeDelegs , constMap wdrlCreds 0 ∪ˡ rewards , ddep ⟧ , stᵖ , ⟦ refreshedDReps , ccHotKeys , gdep ⟧ ⟧
208209
209-
data _⊢_⇀⦇_,POST-CERT⦈_ : CertEnv → CertState → ⊤ → CertState → Type where
210-
211-
CERT-post :
212-
⟦ e , pp , vs , wdrls , cc ⟧
213-
⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards , ddep ⟧ , stᵖ , stᵍ ⟧
214-
⇀⦇ _ ,POST-CERT⦈
215-
⟦ ⟦ voteDelegs ∣^ (mapˢ vDelegCredential (dom (GState.dreps stᵍ)) ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ []))
216-
, stakeDelegs , rewards , ddep ⟧ , stᵖ , stᵍ ⟧
217-
218210
_⊢_⇀⦇_,CERTS⦈_ : CertEnv → CertState → List DCert → CertState → Type
219-
_⊢_⇀⦇_,CERTS⦈_ = RunTraceAfterAndThen _⊢_⇀⦇_,PRE-CERT⦈_ _⊢_⇀⦇_,CERT⦈_ _⊢_⇀⦇_,POST-CERT⦈_
211+
_⊢_⇀⦇_,CERTS⦈_ = RunTraceAfter _⊢_⇀⦇_,PRE-CERT⦈_ _⊢_⇀⦇_,CERT⦈_
220212
```

src/Ledger/Conway/Conformance/Certs/Properties.lagda.md

Lines changed: 25 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -84,41 +84,41 @@ instance
8484
rewrite dec-yes (¿ c ∉ dom (DState.rewards ds) × (d ≡ DelegEnv.pparams de .PParams.keyDeposit ⊎ d ≡ 0) ¿) p .proj₂ = refl
8585
8686
Computational-GOVCERT : Computational _⊢_⇀⦇_,GOVCERT⦈_ String
87-
Computational-GOVCERT .computeProof ce gs (regdrep c d _) =
88-
let open CertEnv ce; open GState gs; open PParams pp in
89-
case ¿ (d ≡ drepDeposit × c ∉ dom dreps)
90-
⊎ (d ≡ 0 × c ∈ dom dreps) ¿ of λ where
87+
Computational-GOVCERT .computeProof ce cs (regdrep c d _) =
88+
let open CertEnv ce; open PParams pp in
89+
case ¿ (d ≡ drepDeposit × c ∉ dom (GState.dreps (CertState.gState cs)))
90+
⊎ (d ≡ 0 × c ∈ dom (GState.dreps (CertState.gState cs))) ¿ of λ where
9191
(yes p) → success (-, GOVCERT-regdrep p)
9292
(no ¬p) → failure (genErrors ¬p)
93-
Computational-GOVCERT .computeProof ce gs (deregdrep c d) =
94-
case ¿ c ∈ dom (GState.dreps gs) × (DRepDeposit c , d) ∈ (GState.deposits gs) ¿ of λ where
93+
Computational-GOVCERT .computeProof ce cs (deregdrep c d) =
94+
case ¿ c ∈ dom (GState.dreps (CertState.gState cs)) × (DRepDeposit c , d) ∈ (GState.deposits (CertState.gState cs)) ¿ of λ where
9595
(yes p) → success (-, GOVCERT-deregdrep p)
9696
(no ¬p) → failure (genErrors ¬p)
97-
Computational-GOVCERT .computeProof ce gs (ccreghot c _) =
98-
let open CertEnv ce; open GState gs in
99-
case ¿ ((c , nothing) ∉ ccHotKeys ˢ) × c ∈ coldCreds ¿ of λ where
97+
Computational-GOVCERT .computeProof ce cs (ccreghot c _) =
98+
let open CertEnv ce in
99+
case ¿ ((c , nothing) ∉ GState.ccHotKeys (CertState.gState cs) ˢ) × c ∈ coldCreds ¿ of λ where
100100
(yes p) → success (-, GOVCERT-ccreghot p)
101101
(no ¬p) → failure (genErrors ¬p)
102102
Computational-GOVCERT .computeProof _ _ _ = failure "Unexpected certificate in GOVCERT"
103-
Computational-GOVCERT .completeness ce gs
103+
Computational-GOVCERT .completeness ce cs
104104
(regdrep c d _) _ (GOVCERT-regdrep p)
105105
rewrite dec-yes
106106
¿ (let open CertEnv ce; open PParams pp in
107-
(d ≡ drepDeposit × c ∉ dom (GState.dreps gs)) ⊎ (d ≡ 0 × c ∈ dom (GState.dreps gs)))
107+
(d ≡ drepDeposit × c ∉ dom (GState.dreps (CertState.gState cs))) ⊎ (d ≡ 0 × c ∈ dom (GState.dreps (CertState.gState cs))))
108108
¿ p .proj₂ = refl
109-
Computational-GOVCERT .completeness _ gs
109+
Computational-GOVCERT .completeness _ cs
110110
(deregdrep c d) _ (GOVCERT-deregdrep p)
111-
rewrite dec-yes ¿ c ∈ dom (GState.dreps gs) × (DRepDeposit c , d) ∈ (GState.deposits gs) ¿ p .proj₂ = refl
112-
Computational-GOVCERT .completeness ce gs
111+
rewrite dec-yes ¿ c ∈ dom (GState.dreps (CertState.gState cs)) × (DRepDeposit c , d) ∈ (GState.deposits (CertState.gState cs)) ¿ p .proj₂ = refl
112+
Computational-GOVCERT .completeness ce cs
113113
(ccreghot c _) _ (GOVCERT-ccreghot p)
114-
rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys gs) ˢ) × c ∈ CertEnv.coldCreds ce) ¿) p .proj₂ = refl
114+
rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys (CertState.gState cs)) ˢ) × c ∈ CertEnv.coldCreds ce) ¿) p .proj₂ = refl
115115
116116
Computational-CERT : Computational _⊢_⇀⦇_,CERT⦈_ String
117117
Computational-CERT .computeProof ce cs dCert
118118
with computeProof ⟦ CertEnv.pp ce , PState.pools (CertState.pState cs) , dom (GState.dreps (CertState.gState cs)) ⟧
119119
(CertState.dState cs) dCert
120120
| computeProof (CertEnv.pp ce) (CertState.pState cs) dCert
121-
| computeProof ce (CertState.gState cs) dCert
121+
| computeProof ce cs dCert
122122
... | success (_ , h) | _ | _ = success (-, CERT-deleg h)
123123
... | failure _ | success (_ , h) | _ = success (-, CERT-pool h)
124124
... | failure _ | failure _ | success (_ , h) = success (-, CERT-vdel h)
@@ -151,18 +151,17 @@ instance
151151
with completeness _ _ _ _ h
152152
... | refl = refl
153153
Computational-CERT .completeness Γ cs
154-
dCert@(regdrep c d an)
155-
cs' (CERT-vdel h)
156-
with computeProof Γ (CertState.gState cs) dCert | completeness _ _ _ _ h
157-
... | success _ | refl = refl
154+
(regdrep c d an) _ (CERT-vdel (GOVCERT-regdrep p))
155+
rewrite dec-yes
156+
¿ (let open CertEnv Γ; open PParams pp in
157+
(d ≡ drepDeposit × c ∉ dom (GState.dreps (CertState.gState cs))) ⊎ (d ≡ 0 × c ∈ dom (GState.dreps (CertState.gState cs))))
158+
¿ p .proj₂ = refl
158159
Computational-CERT .completeness Γ cs
159-
dCert@(deregdrep c _) cs' (CERT-vdel h)
160-
with computeProof Γ (CertState.gState cs) dCert | completeness _ _ _ _ h
161-
... | success _ | refl = refl
160+
(deregdrep c d) _ (CERT-vdel (GOVCERT-deregdrep p))
161+
rewrite dec-yes ¿ c ∈ dom (GState.dreps (CertState.gState cs)) × (DRepDeposit c , d) ∈ (GState.deposits (CertState.gState cs)) ¿ p .proj₂ = refl
162162
Computational-CERT .completeness Γ cs
163-
dCert@(ccreghot c mkh) cs' (CERT-vdel h)
164-
with computeProof Γ (CertState.gState cs) dCert | completeness _ _ _ _ h
165-
... | success _ | refl = refl
163+
(ccreghot c _) _ (CERT-vdel (GOVCERT-ccreghot p))
164+
rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys (CertState.gState cs)) ˢ) × c ∈ CertEnv.coldCreds Γ) ¿) p .proj₂ = refl
166165
167166
168167
Computational-PRE-CERT : Computational _⊢_⇀⦇_,PRE-CERT⦈_ String
@@ -181,23 +180,6 @@ instance
181180
× mapˢ (map₁ RewardAddress.stake) (CertEnv.wdrls ce ˢ) ⊆ rewards ˢ ¿
182181
p .proj₂ = refl
183182
184-
-- POST-CERT has no premises, so computing always succeeds
185-
-- with the unique post-state and proof CERT-post.
186-
Computational-POST-CERT : Computational _⊢_⇀⦇_,POST-CERT⦈_ String
187-
Computational-POST-CERT .computeProof ce cs tt = success ( cs' , CERT-post)
188-
where
189-
dreps : DReps
190-
dreps = GState.dreps (CertState.gState cs)
191-
validVoteDelegs : VoteDelegs
192-
validVoteDelegs = (DState.voteDelegs (CertState.dState cs)) ∣^ ( mapˢ vDelegCredential (dom dreps) ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ []) )
193-
cs' : CertState
194-
cs' = ⟦ ⟦ validVoteDelegs , _ , _ ⟧ , CertState.pState cs , CertState.gState cs ⟧
195-
196-
-- Completeness: the relational proof pins s' to exactly `post`,
197-
-- and computeProof returns success at that same state; so refl.
198-
Computational-POST-CERT .completeness ce cs _ cs' CERT-post = refl
199-
200-
201183
Computational-CERTS : Computational _⊢_⇀⦇_,CERTS⦈_ String
202184
Computational-CERTS = it
203185
```

0 commit comments

Comments
 (0)