Skip to content

Commit df645e7

Browse files
gballetfjl
andauthored
trie: use go-verkle helper for speedier (*VerkleTrie).RollBackAccount (#30242)
This is a performance improvement on the account-creation rollback code required for the archive node to support verkle. It uses the utility function `DeleteAtStem` to remove code and account data per-group instead of doing it leaf by leaf. It also fixes an index bug, as code is chunked in 31-byte chunks, so comparing with the code size should use 31 as its stride. --------- Co-authored-by: Felix Lange <[email protected]>
1 parent 2a534ee commit df645e7

File tree

3 files changed

+19
-34
lines changed

3 files changed

+19
-34
lines changed

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ require (
2424
github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0
2525
github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3
2626
github.com/ethereum/c-kzg-4844 v1.0.0
27-
github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0
27+
github.com/ethereum/go-verkle v0.1.1-0.20240726143912-7dc5142667fa
2828
github.com/fatih/color v1.16.0
2929
github.com/ferranbt/fastssz v0.1.2
3030
github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e
@@ -69,7 +69,7 @@ require (
6969
golang.org/x/crypto v0.22.0
7070
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
7171
golang.org/x/sync v0.7.0
72-
golang.org/x/sys v0.20.0
72+
golang.org/x/sys v0.22.0
7373
golang.org/x/text v0.14.0
7474
golang.org/x/time v0.5.0
7575
golang.org/x/tools v0.20.0
@@ -93,7 +93,7 @@ require (
9393
github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect
9494
github.com/aws/smithy-go v1.15.0 // indirect
9595
github.com/beorn7/perks v1.0.1 // indirect
96-
github.com/bits-and-blooms/bitset v1.10.0 // indirect
96+
github.com/bits-and-blooms/bitset v1.13.0 // indirect
9797
github.com/cespare/xxhash/v2 v2.3.0 // indirect
9898
github.com/cockroachdb/errors v1.11.3 // indirect
9999
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
9090
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
9191
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
9292
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
93-
github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88=
94-
github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
93+
github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE=
94+
github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
9595
github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
9696
github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
9797
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
@@ -170,8 +170,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
170170
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
171171
github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
172172
github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
173-
github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4=
174-
github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w=
173+
github.com/ethereum/go-verkle v0.1.1-0.20240726143912-7dc5142667fa h1:mXkPoR07WlPVAClNzWuGAQNqmhxLqQILXhm73J5d9Ew=
174+
github.com/ethereum/go-verkle v0.1.1-0.20240726143912-7dc5142667fa/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w=
175175
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
176176
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
177177
github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk=
@@ -689,8 +689,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
689689
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
690690
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
691691
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
692-
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
693-
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
692+
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
693+
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
694694
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
695695
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
696696
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=

trie/verkle.go

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -216,35 +216,20 @@ func (t *VerkleTrie) RollBackAccount(addr common.Address) error {
216216
codeSize := binary.LittleEndian.Uint64(codeSizeBytes)
217217

218218
// Delete the account header + first 64 slots + first 128 code chunks
219-
key := common.CopyBytes(codeSizeKey)
220-
for i := 0; i < verkle.NodeWidth; i++ {
221-
key[31] = byte(i)
222-
223-
// this is a workaround to avoid deleting nil leaves, the lib needs to be
224-
// fixed to be able to handle that
225-
v, err := t.root.Get(key, t.nodeResolver)
226-
if err != nil {
227-
return fmt.Errorf("error rolling back account header: %w", err)
228-
}
229-
if len(v) == 0 {
230-
continue
231-
}
232-
_, err = t.root.Delete(key, t.nodeResolver)
233-
if err != nil {
234-
return fmt.Errorf("error rolling back account header: %w", err)
235-
}
219+
_, err = t.root.(*verkle.InternalNode).DeleteAtStem(codeSizeKey[:31], t.nodeResolver)
220+
if err != nil {
221+
return fmt.Errorf("error rolling back account header: %w", err)
236222
}
223+
237224
// Delete all further code
238-
for i, chunknr := uint64(32*128), uint64(128); i < codeSize; i, chunknr = i+32, chunknr+1 {
225+
for i, chunknr := uint64(31*128), uint64(128); i < codeSize; i, chunknr = i+31*256, chunknr+256 {
239226
// evaluate group key at the start of a new group
240-
groupOffset := (chunknr + 128) % 256
241-
if groupOffset == 0 {
242-
key = utils.CodeChunkKeyWithEvaluatedAddress(evaluatedAddr, uint256.NewInt(chunknr))
243-
}
244-
key[31] = byte(groupOffset)
245-
_, err = t.root.Delete(key[:], t.nodeResolver)
227+
offset := uint256.NewInt(chunknr)
228+
key := utils.CodeChunkKeyWithEvaluatedAddress(evaluatedAddr, offset)
229+
230+
_, err = t.root.(*verkle.InternalNode).DeleteAtStem(key[:], t.nodeResolver)
246231
if err != nil {
247-
return fmt.Errorf("error deleting code chunk (addr=%x) error: %w", addr[:], err)
232+
return fmt.Errorf("error deleting code chunk stem (addr=%x, offset=%d) error: %w", addr[:], offset, err)
248233
}
249234
}
250235
return nil

0 commit comments

Comments
 (0)