Skip to content

Commit

Permalink
move SerialisedScriptRegistry to hydra-plutus
Browse files Browse the repository at this point in the history
* Because we need to create a scriptInfo based on this registry.
* It makes this type obiquitous across several packages:
> this makes it easy to work with.
  • Loading branch information
ffakenz committed Jan 7, 2025
1 parent 06fb450 commit 169afcc
Show file tree
Hide file tree
Showing 22 changed files with 97 additions and 71 deletions.
2 changes: 1 addition & 1 deletion hydra-chain-observer/exe/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Hydra.Prelude

import Hydra.ChainObserver qualified
import Hydra.ChainObserver.NodeClient (defaultObserverHandler)
import Hydra.Tx.ScriptRegistry (serialisedScriptRegistry)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)

main :: IO ()
main = Hydra.ChainObserver.main serialisedScriptRegistry defaultObserverHandler
4 changes: 2 additions & 2 deletions hydra-chain-observer/hydra-chain-observer.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ executable hydra-chain-observer
main-is: Main.hs
build-depends:
, hydra-chain-observer
, hydra-plutus
, hydra-prelude
, hydra-tx

test-suite tests
import: project-config
Expand All @@ -104,9 +104,9 @@ test-suite tests
, hydra-cardano-api
, hydra-chain-observer
, hydra-node
, hydra-plutus
, hydra-prelude
, hydra-test-utils
, hydra-tx
, hydra-tx:testlib
, QuickCheck

Expand Down
3 changes: 2 additions & 1 deletion hydra-chain-observer/src/Hydra/Blockfrost/ChainObserver.hs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ import Hydra.ChainObserver.NodeClient (
observeAll,
)
import Hydra.Logging (Tracer, traceWith)
import Hydra.Tx (IsTx (..), SerialisedScriptRegistry)
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry)
import Hydra.Tx (IsTx (..))

data APIBlockfrostError
= BlockfrostError Text
Expand Down
4 changes: 2 additions & 2 deletions hydra-chain-observer/src/Hydra/ChainObserver.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ import Hydra.ChainObserver.Options (BlockfrostOptions (..), DirectOptions (..),
import Hydra.Contract qualified as Contract
import Hydra.Logging (Verbosity (..), traceWith, withTracer)
import Hydra.Ouroborus.ChainObserver (ouroborusClient)
import Hydra.Tx.ScriptRegistry (SerialisedScriptRegistry)
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry)
import Options.Applicative (execParser)

main :: SerialisedScriptRegistry -> ObserverHandler IO -> IO ()
main serialisedScriptRegistry observerHandler = do
opts <- execParser hydraChainObserverOptions
withTracer (Verbose "hydra-chain-observer") $ \tracer -> do
traceWith tracer KnownScripts{scriptInfo = Contract.scriptInfo}
traceWith tracer KnownScripts{scriptInfo = Contract.scriptInfo serialisedScriptRegistry}
case opts of
DirectOpts DirectOptions{networkId, nodeSocket, startChainFrom} -> do
let NodeClient{follow} = ouroborusClient tracer nodeSocket networkId serialisedScriptRegistry
Expand Down
2 changes: 1 addition & 1 deletion hydra-chain-observer/src/Hydra/ChainObserver/NodeClient.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ import Hydra.Chain.Direct.Tx (
)
import Hydra.Contract (ScriptInfo)
import Hydra.Ledger.Cardano (adjustUTxO)
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry)
import Hydra.Tx.HeadId (HeadId (..))
import Hydra.Tx.ScriptRegistry (SerialisedScriptRegistry)

type ObserverHandler m = [ChainObservation] -> m ()

