Skip to content

gRPC: Populate timestamp field in ChainPoint RPC responses #1133

@carbolymer

Description

@carbolymer

Problem

The UTxO RPC ChainPoint proto message defines a timestamp field (field 4, uint64, milliseconds), but it is never populated by mkChainPointMsg. It always defaults to 0.

This affects all RPC responses that include a ledgerTip, specifically readParams and readUtxos. The test at Cardano.Testnet.Test.Rpc.Query (line 102) documents this:

pparamsResponse ^. U5c.ledgerTip . U5c.timestamp === 0 -- not possible to implement at this moment

Proposed solution

The information needed to compute the timestamp is available via existing local state queries. The RPC handler methods (readParamsMethod, readUtxosMethod) already call executeLocalStateQueryExpr — two additional queries can be added to the same expression:

  1. querySystemStartSystemStart (chain genesis UTCTime)
  2. queryEraHistoryEraHistory (era boundaries and slot lengths)

With those, the conversion is:

import Cardano.Api (getProgress, EraHistory)
import Cardano.Slotting.Time (fromRelativeTime, SystemStart)

slotToUTCTime :: SystemStart -> EraHistory -> SlotNo -> Either PastHorizonException UTCTime
slotToUTCTime systemStart eraHistory slotNo = do
  (relTime, _slotLen) <- getProgress slotNo eraHistory
  pure $ fromRelativeTime systemStart relTime

The resulting UTCTime then needs to be converted to POSIX milliseconds (Word64) for the proto field.

Changes required

  • Cardano.Rpc.Server.Internal.UtxoRpc.Query — add querySystemStart and queryEraHistory to the executeLocalStateQueryExpr blocks in readParamsMethod and readUtxosMethod; compute the timestamp and pass it to mkChainPointMsg
  • Cardano.Rpc.Server.Internal.UtxoRpc.Type — update mkChainPointMsg signature to accept the computed timestamp (or SystemStart + EraHistory) and set the U5c.timestamp field
  • Cardano.Testnet.Test.Rpc.Query (in cardano-node) — update the assertion on line 102 to check the actual expected timestamp instead of 0

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions