Skip to content

Commit 705c1f2

Browse files
committed
Merge branch 'improve-witness-keys-collection' into fluffy-evm
2 parents c78a876 + a0cd8f2 commit 705c1f2

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

execution_chain/db/ledger.nim

+21-12
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ when statelessEnabled:
4848
codeTouched*: bool
4949
storageSlot*: UInt256
5050

51+
WitnessTable* = OrderedTable[(Address, Hash32), WitnessKey]
52+
5153
type
5254
AccountFlag = enum
5355
Alive
@@ -94,7 +96,7 @@ type
9496
## write amplification that ensues
9597

9698
when statelessEnabled:
97-
witnessKeys: OrderedTable[(Address, Hash32), WitnessKey]
99+
witnessKeys: WitnessTable
98100
## Used to collect the keys of all read accounts, code and storage slots.
99101
## Maps a tuple of address and hash of the key (address or slot) to the
100102
## witness key which can be either a storage key or an account key
@@ -175,7 +177,8 @@ proc getAccount(
175177
if not ac.witnessKeys.contains(lookupKey):
176178
ac.witnessKeys[lookupKey] = WitnessKey(
177179
storageMode: false,
178-
address: address)
180+
address: address,
181+
codeTouched: false)
179182

180183
# search account from layers of cache
181184
var sp = ac.savePoint
@@ -239,7 +242,6 @@ proc originalStorageValue(
239242
slot: UInt256;
240243
ac: LedgerRef;
241244
): UInt256 =
242-
243245
# share the same original storage between multiple
244246
# versions of account
245247
if acc.originalStorage.isNil:
@@ -385,9 +387,6 @@ proc init*(x: typedesc[LedgerRef], db: CoreDbTxRef, storeSlotHash: bool): Ledger
385387
result.slots = typeof(result.slots).init(slotsLruSize)
386388
discard result.beginSavepoint
387389

388-
when statelessEnabled:
389-
result.witnessKeys = initOrderedTable[(Address, Hash32), WitnessKey]()
390-
391390
proc init*(x: typedesc[LedgerRef], db: CoreDbTxRef): LedgerRef =
392391
init(x, db, false)
393392

@@ -538,27 +537,29 @@ proc resolveCode*(ac: LedgerRef, address: Address): CodeBytesRef =
538537
ac.getCode(delegateTo)
539538

540539
proc getCommittedStorage*(ac: LedgerRef, address: Address, slot: UInt256): UInt256 =
540+
let acc = ac.getAccount(address, false)
541+
541542
when statelessEnabled:
542543
let lookupKey = (address, slot.toSlotKey)
543544
if not ac.witnessKeys.contains(lookupKey):
544545
ac.witnessKeys[lookupKey] = WitnessKey(
545546
storageMode: true,
546547
storageSlot: slot)
547548

548-
let acc = ac.getAccount(address, false)
549549
if acc.isNil:
550550
return
551551
acc.originalStorageValue(slot, ac)
552552

553553
proc getStorage*(ac: LedgerRef, address: Address, slot: UInt256): UInt256 =
554+
let acc = ac.getAccount(address, false)
555+
554556
when statelessEnabled:
555557
let lookupKey = (address, slot.toSlotKey)
556558
if not ac.witnessKeys.contains(lookupKey):
557559
ac.witnessKeys[lookupKey] = WitnessKey(
558560
storageMode: true,
559561
storageSlot: slot)
560562

561-
let acc = ac.getAccount(address, false)
562563
if acc.isNil:
563564
return
564565
acc.storageValue(slot, ac)
@@ -640,6 +641,14 @@ proc setCode*(ac: LedgerRef, address: Address, code: seq[byte]) =
640641
proc setStorage*(ac: LedgerRef, address: Address, slot, value: UInt256) =
641642
let acc = ac.getAccount(address)
642643
acc.flags.incl {Alive}
644+
645+
when statelessEnabled:
646+
let lookupKey = (address, slot.toSlotKey)
647+
if not ac.witnessKeys.contains(lookupKey):
648+
ac.witnessKeys[lookupKey] = WitnessKey(
649+
storageMode: true,
650+
storageSlot: slot)
651+
643652
let oldValue = acc.storageValue(slot, ac)
644653
if oldValue != value:
645654
var acc = ac.makeDirty(address)
@@ -777,9 +786,6 @@ proc persist*(ac: LedgerRef,
777786

778787
ac.isDirty = false
779788

780-
when statelessEnabled:
781-
ac.witnessKeys.clear()
782-
783789
iterator addresses*(ac: LedgerRef): Address =
784790
# make sure all savepoint already committed
785791
doAssert(ac.savePoint.parentSavepoint.isNil)
@@ -920,9 +926,12 @@ proc getStorageProof*(ac: LedgerRef, address: Address, slots: openArray[UInt256]
920926
storageProof
921927

922928
when statelessEnabled:
923-
func getWitnessKeys*(ac: LedgerRef): OrderedTable[(Address, Hash32), WitnessKey] =
929+
func getWitnessKeys*(ac: LedgerRef): WitnessTable =
924930
ac.witnessKeys
925931

932+
proc clearWitnessKeys*(ac: LedgerRef) =
933+
ac.witnessKeys.clear()
934+
926935
# ------------------------------------------------------------------------------
927936
# Public virtual read-only methods
928937
# ------------------------------------------------------------------------------

0 commit comments

Comments
 (0)