refactor: return errors instead of bools and add String funcs

This commit is contained in:
Richard Ramos 2022-08-04 16:30:53 -04:00
parent e9ce4db29a
commit b09dd99607
No known key found for this signature in database
GPG Key ID: BD36D48BC9FFC88C
3 changed files with 56 additions and 28 deletions

View File

@ -192,7 +192,7 @@ func (r *RLN) Verify(data []byte, proof RateLimitProof) bool {
} }
// InsertMember adds the member to the tree // InsertMember adds the member to the tree
func (r *RLN) InsertMember(idComm IDCommitment) bool { func (r *RLN) InsertMember(idComm IDCommitment) error {
buf := toBuffer(idComm[:]) buf := toBuffer(idComm[:])
size := int(unsafe.Sizeof(buf)) size := int(unsafe.Sizeof(buf))
@ -200,15 +200,22 @@ func (r *RLN) InsertMember(idComm IDCommitment) bool {
*in = buf *in = buf
res := C.update_next_member(r.ptr, in) res := C.update_next_member(r.ptr, in)
return bool(res)
if !bool(res) {
return errors.New("couldn't insert member")
}
return nil
} }
// DeleteMember removes an IDCommitment key from the tree. The index // DeleteMember removes an IDCommitment key from the tree. The index
// parameter is the position of the id commitment key to be deleted from the tree. // parameter is the position of the id commitment key to be deleted from the tree.
// The deleted id commitment key is replaced with a zero leaf // The deleted id commitment key is replaced with a zero leaf
func (r *RLN) DeleteMember(index MembershipIndex) bool { func (r *RLN) DeleteMember(index MembershipIndex) error {
deletionSuccess := bool(C.delete_member(r.ptr, C.ulong(index))) deletionSuccess := bool(C.delete_member(r.ptr, C.ulong(index)))
return deletionSuccess if !bool(deletionSuccess) {
return errors.New("couldn't delete member")
}
return nil
} }
// GetMerkleRoot reads the Merkle Tree root after insertion // GetMerkleRoot reads the Merkle Tree root after insertion
@ -233,13 +240,13 @@ func (r *RLN) GetMerkleRoot() (MerkleNode, error) {
} }
// AddAll adds members to the Merkle tree // AddAll adds members to the Merkle tree
func (r *RLN) AddAll(list []IDCommitment) bool { func (r *RLN) AddAll(list []IDCommitment) error {
for _, member := range list { for _, member := range list {
if !r.InsertMember(member) { if err := r.InsertMember(member); err != nil {
return false return err
} }
} }
return true return nil
} }
// CalcMerkleRoot returns the root of the Merkle tree that is computed from the supplied list // CalcMerkleRoot returns the root of the Merkle tree that is computed from the supplied list
@ -251,8 +258,8 @@ func CalcMerkleRoot(list []IDCommitment, params []byte) (MerkleNode, error) {
// create a Merkle tree // create a Merkle tree
for _, c := range list { for _, c := range list {
if !rln.InsertMember(c) { if err := rln.InsertMember(c); err != nil {
return MerkleNode{}, errors.New("could not add member") return MerkleNode{}, err
} }
} }
@ -280,8 +287,8 @@ func CreateMembershipList(n int, params []byte) ([]MembershipKeyPair, MerkleNode
output = append(output, *keypair) output = append(output, *keypair)
// insert the key to the Merkle tree // insert the key to the Merkle tree
if !rln.InsertMember(keypair.IDCommitment) { if err := rln.InsertMember(keypair.IDCommitment); err != nil {
return nil, MerkleNode{}, errors.New("could not insert member") return nil, MerkleNode{}, err
} }
} }

View File

