Skip to content

Commit a49b6a1

Browse files
authored
feat(rln-relay): integrate get_leaf ffi api (#1790)
1 parent 4d82769 commit a49b6a1

File tree

4 files changed

+57
-1
lines changed

4 files changed

+57
-1
lines changed

tests/v2/waku_rln_relay/test_waku_rln_relay.nim

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,39 @@ suite "Waku rln relay":
147147
check:
148148
memberAdded
149149

150+
test "getMember Nim wrapper":
151+
# create an RLN instance which also includes an empty Merkle tree
152+
let rlnInstance = createRLNInstance()
153+
require:
154+
rlnInstance.isOk()
155+
let rln = rlnInstance.get()
156+
# generate an identity credential
157+
let idCredentialRes = membershipKeyGen(rln)
158+
require:
159+
idCredentialRes.isOk()
160+
161+
let idCredential = idCredentialRes.get()
162+
let pkBuffer = toBuffer(idCredential.idCommitment)
163+
let pkBufferPtr = unsafeAddr(pkBuffer)
164+
165+
let
166+
root1 {.noinit.}: Buffer = Buffer()
167+
rootPtr1 = unsafeAddr(root1)
168+
getRootSuccessful1 = getRoot(rlnInstance.get(), rootPtr1)
169+
170+
# add the member to the tree
171+
let memberAdded = updateNextMember(rln, pkBufferPtr)
172+
require:
173+
memberAdded
174+
175+
let leafRes = getMember(rln, 0)
176+
require:
177+
leafRes.isOk()
178+
let leaf = leafRes.get()
179+
let leafHex = leaf.inHex()
180+
check:
181+
leafHex == idCredential.idCommitment.inHex()
182+
150183
test "delete_member Nim wrapper":
151184
# create an RLN instance which also includes an empty Merkle tree
152185
let rlnInstance = createRLNInstance()

waku/v2/waku_rln_relay/constants.nim

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import
2-
std/json,
32
stint
43

54
import

waku/v2/waku_rln_relay/rln/rln_interface.nim

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ proc set_leaf*(ctx: ptr RLN, index: uint, input_buffer: ptr Buffer): bool {.impo
5454
## the input_buffer holds a serialized leaf of 32 bytes
5555
## the return bool value indicates the success or failure of the operation
5656

57+
proc get_leaf*(ctx: ptr RLN, index: uint, output_buffer: ptr Buffer): bool {.importc: "get_leaf".}
58+
## gets the leaf at position index in the tree stored by ctx
59+
## the output_buffer holds a serialized leaf of 32 bytes
60+
## the return bool value indicates the success or failure of the operation
61+
5762
proc init_tree_with_leaves*(ctx: ptr RLN, input_buffer: ptr Buffer): bool {.importc: "init_tree_with_leaves".}
5863
## sets multiple leaves in the tree stored by ctx to the value passed by input_buffer
5964
## the input_buffer holds a serialized vector of leaves (32 bytes each)

waku/v2/waku_rln_relay/rln/wrappers.nim

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,25 @@ proc insertMember*(rlnInstance: ptr RLN, idComm: IDCommitment): bool =
271271
let memberAdded = update_next_member(rlnInstance, pkBufferPtr)
272272
return memberAdded
273273

274+
proc getMember*(rlnInstance: ptr RLN, index: MembershipIndex): RlnRelayResult[IDCommitment] =
275+
## returns the member at the given index
276+
## returns an error if the index is out of bounds
277+
## returns the member if the index is valid
278+
var
279+
idCommitment {.noinit.}: Buffer = Buffer()
280+
idCommitmentPtr = addr(idCommitment)
281+
memberRetrieved = get_leaf(rlnInstance, index, idCommitmentPtr)
282+
283+
if not memberRetrieved:
284+
return err("could not get the member")
285+
286+
if not idCommitment.len == 32:
287+
return err("wrong output size")
288+
289+
let idCommitmentValue = (cast[ptr array[32, byte]](idCommitment.`ptr`))[]
290+
291+
return ok(@idCommitmentValue)
292+
274293
proc atomicWrite*(rlnInstance: ptr RLN,
275294
index = none(MembershipIndex),
276295
idComms = newSeq[IDCommitment](),

0 commit comments

Comments
 (0)