Skip to content

[Access] Refactor storage collections for access node #7093

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

Merged
merged 36 commits into from
Apr 17, 2025
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
eca55cd
refactor collections
zhangchiqing Feb 18, 2025
fde54c9
update execution builder to use store.collections
zhangchiqing Feb 18, 2025
a109af6
refactor collection node to read collections
zhangchiqing Feb 19, 2025
f326355
revert collection changes
zhangchiqing Feb 19, 2025
435b991
adding lock to protect indexing collections
zhangchiqing Feb 19, 2025
6cd812c
add concurrent test
zhangchiqing Feb 19, 2025
208fb81
refactor access node's transactions and collections storage module
zhangchiqing Feb 25, 2025
a5f43fb
Merge branch 'master' into leo/refactor-storage-collections-for-an
zhangchiqing Mar 6, 2025
705399d
refactor using protocoldb
zhangchiqing Mar 7, 2025
b70d475
making collections and transactions private
zhangchiqing Mar 7, 2025
5013f21
Merge branch 'master' into leo/refactor-storage-collections-for-an
zhangchiqing Mar 10, 2025
3287ed1
fix lint
zhangchiqing Mar 10, 2025
07288a9
update collections.Remove
zhangchiqing Mar 10, 2025
f38988b
remove collections.StoreLight
zhangchiqing Mar 10, 2025
1a15b10
index collections by txs
zhangchiqing Mar 11, 2025
e4bf8e5
Merge branch 'master' into leo/refactor-storage-collections-for-an
zhangchiqing Mar 13, 2025
99bbf77
update collections operations methods
zhangchiqing Mar 13, 2025
14469d0
refactor collection store and remove methods
zhangchiqing Mar 13, 2025
db502ad
refactor StoreLightAndIndexByTransaction
zhangchiqing Mar 13, 2025
35692d7
remove unused collections operations
zhangchiqing Mar 13, 2025
127859b
update mocks
zhangchiqing Mar 13, 2025
cbb01aa
add UpertCollection methods
zhangchiqing Mar 13, 2025
311b44b
refactor StoreLightAndIndexByTransaction
zhangchiqing Mar 13, 2025
a9c3140
add TODO
zhangchiqing Mar 13, 2025
6ab6b8c
Merge branch 'master' into leo/refactor-storage-collections-for-an
zhangchiqing Apr 1, 2025
7053720
use notNil for modules initialized by access builder
zhangchiqing Apr 4, 2025
2267d64
Merge branch 'master' into leo/refactor-storage-collections-for-an
zhangchiqing Apr 4, 2025
e1455ee
collection rpc might be nil
zhangchiqing Apr 4, 2025
a77dede
fix builder
zhangchiqing Apr 4, 2025
509efe7
update comments for store collections/transactions
zhangchiqing Apr 10, 2025
dab7142
fix access node builder
zhangchiqing Apr 10, 2025
2bd20e8
add TestTransactionRemove tests
zhangchiqing Apr 16, 2025
80a2eaf
add withRemove to store/cache
zhangchiqing Apr 16, 2025
57e4c8e
Merge branch 'master' into leo/refactor-storage-collections-for-an
zhangchiqing Apr 17, 2025
d343b5c
remove collections.StoreLight
zhangchiqing Apr 17, 2025
78dec17
add mocks
zhangchiqing Apr 17, 2025
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
68 changes: 35 additions & 33 deletions cmd/access/node_builder/access_node_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import (
"strings"
"time"

"github.com/cockroachdb/pebble"
"github.com/dgraph-io/badger/v2"
"github.com/ipfs/boxo/bitswap"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-datastore"
Expand Down Expand Up @@ -117,8 +115,6 @@ import (
"github.com/onflow/flow-go/state/protocol/blocktimer"
"github.com/onflow/flow-go/storage"
bstorage "github.com/onflow/flow-go/storage/badger"
"github.com/onflow/flow-go/storage/operation/badgerimpl"
"github.com/onflow/flow-go/storage/operation/pebbleimpl"
pstorage "github.com/onflow/flow-go/storage/pebble"
"github.com/onflow/flow-go/storage/store"
"github.com/onflow/flow-go/utils/grpcutils"
Expand Down Expand Up @@ -351,6 +347,8 @@ type FlowAccessNodeBuilder struct {
events storage.Events
lightTransactionResults storage.LightTransactionResults
transactionResultErrorMessages storage.TransactionResultErrorMessages
transactions storage.Transactions
collections storage.Collections

// The sync engine participants provider is the libp2p peer store for the access node
// which is not available until after the network has started.
Expand Down Expand Up @@ -579,6 +577,12 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess
AdminCommand("read-execution-data", func(config *cmd.NodeConfig) commands.AdminCommand {
return stateSyncCommands.NewReadExecutionDataCommand(builder.ExecutionDataStore)
}).
Module("transactions and collections storage", func(node *cmd.NodeConfig) error {
transactions := store.NewTransactions(node.Metrics.Cache, node.ProtocolDB)
builder.collections = store.NewCollections(node.ProtocolDB, transactions)
builder.transactions = transactions
return nil
}).
Module("execution data datastore and blobstore", func(node *cmd.NodeConfig) error {
datastoreDir := filepath.Join(builder.executionDataDir, "blobstore")
err := os.MkdirAll(datastoreDir, 0700)
Expand Down Expand Up @@ -618,29 +622,15 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess
Module("processed block height consumer progress", func(node *cmd.NodeConfig) error {
// Note: progress is stored in the datastore's DB since that is where the jobqueue
// writes execution data to.
var db storage.DB
edmdb := builder.ExecutionDatastoreManager.DB()

if bdb, ok := edmdb.(*badger.DB); ok {
db = badgerimpl.ToDB(bdb)
} else if pdb, ok := edmdb.(*pebble.DB); ok {
db = pebbleimpl.ToDB(pdb)
} else {
return fmt.Errorf("unsupported execution data DB type: %T", edmdb)
}
db := builder.ExecutionDatastoreManager.DB()

processedBlockHeight = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterBlockHeight)
return nil
}).
Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error {
// Note: progress is stored in the datastore's DB since that is where the jobqueue
// writes execution data to.
var db storage.DB
if executionDataDBMode == execution_data.ExecutionDataDBModeBadger {
db = badgerimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*badger.DB))
} else {
db = pebbleimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*pebble.DB))
}
db := builder.ExecutionDatastoreManager.DB()
processedNotifications = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterNotification)
return nil
}).
Expand Down Expand Up @@ -876,7 +866,7 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess
}).
Module("indexed block height consumer progress", func(node *cmd.NodeConfig) error {
// Note: progress is stored in the MAIN db since that is where indexed execution data is stored.
indexedBlockHeight = store.NewConsumerProgress(badgerimpl.ToDB(builder.DB), module.ConsumeProgressExecutionDataIndexerBlockHeight)
indexedBlockHeight = store.NewConsumerProgress(builder.ProtocolDB, module.ConsumeProgressExecutionDataIndexerBlockHeight)
return nil
}).
Module("transaction results storage", func(node *cmd.NodeConfig) error {
Expand Down Expand Up @@ -974,10 +964,10 @@ func (builder *FlowAccessNodeBuilder) BuildExecutionSyncComponents() *FlowAccess
builder.ProtocolDB,
builder.Storage.RegisterIndex,
builder.Storage.Headers,
builder.events,
builder.Storage.Collections,
builder.Storage.Transactions,
builder.lightTransactionResults,
notNil(builder.events),
notNil(builder.collections),
notNil(builder.transactions),
notNil(builder.lightTransactionResults),
builder.RootChainID.Chain(),
indexerDerivedChainData,
builder.collectionExecutedMetric,
Expand Down Expand Up @@ -1622,7 +1612,7 @@ func (builder *FlowAccessNodeBuilder) Initialize() error {
builder.EnqueueNetworkInit()

builder.AdminCommand("get-transactions", func(conf *cmd.NodeConfig) commands.AdminCommand {
return storageCommands.NewGetTransactionsCommand(conf.State, conf.Storage.Payloads, conf.Storage.Collections)
return storageCommands.NewGetTransactionsCommand(conf.State, conf.Storage.Payloads, notNil(builder.collections))
})

// if this is an access node that supports public followers, enqueue the public network
Expand Down Expand Up @@ -1867,13 +1857,13 @@ func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) {
return nil
}).
Module("processed finalized block height consumer progress", func(node *cmd.NodeConfig) error {
processedFinalizedBlockHeight = store.NewConsumerProgress(badgerimpl.ToDB(builder.DB), module.ConsumeProgressIngestionEngineBlockHeight)
processedFinalizedBlockHeight = store.NewConsumerProgress(builder.ProtocolDB, module.ConsumeProgressIngestionEngineBlockHeight)
return nil
}).
Module("processed last full block height monotonic consumer progress", func(node *cmd.NodeConfig) error {
rootBlockHeight := node.State.Params().FinalizedRoot().Height

progress, err := store.NewConsumerProgress(badgerimpl.ToDB(builder.DB), module.ConsumeProgressLastFullBlockHeight).Initialize(rootBlockHeight)
progress, err := store.NewConsumerProgress(builder.ProtocolDB, module.ConsumeProgressLastFullBlockHeight).Initialize(rootBlockHeight)
if err != nil {
return err
}
Expand Down Expand Up @@ -2043,8 +2033,8 @@ func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) {
HistoricalAccessNodes: builder.HistoricalAccessRPCs,
Blocks: node.Storage.Blocks,
Headers: node.Storage.Headers,
Collections: node.Storage.Collections,
Transactions: node.Storage.Transactions,
Collections: notNil(builder.collections),
Transactions: notNil(builder.transactions),
ExecutionReceipts: node.Storage.Receipts,
ExecutionResults: node.Storage.Results,
TxResultErrorMessages: builder.transactionResultErrorMessages,
Expand Down Expand Up @@ -2146,8 +2136,8 @@ func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) {
builder.RequestEng,
node.Storage.Blocks,
node.Storage.Headers,
node.Storage.Collections,
node.Storage.Transactions,
notNil(builder.collections),
notNil(builder.transactions),
node.Storage.Results,
node.Storage.Receipts,
builder.collectionExecutedMetric,
Expand Down Expand Up @@ -2180,7 +2170,7 @@ func (builder *FlowAccessNodeBuilder) Build() (cmd.Node, error) {
if builder.storeTxResultErrorMessages {
builder.Module("processed error messages block height consumer progress", func(node *cmd.NodeConfig) error {
processedTxErrorMessagesBlockHeight = store.NewConsumerProgress(
badgerimpl.ToDB(builder.DB),
builder.ProtocolDB,
module.ConsumeProgressEngineTxErrorMessagesBlockHeight,
)
return nil
Expand Down Expand Up @@ -2393,3 +2383,15 @@ func (builder *FlowAccessNodeBuilder) initPublicLibp2pNode(networkKey crypto.Pri

return libp2pNode, nil
}

// notNil ensures that the input is not nil and returns it
// the usage is to ensure the dependencies are initialized before initializing a module.
// for instance, the IngestionEngine depends on storage.Collections, which is initialized in a
// different function, so we need to ensure that the storage.Collections is initialized before
// creating the IngestionEngine.
func notNil[T any](dep T) T {
if any(dep) == nil {
panic("dependency is nil")
}
return dep
}
22 changes: 15 additions & 7 deletions cmd/execution_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ type ExecutionNode struct {
receipts storageerr.ExecutionReceipts
myReceipts storageerr.MyExecutionReceipts
commits storageerr.Commits
collections storageerr.Collections

chunkDataPackDB *pebble.DB
chunkDataPacks storageerr.ChunkDataPacks
Expand Down Expand Up @@ -194,9 +195,6 @@ func (builder *ExecutionNodeBuilder) LoadComponentsAndModules() {
AdminCommand("set-uploader-enabled", func(config *NodeConfig) commands.AdminCommand {
return uploaderCommands.NewToggleUploaderCommand(exeNode.blockDataUploader)
}).
AdminCommand("get-transactions", func(conf *NodeConfig) commands.AdminCommand {
return storageCommands.NewGetTransactionsCommand(conf.State, conf.Storage.Payloads, conf.Storage.Collections)
}).
AdminCommand("protocol-snapshot", func(conf *NodeConfig) commands.AdminCommand {
return storageCommands.NewProtocolSnapshotCommand(
conf.Logger,
Expand All @@ -206,6 +204,7 @@ func (builder *ExecutionNodeBuilder) LoadComponentsAndModules() {
exeNode.exeConf.triedir,
)
}).
Module("load collections", exeNode.LoadCollections).
Module("mutable follower state", exeNode.LoadMutableFollowerState).
Module("system specs", exeNode.LoadSystemSpecs).
Module("execution metrics", exeNode.LoadExecutionMetrics).
Expand All @@ -218,6 +217,9 @@ func (builder *ExecutionNodeBuilder) LoadComponentsAndModules() {
Module("blobservice peer manager dependencies", exeNode.LoadBlobservicePeerManagerDependencies).
Module("bootstrap", exeNode.LoadBootstrapper).
Module("register store", exeNode.LoadRegisterStore).
AdminCommand("get-transactions", func(conf *NodeConfig) commands.AdminCommand {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why move this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the exeNode.collections was not initialized until exeNode.LoadCollections is called.

That said, this change should be in a different PR, let me check.

return storageCommands.NewGetTransactionsCommand(conf.State, conf.Storage.Payloads, exeNode.collections)
}).
Component("execution state ledger", exeNode.LoadExecutionStateLedger).

// TODO: Modules should be able to depends on components
Expand Down Expand Up @@ -259,6 +261,13 @@ func (builder *ExecutionNodeBuilder) LoadComponentsAndModules() {
Component("grpc server", exeNode.LoadGrpcServer)
}

func (exeNode *ExecutionNode) LoadCollections(node *NodeConfig) error {
db := badgerimpl.ToDB(node.DB)
transactions := store.NewTransactions(node.Metrics.Cache, db)
exeNode.collections = store.NewCollections(db, transactions)
return nil
}

func (exeNode *ExecutionNode) LoadMutableFollowerState(node *NodeConfig) error {
// For now, we only support state implementations from package badger.
// If we ever support different implementations, the following can be replaced by a type-aware factory
Expand Down Expand Up @@ -467,7 +476,7 @@ func (exeNode *ExecutionNode) LoadGCPBlockDataUploader(
asyncUploader,
node.Storage.Blocks,
exeNode.commits,
node.Storage.Collections,
exeNode.collections,
exeNode.events,
exeNode.results,
exeNode.txResults,
Expand Down Expand Up @@ -745,7 +754,7 @@ func (exeNode *ExecutionNode) LoadExecutionState(
return nil
})
chunkDataPacks := store.NewChunkDataPacks(node.Metrics.Cache,
pebbleimpl.ToDB(chunkDataPackDB), node.Storage.Collections, exeNode.exeConf.chunkDataPackCacheSize)
pebbleimpl.ToDB(chunkDataPackDB), exeNode.collections, exeNode.exeConf.chunkDataPackCacheSize)

getLatestFinalized := func() (uint64, error) {
final, err := node.State.Final().Head()
Expand All @@ -763,7 +772,6 @@ func (exeNode *ExecutionNode) LoadExecutionState(
exeNode.commits,
node.Storage.Blocks,
node.Storage.Headers,
node.Storage.Collections,
chunkDataPacks,
exeNode.results,
exeNode.myReceipts,
Expand Down Expand Up @@ -1107,7 +1115,7 @@ func (exeNode *ExecutionNode) LoadIngestionEngine(
colFetcher,
node.Storage.Headers,
node.Storage.Blocks,
node.Storage.Collections,
exeNode.collections,
exeNode.executionState,
node.State,
exeNode.collector,
Expand Down
18 changes: 3 additions & 15 deletions cmd/observer/node_builder/observer_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import (
"strings"
"time"

"github.com/cockroachdb/pebble"
"github.com/dgraph-io/badger/v2"
"github.com/ipfs/boxo/bitswap"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-datastore"
Expand Down Expand Up @@ -109,7 +107,6 @@ import (
"github.com/onflow/flow-go/storage"
bstorage "github.com/onflow/flow-go/storage/badger"
"github.com/onflow/flow-go/storage/operation/badgerimpl"
"github.com/onflow/flow-go/storage/operation/pebbleimpl"
pstorage "github.com/onflow/flow-go/storage/pebble"
"github.com/onflow/flow-go/storage/store"
"github.com/onflow/flow-go/utils/grpcutils"
Expand Down Expand Up @@ -1129,25 +1126,16 @@ func (builder *ObserverServiceBuilder) BuildExecutionSyncComponents() *ObserverS
Module("processed block height consumer progress", func(node *cmd.NodeConfig) error {
// Note: progress is stored in the datastore's DB since that is where the jobqueue
// writes execution data to.
var db storage.DB
if executionDataDBMode == execution_data.ExecutionDataDBModeBadger {
db = badgerimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*badger.DB))
} else {
db = pebbleimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*pebble.DB))
}
db := builder.ExecutionDatastoreManager.DB()

processedBlockHeight = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterBlockHeight)
return nil
}).
Module("processed notifications consumer progress", func(node *cmd.NodeConfig) error {
// Note: progress is stored in the datastore's DB since that is where the jobqueue
// writes execution data to.
var db storage.DB
if executionDataDBMode == execution_data.ExecutionDataDBModeBadger {
db = badgerimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*badger.DB))
} else {
db = pebbleimpl.ToDB(builder.ExecutionDatastoreManager.DB().(*pebble.DB))
}
db := builder.ExecutionDatastoreManager.DB()

processedNotifications = store.NewConsumerProgress(db, module.ConsumeProgressExecutionDataRequesterNotification)
return nil
}).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ func TestReExecuteBlock(t *testing.T) {
myReceipts := store.NewMyExecutionReceipts(metrics, db, receipts)
events := store.NewEvents(metrics, db)
serviceEvents := store.NewServiceEvents(metrics, db)
transactions := bstorage.NewTransactions(metrics, bdb)
collections := bstorage.NewCollections(bdb, transactions)

err = headers.Store(genesis)
require.NoError(t, err)
Expand All @@ -62,7 +60,6 @@ func TestReExecuteBlock(t *testing.T) {
commits,
nil,
headers,
collections,
chunkDataPacks,
results,
myReceipts,
Expand Down Expand Up @@ -200,7 +197,6 @@ func TestReExecuteBlockWithDifferentResult(t *testing.T) {
commits,
nil,
headers,
collections,
chunkDataPacks,
results,
myReceipts,
Expand Down
3 changes: 0 additions & 3 deletions engine/execution/state/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ type state struct {
commits storage.Commits
blocks storage.Blocks
headers storage.Headers
collections storage.Collections
chunkDataPacks storage.ChunkDataPacks
results storage.ExecutionResults
myReceipts storage.MyExecutionReceipts
Expand All @@ -115,7 +114,6 @@ func NewExecutionState(
commits storage.Commits,
blocks storage.Blocks,
headers storage.Headers,
collections storage.Collections,
chunkDataPacks storage.ChunkDataPacks,
results storage.ExecutionResults,
myReceipts storage.MyExecutionReceipts,
Expand All @@ -134,7 +132,6 @@ func NewExecutionState(
commits: commits,
blocks: blocks,
headers: headers,
collections: collections,
chunkDataPacks: chunkDataPacks,
results: results,
myReceipts: myReceipts,
Expand Down
3 changes: 1 addition & 2 deletions engine/execution/state/state_storehouse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ func prepareStorehouseTest(f func(t *testing.T, es state.ExecutionState, l *ledg
stateCommitments.On("BatchStore", mock.Anything, mock.Anything, mock.Anything).Return(nil)
headers := storage.NewHeaders(t)
blocks := storage.NewBlocks(t)
collections := storage.NewCollections(t)
events := storage.NewEvents(t)
events.On("BatchStore", mock.Anything, mock.Anything, mock.Anything).Return(nil)
serviceEvents := storage.NewServiceEvents(t)
Expand Down Expand Up @@ -93,7 +92,7 @@ func prepareStorehouseTest(f func(t *testing.T, es state.ExecutionState, l *ledg
}

es := state.NewExecutionState(
ls, stateCommitments, blocks, headers, collections, chunkDataPacks, results, myReceipts, events, serviceEvents, txResults, badgerimpl.ToDB(badgerDB),
ls, stateCommitments, blocks, headers, chunkDataPacks, results, myReceipts, events, serviceEvents, txResults, badgerimpl.ToDB(badgerDB),
getLatestFinalized,
trace.NewNoopTracer(),
rs,
Expand Down
3 changes: 1 addition & 2 deletions engine/execution/state/state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ func prepareTest(f func(t *testing.T, es state.ExecutionState, l *ledger.Ledger,
stateCommitments := storage.NewCommits(t)
headers := storage.NewHeaders(t)
blocks := storage.NewBlocks(t)
collections := storage.NewCollections(t)
events := storage.NewEvents(t)
serviceEvents := storage.NewServiceEvents(t)
txResults := storage.NewTransactionResults(t)
Expand All @@ -54,7 +53,7 @@ func prepareTest(f func(t *testing.T, es state.ExecutionState, l *ledger.Ledger,

db := badgerimpl.ToDB(badgerDB)
es := state.NewExecutionState(
ls, stateCommitments, blocks, headers, collections, chunkDataPacks, results, myReceipts, events, serviceEvents, txResults, db, getLatestFinalized, trace.NewNoopTracer(),
ls, stateCommitments, blocks, headers, chunkDataPacks, results, myReceipts, events, serviceEvents, txResults, db, getLatestFinalized, trace.NewNoopTracer(),
nil,
false,
)
Expand Down
2 changes: 1 addition & 1 deletion engine/testutil/nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,7 @@ func ExecutionNode(t *testing.T, hub *stub.Hub, identity bootstrap.NodeInfo, ide
return final.Height, nil
}
execState := executionState.NewExecutionState(
ls, commitsStorage, node.Blocks, node.Headers, collectionsStorage, chunkDataPackStorage, results, myReceipts, eventsStorage, serviceEventsStorage, txResultStorage, db, getLatestFinalized, node.Tracer,
ls, commitsStorage, node.Blocks, node.Headers, chunkDataPackStorage, results, myReceipts, eventsStorage, serviceEventsStorage, txResultStorage, db, getLatestFinalized, node.Tracer,
// TODO: test with register store
registerStore,
storehouseEnabled,
Expand Down
Loading
Loading