Skip to content

Commit f5efecc

Browse files
authored
test(ethhash): Use libevm (#900)
1 parent 289d442 commit f5efecc

File tree

3 files changed

+789
-76
lines changed

3 files changed

+789
-76
lines changed

ffi/tests/eth_compatibility_test.go

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import (
77
"slices"
88
"testing"
99

10-
firewood "github.com/ava-labs/firewood/ffi/v2"
11-
"github.com/ethereum/go-ethereum/common"
12-
"github.com/ethereum/go-ethereum/core/rawdb"
13-
"github.com/ethereum/go-ethereum/core/state"
14-
"github.com/ethereum/go-ethereum/core/types"
15-
"github.com/ethereum/go-ethereum/crypto"
16-
"github.com/ethereum/go-ethereum/rlp"
17-
"github.com/ethereum/go-ethereum/trie/trienode"
18-
"github.com/ethereum/go-ethereum/triedb"
10+
firewood "github.com/ava-labs/firewood-go/ffi"
11+
"github.com/ava-labs/libevm/common"
12+
"github.com/ava-labs/libevm/core/rawdb"
13+
"github.com/ava-labs/libevm/core/state"
14+
"github.com/ava-labs/libevm/core/types"
15+
"github.com/ava-labs/libevm/crypto"
16+
"github.com/ava-labs/libevm/rlp"
17+
"github.com/ava-labs/libevm/trie/trienode"
18+
"github.com/ava-labs/libevm/triedb"
1919
"github.com/holiman/uint256"
2020
"github.com/stretchr/testify/require"
2121
)
@@ -43,11 +43,11 @@ func TestInsert(t *testing.T) {
4343
storages := make([]storageKey, 0)
4444

4545
chooseAddr := func() common.Address {
46-
return addrs[rand.Intn(len(addrs))]
46+
return addrs[rand.Intn(len(addrs))] //nolint:gosec
4747
}
4848

4949
chooseStorage := func() storageKey {
50-
return storages[rand.Intn(len(storages))]
50+
return storages[rand.Intn(len(storages))] //nolint:gosec
5151
}
5252

5353
deleteStorage := func(k storageKey) {
@@ -66,10 +66,10 @@ func TestInsert(t *testing.T) {
6666
}
6767

6868
memdb := rawdb.NewMemoryDatabase()
69-
tdb := state.NewDatabase(triedb.NewDatabase(memdb, triedb.HashDefaults), nil)
69+
tdb := state.NewDatabaseWithConfig(memdb, triedb.HashDefaults)
7070
ethRoot := types.EmptyRootHash
7171

72-
for i := range 10_000 {
72+
for i := range uint64(10_000) {
7373
tr, err := tdb.OpenTrie(ethRoot)
7474
require.NoError(t, err)
7575
mergeSet := trienode.NewMergedNodeSet()
@@ -102,18 +102,24 @@ func TestInsert(t *testing.T) {
102102
require.NoError(t, err)
103103
deleteStorage(storageKey)
104104

105-
strRoot, set := str.Commit(false)
105+
strRoot, set, err := str.Commit(false)
106+
require.NoError(t, err)
106107
err = mergeSet.Merge(set)
107108
require.NoError(t, err)
108109
acc.Root = strRoot
109-
err = tr.UpdateAccount(storageKey.addr, acc, 0)
110+
err = tr.UpdateAccount(storageKey.addr, acc)
110111
require.NoError(t, err)
111112

112113
fwKeys = append(fwKeys, append(accHash[:], keyHash[:]...))
113114
fwVals = append(fwVals, []byte{})
114115

116+
// We must also update the account (not for hash, but to be accurate)
117+
fwKeys = append(fwKeys, accHash[:])
118+
encodedVal, err := rlp.EncodeToBytes(acc)
119+
require.NoError(t, err)
120+
fwVals = append(fwVals, encodedVal)
115121
case i%4 == 0: // add acc
116-
addr := common.BytesToAddress(hashData(binary.BigEndian.AppendUint64(nil, uint64(i))).Bytes())
122+
addr := common.BytesToAddress(hashData(binary.BigEndian.AppendUint64(nil, i)).Bytes())
117123
accHash := hashData(addr[:])
118124
acc := &types.StateAccount{
119125
Nonce: 1,
@@ -124,7 +130,7 @@ func TestInsert(t *testing.T) {
124130
enc, err := rlp.EncodeToBytes(acc)
125131
require.NoError(t, err)
126132

127-
err = tr.UpdateAccount(addr, acc, 0)
133+
err = tr.UpdateAccount(addr, acc)
128134
require.NoError(t, err)
129135
addrs = append(addrs, addr)
130136

@@ -139,18 +145,18 @@ func TestInsert(t *testing.T) {
139145
enc, err := rlp.EncodeToBytes(acc)
140146
require.NoError(t, err)
141147

142-
err = tr.UpdateAccount(addr, acc, 0)
148+
err = tr.UpdateAccount(addr, acc)
143149
require.NoError(t, err)
144150

145151
fwKeys = append(fwKeys, accHash[:])
146152
fwVals = append(fwVals, enc)
147153
case i%4 == 2: // add storage
148154
addr := chooseAddr()
149155
accHash := hashData(addr[:])
150-
key := hashData(binary.BigEndian.AppendUint64(nil, uint64(i)))
156+
key := hashData(binary.BigEndian.AppendUint64(nil, i))
151157
keyHash := hashData(key[:])
152158

153-
val := hashData(binary.BigEndian.AppendUint64(nil, uint64(i+1)))
159+
val := hashData(binary.BigEndian.AppendUint64(nil, i+1))
154160
storageKey := storageKey{addr: addr, key: key}
155161

156162
acc, err := tr.GetAccount(addr)
@@ -163,11 +169,12 @@ func TestInsert(t *testing.T) {
163169
require.NoError(t, err)
164170
storages = append(storages, storageKey)
165171

166-
strRoot, set := str.Commit(false)
172+
strRoot, set, err := str.Commit(false)
173+
require.NoError(t, err)
167174
err = mergeSet.Merge(set)
168175
require.NoError(t, err)
169176
acc.Root = strRoot
170-
err = tr.UpdateAccount(addr, acc, 0)
177+
err = tr.UpdateAccount(addr, acc)
171178
require.NoError(t, err)
172179

173180
fwKeys = append(fwKeys, append(accHash[:], keyHash[:]...))
@@ -176,12 +183,18 @@ func TestInsert(t *testing.T) {
176183
encodedVal, err := rlp.EncodeToBytes(val[:])
177184
require.NoError(t, err)
178185
fwVals = append(fwVals, encodedVal)
186+
187+
// We must also update the account (not for hash, but to be accurate)
188+
fwKeys = append(fwKeys, accHash[:])
189+
encodedVal, err = rlp.EncodeToBytes(acc)
190+
require.NoError(t, err)
191+
fwVals = append(fwVals, encodedVal)
179192
case i%4 == 3: // update storage
180193
storageKey := chooseStorage()
181194
accHash := hashData(storageKey.addr[:])
182195
keyHash := hashData(storageKey.key[:])
183196

184-
val := hashData(binary.BigEndian.AppendUint64(nil, uint64(i+1)))
197+
val := hashData(binary.BigEndian.AppendUint64(nil, i+1))
185198

186199
acc, err := tr.GetAccount(storageKey.addr)
187200
require.NoError(t, err)
@@ -192,11 +205,12 @@ func TestInsert(t *testing.T) {
192205
err = str.UpdateStorage(storageKey.addr, storageKey.key[:], val[:])
193206
require.NoError(t, err)
194207

195-
strRoot, set := str.Commit(false)
208+
strRoot, set, err := str.Commit(false)
209+
require.NoError(t, err)
196210
err = mergeSet.Merge(set)
197211
require.NoError(t, err)
198212
acc.Root = strRoot
199-
err = tr.UpdateAccount(storageKey.addr, acc, 0)
213+
err = tr.UpdateAccount(storageKey.addr, acc)
200214
require.NoError(t, err)
201215

202216
fwKeys = append(fwKeys, append(accHash[:], keyHash[:]...))
@@ -205,12 +219,19 @@ func TestInsert(t *testing.T) {
205219
encodedVal, err := rlp.EncodeToBytes(val[:])
206220
require.NoError(t, err)
207221
fwVals = append(fwVals, encodedVal)
222+
223+
// We must also update the account (not for hash, but to be accurate)
224+
fwKeys = append(fwKeys, accHash[:])
225+
encodedVal, err = rlp.EncodeToBytes(acc)
226+
require.NoError(t, err)
227+
fwVals = append(fwVals, encodedVal)
208228
}
209-
next, set := tr.Commit(true)
229+
next, set, err := tr.Commit(true)
230+
require.NoError(t, err)
210231
err = mergeSet.Merge(set)
211232
require.NoError(t, err)
212233

213-
err = tdb.TrieDB().Update(next, ethRoot, uint64(i), mergeSet, nil)
234+
err = tdb.TrieDB().Update(next, ethRoot, i, mergeSet, nil)
214235
require.NoError(t, err)
215236

216237
// update firewood db

ffi/tests/go.mod

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,43 +5,67 @@ go 1.23.0
55
toolchain go1.23.6
66

77
require (
8-
github.com/ava-labs/firewood/ffi/v2 v2.0.0 // this is replaced to use the parent folder
9-
github.com/ethereum/go-ethereum v1.15.7
8+
github.com/ava-labs/firewood-go/ffi v0.0.0 // this is replaced to use the parent folder
9+
github.com/ava-labs/libevm v1.13.14-0.2.0.release
1010
github.com/holiman/uint256 v1.3.2
1111
github.com/stretchr/testify v1.10.0
1212
)
1313

1414
require (
15+
github.com/DataDog/zstd v1.4.5 // indirect
1516
github.com/StackExchange/wmi v1.2.1 // indirect
16-
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
17-
github.com/bits-and-blooms/bitset v1.17.0 // indirect
18-
github.com/cespare/xxhash/v2 v2.3.0 // indirect
19-
github.com/consensys/bavard v0.1.22 // indirect
20-
github.com/consensys/gnark-crypto v0.14.0 // indirect
21-
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
22-
github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect
17+
github.com/VictoriaMetrics/fastcache v1.12.1 // indirect
18+
github.com/beorn7/perks v1.0.1 // indirect
19+
github.com/bits-and-blooms/bitset v1.10.0 // indirect
20+
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
21+
github.com/cespare/xxhash/v2 v2.2.0 // indirect
22+
github.com/cockroachdb/errors v1.8.1 // indirect
23+
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect
24+
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect
25+
github.com/cockroachdb/redact v1.0.8 // indirect
26+
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect
27+
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
28+
github.com/consensys/bavard v0.1.13 // indirect
29+
github.com/consensys/gnark-crypto v0.12.1 // indirect
30+
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect
31+
github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect
2332
github.com/davecgh/go-spew v1.1.1 // indirect
2433
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
25-
github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
26-
github.com/ethereum/go-verkle v0.2.2 // indirect
34+
github.com/ethereum/c-kzg-4844 v0.4.0 // indirect
35+
github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect
2736
github.com/go-ole/go-ole v1.3.0 // indirect
2837
github.com/gofrs/flock v0.8.1 // indirect
38+
github.com/gogo/protobuf v1.3.2 // indirect
39+
github.com/golang/protobuf v1.5.3 // indirect
2940
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
3041
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
42+
github.com/klauspost/compress v1.15.15 // indirect
43+
github.com/kr/pretty v0.3.1 // indirect
44+
github.com/kr/text v0.2.0 // indirect
3145
github.com/mattn/go-runewidth v0.0.13 // indirect
46+
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
3247
github.com/mmcloughlin/addchain v0.4.0 // indirect
3348
github.com/olekukonko/tablewriter v0.0.5 // indirect
49+
github.com/pkg/errors v0.9.1 // indirect
3450
github.com/pmezard/go-difflib v1.0.0 // indirect
51+
github.com/prometheus/client_golang v1.12.0 // indirect
52+
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a // indirect
53+
github.com/prometheus/common v0.32.1 // indirect
54+
github.com/prometheus/procfs v0.7.3 // indirect
3555
github.com/rivo/uniseg v0.2.0 // indirect
56+
github.com/rogpeppe/go-internal v1.9.0 // indirect
3657
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
37-
github.com/supranational/blst v0.3.14 // indirect
58+
github.com/supranational/blst v0.3.11 // indirect
59+
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
3860
github.com/tklauser/go-sysconf v0.3.12 // indirect
3961
github.com/tklauser/numcpus v0.6.1 // indirect
40-
golang.org/x/crypto v0.35.0 // indirect
41-
golang.org/x/sync v0.11.0 // indirect
42-
golang.org/x/sys v0.30.0 // indirect
62+
golang.org/x/crypto v0.17.0 // indirect
63+
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
64+
golang.org/x/sync v0.5.0 // indirect
65+
golang.org/x/sys v0.16.0 // indirect
66+
google.golang.org/protobuf v1.27.1 // indirect
4367
gopkg.in/yaml.v3 v3.0.1 // indirect
4468
rsc.io/tmplfunc v0.0.3 // indirect
4569
)
4670

47-
replace github.com/ava-labs/firewood/ffi/v2 => ../
71+
replace github.com/ava-labs/firewood-go/ffi => ../

0 commit comments

Comments
 (0)