Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

- [BREAKING] Updated minimum Rust version to 1.84.
- [BREAKING] `Endpoint` configuration simplified to a single string (#654).
- [BREAKING] `CheckNullifiersByPrefix` now takes a starting block number (#707).
- [BREAKING] Changed sync state endpoint to stream the response (#685).

### Enhancements
Expand Down
3 changes: 3 additions & 0 deletions crates/proto/src/generated/requests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ pub struct CheckNullifiersByPrefixRequest {
/// to `prefix_len`.
#[prost(uint32, repeated, tag = "2")]
pub nullifiers: ::prost::alloc::vec::Vec<u32>,
/// Block number from which the nullifiers are requested (inclusive).
#[prost(fixed32, tag = "3")]
pub block_num: u32,
}
/// Returns a nullifier proof for each of the requested nullifiers.
#[derive(Clone, PartialEq, ::prost::Message)]
Expand Down
2 changes: 2 additions & 0 deletions crates/rpc-proto/proto/requests.proto
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ message CheckNullifiersByPrefixRequest {
// List of nullifiers to check. Each nullifier is specified by its prefix with length equal
// to `prefix_len`.
repeated uint32 nullifiers = 2;
// Block number from which the nullifiers are requested (inclusive).
fixed32 block_num = 3;
}

// Returns a nullifier proof for each of the requested nullifiers.
Expand Down
2 changes: 1 addition & 1 deletion crates/rpc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Returns a nullifier proof for each of the requested nullifiers.

### CheckNullifiersByPrefix

Returns a list of nullifiers that match the specified prefixes and are recorded in the node.
Returns a list of nullifiers recorded in the node that match the specified prefixes and block creation height.

Only 16-bit prefixes are supported at this time.

Expand Down
3 changes: 2 additions & 1 deletion crates/store/src/db/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,12 +215,13 @@ impl Db {
&self,
prefix_len: u32,
nullifier_prefixes: Vec<u32>,
block_num: BlockNumber,
) -> Result<Vec<NullifierInfo>> {
self.pool
.get()
.await?
.interact(move |conn| {
sql::select_nullifiers_by_prefix(conn, prefix_len, &nullifier_prefixes)
sql::select_nullifiers_by_prefix(conn, prefix_len, &nullifier_prefixes, block_num)
})
.await
.map_err(|err| {
Expand Down
10 changes: 5 additions & 5 deletions crates/store/src/db/sql/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -665,8 +665,7 @@ pub fn select_nullifiers_by_block_range(
Ok(result)
}

/// Select nullifiers created that match the `nullifier_prefixes` filter using the given
/// [Connection].
/// Returns nullifiers filtered by prefix and block creation height.
///
/// Each value of the `nullifier_prefixes` is only the `prefix_len` most significant bits
/// of the nullifier of interest to the client. This hides the details of the specific
Expand All @@ -680,6 +679,7 @@ pub fn select_nullifiers_by_prefix(
conn: &mut Connection,
prefix_len: u32,
nullifier_prefixes: &[u32],
block_num: BlockNumber,
) -> Result<Vec<NullifierInfo>> {
assert_eq!(prefix_len, 16, "Only 16-bit prefixes are supported");

Expand All @@ -694,13 +694,13 @@ pub fn select_nullifiers_by_prefix(
FROM
nullifiers
WHERE
nullifier_prefix IN rarray(?1)
nullifier_prefix IN rarray(?1) AND
block_num >= ?2
ORDER BY
block_num ASC
",
)?;

let mut rows = stmt.query(params![Rc::new(nullifier_prefixes)])?;
let mut rows = stmt.query(params![Rc::new(nullifier_prefixes), block_num.as_u32()])?;

let mut result = Vec::new();
while let Some(row) = rows.next()? {
Expand Down
29 changes: 28 additions & 1 deletion crates/store/src/db/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,9 @@ fn select_nullifiers_by_prefix() {
const PREFIX_LEN: u32 = 16;
let mut conn = create_db();
// test empty table
let nullifiers = sql::select_nullifiers_by_prefix(&mut conn, PREFIX_LEN, &[]).unwrap();
let block_number0 = 0.into();
let nullifiers =
sql::select_nullifiers_by_prefix(&mut conn, PREFIX_LEN, &[], block_number0).unwrap();
assert!(nullifiers.is_empty());

// test single item
Expand All @@ -635,6 +637,7 @@ fn select_nullifiers_by_prefix() {
&mut conn,
PREFIX_LEN,
&[sql::utils::get_nullifier_prefix(&nullifier1)],
block_number0,
)
.unwrap();
assert_eq!(
Expand Down Expand Up @@ -662,6 +665,7 @@ fn select_nullifiers_by_prefix() {
&mut conn,
PREFIX_LEN,
&[sql::utils::get_nullifier_prefix(&nullifier1)],
block_number0,
)
.unwrap();
assert_eq!(
Expand All @@ -675,6 +679,7 @@ fn select_nullifiers_by_prefix() {
&mut conn,
PREFIX_LEN,
&[sql::utils::get_nullifier_prefix(&nullifier2)],
block_number0,
)
.unwrap();
assert_eq!(
Expand All @@ -693,6 +698,7 @@ fn select_nullifiers_by_prefix() {
sql::utils::get_nullifier_prefix(&nullifier1),
sql::utils::get_nullifier_prefix(&nullifier2),
],
block_number0,
)
.unwrap();
assert_eq!(
Expand All @@ -714,9 +720,30 @@ fn select_nullifiers_by_prefix() {
&mut conn,
PREFIX_LEN,
&[sql::utils::get_nullifier_prefix(&num_to_nullifier(3 << 48))],
block_number0,
)
.unwrap();
assert!(nullifiers.is_empty());

// If a block number is provided, only matching nullifiers created at or after that block are
// returned
let nullifiers = sql::select_nullifiers_by_prefix(
&mut conn,
PREFIX_LEN,
&[
sql::utils::get_nullifier_prefix(&nullifier1),
sql::utils::get_nullifier_prefix(&nullifier2),
],
block_number2,
)
.unwrap();
assert_eq!(
nullifiers,
vec![NullifierInfo {
nullifier: nullifier2,
block_num: block_number2
}]
);
}

#[test]
Expand Down
6 changes: 5 additions & 1 deletion crates/store/src/server/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,11 @@ impl api_server::Api for StoreApi {

let nullifiers = self
.state
.check_nullifiers_by_prefix(request.prefix_len, request.nullifiers)
.check_nullifiers_by_prefix(
request.prefix_len,
request.nullifiers,
BlockNumber::from(request.block_num),
)
.await?
.into_iter()
.map(|nullifier_info| NullifierUpdate {
Expand Down
5 changes: 4 additions & 1 deletion crates/store/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -411,8 +411,11 @@ impl State {
&self,
prefix_len: u32,
nullifier_prefixes: Vec<u32>,
block_num: BlockNumber,
) -> Result<Vec<NullifierInfo>, DatabaseError> {
self.db.select_nullifiers_by_prefix(prefix_len, nullifier_prefixes).await
self.db
.select_nullifiers_by_prefix(prefix_len, nullifier_prefixes, block_num)
.await
}

/// Generates membership proofs for each one of the `nullifiers` against the latest nullifier
Expand Down
2 changes: 2 additions & 0 deletions proto/requests.proto
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ message CheckNullifiersByPrefixRequest {
// List of nullifiers to check. Each nullifier is specified by its prefix with length equal
// to `prefix_len`.
repeated uint32 nullifiers = 2;
// Block number from which the nullifiers are requested (inclusive).
fixed32 block_num = 3;
}

// Returns a nullifier proof for each of the requested nullifiers.
Expand Down
Loading