33package integration
44
55import (
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