Skip to content

Commit 0427468

Browse files
committed
Introduce a separate Address table
1 parent 49f79d7 commit 0427468

File tree

16 files changed

+208
-71
lines changed

16 files changed

+208
-71
lines changed

cardano-db-sync/src/Cardano/DbSync/Era/Byron/Genesis.hs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,21 +184,39 @@ insertTxOuts blkId (address, value) = do
184184
, DB.txValidContract = True
185185
, DB.txScriptSize = 0
186186
}
187+
addrId <- insertAddress address
187188
void . DB.insertTxOut $
188189
DB.TxOut
189190
{ DB.txOutTxId = txId
190191
, DB.txOutIndex = 0
191-
, DB.txOutAddress = Text.decodeUtf8 $ Byron.addrToBase58 address
192-
, DB.txOutAddressRaw = Binary.serialize' address
193-
, DB.txOutAddressHasScript = False
194-
, DB.txOutPaymentCred = Nothing
192+
, DB.txOutAddressId = addrId
195193
, DB.txOutStakeAddressId = Nothing
196194
, DB.txOutValue = DB.DbLovelace (Byron.unsafeGetLovelace value)
197195
, DB.txOutDataHash = Nothing
198196
, DB.txOutInlineDatumId = Nothing
199197
, DB.txOutReferenceScriptId = Nothing
200198
}
201199

200+
insertAddress ::
201+
(MonadBaseControl IO m, MonadIO m) =>
202+
Byron.Address ->
203+
ReaderT SqlBackend m DB.AddressId
204+
insertAddress address = do
205+
mAddrId <- DB.queryAddress addrRaw
206+
case mAddrId of
207+
Nothing ->
208+
DB.insertAddress
209+
DB.Address
210+
{ DB.addressAddress = Text.decodeUtf8 $ Byron.addrToBase58 address
211+
, DB.addressAddressRaw = addrRaw
212+
, DB.addressHasScript = False
213+
, DB.addressPaymentCred = Nothing
214+
}
215+
Just addrId -> pure addrId
216+
where
217+
addrRaw = Binary.serialize' address
218+
219+
202220
-- -----------------------------------------------------------------------------
203221

204222
configGenesisHash :: Byron.Config -> ByteString

cardano-db-sync/src/Cardano/DbSync/Era/Byron/Insert.hs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,21 +234,38 @@ insertTxOut ::
234234
Word32 ->
235235
Byron.TxOut ->
236236
ReaderT SqlBackend m ()
237-
insertTxOut _tracer txId index txout =
237+
insertTxOut _tracer txId index txout = do
238+
addrId <- insertAddress
238239
void . DB.insertTxOut $
239240
DB.TxOut
240241
{ DB.txOutTxId = txId
241242
, DB.txOutIndex = fromIntegral index
242-
, DB.txOutAddress = Text.decodeUtf8 $ Byron.addrToBase58 (Byron.txOutAddress txout)
243-
, DB.txOutAddressRaw = Binary.serialize' (Byron.txOutAddress txout)
244-
, DB.txOutAddressHasScript = False
245-
, DB.txOutPaymentCred = Nothing -- Byron does not have a payment credential.
243+
, DB.txOutAddressId = addrId
246244
, DB.txOutStakeAddressId = Nothing -- Byron does not have a stake address.
247245
, DB.txOutValue = DbLovelace (Byron.unsafeGetLovelace $ Byron.txOutValue txout)
248246
, DB.txOutDataHash = Nothing
249247
, DB.txOutInlineDatumId = Nothing
250248
, DB.txOutReferenceScriptId = Nothing
251249
}
250+
where
251+
addrRaw :: ByteString
252+
addrRaw = Binary.serialize' (Byron.txOutAddress txout)
253+
254+
insertAddress ::
255+
(MonadBaseControl IO m, MonadIO m) =>
256+
ReaderT SqlBackend m DB.AddressId
257+
insertAddress = do
258+
mAddrId <- DB.queryAddress addrRaw
259+
case mAddrId of
260+
Nothing ->
261+
DB.insertAddress
262+
DB.Address
263+
{ DB.addressAddress = Text.decodeUtf8 $ Byron.addrToBase58 (Byron.txOutAddress txout)
264+
, DB.addressAddressRaw = addrRaw
265+
, DB.addressHasScript = False
266+
, DB.addressPaymentCred = Nothing
267+
}
268+
Just addrId -> pure addrId
252269

