Skip to content

Commit 2bc6a82

Browse files
committed
Fix upper bound and deadline on drafted deposit txs
This switches the drafted tx deadline to be 3 * deposit period.
1 parent b1f8cfc commit 2bc6a82

File tree

4 files changed

+47
-30
lines changed

4 files changed

+47
-30
lines changed

hydra-cluster/src/Hydra/Cluster/Scenarios.hs

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -318,14 +318,17 @@ nodeReObservesOnChainTxs tracer workDir cardanoNode hydraScriptsTxId = do
318318
refuelIfNeeded tracer cardanoNode Bob 100_000_000
319319
-- Start hydra-node on chain tip
320320
tip <- queryTip networkId nodeSocket
321-
let contestationPeriod = 2
321+
322+
-- NOTE: Adapt periods to block times
323+
let contestationPeriod = truncate $ 10 * blockTime
324+
depositPeriod = truncate $ 50 * blockTime
322325
aliceChainConfig <-
323326
chainConfigFor Alice workDir nodeSocket hydraScriptsTxId [Bob] contestationPeriod
324-
<&> modifyConfig (\config -> config{startChainFrom = Nothing})
327+
<&> modifyConfig (\config -> config{startChainFrom = Nothing, depositPeriod})
325328

326329
bobChainConfig <-
327330
chainConfigFor Bob workDir nodeSocket hydraScriptsTxId [Alice] contestationPeriod
328-
<&> modifyConfig (\config -> config{startChainFrom = Nothing})
331+
<&> modifyConfig (\config -> config{startChainFrom = Nothing, depositPeriod})
329332

330333
(aliceCardanoVk, aliceCardanoSk) <- keysFor Alice
331334
commitUTxO <- seedFromFaucet cardanoNode aliceCardanoVk 5_000_000 (contramap FromFaucet tracer)
@@ -355,10 +358,10 @@ nodeReObservesOnChainTxs tracer workDir cardanoNode hydraScriptsTxId = do
355358

356359
submitTx cardanoNode tx
357360

358-
waitFor hydraTracer 10 [n1, n2] $
361+
waitFor hydraTracer (2 * realToFrac depositPeriod) [n1, n2] $
359362
output "CommitApproved" ["headId" .= headId, "utxoToCommit" .= commitUTxO]
360363

361-
waitFor hydraTracer 10 [n1, n2] $
364+
waitFor hydraTracer (20 * blockTime) [n1, n2] $
362365
output "CommitFinalized" ["headId" .= headId, "depositTxId" .= getTxId (getTxBody tx)]
363366

364367
getSnapshotUTxO n1 `shouldReturn` commitUTxO
@@ -781,8 +784,12 @@ singlePartyCommitsScriptBlueprint ::
781784
singlePartyCommitsScriptBlueprint tracer workDir node hydraScriptsTxId =
782785
(`finally` returnFundsToFaucet tracer node Alice) $ do
783786
refuelIfNeeded tracer node Alice 20_000_000
784-
let contestationPeriod = 100
785-
aliceChainConfig <- chainConfigFor Alice workDir nodeSocket hydraScriptsTxId [] contestationPeriod
787+
-- NOTE: Adapt periods to block times
788+
let contestationPeriod = truncate $ 10 * blockTime
789+
depositPeriod = truncate $ 50 * blockTime
790+
aliceChainConfig <-
791+
chainConfigFor Alice workDir nodeSocket hydraScriptsTxId [] contestationPeriod
792+
<&> modifyConfig (\c -> c{depositPeriod})
786793
let hydraNodeId = 1
787794
let hydraTracer = contramap FromHydraNode tracer
788795
(_, walletSk) <- keysFor AliceFunds
@@ -826,9 +833,9 @@ singlePartyCommitsScriptBlueprint tracer workDir node hydraScriptsTxId =
826833

827834
submitTx node tx
828835

