diff --git a/app/rpc/rpchandlers/get_block_count.go b/app/rpc/rpchandlers/get_block_count.go index 5988c5342..24b6d353b 100644 --- a/app/rpc/rpchandlers/get_block_count.go +++ b/app/rpc/rpchandlers/get_block_count.go @@ -8,7 +8,10 @@ import ( // HandleGetBlockCount handles the respectively named RPC command func HandleGetBlockCount(context *rpccontext.Context, _ *router.Router, _ appmessage.Message) (appmessage.Message, error) { - response := &appmessage.GetBlockCountResponseMessage{} - response.Error = appmessage.RPCErrorf("not implemented") + syncInfo, err := context.Domain.Consensus().GetSyncInfo() + if err != nil { + return nil, err + } + response := appmessage.NewGetBlockCountResponseMessage(syncInfo.BlockCount) return response, nil } diff --git a/domain/consensus/datastructures/blockheaderstore/blockheaderstore.go b/domain/consensus/datastructures/blockheaderstore/blockheaderstore.go index 4fb6ffa47..3869ed443 100644 --- a/domain/consensus/datastructures/blockheaderstore/blockheaderstore.go +++ b/domain/consensus/datastructures/blockheaderstore/blockheaderstore.go @@ -143,3 +143,15 @@ func (bms *blockHeaderStore) cloneHeader(header *externalapi.DomainBlockHeader) return bms.deserializeHeader(serialized) } + +func (bms *blockHeaderStore) Count(dbContext model.DBReader) (uint64, error) { + cursor, err := dbContext.Cursor(bucket) + if err != nil { + return 0, err + } + count := uint64(0) + for cursor.Next() { + count++ + } + return count, nil +} diff --git a/domain/consensus/datastructures/blockstore/blockstore.go b/domain/consensus/datastructures/blockstore/blockstore.go index 84fedbb54..e7619c6cd 100644 --- a/domain/consensus/datastructures/blockstore/blockstore.go +++ b/domain/consensus/datastructures/blockstore/blockstore.go @@ -143,3 +143,15 @@ func (bms *blockStore) clone(block *externalapi.DomainBlock) (*externalapi.Domai return bms.deserializeBlock(serialized) } + +func (bms *blockStore) Count(dbContext model.DBReader) (uint64, error) { + cursor, err := dbContext.Cursor(bucket) + if err != nil { + return 0, err + } + count := uint64(0) + for cursor.Next() { + count++ + } + return count, nil +} diff --git a/domain/consensus/factory.go b/domain/consensus/factory.go index 44fd76f48..3bd7883c2 100644 --- a/domain/consensus/factory.go +++ b/domain/consensus/factory.go @@ -209,7 +209,8 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, db infrastructuredat ghostdagDataStore, blockStatusStore, blockHeaderStore, - headerTipsStore) + headerTipsStore, + blockStore) blockBuilder := blockbuilder.New( dbManager, diff --git a/domain/consensus/model/externalapi/sync.go b/domain/consensus/model/externalapi/sync.go index e57905c05..4bf942fa2 100644 --- a/domain/consensus/model/externalapi/sync.go +++ b/domain/consensus/model/externalapi/sync.go @@ -36,4 +36,6 @@ func (s SyncState) String() string { type SyncInfo struct { State SyncState IBDRootUTXOBlockHash *DomainHash + HeaderCount uint64 + BlockCount uint64 } diff --git a/domain/consensus/model/interface_datastructures_blockheaderstore.go b/domain/consensus/model/interface_datastructures_blockheaderstore.go index 6b98f815c..adbe97b5d 100644 --- a/domain/consensus/model/interface_datastructures_blockheaderstore.go +++ b/domain/consensus/model/interface_datastructures_blockheaderstore.go @@ -11,4 +11,5 @@ type BlockHeaderStore interface { HasBlockHeader(dbContext DBReader, blockHash *externalapi.DomainHash) (bool, error) BlockHeaders(dbContext DBReader, blockHashes []*externalapi.DomainHash) ([]*externalapi.DomainBlockHeader, error) Delete(blockHash *externalapi.DomainHash) + Count(dbContext DBReader) (uint64, error) } diff --git a/domain/consensus/model/interface_datastructures_blockstore.go b/domain/consensus/model/interface_datastructures_blockstore.go index 0eaead6a0..4c36ed3be 100644 --- a/domain/consensus/model/interface_datastructures_blockstore.go +++ b/domain/consensus/model/interface_datastructures_blockstore.go @@ -11,4 +11,5 @@ type BlockStore interface { HasBlock(dbContext DBReader, blockHash *externalapi.DomainHash) (bool, error) Blocks(dbContext DBReader, blockHashes []*externalapi.DomainHash) ([]*externalapi.DomainBlock, error) Delete(blockHash *externalapi.DomainHash) + Count(dbContext DBReader) (uint64, error) } diff --git a/domain/consensus/processes/syncmanager/syncinfo.go b/domain/consensus/processes/syncmanager/syncinfo.go index 42c732d01..02990d9af 100644 --- a/domain/consensus/processes/syncmanager/syncinfo.go +++ b/domain/consensus/processes/syncmanager/syncinfo.go @@ -25,9 +25,20 @@ func (sm *syncManager) syncInfo() (*externalapi.SyncInfo, error) { } } + headerCount, err := sm.getHeaderCount() + if err != nil { + return nil, err + } + blockCount, err := sm.getBlockCount() + if err != nil { + return nil, err + } + return &externalapi.SyncInfo{ State: syncState, IBDRootUTXOBlockHash: ibdRootUTXOBlockHash, + HeaderCount: headerCount, + BlockCount: blockCount, }, nil } @@ -111,3 +122,11 @@ func (sm *syncManager) areHeaderTipsSynced(headerVirtualSelectedParentHash *exte return timeDifference <= maxTimeDifference, nil } + +func (sm *syncManager) getHeaderCount() (uint64, error) { + return sm.blockHeaderStore.Count(sm.databaseContext) +} + +func (sm *syncManager) getBlockCount() (uint64, error) { + return sm.blockStore.Count(sm.databaseContext) +} diff --git a/domain/consensus/processes/syncmanager/syncmanager.go b/domain/consensus/processes/syncmanager/syncmanager.go index bed6329ef..5c206c408 100644 --- a/domain/consensus/processes/syncmanager/syncmanager.go +++ b/domain/consensus/processes/syncmanager/syncmanager.go @@ -20,6 +20,7 @@ type syncManager struct { blockStatusStore model.BlockStatusStore blockHeaderStore model.BlockHeaderStore headerTipsStore model.HeaderTipsStore + blockStore model.BlockStore } // New instantiates a new SyncManager @@ -35,7 +36,8 @@ func New( ghostdagDataStore model.GHOSTDAGDataStore, blockStatusStore model.BlockStatusStore, blockHeaderStore model.BlockHeaderStore, - headerTipsStore model.HeaderTipsStore) model.SyncManager { + headerTipsStore model.HeaderTipsStore, + blockStore model.BlockStore) model.SyncManager { return &syncManager{ databaseContext: databaseContext, @@ -51,6 +53,7 @@ func New( blockStatusStore: blockStatusStore, blockHeaderStore: blockHeaderStore, headerTipsStore: headerTipsStore, + blockStore: blockStore, } }