Skip to content

Commit 08cabab

Browse files
authored
fix: and optimising fetching membership events (#706)
* fix: and optimising fetching membership events * fix: start from lastProcessedBlock+1 * test: fetching membership logic * refactor: usage of rlnInstance,rootTracker,groupManager rlnInstance, rootTrack were previously created while creating rlnRelay but were assigned to groupManager on Start of rlnRelay. This created unncessary dependency of passing them to static and dynamic group manager. Web3Config uses interface EthClientI for client, so that we can pass mock client for testing MembershipFetcher. * fix: failing test * fix: lint error * fix: account for PR suggestions * fix: failing race test * fix: dont' increase fromBlock on error * nit: fix naming and add comments
1 parent 0928116 commit 08cabab

16 files changed

+755
-336
lines changed

waku/v2/node/wakunode2_rln.go

+16-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
pubsub "github.com/libp2p/go-libp2p-pubsub"
1212
"github.com/waku-org/go-waku/waku/v2/protocol/rln"
13+
"github.com/waku-org/go-waku/waku/v2/protocol/rln/group_manager"
1314
"github.com/waku-org/go-waku/waku/v2/protocol/rln/group_manager/dynamic"
1415
"github.com/waku-org/go-waku/waku/v2/protocol/rln/group_manager/static"
1516
"github.com/waku-org/go-waku/waku/v2/protocol/rln/keystore"
@@ -23,12 +24,17 @@ func (w *WakuNode) RLNRelay() RLNRelay {
2324

2425
func (w *WakuNode) setupRLNRelay() error {
2526
var err error
26-
var groupManager rln.GroupManager
2727

2828
if !w.opts.enableRLN {
2929
return nil
3030
}
3131

32+
var groupManager group_manager.GroupManager
33+
34+
rlnInstance, rootTracker, err := rln.GetRLNInstanceAndRootTracker(w.opts.rlnTreePath)
35+
if err != nil {
36+
return err
37+
}
3238
if !w.opts.rlnRelayDynamic {
3339
w.log.Info("setting up waku-rln-relay in off-chain mode")
3440

@@ -38,7 +44,8 @@ func (w *WakuNode) setupRLNRelay() error {
3844
return err
3945
}
4046

41-
groupManager, err = static.NewStaticGroupManager(groupKeys, idCredential, w.opts.rlnRelayMemIndex, w.log)
47+
groupManager, err = static.NewStaticGroupManager(groupKeys, idCredential, w.opts.rlnRelayMemIndex, rlnInstance,
48+
rootTracker, w.log)
4249
if err != nil {
4350
return err
4451
}
@@ -57,17 +64,20 @@ func (w *WakuNode) setupRLNRelay() error {
5764
appKeystore,
5865
w.opts.keystorePassword,
5966
w.opts.prometheusReg,
67+
rlnInstance,
68+
rootTracker,
6069
w.log,
6170
)
6271
if err != nil {
6372
return err
6473
}
6574
}
6675

67-
rlnRelay, err := rln.New(groupManager, w.opts.rlnTreePath, w.timesource, w.opts.prometheusReg, w.log)
68-
if err != nil {
69-
return err
70-
}
76+
rlnRelay := rln.New(group_manager.Details{
77+
GroupManager: groupManager,
78+
RootTracker: rootTracker,
79+
RLN: rlnInstance,
80+
}, w.timesource, w.opts.prometheusReg, w.log)
7181

7282
w.rlnRelay = rlnRelay
7383

waku/v2/protocol/rln/group_manager/dynamic/dynamic.go

+13-25
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"errors"
66
"math/big"
7-
"sync"
87
"time"
98

109
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -28,28 +27,21 @@ var RLNAppInfo = keystore.AppInfo{
2827
}
2928

3029
type DynamicGroupManager struct {
31-
rln *rln.RLN
32-
log *zap.Logger
30+
MembershipFetcher
3331
metrics Metrics
3432

3533
cancel context.CancelFunc
36-
wg sync.WaitGroup
3734

3835
identityCredential *rln.IdentityCredential
3936
membershipIndex rln.MembershipIndex
4037

41-
web3Config *web3.Config
4238
lastBlockProcessed uint64
4339

44-
eventHandler RegistrationEventHandler
45-
4640
appKeystore *keystore.AppKeystore
4741
keystorePassword string
48-
49-
rootTracker *group_manager.MerkleRootTracker
5042
}
5143

52-
func handler(gm *DynamicGroupManager, events []*contracts.RLNMemberRegistered) error {
44+
func (gm *DynamicGroupManager) handler(events []*contracts.RLNMemberRegistered) error {
5345
toRemoveTable := om.New()
5446
toInsertTable := om.New()
5547

@@ -116,18 +108,19 @@ func NewDynamicGroupManager(
116108
appKeystore *keystore.AppKeystore,
117109
keystorePassword string,
118110
reg prometheus.Registerer,
111+
rlnInstance *rln.RLN,
112+
rootTracker *group_manager.MerkleRootTracker,
119113
log *zap.Logger,
120114
) (*DynamicGroupManager, error) {
121115
log = log.Named("rln-dynamic")
122116

117+
web3Config := web3.NewConfig(ethClientAddr, memContractAddr)
123118
return &DynamicGroupManager{
124-
membershipIndex: membershipIndex,
125-
web3Config: web3.NewConfig(ethClientAddr, memContractAddr),
126-
eventHandler: handler,
127-
appKeystore: appKeystore,
128-
keystorePassword: keystorePassword,
129-
log: log,
130-
metrics: newMetrics(reg),
119+
membershipIndex: membershipIndex,
120+
appKeystore: appKeystore,
121+
keystorePassword: keystorePassword,
122+
MembershipFetcher: NewMembershipFetcher(web3Config, rlnInstance, rootTracker, log),
123+
metrics: newMetrics(reg),
131124
}, nil
132125
}
133126

@@ -139,7 +132,7 @@ func (gm *DynamicGroupManager) memberExists(ctx context.Context, idCommitment rl
139132
return gm.web3Config.RLNContract.MemberExists(&bind.CallOpts{Context: ctx}, rln.Bytes32ToBigInt(idCommitment))
140133
}
141134

142-
func (gm *DynamicGroupManager) Start(ctx context.Context, rlnInstance *rln.RLN, rootTracker *group_manager.MerkleRootTracker) error {
135+
func (gm *DynamicGroupManager) Start(ctx context.Context) error {
143136
if gm.cancel != nil {
144137
return errors.New("already started")
145138
}
@@ -154,9 +147,6 @@ func (gm *DynamicGroupManager) Start(ctx context.Context, rlnInstance *rln.RLN,
154147
return err
155148
}
156149

157-
gm.rln = rlnInstance
158-
gm.rootTracker = rootTracker
159-
160150
// check if the contract exists by calling a static function
161151
_, err = gm.getMembershipFee(ctx)
162152
if err != nil {
@@ -168,7 +158,7 @@ func (gm *DynamicGroupManager) Start(ctx context.Context, rlnInstance *rln.RLN,
168158
return err
169159
}
170160

171-
if err = gm.HandleGroupUpdates(ctx, gm.eventHandler); err != nil {
161+
if err = gm.MembershipFetcher.HandleGroupUpdates(ctx, gm.handler); err != nil {
172162
return err
173163
}
174164

@@ -278,9 +268,7 @@ func (gm *DynamicGroupManager) Stop() error {
278268
return err
279269
}
280270

281-
gm.web3Config.ETHClient.Close()
282-
283-
gm.wg.Wait()
271+
gm.MembershipFetcher.Stop()
284272

285273
return nil
286274
}

waku/v2/protocol/rln/group_manager/dynamic/handler_test.go

+15-16
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dynamic
33
import (
44
"context"
55
"math/big"
6-
"sync"
76
"testing"
87

98
"github.com/ethereum/go-ethereum/core/types"
@@ -35,21 +34,21 @@ func TestHandler(t *testing.T) {
3534
rootTracker, err := group_manager.NewMerkleRootTracker(5, rlnInstance)
3635
require.NoError(t, err)
3736

38-
ctx, cancel := context.WithCancel(context.TODO())
37+
_, cancel := context.WithCancel(context.TODO())
3938
defer cancel()
4039

41-
_ = ctx
42-
4340
gm := &DynamicGroupManager{
44-
rln: rlnInstance,
45-
log: utils.Logger(),
41+
MembershipFetcher: NewMembershipFetcher(
42+
&web3.Config{
43+
ChainID: big.NewInt(1),
44+
},
45+
rlnInstance,
46+
rootTracker,
47+
utils.Logger(),
48+
),
4649
cancel: cancel,
47-
wg: sync.WaitGroup{},
48-
web3Config: &web3.Config{
49-
ChainID: big.NewInt(1),
50-
},
51-
rootTracker: rootTracker,
52-
metrics: newMetrics(prometheus.DefaultRegisterer),
50+
51+
metrics: newMetrics(prometheus.DefaultRegisterer),
5352
}
5453

5554
root0 := [32]byte{62, 31, 25, 34, 223, 182, 113, 211, 249, 18, 247, 234, 70, 30, 10, 136, 238, 132, 143, 221, 225, 43, 108, 24, 171, 26, 210, 197, 106, 231, 52, 33}
@@ -59,7 +58,7 @@ func TestHandler(t *testing.T) {
5958

6059
events := []*contracts.RLNMemberRegistered{eventBuilder(1, false, 0xaaaa, 1)}
6160

62-
err = handler(gm, events)
61+
err = gm.handler(events)
6362
require.NoError(t, err)
6463

6564
roots = gm.rootTracker.Roots()
@@ -75,7 +74,7 @@ func TestHandler(t *testing.T) {
7574
eventBuilder(4, false, 0xeeee, 5),
7675
}
7776

78-
err = handler(gm, events)
77+
err = gm.handler(events)
7978
require.NoError(t, err)
8079

8180
// Root[1] should become [0]
@@ -99,7 +98,7 @@ func TestHandler(t *testing.T) {
9998
eventBuilder(3, false, 0xeeee, 5),
10099
}
101100

102-
err = handler(gm, events)
101+
err = gm.handler(events)
103102
require.NoError(t, err)
104103

105104
roots = gm.rootTracker.Roots()
@@ -113,7 +112,7 @@ func TestHandler(t *testing.T) {
113112
// Adding multiple events for same block
114113
events = []*contracts.RLNMemberRegistered{}
115114

116-
err = handler(gm, events)
115+
err = gm.handler(events)
117116
require.NoError(t, err)
118117

119118
roots = gm.rootTracker.Roots()

0 commit comments

Comments
 (0)