Skip to content

Commit 2d8b750

Browse files
authored
Stateless: Correctly order keys when building witness (#3487)
1 parent 4b31924 commit 2d8b750

File tree

2 files changed

+47
-34
lines changed

2 files changed

+47
-34
lines changed

execution_chain/stateless/witness_generation.nim

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,7 @@ proc build*(
3030
addedCodeHashes = initHashSet[Hash32]()
3131

3232
for key, codeTouched in witnessKeys:
33-
let (_, maybeSlot) = key
34-
if maybeSlot.isSome():
35-
let slot = maybeSlot.get()
36-
witness.addKey(slot.toBytesBE())
37-
38-
let proofs = ledger.getStorageProof(key.address, @[slot])
39-
doAssert(proofs.len() == 1)
40-
for trieNode in proofs[0]:
41-
let nodeHash = keccak256(trieNode)
42-
if nodeHash notin addedStateHashes:
43-
witness.addState(trieNode)
44-
addedStateHashes.incl(nodeHash)
45-
else:
33+
if key.slot.isNone(): # Is an account key
4634
witness.addKey(key.address.data())
4735

4836
let proof = ledger.getAccountProof(key.address)
@@ -52,10 +40,24 @@ proc build*(
5240
witness.addState(trieNode)
5341
addedStateHashes.incl(nodeHash)
5442

55-
if codeTouched:
56-
let codeHash = ledger.getCodeHash(key.address)
57-
if codeHash != EMPTY_CODE_HASH and codeHash notin addedCodeHashes:
58-
witness.addCodeHash(codeHash)
59-
addedCodeHashes.incl(codeHash)
43+
if codeTouched:
44+
let codeHash = ledger.getCodeHash(key.address)
45+
if codeHash != EMPTY_CODE_HASH and codeHash notin addedCodeHashes:
46+
witness.addCodeHash(codeHash)
47+
addedCodeHashes.incl(codeHash)
48+
49+
# Add the storage slots for this account
50+
for key2, codeTouched2 in witnessKeys:
51+
if key2.address == key.address and key2.slot.isSome():
52+
let slot = key2.slot.get()
53+
witness.addKey(slot.toBytesBE())
54+
55+
let proofs = ledger.getStorageProof(key.address, @[slot])
56+
doAssert(proofs.len() == 1)
57+
for trieNode in proofs[0]:
58+
let nodeHash = keccak256(trieNode)
59+
if nodeHash notin addedStateHashes:
60+
witness.addState(trieNode)
61+
addedStateHashes.incl(nodeHash)
6062

6163
witness

tests/test_stateless_witness_generation.nim

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,21 @@ suite "Stateless: Witness Generation":
2424
ledger = LedgerRef.init(memDB.baseTxFrame(), false, collectWitness = true)
2525
code = hexToSeqByte("0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6")
2626
addr1 = address"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
27+
addr2 = address"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec7"
2728
slot1 = 1.u256
2829
slot2 = 2.u256
2930
slot3 = 3.u256
3031

31-
test "Get account":
3232
ledger.setBalance(addr1, 10.u256)
33+
ledger.setCode(addr1, code)
34+
ledger.setBalance(addr2, 20.u256)
35+
ledger.setStorage(addr1, slot1, 100.u256)
36+
ledger.setStorage(addr1, slot2, 200.u256)
37+
ledger.setStorage(addr1, slot3, 300.u256)
3338
ledger.persist(clearWitness = true)
3439

40+
41+
test "Get account":
3542
discard ledger.getBalance(addr1)
3643

3744
let witnessKeys = ledger.getWitnessKeys()
@@ -46,9 +53,6 @@ suite "Stateless: Witness Generation":
4653
witnessKeys.contains((Address.copyFrom(witness.keys[0]), Opt.none(UInt256)))
4754

4855
test "Get code":
49-
ledger.setCode(addr1, code)
50-
ledger.persist(clearWitness = true)
51-
5256
discard ledger.getCode(addr1)
5357

5458
let witnessKeys = ledger.getWitnessKeys()
@@ -79,9 +83,6 @@ suite "Stateless: Witness Generation":
7983
witnessKeys.contains((Address.copyFrom(witness.keys[0]), Opt.some(slot1)))
8084

8185
test "Get storage":
82-
ledger.setStorage(addr1, slot1, 20.u256)
83-
ledger.persist(clearWitness = true)
84-
8586
discard ledger.getStorage(addr1, slot1)
8687

8788
let witnessKeys = ledger.getWitnessKeys()
@@ -97,9 +98,6 @@ suite "Stateless: Witness Generation":
9798
witnessKeys.contains((Address.copyFrom(witness.keys[0]), Opt.some(slot1)))
9899

99100
test "Get committed storage":
100-
ledger.setStorage(addr1, slot1, 20.u256)
101-
ledger.persist(clearWitness = true)
102-
103101
discard ledger.getCommittedStorage(addr1, slot1)
104102

105103
let witnessKeys = ledger.getWitnessKeys()
@@ -115,12 +113,6 @@ suite "Stateless: Witness Generation":
115113
witnessKeys.contains((Address.copyFrom(witness.keys[0]), Opt.some(slot1)))
116114

117115
test "Get code and storage slots":
118-
ledger.setCode(addr1, code)
119-
ledger.setStorage(addr1, slot1, 100.u256)
120-
ledger.setStorage(addr1, slot2, 200.u256)
121-
ledger.setStorage(addr1, slot3, 300.u256)
122-
ledger.persist(clearWitness = true)
123-
124116
discard ledger.getCode(addr1)
125117
discard ledger.getStorage(addr1, slot1)
126118
discard ledger.getStorage(addr1, slot2)
@@ -139,3 +131,22 @@ suite "Stateless: Witness Generation":
139131
witnessKeys.contains((Address.copyFrom(witness.keys[0]), Opt.some(slot1)))
140132
witnessKeys.contains((Address.copyFrom(witness.keys[0]), Opt.some(slot2)))
141133
witnessKeys.contains((Address.copyFrom(witness.keys[0]), Opt.some(slot3)))
134+
135+
test "Order of keys":
136+
var witnessKeys: WitnessTable
137+
witnessKeys[(addr1, Opt.none(UInt256))] = true
138+
witnessKeys[(addr1, Opt.some(slot1))] = false
139+
witnessKeys[(addr2, Opt.none(UInt256))] = false
140+
witnessKeys[(addr1, Opt.some(slot2))] = false
141+
witnessKeys[(addr1, Opt.some(slot3))] = false
142+
check witnessKeys.len() == 5
143+
144+
let witness = Witness.build(witnessKeys, ledger.ReadOnlyLedger)
145+
146+
check:
147+
witness.keys.len() == 5
148+
witness.keys[0] == addr1.data()
149+
witness.keys[1] == slot1.toBytesBE()
150+
witness.keys[2] == slot2.toBytesBE()
151+
witness.keys[3] == slot3.toBytesBE()
152+
witness.keys[4] == addr2.data()

0 commit comments

Comments
 (0)