-
Notifications
You must be signed in to change notification settings - Fork 120
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add(scan): Adds gRPC reflection and documents how to use the zebra-sc…
…an gRPC server (#8288) * adds tonic-reflection * adds listen_addr to log * Adds user guide for scan server to zebra book * fixes typo * Applies suggestions from code review * update link Co-authored-by: Marek <mail@marek.onl> --------- Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com> Co-authored-by: Marek <mail@marek.onl>
- Loading branch information
1 parent
790e4bd
commit 4ebd7a8
Showing
8 changed files
with
179 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
# Zebra Shielded Scanning gRPC Server | ||
|
||
## Get Started | ||
|
||
### Setup | ||
|
||
After setting up [Zebra Shielded Scanning](https://zebra.zfnd.org/user/shielded-scan.html), add a `listen_addr` field to the shielded-scan configuration: | ||
|
||
```toml | ||
[shielded_scan] | ||
listen_addr = "127.0.0.1:8231" | ||
``` | ||
|
||
Then, run `zebrad` to start the scan gRPC server. | ||
|
||
Making requests to the server will also require a gRPC client, the examples here use `grpcurl`, though any gRPC client should work. | ||
|
||
[See installation instructions for `grpcurl` here](https://github.com/fullstorydev/grpcurl?tab=readme-ov-file#installation). | ||
|
||
The types can be accessed through the `zebra-grpc` crate's root `scanner` module for clients in a Rust environment, and the [`scanner.proto` file here](https://github.com/ZcashFoundation/zebra/blob/main/zebra-grpc/proto/scanner.proto) can be used to build types in other environments. | ||
|
||
### Usage | ||
|
||
To check that the gRPC server is running, try calling `scanner.Scanner/GetInfo`, for example with `grpcurl`: | ||
|
||
```bash | ||
grpcurl -plaintext '127.0.0.1:8231' scanner.Scanner/GetInfo | ||
``` | ||
|
||
The response should look like: | ||
|
||
``` | ||
{ | ||
"minSaplingBirthdayHeight": 419200 | ||
} | ||
``` | ||
|
||
An example request to the `Scan` method with `grpcurl` would look like: | ||
|
||
```bash | ||
grpcurl -plaintext -d '{ "keys": { "key": ["sapling_extended_full_viewing_key"] } }' '127.0.0.1:8231' scanner.Scanner/Scan | ||
``` | ||
|
||
This will start scanning for transactions in Zebra's state and in new blocks as they're validated. | ||
|
||
Or, to use the scanner gRPC server without streaming, try calling `RegisterKeys` with your Sapling extended full viewing key, waiting for the scanner to cache some results, then calling `GetResults`: | ||
|
||
```bash | ||
grpcurl -plaintext -d '{ "keys": { "key": ["sapling_extended_full_viewing_key"] } }' '127.0.0.1:8231' scanner.Scanner/RegisterKeys | ||
grpcurl -plaintext -d '{ "keys": ["sapling_extended_full_viewing_key"] }' '127.0.0.1:8231' scanner.Scanner/GetResults | ||
``` | ||
|
||
## gRPC Reflection | ||
|
||
To see all of the provided methods with `grpcurl`, try: | ||
|
||
```bash | ||
grpcurl -plaintext '127.0.0.1:8231' list scanner.Scanner | ||
``` | ||
|
||
This will list the paths to each method in the `Scanner` service: | ||
``` | ||
scanner.Scanner.ClearResults | ||
scanner.Scanner.DeleteKeys | ||
scanner.Scanner.GetInfo | ||
scanner.Scanner.GetResults | ||
scanner.Scanner.RegisterKeys | ||
``` | ||
|
||
To see the the request and response types for a method, for example the `GetResults` method, try: | ||
|
||
|
||
```bash | ||
grpcurl -plaintext '127.0.0.1:8231' describe scanner.Scanner.GetResults \ | ||
&& grpcurl -plaintext '127.0.0.1:8231' describe scanner.GetResultsRequest \ | ||
&& grpcurl -plaintext '127.0.0.1:8231' describe scanner.GetResultsResponse \ | ||
&& grpcurl -plaintext '127.0.0.1:8231' describe scanner.Results \ | ||
&& grpcurl -plaintext '127.0.0.1:8231' describe scanner.Transactions \ | ||
&& grpcurl -plaintext '127.0.0.1:8231' describe scanner.Transaction | ||
``` | ||
|
||
The response should be the request and response types for the `GetResults` method: | ||
|
||
``` | ||
scanner.Scanner.GetResults is a method: | ||
// Get all data we have stored for the given keys. | ||
rpc GetResults ( .scanner.GetResultsRequest ) returns ( .scanner.GetResultsResponse ); | ||
scanner.GetResultsRequest is a message: | ||
// A request for getting results for a set of keys. | ||
message GetResultsRequest { | ||
// Keys for which to get results. | ||
repeated string keys = 1; | ||
} | ||
scanner.GetResultsResponse is a message: | ||
// A set of responses for each provided key of a GetResults call. | ||
message GetResultsResponse { | ||
// Results for each key. | ||
map<string, .scanner.Results> results = 1; | ||
} | ||
scanner.Results is a message: | ||
// A result for a single key. | ||
message Results { | ||
// A height, transaction id map | ||
map<uint32, .scanner.Transactions> by_height = 1; | ||
} | ||
scanner.Transactions is a message: | ||
// A vector of transaction hashes | ||
message Transactions { | ||
// Transactions | ||
repeated Transaction transactions = 1; | ||
} | ||
scanner.Transaction is a message: | ||
// Transaction data | ||
message Transaction { | ||
// The transaction hash/id | ||
string hash = 1; | ||
} | ||
``` | ||
|
||
## Methods | ||
|
||
<!-- TODO: Add a reference to zebra-grpc method docs --> | ||
|
||
--- | ||
#### GetInfo | ||
|
||
Returns basic information about the `zebra-scan` instance. | ||
|
||
#### RegisterKeys | ||
|
||
Starts scanning for a set of keys, with optional start heights, and caching the results. | ||
Cached results can later be retrieved by calling the `GetResults` or `Scan` methods. | ||
|
||
#### DeleteKeys | ||
|
||
Stops scanning transactions for a set of keys. Deletes the keys and their cached results for the keys from zebra-scan. | ||
|
||
#### GetResults | ||
|
||
Returns cached results for a set of keys. | ||
|
||
#### ClearResults | ||
|
||
Deletes any cached results for a set of keys. | ||
|
||
#### Scan | ||
|
||
Starts scanning for a set of keys and returns a stream of results. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,16 @@ | ||
//! Compile proto files | ||
use std::{env, path::PathBuf}; | ||
|
||
fn main() -> Result<(), Box<dyn std::error::Error>> { | ||
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); | ||
|
||
tonic_build::configure() | ||
.btree_map(["."]) | ||
.protoc_arg("--experimental_allow_proto3_optional") | ||
.type_attribute(".", "#[derive(serde::Deserialize, serde::Serialize)]") | ||
.file_descriptor_set_path(out_dir.join("scanner_descriptor.bin")) | ||
.compile(&["proto/scanner.proto"], &[""])?; | ||
|
||
Ok(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters