waku-org/go-waku

View on GitHub
waku/v2/protocol/rln/common.go

Summary

Maintainability
A
0 mins
Test Coverage
A
92%
package rln

import (
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/waku-org/go-waku/waku/v2/protocol/pb"
    rlnpb "github.com/waku-org/go-waku/waku/v2/protocol/rln/pb"
    "github.com/waku-org/go-zerokit-rln/rln"
    "google.golang.org/protobuf/proto"
)

type messageValidationResult int

const (
    validationError messageValidationResult = iota
    validMessage
    invalidMessage
    spamMessage
)

// the maximum clock difference between peers in seconds
const maxClockGapSeconds = 20

// maximum allowed gap between the epochs of messages' RateLimitProofs
const maxEpochGap = int64(maxClockGapSeconds / rln.EPOCH_UNIT_SECONDS)

// acceptable roots for merkle root validation of incoming messages
const acceptableRootWindowSize = 5

type RegistrationHandler = func(tx *types.Transaction)

type SpamHandler = func(msg *pb.WakuMessage, topic string) error

func toRLNSignal(wakuMessage *pb.WakuMessage) []byte {
    if wakuMessage == nil {
        return []byte{}
    }

    contentTopicBytes := []byte(wakuMessage.ContentTopic)
    return append(wakuMessage.Payload, contentTopicBytes...)
}

// Bytres2RateLimitProof converts a slice of bytes into a RateLimitProof instance
func BytesToRateLimitProof(data []byte) (*rln.RateLimitProof, error) {
    if data == nil {
        return nil, nil
    }

    rateLimitProof := &rlnpb.RateLimitProof{}
    err := proto.Unmarshal(data, rateLimitProof)
    if err != nil {
        return nil, err
    }

    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)),
    }

    return result, nil
}