Skip to content

Commit

Permalink
Shelley: Split the pool tabled into pool_hash and pool_update tables
Browse files Browse the repository at this point in the history
This separation makes it easier to query the rewards earned by delegators.

Closes: #168
  • Loading branch information
erikd committed Jul 6, 2020
1 parent 5fb89e8 commit 5e81aca
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 34 deletions.
23 changes: 12 additions & 11 deletions cardano-db-sync/src/Cardano/DbSync/Plugin/Default/Shelley/Insert.hs
Original file line number Diff line number Diff line change
Expand Up @@ -193,15 +193,16 @@ insertPoolRegister tracer txId params = do
, " > maxLovelace. See https://github.com/input-output-hk/cardano-ledger-specs/issues/1551"
]

poolId <- lift . DB.insertPool $
DB.Pool
{ DB.poolHash = Shelley.unKeyHashBS (Shelley._poolPubKey params)
, DB.poolPledge = Shelley.unCoin $ Shelley._poolPledge params
, DB.poolRewardAddrId = rewardId
, DB.poolMeta = mdId
, DB.poolMargin = realToFrac $ Shelley.intervalValue (Shelley._poolMargin params)
, DB.poolFixedCost = Shelley.unCoin (Shelley._poolCost params)
, DB.poolRegisteredTxId = txId
poolId <- lift . DB.insertPoolHash $ DB.PoolHash (Shelley.unKeyHashBS $ Shelley._poolPubKey params)
void . lift . DB.insertPoolUpdate $
DB.PoolUpdate
{ DB.poolUpdateHashId = poolId
, DB.poolUpdatePledge = Shelley.unCoin $ Shelley._poolPledge params
, DB.poolUpdateRewardAddrId = rewardId
, DB.poolUpdateMeta = mdId
, DB.poolUpdateMargin = realToFrac $ Shelley.intervalValue (Shelley._poolMargin params)
, DB.poolUpdateFixedCost = Shelley.unCoin (Shelley._poolCost params)
, DB.poolUpdateRegisteredTxId = txId
}

mapM_ (insertPoolOwner poolId) $ toList (Shelley._poolOwners params)
Expand Down Expand Up @@ -248,7 +249,7 @@ insertStakeAddress stakeAddr =

insertPoolOwner
:: (MonadBaseControl IO m, MonadIO m)
=> DB.PoolId -> ShelleyStakingKeyHash
=> DB.PoolHashId -> ShelleyStakingKeyHash
-> ExceptT DbSyncNodeError (ReaderT SqlBackend m) ()
insertPoolOwner poolId skh =
void . lift . DB.insertPoolOwner $
Expand Down Expand Up @@ -351,7 +352,7 @@ insertWithdrawals _tracer txId (account, coin) = do

insertPoolRelay
:: (MonadBaseControl IO m, MonadIO m)
=> DB.PoolId -> Shelley.StakePoolRelay
=> DB.PoolHashId -> Shelley.StakePoolRelay
-> ExceptT DbSyncNodeError (ReaderT SqlBackend m) ()
insertPoolRelay poolId relay =
void . lift . DB.insertPoolRelay $
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import Data.Either (fromRight)
import Data.Maybe (listToMaybe)
import Data.Word (Word64)

import Database.Esqueleto (Value (..), (^.), (==.), from, select, val, where_)
import Database.Esqueleto (InnerJoin (..), Value (..), (^.), (==.),
from, on, select, val, where_)
import Database.Persist.Sql (SqlBackend)

import qualified Shelley.Spec.Ledger.TxData as Shelley
Expand All @@ -36,11 +37,12 @@ queryStakeAddress addr = do
pure (saddr ^. StakeAddressId)
pure $ maybeToEither (DbLookupMessage "StakeAddress") unValue (listToMaybe res)

queryStakePoolKeyHash :: MonadIO m => ShelleyStakePoolKeyHash -> ReaderT SqlBackend m (Either LookupFail PoolId)
queryStakePoolKeyHash :: MonadIO m => ShelleyStakePoolKeyHash -> ReaderT SqlBackend m (Either LookupFail PoolHashId)
queryStakePoolKeyHash kh = do
res <- select . from $ \ pool -> do
where_ (pool ^. PoolHash ==. val (unKeyHashBS kh))
pure (pool ^. PoolId)
res <- select . from $ \ (pool `InnerJoin` poolHash) -> do
on (pool ^. PoolUpdateHashId ==. poolHash ^. PoolHashId)
where_ (poolHash ^. PoolHashHash ==. val (unKeyHashBS kh))
pure (poolHash ^. PoolHashId)
pure $ maybeToEither (DbLookupMessage "StakePoolKeyHash") unValue (listToMaybe res)

queryTxInputSum :: MonadIO m => [ShelleyTxIn] -> ReaderT SqlBackend m Word64
Expand Down
10 changes: 7 additions & 3 deletions cardano-db/src/Cardano/Db/Insert.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ module Cardano.Db.Insert
, insertDelegation
, insertEpoch
, insertMeta
, insertPool
, insertPoolHash
, insertPoolMetaData
, insertPoolOwner
, insertPoolRelay
, insertPoolRetire
, insertPoolUpdate
, insertReward
, insertSlotLeader
, insertStakeAddress
Expand Down Expand Up @@ -51,8 +52,8 @@ insertEpoch = insertByReturnKey "Epoch"
insertMeta :: (MonadBaseControl IO m, MonadIO m) => Meta -> ReaderT SqlBackend m MetaId
insertMeta = insertByReturnKey "Meta"

insertPool :: (MonadBaseControl IO m, MonadIO m) => Pool -> ReaderT SqlBackend m PoolId
insertPool = insertByReturnKey "Pool"
insertPoolHash :: (MonadBaseControl IO m, MonadIO m) => PoolHash -> ReaderT SqlBackend m PoolHashId
insertPoolHash = insertByReturnKey "PoolHash"

insertPoolMetaData :: (MonadBaseControl IO m, MonadIO m) => PoolMetaData -> ReaderT SqlBackend m PoolMetaDataId
insertPoolMetaData = insertByReturnKey "PoolMetaData"
Expand All @@ -66,6 +67,9 @@ insertPoolRelay = insertByReturnKey "PoolRelay"
insertPoolRetire :: (MonadBaseControl IO m, MonadIO m) => PoolRetire -> ReaderT SqlBackend m PoolRetireId
insertPoolRetire = insertByReturnKey "PoolRetire"

insertPoolUpdate :: (MonadBaseControl IO m, MonadIO m) => PoolUpdate -> ReaderT SqlBackend m PoolUpdateId
insertPoolUpdate = insertByReturnKey "PoolUpdate"

insertReward :: (MonadBaseControl IO m, MonadIO m) => Reward -> ReaderT SqlBackend m RewardId
insertReward = insertByReturnKey "Reward"

Expand Down
16 changes: 10 additions & 6 deletions cardano-db/src/Cardano/Db/Schema.hs
Original file line number Diff line number Diff line change
Expand Up @@ -154,29 +154,33 @@ share
txId TxId
UniquePoolMetaData url

Pool
PoolHash
hash ByteString sqltype=hash28type
UniquePoolHash hash

PoolUpdate
hashId PoolHashId
pledge Word64 -- This really should be sqltype=lovelace See https://github.com/input-output-hk/cardano-ledger-specs/issues/1551
rewardAddrId StakeAddressId
meta PoolMetaDataId Maybe
margin Double -- sqltype=percentage????
fixedCost Word64
registeredTxId TxId -- Slot number in which the pool was registered.
UniquePool hash registeredTxId
UniquePoolUpdate hashId registeredTxId

PoolOwner
hash ByteString sqltype=hash28type
poolId PoolId
poolId PoolHashId
UniquePoolOwner hash

PoolRetire
poolId PoolId
poolId PoolHashId
announcedTxId TxId -- Slot number in which the pool announced it was retiring.
retiringEpoch Word64 -- Epoch number in which the pool will retire.
UniquePoolRetiring poolId

PoolRelay
poolId PoolId
poolId PoolHashId
ipv4 Text Maybe
ipv6 Text Maybe
dnsName Text Maybe
Expand Down Expand Up @@ -214,7 +218,7 @@ share

Delegation
addrId StakeAddressId
poolId PoolId
poolId PoolHashId
txId TxId
UniqueDelegation addrId poolId txId

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,24 @@ BEGIN
EXECUTE 'CREATe TABLE "pool_meta_data"("id" SERIAL8 PRIMARY KEY UNIQUE,"url" VARCHAR NOT NULL,"hash" hash32type NOT NULL,"tx_id" INT8 NOT NULL)' ;
EXECUTE 'ALTER TABLE "pool_meta_data" ADD CONSTRAINT "unique_pool_meta_data" UNIQUE("url")' ;
EXECUTE 'ALTER TABLE "pool_meta_data" ADD CONSTRAINT "pool_meta_data_tx_id_fkey" FOREIGN KEY("tx_id") REFERENCES "tx"("id")' ;
EXECUTE 'CREATe TABLE "pool"("id" SERIAL8 PRIMARY KEY UNIQUE,"hash" hash28type NOT NULL,"pledge" INT8 NOT NULL,"reward_addr_id" INT8 NOT NULL,"meta" INT8 NULL,"margin" DOUBLE PRECISION NOT NULL,"fixed_cost" INT8 NOT NULL,"registered_tx_id" INT8 NOT NULL)' ;
EXECUTE 'ALTER TABLE "pool" ADD CONSTRAINT "unique_pool" UNIQUE("hash","registered_tx_id")' ;
EXECUTE 'ALTER TABLE "pool" ADD CONSTRAINT "pool_reward_addr_id_fkey" FOREIGN KEY("reward_addr_id") REFERENCES "stake_address"("id")' ;
EXECUTE 'ALTER TABLE "pool" ADD CONSTRAINT "pool_meta_fkey" FOREIGN KEY("meta") REFERENCES "pool_meta_data"("id")' ;
EXECUTE 'ALTER TABLE "pool" ADD CONSTRAINT "pool_registered_tx_id_fkey" FOREIGN KEY("registered_tx_id") REFERENCES "tx"("id")' ;
EXECUTE 'CREATe TABLE "pool_hash"("id" SERIAL8 PRIMARY KEY UNIQUE,"hash" hash28type NOT NULL)' ;
EXECUTE 'ALTER TABLE "pool_hash" ADD CONSTRAINT "unique_pool_hash" UNIQUE("hash")' ;
EXECUTE 'CREATe TABLE "pool_update"("id" SERIAL8 PRIMARY KEY UNIQUE,"hash_id" INT8 NOT NULL,"pledge" INT8 NOT NULL,"reward_addr_id" INT8 NOT NULL,"meta" INT8 NULL,"margin" DOUBLE PRECISION NOT NULL,"fixed_cost" INT8 NOT NULL,"registered_tx_id" INT8 NOT NULL)' ;
EXECUTE 'ALTER TABLE "pool_update" ADD CONSTRAINT "unique_pool" UNIQUE("hash_id","registered_tx_id")' ;
EXECUTE 'ALTER TABLE "pool_update" ADD CONSTRAINT "pool_update_hash_id_fkey" FOREIGN KEY("hash_id") REFERENCES "pool_hash"("id")' ;
EXECUTE 'ALTER TABLE "pool_update" ADD CONSTRAINT "pool_update_reward_addr_id_fkey" FOREIGN KEY("reward_addr_id") REFERENCES "stake_address"("id")' ;
EXECUTE 'ALTER TABLE "pool_update" ADD CONSTRAINT "pool_update_meta_fkey" FOREIGN KEY("meta") REFERENCES "pool_meta_data"("id")' ;
EXECUTE 'ALTER TABLE "pool_update" ADD CONSTRAINT "pool_update_registered_tx_id_fkey" FOREIGN KEY("registered_tx_id") REFERENCES "tx"("id")' ;
EXECUTE 'CREATe TABLE "pool_owner"("id" SERIAL8 PRIMARY KEY UNIQUE,"hash" hash28type NOT NULL,"pool_id" INT8 NOT NULL)' ;
EXECUTE 'ALTER TABLE "pool_owner" ADD CONSTRAINT "unique_pool_owner" UNIQUE("hash")' ;
EXECUTE 'ALTER TABLE "pool_owner" ADD CONSTRAINT "pool_owner_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool"("id")' ;
EXECUTE 'ALTER TABLE "pool_owner" ADD CONSTRAINT "pool_owner_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool_hash"("id")' ;
EXECUTE 'CREATe TABLE "pool_retire"("id" SERIAL8 PRIMARY KEY UNIQUE,"pool_id" INT8 NOT NULL,"announced_tx_id" INT8 NOT NULL,"retiring_epoch" INT8 NOT NULL)' ;
EXECUTE 'ALTER TABLE "pool_retire" ADD CONSTRAINT "unique_pool_retiring" UNIQUE("pool_id")' ;
EXECUTE 'ALTER TABLE "pool_retire" ADD CONSTRAINT "pool_retire_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool"("id")' ;
EXECUTE 'ALTER TABLE "pool_retire" ADD CONSTRAINT "pool_retire_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool_hash"("id")' ;
EXECUTE 'ALTER TABLE "pool_retire" ADD CONSTRAINT "pool_retire_announced_tx_id_fkey" FOREIGN KEY("announced_tx_id") REFERENCES "tx"("id")' ;
EXECUTE 'CREATe TABLE "pool_relay"("id" SERIAL8 PRIMARY KEY UNIQUE,"pool_id" INT8 NOT NULL,"ipv4" VARCHAR NULL,"ipv6" VARCHAR NULL,"dns_name" VARCHAR NULL,"dns_srv_name" VARCHAR NULL,"port" INT4 NULL)' ;
EXECUTE 'ALTER TABLE "pool_relay" ADD CONSTRAINT "unique_pool_relay" UNIQUE("pool_id","ipv4","ipv6","dns_name")' ;
EXECUTE 'ALTER TABLE "pool_relay" ADD CONSTRAINT "pool_relay_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool"("id")' ;
EXECUTE 'ALTER TABLE "pool_relay" ADD CONSTRAINT "pool_relay_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool_hash"("id")' ;
EXECUTE 'CREATe TABLE "central_funds"("id" SERIAL8 PRIMARY KEY UNIQUE,"epoch_no" INT8 NOT NULL,"treasury" lovelace NOT NULL,"reserves" lovelace NOT NULL)' ;
EXECUTE 'ALTER TABLE "central_funds" ADD CONSTRAINT "unique_central_funds" UNIQUE("epoch_no")' ;
EXECUTE 'CREATe TABLE "reward"("id" SERIAL8 PRIMARY KEY UNIQUE,"addr_id" INT8 NOT NULL,"amount" lovelace NOT NULL,"tx_id" INT8 NOT NULL)' ;
Expand All @@ -44,7 +47,7 @@ BEGIN
EXECUTE 'CREATe TABLE "delegation"("id" SERIAL8 PRIMARY KEY UNIQUE,"addr_id" INT8 NOT NULL,"pool_id" INT8 NOT NULL,"tx_id" INT8 NOT NULL)' ;
EXECUTE 'ALTER TABLE "delegation" ADD CONSTRAINT "unique_delegation" UNIQUE("addr_id","pool_id","tx_id")' ;
EXECUTE 'ALTER TABLE "delegation" ADD CONSTRAINT "delegation_addr_id_fkey" FOREIGN KEY("addr_id") REFERENCES "stake_address"("id")' ;
EXECUTE 'ALTER TABLE "delegation" ADD CONSTRAINT "delegation_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool"("id")' ;
EXECUTE 'ALTER TABLE "delegation" ADD CONSTRAINT "delegation_pool_id_fkey" FOREIGN KEY("pool_id") REFERENCES "pool_hash"("id")' ;
EXECUTE 'ALTER TABLE "delegation" ADD CONSTRAINT "delegation_tx_id_fkey" FOREIGN KEY("tx_id") REFERENCES "tx"("id")' ;
EXECUTE 'CREATe TABLE "stake_registration"("id" SERIAL8 PRIMARY KEY UNIQUE,"addr_id" INT8 NOT NULL,"tx_id" INT8 NOT NULL)' ;
EXECUTE 'ALTER TABLE "stake_registration" ADD CONSTRAINT "unique_stake_registration" UNIQUE("addr_id","tx_id")' ;
Expand Down

0 comments on commit 5e81aca

Please sign in to comment.