From f30c63e203e6227833a91cd494e99b5b7c5b5472 Mon Sep 17 00:00:00 2001 From: Sameer Kumar Subudhi Date: Sun, 29 Oct 2023 01:59:21 +0200 Subject: [PATCH] :bug: Index stakes from PoS genesis assets --- .../dataService/business/pos/stakers.js | 26 +++---- .../shared/indexer/genesisBlock.js | 31 +++++++-- .../shared/indexer/indexStatus.js | 6 -- .../indexer/transactionProcessor/pos/stake.js | 3 +- .../shared/indexer/validatorIndex.js | 68 ------------------- .../tests/unit/shared/constants/events.js | 2 + 6 files changed, 39 insertions(+), 97 deletions(-) delete mode 100644 services/blockchain-indexer/shared/indexer/validatorIndex.js diff --git a/services/blockchain-indexer/shared/dataService/business/pos/stakers.js b/services/blockchain-indexer/shared/dataService/business/pos/stakers.js index b43571b732..00d2b7a902 100644 --- a/services/blockchain-indexer/shared/dataService/business/pos/stakers.js +++ b/services/blockchain-indexer/shared/dataService/business/pos/stakers.js @@ -120,17 +120,16 @@ const getStakers = async params => { } // Fetch list of stakes - const stakes = await stakesTable.find( - { - ...stakerAddressQueryFilter, - validatorAddress: params.validatorAddress, - limit: params.limit, - offset: params.offset, - sort: 'amount:desc', - order: 'stakerAddress:asc', // Amount sorting tie-breaker - }, - ['stakerAddress', 'amount'], - ); + const stakesQueryParams = Object.freeze({ + ...stakerAddressQueryFilter, + validatorAddress: params.validatorAddress, + propBetweens: [{ property: 'amount', greaterThan: BigInt('0') }], + limit: params.limit, + offset: params.offset, + sort: 'amount:desc', + order: 'stakerAddress:asc', // Amount sorting tie-breaker + }); + const stakes = await stakesTable.find(stakesQueryParams, ['stakerAddress', 'amount']); // Populate stakers name and prepare response stakersResponse.data.stakers = await BluebirdPromise.map( @@ -164,10 +163,7 @@ const getStakers = async params => { stakersResponse.meta.count = stakersResponse.data.stakers.length; stakersResponse.meta.offset = params.offset; - stakersResponse.meta.total = await stakesTable.count({ - ...stakerAddressQueryFilter, - validatorAddress: params.validatorAddress, - }); + stakersResponse.meta.total = await stakesTable.count(stakesQueryParams); return stakersResponse; }; diff --git a/services/blockchain-indexer/shared/indexer/genesisBlock.js b/services/blockchain-indexer/shared/indexer/genesisBlock.js index b38475b957..9b051e9d94 100644 --- a/services/blockchain-indexer/shared/indexer/genesisBlock.js +++ b/services/blockchain-indexer/shared/indexer/genesisBlock.js @@ -29,6 +29,7 @@ const { updateTotalLockedAmounts } = require('./utils/blockchainIndex'); const requestAll = require('../utils/requestAll'); const config = require('../../config'); +const stakesTableSchema = require('../database/schema/stakes'); const commissionsTableSchema = require('../database/schema/commissions'); const { getIndexStats } = require('./indexStatus'); @@ -36,6 +37,7 @@ const logger = Logger(); const MYSQL_ENDPOINT = config.endpoints.mysql; +const getStakesTable = () => getTableInstance(stakesTableSchema, MYSQL_ENDPOINT); const getCommissionsTable = () => getTableInstance(commissionsTableSchema, MYSQL_ENDPOINT); const allAccountsAddresses = []; @@ -101,10 +103,12 @@ const indexPosValidatorsInfo = async (numValidators, dbTrx) => { }; const indexPosStakesInfo = async (numStakers, dbTrx) => { - let totalStakeChange = BigInt(0); - let totalSelfStakeChange = BigInt(0); + let totalStake = BigInt(0); + let totalSelfStake = BigInt(0); if (numStakers > 0) { + const stakesTable = await getStakesTable(); + const posModuleData = await requestAll( requestConnector, 'getGenesisAssetByModule', @@ -113,21 +117,34 @@ const indexPosStakesInfo = async (numStakers, dbTrx) => { ); const stakers = posModuleData[MODULE_SUB_STORE.POS.STAKERS]; + const allStakes = []; stakers.forEach(staker => { const { address: stakerAddress, stakes } = staker; - stakes.forEach(stake => { const { validatorAddress, amount } = stake; - totalStakeChange += BigInt(amount); + + allStakes.push({ + stakerAddress, + validatorAddress, + amount: BigInt(amount), + }); + + totalStake += BigInt(amount); if (stakerAddress === validatorAddress) { - totalSelfStakeChange += BigInt(amount); + totalSelfStake += BigInt(amount); } }); }); + + await stakesTable.upsert(allStakes, dbTrx); + logger.info(`Updated ${allStakes.length} stakes from the genesis block.`); } - await updateTotalStake(totalStakeChange, dbTrx); - await updateTotalSelfStake(totalSelfStakeChange, dbTrx); + await updateTotalStake(totalStake, dbTrx); + logger.info(`Updated total stakes at genesis: ${totalStake.toString()}.`); + + await updateTotalSelfStake(totalSelfStake, dbTrx); + logger.info(`Updated total self-stakes information at genesis: ${totalSelfStake.toString()}.`); }; const indexPosModuleAssets = async dbTrx => { diff --git a/services/blockchain-indexer/shared/indexer/indexStatus.js b/services/blockchain-indexer/shared/indexer/indexStatus.js index c9b1401058..9aad2d2cf5 100644 --- a/services/blockchain-indexer/shared/indexer/indexStatus.js +++ b/services/blockchain-indexer/shared/indexer/indexStatus.js @@ -21,8 +21,6 @@ const { Signals, } = require('lisk-service-framework'); -const { indexValidatorCommissionInfo, indexStakersInfo } = require('./validatorIndex'); - const { getCurrentHeight, getGenesisHeight } = require('../constants'); const logger = Logger(); @@ -115,10 +113,6 @@ const init = async () => { // Register event listeners Signals.get('newBlock').add(checkIndexReadiness); - - // Index stakers and commission information available in genesis block - await indexValidatorCommissionInfo(); - await indexStakersInfo(); }; module.exports = { diff --git a/services/blockchain-indexer/shared/indexer/transactionProcessor/pos/stake.js b/services/blockchain-indexer/shared/indexer/transactionProcessor/pos/stake.js index b829ba0916..725c5b8b9f 100644 --- a/services/blockchain-indexer/shared/indexer/transactionProcessor/pos/stake.js +++ b/services/blockchain-indexer/shared/indexer/transactionProcessor/pos/stake.js @@ -52,7 +52,7 @@ const getStakeIndexingInfo = async tx => { stakeEntry.stakerAddress = getLisk32AddressFromPublicKey(tx.senderPublicKey); stakeEntry.validatorAddress = stake.validatorAddress; - stakeEntry.amount = stake.amount; + stakeEntry.amount = BigInt(stake.amount); return stakeEntry; }, { concurrency: tx.params.stakes.length }, @@ -158,6 +158,7 @@ const revertTransaction = async (blockHeader, tx, events, dbTrx) => { stakes, async stake => { await decrementStakeTrx(stake, dbTrx); + // Subtract to reverse the impact if (stake.stakerAddress === stake.validatorAddress) { totalSelfStakeChange -= BigInt(stake.amount); diff --git a/services/blockchain-indexer/shared/indexer/validatorIndex.js b/services/blockchain-indexer/shared/indexer/validatorIndex.js deleted file mode 100644 index 7b6ca4c72c..0000000000 --- a/services/blockchain-indexer/shared/indexer/validatorIndex.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * LiskHQ/lisk-service - * Copyright © 2022 Lisk Foundation - * - * See the LICENSE file at the top-level directory of this distribution - * for licensing information. - * - * Unless otherwise agreed in a custom licensing agreement with the Lisk Foundation, - * no part of this software, including this file, may be copied, modified, - * propagated, or distributed except according to the terms contained in the - * LICENSE file. - * - * Removal or modification of this copyright notice is prohibited. - * - */ -const { - DB: { - MySQL: { getTableInstance }, - }, -} = require('lisk-service-framework'); - -const { requestConnector } = require('../utils/request'); -const commissionsTableSchema = require('../database/schema/commissions'); -const stakesTableSchema = require('../database/schema/stakes'); - -const { getBlockByHeight } = require('../dataService'); -const { getGenesisHeight } = require('../constants'); - -const config = require('../../config'); - -const MYSQL_ENDPOINT = config.endpoints.mysql; - -const getCommissionsTable = () => getTableInstance(commissionsTableSchema, MYSQL_ENDPOINT); -const getStakesTable = () => getTableInstance(stakesTableSchema, MYSQL_ENDPOINT); - -const indexValidatorCommissionInfo = async () => { - const genesisBlock = await getBlockByHeight(await getGenesisHeight()); - const commissionsTable = await getCommissionsTable(); - const validators = await requestConnector('getPoSGenesisValidators'); - const commissionInfo = validators.map(validator => ({ - address: validator.address, - height: genesisBlock.height, - commission: validator.commission, - })); - if (commissionInfo.length) await commissionsTable.upsert(commissionInfo); -}; - -const indexStakersInfo = async () => { - const stakesTable = await getStakesTable(); - const stakers = await requestConnector('getPoSGenesisStakers'); - const stakesToIndex = []; - await stakers.forEach(async staker => - staker.stakes.forEach(stake => { - stakesToIndex.push({ - stakerAddress: staker.address, - validatorAddress: stake.validatorAddress, - amount: stake.amount, - }); - }), - ); - - if (stakesToIndex.length) await stakesTable.upsert(stakesToIndex); -}; - -module.exports = { - indexValidatorCommissionInfo, - indexStakersInfo, -}; diff --git a/services/blockchain-indexer/tests/unit/shared/constants/events.js b/services/blockchain-indexer/tests/unit/shared/constants/events.js index 05338d579a..a876b7b4c9 100644 --- a/services/blockchain-indexer/tests/unit/shared/constants/events.js +++ b/services/blockchain-indexer/tests/unit/shared/constants/events.js @@ -347,6 +347,8 @@ const mockEventTopicsQueryParams = { '03', 'c8ee3933cc841287d834f74f278ac12f145f320d0593a612e11b67b4a58cd17b', 'lskw68y3kyus7ota9mykr726aby44mw574m8dkngu', + '04c8ee3933cc841287d834f74f278ac12f145f320d0593a612e11b67b4a58cd17b', + '05c8ee3933cc841287d834f74f278ac12f145f320d0593a612e11b67b4a58cd17b', ], }, groupBy: 'eventID',