@@ -16,18 +16,15 @@ import qualified Cardano.Db as DB
1616import Cardano.DbSync.Api
1717import Cardano.DbSync.Api.Ledger
1818import Cardano.DbSync.Api.Types (ConsistentLevel (.. ), InsertOptions (.. ), LedgerEnv (.. ), SyncEnv (.. ), SyncOptions (.. ))
19- import Cardano.DbSync.Cache.Types (textShowStats )
2019import Cardano.DbSync.Epoch (epochHandler )
2120import Cardano.DbSync.Era.Byron.Insert (insertByronBlock )
22- import Cardano.DbSync.Era.Cardano.Insert (insertEpochSyncTime )
23- import Cardano.DbSync.Era.Shelley.Adjust (adjustEpochRewards )
2421import qualified Cardano.DbSync.Era.Shelley.Generic as Generic
25- import Cardano.DbSync.Era.Shelley.Insert (insertShelleyBlock , mkAdaPots )
26- import Cardano.DbSync.Era.Shelley.Insert.Epoch (insertInstantRewards , insertPoolDepositRefunds , insertRewards )
27- import Cardano.DbSync.Era.Shelley.Validate (validateEpochRewards )
22+ import Cardano.DbSync.Era.Universal.Block (insertBlockUniversal )
23+ import Cardano.DbSync.Era.Universal.Epoch (hasEpochStartEvent , hasNewEpochEvent )
24+ import Cardano.DbSync.Era.Universal.Insert.Certificate (mkAdaPots )
25+ import Cardano.DbSync.Era.Universal.Insert.LedgerEvent (insertBlockLedgerEvents )
2826import Cardano.DbSync.Error
2927import Cardano.DbSync.Fix.EpochStake
30- import Cardano.DbSync.Ledger.Event (LedgerEvent (.. ))
3128import Cardano.DbSync.Ledger.State (applyBlockAndSnapshot , defaultApplyResult )
3229import Cardano.DbSync.Ledger.Types (ApplyResult (.. ))
3330import Cardano.DbSync.LocalStateQuery
@@ -37,17 +34,15 @@ import Cardano.DbSync.Util
3734import Cardano.DbSync.Util.Constraint (addConstraintsIfNotExist )
3835import qualified Cardano.Ledger.Alonzo.Scripts as Ledger
3936import Cardano.Ledger.Shelley.AdaPots as Shelley
37+ import Cardano.Node.Configuration.Logging (Trace )
4038import Cardano.Prelude
4139import Cardano.Slotting.Slot (EpochNo (.. ), SlotNo )
4240import Control.Monad.Logger (LoggingT )
43- import Control.Monad.Trans.Control (MonadBaseControl )
4441import Control.Monad.Trans.Except.Extra (newExceptT )
4542import qualified Data.ByteString.Short as SBS
46- import qualified Data.Map.Strict as Map
4743import qualified Data.Set as Set
4844import qualified Data.Strict.Maybe as Strict
4945import Database.Persist.SqlBackend.Internal
50- import Database.Persist.SqlBackend.Internal.StatementCache
5146import Ouroboros.Consensus.Cardano.Block (HardForkBlock (.. ))
5247import qualified Ouroboros.Consensus.HardFork.Combinator as Consensus
5348import Ouroboros.Network.Block (blockHash , blockNo , getHeaderFields , headerFieldBlockNo , unBlockNo )
@@ -59,15 +54,16 @@ insertListBlocks ::
5954insertListBlocks synEnv blocks = do
6055 DB. runDbIohkLogging (envBackend synEnv) tracer
6156 . runExceptT
62- $ traverse_ (applyAndInsertBlockMaybe synEnv) blocks
57+ $ traverse_ (applyAndInsertBlockMaybe synEnv tracer ) blocks
6358 where
6459 tracer = getTrace synEnv
6560
6661applyAndInsertBlockMaybe ::
6762 SyncEnv ->
63+ Trace IO Text ->
6864 CardanoBlock ->
6965 ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
70- applyAndInsertBlockMaybe syncEnv cblk = do
66+ applyAndInsertBlockMaybe syncEnv tracer cblk = do
7167 bl <- liftIO $ isConsistent syncEnv
7268 (! applyRes, ! tookSnapshot) <- liftIO (mkApplyResult bl)
7369 if bl
@@ -100,8 +96,6 @@ applyAndInsertBlockMaybe syncEnv cblk = do
10096 liftIO $ logInfo tracer $ " Reached " <> textShow epochNo
10197 _ -> pure ()
10298 where
103- tracer = getTrace syncEnv
104-
10599 mkApplyResult :: Bool -> IO (ApplyResult , Bool )
106100 mkApplyResult isCons = do
107101 case envLedgerEnv syncEnv of
@@ -135,12 +129,12 @@ insertBlock syncEnv cblk applyRes firstAfterRollback tookSnapshot = do
135129 let ! details = apSlotDetails applyResult
136130 let ! withinTwoMin = isWithinTwoMin details
137131 let ! withinHalfHour = isWithinHalfHour details
138- insertLedgerEvents syncEnv (sdEpochNo details) (apEvents applyResult)
132+ insertBlockLedgerEvents syncEnv (sdEpochNo details) (apEvents applyResult)
139133 let isNewEpochEvent = hasNewEpochEvent (apEvents applyResult)
140134 let isStartEventOrRollback = hasEpochStartEvent (apEvents applyResult) || firstAfterRollback
141135 let isMember poolId = Set. member poolId (apPoolsRegistered applyResult)
142- let insertShelley blk =
143- insertShelleyBlock
136+ let insertBlockUniversal' blk =
137+ insertBlockUniversal
144138 syncEnv
145139 isStartEventOrRollback
146140 withinTwoMin
@@ -158,27 +152,27 @@ insertBlock syncEnv cblk applyRes firstAfterRollback tookSnapshot = do
158152 insertByronBlock syncEnv isStartEventOrRollback blk details
159153 BlockShelley blk ->
160154 newExceptT $
161- insertShelley $
155+ insertBlockUniversal' $
162156 Generic. fromShelleyBlock blk
163157 BlockAllegra blk ->
164158 newExceptT $
165- insertShelley $
159+ insertBlockUniversal' $
166160 Generic. fromAllegraBlock blk
167161 BlockMary blk ->
168162 newExceptT $
169- insertShelley $
163+ insertBlockUniversal' $
170164 Generic. fromMaryBlock blk
171165 BlockAlonzo blk ->
172166 newExceptT $
173- insertShelley $
167+ insertBlockUniversal' $
174168 Generic. fromAlonzoBlock (ioPlutusExtra iopts) (getPrices applyResult) blk
175169 BlockBabbage blk ->
176170 newExceptT $
177- insertShelley $
171+ insertBlockUniversal' $
178172 Generic. fromBabbageBlock (ioPlutusExtra iopts) (getPrices applyResult) blk
179173 BlockConway blk ->
180174 newExceptT $
181- insertShelley $
175+ insertBlockUniversal' $
182176 Generic. fromConwayBlock (ioPlutusExtra iopts) (getPrices applyResult) blk
183177 -- update the epoch
184178 updateEpoch details isNewEpochEvent
@@ -231,90 +225,3 @@ insertBlock syncEnv cblk applyRes firstAfterRollback tookSnapshot = do
231225 isWithinHalfHour sd = isSyncedWithinSeconds sd 1800 == SyncFollowing
232226
233227 blkNo = headerFieldBlockNo $ getHeaderFields cblk
234-
235- -- -------------------------------------------------------------------------------------------------
236-
237- insertLedgerEvents ::
238- (MonadBaseControl IO m , MonadIO m ) =>
239- SyncEnv ->
240- EpochNo ->
241- [LedgerEvent ] ->
242- ExceptT SyncNodeError (ReaderT SqlBackend m ) ()
243- insertLedgerEvents syncEnv currentEpochNo@ (EpochNo curEpoch) =
244- mapM_ handler
245- where
246- tracer = getTrace syncEnv
247- cache = envCache syncEnv
248- ntw = getNetwork syncEnv
249-
250- subFromCurrentEpoch :: Word64 -> EpochNo
251- subFromCurrentEpoch m =
252- if unEpochNo currentEpochNo >= m
253- then EpochNo $ unEpochNo currentEpochNo - m
254- else EpochNo 0
255-
256- toSyncState :: SyncState -> DB. SyncState
257- toSyncState SyncLagging = DB. SyncLagging
258- toSyncState SyncFollowing = DB. SyncFollowing
259-
260- handler ::
261- (MonadBaseControl IO m , MonadIO m ) =>
262- LedgerEvent ->
263- ExceptT SyncNodeError (ReaderT SqlBackend m ) ()
264- handler ev =
265- case ev of
266- LedgerNewEpoch en ss -> do
267- lift $
268- insertEpochSyncTime en (toSyncState ss) (envEpochSyncTime syncEnv)
269- sqlBackend <- lift ask
270- persistantCacheSize <- liftIO $ statementCacheSize $ connStmtMap sqlBackend
271- liftIO . logInfo tracer $ " Persistant SQL Statement Cache size is " <> textShow persistantCacheSize
272- stats <- liftIO $ textShowStats cache
273- liftIO . logInfo tracer $ stats
274- liftIO . logInfo tracer $ " Starting epoch " <> textShow (unEpochNo en)
275- LedgerStartAtEpoch en ->
276- -- This is different from the previous case in that the db-sync started
277- -- in this epoch, for example after a restart, instead of after an epoch boundary.
278- liftIO . logInfo tracer $ " Starting at epoch " <> textShow (unEpochNo en)
279- LedgerDeltaRewards _e rwd -> do
280- let rewards = Map. toList $ Generic. unRewards rwd
281- insertRewards syncEnv ntw (subFromCurrentEpoch 2 ) currentEpochNo cache (Map. toList $ Generic. unRewards rwd)
282- -- This event is only created when it's not empty, so we don't need to check for null here.
283- liftIO . logInfo tracer $ " Inserted " <> show (length rewards) <> " Delta rewards"
284- LedgerIncrementalRewards _ rwd -> do
285- let rewards = Map. toList $ Generic. unRewards rwd
286- insertRewards syncEnv ntw (subFromCurrentEpoch 1 ) (EpochNo $ curEpoch + 1 ) cache rewards
287- LedgerRestrainedRewards e rwd creds ->
288- lift $ adjustEpochRewards tracer ntw cache e rwd creds
289- LedgerTotalRewards _e rwd ->
290- lift $ validateEpochRewards tracer ntw (subFromCurrentEpoch 2 ) currentEpochNo rwd
291- LedgerAdaPots _ ->
292- pure () -- These are handled separately by insertBlock
293- LedgerMirDist rwd -> do
294- unless (Map. null rwd) $ do
295- let rewards = Map. toList rwd
296- insertInstantRewards ntw (subFromCurrentEpoch 1 ) currentEpochNo cache rewards
297- liftIO . logInfo tracer $ " Inserted " <> show (length rewards) <> " Mir rewards"
298- LedgerPoolReap en drs ->
299- unless (Map. null $ Generic. unRewards drs) $ do
300- insertPoolDepositRefunds syncEnv en drs
301- LedgerDeposits {} -> pure ()
302-
303- hasEpochStartEvent :: [LedgerEvent ] -> Bool
304- hasEpochStartEvent = any isNewEpoch
305- where
306- isNewEpoch :: LedgerEvent -> Bool
307- isNewEpoch le =
308- case le of
309- LedgerNewEpoch {} -> True
310- LedgerStartAtEpoch {} -> True
311- _otherwise -> False
312-
313- hasNewEpochEvent :: [LedgerEvent ] -> Bool
314- hasNewEpochEvent = any isNewEpoch
315- where
316- isNewEpoch :: LedgerEvent -> Bool
317- isNewEpoch le =
318- case le of
319- LedgerNewEpoch {} -> True
320- _otherwise -> False
0 commit comments