Skip to content

Commit

Permalink
Derive head id and seed from node id in offline mode
Browse files Browse the repository at this point in the history
  • Loading branch information
ch1bo committed Aug 6, 2024
1 parent 1754eff commit a7e0525
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 51 deletions.
99 changes: 49 additions & 50 deletions hydra-node/src/Hydra/Chain/Offline.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Cardano.Slotting.Time (SystemStart (SystemStart), mkSlotLength)
import Control.Monad.Class.MonadAsync (link)
import Data.Aeson qualified as Aeson
import Data.Aeson.Types qualified as Aeson
import Data.ByteString.Char8 qualified as BSC
import Hydra.Cardano.Api (GenesisParameters (..), ShelleyEra, ShelleyGenesis (..), StandardCrypto, Tx)
import Hydra.Chain (
Chain (..),
Expand All @@ -27,16 +28,17 @@ import Hydra.HeadId (HeadId (..), HeadSeed (..))
import Hydra.Ledger (ChainSlot (ChainSlot))
import Hydra.Ledger.Cardano.Configuration (readJsonFileThrow)
import Hydra.Ledger.Cardano.Time (slotNoFromUTCTime, slotNoToUTCTime)
import Hydra.Network (NodeId)
import Hydra.Options (OfflineChainConfig (..), defaultContestationPeriod)
import Hydra.Party (Party)

-- | Hard-coded 'HeadId' for all offline head instances.
offlineHeadId :: HeadId
offlineHeadId = UnsafeHeadId "offline"
-- | Derived 'HeadId' of offline head.
offlineHeadId :: NodeId -> HeadId
offlineHeadId nodeId = UnsafeHeadId $ "offline-" <> BSC.pack (show nodeId)

-- | Hard-coded 'HeadSeed' for all offline head instances.
offlineHeadSeed :: HeadSeed
offlineHeadSeed = UnsafeHeadSeed "offline"
-- | Derived 'HeadSeed' of offline head.
offlineHeadSeed :: NodeId -> HeadSeed
offlineHeadSeed nodeId = UnsafeHeadSeed $ "offline-" <> BSC.pack (show nodeId)

newtype InitialUTxOParseException = InitialUTxOParseException String
deriving stock (Show)
Expand Down Expand Up @@ -66,69 +68,66 @@ loadGenesisFile ledgerGenesisFile =
Left e -> throwIO $ InitialUTxOParseException e

withOfflineChain ::
NodeId ->
OfflineChainConfig ->
Party ->
-- | Last known chain state as loaded from persistence.
ChainStateHistory Tx ->
ChainComponent Tx IO a
withOfflineChain OfflineChainConfig{ledgerGenesisFile, initialUTxOFile} party chainStateHistory callback action = do
initializeOfflineHead chainStateHistory initialUTxOFile party callback
withOfflineChain nodeId OfflineChainConfig{ledgerGenesisFile, initialUTxOFile} party chainStateHistory callback action = do
initializeOfflineHead
genesis <- loadGenesisFile ledgerGenesisFile
withAsync (tickForever genesis callback) $ \tickThread -> do
link tickThread
action chainHandle
where
headId = offlineHeadId nodeId

chainHandle =
Chain
{ submitTx = const $ pure ()
, draftCommitTx = \_ _ -> pure $ Left FailedToDraftTxNotInitializing
, postTx = const $ pure ()
}

initializeOfflineHead ::
ChainStateHistory Tx ->
FilePath ->
Party ->
(ChainEvent Tx -> IO ()) ->
IO ()
initializeOfflineHead chainStateHistory initialUTxOFile ownParty callback = do
let emptyChainStateHistory = initHistory initialChainState
initializeOfflineHead = do
let emptyChainStateHistory = initHistory initialChainState

-- if we don't have a chainStateHistory to restore from disk from, start a new one
when (chainStateHistory == emptyChainStateHistory) $ do
initialUTxO <- readJsonFileThrow parseJSON initialUTxOFile
-- if we don't have a chainStateHistory to restore from disk from, start a new one
when (chainStateHistory == emptyChainStateHistory) $ do
initialUTxO <- readJsonFileThrow parseJSON initialUTxOFile

callback $
Observation
{ newChainState = initialChainState
, observedTx =
OnInitTx
{ headId = offlineHeadId
, headSeed = offlineHeadSeed
, headParameters =
HeadParameters
{ parties = [ownParty]
, -- NOTE: This is irrelevant in offline mode.
contestationPeriod = defaultContestationPeriod
}
, participants = []
}
}
callback $
Observation
{ newChainState = initialChainState
, observedTx =
OnCommitTx
{ party = ownParty
, committed = initialUTxO
, headId = offlineHeadId
}
}
callback $
Observation
{ newChainState = initialChainState
, observedTx = OnCollectComTx{headId = offlineHeadId}
}
callback $
Observation
{ newChainState = initialChainState
, observedTx =
OnInitTx
{ headId
, headSeed = offlineHeadSeed nodeId
, headParameters =
HeadParameters
{ parties = [party]
, -- NOTE: This is irrelevant in offline mode.
contestationPeriod = defaultContestationPeriod
}
, participants = []
}
}
callback $
Observation
{ newChainState = initialChainState
, observedTx =
OnCommitTx
{ party
, committed = initialUTxO
, headId
}
}
callback $
Observation
{ newChainState = initialChainState
, observedTx = OnCollectComTx{headId}
}

tickForever :: GenesisParameters ShelleyEra -> (ChainEvent Tx -> IO ()) -> IO ()
tickForever genesis callback = do
Expand Down
2 changes: 1 addition & 1 deletion hydra-node/src/Hydra/Node/Run.hs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ run opts = do

prepareChainComponent tracer Environment{party} = \case
Offline cfg ->
pure $ withOfflineChain cfg party
pure $ withOfflineChain nodeId cfg party
Direct cfg -> do
ctx <- loadChainContext cfg party
wallet <- mkTinyWallet (contramap DirectChain tracer) cfg
Expand Down

0 comments on commit a7e0525

Please sign in to comment.