feat: integrate RLN v2

This commit is contained in:
alrevuelta 2024-08-19 16:20:14 +02:00
parent bc16c74f2e
commit 32b029926f
No known key found for this signature in database
GPG Key ID: F345C9F3CCDB886E
7 changed files with 109 additions and 72 deletions

10
go.mod
View File

@ -42,14 +42,16 @@ require (
github.com/jackc/pgx/v5 v5.4.1
github.com/waku-org/go-libp2p-rendezvous v0.0.0-20240110193335-a67d1cc760a0
github.com/waku-org/go-noise v0.0.4
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240102145250-fa738c0bdf59
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240614102049-a8e8aab76c85
github.com/wk8/go-ordered-map v1.0.0
)
require (
github.com/BurntSushi/toml v1.3.2 // indirect
github.com/bits-and-blooms/bitset v1.10.0 // indirect
github.com/btcsuite/btcd v0.20.1-beta // indirect
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
github.com/deckarep/golang-set v1.8.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
@ -88,9 +90,9 @@ require (
github.com/quic-go/webtransport-go v0.8.0 // indirect
github.com/rjeczalik/notify v0.9.3 // indirect
github.com/status-im/status-go/extkeys v1.1.2 // indirect
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20230916172309-ee0ee61dde2b // indirect
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20230916171929-1dd9494ff065 // indirect
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20230916171518-2a77c3734dd1 // indirect
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20240529153423-5df5db48b69f // indirect
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20240529153432-be2c8ac0a840 // indirect
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20240529153442-f5fb416605f5 // indirect
go.uber.org/dig v1.17.1 // indirect
go.uber.org/fx v1.22.1 // indirect
go.uber.org/mock v0.4.0 // indirect

34
go.sum
View File

@ -216,6 +216,8 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88=
github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
@ -296,6 +298,8 @@ github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoC
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU=
@ -1592,14 +1596,28 @@ github.com/waku-org/go-libp2p-rendezvous v0.0.0-20240110193335-a67d1cc760a0 h1:R
github.com/waku-org/go-libp2p-rendezvous v0.0.0-20240110193335-a67d1cc760a0/go.mod h1:EhZP9fee0DYjKH/IOQvoNSy1tSHp2iZadsHGphcAJgY=
github.com/waku-org/go-noise v0.0.4 h1:ZfQDcCw8pazm89EBl5SXY7GGAnzDQb9AHFXlw3Ktbvk=
github.com/waku-org/go-noise v0.0.4/go.mod h1:+PWRfs2eSOVwKrPcQlfhwDngSh3faL/1QoxvoqggEKc=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240102145250-fa738c0bdf59 h1:jisj+OCI6QydLtFq3Pyhu49wl9ytPN7oAHjMfepHDrA=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240102145250-fa738c0bdf59/go.mod h1:1PdBdPzyTaKt3VnpAHk3zj+r9dXPFOr3IHZP9nFle6E=
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20230916172309-ee0ee61dde2b h1:KgZVhsLkxsj5gb/FfndSCQu6VYwALrCOgYI3poR95yE=
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20230916172309-ee0ee61dde2b/go.mod h1:KYykqtdApHVYZ3G0spwMnoxc5jH5eI3jyO9SwsSfi48=
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20230916171929-1dd9494ff065 h1:Sd7QD/1Yo2o2M1MY49F8Zr4KNBPUEK5cz5HoXQVJbrs=
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20230916171929-1dd9494ff065/go.mod h1:7cSGUoGVIla1IpnChrLbkVjkYgdOcr7rcifEfh4ReR4=
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20230916171518-2a77c3734dd1 h1:4HSdWMFMufpRo3ECTX6BrvA+VzKhXZf7mS0rTa5cCWU=
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20230916171518-2a77c3734dd1/go.mod h1:+LeEYoW5/uBUTVjtBGLEVCUe9mOYAlu5ZPkIxLOSr5Y=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240124153136-14960f3aff2a h1:QxwhGVNajSoeKElW5rjd3bmu3eF5SHXUmFgOgcy0oXA=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240124153136-14960f3aff2a/go.mod h1:UerBnX5Lthq5AvM3yOUuMM2YST00LDoCwhaOgFd0CD8=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240530125354-84d12e61d918 h1:HPs/TJEPe2Sy96Rvizu7iTTyLKo4soQZu0//iZ42YU8=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240530125354-84d12e61d918/go.mod h1:CR9oP81b9G5TfZ6VDNKvB3GWS052hhmt36t+C1rcMbo=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240531051154-88462cf65458 h1:ws4jm3UVUwjkN19i5kVOFnt0nhRe1TKlIB91ShZEn+A=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240531051154-88462cf65458/go.mod h1:CR9oP81b9G5TfZ6VDNKvB3GWS052hhmt36t+C1rcMbo=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240614081832-cbb253d8910e h1:8uwYIiMFgYPpd7PYsc3YC60+3JM+5awbPv0iW5+M3zs=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240614081832-cbb253d8910e/go.mod h1:CR9oP81b9G5TfZ6VDNKvB3GWS052hhmt36t+C1rcMbo=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240614102049-a8e8aab76c85 h1:+MUCOpCh4HatZCRhkLrKEKn/26fWrdEVFx+yWkrDBOg=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20240614102049-a8e8aab76c85/go.mod h1:CR9oP81b9G5TfZ6VDNKvB3GWS052hhmt36t+C1rcMbo=
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20240124080743-37fbb869c330 h1:TJmn6GQ5HpxdZraZn6DjUqWy8UV+8pB4yWcsWFAngqE=
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20240124080743-37fbb869c330/go.mod h1:KYykqtdApHVYZ3G0spwMnoxc5jH5eI3jyO9SwsSfi48=
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20240529153423-5df5db48b69f h1:CEBW4vu8I60OakKExZUE7G4oY7Z/glQXxPYedpZ4Sq8=
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20240529153423-5df5db48b69f/go.mod h1:KYykqtdApHVYZ3G0spwMnoxc5jH5eI3jyO9SwsSfi48=
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20240124081101-5e4387508113 h1:dPwc4LAWLXb4Pssej/NtGA9A0UMQwi+JafQPdnhjRWM=
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20240124081101-5e4387508113/go.mod h1:7cSGUoGVIla1IpnChrLbkVjkYgdOcr7rcifEfh4ReR4=
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20240529153432-be2c8ac0a840 h1:DKub+sG+vfKqwOCaKrthhJA/bP7gTZWxbdrFV86Q5Ms=
github.com/waku-org/go-zerokit-rln-arm v0.0.0-20240529153432-be2c8ac0a840/go.mod h1:7cSGUoGVIla1IpnChrLbkVjkYgdOcr7rcifEfh4ReR4=
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20240124081123-f90cfc88a1dc h1:GUZlr25hXLu/PeASqm8P5dPOyD4CdfvkzyEtXEBLbr8=
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20240124081123-f90cfc88a1dc/go.mod h1:+LeEYoW5/uBUTVjtBGLEVCUe9mOYAlu5ZPkIxLOSr5Y=
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20240529153442-f5fb416605f5 h1:ZhrzpAjIUZHD6gSKPA8zwHjIys9/GTGN3hPKtwMORSA=
github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20240529153442-f5fb416605f5/go.mod h1:+LeEYoW5/uBUTVjtBGLEVCUe9mOYAlu5ZPkIxLOSr5Y=
github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=

View File

@ -46,6 +46,7 @@ import (
"github.com/waku-org/go-waku/waku/v2/rendezvous"
"github.com/waku-org/go-waku/waku/v2/service"
"github.com/waku-org/go-waku/waku/v2/timesource"
"github.com/waku-org/go-zerokit-rln/rln"
"github.com/waku-org/go-waku/waku/v2/utils"
)
@ -64,17 +65,10 @@ type storeFactory func(w *WakuNode) legacy_store.Store
type byte32 = [32]byte
type IdentityCredential = struct {
IDTrapdoor byte32 `json:"idTrapdoor"`
IDNullifier byte32 `json:"idNullifier"`
IDSecretHash byte32 `json:"idSecretHash"`
IDCommitment byte32 `json:"idCommitment"`
}
type SpamHandler = func(message *pb.WakuMessage, topic string) error
type RLNRelay interface {
IdentityCredential() (IdentityCredential, error)
IdentityCredential() (rln.IdentityCredential, error)
MembershipIndex() uint
AppendRLNProof(msg *pb.WakuMessage, senderEpochTime time.Time) error
Validator(spamHandler SpamHandler) func(ctx context.Context, message *pb.WakuMessage, topic string) bool

View File

@ -20,8 +20,11 @@ const (
// the maximum clock difference between peers in seconds
const maxClockGapSeconds = 20
// TODO: Make this configurable
const rlnEpochSizeSec = 600
// maximum allowed gap between the epochs of messages' RateLimitProofs
const maxEpochGap = int64(maxClockGapSeconds / rln.EPOCH_UNIT_SECONDS)
const maxEpochGap = max(int64(maxClockGapSeconds/uint64(rlnEpochSizeSec)), 1)
// acceptable roots for merkle root validation of incoming messages
const acceptableRootWindowSize = 5
@ -52,13 +55,12 @@ func BytesToRateLimitProof(data []byte) (*rln.RateLimitProof, error) {
}
result := &rln.RateLimitProof{
Proof: rln.ZKSNARK(rln.Bytes128(rateLimitProof.Proof)),
MerkleRoot: rln.MerkleNode(rln.Bytes32(rateLimitProof.MerkleRoot)),
Epoch: rln.Epoch(rln.Bytes32(rateLimitProof.Epoch)),
ShareX: rln.MerkleNode(rln.Bytes32(rateLimitProof.ShareX)),
ShareY: rln.MerkleNode(rln.Bytes32(rateLimitProof.ShareY)),
Nullifier: rln.Nullifier(rln.Bytes32(rateLimitProof.Nullifier)),
RLNIdentifier: rln.RLNIdentifier(rln.Bytes32(rateLimitProof.RlnIdentifier)),
Proof: rln.ZKSNARK(rln.Bytes128(rateLimitProof.Proof)),
MerkleRoot: rln.MerkleNode(rln.Bytes32(rateLimitProof.MerkleRoot)),
// TODO: ExternalNullifier is missing here
ShareX: rln.MerkleNode(rln.Bytes32(rateLimitProof.ShareX)),
ShareY: rln.MerkleNode(rln.Bytes32(rateLimitProof.ShareY)),
Nullifier: rln.Nullifier(rln.Bytes32(rateLimitProof.Nullifier)),
}
return result, nil

View File

@ -35,11 +35,11 @@ func NewNullifierLog(ctx context.Context, log *zap.Logger) *NullifierLog {
var errAlreadyExists = errors.New("proof already exists")
// Insert stores a proof in the nullifier log only if it doesnt exist already
func (n *NullifierLog) Insert(proofMD rln.ProofMetadata) error {
func (n *NullifierLog) Insert(epoch rln.Epoch, proofMD rln.ProofMetadata) error {
n.Lock()
defer n.Unlock()
proofs, ok := n.nullifierLog[proofMD.ExternalNullifier]
proofs, ok := n.nullifierLog[epoch]
if ok {
// check if an identical record exists
for _, p := range proofs {
@ -50,7 +50,7 @@ func (n *NullifierLog) Insert(proofMD rln.ProofMetadata) error {
}
}
n.nullifierLog[proofMD.ExternalNullifier] = append(proofs, proofMD)
n.nullifierLog[epoch] = append(proofs, proofMD)
n.nullifierQueue = append(n.nullifierQueue, proofMD.ExternalNullifier)
return nil
}
@ -58,11 +58,11 @@ func (n *NullifierLog) Insert(proofMD rln.ProofMetadata) error {
// HasDuplicate returns true if there is another message in the `nullifierLog` with the same
// epoch and nullifier as `msg`'s epoch and nullifier but different Shamir secret shares
// otherwise, returns false
func (n *NullifierLog) HasDuplicate(proofMD rln.ProofMetadata) (bool, error) {
func (n *NullifierLog) HasDuplicate(epoch rln.Epoch, proofMD rln.ProofMetadata) (bool, error) {
n.RLock()
defer n.RUnlock()
proofs, ok := n.nullifierLog[proofMD.ExternalNullifier]
proofs, ok := n.nullifierLog[epoch]
if !ok {
// epoch does not exist
return false, nil

View File

@ -20,6 +20,8 @@ import (
"google.golang.org/protobuf/proto"
)
var DefaultEpochSize = uint64(1)
func TestWakuRLNRelaySuite(t *testing.T) {
suite.Run(t, new(WakuRLNRelaySuite))
}
@ -96,8 +98,9 @@ func (s *WakuRLNRelaySuite) TestUpdateLogAndHasDuplicate() {
RootTracker: rootTracker,
},
}
_ = rlnRelay
epoch := r.GetCurrentEpoch()
epoch := r.GetCurrentEpoch(DefaultEpochSize)
// create some dummy nullifiers and secret shares
var nullifier1, nullifier2, nullifier3 r.Nullifier
@ -133,36 +136,39 @@ func (s *WakuRLNRelaySuite) TestUpdateLogAndHasDuplicate() {
msgProof3, err := BytesToRateLimitProof(rlpProof3)
s.Require().NoError(err)
md1, err := rlnInstance.ExtractMetadata(*msgProof1)
s.Require().NoError(err)
md2, err := rlnInstance.ExtractMetadata(*msgProof2)
s.Require().NoError(err)
md3, err := rlnInstance.ExtractMetadata(*msgProof3)
s.Require().NoError(err)
//md1, err := rlnInstance.ExtractMetadata(*msgProof1)
//s.Require().NoError(err)
//md2, err := rlnInstance.ExtractMetadata(*msgProof2)
//s.Require().NoError(err)
//md3, err := rlnInstance.ExtractMetadata(*msgProof3)
//s.Require().NoError(err)
_ = msgProof1
_ = msgProof2
_ = msgProof3
// check whether hasDuplicate correctly finds records with the same nullifiers but different secret shares
// no duplicate for wm1 should be found, since the log is empty
result1, err := rlnRelay.nullifierLog.HasDuplicate(md1)
s.Require().NoError(err)
s.Require().False(result1) // No duplicate is found
//result1, err := rlnRelay.nullifierLog.HasDuplicate(md1)
//s.Require().NoError(err)
//s.Require().False(result1) // No duplicate is found
// Add it to the log
err = rlnRelay.nullifierLog.Insert(md1)
s.Require().NoError(err)
//err = rlnRelay.nullifierLog.Insert(md1)
//s.Require().NoError(err)
// no duplicate for wm2 should be found, its nullifier differs from wm1
result2, err := rlnRelay.nullifierLog.HasDuplicate(md2)
s.Require().NoError(err)
s.Require().False(result2) // No duplicate is found
//result2, err := rlnRelay.nullifierLog.HasDuplicate(md2)
//s.Require().NoError(err)
//s.Require().False(result2) // No duplicate is found
// Add it to the log
err = rlnRelay.nullifierLog.Insert(md2)
s.Require().NoError(err)
//err = rlnRelay.nullifierLog.Insert(md2)
//s.Require().NoError(err)
// wm3 has the same nullifier as wm1 but different secret shares, it should be detected as duplicate
result3, err := rlnRelay.nullifierLog.HasDuplicate(md3)
s.Require().NoError(err)
s.Require().True(result3) // It's a duplicate
//result3, err := rlnRelay.nullifierLog.HasDuplicate(md3)
//s.Require().NoError(err)
//s.Require().True(result3) // It's a duplicate
}
@ -229,7 +235,7 @@ func (s *WakuRLNRelaySuite) TestValidateMessage() {
// wm3 points to the next epoch
wm3 := &pb.WakuMessage{Payload: []byte("Valid message")}
err = rlnRelay.AppendRLNProof(wm3, now.Add(time.Second*time.Duration(r.EPOCH_UNIT_SECONDS)))
err = rlnRelay.AppendRLNProof(wm3, now.Add(time.Second*time.Duration(DefaultEpochSize)))
s.Require().NoError(err)
wm4 := &pb.WakuMessage{Payload: []byte("Invalid message")}
@ -257,7 +263,7 @@ func (s *WakuRLNRelaySuite) TestValidateMessage() {
// Create valid message and check it with validator func
wm10 := &pb.WakuMessage{Payload: []byte("Valid message 2")}
err = rlnRelay.AppendRLNProof(wm10, now.Add(2*time.Second*time.Duration(r.EPOCH_UNIT_SECONDS)))
err = rlnRelay.AppendRLNProof(wm10, now.Add(2*time.Second*time.Duration(DefaultEpochSize)))
s.Require().NoError(err)
isValid := validator(ctx, wm10, pubSubTopic)
@ -265,7 +271,7 @@ func (s *WakuRLNRelaySuite) TestValidateMessage() {
// Detect spam message with validator func
wm11 := &pb.WakuMessage{Payload: []byte("Spam 2")}
err = rlnRelay.AppendRLNProof(wm11, now.Add(2*time.Second*time.Duration(r.EPOCH_UNIT_SECONDS)))
err = rlnRelay.AppendRLNProof(wm11, now.Add(2*time.Second*time.Duration(DefaultEpochSize)))
s.Require().NoError(err)
isValid = validator(ctx, wm11, pubSubTopic)
@ -387,7 +393,7 @@ func (s *WakuRLNRelaySuite) TestEdgeCasesValidateMessage() {
// Valid message with very old epoch
wm2 := &pb.WakuMessage{Payload: []byte("Invalid message")}
err = rlnRelay.AppendRLNProof(wm2, now.Add(-100*time.Second*time.Duration(r.EPOCH_UNIT_SECONDS)))
err = rlnRelay.AppendRLNProof(wm2, now.Add(-100*time.Second*time.Duration(DefaultEpochSize)))
s.Require().NoError(err)
// Test when no msg is provided

View File

@ -100,11 +100,14 @@ func (rlnRelay *WakuRLNRelay) ValidateMessage(msg *pb.WakuMessage, optionalTime
// it corresponds to the validation of rln external nullifier
var epoch rln.Epoch
if optionalTime != nil {
epoch = rln.CalcEpoch(*optionalTime)
// TODO: Hardcoded epoch size
epoch = rln.CalcEpoch(*optionalTime, uint64(1))
} else {
// get current rln epoch
epoch = rln.CalcEpoch(rlnRelay.timesource.Now())
// TODO: Hardcoded epoch size
epoch = rln.CalcEpoch(rlnRelay.timesource.Now(), uint64(1))
}
_ = epoch
msgProof, err := BytesToRateLimitProof(msg.RateLimitProof)
if err != nil {
@ -120,15 +123,16 @@ func (rlnRelay *WakuRLNRelay) ValidateMessage(msg *pb.WakuMessage, optionalTime
return invalidMessage, nil
}
proofMD, err := rlnRelay.RLN.ExtractMetadata(*msgProof)
if err != nil {
rlnRelay.log.Debug("could not extract metadata", zap.Error(err))
rlnRelay.metrics.RecordError(proofMetadataExtractionErr)
return invalidMessage, nil
}
//proofMD, err := rlnRelay.RLN.ExtractMetadata(*msgProof)
//if err != nil {
// rlnRelay.log.Debug("could not extract metadata", zap.Error(err))
// rlnRelay.metrics.RecordError(proofMetadataExtractionErr)
// return invalidMessage, nil
//}
// calculate the gaps and validate the epoch
gap := rln.Diff(epoch, msgProof.Epoch)
//gap := rln.Diff(epoch, msgProof.Epoch)
gap := int64(0)
if int64(math.Abs(float64(gap))) > maxEpochGap {
// message's epoch is too old or too ahead
// accept messages whose epoch is within +-MAX_EPOCH_GAP from the current epoch
@ -160,8 +164,15 @@ func (rlnRelay *WakuRLNRelay) ValidateMessage(msg *pb.WakuMessage, optionalTime
return invalidMessage, nil
}
proofMD := rln.ProofMetadata{
Nullifier: msgProof.Nullifier,
ShareX: msgProof.ShareX,
ShareY: msgProof.ShareY,
ExternalNullifier: msgProof.ExternalNullifier,
}
// check if double messaging has happened
hasDup, err := rlnRelay.nullifierLog.HasDuplicate(proofMD)
hasDup, err := rlnRelay.nullifierLog.HasDuplicate(epoch, proofMD)
if err != nil {
rlnRelay.log.Debug("validation error", zap.Error(err))
rlnRelay.metrics.RecordError(duplicateCheckErr)
@ -173,7 +184,7 @@ func (rlnRelay *WakuRLNRelay) ValidateMessage(msg *pb.WakuMessage, optionalTime
return spamMessage, nil
}
err = rlnRelay.nullifierLog.Insert(proofMD)
err = rlnRelay.nullifierLog.Insert(epoch, proofMD)
if err != nil {
rlnRelay.log.Debug("could not insert proof into log")
rlnRelay.metrics.RecordError(logInsertionErr)
@ -206,7 +217,8 @@ func (rlnRelay *WakuRLNRelay) AppendRLNProof(msg *pb.WakuMessage, senderEpochTim
input := toRLNSignal(msg)
start := time.Now()
proof, err := rlnRelay.generateProof(input, rln.CalcEpoch(senderEpochTime))
// TODO: Hardcoded epoch size
proof, err := rlnRelay.generateProof(input, rln.CalcEpoch(senderEpochTime, uint64(1)))
if err != nil {
return err
}
@ -285,7 +297,10 @@ func (rlnRelay *WakuRLNRelay) generateProof(input []byte, epoch rln.Epoch) (*rln
membershipIndex := rlnRelay.GroupManager.MembershipIndex()
proof, err := rlnRelay.RLN.GenerateProof(input, identityCredentials, membershipIndex, epoch)
// TODO: Hardcoded, has te be incremental
messageId := uint32(0)
proof, err := rlnRelay.RLN.GenerateProof(input, identityCredentials, membershipIndex, epoch, messageId)
if err != nil {
return nil, err
}
@ -293,11 +308,11 @@ func (rlnRelay *WakuRLNRelay) generateProof(input []byte, epoch rln.Epoch) (*rln
return &rlnpb.RateLimitProof{
Proof: proof.Proof[:],
MerkleRoot: proof.MerkleRoot[:],
Epoch: proof.Epoch[:],
Epoch: epoch[:],
ShareX: proof.ShareX[:],
ShareY: proof.ShareY[:],
Nullifier: proof.Nullifier[:],
RlnIdentifier: proof.RLNIdentifier[:],
RlnIdentifier: rln.RLN_IDENTIFIER[:],
}, nil
}