829-
waitFor hydraTracer 10 [n1] $
836+
waitFor hydraTracer (2 * realToFrac depositPeriod) [n1] $
830837
output "CommitApproved" ["headId" .= headId, "utxoToCommit" .= scriptUTxO']
831-
waitFor hydraTracer 10 [n1] $
838+
waitFor hydraTracer (20 * blockTime) [n1] $
832839
output "CommitFinalized" ["headId" .= headId, "depositTxId" .= getTxId (getTxBody tx)]
833840

834841
getSnapshotUTxO n1 `shouldReturn` scriptUTxO <> scriptUTxO'
@@ -1172,9 +1179,9 @@ canCommit tracer workDir node hydraScriptsTxId =
11721179
(`finally` returnFundsToFaucet tracer node Bob) $ do
11731180
refuelIfNeeded tracer node Alice 30_000_000
11741181
refuelIfNeeded tracer node Bob 30_000_000
1175-
-- NOTE: Deliberately low periods to speed up happy path test
1176-
let contestationPeriod = truncate $ 3 * blockTime
1177-
depositPeriod = truncate $ 5 * blockTime
1182+
-- NOTE: Adapt periods to block times
1183+
let contestationPeriod = truncate $ 10 * blockTime
1184+
depositPeriod = truncate $ 50 * blockTime
11781185
aliceChainConfig <-
11791186
chainConfigFor Alice workDir nodeSocket hydraScriptsTxId [Bob] contestationPeriod
11801187
<&> setNetworkId networkId
@@ -1186,12 +1193,12 @@ canCommit tracer workDir node hydraScriptsTxId =
11861193
withHydraNode hydraTracer aliceChainConfig workDir 1 aliceSk [bobVk] [2] $ \n1 -> do
11871194
withHydraNode hydraTracer bobChainConfig workDir 2 bobSk [aliceVk] [1] $ \n2 -> do
11881195
send n1 $ input "Init" []
1189-
headId <- waitMatch (2 * blockTime) n2 $ headIsInitializingWith (Set.fromList [alice, bob])
1196+
headId <- waitMatch (10 * blockTime) n2 $ headIsInitializingWith (Set.fromList [alice, bob])
11901197

11911198
-- Commit nothing
11921199
requestCommitTx n1 mempty >>= submitTx node
11931200
requestCommitTx n2 mempty >>= submitTx node
1194-
waitFor hydraTracer (2 * blockTime) [n1, n2] $
1201+
waitFor hydraTracer (20 * blockTime) [n1, n2] $
11951202
output "HeadIsOpen" ["utxo" .= object mempty, "headId" .= headId]
11961203

11971204
-- Get some L1 funds
@@ -1211,7 +1218,7 @@ canCommit tracer workDir node hydraScriptsTxId =
12111218

12121219
waitFor hydraTracer (2 * realToFrac depositPeriod) [n1, n2] $
12131220
output "CommitApproved" ["headId" .= headId, "utxoToCommit" .= commitUTxO]
1214-
waitFor hydraTracer (2 * blockTime) [n1, n2] $
1221+
waitFor hydraTracer (20 * blockTime) [n1, n2] $
12151222
output "CommitFinalized" ["headId" .= headId, "depositTxId" .= getTxId (getTxBody tx)]
12161223

12171224
getSnapshotUTxO n1 `shouldReturn` commitUTxO
@@ -1228,22 +1235,22 @@ canCommit tracer workDir node hydraScriptsTxId =
12281235

12291236
waitFor hydraTracer (2 * realToFrac depositPeriod) [n1, n2] $
12301237
output "CommitApproved" ["headId" .= headId, "utxoToCommit" .= commitUTxO2]
1231-
waitFor hydraTracer (2 * blockTime) [n1, n2] $
1238+
waitFor hydraTracer (20 * blockTime) [n1, n2] $
12321239
output "CommitFinalized" ["headId" .= headId, "depositTxId" .= getTxId (getTxBody tx')]
12331240

12341241
getSnapshotUTxO n1 `shouldReturn` commitUTxO <> commitUTxO2
12351242

12361243
send n2 $ input "Close" []
12371244

1238-
deadline <- waitMatch (2 * blockTime) n2 $ \v -> do
1245+
deadline <- waitMatch (10 * blockTime) n2 $ \v -> do
12391246
guard $ v ^? key "tag" == Just "HeadIsClosed"
12401247
v ^? key "contestationDeadline" . _JSON
12411248

12421249
remainingTime <- diffUTCTime deadline <$> getCurrentTime
12431250
waitFor hydraTracer (remainingTime + 3 * blockTime) [n1, n2] $
12441251
output "ReadyToFanout" ["headId" .= headId]
12451252
send n2 $ input "Fanout" []
1246-
waitMatch (2 * blockTime) n2 $ \v ->
1253+
waitMatch (10 * blockTime) n2 $ \v ->
12471254
guard $ v ^? key "tag" == Just "HeadIsFinalized"
12481255

12491256
-- Assert final wallet balance
@@ -1359,9 +1366,9 @@ canSeePendingDeposits tracer workDir node hydraScriptsTxId =
13591366
(`finally` returnFundsToFaucet tracer node Bob) $ do
13601367
refuelIfNeeded tracer node Alice 30_000_000
13611368
refuelIfNeeded tracer node Bob 30_000_000
1362-
-- NOTE: Directly expire deposits
1363-
contestationPeriod <- CP.fromNominalDiffTime 1
1364-
let depositPeriod = 1
1369+
-- NOTE: Adapt periods to block times
1370+
let contestationPeriod = truncate $ 10 * blockTime
1371+
depositPeriod = truncate $ 50 * blockTime
13651372
aliceChainConfig <-
13661373
chainConfigFor Alice workDir nodeSocket hydraScriptsTxId [Bob] contestationPeriod
13671374
<&> setNetworkId networkId
@@ -1418,7 +1425,7 @@ canSeePendingDeposits tracer workDir node hydraScriptsTxId =
14181425
let path = BSC.unpack $ urlEncode False $ encodeUtf8 $ T.pack $ show deposit
14191426
-- XXX: should know the deadline from the query above
14201427
-- NOTE: we need to wait for the deadline to pass before we can recover the deposit
1421-
threadDelay $ realToFrac (toNominalDiffTime depositPeriod * 2)
1428+
threadDelay $ realToFrac (toNominalDiffTime depositPeriod * 4)
14221429

14231430
(`shouldReturn` "OK") $
14241431
parseUrlThrow ("DELETE " <> hydraNodeBaseUrl n1 <> "/commits/" <> path)

hydra-node/src/Hydra/API/HTTPServer.hs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,10 @@ handleDraftCommitUtxo env directChain getCommitInfo body = do
244244
CannotCommit -> pure $ responseLBS status500 [] (Aeson.encode (FailedToDraftTxNotInitializing :: PostTxError tx))
245245
where
246246
deposit headId commitBlueprint = do
247-
deadline <- addUTCTime (2 * toNominalDiffTime depositPeriod) <$> getCurrentTime
247+
-- NOTE: Three times deposit period means we have one deposit period time to
248+
-- increment because a deposit only activates after one deposit period and
249+
-- expires one deposit period before deadline.
250+
deadline <- addUTCTime (3 * toNominalDiffTime depositPeriod) <$> getCurrentTime
248251
draftDepositTx headId commitBlueprint deadline <&> \case
249252
Left e -> responseLBS status400 [] (Aeson.encode $ toJSON e)
250253
Right depositTx -> okJSON $ DraftCommitTxResponse depositTx

hydra-node/src/Hydra/Chain/Direct/Handlers.hs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,15 +172,22 @@ mkChain tracer queryTimeHandle wallet ctx LocalChainState{getLatest} submitTx =
172172
, draftDepositTx = \headId commitBlueprintTx deadline -> do
173173
let CommitBlueprintTx{lookupUTxO} = commitBlueprintTx
174174
ChainStateAt{spendableUTxO} <- atomically getLatest
175-
timeHandle <- queryTimeHandle
175+
TimeHandle{currentPointInTime} <- queryTimeHandle
176176
-- XXX: What an error handling mess
177177
runExceptT $ do
178-
validBefore <- case currentPointInTime timeHandle of
179-
-- XXX: We only need the current slot and this would never fail
178+
(currentSlot, currentTime) <- case currentPointInTime of
180179
Left failureReason -> throwError FailedToConstructDepositTx{failureReason}
181-
Right (s, _) -> pure $ s + fromInteger (truncate maxGraceTime)
180+
Right (s, t) -> pure (s, t)
181+
-- NOTE: Use a smaller upper bound than maxGraceTime to allow for
182+
-- shorter than 200 slot deposit periods. This is only important on
183+
-- fast moving networks (e.g. in testing). XXX: Making maxGraceTime
184+
-- configurable would avoid this.
185+
let untilDeadline = diffUTCTime deadline currentTime
186+
let graceTime = maxGraceTime `min` untilDeadline / 2
187+
-- -- NOTE: But also not make it smaller than 10 slots.
188+
let validBeforeSlot = currentSlot + fromInteger (truncate graceTime `max` 10)
182189
lift . finalizeTx wallet ctx spendableUTxO lookupUTxO $
183-
depositTx (networkId ctx) headId commitBlueprintTx validBefore deadline
190+
depositTx (networkId ctx) headId commitBlueprintTx validBeforeSlot deadline
184191
, -- Submit a cardano transaction to the cardano-node using the
185192
-- LocalTxSubmission protocol.
186193
submitTx

hydra-tx/src/Hydra/Tx/ContestationPeriod.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ instance Show ContestationPeriod where
2222
instance Enum ContestationPeriod where
2323
toEnum i
2424
| i > 0 = UnsafeContestationPeriod $ toEnum i
25-
| otherwise = error $ "ContestationPeriod.toEnum: non-zero integer " <> toText (show i)
25+
| otherwise = error $ "ContestationPeriod.toEnum: " <> toText (show i) <> " is not > 0"
2626

2727
fromEnum (UnsafeContestationPeriod n) = fromEnum n
2828

2929
instance Num ContestationPeriod where
3030
fromInteger i
3131
| i > 0 = UnsafeContestationPeriod $ fromInteger i
32-
| otherwise = error $ "ContestationPeriod.fromInteger: non-zero integer " <> toText (show i)
32+
| otherwise = error $ "ContestationPeriod.fromInteger: " <> toText (show i) <> " is not > 0"
3333

3434
(+) (UnsafeContestationPeriod a) (UnsafeContestationPeriod b) = UnsafeContestationPeriod (a + b)
3535
(-) (UnsafeContestationPeriod a) (UnsafeContestationPeriod b) = UnsafeContestationPeriod (a - b)

0 commit comments

Comments
 (0)