save changes

This commit is contained in:
D-Stacks 2022-09-13 22:25:50 +02:00
parent 87c5ad0abf
commit f7fcffe6aa
5 changed files with 204 additions and 2 deletions

View File

@ -395,6 +395,22 @@ func (s *consensus) GetBlock(blockHash *externalapi.DomainHash) (*externalapi.Do
return block, nil return block, nil
} }
func (s *consensus) GetBlocks(blockHashes []*externalapi.DomainHash) ([]*externalapi.DomainBlock, error) {
s.lock.Lock()
defer s.lock.Unlock()
stagingArea := model.NewStagingArea()
blocks, err := s.blockStore.Blocks(s.databaseContext, stagingArea, blockHashes)
if err != nil {
if errors.Is(err, database.ErrNotFound) {
return nil, errors.Wrapf(err, "Quried block %s does not exist")
}
return nil, err
}
return blocks, nil
}
func (s *consensus) GetBlockEvenIfHeaderOnly(blockHash *externalapi.DomainHash) (*externalapi.DomainBlock, error) { func (s *consensus) GetBlockEvenIfHeaderOnly(blockHash *externalapi.DomainHash) (*externalapi.DomainBlock, error) {
s.lock.Lock() s.lock.Lock()
defer s.lock.Unlock() defer s.lock.Unlock()

View File

@ -14,6 +14,7 @@ type Consensus interface {
ApplyPruningPointProof(pruningPointProof *PruningPointProof) error ApplyPruningPointProof(pruningPointProof *PruningPointProof) error
GetBlock(blockHash *DomainHash) (*DomainBlock, error) GetBlock(blockHash *DomainHash) (*DomainBlock, error)
GetBlocks(blockHashes []*DomainHash) (*DomainBlock, error)
GetBlockEvenIfHeaderOnly(blockHash *DomainHash) (*DomainBlock, error) GetBlockEvenIfHeaderOnly(blockHash *DomainHash) (*DomainBlock, error)
GetBlockHeader(blockHash *DomainHash) (BlockHeader, error) GetBlockHeader(blockHash *DomainHash) (BlockHeader, error)
GetBlockInfo(blockHash *DomainHash) (*BlockInfo, error) GetBlockInfo(blockHash *DomainHash) (*BlockInfo, error)

View File

@ -13,6 +13,12 @@ type TXAcceptanceChange struct {
Removed map[externalapi.DomainTransactionID]*externalapi.DomainHash Removed map[externalapi.DomainTransactionID]*externalapi.DomainHash
} }
//TxIDsToBlocks is a map of TxIDs to corrospnding blockHashes
type TxIDsToBlockHashes map[*externalapi.DomainTransactionID]*externalapi.DomainHash
//TxIDsToBlocks is a map of TxIDs to corrospnding blocks
type TxIDsToBlocks map[*externalapi.DomainTransactionID]*externalapi.DomainBlock
// ConvertDomainHashToString converts the given DomainHash to a string // ConvertDomainHashToString converts the given DomainHash to a string
func ConvertDomainHashToString(blockHash *externalapi.DomainHash) string { func ConvertDomainHashToString(blockHash *externalapi.DomainHash) string {
return hex.EncodeToString(blockHash.ByteSlice()) return hex.EncodeToString(blockHash.ByteSlice())

View File

@ -231,3 +231,32 @@ func (tis *txIndexStore) getTxAcceptingBlockHash(txID *externalapi.DomainTransac
return acceptingBlockHash, true, nil return acceptingBlockHash, true, nil
} }
func (tis *txIndexStore) getTxAcceptingBlockHashes(txIDs []*externalapi.DomainTransactionID) (acceptingBlockHashes TxIDsToBlockHashes, found bool, err error) {
if tis.isAnythingStaged() {
return nil, false, errors.Errorf("cannot get TX accepting Block hash while staging isn't empty")
}
keys := make([]*database.Key, len(txIDs))
acceptingBlockHashes = make(TxIDsToBlockHashes)
for i, key := range keys {
key = tis.convertTxIDToKey(txAcceptedIndexBucket, *txIDs[i])
serializedAcceptingBlockHash, err := tis.database.Get(key)
if err != nil {
if database.IsNotFoundError(err) {
return nil, false, nil
}
return nil, false, err
}
acceptingBlockHash, err := externalapi.NewDomainHashFromByteSlice(serializedAcceptingBlockHash)
if err != nil {
return nil, false, err
}
acceptingBlockHashes[txIDs[i]] = acceptingBlockHash
}
return acceptingBlockHashes, true, nil
}

View File

@ -1,10 +1,13 @@
package txindex package txindex
import ( import (
"errors"
"fmt"
"sync" "sync"
"github.com/kaspanet/kaspad/domain" "github.com/kaspanet/kaspad/domain"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtraversalmanager"
"github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing" "github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing"
"github.com/kaspanet/kaspad/infrastructure/db/database" "github.com/kaspanet/kaspad/infrastructure/db/database"
"github.com/kaspanet/kaspad/infrastructure/logger" "github.com/kaspanet/kaspad/infrastructure/logger"
@ -241,18 +244,165 @@ func (ti *TXIndex) removeTXIDs(selectedParentChainChanges *externalapi.SelectedC
} }
// TXAcceptingBlockHash returns the accepting block hash for for the given txID // TXAcceptingBlockHash returns the accepting block hash for for the given txID
func (ti *TXIndex) TXAcceptingBlockHash(txID *externalapi.DomainTransactionID) (blockHash *externalapi.DomainHash, found bool, err error) { func (ti *TXIndex) TXAcceptingBlockHash(txID *externalapi.DomainTransactionID) (acceptingBlockHash *externalapi.DomainHash, found bool, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlockHash") onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlockHash")
defer onEnd() defer onEnd()
ti.mutex.Lock() ti.mutex.Lock()
defer ti.mutex.Unlock() defer ti.mutex.Unlock()
acceptingBlockHash, found, err = ti.store.getTxAcceptingBlockHash(txID)
if err != nil {
return nil, false, err
}
if !found {
return nil, false, nil
}
return acceptingBlockHash, found, nil
}
func (ti *TXIndex) TXAcceptingBlockHashes(txIDs []*externalapi.DomainTransactionID) (acceptingBlockHashes TxIDsToBlockHashes, found bool, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlockHash")
defer onEnd()
ti.mutex.Lock()
defer ti.mutex.Unlock()
acceptingBlockHashes, found, err = ti.store.getTxAcceptingBlockHashes(txIDs)
if err != nil {
return nil, false, err
}
if !found {
return nil, false, nil
}
return acceptingBlockHashes, found, nil
}
func (ti *TXIndex) TXAcceptingBlock(txID *externalapi.DomainTransactionID) (block *externalapi.DomainBlock, found bool, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlock")
defer onEnd()
ti.mutex.Lock()
defer ti.mutex.Unlock()
acceptingBlockHash, found, err := ti.store.getTxAcceptingBlockHash(txID) acceptingBlockHash, found, err := ti.store.getTxAcceptingBlockHash(txID)
if err != nil { if err != nil {
return nil, false, err return nil, false, err
} }
return acceptingBlockHash, found, nil
acceptingBlock, err := ti.domain.Consensus().GetBlock(acceptingBlockHash)
if err != nil {
return nil, false, err
}
return acceptingBlock, true, nil
}
func (ti *TXIndex) TXAcceptingBlocks(txIDs []*externalapi.DomainTransactionID) (acceptingBlocks TxIDsToBlocks, found bool, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlock")
defer onEnd()
ti.mutex.Lock()
defer ti.mutex.Unlock()
acceptingBlockHash, found, err := ti.store.getTxAcceptingBlockHashes(txIDs)
if err != nil {
return nil, false, err
}
acceptingBlocks, err = ti.domain.Consensus().GetBlocks(acceptingBlockHash)
if err != nil {
return nil, false, err
}
return acceptingBlock, true, nil
}
func (ti *TXIndex) GetTX(txID *externalapi.DomainTransactionID) (block *externalapi.DomainTransaction, found bool, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTX")
defer onEnd()
ti.mutex.Lock()
defer ti.mutex.Unlock()
acceptingBlockHash, found, err := ti.store.getTxAcceptingBlockHash(txID)
if err != nil {
return nil, false, err
}
acceptingBlock, err := ti.domain.Consensus().GetBlock(acceptingBlockHash)
if err != nil {
return nil, false, err
}
var transaction *externalapi.DomainTransaction
for _, tx := range acceptingBlock.Transactions {
if consensushashing.TransactionID(tx).Equal(txID) {
transaction = tx
return transaction, true, nil
}
}
return nil, false, fmt.Errorf("Could not find transaction with ID %s in Txindex database", txID.String())
}
func (ti *TXIndex) GetTXConfirmations(txID *externalapi.DomainTransactionID) (BlockHashTxIDPair uint64, found bool, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.GetTX")
defer onEnd()
ti.mutex.Lock()
defer ti.mutex.Unlock()
acceptingBlockHash, found, err := ti.store.getTxAcceptingBlockHash(txID)
if err != nil {
return 0, false, err
}
acceptingBlockHeader, err := ti.domain.Consensus().GetBlockHeader(acceptingBlockHash)
if err != nil {
return 0, false, err
}
virtualBlock, err := ti.domain.Consensus().GetVirtualInfo()
if err != nil {
return 0, false, err
}
return virtualBlock.BlueScore - acceptingBlockHeader.BlueScore(), true, nil
}
func (ti *TXIndex) TXIncludingBlockHash(txID *externalapi.DomainTransactionID) (includingBlockHash *externalapi.DomainHash, found bool, err error) {
onEnd := logger.LogAndMeasureExecutionTime(log, "TXIndex.TXAcceptingBlock")
defer onEnd()
ti.mutex.Lock()
defer ti.mutex.Unlock()
acceptingBlockHash, found, err := ti.store.getTxAcceptingBlockHash(txID)
if err != nil {
return nil, false, err
}
acceptanceData, err := ti.domain.Consensus().GetBlockAcceptanceData(acceptingBlockHash)
if err != nil {
return nil, false, err
}
for _, blockAcceptanceData := range acceptanceData {
for _, transactionAcceptanceData := range blockAcceptanceData.TransactionAcceptanceData {
if consensushashing.TransactionID(transactionAcceptanceData.Transaction).Equal(txID) {
return blockAcceptanceData.BlockHash, true, nil
}
}
}
return nil, false, fmt.Errorf("Could not find including blockHash for transaction with ID %s in Txindex database", txID.String())
} }
//TO DO: Get Block from TxID //TO DO: Get Block from TxID