mirror of https://github.com/status-im/go-waku.git
feat(rln): multiple acceptable roots
This commit is contained in:
parent
fdfa1d0bf4
commit
665968deea
|
@ -36,13 +36,6 @@ func RlnRelayStatic(
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// add members to the Merkle tree
|
|
||||||
for _, member := range group {
|
|
||||||
if err := rlnInstance.InsertMember(member); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the WakuRLNRelay
|
// create the WakuRLNRelay
|
||||||
rlnPeer := &WakuRLNRelay{
|
rlnPeer := &WakuRLNRelay{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
|
@ -55,6 +48,20 @@ func RlnRelayStatic(
|
||||||
nullifierLog: make(map[r.Epoch][]r.ProofMetadata),
|
nullifierLog: make(map[r.Epoch][]r.ProofMetadata),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
root, err := rlnPeer.RLN.GetMerkleRoot()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rlnPeer.validMerkleRoots = append(rlnPeer.validMerkleRoots, root)
|
||||||
|
|
||||||
|
// add members to the Merkle tree
|
||||||
|
for _, member := range group {
|
||||||
|
if err := rlnPeer.insertMember(member); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// adds a topic validator for the supplied pubsub topic at the relay protocol
|
// adds a topic validator for the supplied pubsub topic at the relay protocol
|
||||||
// messages published on this pubsub topic will be relayed upon a successful validation, otherwise they will be dropped
|
// messages published on this pubsub topic will be relayed upon a successful validation, otherwise they will be dropped
|
||||||
// the topic validator checks for the correct non-spamming proof of the message
|
// the topic validator checks for the correct non-spamming proof of the message
|
||||||
|
@ -106,6 +113,13 @@ func RlnRelayDynamic(
|
||||||
registrationHandler: registrationHandler,
|
registrationHandler: registrationHandler,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
root, err := rlnPeer.RLN.GetMerkleRoot()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rlnPeer.validMerkleRoots = append(rlnPeer.validMerkleRoots, root)
|
||||||
|
|
||||||
// prepare rln membership key pair
|
// prepare rln membership key pair
|
||||||
if memKeyPair == nil && ethAccountPrivateKey != nil {
|
if memKeyPair == nil && ethAccountPrivateKey != nil {
|
||||||
log.Debug("no rln-relay key is provided, generating one")
|
log.Debug("no rln-relay key is provided, generating one")
|
||||||
|
@ -130,9 +144,7 @@ func RlnRelayDynamic(
|
||||||
}
|
}
|
||||||
|
|
||||||
handler := func(pubkey r.IDCommitment, index r.MembershipIndex) error {
|
handler := func(pubkey r.IDCommitment, index r.MembershipIndex) error {
|
||||||
log.Debug("a new key is added", zap.Binary("pubkey", pubkey[:]))
|
return rlnPeer.insertMember(pubkey)
|
||||||
// assuming all the members arrive in order
|
|
||||||
return rlnInstance.InsertMember(pubkey)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
errChan := make(chan error)
|
errChan := make(chan error)
|
||||||
|
|
|
@ -30,6 +30,8 @@ const MAX_EPOCH_GAP = int64(MAX_CLOCK_GAP_SECONDS / r.EPOCH_UNIT_SECONDS)
|
||||||
|
|
||||||
type RegistrationHandler = func(tx *types.Transaction)
|
type RegistrationHandler = func(tx *types.Transaction)
|
||||||
|
|
||||||
|
const AcceptableRootWindowSize = 5
|
||||||
|
|
||||||
type WakuRLNRelay struct {
|
type WakuRLNRelay struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
|
|
||||||
|
@ -52,6 +54,8 @@ type WakuRLNRelay struct {
|
||||||
pubsubTopic string
|
pubsubTopic string
|
||||||
contentTopic string
|
contentTopic string
|
||||||
|
|
||||||
|
validMerkleRoots []r.MerkleNode
|
||||||
|
|
||||||
// the log of nullifiers and Shamir shares of the past messages grouped per epoch
|
// the log of nullifiers and Shamir shares of the past messages grouped per epoch
|
||||||
nullifierLogLock sync.RWMutex
|
nullifierLogLock sync.RWMutex
|
||||||
nullifierLog map[r.Epoch][]r.ProofMetadata
|
nullifierLog map[r.Epoch][]r.ProofMetadata
|
||||||
|
@ -307,6 +311,25 @@ func (r *WakuRLNRelay) MembershipContractAddress() common.Address {
|
||||||
return r.membershipContractAddress
|
return r.membershipContractAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *WakuRLNRelay) insertMember(pubkey [32]byte) error {
|
||||||
|
r.log.Debug("a new key is added", zap.Binary("pubkey", pubkey[:]))
|
||||||
|
// assuming all the members arrive in order
|
||||||
|
err := r.RLN.InsertMember(pubkey)
|
||||||
|
if err == nil {
|
||||||
|
newRoot, err := r.RLN.GetMerkleRoot()
|
||||||
|
if err != nil {
|
||||||
|
r.log.Error("inserting member into merkletree", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r.validMerkleRoots = append(r.validMerkleRoots, newRoot)
|
||||||
|
if len(r.validMerkleRoots) > AcceptableRootWindowSize {
|
||||||
|
r.validMerkleRoots = r.validMerkleRoots[1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
type SpamHandler = func(message *pb.WakuMessage) error
|
type SpamHandler = func(message *pb.WakuMessage) error
|
||||||
|
|
||||||
// this function sets a validator for the waku messages published on the supplied pubsubTopic and contentTopic
|
// this function sets a validator for the waku messages published on the supplied pubsubTopic and contentTopic
|
||||||
|
|
Loading…
Reference in New Issue