Skip to content

Commit 386f182

Browse files
feat: fuzzer benching (#504)
* feat: fuzzer benching * feat: refactor benchmarks to run agains the conformance node --------- Co-authored-by: Emanuel Pargov <bamzedev@gmail.com>
1 parent 01e0b89 commit 386f182

File tree

1 file changed

+120
-48
lines changed

1 file changed

+120
-48
lines changed

tests/integration/traces_bench_test.go

Lines changed: 120 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@
33
package integration
44

55
import (
6+
"context"
67
"fmt"
8+
"net"
79
"os"
810
"path/filepath"
911
"sort"
1012
"testing"
1113

12-
"github.com/eigerco/strawberry/internal/state/serialization"
13-
"github.com/eigerco/strawberry/internal/state/serialization/statekey"
14-
"github.com/eigerco/strawberry/internal/statetransition"
15-
"github.com/eigerco/strawberry/internal/store"
16-
"github.com/eigerco/strawberry/pkg/db/pebble"
14+
"github.com/stretchr/testify/require"
15+
16+
"github.com/eigerco/strawberry/internal/block"
17+
"github.com/eigerco/strawberry/pkg/conformance"
18+
"github.com/eigerco/strawberry/pkg/network/handlers"
1719
"github.com/eigerco/strawberry/pkg/serialization/codec/jam"
1820
)
1921

@@ -49,56 +51,58 @@ func BenchmarkTraceFuzzyLight(b *testing.B) {
4951
runTracesBenchmark(b, "traces/fuzzy_light")
5052
}
5153

52-
func runTraceBenchmark(b *testing.B, filename string) {
54+
func runTraceBenchmark(b *testing.B, conn net.Conn, filename string) {
5355
data, err := os.ReadFile(filename)
5456
if err != nil {
5557
b.Fatalf("failed to read trace file %q: %v", filename, err)
5658
}
59+
var trace Trace
60+
err = jam.Unmarshal(data, &trace)
61+
if err != nil {
62+
b.Fatalf("failed to unmarshal trace from %q: %v", filename, err)
63+
}
5764

65+
ctx := context.Background()
66+
// Serialize Initialize message
67+
initMsgBytes, err := jam.Marshal(conformance.NewMessage(conformance.Initialize{
68+
Header: block.Header{},
69+
State: conformance.State{
70+
StateItems: trace.PreState.KeyValues,
71+
},
72+
Ancestry: conformance.Ancestry{
73+
Items: []conformance.AncestryItem{},
74+
},
75+
}))
76+
require.NoError(b, err)
77+
78+
// Serialize ImportBlock message
79+
blockImportMsgBytes, err := jam.Marshal(conformance.NewMessage(conformance.ImportBlock{
80+
Block: trace.Block,
81+
}))
82+
require.NoError(b, err)
83+
84+
b.ResetTimer() // Wipes the "setup" time and allocations.
85+
b.StopTimer()
5886
for i := 0; i < b.N; i++ {
59-
b.StopTimer()
60-
db, err := pebble.NewKVStore()
61-
if err != nil {
62-
b.Fatalf("failed to create pebble KV store: %v", err)
63-
}
64-
65-
trieDB := store.NewTrie(db)
66-
chainDB := store.NewChain(db)
67-
68-
var trace Trace
69-
err = jam.Unmarshal(data, &trace)
70-
if err != nil {
71-
b.Fatalf("failed to unmarshal trace from %q: %v", filename, err)
72-
}
73-
74-
serializedState := map[statekey.StateKey][]byte{}
75-
for _, entry := range trace.PreState.KeyValues {
76-
serializedState[entry.Key] = entry.Value
77-
}
78-
79-
currentState, err := serialization.DeserializeState(serializedState)
80-
if err != nil {
81-
b.Fatalf("failed to deserialize state: %v", err)
82-
}
83-
87+
// Create the Initialize message (Prestate)
88+
// Send the Initialize message
89+
err = handlers.WriteMessageWithContext(ctx, conn, initMsgBytes)
90+
require.NoError(b, err)
91+
// Read the response to the Initialize message
92+
initResponse, err := handlers.ReadMessageWithContext(ctx, conn)
93+
require.NoError(b, err)
94+
require.NotEmpty(b, initResponse)
95+
96+
// Only time the import block logic
8497
b.StartTimer()
85-
86-
block := trace.Block
87-
err = statetransition.UpdateState(
88-
&currentState,
89-
block,
90-
chainDB,
91-
trieDB,
92-
)
93-
if err != nil {
94-
b.Fatalf("failed to update state for block: %v", err)
95-
}
96-
98+
// Send the ImportBlock message
99+
err = handlers.WriteMessageWithContext(ctx, conn, blockImportMsgBytes)
100+
require.NoError(b, err)
101+
// Read the response to the ImportBlock message (StateRoot)
102+
importResponse, err := handlers.ReadMessageWithContext(ctx, conn)
103+
require.NoError(b, err)
104+
require.NotEmpty(b, importResponse)
97105
b.StopTimer()
98-
err = db.Close()
99-
if err != nil {
100-
b.Fatalf("failed to close database: %v", err)
101-
}
102106
}
103107
}
104108

@@ -114,12 +118,80 @@ func runTracesBenchmark(b *testing.B, directory string) {
114118

115119
sort.Strings(files)
116120

121+
// Create a connection and first message (PeerInfo)
122+
conn, err := net.Dial("unix", "/tmp/jam_target.sock")
123+
require.NoError(b, err)
124+
defer func() {
125+
require.NoError(b, conn.Close())
126+
}()
127+
msgBytes, err := jam.Marshal(peerInfo)
128+
require.NoError(b, err)
129+
// Send PeerInfo message
130+
ctx := context.Background()
131+
err = handlers.WriteMessageWithContext(ctx, conn, msgBytes)
132+
require.NoError(b, err)
133+
// Read the response
134+
response, err := handlers.ReadMessageWithContext(ctx, conn)
135+
require.NoError(b, err)
136+
require.NotEmpty(b, response)
137+
respMsg := &conformance.Message{}
138+
err = jam.Unmarshal(response.Content, respMsg)
139+
require.NoError(b, err)
140+
require.NotNil(b, respMsg)
141+
142+
data, err := os.ReadFile(filepath.Join(directory, "genesis.bin"))
143+
if err != nil {
144+
b.Fatalf("failed to genesis.bin: %v", err)
145+
}
146+
var genesis Genesis
147+
err = jam.Unmarshal(data, &genesis)
148+
if err != nil {
149+
b.Fatalf("failed to genesis.bin: %v", err)
150+
}
151+
require.NoError(b, err)
152+
require.NotEmpty(b, genesis)
153+
154+
// Create the Initialize message (Prestate)
155+
initMessage := conformance.Initialize{
156+
Header: genesis.Header,
157+
State: conformance.State{
158+
StateItems: genesis.State.KeyValues,
159+
},
160+
Ancestry: conformance.Ancestry{Items: []conformance.AncestryItem{}},
161+
}
162+
initMsg := conformance.NewMessage(initMessage)
163+
initMsgBytes, err := jam.Marshal(initMsg)
164+
require.NoError(b, err)
165+
// Send the Initialize genesis message
166+
err = handlers.WriteMessageWithContext(ctx, conn, initMsgBytes)
167+
require.NoError(b, err)
168+
// Read the response to the Initialize genesis message
169+
initResponse, err := handlers.ReadMessageWithContext(ctx, conn)
170+
require.NoError(b, err)
171+
require.NotEmpty(b, initResponse)
172+
117173
for _, file := range files {
118174
if filepath.Base(file) == "genesis.bin" {
119175
continue // Skip the genesis trace since this is mostly there for reference.
120176
}
121177
b.Run(filepath.Base(file), func(b *testing.B) {
122-
runTraceBenchmark(b, file)
178+
runTraceBenchmark(b, conn, file)
123179
})
124180
}
125181
}
182+
183+
var peerInfo = conformance.NewMessage(conformance.PeerInfo{
184+
FuzzVersion: 1,
185+
FuzzFeatures: conformance.FeatureFork,
186+
JamVersion: conformance.Version{
187+
Major: 0,
188+
Minor: 7,
189+
Patch: 2,
190+
},
191+
AppVersion: conformance.Version{
192+
Major: 1,
193+
Minor: 0,
194+
Patch: 0,
195+
},
196+
Name: []byte("test-node"),
197+
})

0 commit comments

Comments
 (0)