Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Shelley: Split the pool tabled into pool_hash and pool_update tables #173

Merged
merged 1 commit into from
Jul 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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