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

+3-3
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

+6-6
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

+10-25
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)