{-# OPTIONS --safe #-}
open import Ledger.Conway.Specification.Abstract
open import Ledger.Conway.Specification.Transaction
module Ledger.Conway.Specification.Utxo.Properties.Computational
(txs : _) (open TransactionStructure txs)
(abs : AbstractFunctions txs) (open AbstractFunctions abs)
where
open import Algebra.Morphism using (module MonoidMorphisms; IsMagmaHomomorphism)
open import Data.Integer as ℤ using (ℤ)
open import Data.List.Relation.Unary.All using (All)
import Data.Nat as ℕ
open import Data.Nat.Properties hiding (_≟_)
open import Data.String.Base using () renaming (_++_ to _+ˢ_)
open import Prelude; open Equivalence
open import Ledger.Prelude hiding (≤-trans; ≤-antisym; All); open Properties
open import Tactic.Cong using (cong!)
open import Tactic.EquationalReasoning using (module ≡-Reasoning)
open import stdlib-meta.Tactic.MonoidSolver.NonNormalising using (solve-macro)
open import Ledger.Conway.Specification.Utxo txs abs
open import Ledger.Conway.Specification.Script.Validation txs abs
open import Ledger.Conway.Specification.Certs govStructure
instance
_ = TokenAlgebra.Value-CommutativeMonoid tokenAlgebra
_ = +-0-monoid
_ = Functor-ComputationResult
instance
Computational-UTXOS : Computational _⊢_⇀⦇_,UTXOS⦈_ String
Computational-UTXOS = record {go} where
module go (Γ : UTxOEnv) (s : UTxOState) (tx : Tx)
(let open UTxOState s)
(let H-Yes , ⁇ H-Yes? = Scripts-Yes-premises {Γ} {tx} {utxo} {deposits})
(let H-No , ⁇ H-No? = Scripts-No-premises {Γ} {tx} {utxo}) where
open Tx tx renaming (body to txb); open TxBody txb
open UTxOEnv Γ renaming (pparams to pp)
sLst = collectP2ScriptsWithContext pp tx utxo
computeProof =
case H-Yes? ,′ H-No? of λ where
(yes p , no _ ) → success (_ , (Scripts-Yes p))
(no _ , yes p) → success (_ , (Scripts-No p))
(_ , _ ) → failure "isValid check failed"
completeness : ∀ s' → Γ ⊢ s ⇀⦇ tx ,UTXOS⦈ s' → map proj₁ computeProof ≡ success s'
completeness _ (Scripts-Yes p) with H-No? | H-Yes?
... | yes (_ , refl) | _ = case proj₂ p of λ ()
... | no _ | yes _ = refl
... | no _ | no ¬p = case ¬p p of λ ()
completeness _ (Scripts-No p) with H-Yes? | H-No?
... | yes (_ , _ , refl) | _ = case proj₂ p of λ ()
... | no _ | yes _ = refl
... | no _ | no ¬p = case ¬p p of λ ()
instance
Computational-UTXO' : Computational _⊢_⇀⦇_,UTXO⦈_ String
Computational-UTXO' = record {Go}
where
module Go Γ s tx (let H , ⁇ H? = UTXO-premises {Γ = Γ} {s = s} {tx = tx}) where
open Computational Computational-UTXOS
renaming (computeProof to computeProof'; completeness to completeness')
genErr : ¬ H → String
genErr ¬p = case dec-de-morgan ¬p of λ where
(inj₁ a) → "¬ TxBody.txIns (Tx.body tx) ≢ ∅"
(inj₂ b) → case dec-de-morgan b of λ where
(inj₁ a₁) → "¬ TxBody.txIns (Tx.body tx) ⊆ dom (UTxOOf s)"
(inj₂ b₁) → case dec-de-morgan b₁ of λ where
(inj₁ a₁') → "¬ refInputs ⊆ dom utxo "
(inj₂ b₂') → case dec-de-morgan b₂' of λ where
(inj₁ a₂) → "¬ inInterval (UTxOEnv.slot Γ) (txvldt (Tx.body tx))"
(inj₂ b₂) → case dec-de-morgan b₂ of λ where
(inj₁ a₃) → "¬ feesOK pp tx utxo"
(inj₂ b₃) → case dec-de-morgan b₃ of λ where
(inj₁ a₄) →
let
pp = PParamsOf Γ
txb = TxBodyOf tx
con = consumed pp s txb
prod = produced pp s txb
showValue = show ∘ coin
in
( "¬consumed (UTxOEnv.pparams Γ) s (Tx.body tx) ≡ produced (PParamsOf Γ) s (Tx.body tx)"
+ˢ "\n consumed =\t\t" +ˢ showValue con
+ˢ "\n ins =\t\t" +ˢ showValue (balance (UTxOOf s ∣ txb .TxBody.txIns))
+ˢ "\n mint =\t\t" +ˢ showValue (TxBody.mint txb)
+ˢ "\n depositRefunds =\t" +ˢ showValue (inject (depositRefunds pp s txb))
+ˢ "\n produced =\t\t" +ˢ showValue prod
+ˢ "\n outs =\t\t" +ˢ showValue (balance $ outs txb)
+ˢ "\n fee =\t\t" +ˢ show (FeesOf tx)
+ˢ "\n newDeposits =\t" +ˢ show (newDeposits pp s txb)
+ˢ "\n donation =\t\t" +ˢ show (DonationsOf txb)
)
(inj₂ b₄) → case dec-de-morgan b₄ of λ where
(inj₁ a₅) → "¬ coin (TxBody.mint (Tx.body tx)) ≡ 0"
(inj₂ b₅) → case dec-de-morgan b₅ of λ where
(inj₁ a₆) → "¬((Tx.txsize tx) Data.Nat.Base.≤ maxTxSize (UTxOEnv.pparams Γ))"
(inj₂ b₆) → case dec-de-morgan b₆ of λ where
(inj₁ a₇) → "∀[ (_ , txout) ∈ txOuts .proj₁ ] inject (utxoEntrySize txout * coinsPerUTxOByte pp) ≤ᵗ getValue txout"
(inj₂ b₇) → case dec-de-morgan b₇ of λ where
(inj₁ a₈) → "∀[ (_ , txout) ∈ txOuts .proj₁ ] serSize (getValue txout) ≤ maxValSize pp"
(inj₂ b₈) → case dec-de-morgan b₈ of λ where
(inj₁ a₉) → "∀[ (a , _) ∈ range txOuts ] Sum.All (const ⊤) (λ a → a .BootstrapAddr.attrsSize ≤ 64) a"
(inj₂ _) → "something else broke"
computeProofH : Dec H → ComputationResult String (∃[ s' ] Γ ⊢ s ⇀⦇ tx ,UTXO⦈ s')
computeProofH (yes (x , y , z , e , k , l , m , c , v , j , n , o , p , q , r , t , u)) =
map₂′ (UTXO-inductive⋯ _ _ _ x y z e k l m c v j n o p q r t u) <$> computeProof' Γ s tx
computeProofH (no ¬p) = failure $ genErr ¬p
computeProof : ComputationResult String (∃[ s' ] Γ ⊢ s ⇀⦇ tx ,UTXO⦈ s')
computeProof = computeProofH H?
completeness : ∀ s' → Γ ⊢ s ⇀⦇ tx ,UTXO⦈ s' → map proj₁ computeProof ≡ success s'
completeness s' (UTXO-inductive⋯ _ _ _ x y z w k l m c v j n o p q r t u h) with H?
... | no ¬p = ⊥-elim $ ¬p (x , y , z , w , k , l , m , c , v , j , n , o , p , q , r , t , u)
... | yes _ with computeProof' Γ s tx | completeness' _ _ _ _ h
... | success _ | refl = refl
open Computational ⦃...⦄
opaque
unfolding List-Model
Computational-UTXO : Computational _⊢_⇀⦇_,UTXO⦈_ String
Computational-UTXO = Computational-UTXO'
private variable
tx : Tx
Γ : UTxOEnv
utxoState utxoState' : UTxOState
UTXO-step : UTxOEnv → UTxOState → Tx → ComputationResult String UTxOState
UTXO-step = compute ⦃ Computational-UTXO ⦄
UTXO-step-computes-UTXO : UTXO-step Γ utxoState tx ≡ success utxoState'
⇔ Γ ⊢ utxoState ⇀⦇ tx ,UTXO⦈ utxoState'
UTXO-step-computes-UTXO = ≡-success⇔STS ⦃ Computational-UTXO ⦄