diff --git a/CHANGELOG.md b/CHANGELOG.md index d4f0895f40..b6b7a281ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ ## Conway spec +- Remove POST-CERT; delegated stake for voting is now removed by GOVCERT at the moment of deregistration - Move `txIns ∩ refInputs ≡ ∅` precondition to `allowedLanguages` to allow non-disjoint tx and ref. inputs for Plutus V1-V2 - Require collateral inputs to be present in the UTxO set in the UTXO rule - State and prove the claim that a voter's (last) vote in a block is applied to the governance action (see #417) diff --git a/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Conway/Foreign/API.hs b/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Conway/Foreign/API.hs index 512af8e8b6..540e16f340 100644 --- a/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Conway/Foreign/API.hs +++ b/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Conway/Foreign/API.hs @@ -12,11 +12,11 @@ import MAlonzo.Code.Ledger.Conway.Foreign.Transaction as X , Script, Datum, DataHash, Value, TxOut, RdmrPtr, ScriptHash, AuxiliaryData, Withdrawals , HSTimelock (..), HSPlutusScript (..)) import MAlonzo.Code.Ledger.Conway.Foreign.Cert as X - (certStep, certsStep, CertState(..)) + (certStep, certsStep) import MAlonzo.Code.Ledger.Conway.Foreign.Chain as X (ChainState(..), HSBlock(..), chainStep) import MAlonzo.Code.Ledger.Conway.Foreign.Certs as X - ( StakePoolParams(..), PState(..), DelegEnv(..), CertEnv(..), DState(..), DCert(..), GState(..) + ( StakePoolParams(..), PState(..), DelegEnv(..), CertEnv(..), DState(..), DCert(..), GState(..), CertState(..) , delegStep, govCertStep, poolStep, DepositPurpose(..)) import MAlonzo.Code.Ledger.Conway.Foreign.Enact as X (EnactState(..), EnactEnv(..), enactStep) diff --git a/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Dijkstra/Foreign/API.hs b/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Dijkstra/Foreign/API.hs index f43567fce9..7e3fdc7e61 100644 --- a/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Dijkstra/Foreign/API.hs +++ b/build-tools/static/hs-src/src/MAlonzo/Code/Ledger/Dijkstra/Foreign/API.hs @@ -17,11 +17,11 @@ import MAlonzo.Code.Ledger.Dijkstra.Foreign.Transaction as X , Redeemer, RedeemerPtr , NativeScript(..), HSNativeScript (..), HSPlutusScript (..)) import MAlonzo.Code.Ledger.Dijkstra.Foreign.Cert as X - (certStep, certsStep, CertState(..)) + (certStep, certsStep) import MAlonzo.Code.Ledger.Dijkstra.Foreign.Chain as X (ChainState(..), Block(..), chainStep) import MAlonzo.Code.Ledger.Dijkstra.Foreign.Certs as X - ( StakePoolParams(..), PState(..), DelegEnv(..), GovCertEnv(..), CertEnv(..), DState(..), DCert(..), GState(..) + ( StakePoolParams(..), PState(..), DelegEnv(..), GovCertEnv(..), CertEnv(..), DState(..), DCert(..), GState(..), CertState(..) , delegStep, govCertStep, poolStep) import MAlonzo.Code.Ledger.Dijkstra.Foreign.Entities as X (EntitiesEnv(..), entitiesStep, SubEntitiesEnv(..), subentitiesStep) diff --git a/src/Interface/ComputationalRelation.lagda.md b/src/Interface/ComputationalRelation.lagda.md index 40a85f2162..92c49ab0cf 100644 --- a/src/Interface/ComputationalRelation.lagda.md +++ b/src/Interface/ComputationalRelation.lagda.md @@ -583,3 +583,27 @@ module _ {Init : C → S → ⊤ → S → Type} ⦃ _ : Computational Init Err | completeness {Err = Err} _ _ _ _ rtat ... | success (t' , r) | refl = refl ``` + +```agda +module _ {Init : C → S → ⊤ → S → Type} ⦃ _ : Computational Init Err₂ ⦄ where + module _ {Step : C → S → Sig → S → Type} ⦃ _ : Computational Step Err₁ ⦄ + ⦃ _ : InjectError Err₁ Err ⦄ ⦃ _ : InjectError Err₂ Err ⦄ where + + instance + Computational-RunTraceAfter : Computational (RunTraceAfter Init Step) Err + + Computational-RunTraceAfter .computeProof Γ s sigs + with computeProof {STS = Init} Γ s tt + ... | failure e = failure (injectError it e) + ... | success (s' , h) + with computeProof {STS = ReflexiveTransitiveClosure {sts = Step}} {Err = Err} Γ s' sigs + ... | failure e = failure e + ... | success (t , r) = success (t , run (h , r)) + + Computational-RunTraceAfter .completeness Γ s sigs t (run (init , rtc)) + with computeProof {STS = Init} Γ s tt | completeness _ _ _ _ init + ... | success (s' , h) | refl + with computeProof {STS = ReflexiveTransitiveClosure {sts = Step}} {Err = Err} Γ s' sigs + | completeness {Err = Err} _ _ _ _ rtc + ... | success (t' , r) | refl = refl +``` diff --git a/src/Interface/STS.lagda.md b/src/Interface/STS.lagda.md index f19096721e..128a1d42cb 100644 --- a/src/Interface/STS.lagda.md +++ b/src/Interface/STS.lagda.md @@ -40,6 +40,9 @@ does—it processes a list of signals, transforming state. + `RunTraceAfterAndThen`: run a given transition (`Init`), then run a transition (`Step`) for a each signal in a given list, then, once the list is empty, run a final (`Last`) transition. + + `RunTraceAfter`: run a given transition (`Init`), then run a transition (`Step`) + for each signal in a given list. This is `RunTraceAfterAndThen` with a trivial + final transition, built on the reflexive-transitive closure of `Step`. ## High-level picture @@ -142,6 +145,20 @@ ReflexiveTransitiveClosureᵢᵇ = _⊢_⇀⟦_⟧ᵢ*_ ReflexiveTransitiveClosureᵇ = _⊢_⇀⟦_⟧*_ ``` +### Running a Trace After an Initial Transition + +```agda +data RunTraceAfter (Init : C → S → ⊤ → S → Type) + (Step : C → S → Sig → S → Type) : + C → S → List Sig → S → Type where + + run : + ∙ Init Γ s tt s' + ∙ ReflexiveTransitiveClosure {sts = Step} Γ s' sigs s'' + ───────────────────────────────────────────── + RunTraceAfter Init Step Γ s sigs s'' +``` + ## Totality We say a single-step relation is **total** if every input has some output. diff --git a/src/Ledger/Conway/Conformance/Certs.lagda.md b/src/Ledger/Conway/Conformance/Certs.lagda.md index 7d8e9a64f2..1602a5549a 100644 --- a/src/Ledger/Conway/Conformance/Certs.lagda.md +++ b/src/Ledger/Conway/Conformance/Certs.lagda.md @@ -19,7 +19,7 @@ private module Certs = Ledger.Conway.Specification.Certs gs open Certs public hiding (DState; GState; CertState; HasCast-DState; HasCast-GState; HasCast-CertState; _⊢_⇀⦇_,DELEG⦈_; _⊢_⇀⦇_,GOVCERT⦈_; - _⊢_⇀⦇_,CERT⦈_; _⊢_⇀⦇_,PRE-CERT⦈_; _⊢_⇀⦇_,POST-CERT⦈_; _⊢_⇀⦇_,CERTS⦈_; ⟦_,_,_⟧ᵈ) + _⊢_⇀⦇_,CERT⦈_; _⊢_⇀⦇_,PRE-CERT⦈_; _⊢_⇀⦇_,CERTS⦈_; ⟦_,_,_⟧ᵈ) open RewardAddress record DState : Type where @@ -105,6 +105,7 @@ private variable stᵈ stᵈ' : DState stᵍ stᵍ' : GState stᵖ stᵖ' : PState + stᶜ stᶜ' : CertState open GovVote @@ -149,31 +150,31 @@ data _⊢_⇀⦇_,DELEG⦈_ where ⟦ vDelegs , sDelegs , rwds ∪ˡ ❴ c , 0 ❵ , updateCertDeposit pp (reg c d) dep ⟧ -data _⊢_⇀⦇_,GOVCERT⦈_ : CertEnv → GState → DCert → GState → Type where +data _⊢_⇀⦇_,GOVCERT⦈_ : CertEnv → CertState → DCert → CertState → Type where GOVCERT-regdrep : ∀ {pp} → let open PParams pp in ∙ (d ≡ drepDeposit × c ∉ dom dReps) ⊎ (d ≡ 0 × c ∈ dom dReps) ──────────────────────────────── ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ - ⟦ dReps , ccKeys , dep ⟧ + ⟦ stᵈ , stᵖ , ⟦ dReps , ccKeys , dep ⟧ ⟧ ⇀⦇ regdrep c d an ,GOVCERT⦈ - ⟦ ❴ c , e + drepActivity ❵ ∪ˡ dReps , ccKeys - , updateCertDeposit pp (regdrep c d an ) dep ⟧ + ⟦ stᵈ , stᵖ , ⟦ ❴ c , e + drepActivity ❵ ∪ˡ dReps , ccKeys + , updateCertDeposit pp (regdrep c d an ) dep ⟧ ⟧ GOVCERT-deregdrep : ∙ c ∈ dom dReps ∙ (DRepDeposit c , d) ∈ dep ──────────────────────────────── - ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys , dep ⟧ + ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ ⟦ vDelegs , sDelegs , rwds , ddep ⟧ᵈ , stᵖ , ⟦ dReps , ccKeys , dep ⟧ ⟧ ⇀⦇ deregdrep c d ,GOVCERT⦈ - ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys , updateCertDeposit pp (deregdrep c d) dep ⟧ + ⟦ ⟦ vDelegs ∣^ ❴ vDelegCredential c ❵ ᶜ , sDelegs , rwds , ddep ⟧ᵈ , stᵖ , ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys , updateCertDeposit pp (deregdrep c d) dep ⟧ ⟧ GOVCERT-ccreghot : ∙ (c , nothing) ∉ ccKeys ∙ c ∈ cc ──────────────────────────────── - ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys , dep ⟧ + ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , ⟦ dReps , ccKeys , dep ⟧ ⟧ ⇀⦇ ccreghot c mc ,GOVCERT⦈ - ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys , updateCertDeposit pp (ccreghot c mc) dep ⟧ + ⟦ stᵈ , stᵖ , ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys , updateCertDeposit pp (ccreghot c mc) dep ⟧ ⟧ data _⊢_⇀⦇_,CERT⦈_ : CertEnv → CertState → DCert → CertState → Type where CERT-deleg : @@ -187,9 +188,9 @@ data _⊢_⇀⦇_,CERT⦈_ : CertEnv → CertState → DCert → CertState → T ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ' , stᵍ ⟧ CERT-vdel : - ∙ Γ ⊢ stᵍ ⇀⦇ dCert ,GOVCERT⦈ stᵍ' + ∙ Γ ⊢ stᶜ ⇀⦇ dCert ,GOVCERT⦈ stᶜ' ──────────────────────────────── - Γ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ , stᵍ' ⟧ + Γ ⊢ stᶜ ⇀⦇ dCert ,CERT⦈ stᶜ' data _⊢_⇀⦇_,PRE-CERT⦈_ : CertEnv → CertState → ⊤ → CertState → Type where @@ -206,15 +207,6 @@ data _⊢_⇀⦇_,PRE-CERT⦈_ : CertEnv → CertState → ⊤ → CertState → ⇀⦇ _ ,PRE-CERT⦈ ⟦ ⟦ voteDelegs , stakeDelegs , constMap wdrlCreds 0 ∪ˡ rewards , ddep ⟧ , stᵖ , ⟦ refreshedDReps , ccHotKeys , gdep ⟧ ⟧ -data _⊢_⇀⦇_,POST-CERT⦈_ : CertEnv → CertState → ⊤ → CertState → Type where - - CERT-post : - ⟦ e , pp , vs , wdrls , cc ⟧ - ⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards , ddep ⟧ , stᵖ , stᵍ ⟧ - ⇀⦇ _ ,POST-CERT⦈ - ⟦ ⟦ voteDelegs ∣^ (mapˢ vDelegCredential (dom (GState.dreps stᵍ)) ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ [])) - , stakeDelegs , rewards , ddep ⟧ , stᵖ , stᵍ ⟧ - _⊢_⇀⦇_,CERTS⦈_ : CertEnv → CertState → List DCert → CertState → Type -_⊢_⇀⦇_,CERTS⦈_ = RunTraceAfterAndThen _⊢_⇀⦇_,PRE-CERT⦈_ _⊢_⇀⦇_,CERT⦈_ _⊢_⇀⦇_,POST-CERT⦈_ +_⊢_⇀⦇_,CERTS⦈_ = RunTraceAfter _⊢_⇀⦇_,PRE-CERT⦈_ _⊢_⇀⦇_,CERT⦈_ ``` diff --git a/src/Ledger/Conway/Conformance/Certs/Properties.lagda.md b/src/Ledger/Conway/Conformance/Certs/Properties.lagda.md index 1968b52f17..0c130b3fb4 100644 --- a/src/Ledger/Conway/Conformance/Certs/Properties.lagda.md +++ b/src/Ledger/Conway/Conformance/Certs/Properties.lagda.md @@ -84,41 +84,41 @@ instance rewrite dec-yes (¿ c ∉ dom (DState.rewards ds) × (d ≡ DelegEnv.pparams de .PParams.keyDeposit ⊎ d ≡ 0) ¿) p .proj₂ = refl Computational-GOVCERT : Computational _⊢_⇀⦇_,GOVCERT⦈_ String - Computational-GOVCERT .computeProof ce gs (regdrep c d _) = - let open CertEnv ce; open GState gs; open PParams pp in - case ¿ (d ≡ drepDeposit × c ∉ dom dreps) - ⊎ (d ≡ 0 × c ∈ dom dreps) ¿ of λ where + Computational-GOVCERT .computeProof ce cs (regdrep c d _) = + let open CertEnv ce; open PParams pp in + case ¿ (d ≡ drepDeposit × c ∉ dom (GState.dreps (CertState.gState cs))) + ⊎ (d ≡ 0 × c ∈ dom (GState.dreps (CertState.gState cs))) ¿ of λ where (yes p) → success (-, GOVCERT-regdrep p) (no ¬p) → failure (genErrors ¬p) - Computational-GOVCERT .computeProof ce gs (deregdrep c d) = - case ¿ c ∈ dom (GState.dreps gs) × (DRepDeposit c , d) ∈ (GState.deposits gs) ¿ of λ where + Computational-GOVCERT .computeProof ce cs (deregdrep c d) = + case ¿ c ∈ dom (GState.dreps (CertState.gState cs)) × (DRepDeposit c , d) ∈ (GState.deposits (CertState.gState cs)) ¿ of λ where (yes p) → success (-, GOVCERT-deregdrep p) (no ¬p) → failure (genErrors ¬p) - Computational-GOVCERT .computeProof ce gs (ccreghot c _) = - let open CertEnv ce; open GState gs in - case ¿ ((c , nothing) ∉ ccHotKeys ˢ) × c ∈ coldCreds ¿ of λ where + Computational-GOVCERT .computeProof ce cs (ccreghot c _) = + let open CertEnv ce in + case ¿ ((c , nothing) ∉ GState.ccHotKeys (CertState.gState cs) ˢ) × c ∈ coldCreds ¿ of λ where (yes p) → success (-, GOVCERT-ccreghot p) (no ¬p) → failure (genErrors ¬p) Computational-GOVCERT .computeProof _ _ _ = failure "Unexpected certificate in GOVCERT" - Computational-GOVCERT .completeness ce gs + Computational-GOVCERT .completeness ce cs (regdrep c d _) _ (GOVCERT-regdrep p) rewrite dec-yes ¿ (let open CertEnv ce; open PParams pp in - (d ≡ drepDeposit × c ∉ dom (GState.dreps gs)) ⊎ (d ≡ 0 × c ∈ dom (GState.dreps gs))) + (d ≡ drepDeposit × c ∉ dom (GState.dreps (CertState.gState cs))) ⊎ (d ≡ 0 × c ∈ dom (GState.dreps (CertState.gState cs)))) ¿ p .proj₂ = refl - Computational-GOVCERT .completeness _ gs + Computational-GOVCERT .completeness _ cs (deregdrep c d) _ (GOVCERT-deregdrep p) - rewrite dec-yes ¿ c ∈ dom (GState.dreps gs) × (DRepDeposit c , d) ∈ (GState.deposits gs) ¿ p .proj₂ = refl - Computational-GOVCERT .completeness ce gs + rewrite dec-yes ¿ c ∈ dom (GState.dreps (CertState.gState cs)) × (DRepDeposit c , d) ∈ (GState.deposits (CertState.gState cs)) ¿ p .proj₂ = refl + Computational-GOVCERT .completeness ce cs (ccreghot c _) _ (GOVCERT-ccreghot p) - rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys gs) ˢ) × c ∈ CertEnv.coldCreds ce) ¿) p .proj₂ = refl + rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys (CertState.gState cs)) ˢ) × c ∈ CertEnv.coldCreds ce) ¿) p .proj₂ = refl Computational-CERT : Computational _⊢_⇀⦇_,CERT⦈_ String Computational-CERT .computeProof ce cs dCert with computeProof ⟦ CertEnv.pp ce , PState.pools (CertState.pState cs) , dom (GState.dreps (CertState.gState cs)) ⟧ (CertState.dState cs) dCert | computeProof (CertEnv.pp ce) (CertState.pState cs) dCert - | computeProof ce (CertState.gState cs) dCert + | computeProof ce cs dCert ... | success (_ , h) | _ | _ = success (-, CERT-deleg h) ... | failure _ | success (_ , h) | _ = success (-, CERT-pool h) ... | failure _ | failure _ | success (_ , h) = success (-, CERT-vdel h) @@ -153,15 +153,15 @@ instance Computational-CERT .completeness Γ cs dCert@(regdrep c d an) cs' (CERT-vdel h) - with computeProof Γ (CertState.gState cs) dCert | completeness _ _ _ _ h + with computeProof {STS = _⊢_⇀⦇_,GOVCERT⦈_} Γ cs dCert | completeness _ _ _ _ h ... | success _ | refl = refl Computational-CERT .completeness Γ cs dCert@(deregdrep c _) cs' (CERT-vdel h) - with computeProof Γ (CertState.gState cs) dCert | completeness _ _ _ _ h + with computeProof {STS = _⊢_⇀⦇_,GOVCERT⦈_} Γ cs dCert | completeness _ _ _ _ h ... | success _ | refl = refl Computational-CERT .completeness Γ cs dCert@(ccreghot c mkh) cs' (CERT-vdel h) - with computeProof Γ (CertState.gState cs) dCert | completeness _ _ _ _ h + with computeProof {STS = _⊢_⇀⦇_,GOVCERT⦈_} Γ cs dCert | completeness _ _ _ _ h ... | success _ | refl = refl @@ -181,23 +181,6 @@ instance × mapˢ (map₁ RewardAddress.stake) (CertEnv.wdrls ce ˢ) ⊆ rewards ˢ ¿ p .proj₂ = refl - -- POST-CERT has no premises, so computing always succeeds - -- with the unique post-state and proof CERT-post. - Computational-POST-CERT : Computational _⊢_⇀⦇_,POST-CERT⦈_ String - Computational-POST-CERT .computeProof ce cs tt = success ( cs' , CERT-post) - where - dreps : DReps - dreps = GState.dreps (CertState.gState cs) - validVoteDelegs : VoteDelegs - validVoteDelegs = (DState.voteDelegs (CertState.dState cs)) ∣^ ( mapˢ vDelegCredential (dom dreps) ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ []) ) - cs' : CertState - cs' = ⟦ ⟦ validVoteDelegs , _ , _ ⟧ , CertState.pState cs , CertState.gState cs ⟧ - - -- Completeness: the relational proof pins s' to exactly `post`, - -- and computeProof returns success at that same state; so refl. - Computational-POST-CERT .completeness ce cs _ cs' CERT-post = refl - - Computational-CERTS : Computational _⊢_⇀⦇_,CERTS⦈_ String Computational-CERTS = it ``` diff --git a/src/Ledger/Conway/Conformance/Equivalence.lagda.md b/src/Ledger/Conway/Conformance/Equivalence.lagda.md index cbbbd14732..43939f61a3 100644 --- a/src/Ledger/Conway/Conformance/Equivalence.lagda.md +++ b/src/Ledger/Conway/Conformance/Equivalence.lagda.md @@ -188,26 +188,26 @@ WellformedLState s = certDepositsC (C.LState.certState s) ≡ᵈ certDeposits (c getValidCertDepositsCERTS : ∀ {Γ s certs s'} deposits (open L.CertEnv Γ using (pp)) → certDepositsC s ≡ᵈ (certDDeps deposits , certGDeps deposits) - → RunTraceAndThen C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ Γ s certs s' + → ReflexiveTransitiveClosure {sts = C._⊢_⇀⦇_,CERT⦈_} Γ s certs s' → L.ValidCertDeposits pp deposits certs -getValidCertDepositsCERTS deposits wf (run-[] x) = L.[] -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-deleg (C.DELEG-delegate x)) rs) +getValidCertDepositsCERTS deposits wf (BS-base x) = L.[] +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-deleg (C.DELEG-delegate x)) rs) = L.delegate (getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-deleg (C.DELEG-dereg (_ , h , h'))) rs) +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-deleg (C.DELEG-dereg (_ , h , h'))) rs) = L.dereg (∈-filter .Equivalence.from (wf .proj₁ .proj₁ h) .proj₂) h' (getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-deleg (C.DELEG-reg x)) rs) +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-deleg (C.DELEG-reg x)) rs) = L.reg (getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-pool L.POOL-regpool) rs) +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-pool L.POOL-regpool) rs) = L.regpool (getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-pool C.POOL-retirepool) rs) +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-pool C.POOL-retirepool) rs) = L.retirepool (getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-vdel (C.GOVCERT-regdrep x)) rs) +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-vdel (C.GOVCERT-regdrep x)) rs) = L.regdrep (getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-vdel (C.GOVCERT-deregdrep (_ , h))) rs) +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-vdel (C.GOVCERT-deregdrep (_ , h))) rs) = L.deregdrep (∈-filter .Equivalence.from (wf .proj₂ .proj₁ h) .proj₂) (getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) -getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (run-∷ (C.CERT-vdel (C.GOVCERT-ccreghot x)) rs) +getValidCertDepositsCERTS {Γ} {s} {cert ∷ _} deposits wf (BS-ind (C.CERT-vdel (C.GOVCERT-ccreghot x)) rs) = L.ccreghot(getValidCertDepositsCERTS _ (lemUpdCert (L.CertEnv.pp Γ) (certDepositsC s) deposits cert wf) rs) @@ -269,17 +269,17 @@ instance open IsEquivalence ≡ᵈ-isEquivalence renaming (refl to ≡ᵈ-refl; sym to ≡ᵈ-sym; trans to ≡ᵈ-trans) lemCERTS'DepositsC : ∀ {Γ s dcerts s'} (open C.CertEnv Γ using (pp)) - → RunTraceAndThen C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ Γ s dcerts s' + → ReflexiveTransitiveClosure {sts = C._⊢_⇀⦇_,CERT⦈_} Γ s dcerts s' → certDepositsC s' ≡ ⟨ updateDDeps pp dcerts , updateGDeps pp dcerts ⟩ (certDepositsC s) -lemCERTS'DepositsC (run-[] C.CERT-post) = refl -lemCERTS'DepositsC (run-∷ (C.CERT-deleg (C.DELEG-delegate _)) rs) = lemCERTS'DepositsC rs -lemCERTS'DepositsC (run-∷ (C.CERT-deleg (C.DELEG-dereg _)) rs) = lemCERTS'DepositsC rs -lemCERTS'DepositsC (run-∷ (C.CERT-deleg (C.DELEG-reg _)) rs) = lemCERTS'DepositsC rs -lemCERTS'DepositsC (run-∷ (C.CERT-pool L.POOL-regpool ) rs) = lemCERTS'DepositsC rs -lemCERTS'DepositsC (run-∷ (C.CERT-pool C.POOL-retirepool ) rs) = lemCERTS'DepositsC rs -lemCERTS'DepositsC (run-∷ (C.CERT-vdel (C.GOVCERT-regdrep _)) rs) = lemCERTS'DepositsC rs -lemCERTS'DepositsC (run-∷ (C.CERT-vdel (C.GOVCERT-deregdrep _)) rs) = lemCERTS'DepositsC rs -lemCERTS'DepositsC (run-∷ (C.CERT-vdel (C.GOVCERT-ccreghot _)) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-base Id-nop) = refl +lemCERTS'DepositsC (BS-ind (C.CERT-deleg (C.DELEG-delegate _)) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-ind (C.CERT-deleg (C.DELEG-dereg _)) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-ind (C.CERT-deleg (C.DELEG-reg _)) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-ind (C.CERT-pool L.POOL-regpool ) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-ind (C.CERT-pool C.POOL-retirepool ) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-ind (C.CERT-vdel (C.GOVCERT-regdrep _)) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-ind (C.CERT-vdel (C.GOVCERT-deregdrep _)) rs) = lemCERTS'DepositsC rs +lemCERTS'DepositsC (BS-ind (C.CERT-vdel (C.GOVCERT-ccreghot _)) rs) = lemCERTS'DepositsC rs lemCERTSDepositsC : ∀ {Γ s txCerts s'} (open C.CertEnv Γ using (pp)) → Γ C.⊢ s ⇀⦇ txCerts ,CERTS⦈ s' @@ -338,54 +338,54 @@ updateCDep pp cert (ddep , gdep) = updateDDep pp cert ddep , updateGDep pp cert opaque castCERTS' : ∀ {Γ certs} {s s' : L.CertState} deps₁ deps₂ deps₁' → deps₁ ≡ᵈ deps₂ - → RunTraceAndThen C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ Γ (deps₁ ⊢conv s) certs (deps₁' ⊢conv s') + → ReflexiveTransitiveClosure {sts = C._⊢_⇀⦇_,CERT⦈_} Γ (deps₁ ⊢conv s) certs (deps₁' ⊢conv s') → ∃[ deps₂' ] deps₁' ≡ᵈ deps₂' - × RunTraceAndThen C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ Γ (deps₂ ⊢conv s) certs (deps₂' ⊢conv s') - castCERTS' deps₁ deps₂ deps₁' eqd (run-[] C.CERT-post) = deps₂ , eqd , run-[] C.CERT-post - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-deleg {dCert = cert} (C.DELEG-delegate h)) rs) + × ReflexiveTransitiveClosure {sts = C._⊢_⇀⦇_,CERT⦈_} Γ (deps₂ ⊢conv s) certs (deps₂' ⊢conv s') + castCERTS' deps₁ deps₂ deps₁' eqd (BS-base Id-nop) = deps₂ , eqd , BS-base Id-nop + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-deleg {dCert = cert} (C.DELEG-delegate h)) rs) = let open C.CertEnv Γ using (pp) deps₂' , eqd' , rs' = castCERTS' (updateCDep pp cert deps₁) (updateCDep pp cert deps₂) deps₁' (⟨ cong-updateDDep {pp} cert {deps₁ .proj₁} {deps₂ .proj₁} , cong-updateGDep {pp} cert {deps₁ .proj₂} {deps₂ .proj₂} ⟩ eqd) rs - in deps₂' , eqd' , run-∷ (C.CERT-deleg (C.DELEG-delegate h)) rs' + in deps₂' , eqd' , BS-ind (C.CERT-deleg (C.DELEG-delegate h)) rs' - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-deleg {dCert = cert} (C.DELEG-dereg (a , b , c))) rs) = + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-deleg {dCert = cert} (C.DELEG-dereg (a , b , c))) rs) = let open C.CertEnv Γ using (pp) deps₂' , eqd' , rs' = castCERTS' (updateCDep pp cert deps₁) (updateCDep pp cert deps₂) deps₁' (⟨ cong-updateDDep {pp} cert {deps₁ .proj₁} {deps₂ .proj₁} , cong-updateGDep {pp} cert {deps₁ .proj₂} {deps₂ .proj₂} ⟩ eqd) rs - in deps₂' , eqd' , run-∷ (C.CERT-deleg (C.DELEG-dereg (a , eqd .proj₁ .proj₁ b , c))) rs' - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-deleg {dCert = cert} (C.DELEG-reg h)) rs) = + in deps₂' , eqd' , BS-ind (C.CERT-deleg (C.DELEG-dereg (a , eqd .proj₁ .proj₁ b , c))) rs' + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-deleg {dCert = cert} (C.DELEG-reg h)) rs) = let open C.CertEnv Γ using (pp) deps₂' , eqd' , rs' = castCERTS' (updateCDep pp cert deps₁) (updateCDep pp cert deps₂) deps₁' (⟨ cong-updateDDep {pp} cert {deps₁ .proj₁} {deps₂ .proj₁} , cong-updateGDep {pp} cert {deps₁ .proj₂} {deps₂ .proj₂} ⟩ eqd) rs - in deps₂' , eqd' , run-∷ (C.CERT-deleg (C.DELEG-reg h)) rs' + in deps₂' , eqd' , BS-ind (C.CERT-deleg (C.DELEG-reg h)) rs' - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-pool {dCert = cert} L.POOL-regpool) rs) = + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-pool {dCert = cert} L.POOL-regpool) rs) = let deps₂' , eqd' , rs' = castCERTS' deps₁ deps₂ deps₁' eqd rs - in deps₂' , eqd' , run-∷ (C.CERT-pool L.POOL-regpool) rs' + in deps₂' , eqd' , BS-ind (C.CERT-pool L.POOL-regpool) rs' - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-pool {dCert = cert} C.POOL-retirepool) rs) = + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-pool {dCert = cert} C.POOL-retirepool) rs) = let deps₂' , eqd' , rs' = castCERTS' deps₁ deps₂ deps₁' eqd rs - in deps₂' , eqd' , run-∷ (C.CERT-pool C.POOL-retirepool) rs' - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-vdel {dCert = cert} (C.GOVCERT-regdrep h)) rs) = + in deps₂' , eqd' , BS-ind (C.CERT-pool C.POOL-retirepool) rs' + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-vdel {dCert = cert} (C.GOVCERT-regdrep h)) rs) = let open C.CertEnv Γ using (pp) deps₂' , eqd' , rs' = castCERTS' (updateCDep pp cert deps₁) (updateCDep pp cert deps₂) deps₁' (⟨ cong-updateDDep {pp} cert {deps₁ .proj₁} {deps₂ .proj₁} , cong-updateGDep {pp} cert {deps₁ .proj₂} {deps₂ .proj₂} ⟩ eqd) rs - in deps₂' , eqd' , run-∷ (C.CERT-vdel (C.GOVCERT-regdrep h)) rs' - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-vdel {dCert = cert} (C.GOVCERT-deregdrep (a , b))) rs) = + in deps₂' , eqd' , BS-ind (C.CERT-vdel (C.GOVCERT-regdrep h)) rs' + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-vdel {dCert = cert} (C.GOVCERT-deregdrep (a , b))) rs) = let open C.CertEnv Γ using (pp) deps₂' , eqd' , rs' = castCERTS' (updateCDep pp cert deps₁) (updateCDep pp cert deps₂) deps₁' (⟨ cong-updateDDep {pp} cert {deps₁ .proj₁} {deps₂ .proj₁} , cong-updateGDep {pp} cert {deps₁ .proj₂} {deps₂ .proj₂} ⟩ eqd) rs - in deps₂' , eqd' , run-∷ (C.CERT-vdel (C.GOVCERT-deregdrep (a , eqd .proj₂ .proj₁ b))) rs' + in deps₂' , eqd' , BS-ind (C.CERT-vdel (C.GOVCERT-deregdrep (a , eqd .proj₂ .proj₁ b))) rs' -- ^^^^^^^^^^^^^^^^^^^ Actual work - castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (run-∷ (C.CERT-vdel {dCert = cert} (C.GOVCERT-ccreghot h)) rs) = + castCERTS' {Γ} deps₁ deps₂ deps₁' eqd (BS-ind (C.CERT-vdel {dCert = cert} (C.GOVCERT-ccreghot h)) rs) = let deps₂' , eqd' , rs' = castCERTS' deps₁ deps₂ deps₁' eqd rs - in deps₂' , eqd' , run-∷ (C.CERT-vdel (C.GOVCERT-ccreghot h)) rs' + in deps₂' , eqd' , BS-ind (C.CERT-vdel (C.GOVCERT-ccreghot h)) rs' castCERTS : ∀ {Γ certs} {s s' : L.CertState} deps₁ deps₂ deps₁' → deps₁ ≡ᵈ deps₂ diff --git a/src/Ledger/Conway/Conformance/Equivalence/Certs.lagda.md b/src/Ledger/Conway/Conformance/Equivalence/Certs.lagda.md index 35ca740808..bea8132f82 100644 --- a/src/Ledger/Conway/Conformance/Equivalence/Certs.lagda.md +++ b/src/Ledger/Conway/Conformance/Equivalence/Certs.lagda.md @@ -160,12 +160,6 @@ instance Γ C.⊢ (deposits ⊢conv s) ⇀⦇ _ ,PRE-CERT⦈ (deposits ⊢conv s') PRE-CERTToConf .convⁱ deposits (L.CERT-pre h) = C.CERT-pre h - POST-CERTToConf : ∀ {Γ s s'} - → L.Deposits × L.Deposits - ⊢ Γ L.⊢ s ⇀⦇ _ ,POST-CERT⦈ s' ⭆ⁱ λ deposits _ → - Γ C.⊢ (deposits ⊢conv s) ⇀⦇ _ ,POST-CERT⦈ (deposits ⊢conv s') - POST-CERTToConf .convⁱ deposits L.CERT-post = C.CERT-post - DELEGToConf : ∀ {Γ s dcert dcerts s'} (open L.DelegEnv Γ renaming (pparams to pp)) → CertDeps* pp (dcert ∷ dcerts) ⊢ @@ -183,7 +177,7 @@ instance (open L.CertEnv Γ using (pp)) → CertDeps* pp (dcert ∷ dcerts) ⊢ Γ L.⊢ s ⇀⦇ dcert ,GOVCERT⦈ s' ⭆ⁱ λ deposits _ → - Γ C.⊢ (deposits .depsᵍ ⊢conv s) ⇀⦇ dcert ,GOVCERT⦈ (updateCertDeps deposits .depsᵍ ⊢conv s') + Γ C.⊢ (getCertDeps* deposits ⊢conv s) ⇀⦇ dcert ,GOVCERT⦈ (getCertDeps* (updateCertDeps deposits) ⊢conv s') GOVCERTToConf .convⁱ (regdrep* _ _) (L.GOVCERT-regdrep h) = C.GOVCERT-regdrep h GOVCERTToConf .convⁱ (deregdrep* v _ _) (L.GOVCERT-deregdrep h) = C.GOVCERT-deregdrep (h , v) GOVCERTToConf .convⁱ (ccreghot* _ _) (L.GOVCERT-ccreghot h) = C.GOVCERT-ccreghot h @@ -201,23 +195,23 @@ instance CERTToConf .convⁱ deposits@(ccreghot* _ _) (L.CERT-vdel govcert) = C.CERT-vdel (deposits ⊢conv govcert) CERTToConf .convⁱ deposits@(reg* _ _) (L.CERT-deleg deleg) = C.CERT-deleg (deposits ⊢conv deleg) - CERT-POST-CERTToConf : ∀ {Γ s dcerts s'} (let open L.CertEnv Γ) + CERT*ToConf : ∀ {Γ s dcerts s'} (let open L.CertEnv Γ) → CertDeps* pp dcerts - ⊢ RunTraceAndThen L._⊢_⇀⦇_,CERT⦈_ L._⊢_⇀⦇_,POST-CERT⦈_ Γ s dcerts s' - ⭆ⁱ λ deposits _ → RunTraceAndThen C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ + ⊢ ReflexiveTransitiveClosure {sts = L._⊢_⇀⦇_,CERT⦈_} Γ s dcerts s' + ⭆ⁱ λ deposits _ → ReflexiveTransitiveClosure {sts = C._⊢_⇀⦇_,CERT⦈_} Γ (getCertDeps* deposits ⊢conv s) dcerts (getCertDeps* (updateCertDeps* dcerts deposits) ⊢conv s') - CERT-POST-CERTToConf .convⁱ deposits (run-[] x) = run-[] ((deposits .depsᵈ , deposits .depsᵍ) ⊢conv x) - CERT-POST-CERTToConf .convⁱ deposits (run-∷ x x₁) = run-∷ (deposits ⊢conv x) (updateCertDeps deposits ⊢conv x₁) + CERT*ToConf .convⁱ deposits (BS-base Id-nop) = BS-base Id-nop + CERT*ToConf .convⁱ deposits (BS-ind x x₁) = BS-ind (deposits ⊢conv x) (updateCertDeps deposits ⊢conv x₁) CERTSToConf : ∀ {Γ s dcerts s'} (let open L.CertEnv Γ) → CertDeps* pp dcerts - ⊢ RunTraceAfterAndThen L._⊢_⇀⦇_,PRE-CERT⦈_ L._⊢_⇀⦇_,CERT⦈_ L._⊢_⇀⦇_,POST-CERT⦈_ Γ s dcerts s' - ⭆ⁱ λ deposits _ → RunTraceAfterAndThen C._⊢_⇀⦇_,PRE-CERT⦈_ C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ + ⊢ RunTraceAfter L._⊢_⇀⦇_,PRE-CERT⦈_ L._⊢_⇀⦇_,CERT⦈_ Γ s dcerts s' + ⭆ⁱ λ deposits _ → RunTraceAfter C._⊢_⇀⦇_,PRE-CERT⦈_ C._⊢_⇀⦇_,CERT⦈_ Γ (getCertDeps* deposits ⊢conv s) dcerts (getCertDeps* (updateCertDeps* dcerts deposits) ⊢conv s') - CERTSToConf .convⁱ deposits (run (pre , cert-post)) = run (getCertDeps* deposits ⊢conv pre , deposits ⊢conv cert-post) + CERTSToConf .convⁱ deposits (run (pre , cert-trace)) = run (getCertDeps* deposits ⊢conv pre , deposits ⊢conv cert-trace) -- Converting form Conformance is easier since the deposit tracking disappears. instance @@ -245,21 +239,15 @@ instance Γ L.⊢ (conv s) ⇀⦇ _ ,PRE-CERT⦈ (conv s') PRE-CERTFromConf .convⁱ _ (C.CERT-pre h) = L.CERT-pre h - POST-CERTFromConf : ∀ {Γ s s'} - → Γ C.⊢ s ⇀⦇ _ ,POST-CERT⦈ s' ⭆ - Γ L.⊢ (conv s) ⇀⦇ _ ,POST-CERT⦈ (conv s') - POST-CERTFromConf .convⁱ _ C.CERT-post = L.CERT-post - - - CERT-POST-CERTFromConf : ∀ {Γ s dcerts s'} - → RunTraceAndThen C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ Γ s dcerts s' - ⭆ RunTraceAndThen L._⊢_⇀⦇_,CERT⦈_ L._⊢_⇀⦇_,POST-CERT⦈_ Γ (conv s) dcerts (conv s') - CERT-POST-CERTFromConf .convⁱ _ (run-[] x) = run-[] (conv x) - CERT-POST-CERTFromConf .convⁱ _ (run-∷ x xs) = run-∷ (conv x) (conv xs) + CERT*FromConf : ∀ {Γ s dcerts s'} + → ReflexiveTransitiveClosure {sts = C._⊢_⇀⦇_,CERT⦈_} Γ s dcerts s' + ⭆ ReflexiveTransitiveClosure {sts = L._⊢_⇀⦇_,CERT⦈_} Γ (conv s) dcerts (conv s') + CERT*FromConf .convⁱ _ (BS-base Id-nop) = BS-base Id-nop + CERT*FromConf .convⁱ _ (BS-ind x xs) = BS-ind (conv x) (conv xs) CERTSFromConf : ∀ {Γ s dcerts s'} - → RunTraceAfterAndThen C._⊢_⇀⦇_,PRE-CERT⦈_ C._⊢_⇀⦇_,CERT⦈_ C._⊢_⇀⦇_,POST-CERT⦈_ Γ s dcerts s' ⭆ - RunTraceAfterAndThen L._⊢_⇀⦇_,PRE-CERT⦈_ L._⊢_⇀⦇_,CERT⦈_ L._⊢_⇀⦇_,POST-CERT⦈_ Γ (conv s) dcerts (conv s') - CERTSFromConf .convⁱ _ (run (pre , cert-post)) = run ((conv pre) , conv cert-post) + → RunTraceAfter C._⊢_⇀⦇_,PRE-CERT⦈_ C._⊢_⇀⦇_,CERT⦈_ Γ s dcerts s' ⭆ + RunTraceAfter L._⊢_⇀⦇_,PRE-CERT⦈_ L._⊢_⇀⦇_,CERT⦈_ Γ (conv s) dcerts (conv s') + CERTSFromConf .convⁱ _ (run (pre , cert-trace)) = run ((conv pre) , conv cert-trace) ``` diff --git a/src/Ledger/Conway/Foreign/Cert.agda b/src/Ledger/Conway/Foreign/Cert.agda index b4b8063aed..74174d1441 100644 --- a/src/Ledger/Conway/Foreign/Cert.agda +++ b/src/Ledger/Conway/Foreign/Cert.agda @@ -9,7 +9,7 @@ open import Ledger.Prelude open import Ledger.Prelude.Foreign.HSTypes open import Ledger.Conway.Foreign.HSStructures hiding (CertEnv; DCert) renaming (⟦_,_,_⟧ᶜˢ to ⟦_,_,_⟧ᶜˢ'; CertState to CertState') -open import Ledger.Conway.Foreign.Certs +open import Ledger.Conway.Foreign.Certs public open import Ledger.Conway.Conformance.Certs.Properties govStructure using ( Computational-CERT ; Computational-CERTS @@ -19,9 +19,6 @@ open import Ledger.Conway.Conformance.Certs govStructure open Computational instance - HsTy-CertState = autoHsType CertState ⊣ withConstructor "MkCertState" - Conv-CertState = autoConvert CertState - Conv-CertState-CertState' : Convertible CertState CertState' Conv-CertState-CertState' .to ⟦ dState , pState , gState ⟧ᶜˢ = ⟦ to dState , pState , to gState ⟧ᶜˢ' Conv-CertState-CertState' .from ⟦ dState , pState , gState ⟧ᶜˢ' = ⟦ from dState , pState , from gState ⟧ᶜˢ diff --git a/src/Ledger/Conway/Foreign/Certs.agda b/src/Ledger/Conway/Foreign/Certs.agda index 7a77b77f93..2d29988664 100644 --- a/src/Ledger/Conway/Foreign/Certs.agda +++ b/src/Ledger/Conway/Foreign/Certs.agda @@ -11,10 +11,10 @@ open import Ledger.Prelude.Foreign.HSTypes open import Ledger.Core.Foreign.Address open import Ledger.Conway.Foreign.HSStructures renaming (⟦_,_,_⟧ᵈ to ⟦_,_,_⟧ᵈ'; DState to DState' - ; ⟦_,_⟧ᵛ to ⟦_,_⟧ᵛ'; GState to GState') hiding (CertEnv) + ; ⟦_,_⟧ᵛ to ⟦_,_⟧ᵛ'; GState to GState'; CertState to CertState') hiding (CertEnv) open import Ledger.Conway.Foreign.Gov.Core open import Ledger.Conway.Foreign.PParams -open import Ledger.Conway.Conformance.Certs govStructure using (⟦_,_,_,_⟧ᵈ; ⟦_,_,_⟧ᵛ; DState; GState; CertEnv) +open import Ledger.Conway.Conformance.Certs govStructure using (⟦_,_,_,_⟧ᵈ; ⟦_,_,_⟧ᵛ; DState; GState; CertState; CertEnv) open import Ledger.Conway.Specification.Certs.Properties.Computational govStructure using (Computational-POOL) open import Ledger.Conway.Conformance.Certs.Properties govStructure @@ -80,6 +80,9 @@ instance • fieldPrefix "gs" Conv-GState = autoConvert GState + HsTy-CertState = autoHsType CertState ⊣ withConstructor "MkCertState" + Conv-CertState = autoConvert CertState + Conv-DState-DState' : Convertible DState DState' Conv-DState-DState' .to ⟦ voteDelegs , stakeDelegs , rewards , deposits ⟧ᵈ = ⟦ voteDelegs , stakeDelegs , stakeDelegs ⟧ᵈ' Conv-DState-DState' .from ⟦ voteDelegs , stakeDelegs , rewards ⟧ᵈ' = ⟦ voteDelegs , stakeDelegs , stakeDelegs , ∅ ⟧ᵈ @@ -98,7 +101,7 @@ pool-step = to (compute Computational-POOL) {-# COMPILE GHC pool-step as poolStep #-} -govcert-step : HsType (CertEnv → GState → DCert → ComputationResult String GState) +govcert-step : HsType (CertEnv → CertState → DCert → ComputationResult String CertState) govcert-step = to (compute Computational-GOVCERT) {-# COMPILE GHC govcert-step as govCertStep #-} diff --git a/src/Ledger/Conway/Specification/Certs.lagda.md b/src/Ledger/Conway/Specification/Certs.lagda.md index a82ca084b8..353c9651b9 100644 --- a/src/Ledger/Conway/Specification/Certs.lagda.md +++ b/src/Ledger/Conway/Specification/Certs.lagda.md @@ -361,6 +361,7 @@ private variable stᵈ stᵈ' : DState stᵍ stᵍ' : GState stᵖ stᵖ' : PState + stᶜ stᶜ' : CertState cc : ℙ Credential ``` --> @@ -519,23 +520,23 @@ data _⊢_⇀⦇_,POOL⦈_ : PoolEnv → PState → DCert → PState → Type wh ### Auxiliary GOVCERT transition system ```agda -data _⊢_⇀⦇_,GOVCERT⦈_ : CertEnv → GState → DCert → GState → Type where +data _⊢_⇀⦇_,GOVCERT⦈_ : CertEnv → CertState → DCert → CertState → Type where GOVCERT-regdrep : ∙ (d ≡ pp .drepDeposit × c ∉ dom dReps) ⊎ (d ≡ 0 × c ∈ dom dReps) ──────────────────────────────── - ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ regdrep c d an ,GOVCERT⦈ ⟦ ❴ c , e + pp .drepActivity ❵ ∪ˡ dReps , ccKeys ⟧ + ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , ⟦ dReps , ccKeys ⟧ ⟧ ⇀⦇ regdrep c d an ,GOVCERT⦈ ⟦ stᵈ , stᵖ , ⟦ ❴ c , e + pp .drepActivity ❵ ∪ˡ dReps , ccKeys ⟧ ⟧ GOVCERT-deregdrep : ∙ c ∈ dom dReps ──────────────────────────────── - ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ deregdrep c d ,GOVCERT⦈ ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys ⟧ + ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ ⟦ vDelegs , sDelegs , rwds ⟧ᵈ , stᵖ , ⟦ dReps , ccKeys ⟧ ⟧ ⇀⦇ deregdrep c d ,GOVCERT⦈ ⟦ ⟦ vDelegs ∣^ ❴ vDelegCredential c ❵ ᶜ , sDelegs , rwds ⟧ᵈ , stᵖ , ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys ⟧ ⟧ GOVCERT-ccreghot : ∙ (c , nothing) ∉ ccKeys ∙ c ∈ cc ──────────────────────────────── - ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ dReps , ccKeys ⟧ ⇀⦇ ccreghot c mc ,GOVCERT⦈ ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys ⟧ + ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , ⟦ dReps , ccKeys ⟧ ⟧ ⇀⦇ ccreghot c mc ,GOVCERT⦈ ⟦ stᵈ , stᵖ , ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys ⟧ ⟧ ``` ## The CERTS Transition System {#sec:the-certs-transition-system} @@ -561,9 +562,9 @@ data _⊢_⇀⦇_,CERT⦈_ : CertEnv → CertState → DCert → CertState → ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ' , stᵍ ⟧ CERT-vdel : - ∙ Γ ⊢ stᵍ ⇀⦇ dCert ,GOVCERT⦈ stᵍ' + ∙ Γ ⊢ stᶜ ⇀⦇ dCert ,GOVCERT⦈ stᶜ' ──────────────────────────────── - Γ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ , stᵍ' ⟧ + Γ ⊢ stᶜ ⇀⦇ dCert ,CERT⦈ stᶜ' ``` ### The PRE-CERT Transition Rule @@ -607,23 +608,9 @@ data _⊢_⇀⦇_,PRE-CERT⦈_ : CertEnv → CertState → ⊤ → CertState → ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards ⟧ , stᵖ , ⟦ dReps , ccHotKeys ⟧ ⟧ ⇀⦇ _ ,PRE-CERT⦈ ⟦ ⟦ voteDelegs , stakeDelegs , constMap wdrlCreds 0 ∪ˡ rewards ⟧ , stᵖ , ⟦ refreshedDReps , ccHotKeys ⟧ ⟧ ``` -### The POST-CERT Transition Rule - -The `POST-CERT`{.AgdaFunction} transition rule is applied at the end of the -`CERTS`{.AgdaDatatype} rule and it ensures that only valid registered -`DReps`{.AgdaInductiveConstructor} are included in the final `CertState`{.AgdaRecord}. - ```agda -data _⊢_⇀⦇_,POST-CERT⦈_ : CertEnv → CertState → ⊤ → CertState → Type where - - CERT-post : - let activeVDelegs = mapˢ vDelegCredential (dom (DRepsOf stᵍ)) - ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ []) - in - ⟦ e , pp , vs , wdrls , cc ⟧ ⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards ⟧ , stᵖ , stᵍ ⟧ ⇀⦇ _ ,POST-CERT⦈ ⟦ ⟦ voteDelegs ∣^ activeVDelegs , stakeDelegs , rewards ⟧ , stᵖ , stᵍ ⟧ - _⊢_⇀⦇_,CERTS⦈_ : CertEnv → CertState → List DCert → CertState → Type -_⊢_⇀⦇_,CERTS⦈_ = RunTraceAfterAndThen _⊢_⇀⦇_,PRE-CERT⦈_ _⊢_⇀⦇_,CERT⦈_ _⊢_⇀⦇_,POST-CERT⦈_ +_⊢_⇀⦇_,CERTS⦈_ = RunTraceAfter _⊢_⇀⦇_,PRE-CERT⦈_ _⊢_⇀⦇_,CERT⦈_ ``` # References {#references .unnumbered} diff --git a/src/Ledger/Conway/Specification/Certs/Properties/Computational.lagda.md b/src/Ledger/Conway/Specification/Certs/Properties/Computational.lagda.md index 8e7d613afc..7814543785 100644 --- a/src/Ledger/Conway/Specification/Certs/Properties/Computational.lagda.md +++ b/src/Ledger/Conway/Specification/Certs/Properties/Computational.lagda.md @@ -71,40 +71,39 @@ instance Computational-POOL .completeness _ _ (retirepool _ _) _ POOL-retirepool = refl Computational-GOVCERT : Computational _⊢_⇀⦇_,GOVCERT⦈_ String - Computational-GOVCERT .computeProof ce stᵍ (regdrep c d _) = + Computational-GOVCERT .computeProof ce cs (regdrep c d _) = let open CertEnv ce; open PParams pp in - case ¿ (d ≡ drepDeposit × c ∉ dom (GState.dreps stᵍ)) - ⊎ (d ≡ 0 × c ∈ dom (GState.dreps stᵍ)) ¿ of λ where + case ¿ (d ≡ drepDeposit × c ∉ dom (GState.dreps (gState cs))) + ⊎ (d ≡ 0 × c ∈ dom (GState.dreps (gState cs))) ¿ of λ where (yes p) → success (-, GOVCERT-regdrep p) (no ¬p) → failure (genErrors ¬p) - Computational-GOVCERT .computeProof _ stᵍ (deregdrep c _) = - let open GState stᵍ in - case c ∈? dom dreps of λ where + Computational-GOVCERT .computeProof _ cs (deregdrep c _) = + case c ∈? dom (GState.dreps (gState cs)) of λ where (yes p) → success (-, GOVCERT-deregdrep p) (no ¬p) → failure (genErrors ¬p) - Computational-GOVCERT .computeProof ce stᵍ (ccreghot c _) = - let open CertEnv ce; open GState stᵍ in - case ¿ ((c , nothing) ∉ ccHotKeys ˢ) × c ∈ coldCreds ¿ of λ where + Computational-GOVCERT .computeProof ce cs (ccreghot c _) = + let open CertEnv ce in + case ¿ ((c , nothing) ∉ GState.ccHotKeys (gState cs) ˢ) × c ∈ coldCreds ¿ of λ where (yes p) → success (-, GOVCERT-ccreghot p) (no ¬p) → failure (genErrors ¬p) Computational-GOVCERT .computeProof _ _ _ = failure "Unexpected certificate in GOVCERT" - Computational-GOVCERT .completeness ce stᵍ + Computational-GOVCERT .completeness ce cs (regdrep c d _) _ (GOVCERT-regdrep p) rewrite dec-yes - ¿ (let open CertEnv ce; open PParams pp; open GState stᵍ in - (d ≡ drepDeposit × c ∉ dom dreps) ⊎ (d ≡ 0 × c ∈ dom dreps)) + ¿ (let open CertEnv ce; open PParams pp in + (d ≡ drepDeposit × c ∉ dom (GState.dreps (gState cs))) ⊎ (d ≡ 0 × c ∈ dom (GState.dreps (gState cs)))) ¿ p .proj₂ = refl - Computational-GOVCERT .completeness _ stᵍ + Computational-GOVCERT .completeness _ cs (deregdrep c _) _ (GOVCERT-deregdrep p) - rewrite dec-yes (c ∈? dom (GState.dreps stᵍ)) p .proj₂ = refl - Computational-GOVCERT .completeness ce stᵍ + rewrite dec-yes (c ∈? dom (GState.dreps (gState cs))) p .proj₂ = refl + Computational-GOVCERT .completeness ce cs (ccreghot c _) _ (GOVCERT-ccreghot p) - rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys stᵍ) ˢ) × c ∈ CertEnv.coldCreds ce) ¿) p .proj₂ = refl + rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys (gState cs)) ˢ) × c ∈ CertEnv.coldCreds ce) ¿) p .proj₂ = refl Computational-CERT : Computational _⊢_⇀⦇_,CERT⦈_ String Computational-CERT .computeProof ce cs dCert with computeProof ⟦ CertEnv.pp ce , PState.pools (pState cs) , dom (GState.dreps (gState cs)) ⟧ (dState cs) dCert - | computeProof (CertEnv.pp ce) (pState cs) dCert | computeProof ce (gState cs) dCert + | computeProof (CertEnv.pp ce) (pState cs) dCert | computeProof ce cs dCert ... | success (_ , h) | _ | _ = success (-, CERT-deleg h) ... | failure _ | success (_ , h) | _ = success (-, CERT-pool h) ... | failure _ | failure _ | success (_ , h) = success (-, CERT-vdel h) @@ -131,18 +130,17 @@ instance with completeness _ _ _ _ h ... | refl = refl Computational-CERT .completeness ce cs - dCert@(regdrep c d an) - cs' (CERT-vdel h) - with computeProof ce (gState cs) dCert | completeness _ _ _ _ h - ... | success _ | refl = refl + (regdrep c d an) _ (CERT-vdel (GOVCERT-regdrep p)) + rewrite dec-yes + ¿ (let open CertEnv ce; open PParams pp in + (d ≡ drepDeposit × c ∉ dom (GState.dreps (gState cs))) ⊎ (d ≡ 0 × c ∈ dom (GState.dreps (gState cs)))) + ¿ p .proj₂ = refl Computational-CERT .completeness ce cs - dCert@(deregdrep c _) cs' (CERT-vdel h) - with computeProof ce (gState cs) dCert | completeness _ _ _ _ h - ... | success _ | refl = refl + (deregdrep c _) _ (CERT-vdel (GOVCERT-deregdrep p)) + rewrite dec-yes (c ∈? dom (GState.dreps (gState cs))) p .proj₂ = refl Computational-CERT .completeness ce cs - dCert@(ccreghot c mkh) cs' (CERT-vdel h) - with computeProof ce (gState cs) dCert | completeness _ _ _ _ h - ... | success _ | refl = refl + (ccreghot c _) _ (CERT-vdel (GOVCERT-ccreghot p)) + rewrite dec-yes (¿ (((c , nothing) ∉ (GState.ccHotKeys (gState cs)) ˢ) × c ∈ CertEnv.coldCreds ce) ¿) p .proj₂ = refl Computational-PRE-CERT : Computational _⊢_⇀⦇_,PRE-CERT⦈_ String Computational-PRE-CERT .computeProof ce cs _ = @@ -160,22 +158,6 @@ instance × mapˢ (map₁ RewardAddress.stake) (CertEnv.wdrls ce ˢ) ⊆ rewards ˢ ¿ p .proj₂ = refl - -- POST-CERT has no premises, so computing always succeeds - -- with the unique post-state and proof CERT-post. - Computational-POST-CERT : Computational _⊢_⇀⦇_,POST-CERT⦈_ String - Computational-POST-CERT .computeProof ce cs tt = success ( cs' , CERT-post) - where - dreps : DReps - dreps = GState.dreps (gState cs) - validVoteDelegs : VoteDelegs - validVoteDelegs = (VoteDelegsOf cs) ∣^ ( mapˢ vDelegCredential (dom dreps) ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ []) ) - cs' : CertState - cs' = ⟦ ⟦ validVoteDelegs , StakeDelegsOf cs , RewardsOf cs ⟧ , PStateOf cs , GStateOf cs ⟧ - - -- Completeness: the relational proof pins s' to exactly `post`, - -- and computeProof returns success at that same state; so refl. - Computational-POST-CERT .completeness ce cs _ cs' CERT-post = refl - Computational-CERTS : Computational _⊢_⇀⦇_,CERTS⦈_ String Computational-CERTS = it ``` diff --git a/src/Ledger/Conway/Specification/Certs/Properties/PoVLemmas.lagda.md b/src/Ledger/Conway/Specification/Certs/Properties/PoVLemmas.lagda.md index a4b7277fcc..8a8e5b823f 100644 --- a/src/Ledger/Conway/Specification/Certs/Properties/PoVLemmas.lagda.md +++ b/src/Ledger/Conway/Specification/Certs/Properties/PoVLemmas.lagda.md @@ -91,7 +91,9 @@ CERT-pov {s = ⟦ _ , stᵖ , stᵍ ⟧ᶜˢ}{⟦ _ , stᵖ' , stᵍ' ⟧ᶜˢ} ( ≡ᵉ.trans (∪-cong ≡ᵉ.refl (res-singleton'{m = rwds} x)) (≡ᵉ.sym $ disjoint-∪ˡ-∪ disj) ) CERT-pov (CERT-pool x) = refl -CERT-pov (CERT-vdel x) = refl +CERT-pov (CERT-vdel (GOVCERT-regdrep _)) = refl +CERT-pov (CERT-vdel (GOVCERT-deregdrep _)) = refl +CERT-pov (CERT-vdel (GOVCERT-ccreghot _)) = refl injOn : (wdls : Withdrawals) → ∀[ a ∈ dom (wdls ˢ) ] NetworkIdOf a ≡ NetworkId @@ -184,32 +186,6 @@ value of the withdrawals in `Γ`{.AgdaBound}. In other terms, ``` --> -**Lemma (`POST-CERT`{.AgdaOperator} rule preserves value).** - -*Informally*. - -Let `Γ`{.AgdaBound} : `CertEnv`{.AgdaRecord} be a certificate environment, and let -`s`{.AgdaBound}, `s'`{.AgdaBound} : `CertState`{.AgdaRecord} be certificate states such that -`s`{.AgdaBound} `⇀⦇`{.AgdaDatatype} \_ `,POST-CERT⦈`{.AgdaDatatype} `s'`{.AgdaBound}. -Then, the value of `s`{.AgdaBound} is equal to the value of `s'`{.AgdaBound}. -In other terms, - -`getCoin`{.AgdaField} `s`{.AgdaBound} $≡$ `getCoin`{.AgdaField} `s'`{.AgdaBound}. - -*Formally*. - -```agda - POST-CERT-pov : {Γ : CertEnv} {s s' : CertState} - → Γ ⊢ s ⇀⦇ _ ,POST-CERT⦈ s' - → getCoin s ≡ getCoin s' -``` - -*Proof*. - -```agda - POST-CERT-pov CERT-post = refl -``` - **Lemma (iteration of `CERT`{.AgdaOperator} rule preserves value).** *Informally*. Let `l`{.AgdaBound} be a list of `DCerts`{.AgdaDatatype}, and let @@ -222,13 +198,13 @@ Then, the value of `s₁`{.AgdaBound} is equal to the value of `sₙ`{.AgdaBound ```agda sts-pov : {Γ : CertEnv} {s₁ sₙ : CertState} {sigs : List DCert} - → RunTraceAndThen _⊢_⇀⦇_,CERT⦈_ _⊢_⇀⦇_,POST-CERT⦈_ Γ s₁ sigs sₙ + → ReflexiveTransitiveClosure {sts = _⊢_⇀⦇_,CERT⦈_} Γ s₁ sigs sₙ → getCoin s₁ ≡ getCoin sₙ ``` *Proof*. ```agda - sts-pov (run-[] x) = POST-CERT-pov x - sts-pov (run-∷ x xs) = trans (CERT-pov x) (sts-pov xs) + sts-pov (BS-base Id-nop) = refl + sts-pov (BS-ind x xs) = trans (CERT-pov x) (sts-pov xs) ``` diff --git a/src/Ledger/Dijkstra/Foreign/Cert.agda b/src/Ledger/Dijkstra/Foreign/Cert.agda index c5faf2b6f6..801def1d35 100644 --- a/src/Ledger/Dijkstra/Foreign/Cert.agda +++ b/src/Ledger/Dijkstra/Foreign/Cert.agda @@ -17,10 +17,6 @@ open import Ledger.Dijkstra.Specification.Certs.Properties.Computational DummyGo open Computational -instance - HsTy-CertState = autoHsType CertState ⊣ withConstructor "MkCertState" - Conv-CertState = autoConvert CertState - cert-step : HsType (CertEnv → CertState → DCert → ComputationResult String CertState) cert-step = to (compute Computational-CERT) diff --git a/src/Ledger/Dijkstra/Foreign/Certs.agda b/src/Ledger/Dijkstra/Foreign/Certs.agda index 73f42afed7..6cd3734a95 100644 --- a/src/Ledger/Dijkstra/Foreign/Certs.agda +++ b/src/Ledger/Dijkstra/Foreign/Certs.agda @@ -59,6 +59,9 @@ instance • fieldPrefix "ce" Conv-CertEnv = autoConvert CertEnv + HsTy-CertState = autoHsType CertState ⊣ withConstructor "MkCertState" + Conv-CertState = autoConvert CertState + -- Computational step functions deleg-step : HsType (DelegEnv → DState → DCert → ComputationResult String DState) @@ -71,7 +74,7 @@ pool-step = to (compute Computational-POOL) {-# COMPILE GHC pool-step as poolStep #-} -govcert-step : HsType (GovCertEnv → GState → DCert → ComputationResult String GState) +govcert-step : HsType (GovCertEnv → CertState → DCert → ComputationResult String CertState) govcert-step = to (compute Computational-GOVCERT) {-# COMPILE GHC govcert-step as govCertStep #-} diff --git a/src/Ledger/Dijkstra/Specification/Certs.lagda.md b/src/Ledger/Dijkstra/Specification/Certs.lagda.md index a4100f60ec..67e62bfd96 100644 --- a/src/Ledger/Dijkstra/Specification/Certs.lagda.md +++ b/src/Ledger/Dijkstra/Specification/Certs.lagda.md @@ -302,6 +302,8 @@ private variable retiring : Retiring A : Type deposits deposits' : A ⇀ Coin + depositsᵍ depositsᵍ' : Credential ⇀ Coin + depositsᵈ depositsᵈ' : Credential ⇀ Coin an : Anchor Γ : CertEnv @@ -321,6 +323,7 @@ private variable stᵈ stᵈ' : DState stᵍ stᵍ' : GState stᵖ stᵖ' : PState + stᶜ stᶜ' : CertState cc : ℙ Credential ``` --> @@ -448,24 +451,24 @@ data _⊢_⇀⦇_,POOL⦈_ : PoolEnv → PState → DCert → PState → Type wh ## `GOVCERT`{.AgdaDatatype} Transition System ```agda -data _⊢_⇀⦇_,GOVCERT⦈_ : GovCertEnv → GState → DCert → GState → Type where +data _⊢_⇀⦇_,GOVCERT⦈_ : GovCertEnv → CertState → DCert → CertState → Type where GOVCERT-regdrep : ∙ (d ≡ pp .drepDeposit × c ∉ dom dReps) ⊎ (d ≡ 0 × c ∈ dom dReps) ──────────────────────────────── - ⟦ e , pp , cc ⟧ ⊢ ⟦ dReps , ccKeys , deposits ⟧ ⇀⦇ regdrep c d an ,GOVCERT⦈ ⟦ ❴ c , e + pp .drepActivity ❵ ∪ˡ dReps , ccKeys , deposits ∪⁺ ❴ c , d ❵ ⟧ + ⟦ e , pp , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , ⟦ dReps , ccKeys , depositsᵍ ⟧ ⟧ ⇀⦇ regdrep c d an ,GOVCERT⦈ ⟦ stᵈ , stᵖ , ⟦ ❴ c , e + pp .drepActivity ❵ ∪ˡ dReps , ccKeys , depositsᵍ ∪⁺ ❴ c , d ❵ ⟧ ⟧ GOVCERT-deregdrep : ∙ c ∈ dom dReps - ∙ (c , d) ∈ deposits + ∙ (c , d) ∈ depositsᵍ ──────────────────────────────── - ⟦ e , pp , cc ⟧ ⊢ ⟦ dReps , ccKeys , deposits ⟧ ⇀⦇ deregdrep c d ,GOVCERT⦈ ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys , deposits ∣ ❴ c ❵ ᶜ ⟧ + ⟦ e , pp , cc ⟧ ⊢ ⟦ ⟦ vDelegs , sDelegs , rwds , depositsᵈ ⟧ , stᵖ , ⟦ dReps , ccKeys , depositsᵍ ⟧ ⟧ ⇀⦇ deregdrep c d ,GOVCERT⦈ ⟦ ⟦ vDelegs ∣^ ❴ vDelegCredential c ❵ ᶜ , sDelegs , rwds , depositsᵈ ⟧ , stᵖ , ⟦ dReps ∣ ❴ c ❵ ᶜ , ccKeys , depositsᵍ ∣ ❴ c ❵ ᶜ ⟧ ⟧ GOVCERT-ccreghot : ∙ (c , nothing) ∉ ccKeys ∙ c ∈ cc ──────────────────────────────── - ⟦ e , pp , cc ⟧ ⊢ ⟦ dReps , ccKeys , deposits ⟧ ⇀⦇ ccreghot c mc ,GOVCERT⦈ ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys , deposits ⟧ + ⟦ e , pp , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , ⟦ dReps , ccKeys , depositsᵍ ⟧ ⟧ ⇀⦇ ccreghot c mc ,GOVCERT⦈ ⟦ stᵈ , stᵖ , ⟦ dReps , ❴ c , mc ❵ ∪ˡ ccKeys , depositsᵍ ⟧ ⟧ ``` # `CERT`{.AgdaDatatype} Transition System @@ -484,9 +487,9 @@ data _⊢_⇀⦇_,CERT⦈_ : CertEnv → CertState → DCert → CertState → ⟦ e , pp , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ' , stᵍ ⟧ CERT-gov : - ∙ ⟦ e , pp , cc ⟧ ⊢ stᵍ ⇀⦇ dCert ,GOVCERT⦈ stᵍ' + ∙ ⟦ e , pp , cc ⟧ ⊢ stᶜ ⇀⦇ dCert ,GOVCERT⦈ stᶜ' ──────────────────────────────── - ⟦ e , pp , cc ⟧ ⊢ ⟦ stᵈ , stᵖ , stᵍ ⟧ ⇀⦇ dCert ,CERT⦈ ⟦ stᵈ , stᵖ , stᵍ' ⟧ + ⟦ e , pp , cc ⟧ ⊢ stᶜ ⇀⦇ dCert ,CERT⦈ stᶜ' ``` # `CERTS`{.AgdaDatatype} Transition System diff --git a/src/Ledger/Dijkstra/Specification/Certs/Properties/Computational.lagda.md b/src/Ledger/Dijkstra/Specification/Certs/Properties/Computational.lagda.md index e2f64e5833..fdf678590d 100644 --- a/src/Ledger/Dijkstra/Specification/Certs/Properties/Computational.lagda.md +++ b/src/Ledger/Dijkstra/Specification/Certs/Properties/Computational.lagda.md @@ -72,35 +72,35 @@ instance Computational-POOL .completeness _ _ (retirepool _ _) _ POOL-retirepool = refl Computational-GOVCERT : Computational _⊢_⇀⦇_,GOVCERT⦈_ String - Computational-GOVCERT .computeProof ce gs (regdrep c d _) = - case ¿ d ≡ PParams.drepDeposit (PParamsOf ce) × c ∉ dom (DRepsOf gs) - ⊎ d ≡ 0 × c ∈ dom (DRepsOf gs) ¿ of λ where + Computational-GOVCERT .computeProof ce cs (regdrep c d _) = + case ¿ d ≡ PParams.drepDeposit (PParamsOf ce) × c ∉ dom (DRepsOf cs) + ⊎ d ≡ 0 × c ∈ dom (DRepsOf cs) ¿ of λ where (yes p) → success (-, GOVCERT-regdrep p) (no ¬p) → failure (genErrors ¬p) - Computational-GOVCERT .computeProof ce gs (deregdrep c d) = - case ¿ c ∈ dom (DRepsOf gs) × (c , d) ∈ (DepositsOf gs) ¿ of λ where + Computational-GOVCERT .computeProof ce cs (deregdrep c d) = + case ¿ c ∈ dom (DRepsOf cs) × (c , d) ∈ (DepositsOf (GStateOf cs)) ¿ of λ where (yes p) → success (-, GOVCERT-deregdrep p) (no ¬p) → failure (genErrors ¬p) - Computational-GOVCERT .computeProof ce gs (ccreghot c _) = - case ¿ ((c , nothing) ∉ CCHotKeysOf gs ˢ) × c ∈ ColdCredentialsOf ce ¿ of λ where + Computational-GOVCERT .computeProof ce cs (ccreghot c _) = + case ¿ ((c , nothing) ∉ CCHotKeysOf cs ˢ) × c ∈ ColdCredentialsOf ce ¿ of λ where (yes p) → success (-, GOVCERT-ccreghot p) (no ¬p) → failure (genErrors ¬p) Computational-GOVCERT .computeProof _ _ _ = failure "Unexpected certificate in GOVCERT" - Computational-GOVCERT .completeness ce gs (regdrep c d _) _ (GOVCERT-regdrep p) + Computational-GOVCERT .completeness ce cs (regdrep c d _) _ (GOVCERT-regdrep p) rewrite dec-yes - ¿ (d ≡ PParams.drepDeposit (PParamsOf ce) × c ∉ dom (DRepsOf gs)) - ⊎ (d ≡ 0 × c ∈ dom (DRepsOf gs)) + ¿ (d ≡ PParams.drepDeposit (PParamsOf ce) × c ∉ dom (DRepsOf cs)) + ⊎ (d ≡ 0 × c ∈ dom (DRepsOf cs)) ¿ p .proj₂ = refl - Computational-GOVCERT .completeness _ gs (deregdrep c d) _ (GOVCERT-deregdrep p) - rewrite dec-yes ¿ c ∈ dom (DRepsOf gs) × (c , d) ∈ (DepositsOf gs) ¿ p .proj₂ = refl - Computational-GOVCERT .completeness ce gs (ccreghot c _) _ (GOVCERT-ccreghot p) - rewrite dec-yes ¿ (c , nothing) ∉ CCHotKeysOf gs ˢ × c ∈ ColdCredentialsOf ce ¿ p .proj₂ = refl + Computational-GOVCERT .completeness _ cs (deregdrep c d) _ (GOVCERT-deregdrep p) + rewrite dec-yes ¿ c ∈ dom (DRepsOf cs) × (c , d) ∈ (DepositsOf (GStateOf cs)) ¿ p .proj₂ = refl + Computational-GOVCERT .completeness ce cs (ccreghot c _) _ (GOVCERT-ccreghot p) + rewrite dec-yes ¿ (c , nothing) ∉ CCHotKeysOf cs ˢ × c ∈ ColdCredentialsOf ce ¿ p .proj₂ = refl Computational-CERT : Computational _⊢_⇀⦇_,CERT⦈_ String Computational-CERT .computeProof ce cs dCert with computeProof ⟦ PParamsOf ce , PoolsOf cs , dom (DRepsOf cs) ⟧ (DStateOf cs) dCert | computeProof (PParamsOf ce) (PStateOf cs) dCert - | computeProof ⟦ EpochOf ce , PParamsOf ce , ColdCredentialsOf ce ⟧ (GStateOf cs) dCert + | computeProof ⟦ EpochOf ce , PParamsOf ce , ColdCredentialsOf ce ⟧ cs dCert ... | success (_ , h) | _ | _ = success (-, CERT-deleg h) ... | failure _ | success (_ , h) | _ = success (-, CERT-pool h) @@ -127,17 +127,17 @@ instance with completeness _ _ _ _ h ... | refl = refl Computational-CERT .completeness Γ cs - dCert@(regdrep c _ _) cs' (CERT-gov h) - with computeProof ⟦ EpochOf Γ , PParamsOf Γ , ColdCredentialsOf Γ ⟧ (CertState.gState cs) dCert | completeness _ _ _ _ h - ... | success _ | refl = refl + (regdrep c d an) _ (CERT-gov (GOVCERT-regdrep p)) + rewrite dec-yes + ¿ (d ≡ PParams.drepDeposit (PParamsOf Γ) × c ∉ dom (DRepsOf cs)) + ⊎ (d ≡ 0 × c ∈ dom (DRepsOf cs)) + ¿ p .proj₂ = refl Computational-CERT .completeness Γ cs - dCert@(deregdrep c _) cs' (CERT-gov h) - with computeProof ⟦ EpochOf Γ , PParamsOf Γ , ColdCredentialsOf Γ ⟧ (CertState.gState cs) dCert | completeness _ _ _ _ h - ... | success _ | refl = refl + (deregdrep c d) _ (CERT-gov (GOVCERT-deregdrep p)) + rewrite dec-yes ¿ c ∈ dom (DRepsOf cs) × (c , d) ∈ (DepositsOf (GStateOf cs)) ¿ p .proj₂ = refl Computational-CERT .completeness Γ cs - dCert@(ccreghot c mkh) cs' (CERT-gov h) - with computeProof ⟦ EpochOf Γ , PParamsOf Γ , ColdCredentialsOf Γ ⟧ (CertState.gState cs) dCert | completeness _ _ _ _ h - ... | success _ | refl = refl + (ccreghot c mc) _ (CERT-gov (GOVCERT-ccreghot p)) + rewrite dec-yes ¿ (c , nothing) ∉ CCHotKeysOf cs ˢ × c ∈ ColdCredentialsOf Γ ¿ p .proj₂ = refl Computational-CERTS : Computational _⊢_⇀⦇_,CERTS⦈_ String Computational-CERTS = it diff --git a/src/Ledger/Dijkstra/Specification/Entities.lagda.md b/src/Ledger/Dijkstra/Specification/Entities.lagda.md index af40a8bb8f..f0876ec7dc 100644 --- a/src/Ledger/Dijkstra/Specification/Entities.lagda.md +++ b/src/Ledger/Dijkstra/Specification/Entities.lagda.md @@ -147,8 +147,6 @@ data _⊢_⇀⦇_,SUBENTITIES⦈_ : SubEntitiesEnv → CertState → SubLevelTx SUBENTITIES : let refresh = mapPartial (isGovVoterDRep ∘ voter) (fromList (ListOfGovVotesOf txSub)) refreshedDReps = mapValueRestricted (const (e + pp .drepActivity)) dReps refresh - activeVDelegs = mapˢ vDelegCredential (dom (DRepsOf gState')) - ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ []) withdrawals = WithdrawalsOf txSub withdrawalsCredentials = mapˢ stake (dom withdrawals) @@ -169,7 +167,7 @@ data _⊢_⇀⦇_,SUBENTITIES⦈_ : SubEntitiesEnv → CertState → SubLevelTx ∙ ∀[ a ∈ dom directDeposits ] NetworkIdOf a ≡ NetworkId ∙ directDepositsCredentials ⊆ dom rewards' ──────────────────────────────── - ⟦ e , pp , cc , rewards₀ ⟧ ⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards , depositsᵈ ⟧ , pState , ⟦ dReps , ccHotKeys , depositsᵍ ⟧ ⟧ ⇀⦇ txSub ,SUBENTITIES⦈ ⟦ ⟦ voteDelegs' ∣^ activeVDelegs , stakeDelegs' , applyDirectDeposits directDeposits rewards' , depositsᵈ' ⟧ , pState' , gState' ⟧ + ⟦ e , pp , cc , rewards₀ ⟧ ⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards , depositsᵈ ⟧ , pState , ⟦ dReps , ccHotKeys , depositsᵍ ⟧ ⟧ ⇀⦇ txSub ,SUBENTITIES⦈ ⟦ ⟦ voteDelegs' , stakeDelegs' , applyDirectDeposits directDeposits rewards' , depositsᵈ' ⟧ , pState' , gState' ⟧ ``` ```agda @@ -178,8 +176,6 @@ data _⊢_⇀⦇_,ENTITIES⦈_ : EntitiesEnv → CertState → TopLevelTx → Ce ENTITIES : let refresh = mapPartial (isGovVoterDRep ∘ voter) (fromList (ListOfGovVotesOf txTop)) refreshedDReps = mapValueRestricted (const (e + pp .drepActivity)) dReps refresh - activeVDelegs = mapˢ vDelegCredential (dom (DRepsOf gState')) - ∪ fromList (vDelegNoConfidence ∷ vDelegAbstain ∷ []) withdrawalsSubTxs = foldl (λ acc txSub → acc ∪⁺ WithdrawalsOf txSub) ∅ (SubTransactionsOf txTop) withdrawals = WithdrawalsOf txTop @@ -209,5 +205,5 @@ data _⊢_⇀⦇_,ENTITIES⦈_ : EntitiesEnv → CertState → TopLevelTx → Ce ∙ ∀[ a ∈ dom directDeposits ] NetworkIdOf a ≡ NetworkId ∙ directDepositsCredentials ⊆ dom rewards' ──────────────────────────────── - ⟦ e , pp , cc , legacyMode , rewards₀ ⟧ ⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards , depositsᵈ ⟧ , pState , ⟦ dReps , ccHotKeys , depositsᵍ ⟧ ⟧ ⇀⦇ txTop ,ENTITIES⦈ ⟦ ⟦ voteDelegs' ∣^ activeVDelegs , stakeDelegs' , applyDirectDeposits directDeposits rewards' , depositsᵈ' ⟧ , pState' , gState' ⟧ + ⟦ e , pp , cc , legacyMode , rewards₀ ⟧ ⊢ ⟦ ⟦ voteDelegs , stakeDelegs , rewards , depositsᵈ ⟧ , pState , ⟦ dReps , ccHotKeys , depositsᵍ ⟧ ⟧ ⇀⦇ txTop ,ENTITIES⦈ ⟦ ⟦ voteDelegs' , stakeDelegs' , applyDirectDeposits directDeposits rewards' , depositsᵈ' ⟧ , pState' , gState' ⟧ ```