253270
insertTxIn ::
254271
(MonadBaseControl IO m, MonadIO m) =>

cardano-db-sync/src/Cardano/DbSync/Era/Shelley/Genesis.hs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import Data.Time.Clock (UTCTime (..))
4141
import qualified Data.Time.Clock as Time
4242
import Database.Persist.Sql (SqlBackend)
4343
import Lens.Micro
44-
import Ouroboros.Consensus.Cardano.Block (StandardShelley)
44+
import Ouroboros.Consensus.Cardano.Block (StandardCrypto, StandardShelley)
4545
import Ouroboros.Consensus.Shelley.Node (
4646
ShelleyGenesis (..),
4747
ShelleyGenesisStaking (..),
@@ -234,14 +234,12 @@ insertTxOuts trce blkId (ShelleyTx.TxIn txInId _, txOut) = do
234234
, DB.txScriptSize = 0
235235
}
236236
_ <- insertStakeAddressRefIfMissing trce uninitiatedCache txId (txOut ^. Core.addrTxOutL)
237+
addrId <- insertAddress addr
237238
void . DB.insertTxOut $
238239
DB.TxOut
239240
{ DB.txOutTxId = txId
240241
, DB.txOutIndex = 0
241-
, DB.txOutAddress = Generic.renderAddress addr
242-
, DB.txOutAddressRaw = Ledger.serialiseAddr addr
243-
, DB.txOutAddressHasScript = hasScript
244-
, DB.txOutPaymentCred = Generic.maybePaymentCred addr
242+
, DB.txOutAddressId = addrId
245243
, DB.txOutStakeAddressId = Nothing -- No stake addresses in Shelley Genesis
246244
, DB.txOutValue = Generic.coinToDbLovelace (txOut ^. Core.valueTxOutL)
247245
, DB.txOutDataHash = Nothing -- No output datum in Shelley Genesis
@@ -251,7 +249,25 @@ insertTxOuts trce blkId (ShelleyTx.TxIn txInId _, txOut) = do
251249
where
252250
addr = txOut ^. Core.addrTxOutL
253251

254-
hasScript = maybe False Generic.hasCredScript (Generic.getPaymentCred addr)
252+
insertAddress ::
253+
(MonadBaseControl IO m, MonadIO m) =>
254+
Ledger.Addr StandardCrypto ->
255+
ReaderT SqlBackend m DB.AddressId
256+
insertAddress addr = do
257+
mAddrId <- DB.queryAddress addrRaw
258+
case mAddrId of
259+
Nothing ->
260+
DB.insertAddress
261+
DB.Address
262+
{ DB.addressAddress = Generic.renderAddress addr
263+
, DB.addressAddressRaw = addrRaw
264+
, DB.addressHasScript = maybe False Generic.hasCredScript (Generic.getPaymentCred addr)
265+
, DB.addressPaymentCred = Generic.maybePaymentCred addr
266+
}
267+
Just addrId -> pure addrId
268+
where
269+
addrRaw = Ledger.serialiseAddr addr
270+
255271

256272
-- Insert pools and delegations coming from Genesis.
257273
insertStaking ::

cardano-db-sync/src/Cardano/DbSync/Era/Shelley/Insert.hs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ prepareTxOut ::
304304
Generic.TxOut ->
305305
ExceptT SyncNodeError (ReaderT SqlBackend m) (ExtendedTxOut, [MissingMaTxOut])
306306
prepareTxOut tracer cache iopts (txId, txHash) (Generic.TxOut index addr addrRaw value maMap mScript dt) = do
307+
addrId <- lift insertAddress
307308
mSaId <- lift $ insertStakeAddressRefIfMissing tracer cache txId addr
308309
mDatumId <-
309310
whenFalseEmpty (ioPlutusExtra iopts) Nothing $
@@ -317,23 +318,39 @@ prepareTxOut tracer cache iopts (txId, txHash) (Generic.TxOut index addr addrRaw
317318
DB.TxOut
318319
{ DB.txOutTxId = txId
319320
, DB.txOutIndex = index
320-
, DB.txOutAddress = Generic.renderAddress addr
321-
, DB.txOutAddressRaw = addrRaw
322-
, DB.txOutAddressHasScript = hasScript
323-
, DB.txOutPaymentCred = Generic.maybePaymentCred addr
321+
, DB.txOutAddressId = addrId
324322
, DB.txOutStakeAddressId = mSaId
325323
, DB.txOutValue = Generic.coinToDbLovelace value
326324
, DB.txOutDataHash = Generic.dataHashToBytes <$> Generic.getTxOutDatumHash dt
327325
, DB.txOutInlineDatumId = mDatumId
328326
, DB.txOutReferenceScriptId = mScriptId
329327
}
330-
let !eutxo = ExtendedTxOut txHash txOut
328+
let !eutxo = ExtendedTxOut txHash txOut (Generic.maybePaymentCred addr)
331329
!maTxOuts <- whenFalseMempty (ioMultiAssets iopts) $ prepareMaTxOuts tracer cache maMap
332330
pure (eutxo, maTxOuts)
333331
where
334332
hasScript :: Bool
335333
hasScript = maybe False Generic.hasCredScript (Generic.getPaymentCred addr)
336334

335+
paymentCreds :: Maybe ByteString
336+
paymentCreds = Generic.maybePaymentCred addr
337+
338+
insertAddress ::
339+
(MonadBaseControl IO m, MonadIO m) =>
340+
ReaderT SqlBackend m DB.AddressId
341+
insertAddress = do
342+
mAddrId <- DB.queryAddress addrRaw
343+
case mAddrId of
344+
Nothing ->
345+
DB.insertAddress
346+
DB.Address
347+
{ DB.addressAddress = Generic.renderAddress addr
348+
, DB.addressAddressRaw = addrRaw
349+
, DB.addressHasScript = hasScript
350+
, DB.addressPaymentCred = paymentCreds
351+
}
352+
Just addrId -> pure addrId
353+
337354
insertCollateralTxOut ::
338355
(MonadBaseControl IO m, MonadIO m) =>
339356
Trace IO Text ->

cardano-db-sync/src/Cardano/DbSync/Era/Shelley/Insert/Grouped.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ data MissingMaTxOut = MissingMaTxOut
5454
data ExtendedTxOut = ExtendedTxOut
5555
{ etoTxHash :: !ByteString
5656
, etoTxOut :: !DB.TxOut
57+
, etoPaymentCred :: Maybe ByteString
5758
}
5859

5960
instance Monoid BlockGroupedData where
@@ -137,7 +138,7 @@ resolveScriptHash groupedOutputs txIn =
137138
Left err ->
138139
case resolveInMemory txIn groupedOutputs of
139140
Nothing -> pure $ Left err
140-
Just eutxo -> pure $ Right $ DB.txOutPaymentCred $ etoTxOut eutxo
141+
Just eutxo -> pure $ Right $ etoPaymentCred eutxo
141142

142143
resolveInMemory :: Generic.TxIn -> [ExtendedTxOut] -> Maybe ExtendedTxOut
143144
resolveInMemory txIn =

cardano-db-tool/src/Cardano/DbTool/UtxoSet.hs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
module Cardano.DbTool.UtxoSet (
44
utxoSetAtSlot,
5+
utxoSetSum,
56
) where
67

78
import Cardano.Chain.Common (decodeAddressBase58, isRedeemAddress)
@@ -58,12 +59,12 @@ utxoSetAtSlot slotNo = do
5859

5960
-- -----------------------------------------------------------------------------
6061

61-
aggregateUtxos :: [(TxOut, a)] -> [(Text, Word64)]
62+
aggregateUtxos :: [(TxOut, Text, a)] -> [(Text, Word64)]
6263
aggregateUtxos xs =
6364
List.sortOn (Text.length . fst)
6465
. Map.toList
6566
. Map.fromListWith (+)
66-
$ map (\(x, _) -> (txOutAddress x, unDbLovelace (txOutValue x))) xs
67+
$ map (\(x, address, _) -> (address, unDbLovelace (txOutValue x))) xs
6768

6869
isRedeemTextAddress :: Text -> Bool
6970
isRedeemTextAddress addr =
@@ -81,7 +82,7 @@ partitionUtxos =
8182
accept (addr, _) =
8283
Text.length addr <= 180 && not (isRedeemTextAddress addr)
8384

84-
queryAtSlot :: Word64 -> IO (Ada, [(TxOut, ByteString)], Ada, Either LookupFail UTCTime)
85+
queryAtSlot :: Word64 -> IO (Ada, [(TxOut, Text, ByteString)], Ada, Either LookupFail UTCTime)
8586
queryAtSlot slotNo =
8687
-- Run the following queries in a single transaction.
8788
runDbNoLoggingEnv $ do
@@ -111,9 +112,9 @@ showUtxo (addr, value) =
111112
, " }"
112113
]
113114

114-
utxoSetSum :: [(TxOut, a)] -> Ada
115+
utxoSetSum :: [(TxOut, b, a)] -> Ada
115116
utxoSetSum xs =
116-
word64ToAda . sum $ map (unDbLovelace . txOutValue . fst) xs
117+
word64ToAda . sum $ map (\(txOut, _, _) -> unDbLovelace $ txOutValue txOut) xs
117118

118119
writeUtxos :: FilePath -> [(Text, Word64)] -> IO ()
119120
writeUtxos fname xs = do

cardano-db-tool/src/Cardano/DbTool/Validate/TotalSupply.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module Cardano.DbTool.Validate.TotalSupply (
66

77
import Cardano.Db
88
import Cardano.DbTool.Validate.Util
9+
import Cardano.DbTool.UtxoSet (utxoSetSum)
910
import Data.Word (Word64)
1011
import System.Random (randomRIO)
1112

cardano-db-tool/src/Cardano/DbTool/Validate/Util.hs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@ module Cardano.DbTool.Validate.Util (
66
greenText,
77
redText,
88
putStrF,
9-
utxoSetSum,
109
) where
1110

12-
import Cardano.Db
1311
import System.Console.ANSI (setSGRCode)
1412
import System.Console.ANSI.Types (
1513
Color (..),
@@ -39,7 +37,3 @@ redText s = codeRed ++ s ++ codeReset
3937

4038
putStrF :: String -> IO ()
4139
putStrF s = putStr s >> hFlush stdout
42-
43-
utxoSetSum :: [(TxOut, a)] -> Ada
44-
utxoSetSum xs =
45-
word64ToAda . sum $ map (unDbLovelace . txOutValue . fst) xs

cardano-db/src/Cardano/Db/Insert.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ module Cardano.Db.Insert (
4444
insertTxOut,
4545
insertCollateralTxOut,
4646
insertManyTxOut,
47+
insertAddress,
4748
insertWithdrawal,
4849
insertRedeemer,
4950
insertCostModel,
@@ -235,6 +236,9 @@ insertCollateralTxOut = insertUnchecked "CollateralTxOut"
235236
insertManyTxOut :: (MonadBaseControl IO m, MonadIO m) => [TxOut] -> ReaderT SqlBackend m [TxOutId]
236237
insertManyTxOut = insertMany' "TxOut"
237238

239+
insertAddress :: (MonadBaseControl IO m, MonadIO m) => Address -> ReaderT SqlBackend m AddressId
240+
insertAddress = insertUnchecked "insertAddress"
241+
238242
insertWithdrawal :: (MonadBaseControl IO m, MonadIO m) => Withdrawal -> ReaderT SqlBackend m WithdrawalId
239243
insertWithdrawal = insertUnchecked "Withdrawal"
240244

0 commit comments

Comments
 (0)