enclavedb

package
v0.20.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 14, 2023 License: AGPL-3.0 Imports: 19 Imported by: 0

README

This package contains the logic to access the relational database.

Currently, it is at the first version which is a little rough.

Historical reasoning for the current design:

  1. Geth is implemented on top of levelDB, and so makes heavy use of the k/v mechanism.
  2. Ten uses EdglessDb in production, and sqlite in testing.
  3. Ten started out by implementing the k/v primitives on top of sql.
  4. Then we decided to use the SQL features to simplify some business logic, which required exposing the sql primitives.
  5. Eventually, we ended up using SQL for everything, except the evm functionality.

The current abstractions are reflecting the first 4 steps.

Note: This package also mixes the EnclaveDB and TransactionDB implementations

SQL implementation

The implementation to read/write data to the db is also quite crude.

It mixes the SQL logic with the implementations for the EnclaveDB and DBTransaction. The reason it has to do that is because they depend on the SQL k/v logic.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func BatchWasExecuted

func BatchWasExecuted(db *sql.DB, hash common.L2BatchHash) (bool, error)

func DebugGetLogs

func DebugGetLogs(db *sql.DB, txHash common.TxHash) ([]*tracers.DebugLogs, error)

func Delete

func Delete(db *sql.DB, key []byte) error

func DeleteKeys

func DeleteKeys(db *sql.Tx, keys [][]byte) error

func FetchAttKey

func FetchAttKey(db *sql.DB, party common.Address) ([]byte, error)

func FetchBlock

func FetchBlock(db *sql.DB, hash common.L1BlockHash) (*types.Block, error)

todo - remove this. For now creates a "block" but without a body.

func FetchBlockHeader

func FetchBlockHeader(db *sql.DB, hash common.L1BlockHash) (*types.Header, error)

func FetchBlockHeaderByHeight

func FetchBlockHeaderByHeight(db *sql.DB, height *big.Int) (*types.Header, error)

func FetchConfig

func FetchConfig(db *sql.DB, key string) ([]byte, error)

func FetchHeadBlock

func FetchHeadBlock(db *sql.DB) (*types.Block, error)

func FetchL1Messages

func FetchL1Messages[T any](db *sql.DB, blockHash common.L1BlockHash, isTransfer bool) ([]T, error)

func FetchReorgedRollup

func FetchReorgedRollup(db *sql.DB, reorgedBlocks []common.L1BlockHash) (*common.L2BatchHash, error)

func FilterLogs

func FilterLogs(
	db *sql.DB,
	requestingAccount *gethcommon.Address,
	fromBlock, toBlock *big.Int,
	batchHash *common.L2BatchHash,
	addresses []gethcommon.Address,
	topics [][]gethcommon.Hash,
) ([]*types.Log, error)

func Get

func Get(db *sql.DB, key []byte) ([]byte, error)

func GetContractCreationTx

func GetContractCreationTx(db *sql.DB, address gethcommon.Address) (*gethcommon.Hash, error)

func GetPublicTransactionCount

func GetPublicTransactionCount(db *sql.DB) (uint64, error)

func GetPublicTransactionData

func GetPublicTransactionData(db *sql.DB, pagination *common.QueryPagination) ([]common.PublicTransaction, error)

func GetReceiptsPerAddress

func GetReceiptsPerAddress(db *sql.DB, config *params.ChainConfig, address *gethcommon.Address, pagination *common.QueryPagination) (types.Receipts, error)

func GetReceiptsPerAddressCount

func GetReceiptsPerAddressCount(db *sql.DB, address *gethcommon.Address) (uint64, error)

func Has

func Has(db *sql.DB, key []byte) (bool, error)

func NewIterator

func NewIterator(db *sql.DB, prefix []byte, start []byte) ethdb.Iterator

func Put

func Put(db *sql.DB, key []byte, value []byte) error

func PutKeyValues

func PutKeyValues(tx *sql.Tx, keys [][]byte, vals [][]byte) error

func ReadBatchByHash

func ReadBatchByHash(db *sql.DB, hash common.L2BatchHash) (*core.Batch, error)

func ReadBatchBySeqNo

func ReadBatchBySeqNo(db *sql.DB, seqNo uint64) (*core.Batch, error)

func ReadBatchHeader

func ReadBatchHeader(db *sql.DB, hash gethcommon.Hash) (*common.BatchHeader, error)

func ReadBatchesByBlock

func ReadBatchesByBlock(db *sql.DB, hash common.L1BlockHash) ([]*core.Batch, error)

func ReadCanonicalBatchByHeight

func ReadCanonicalBatchByHeight(db *sql.DB, height uint64) (*core.Batch, error)

