From 3151b650c7120e8300950e05d5aba75c1b6ae253 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 16:21:02 +0300 Subject: [PATCH 01/16] GOEXPERIMENT=rangefunc added --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 2463f61ba0..7d2808881a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ .DEFAULT_GOAL := help +export GOEXPERIMENT=rangefunc + .PHONY: vm ifeq ($(VM_DEBUG),true) From 72f6e85288529b92bb52b34bc1895a83d188d5d7 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 18:10:04 +0300 Subject: [PATCH 02/16] headersIt refactoring --- p2p/sync.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index 397feb0d8f..fe7360f578 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -409,26 +409,26 @@ func (s *syncService) genHeadersAndSigs(ctx context.Context, blockNumber uint64) go func() { defer close(headersAndSigCh) - headersIt(func(res *spec.BlockHeadersResponse) bool { - headerAndSig := specBlockHeaderAndSigs{} - switch v := res.HeaderMessage.(type) { - case *spec.BlockHeadersResponse_Header: - headerAndSig.header = v.Header - case *spec.BlockHeadersResponse_Fin: - return false - default: - s.log.Warnw("Unexpected HeaderMessage from getBlockHeaders", "v", v) - return false - } + func() { + for res := range headersIt { + headerAndSig := specBlockHeaderAndSigs{} + switch v := res.HeaderMessage.(type) { + case *spec.BlockHeadersResponse_Header: + headerAndSig.header = v.Header + case *spec.BlockHeadersResponse_Fin: + return + default: + s.log.Warnw("Unexpected HeaderMessage from getBlockHeaders", "v", v) + return + } - select { - case <-ctx.Done(): - return false - case headersAndSigCh <- headerAndSig: + select { + case <-ctx.Done(): + return + case headersAndSigCh <- headerAndSig: + } } - - return true - }) + }() }() return headersAndSigCh, nil From 1962a58f1b8ee2853cb79f02fa87260860cb7c52 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 18:29:53 +0300 Subject: [PATCH 03/16] genHeadersAndSigs refactored with label and break --- p2p/sync.go | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index fe7360f578..bdfad5b820 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -409,26 +409,25 @@ func (s *syncService) genHeadersAndSigs(ctx context.Context, blockNumber uint64) go func() { defer close(headersAndSigCh) - func() { - for res := range headersIt { - headerAndSig := specBlockHeaderAndSigs{} - switch v := res.HeaderMessage.(type) { - case *spec.BlockHeadersResponse_Header: - headerAndSig.header = v.Header - case *spec.BlockHeadersResponse_Fin: - return - default: - s.log.Warnw("Unexpected HeaderMessage from getBlockHeaders", "v", v) - return - } + loop: + for res := range headersIt { + headerAndSig := specBlockHeaderAndSigs{} + switch v := res.HeaderMessage.(type) { + case *spec.BlockHeadersResponse_Header: + headerAndSig.header = v.Header + case *spec.BlockHeadersResponse_Fin: + break loop + default: + s.log.Warnw("Unexpected HeaderMessage from getBlockHeaders", "v", v) + break loop + } - select { - case <-ctx.Done(): - return - case headersAndSigCh <- headerAndSig: - } + select { + case <-ctx.Done(): + break loop + case headersAndSigCh <- headerAndSig: } - }() + } }() return headersAndSigCh, nil From 9eb694c201a709715fefd7343b04d50aefaf0ab8 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 18:50:43 +0300 Subject: [PATCH 04/16] genEvents refactored, eventsIt rewritten into for loop statement --- p2p/sync.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index bdfad5b820..84c48076a2 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -548,18 +548,19 @@ func (s *syncService) genEvents(ctx context.Context, blockNumber uint64) (<-chan defer close(eventsCh) var events []*spec.Event - eventsIt(func(res *spec.EventsResponse) bool { + + loop: + for res := range eventsIt { switch v := res.EventMessage.(type) { case *spec.EventsResponse_Event: events = append(events, v.Event) - return true case *spec.EventsResponse_Fin: - return false + break loop default: s.log.Warnw("Unexpected EventMessage from getEvents", "v", v) - return false + break loop } - }) + } select { case <-ctx.Done(): From 1c6289134182141256aa5fb99aaa5a6f2542e71f Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 18:55:40 +0300 Subject: [PATCH 05/16] genClasses refactored, classesIt rewritten into for loop statement --- p2p/sync.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index 84c48076a2..b14ccf4b59 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -454,18 +454,18 @@ func (s *syncService) genClasses(ctx context.Context, blockNumber uint64) (<-cha defer close(classesCh) var classes []*spec.Class - classesIt(func(res *spec.ClassesResponse) bool { + loop: + for res := range classesIt { switch v := res.ClassMessage.(type) { case *spec.ClassesResponse_Class: classes = append(classes, v.Class) - return true case *spec.ClassesResponse_Fin: - return false + break loop default: s.log.Warnw("Unexpected ClassMessage from getClasses", "v", v) - return false + break loop } - }) + } select { case <-ctx.Done(): From a59426820b6f74962d1c8693b64da3d26075c52b Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 19:01:05 +0300 Subject: [PATCH 06/16] select fixed --- p2p/sync.go | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index b14ccf4b59..49dd6f2e3d 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -465,15 +465,16 @@ func (s *syncService) genClasses(ctx context.Context, blockNumber uint64) (<-cha s.log.Warnw("Unexpected ClassMessage from getClasses", "v", v) break loop } - } - select { - case <-ctx.Done(): - case classesCh <- specClasses{ - number: blockNumber, - classes: classes, - }: - s.log.Debugw("Received classes for block", "blockNumber", blockNumber, "lenClasses", len(classes)) + select { + case <-ctx.Done(): + break loop + case classesCh <- specClasses{ + number: blockNumber, + classes: classes, + }: + s.log.Debugw("Received classes for block", "blockNumber", blockNumber, "lenClasses", len(classes)) + } } }() return classesCh, nil @@ -560,14 +561,15 @@ func (s *syncService) genEvents(ctx context.Context, blockNumber uint64) (<-chan s.log.Warnw("Unexpected EventMessage from getEvents", "v", v) break loop } - } - select { - case <-ctx.Done(): - case eventsCh <- specEvents{ - number: blockNumber, - events: events, - }: + select { + case <-ctx.Done(): + break loop + case eventsCh <- specEvents{ + number: blockNumber, + events: events, + }: + } } }() return eventsCh, nil From 73425c966bd92256b2c288ccc1a5738c6d79b071 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 19:06:37 +0300 Subject: [PATCH 07/16] select unfixed --- p2p/sync.go | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index 49dd6f2e3d..ae91a9afb5 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -465,16 +465,15 @@ func (s *syncService) genClasses(ctx context.Context, blockNumber uint64) (<-cha s.log.Warnw("Unexpected ClassMessage from getClasses", "v", v) break loop } + } - select { - case <-ctx.Done(): - break loop - case classesCh <- specClasses{ - number: blockNumber, - classes: classes, - }: - s.log.Debugw("Received classes for block", "blockNumber", blockNumber, "lenClasses", len(classes)) - } + select { + case <-ctx.Done(): + case classesCh <- specClasses{ + number: blockNumber, + classes: classes, + }: + s.log.Debugw("Received classes for block", "blockNumber", blockNumber, "lenClasses", len(classes)) } }() return classesCh, nil @@ -495,11 +494,9 @@ func (s *syncService) genStateDiffs(ctx context.Context, blockNumber uint64) (<- if err != nil { return nil, err } - stateDiffsCh := make(chan specContractDiffs) go func() { defer close(stateDiffsCh) - var contractDiffs []*spec.ContractDiff stateDiffsIt(func(res *spec.StateDiffsResponse) bool { switch v := res.StateDiffMessage.(type) { @@ -516,7 +513,6 @@ func (s *syncService) genStateDiffs(ctx context.Context, blockNumber uint64) (<- return false } }) - select { case <-ctx.Done(): case stateDiffsCh <- specContractDiffs{ @@ -561,15 +557,14 @@ func (s *syncService) genEvents(ctx context.Context, blockNumber uint64) (<-chan s.log.Warnw("Unexpected EventMessage from getEvents", "v", v) break loop } + } - select { - case <-ctx.Done(): - break loop - case eventsCh <- specEvents{ - number: blockNumber, - events: events, - }: - } + select { + case <-ctx.Done(): + case eventsCh <- specEvents{ + number: blockNumber, + events: events, + }: } }() return eventsCh, nil From 8a31cf48fec8a3e663fdc6895ca253ee6c1f60eb Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 19:07:12 +0300 Subject: [PATCH 08/16] genStateDiffs refactored, stateDiffsIt rewritten into for loop statement --- p2p/sync.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index ae91a9afb5..5d9a4c7162 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -494,25 +494,28 @@ func (s *syncService) genStateDiffs(ctx context.Context, blockNumber uint64) (<- if err != nil { return nil, err } + stateDiffsCh := make(chan specContractDiffs) go func() { defer close(stateDiffsCh) + var contractDiffs []*spec.ContractDiff - stateDiffsIt(func(res *spec.StateDiffsResponse) bool { + + loop: + for res := range stateDiffsIt { switch v := res.StateDiffMessage.(type) { case *spec.StateDiffsResponse_ContractDiff: contractDiffs = append(contractDiffs, v.ContractDiff) - return true case *spec.StateDiffsResponse_DeclaredClass: s.log.Warnw("Unimplemented message StateDiffsResponse_DeclaredClass") - return true case *spec.StateDiffsResponse_Fin: - return false + break loop default: s.log.Warnw("Unexpected ClassMessage from getStateDiffs", "v", v) - return false + break loop } - }) + } + select { case <-ctx.Done(): case stateDiffsCh <- specContractDiffs{ From d8035da90649fdbf66bd7e811c57d290889aee34 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 19:08:31 +0300 Subject: [PATCH 09/16] genTransactions refactored, txsIt rewritten into for loop statement --- p2p/sync.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/p2p/sync.go b/p2p/sync.go index 5d9a4c7162..3cfa5c3ae8 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -598,20 +598,21 @@ func (s *syncService) genTransactions(ctx context.Context, blockNumber uint64) ( transactions []*spec.Transaction receipts []*spec.Receipt ) - txsIt(func(res *spec.TransactionsResponse) bool { + + loop: + for res := range txsIt { switch v := res.TransactionMessage.(type) { case *spec.TransactionsResponse_TransactionWithReceipt: txWithReceipt := v.TransactionWithReceipt transactions = append(transactions, txWithReceipt.Transaction) receipts = append(receipts, txWithReceipt.Receipt) - return true case *spec.TransactionsResponse_Fin: - return false + break loop default: s.log.Warnw("Unexpected TransactionMessage from getTransactions", "v", v) - return false + break loop } - }) + } s.log.Debugw("Transactions length", "len", len(transactions)) spexTxs := specTxWithReceipts{ From 74c4b4540ffb677e17a90408f6494fb5fe475358 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 21:52:17 +0300 Subject: [PATCH 10/16] added TODO remove "export GOEXPERIMENT=rangefunc" after updating to Go 1.23 --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 7d2808881a..0d2c897794 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ .DEFAULT_GOAL := help +//TODO remove it after updating to Go 1.23 export GOEXPERIMENT=rangefunc .PHONY: vm From cf58e8c8231b218ccd2d0042226f6b2c49b02a3e Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Tue, 16 Jul 2024 21:56:14 +0300 Subject: [PATCH 11/16] label deleted --- p2p/sync.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/p2p/sync.go b/p2p/sync.go index 3cfa5c3ae8..0558e035bd 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -424,7 +424,7 @@ func (s *syncService) genHeadersAndSigs(ctx context.Context, blockNumber uint64) select { case <-ctx.Done(): - break loop + break case headersAndSigCh <- headerAndSig: } } From 25d75282df64a7e2bea75c01bdfd126f4a9e2591 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Wed, 17 Jul 2024 12:02:44 +0300 Subject: [PATCH 12/16] updated comment --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0d2c897794..0f0bcaa3c5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .DEFAULT_GOAL := help -//TODO remove it after updating to Go 1.23 +#TODO remove it after updating to Go 1.23 export GOEXPERIMENT=rangefunc .PHONY: vm From 9d199f2010b1be619aed934ef76c4360304cba5b Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Mon, 19 Aug 2024 13:42:46 +0300 Subject: [PATCH 13/16] Remove `export GOEXPERIMENT=rangefunc` due to go 1.23 release --- Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Makefile b/Makefile index 0f0bcaa3c5..2463f61ba0 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,5 @@ .DEFAULT_GOAL := help -#TODO remove it after updating to Go 1.23 -export GOEXPERIMENT=rangefunc - .PHONY: vm ifeq ($(VM_DEBUG),true) From 963c8b986c2898f99662a430ddf9182c2d4410af Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Mon, 19 Aug 2024 15:39:32 +0300 Subject: [PATCH 14/16] Remove unused iter package and related tests due to go 1.23.0 release --- utils/iter/pull.go | 34 ---------------------------- utils/iter/pull_test.go | 49 ----------------------------------------- utils/iter/seq.go | 6 ----- 3 files changed, 89 deletions(-) delete mode 100644 utils/iter/pull.go delete mode 100644 utils/iter/pull_test.go delete mode 100644 utils/iter/seq.go diff --git a/utils/iter/pull.go b/utils/iter/pull.go deleted file mode 100644 index 28723982e8..0000000000 --- a/utils/iter/pull.go +++ /dev/null @@ -1,34 +0,0 @@ -package iter - -import "context" - -// Pull is our implementation of iter.Pull from stdlib -// original impl - https://cs.opensource.google/go/go/+/refs/tags/go1.22rc2:src/iter/iter.go;l=56 -// Note that seq is going to be called in a separate goroutine (original impl uses private coroutine functions) -func Pull[V any](seq Seq[V]) (next func() (V, bool), stop func()) { - ctx, stop := context.WithCancel(context.Background()) - ch := make(chan V) - - // values producer for ch - go func() { - defer close(ch) - - yield := func(v V) bool { - select { - case ch <- v: - case <-ctx.Done(): - return false - } - - return true - } - seq(yield) - }() - // consumer of ch - next = func() (v V, ok bool) { - v, ok = <-ch - return - } - - return next, stop -} diff --git a/utils/iter/pull_test.go b/utils/iter/pull_test.go deleted file mode 100644 index 8a2fe84698..0000000000 --- a/utils/iter/pull_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package iter - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestPull(t *testing.T) { - t.Run("Iterate over all values", func(t *testing.T) { - it := newIterator(1, 2, 3, 4, 5) - next, _ := Pull(it) - - for i := 1; i <= 5; i++ { - v, ok := next() - assert.True(t, ok) - assert.Equal(t, i, v) - } - - v, ok := next() - assert.Zero(t, v) - assert.False(t, ok) - }) - t.Run("Iterate and stop in the middle", func(t *testing.T) { - it := newIterator(1, 2, 3, 4, 5) - next, stop := Pull(it) - - for i := 1; i <= 3; i++ { - v, ok := next() - assert.True(t, ok) - assert.Equal(t, i, v) - } - stop() - - v, ok := next() - assert.Zero(t, v) - assert.False(t, ok) - }) -} - -func newIterator[T any](values ...T) Seq[T] { - return func(yield func(T) bool) { - for _, v := range values { - if !yield(v) { - break - } - } - } -} diff --git a/utils/iter/seq.go b/utils/iter/seq.go deleted file mode 100644 index 1c5f103a3f..0000000000 --- a/utils/iter/seq.go +++ /dev/null @@ -1,6 +0,0 @@ -package iter - -type ( - Seq[V any] func(yield func(V) bool) - Seq2[K, V any] func(yield func(K, V) bool) -) From a57419084cfc59265c0c344fe375a1941ff6ffb2 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Mon, 19 Aug 2024 15:52:17 +0300 Subject: [PATCH 15/16] Update import `iter` package --- p2p/starknet/client.go | 2 +- p2p/starknet/handlers.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/p2p/starknet/client.go b/p2p/starknet/client.go index e273b84f7c..ada3fbd209 100644 --- a/p2p/starknet/client.go +++ b/p2p/starknet/client.go @@ -4,11 +4,11 @@ import ( "context" "errors" "io" + "iter" "time" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" - "github.com/NethermindEth/juno/utils/iter" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/protocol" "google.golang.org/protobuf/encoding/protodelim" diff --git a/p2p/starknet/handlers.go b/p2p/starknet/handlers.go index cf09e6ba86..9b4d1582e6 100644 --- a/p2p/starknet/handlers.go +++ b/p2p/starknet/handlers.go @@ -5,6 +5,7 @@ import ( "bytes" "context" "fmt" + "iter" "sync" "github.com/NethermindEth/juno/adapters/core2p2p" @@ -14,7 +15,6 @@ import ( "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" - "github.com/NethermindEth/juno/utils/iter" "github.com/libp2p/go-libp2p/core/network" "google.golang.org/protobuf/encoding/protodelim" "google.golang.org/protobuf/proto" From b495f8ba46fd4597f1bac327f4000950da0dae20 Mon Sep 17 00:00:00 2001 From: AnkushinDaniil Date: Mon, 19 Aug 2024 16:19:09 +0300 Subject: [PATCH 16/16] Add a `nolint` comment until the `gci` issue is fixed --- p2p/starknet/client.go | 2 ++ p2p/starknet/handlers.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/p2p/starknet/client.go b/p2p/starknet/client.go index ada3fbd209..1a80eaf62e 100644 --- a/p2p/starknet/client.go +++ b/p2p/starknet/client.go @@ -1,5 +1,7 @@ package starknet +// TODO: remove this nolint when the issue is fixed https://github.com/daixiang0/gci/issues/209 +//nolint:gci import ( "context" "errors" diff --git a/p2p/starknet/handlers.go b/p2p/starknet/handlers.go index 9b4d1582e6..b069198ffa 100644 --- a/p2p/starknet/handlers.go +++ b/p2p/starknet/handlers.go @@ -1,6 +1,8 @@ //go:generate protoc --go_out=./ --proto_path=./ --go_opt=Mp2p/proto/transaction.proto=./spec --go_opt=Mp2p/proto/state.proto=./spec --go_opt=Mp2p/proto/snapshot.proto=./spec --go_opt=Mp2p/proto/receipt.proto=./spec --go_opt=Mp2p/proto/mempool.proto=./spec --go_opt=Mp2p/proto/event.proto=./spec --go_opt=Mp2p/proto/block.proto=./spec --go_opt=Mp2p/proto/common.proto=./spec p2p/proto/transaction.proto p2p/proto/state.proto p2p/proto/snapshot.proto p2p/proto/common.proto p2p/proto/block.proto p2p/proto/event.proto p2p/proto/receipt.proto package starknet +// TODO: remove this nolint when the issue is fixed https://github.com/daixiang0/gci/issues/209 +//nolint:gci import ( "bytes" "context"