Implement getAccessList of db/ledger (#2055)

This commit is contained in:
andri lim 2024-02-29 18:16:47 +07:00 committed by GitHub
parent 66c0f92cc6
commit 7722a907dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 53 additions and 6 deletions

View File

@ -1,5 +1,5 @@
# Nimbus
# Copyright (c) 2023 Status Research & Development GmbH
# Copyright (c) 2023-2024 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)
@ -9,7 +9,7 @@
# according to those terms.
import
tables, sets,
std/[tables, sets],
stint,
eth/common
@ -19,12 +19,28 @@ type
AccessList* = object
slots: Table[EthAddress, SlotSet]
# ------------------------------------------------------------------------------
# Private helpers
# ------------------------------------------------------------------------------
func toStorageKeys(slots: SlotSet): seq[StorageKey] =
for slot in slots:
result.add slot.toBytesBE
# ------------------------------------------------------------------------------
# Public constructors
# ------------------------------------------------------------------------------
proc init*(ac: var AccessList) =
ac.slots = initTable[EthAddress, SlotSet]()
proc init*(_: type AccessList): AccessList {.inline.} =
result.init()
# ------------------------------------------------------------------------------
# Public functions
# ------------------------------------------------------------------------------
func contains*(ac: AccessList, address: EthAddress): bool {.inline.} =
address in ac.slots
@ -52,3 +68,10 @@ proc add*(ac: var AccessList, address: EthAddress, slot: UInt256) =
proc clear*(ac: var AccessList) {.inline.} =
ac.slots.clear()
func getAccessList*(ac: AccessList): common.AccessList =
for address, slots in ac.slots:
result.add common.AccessPair(
address : address,
storageKeys: slots.toStorageKeys,
)

View File

@ -734,6 +734,11 @@ proc clearTransientStorage*(ac: AccountsCache) {.inline.} =
doAssert(ac.savePoint.parentSavepoint.isNil)
ac.savePoint.transientStorage.clear()
func getAccessList*(ac: AccountsCache): common.AccessList =
# make sure all savepoint already committed
doAssert(ac.savePoint.parentSavepoint.isNil)
ac.savePoint.accessList.getAccessList()
proc rootHash*(db: ReadOnlyStateDB): KeccakHash {.borrow.}
proc getCodeHash*(db: ReadOnlyStateDB, address: EthAddress): Hash256 {.borrow.}
proc getStorageRoot*(db: ReadOnlyStateDB, address: EthAddress): Hash256 {.borrow.}

View File

@ -769,6 +769,11 @@ proc clearTransientStorage*(ac: AccountsLedgerRef) =
doAssert(ac.savePoint.parentSavepoint.isNil)
ac.savePoint.transientStorage.clear()
func getAccessList*(ac: AccountsLedgerRef): common.AccessList =
# make sure all savepoint already committed
doAssert(ac.savePoint.parentSavepoint.isNil)
ac.savePoint.accessList.getAccessList()
proc rootHash*(db: ReadOnlyStateDB): KeccakHash {.borrow.}
proc getCodeHash*(db: ReadOnlyStateDB, address: EthAddress): Hash256 {.borrow.}
proc getStorageRoot*(db: ReadOnlyStateDB, address: EthAddress): Hash256 {.borrow.}

View File

@ -176,7 +176,10 @@ proc ledgerMethods(lc: impl.AccountsCache): LedgerFns =
lc.setTransientStorage(eAddr, slot, val),
subBalanceFn: proc(eAddr: EthAddress, delta: UInt256) =
lc.subBalance(eAddr, delta))
lc.subBalance(eAddr, delta),
getAccessListFn: proc(): common.AccessList =
lc.getAccessList())
proc ledgerExtras(lc: impl.AccountsCache): LedgerExtras =
LedgerExtras(

View File

@ -163,7 +163,10 @@ proc ledgerMethods(lc: impl.AccountsLedgerRef): LedgerFns =
lc.setTransientStorage(eAddr, slot, val),
subBalanceFn: proc(eAddr: EthAddress, delta: UInt256) =
lc.subBalance(eAddr, delta))
lc.subBalance(eAddr, delta),
getAccessListFn: proc(): common.AccessList =
lc.getAccessList())
proc ledgerExtras(lc: impl.AccountsLedgerRef): LedgerExtras =
LedgerExtras(

View File

@ -346,6 +346,11 @@ proc subBalance*(ldg: LedgerRef, eAddr: EthAddress, delta: UInt256) =
ldg.methods.subBalanceFn(eAddr, delta)
ldg.ifTrackApi: debug apiTxt, ctx, elapsed, eAddr, delta
proc getAccessList*(ldg: LedgerRef): AccessList =
ldg.beginTrackApi LdgGetAccessListFn
result = ldg.methods.getAccessListFn()
ldg.ifTrackApi: debug apiTxt, ctx, elapsed
# ------------------------------------------------------------------------------
# Public methods, extensions to go away
# ------------------------------------------------------------------------------

View File

@ -68,6 +68,7 @@ type
LdgSubBalanceFn = "subBalance"
LdgGetMptFn = "getMpt"
LdgRawRootHashFn = "rawRootHash"
LdgGetAccessListFn = "getAcessList"
LdgAccountsIt = "accounts"
LdgAdressesIt = "addresses"

View File

@ -89,6 +89,7 @@ type
SetTransientStorageFn* =
proc(eAddr: EthAddress, slot, val: UInt256) {.noRaise.}
SubBalanceFn* = proc(eAddr: EthAddress, delta: UInt256) {.noRaise.}
GetAccessListFn* = proc(): AccessList {.noRaise.}
LedgerFns* = object
accessListFn*: AccessListFn
@ -136,5 +137,6 @@ type
setStorageFn*: SetStorageFn
setTransientStorageFn*: SetTransientStorageFn
subBalanceFn*: SubBalanceFn
getAccessListFn*: GetAccessListFn
# End