func ReadContractCreationCount

func ReadContractCreationCount(db *sql.DB) (*big.Int, error)

func ReadCurrentHeadBatch

func ReadCurrentHeadBatch(db *sql.DB) (*core.Batch, error)

todo - is there a better way to write this query?

func ReadCurrentSequencerNo

func ReadCurrentSequencerNo(db *sql.DB) (*big.Int, error)

func ReadHeadBatchForBlock

func ReadHeadBatchForBlock(db *sql.DB, l1Hash common.L1BlockHash) (*core.Batch, error)

func ReadNonCanonicalBatches

func ReadNonCanonicalBatches(db *sql.DB, startAtSeq uint64, endSeq uint64) ([]*core.Batch, error)

func ReadReceipt

func ReadReceipt(db *sql.DB, hash common.L2TxHash, config *params.ChainConfig) (*types.Receipt, error)

func ReadReceiptsByBatchHash

func ReadReceiptsByBatchHash(db *sql.DB, hash common.L2BatchHash, config *params.ChainConfig) (types.Receipts, error)

ReadReceiptsByBatchHash retrieves all the transaction receipts belonging to a block, including its corresponding metadata fields. If it is unable to populate these metadata fields then nil is returned.

The current implementation populates these metadata fields by reading the receipts' corresponding block body, so if the block body is not found it will return nil even if the receipt itself is stored.

func ReadTransaction

func ReadTransaction(db *sql.DB, txHash gethcommon.Hash) (*types.Transaction, gethcommon.Hash, uint64, uint64, error)

func ReadUnexecutedBatches

func ReadUnexecutedBatches(db *sql.DB, from *big.Int) ([]*core.Batch, error)

func StoreEventLogs

func StoreEventLogs(dbtx DBTransaction, receipts []*types.Receipt, stateDB *state.StateDB) error

func UpdateCanonicalBlocks

func UpdateCanonicalBlocks(dbtx DBTransaction, canonical []common.L1BlockHash, nonCanonical []common.L1BlockHash)

func UpdateConfig

func UpdateConfig(db *sql.DB, key string, value []byte) (sql.Result, error)

func UpdateConfigToBatch

func UpdateConfigToBatch(dbtx DBTransaction, key string, value []byte)

func WriteAttKey

func WriteAttKey(db *sql.DB, party common.Address, key []byte) (sql.Result, error)

func WriteBatchAndTransactions

func WriteBatchAndTransactions(dbtx DBTransaction, batch *core.Batch) error

WriteBatchAndTransactions - persists the batch and the transactions

func WriteBatchExecution

func WriteBatchExecution(dbtx DBTransaction, seqNo *big.Int, receipts []*types.Receipt) error

WriteBatchExecution - insert all receipts to the db

func WriteBlock

func WriteBlock(dbtx DBTransaction, b *types.Header) error

func WriteConfig

func WriteConfig(db *sql.DB, key string, value []byte) (sql.Result, error)

func WriteConfigToBatch

func WriteConfigToBatch(dbtx DBTransaction, key string, value any)

func WriteConfigToTx

func WriteConfigToTx(dbtx *sql.Tx, key string, value any) (sql.Result, error)

func WriteL1Messages

func WriteL1Messages[T any](db *sql.DB, blockHash common.L1BlockHash, messages []T, isValueTransfer bool) error

func WriteRollup

func WriteRollup(dbtx DBTransaction, rollup *common.RollupHeader, internalHeader *common.CalldataRollupHeader) error

Types

type DBTransaction

type DBTransaction interface {
	ethdb.Batch
	GetDB() *sql.DB
	ExecuteSQL(query string, args ...any)
}

DBTransaction - represents a database transaction implemented unusually. Typically, databases have a "beginTransaction" command which is also exposed by the db drivers, and then the applications just sends commands on that connection. There are rules as to what data is returned when running selects. This implementation works by collecting all statements, and then writing them and committing in one go todo - does it need to be an ethdb.Batch? todo - can we use the typical

type EnclaveDB

type EnclaveDB interface {
	ethdb.Database
	GetSQLDB() *sql.DB
	NewDBTransaction() *dbTransaction
	BeginTx() (*sql.Tx, error)
}

EnclaveDB - An abstraction that implements the `ethdb.Database` on top of SQL, and also exposes underling sql primitives. Note: This might not be the best approach. Todo - consider a few design alternatives: The EnclaveDB - can be a factory that returns an Sql implementation of the ethdb.Database

func NewEnclaveDB

func NewEnclaveDB(db *sql.DB, logger gethlog.Logger) (EnclaveDB, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL