nimbus-eth1/nimbus/db/ledger.nim

140 lines
3.7 KiB
Nim

# Nimbus
# Copyright (c) 2018 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
# http://www.apache.org/licenses/LICENSE-2.0)
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
# http://opensource.org/licenses/MIT)
# at your option. This file may not be copied, modified, or distributed
# except according to those terms.
## Unifies different ledger management APIs. All ledger objects are
## derived from the base objects
## ::
## LedgerRef => AccountsCache, overloaded AccountsCache, etc.
## LedgerSpRef => SavePoint, overloaded SavePoint etc
##
## In order to directly use `AccountsCache` it must be imported via
## `import db/ledger/accounts_cache`. In this case, there is no `LedgerRef`.
##
{.push raises: [].}
import
eth/common,
./core_db,
./ledger/base,
./ledger/backend/[
accounts_cache, accounts_cache_desc, accounts_ledger, accounts_ledger_desc]
export
AccountsCache,
AccountsLedgerRef,
LedgerType,
base,
init
# ------------------------------------------------------------------------------
# Public constructor
# ------------------------------------------------------------------------------
proc init*(
ldgType: LedgerType;
db: CoreDbRef;
root: Hash256;
pruneTrie: bool;
): LedgerRef =
case ldgType:
of LegacyAccountsCache:
result = AccountsCache.init(db, root, pruneTrie)
of LedgerCache:
result = AccountsLedgerRef.init(db, root, pruneTrie)
else:
raiseAssert: "Missing ledger type label"
# ------------------------------------------------------------------------------
# Public iterators
# ------------------------------------------------------------------------------
# Note that there should be non-closure iterators here, at least for
# `storage()`. With closures and the `accounts_cache.nim` driver as-is, all
# unit tests and no-hive work OK apart from `TracerTests` which fails at block
# 49018 due to mis-running of `storage()`.
iterator accounts*(ldg: LedgerRef): Account =
case ldg.ldgType:
of LegacyAccountsCache:
for w in ldg.AccountsCache.accountsIt():
yield w
of LedgerCache:
for w in ldg.AccountsLedgerRef.accountsIt():
yield w
else:
raiseAssert: "Missing ledger type label"
iterator addresses*(ldg: LedgerRef): EthAddress =
case ldg.ldgType:
of LegacyAccountsCache:
for w in ldg.AccountsCache.addressesIt():
yield w
of LedgerCache:
for w in ldg.AccountsLedgerRef.addressesIt():
yield w
else:
raiseAssert: "Missing ledger type label"
iterator cachedStorage*(ldg: LedgerRef, eAddr: EthAddress): (UInt256,UInt256) =
case ldg.ldgType:
of LegacyAccountsCache:
for w in ldg.AccountsCache.cachedStorageIt(eAddr):
yield w
of LedgerCache:
for w in ldg.AccountsLedgerRef.cachedStorageIt(eAddr):
yield w
else:
raiseAssert: "Missing ledger type label"
iterator pairs*(ldg: LedgerRef): (EthAddress,Account) =
case ldg.ldgType:
of LegacyAccountsCache:
for w in ldg.AccountsCache.pairsIt():
yield w
of LedgerCache:
for w in ldg.AccountsLedgerRef.pairsIt():
yield w
else:
raiseAssert: "Missing ledger type label"
iterator storage*(
ldg: LedgerRef;
eAddr: EthAddress;
): (UInt256,UInt256)
{.gcsafe, raises: [CoreDbApiError].} =
case ldg.ldgType:
of LegacyAccountsCache:
for w in ldg.AccountsCache.storageIt(eAddr):
yield w
of LedgerCache:
for w in ldg.AccountsLedgerRef.storageIt(eAddr):
yield w
else:
raiseAssert: "Missing ledger type label"
# ------------------------------------------------------------------------------
# End
# ------------------------------------------------------------------------------