Expand Down
2 changes: 1 addition & 1 deletion hydra-chain-observer/src/Hydra/Ouroborus/ChainObserver.hs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import Hydra.ChainObserver.NodeClient (
observeAll,
)
import Hydra.Logging (Tracer, traceWith)
import Hydra.Tx.ScriptRegistry (SerialisedScriptRegistry)
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry)
import Ouroboros.Network.Protocol.ChainSync.Client (
ChainSyncClient (..),
ClientStIdle (..),
Expand Down
2 changes: 1 addition & 1 deletion hydra-chain-observer/test/Hydra/ChainObserverSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Hydra.Chain.Direct.State qualified as Transition
import Hydra.Chain.Direct.Tx (HeadObservation (..))
import Hydra.ChainObserver.NodeClient (observeAll, observeTx)
import Hydra.Ledger.Cardano (genSequenceOfSimplePaymentTransactions)
import Hydra.Tx.ScriptRegistry (serialisedScriptRegistry)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Test.Hydra.Tx.Fixture (testNetworkId)
import Test.QuickCheck (counterexample, forAll, forAllBlind, property, (=/=), (===))
import Test.QuickCheck.Property (checkCoverage)
Expand Down
3 changes: 2 additions & 1 deletion hydra-node/bench/tx-cost/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Hydra.Cardano.Api (Coin (..), serialiseToRawBytesHexText)
import Hydra.Contract (ScriptInfo (..), scriptInfo)
import Hydra.Ledger.Cardano.Evaluate (maxCpu, maxMem, maxTxSize)
import Hydra.Plutus.Orphans ()
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Options.Applicative (
Parser,
ParserInfo,
Expand Down Expand Up @@ -171,7 +172,7 @@ scriptSizes =
, headScriptSize
, depositScriptHash
, depositScriptSize
} = scriptInfo
} = scriptInfo serialisedScriptRegistry

