@@ -48,6 +48,8 @@ when statelessEnabled:
48
48
codeTouched* : bool
49
49
storageSlot* : UInt256
50
50
51
+ WitnessTable * = OrderedTable [(Address , Hash32 ), WitnessKey ]
52
+
51
53
type
52
54
AccountFlag = enum
53
55
Alive
94
96
# # write amplification that ensues
95
97
96
98
when statelessEnabled:
97
- witnessKeys: OrderedTable [( Address , Hash32 ), WitnessKey ]
99
+ witnessKeys: WitnessTable
98
100
# # Used to collect the keys of all read accounts, code and storage slots.
99
101
# # Maps a tuple of address and hash of the key (address or slot) to the
100
102
# # witness key which can be either a storage key or an account key
@@ -175,7 +177,8 @@ proc getAccount(
175
177
if not ac.witnessKeys.contains (lookupKey):
176
178
ac.witnessKeys[lookupKey] = WitnessKey (
177
179
storageMode: false ,
178
- address: address)
180
+ address: address,
181
+ codeTouched: false )
179
182
180
183
# search account from layers of cache
181
184
var sp = ac.savePoint
@@ -239,7 +242,6 @@ proc originalStorageValue(
239
242
slot: UInt256 ;
240
243
ac: LedgerRef ;
241
244
): UInt256 =
242
-
243
245
# share the same original storage between multiple
244
246
# versions of account
245
247
if acc.originalStorage.isNil:
@@ -385,9 +387,6 @@ proc init*(x: typedesc[LedgerRef], db: CoreDbTxRef, storeSlotHash: bool): Ledger
385
387
result .slots = typeof (result .slots).init (slotsLruSize)
386
388
discard result .beginSavepoint
387
389
388
- when statelessEnabled:
389
- result .witnessKeys = initOrderedTable [(Address , Hash32 ), WitnessKey ]()
390
-
391
390
proc init * (x: typedesc [LedgerRef ], db: CoreDbTxRef ): LedgerRef =
392
391
init (x, db, false )
393
392
@@ -538,27 +537,29 @@ proc resolveCode*(ac: LedgerRef, address: Address): CodeBytesRef =
538
537
ac.getCode (delegateTo)
539
538
540
539
proc getCommittedStorage * (ac: LedgerRef , address: Address , slot: UInt256 ): UInt256 =
540
+ let acc = ac.getAccount (address, false )
541
+
541
542
when statelessEnabled:
542
543
let lookupKey = (address, slot.toSlotKey)
543
544
if not ac.witnessKeys.contains (lookupKey):
544
545
ac.witnessKeys[lookupKey] = WitnessKey (
545
546
storageMode: true ,
546
547
storageSlot: slot)
547
548
548
- let acc = ac.getAccount (address, false )
549
549
if acc.isNil:
550
550
return
551
551
acc.originalStorageValue (slot, ac)
552
552
553
553
proc getStorage * (ac: LedgerRef , address: Address , slot: UInt256 ): UInt256 =
554
+ let acc = ac.getAccount (address, false )
555
+
554
556
when statelessEnabled:
555
557
let lookupKey = (address, slot.toSlotKey)
556
558
if not ac.witnessKeys.contains (lookupKey):
557
559
ac.witnessKeys[lookupKey] = WitnessKey (
558
560
storageMode: true ,
559
561
storageSlot: slot)
560
562
561
- let acc = ac.getAccount (address, false )
562
563
if acc.isNil:
563
564
return
564
565
acc.storageValue (slot, ac)
@@ -640,6 +641,14 @@ proc setCode*(ac: LedgerRef, address: Address, code: seq[byte]) =
640
641
proc setStorage * (ac: LedgerRef , address: Address , slot, value: UInt256 ) =
641
642
let acc = ac.getAccount (address)
642
643
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
+
643
652
let oldValue = acc.storageValue (slot, ac)
644
653
if oldValue != value:
645
654
var acc = ac.makeDirty (address)
@@ -777,9 +786,6 @@ proc persist*(ac: LedgerRef,
777
786
778
787
ac.isDirty = false
779
788
780
- when statelessEnabled:
781
- ac.witnessKeys.clear ()
782
-
783
789
iterator addresses * (ac: LedgerRef ): Address =
784
790
# make sure all savepoint already committed
785
791
doAssert (ac.savePoint.parentSavepoint.isNil)
@@ -920,9 +926,12 @@ proc getStorageProof*(ac: LedgerRef, address: Address, slots: openArray[UInt256]
920
926
storageProof
921
927
922
928
when statelessEnabled:
923
- func getWitnessKeys * (ac: LedgerRef ): OrderedTable [( Address , Hash32 ), WitnessKey ] =
929
+ func getWitnessKeys * (ac: LedgerRef ): WitnessTable =
924
930
ac.witnessKeys
925
931
932
+ proc clearWitnessKeys * (ac: LedgerRef ) =
933
+ ac.witnessKeys.clear ()
934
+
926
935
# ------------------------------------------------------------------------------
927
936
# Public virtual read-only methods
928
937
# ------------------------------------------------------------------------------
0 commit comments