@ -74,16 +74,16 @@ func (s *RLNSuite) TestInsertMember() {
keypair, err := rln.MembershipKeyGen() keypair, err := rln.MembershipKeyGen()
s.NoError(err) s.NoError(err)
inserted := rln.InsertMember(keypair.IDCommitment) err = rln.InsertMember(keypair.IDCommitment)
s.True(inserted) s.NoError(err)
} }
func (s *RLNSuite) TestRemoveMember() { func (s *RLNSuite) TestRemoveMember() {
rln, err := NewRLNWithDepth(32, s.parameters) rln, err := NewRLNWithDepth(32, s.parameters)
s.NoError(err) s.NoError(err)
deleted := rln.DeleteMember(MembershipIndex(0)) err = rln.DeleteMember(MembershipIndex(0))
s.True(deleted) s.NoError(err)
} }
func (s *RLNSuite) TestMerkleTreeConsistenceBetweenDeletionAndInsertion() { func (s *RLNSuite) TestMerkleTreeConsistenceBetweenDeletionAndInsertion() {
@ -97,8 +97,8 @@ func (s *RLNSuite) TestMerkleTreeConsistenceBetweenDeletionAndInsertion() {
keypair, err := rln.MembershipKeyGen() keypair, err := rln.MembershipKeyGen()
s.NoError(err) s.NoError(err)
inserted := rln.InsertMember(keypair.IDCommitment) err = rln.InsertMember(keypair.IDCommitment)
s.True(inserted) s.NoError(err)
// read the Merkle Tree root after insertion // read the Merkle Tree root after insertion
root2, err := rln.GetMerkleRoot() root2, err := rln.GetMerkleRoot()
@ -107,8 +107,8 @@ func (s *RLNSuite) TestMerkleTreeConsistenceBetweenDeletionAndInsertion() {
// delete the first member // delete the first member
deleted_member_index := MembershipIndex(0) deleted_member_index := MembershipIndex(0)
deleted := rln.DeleteMember(deleted_member_index) err = rln.DeleteMember(deleted_member_index)
s.True(deleted) s.NoError(err)
// read the Merkle Tree root after the deletion // read the Merkle Tree root after the deletion
root3, err := rln.GetMerkleRoot() root3, err := rln.GetMerkleRoot()
@ -180,18 +180,18 @@ func (s *RLNSuite) TestValidProof() {
// Create a Merkle tree with random members // Create a Merkle tree with random members
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
memberIsAdded := false var err error
if i == index { if i == index {
// insert the current peer's pk // insert the current peer's pk
memberIsAdded = rln.InsertMember(memKeys.IDCommitment) err = rln.InsertMember(memKeys.IDCommitment)
} else { } else {
// create a new key pair // create a new key pair
memberKeys, err := rln.MembershipKeyGen() memberKeys, err := rln.MembershipKeyGen()
s.NoError(err) s.NoError(err)
memberIsAdded = rln.InsertMember(memberKeys.IDCommitment) err = rln.InsertMember(memberKeys.IDCommitment)
} }
s.True(memberIsAdded) s.NoError(err)
} }
// prepare the message // prepare the message
@ -222,18 +222,18 @@ func (s *RLNSuite) TestInvalidProof() {
// Create a Merkle tree with random members // Create a Merkle tree with random members
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
memberIsAdded := false var err error
if i == index { if i == index {
// insert the current peer's pk // insert the current peer's pk
memberIsAdded = rln.InsertMember(memKeys.IDCommitment) err = rln.InsertMember(memKeys.IDCommitment)
} else { } else {
// create a new key pair // create a new key pair
memberKeys, err := rln.MembershipKeyGen() memberKeys, err := rln.MembershipKeyGen()
s.NoError(err) s.NoError(err)
memberIsAdded = rln.InsertMember(memberKeys.IDCommitment) err = rln.InsertMember(memberKeys.IDCommitment)
} }
s.True(memberIsAdded) s.NoError(err)
} }
// prepare the message // prepare the message

View File

@ -3,22 +3,43 @@ package rln
import ( import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"encoding/hex"
"time" "time"
) )
// IDKey is an identity key as defined in https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Membership // IDKey is an identity key as defined in https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Membership
type IDKey [32]byte type IDKey [32]byte
func (i IDKey) String() string {
return hex.EncodeToString(i[:])
}
// IDCommintment is hash of identity key as defined in https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Membership // IDCommintment is hash of identity key as defined in https://hackmd.io/tMTLMYmTR5eynw2lwK9n1w?view#Membership
type IDCommitment [32]byte type IDCommitment [32]byte
func (i IDCommitment) String() string {
return hex.EncodeToString(i[:])
}
// Each node of the Merkle tee is a Poseidon hash which is a 32 byte value // Each node of the Merkle tee is a Poseidon hash which is a 32 byte value
type MerkleNode [32]byte type MerkleNode [32]byte
func (m MerkleNode) String() string {
return hex.EncodeToString(m[:])
}
type Nullifier [32]byte type Nullifier [32]byte
func (n Nullifier) String() string {
return hex.EncodeToString(n[:])
}
type ZKSNARK [256]byte type ZKSNARK [256]byte
func (z ZKSNARK) String() string {
return hex.EncodeToString(z[:])
}
// Custom data types defined for waku rln relay ------------------------- // Custom data types defined for waku rln relay -------------------------
type MembershipKeyPair struct { type MembershipKeyPair struct {