genFromSeed :: Gen a -> Int -> a
genFromSeed (MkGen g) seed = g (mkQCGen seed) 30
Expand Down
2 changes: 1 addition & 1 deletion hydra-node/src/Hydra/Chain/Direct/Handlers.hs
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,11 @@ import Hydra.Chain.Direct.Wallet (
import Hydra.Ledger.Cardano (adjustUTxO, fromChainSlot)
import Hydra.Logging (Tracer, traceWith)
import Hydra.Plutus.Extras (posixToUTCTime)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Hydra.Tx (
CommitBlueprintTx (..),
HeadParameters (..),
UTxOType,
serialisedScriptRegistry,
)
import Hydra.Tx.Contest (ClosedThreadOutput (..))
import Hydra.Tx.ContestationPeriod (toNominalDiffTime)
Expand Down
2 changes: 1 addition & 1 deletion hydra-node/src/Hydra/Chain/Direct/State.hs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ import Hydra.Ledger.Cardano.Evaluate (genPointInTimeBefore, genValidityBoundsFro
import Hydra.Ledger.Cardano.Time (slotNoFromUTCTime)
import Hydra.Plutus (commitValidatorScript, depositValidatorScript, initialValidatorScript)
import Hydra.Plutus.Extras (posixToUTCTime)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Hydra.Tx (
CommitBlueprintTx (..),
ConfirmedSnapshot (..),
Expand All @@ -99,7 +100,6 @@ import Hydra.Tx (
getSnapshot,
partyToChain,
registryUTxO,
serialisedScriptRegistry,
utxoFromTx,
)
import Hydra.Tx.Abort (AbortTxError (..), abortTx)
Expand Down
2 changes: 1 addition & 1 deletion hydra-node/src/Hydra/Chain/Direct/Tx.hs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import Hydra.Data.Party qualified as OnChain
import Hydra.Plutus (commitValidatorScript, depositValidatorScript, initialValidatorScript)
import Hydra.Plutus.Extras (posixToUTCTime)
import Hydra.Plutus.Orphans ()
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry (..))
import Hydra.Tx (
HeadId (..),
HeadSeed (..),
Expand All @@ -45,7 +46,6 @@ import Hydra.Tx.ContestationPeriod (ContestationPeriod, fromChain)
import Hydra.Tx.Deposit (DepositObservation (..), observeDepositTx)
import Hydra.Tx.OnChainId (OnChainId (..))
import Hydra.Tx.Recover (RecoverObservation (..), observeRecoverTx)
import Hydra.Tx.ScriptRegistry (SerialisedScriptRegistry (..))
import Hydra.Tx.Utils (assetNameToOnChainId, findFirst, hydraHeadV1AssetName)
import PlutusLedgerApi.V3 (CurrencySymbol, fromBuiltin)
import PlutusLedgerApi.V3 qualified as Plutus
Expand Down
3 changes: 2 additions & 1 deletion hydra-node/src/Hydra/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import Hydra.Contract qualified as Contract
import Hydra.Ledger.Cardano ()
import Hydra.Logging (Verbosity (..))
import Hydra.Network (Host, NodeId (NodeId), PortNumber, readHost, readPort)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Hydra.Tx.ContestationPeriod (ContestationPeriod (UnsafeContestationPeriod), fromNominalDiffTime)
import Hydra.Version (embeddedRevision, gitRevision, unknownVersion)
import Options.Applicative (
Expand Down Expand Up @@ -760,7 +761,7 @@ hydraNodeCommand =

scriptInfo =
infoOption
(decodeUtf8 $ encodePretty Contract.scriptInfo)
(decodeUtf8 $ encodePretty (Contract.scriptInfo serialisedScriptRegistry))
(long "script-info" <> help "Dump script info as JSON")

hydraNodeVersion :: Version
Expand Down
2 changes: 1 addition & 1 deletion hydra-node/test/Hydra/Chain/Direct/StateSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,11 @@ import Hydra.Ledger.Cardano.Evaluate (
)
import Hydra.Ledger.Cardano.Time (slotNoFromUTCTime)
import Hydra.Plutus (initialValidatorScript)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Hydra.Tx.Contest (ClosedThreadOutput (closedContesters))
import Hydra.Tx.ContestationPeriod (toNominalDiffTime)
import Hydra.Tx.Deposit (DepositObservation (..), observeDepositTx)
import Hydra.Tx.Recover (RecoverObservation (..), observeRecoverTx)
import Hydra.Tx.ScriptRegistry (serialisedScriptRegistry)
import Hydra.Tx.Snapshot (ConfirmedSnapshot (InitialSnapshot, initialUTxO))
import Hydra.Tx.Snapshot qualified as Snapshot
import Hydra.Tx.Utils (dummyValidatorScript, splitUTxO)
Expand Down
3 changes: 2 additions & 1 deletion hydra-node/test/Hydra/Chain/Direct/TxSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,12 @@ import Hydra.Contract.Dummy (dummyValidatorScript)
import Hydra.Contract.HeadTokens (headPolicyId)
import Hydra.Ledger.Cardano.Builder (addTxInsSpending, unsafeBuildTransaction)
import Hydra.Ledger.Cardano.Evaluate (propTransactionEvaluates)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Hydra.Tx.BlueprintTx (CommitBlueprintTx (..))
import Hydra.Tx.Commit (commitTx)
import Hydra.Tx.HeadId (headIdToCurrencySymbol, mkHeadId)
import Hydra.Tx.Init (mkInitialOutput)
import Hydra.Tx.ScriptRegistry (registryUTxO, serialisedScriptRegistry)
import Hydra.Tx.ScriptRegistry (registryUTxO)
import Hydra.Tx.Utils (verificationKeyToOnChainId)
import Test.Cardano.Ledger.Shelley.Arbitrary (genMetadata')
import Test.Gen.Cardano.Api.Typed (genHashableScriptData)
Expand Down
1 change: 1 addition & 0 deletions hydra-node/test/Hydra/Chain/Direct/TxTraceSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import Hydra.Chain.Direct.Tx qualified as Tx
import Hydra.Contract.HeadState qualified as Head
import Hydra.Ledger.Cardano (Tx, adjustUTxO)
import Hydra.Ledger.Cardano.Evaluate (evaluateTx)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import Hydra.Tx (CommitBlueprintTx (..))
import Hydra.Tx.ContestationPeriod qualified as CP
import Hydra.Tx.Crypto (MultiSignature, aggregate, sign)
Expand Down
3 changes: 2 additions & 1 deletion hydra-plutus/exe/inspect-script/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import Hydra.Contract.HeadState as Head
import Hydra.Contract.HeadTokens qualified as HeadTokens
import Hydra.Contract.Initial as Initial
import Hydra.Plutus (initialValidatorScript)
import Hydra.SerialisedScriptRegistry (serialisedScriptRegistry)
import PlutusLedgerApi.V3 (Data, SerialisedScript, toData)
import PlutusTx (getPlc)
import PlutusTx.Code (CompiledCode)
Expand All @@ -26,7 +27,7 @@ import Prettyprinter.Render.Text (renderStrict)
main :: IO ()
main = do
putTextLn "Script info:"
putLBSLn $ encodePretty scriptInfo
putLBSLn $ encodePretty (scriptInfo serialisedScriptRegistry)

putTextLn "Serialise scripts:"
writeScripts scripts
Expand Down
4 changes: 3 additions & 1 deletion hydra-plutus/hydra-plutus.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ source-repository head
common project-config
default-language: GHC2021
default-extensions:
NoImplicitPrelude
DataKinds
DefaultSignatures
DeriveAnyClass
Expand All @@ -26,7 +27,6 @@ common project-config
GADTs
LambdaCase
MultiWayIf
NoImplicitPrelude
OverloadedStrings
PartialTypeSignatures
PatternSynonyms
Expand Down Expand Up @@ -62,13 +62,15 @@ library
Hydra.Data.ContestationPeriod
Hydra.Data.Party
Hydra.Plutus
Hydra.SerialisedScriptRegistry

hs-source-dirs: src
build-depends:
, aeson
, base
, base16-bytestring
, bytestring
, cborg
, file-embed
, hydra-cardano-api
, hydra-plutus-extras
Expand Down
28 changes: 18 additions & 10 deletions hydra-plutus/src/Hydra/Contract.hs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import Hydra.Cardano.Api.Prelude qualified as Api
import Hydra.Contract.Head qualified as Head
import Hydra.Contract.HeadTokens qualified as HeadTokens
import Hydra.Plutus (commitValidatorScript, depositValidatorScript, initialValidatorScript)
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry (..))
import PlutusLedgerApi.V3 (TxId (..), TxOutRef (..), toBuiltin)

-- | Information about relevant Hydra scripts.
Expand All @@ -39,21 +40,28 @@ data ScriptInfo = ScriptInfo

-- | Gather 'ScriptInfo' from the current Hydra scripts. This is useful to
-- determine changes in between version of 'hydra-plutus'.
scriptInfo :: ScriptInfo
scriptInfo =
scriptInfo :: SerialisedScriptRegistry -> ScriptInfo
scriptInfo serialisedScriptRegistry =
ScriptInfo
{ mintingScriptHash = plutusScriptHash $ HeadTokens.mintingPolicyScript defaultOutRef
, mintingScriptSize = scriptSize $ HeadTokens.mintingPolicyScript defaultOutRef
, initialScriptHash = hashScript $ Api.PlutusScript PlutusScriptV3 $ fromPlutusScript initialValidatorScript
, initialScriptSize = scriptSize initialValidatorScript
, commitScriptHash = hashScript $ Api.PlutusScript PlutusScriptV3 $ fromPlutusScript commitValidatorScript
, commitScriptSize = scriptSize commitValidatorScript
, headScriptHash = plutusScriptHash Head.validatorScript
, headScriptSize = scriptSize Head.validatorScript
, depositScriptHash = hashScript $ Api.PlutusScript PlutusScriptV3 $ fromPlutusScript depositValidatorScript
, depositScriptSize = scriptSize depositValidatorScript
, initialScriptHash = hashScript $ Api.PlutusScript PlutusScriptV3 $ fromPlutusScript initialScriptValidator
, initialScriptSize = scriptSize initialScriptValidator
, commitScriptHash = hashScript $ Api.PlutusScript PlutusScriptV3 $ fromPlutusScript commitScriptValidator
, commitScriptSize = scriptSize commitScriptValidator
, headScriptHash = plutusScriptHash headScriptValidator
, headScriptSize = scriptSize headScriptValidator
, depositScriptHash = hashScript $ Api.PlutusScript PlutusScriptV3 $ fromPlutusScript depositScriptValidator
, depositScriptSize = scriptSize depositScriptValidator
}
where
SerialisedScriptRegistry
{ initialScriptValidator
, commitScriptValidator
, headScriptValidator
, depositScriptValidator
} = serialisedScriptRegistry

plutusScriptHash =
hashScript . PlutusScript . fromPlutusScript

Expand Down
46 changes: 46 additions & 0 deletions hydra-plutus/src/Hydra/SerialisedScriptRegistry.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
module Hydra.SerialisedScriptRegistry where

import Hydra.Prelude

import Codec.CBOR.Read qualified as CBOR
import Data.ByteString.Base16 qualified as Base16

import Data.ByteString.Lazy qualified as LBS
import Data.ByteString.Short qualified as SBS
import Hydra.Contract.Deposit qualified as Deposit
import Hydra.Contract.Head qualified as Head
import Hydra.Plutus (commitValidatorScript, initialValidatorScript)
import PlutusLedgerApi.Common (SerialisedScript)

data SerialisedScriptRegistry = SerialisedScriptRegistry
{ initialScriptValidator :: SerialisedScript
, commitScriptValidator :: SerialisedScript
, headScriptValidator :: SerialisedScript
, depositScriptValidator :: SerialisedScript
}
deriving stock (Eq, Show)

serialisedScriptRegistry :: SerialisedScriptRegistry
serialisedScriptRegistry =
SerialisedScriptRegistry
{ initialScriptValidator = initialValidatorScript
, commitScriptValidator = commitValidatorScript
, headScriptValidator = Head.validatorScript
, depositScriptValidator = Deposit.validatorScript
}

-- XXX: used to parse Aiken `compiledCode`.
serialisedScriptFromText :: Text -> SerialisedScript
serialisedScriptFromText base16Text =
case Base16.decode base16Bytes of
Left e -> error $ "Failed to decode initial validator: " <> show e
Right bytes -> toShort bytes
where
base16Bytes = encodeUtf8 base16Text

-- XXX: used to parse Plutus `cborHex`.
cborHexToSerialisedScript :: ByteString -> SerialisedScript
cborHexToSerialisedScript cborHex = either (error . show) SBS.toShort $ do
bytes <- Base16.decode cborHex
(_, a) <- first show $ CBOR.deserialiseFromBytes @ByteString fromCBOR (LBS.fromStrict bytes)
pure a
2 changes: 1 addition & 1 deletion hydra-tx/src/Hydra/Tx/Deposit.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import Hydra.Contract.Commit qualified as Commit
import Hydra.Contract.Deposit qualified as Deposit
import Hydra.Plutus (depositValidatorScript)
import Hydra.Plutus.Extras.Time (posixFromUTCTime)
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry (..))
import Hydra.Tx (CommitBlueprintTx (..), HeadId, fromCurrencySymbol, headIdToCurrencySymbol)
import Hydra.Tx.ScriptRegistry (SerialisedScriptRegistry (..))
import Hydra.Tx.Utils (addMetadata, mkHydraHeadV1TxName)
import PlutusLedgerApi.V3 (POSIXTime)

Expand Down
5 changes: 4 additions & 1 deletion hydra-tx/src/Hydra/Tx/Recover.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ import Hydra.Contract.Deposit qualified as Deposit
import Hydra.Ledger.Cardano.Builder (
unsafeBuildTransaction,
)
<<<<<<< HEAD
import Hydra.Plutus (depositValidatorScript)
=======
import Hydra.SerialisedScriptRegistry (SerialisedScriptRegistry (..))
>>>>>>> 9cb6d7a62 (move SerialisedScriptRegistry to hydra-plutus)
import Hydra.Tx (HeadId, mkHeadId)
import Hydra.Tx.ScriptRegistry (SerialisedScriptRegistry (..))
import Hydra.Tx.Utils (mkHydraHeadV1TxName)

-- | Builds a recover transaction to recover locked funds from the v_deposit script.
Expand Down
Loading

0 comments on commit 169afcc

Please sign in to comment.