Skip to content

Commit 19dbae4

Browse files
committed
wip
1 parent 82a7692 commit 19dbae4

File tree

2 files changed

+90
-10
lines changed

2 files changed

+90
-10
lines changed

rpc/subscriptions.go

+37-10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package rpc
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
7+
"reflect"
68
"time"
79

810
"github.com/NethermindEth/juno/blockchain"
@@ -77,8 +79,8 @@ func (h *Handler) SubscribeEvents(ctx context.Context, fromAddr *felt.Felt, keys
7779
// old blocks.
7880
var wg conc.WaitGroup
7981
wg.Go(func() {
80-
// Stores the transaction hash of the event
81-
eventsPreviouslySent := make(map[felt.Felt]struct{})
82+
// Stores the transaction hash -> number of events
83+
eventsPreviouslySent := make([]*blockchain.FilteredEvent, 0)
8284

8385
for {
8486
select {
@@ -98,10 +100,34 @@ func (h *Handler) SubscribeEvents(ctx context.Context, fromAddr *felt.Felt, keys
98100
return
99101
}
100102

101-
for _, t := range b.Transactions {
102-
delete(eventsPreviouslySent, *t.Hash())
103+
fmt.Println("size of slice before", len(eventsPreviouslySent))
104+
for i, r := range b.Receipts {
105+
for _, e := range r.Events {
106+
fe := &blockchain.FilteredEvent{
107+
Event: e,
108+
BlockNumber: header.Number,
109+
BlockHash: header.Hash,
110+
TransactionHash: b.Transactions[i].Hash(),
111+
}
112+
113+
var deleteI int
114+
var duplicateFound bool
115+
for j, dupE := range eventsPreviouslySent {
116+
if reflect.DeepEqual(fe, dupE) {
117+
duplicateFound = true
118+
deleteI = j
119+
break
120+
}
121+
}
122+
123+
if duplicateFound {
124+
eventsPreviouslySent = append(eventsPreviouslySent[:deleteI], eventsPreviouslySent[deleteI+1:]...)
125+
}
126+
}
103127
}
128+
fmt.Println("size of slice after", len(eventsPreviouslySent))
104129
case pending := <-pendingSub.Recv():
130+
fmt.Println("Found pending block", len(pending.Transactions))
105131
h.processEvents(subscriptionCtx, w, id, pending.Number, pending.Number, fromAddr, keys, eventsPreviouslySent)
106132
}
107133
}
@@ -271,7 +297,7 @@ func (h *Handler) SubscribeTransactionStatus(ctx context.Context, txHash felt.Fe
271297
}
272298

273299
func (h *Handler) processEvents(ctx context.Context, w jsonrpc.Conn, id, from, to uint64, fromAddr *felt.Felt,
274-
keys [][]felt.Felt, eventsPreviouslySent map[felt.Felt]struct{},
300+
keys [][]felt.Felt, eventsPreviouslySent []*blockchain.FilteredEvent,
275301
) {
276302
filter, err := h.bcReader.EventFilter(fromAddr, keys)
277303
if err != nil {
@@ -314,18 +340,19 @@ func (h *Handler) processEvents(ctx context.Context, w jsonrpc.Conn, id, from, t
314340
}
315341

316342
func sendEvents(ctx context.Context, w jsonrpc.Conn, events []*blockchain.FilteredEvent,
317-
eventsPreviouslySent map[felt.Felt]struct{}, id uint64,
343+
eventsPreviouslySent []*blockchain.FilteredEvent, id uint64,
318344
) error {
345+
eventsLoop:
319346
for _, event := range events {
320347
select {
321348
case <-ctx.Done():
322349
return ctx.Err()
323350
default:
324-
if eventsPreviouslySent != nil {
325-
if _, exists := eventsPreviouslySent[*event.TransactionHash]; exists {
326-
continue
351+
for _, prevEvent := range eventsPreviouslySent {
352+
if reflect.DeepEqual(event, prevEvent) {
353+
continue eventsLoop
327354
}
328-
eventsPreviouslySent[*event.TransactionHash] = struct{}{}
355+
eventsPreviouslySent = append(eventsPreviouslySent, event)
329356
}
330357

331358
emittedEvent := &EmittedEvent{

rpc/subscriptions_test.go

+53
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io"
88
"net"
99
"net/http/httptest"
10+
"reflect"
1011
"testing"
1112
"time"
1213

@@ -1031,3 +1032,55 @@ func marshalSubEventsResp(e *EmittedEvent, id uint64) ([]byte, error) {
10311032
},
10321033
})
10331034
}
1035+
1036+
func TestEventEquality(t *testing.T) {
1037+
e1 := &Event{
1038+
From: new(felt.Felt).SetUint64(1),
1039+
Keys: []*felt.Felt{new(felt.Felt).SetUint64(2), new(felt.Felt).SetUint64(3)},
1040+
Data: []*felt.Felt{new(felt.Felt).SetUint64(4), new(felt.Felt).SetUint64(3)},
1041+
}
1042+
1043+
e2 := &Event{
1044+
From: new(felt.Felt).SetUint64(1),
1045+
Keys: []*felt.Felt{new(felt.Felt).SetUint64(2), new(felt.Felt).SetUint64(3)},
1046+
Data: []*felt.Felt{new(felt.Felt).SetUint64(4), new(felt.Felt).SetUint64(3)},
1047+
}
1048+
1049+
assert.True(t, reflect.DeepEqual(e1, e2))
1050+
1051+
e3 := &core.Event{
1052+
From: new(felt.Felt).SetUint64(1),
1053+
Keys: []*felt.Felt{new(felt.Felt).SetUint64(2), new(felt.Felt).SetUint64(3)},
1054+
Data: []*felt.Felt{new(felt.Felt).SetUint64(4), new(felt.Felt).SetUint64(3)},
1055+
}
1056+
1057+
e4 := &core.Event{
1058+
From: new(felt.Felt).SetUint64(1),
1059+
Keys: []*felt.Felt{new(felt.Felt).SetUint64(2), new(felt.Felt).SetUint64(3)},
1060+
Data: []*felt.Felt{new(felt.Felt).SetUint64(4), new(felt.Felt).SetUint64(3)},
1061+
}
1062+
1063+
assert.True(t, reflect.DeepEqual(e3, e4))
1064+
1065+
bn1 := uint64(10)
1066+
ee1 := EmittedEvent{
1067+
Event: e1,
1068+
BlockNumber: &bn1,
1069+
BlockHash: new(felt.Felt).SetBytes([]byte("b hash")),
1070+
TransactionHash: new(felt.Felt).SetBytes([]byte("tx hash")),
1071+
}
1072+
1073+
bn2 := uint64(10)
1074+
ee2 := EmittedEvent{
1075+
Event: e2,
1076+
BlockNumber: &bn2,
1077+
BlockHash: new(felt.Felt).SetBytes([]byte("b hash")),
1078+
TransactionHash: new(felt.Felt).SetBytes([]byte("tx hash")),
1079+
}
1080+
1081+
assert.True(t, reflect.DeepEqual(ee1, ee2))
1082+
// assert.True(t, *ee1.Event.Data == *ee2.Event.Data)
1083+
assert.True(t, *ee1.BlockNumber == *ee2.BlockNumber)
1084+
assert.True(t, *ee1.BlockHash == *ee2.BlockHash)
1085+
assert.True(t, *ee1.TransactionHash == *ee2.TransactionHash)
1086+
}

0 commit comments

Comments
 (0)