Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented account state deltas storage and endpoint for getting account state deltas #418

Merged
merged 9 commits into from
Jul 27, 2024
Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
- Embed the faucet's static website resources (#411).
- CI check for proto file consistency (#412).
- Added warning on CI for `CHANGELOG.md` (#413).
- Added `GetAccountStateDelta` endpoint (#418).

### Fixes

Expand Down
6 changes: 3 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ readme = "README.md"

[workspace.dependencies]
miden-air = { version = "0.9", default-features = false }
miden-lib = { rev = "5cb5047", git = "https://github.com/0xPolygonMiden/miden-base" }
miden-lib = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" }
bobbinth marked this conversation as resolved.
Show resolved Hide resolved
miden-node-block-producer = { path = "crates/block-producer", version = "0.5" }
miden-node-faucet = { path = "bin/faucet", version = "0.5" }
miden-node-proto = { path = "crates/proto", version = "0.5" }
Expand All @@ -36,10 +36,10 @@ miden-node-rpc-proto = { path = "crates/rpc-proto", version = "0.5" }
miden-node-store = { path = "crates/store", version = "0.5" }
miden-node-test-macro = { path = "crates/test-macro" }
miden-node-utils = { path = "crates/utils", version = "0.5" }
miden-objects = { rev = "5cb5047", git = "https://github.com/0xPolygonMiden/miden-base" }
miden-objects = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" }
miden-processor = { version = "0.9" }
miden-stdlib = { version = "0.9", default-features = false }
miden-tx = { rev = "5cb5047", git = "https://github.com/0xPolygonMiden/miden-base" }
miden-tx = { git = "https://github.com/0xPolygonMiden/miden-base.git", branch = "next" }
thiserror = { version = "1.0" }
tonic = { version = "0.11" }
tracing = { version = "0.1" }
Expand Down
14 changes: 14 additions & 0 deletions crates/proto/src/generated/requests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,3 +122,17 @@ pub struct GetBlockByNumberRequest {
#[prost(fixed32, tag = "1")]
pub block_num: u32,
}
/// Returns delta of the account states in the range from `from_block_num` (exclusive) to `to_block_num` (inclusive).
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct GetAccountStateDeltaRequest {
/// ID of the account for which the delta is requested.
#[prost(message, optional, tag = "1")]
pub account_id: ::core::option::Option<super::account::AccountId>,
/// Block number from which the delta is requested (exclusive).
#[prost(fixed32, tag = "2")]
pub from_block_num: u32,
/// Block number up to which the delta is requested (inclusive).
#[prost(fixed32, tag = "3")]
pub to_block_num: u32,
}
7 changes: 7 additions & 0 deletions crates/proto/src/generated/responses.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,3 +170,10 @@ pub struct GetBlockByNumberResponse {
#[prost(bytes = "vec", optional, tag = "1")]
pub block: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct GetAccountStateDeltaResponse {
/// The calculated `AccountStateDelta` encoded using miden native format
#[prost(bytes = "vec", optional, tag = "1")]
pub delta: ::core::option::Option<::prost::alloc::vec::Vec<u8>>,
}
83 changes: 83 additions & 0 deletions crates/proto/src/generated/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,33 @@ pub mod api_client {
req.extensions_mut().insert(GrpcMethod::new("rpc.Api", "GetAccountDetails"));
self.inner.unary(req, path, codec).await
}
pub async fn get_account_state_delta(
&mut self,
request: impl tonic::IntoRequest<
super::super::requests::GetAccountStateDeltaRequest,
>,
) -> std::result::Result<
tonic::Response<super::super::responses::GetAccountStateDeltaResponse>,
tonic::Status,
> {
self.inner
.ready()
.await
.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/rpc.Api/GetAccountStateDelta",
);
let mut req = request.into_request();
req.extensions_mut()
.insert(GrpcMethod::new("rpc.Api", "GetAccountStateDelta"));
self.inner.unary(req, path, codec).await
}
pub async fn get_block_by_number(
&mut self,
request: impl tonic::IntoRequest<
Expand Down Expand Up @@ -279,6 +306,13 @@ pub mod api_server {
tonic::Response<super::super::responses::GetAccountDetailsResponse>,
tonic::Status,
>;
async fn get_account_state_delta(
&self,
request: tonic::Request<super::super::requests::GetAccountStateDeltaRequest>,
) -> std::result::Result<
tonic::Response<super::super::responses::GetAccountStateDeltaResponse>,
tonic::Status,
>;
async fn get_block_by_number(
&self,
request: tonic::Request<super::super::requests::GetBlockByNumberRequest>,
Expand Down Expand Up @@ -496,6 +530,55 @@ pub mod api_server {
};
Box::pin(fut)
}
"/rpc.Api/GetAccountStateDelta" => {
#[allow(non_camel_case_types)]
struct GetAccountStateDeltaSvc<T: Api>(pub Arc<T>);
impl<
T: Api,
> tonic::server::UnaryService<
super::super::requests::GetAccountStateDeltaRequest,
> for GetAccountStateDeltaSvc<T> {
type Response = super::super::responses::GetAccountStateDeltaResponse;
type Future = BoxFuture<
tonic::Response<Self::Response>,
tonic::Status,
>;
fn call(
&mut self,
request: tonic::Request<
super::super::requests::GetAccountStateDeltaRequest,
>,
) -> Self::Future {
let inner = Arc::clone(&self.0);
let fut = async move {
<T as Api>::get_account_state_delta(&inner, request).await
};
Box::pin(fut)
}
}
let accept_compression_encodings = self.accept_compression_encodings;
let send_compression_encodings = self.send_compression_encodings;
let max_decoding_message_size = self.max_decoding_message_size;
let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone();
let fut = async move {
let inner = inner.0;
let method = GetAccountStateDeltaSvc(inner);
let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec)
.apply_compression_config(
accept_compression_encodings,
send_compression_encodings,
)
.apply_max_message_size_config(
max_decoding_message_size,
max_encoding_message_size,
);
let res = grpc.unary(method, req).await;
Ok(res)
};
Box::pin(fut)
}
"/rpc.Api/GetBlockByNumber" => {
#[allow(non_camel_case_types)]
struct GetBlockByNumberSvc<T: Api>(pub Arc<T>);
Expand Down
83 changes: 83 additions & 0 deletions crates/proto/src/generated/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,33 @@ pub mod api_client {
.insert(GrpcMethod::new("store.Api", "GetAccountDetails"));
self.inner.unary(req, path, codec).await
}
pub async fn get_account_state_delta(
&mut self,
request: impl tonic::IntoRequest<
super::super::requests::GetAccountStateDeltaRequest,
>,
) -> std::result::Result<
tonic::Response<super::super::responses::GetAccountStateDeltaResponse>,
tonic::Status,
> {
self.inner
.ready()
.await
.map_err(|e| {
tonic::Status::new(
tonic::Code::Unknown,
format!("Service was not ready: {}", e.into()),
)
})?;
let codec = tonic::codec::ProstCodec::default();
let path = http::uri::PathAndQuery::from_static(
"/store.Api/GetAccountStateDelta",
);
let mut req = request.into_request();
req.extensions_mut()
.insert(GrpcMethod::new("store.Api", "GetAccountStateDelta"));
self.inner.unary(req, path, codec).await
}
pub async fn get_block_by_number(
&mut self,
request: impl tonic::IntoRequest<
Expand Down Expand Up @@ -406,6 +433,13 @@ pub mod api_server {
tonic::Response<super::super::responses::GetAccountDetailsResponse>,
tonic::Status,
>;
async fn get_account_state_delta(
&self,
request: tonic::Request<super::super::requests::GetAccountStateDeltaRequest>,
) -> std::result::Result<
tonic::Response<super::super::responses::GetAccountStateDeltaResponse>,
tonic::Status,
>;
async fn get_block_by_number(
&self,
request: tonic::Request<super::super::requests::GetBlockByNumberRequest>,
Expand Down Expand Up @@ -698,6 +732,55 @@ pub mod api_server {
};
Box::pin(fut)
}
"/store.Api/GetAccountStateDelta" => {
#[allow(non_camel_case_types)]
struct GetAccountStateDeltaSvc<T: Api>(pub Arc<T>);
impl<
T: Api,
> tonic::server::UnaryService<
super::super::requests::GetAccountStateDeltaRequest,
> for GetAccountStateDeltaSvc<T> {
type Response = super::super::responses::GetAccountStateDeltaResponse;
type Future = BoxFuture<
tonic::Response<Self::Response>,
tonic::Status,
>;
fn call(
&mut self,
request: tonic::Request<
super::super::requests::GetAccountStateDeltaRequest,
>,
) -> Self::Future {
let inner = Arc::clone(&self.0);
let fut = async move {
<T as Api>::get_account_state_delta(&inner, request).await
};
Box::pin(fut)
}
}
let accept_compression_encodings = self.accept_compression_encodings;
let send_compression_encodings = self.send_compression_encodings;
let max_decoding_message_size = self.max_decoding_message_size;
let max_encoding_message_size = self.max_encoding_message_size;
let inner = self.inner.clone();
let fut = async move {
let inner = inner.0;
let method = GetAccountStateDeltaSvc(inner);
let codec = tonic::codec::ProstCodec::default();
let mut grpc = tonic::server::Grpc::new(codec)
.apply_compression_config(
accept_compression_encodings,
send_compression_encodings,
)
.apply_max_message_size_config(
max_decoding_message_size,
max_encoding_message_size,
);
let res = grpc.unary(method, req).await;
Ok(res)
};
Box::pin(fut)
}
"/store.Api/GetBlockByNumber" => {
#[allow(non_camel_case_types)]
struct GetBlockByNumberSvc<T: Api>(pub Arc<T>);
Expand Down
10 changes: 10 additions & 0 deletions crates/rpc-proto/proto/requests.proto
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,13 @@ message GetBlockByNumberRequest {
// The block number of the target block.
fixed32 block_num = 1;
}

// Returns delta of the account states in the range from `from_block_num` (exclusive) to `to_block_num` (inclusive).
message GetAccountStateDeltaRequest {
// ID of the account for which the delta is requested.
account.AccountId account_id = 1;
// Block number from which the delta is requested (exclusive).
fixed32 from_block_num = 2;
// Block number up to which the delta is requested (inclusive).
fixed32 to_block_num = 3;
}
5 changes: 5 additions & 0 deletions crates/rpc-proto/proto/responses.proto
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,8 @@ message GetBlockByNumberResponse {
// The requested `Block` data encoded using miden native format
optional bytes block = 1;
}

message GetAccountStateDeltaResponse {
// The calculated `AccountStateDelta` encoded using miden native format
optional bytes delta = 1;
}
1 change: 1 addition & 0 deletions crates/rpc-proto/proto/rpc.proto
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import "responses.proto";
service Api {
rpc CheckNullifiers(requests.CheckNullifiersRequest) returns (responses.CheckNullifiersResponse) {}
rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {}
rpc GetAccountStateDelta(requests.GetAccountStateDeltaRequest) returns (responses.GetAccountStateDeltaResponse) {}
rpc GetBlockByNumber(requests.GetBlockByNumberRequest) returns (responses.GetBlockByNumberResponse) {}
rpc GetBlockHeaderByNumber(requests.GetBlockHeaderByNumberRequest) returns (responses.GetBlockHeaderByNumberResponse) {}
rpc GetNotesById(requests.GetNotesByIdRequest) returns (responses.GetNotesByIdResponse) {}
Expand Down
1 change: 1 addition & 0 deletions crates/rpc-proto/proto/store.proto
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ service Api {
rpc ApplyBlock(requests.ApplyBlockRequest) returns (responses.ApplyBlockResponse) {}
rpc CheckNullifiers(requests.CheckNullifiersRequest) returns (responses.CheckNullifiersResponse) {}
rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {}
rpc GetAccountStateDelta(requests.GetAccountStateDeltaRequest) returns (responses.GetAccountStateDeltaResponse) {}
rpc GetBlockByNumber(requests.GetBlockByNumberRequest) returns (responses.GetBlockByNumberResponse) {}
rpc GetBlockHeaderByNumber(requests.GetBlockHeaderByNumberRequest) returns (responses.GetBlockHeaderByNumberResponse) {}
rpc GetBlockInputs(requests.GetBlockInputsRequest) returns (responses.GetBlockInputsResponse) {}
Expand Down
32 changes: 25 additions & 7 deletions crates/rpc/src/server/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ use miden_node_proto::{
generated::{
block_producer::api_client as block_producer_client,
requests::{
CheckNullifiersRequest, GetAccountDetailsRequest, GetBlockByNumberRequest,
GetBlockHeaderByNumberRequest, GetNotesByIdRequest, SubmitProvenTransactionRequest,
SyncStateRequest,
CheckNullifiersRequest, GetAccountDetailsRequest, GetAccountStateDeltaRequest,
GetBlockByNumberRequest, GetBlockHeaderByNumberRequest, GetNotesByIdRequest,
SubmitProvenTransactionRequest, SyncStateRequest,
},
responses::{
CheckNullifiersResponse, GetAccountDetailsResponse, GetBlockByNumberResponse,
GetBlockHeaderByNumberResponse, GetNotesByIdResponse, SubmitProvenTransactionResponse,
SyncStateResponse,
CheckNullifiersResponse, GetAccountDetailsResponse, GetAccountStateDeltaResponse,
GetBlockByNumberResponse, GetBlockHeaderByNumberResponse, GetNotesByIdResponse,
SubmitProvenTransactionResponse, SyncStateResponse,
},
rpc::api_server,
store::api_client as store_client,
Expand Down Expand Up @@ -192,12 +192,30 @@ impl api_server::Api for RpcApi {
)]
async fn get_block_by_number(
&self,
request: tonic::Request<GetBlockByNumberRequest>,
request: Request<GetBlockByNumberRequest>,
) -> Result<Response<GetBlockByNumberResponse>, Status> {
let request = request.into_inner();

debug!(target: COMPONENT, ?request);

self.store.clone().get_block_by_number(request).await
}

#[instrument(
target = "miden-rpc",
name = "rpc:get_account_state_delta",
skip_all,
ret(level = "debug"),
err
)]
async fn get_account_state_delta(
&self,
request: Request<GetAccountStateDeltaRequest>,
) -> Result<Response<GetAccountStateDeltaResponse>, Status> {
let request = request.into_inner();

debug!(target: COMPONENT, ?request);

self.store.clone().get_account_state_delta(request).await
}
}
Loading
Loading