From d50ad0667ca2405da46c540b3d80b5d1cc9c0176 Mon Sep 17 00:00:00 2001 From: Michael Sutton Date: Wed, 1 Jun 2022 12:19:21 +0300 Subject: [PATCH] Unite multiple `GetBlockAcceptanceData` consensus calls to one (#2074) * Unite multiple `GetBlockAcceptanceData` consensus calls to one * Variable rename --- app/rpc/rpccontext/chain_changed.go | 12 ++++++---- domain/consensus/consensus.go | 24 +++++++++++++++++++ .../consensus/model/externalapi/consensus.go | 1 + 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/rpc/rpccontext/chain_changed.go b/app/rpc/rpccontext/chain_changed.go index 97333ff8d..e0afffe27 100644 --- a/app/rpc/rpccontext/chain_changed.go +++ b/app/rpc/rpccontext/chain_changed.go @@ -40,16 +40,18 @@ func (ctx *Context) getAndConvertAcceptedTransactionIDs(selectedParentChainChang acceptedTransactionIDs := make([]*appmessage.AcceptedTransactionIDs, len(selectedParentChainChanges.Added)) + chainBlocksAcceptanceData, err := ctx.Domain.Consensus().GetBlocksAcceptanceData(selectedParentChainChanges.Added) + if err != nil { + return nil, err + } + for i, addedChainBlock := range selectedParentChainChanges.Added { - blockAcceptanceData, err := ctx.Domain.Consensus().GetBlockAcceptanceData(addedChainBlock) - if err != nil { - return nil, err - } + chainBlockAcceptanceData := chainBlocksAcceptanceData[i] acceptedTransactionIDs[i] = &appmessage.AcceptedTransactionIDs{ AcceptingBlockHash: addedChainBlock.String(), AcceptedTransactionIDs: nil, } - for _, blockAcceptanceData := range blockAcceptanceData { + for _, blockAcceptanceData := range chainBlockAcceptanceData { for _, transactionAcceptanceData := range blockAcceptanceData.TransactionAcceptanceData { if transactionAcceptanceData.IsAccepted { acceptedTransactionIDs[i].AcceptedTransactionIDs = diff --git a/domain/consensus/consensus.go b/domain/consensus/consensus.go index eac4c5654..154d05110 100644 --- a/domain/consensus/consensus.go +++ b/domain/consensus/consensus.go @@ -426,6 +426,30 @@ func (s *consensus) GetBlockAcceptanceData(blockHash *externalapi.DomainHash) (e return s.acceptanceDataStore.Get(s.databaseContext, stagingArea, blockHash) } +func (s *consensus) GetBlocksAcceptanceData(blockHashes []*externalapi.DomainHash) ([]externalapi.AcceptanceData, error) { + s.lock.Lock() + defer s.lock.Unlock() + + stagingArea := model.NewStagingArea() + blocksAcceptanceData := make([]externalapi.AcceptanceData, len(blockHashes)) + + for i, blockHash := range blockHashes { + err := s.validateBlockHashExists(stagingArea, blockHash) + if err != nil { + return nil, err + } + + acceptanceData, err := s.acceptanceDataStore.Get(s.databaseContext, stagingArea, blockHash) + if err != nil { + return nil, err + } + + blocksAcceptanceData[i] = acceptanceData + } + + return blocksAcceptanceData, nil +} + func (s *consensus) GetHashesBetween(lowHash, highHash *externalapi.DomainHash, maxBlocks uint64) ( hashes []*externalapi.DomainHash, actualHighHash *externalapi.DomainHash, err error) { diff --git a/domain/consensus/model/externalapi/consensus.go b/domain/consensus/model/externalapi/consensus.go index 397113b6e..def2a2bc5 100644 --- a/domain/consensus/model/externalapi/consensus.go +++ b/domain/consensus/model/externalapi/consensus.go @@ -19,6 +19,7 @@ type Consensus interface { GetBlockInfo(blockHash *DomainHash) (*BlockInfo, error) GetBlockRelations(blockHash *DomainHash) (parents []*DomainHash, children []*DomainHash, err error) GetBlockAcceptanceData(blockHash *DomainHash) (AcceptanceData, error) + GetBlocksAcceptanceData(blockHashes []*DomainHash) ([]AcceptanceData, error) GetHashesBetween(lowHash, highHash *DomainHash, maxBlocks uint64) (hashes []*DomainHash, actualHighHash *DomainHash, err error) GetAnticone(blockHash, contextHash *DomainHash, maxBlocks uint64) (hashes []*DomainHash, err error)