2 个不稳定版本
0.1.0 | 2024年7月19日 |
---|---|
0.0.1 | 2024年5月13日 |
#121 in #sdk
136 每月下载次数
15KB
237 行
Sindri Rust SDK
Sindri Rust SDK 正在积极开发中。
设置
创建一个新的 Rust 项目。
cargo new sindri-sdk-test
在您的根目录下,添加一个 .env
文件以存储您的桑德里 API 密钥。
API_KEY="YOUR_SINDRI_API_KEY"
将以下依赖项添加到您的 Cargo.toml
cargo add sindri dotenvy tokio --features tokio/full
在此示例中,我们将使用由桑德里 CLI 生成的 Noir 电路。有关如何使用桑德里 CLI 的信息,请参阅此处:https://sindri.app/docs/getting-started/cli/
为了简单起见,电路文件添加到根目录。您的目录树应如下所示
.
├── Cargo.lock
├── Cargo.toml
├── example-input.json
├── noir-circuit
│ ├── Nargo.toml
│ ├── Prover.toml
│ ├── sindri.json
│ └── src
│ └── main.nr
└── src
└── main.rs
Noir 电路文件
桑德里 CLI 将生成一个示例 Noir 电路。
noir-circuit/src/main.nr
Noir 电路代码包含在 src/main.nr 文件中。桑德里 CLI 将生成一个简单的等价电路。
// Define the main function for the circuit.
fn main(X: Field, Y: pub Field) {
// Put your code here...
// Enforce the constraint that X must equal Y.
assert(X == Y);
}
nargo.toml
[package]
name = "sample_circuit"
type = "bin"
authors = [""]
compiler_version = "0.23.0"
[dependencies]
Prover.toml
X = 5
Y = 5
sindri.json
您的 sindri.json 文件将根据电路类型而有所不同。对于 Noir,它将类似于以下模式
{
"$schema": "https://sindri.app/api/v1/sindri-manifest-schema.json",
"name": "sample_circuit",
"circuitType": "noir",
"provingScheme": "barretenberg",
"noirVersion": "0.23.0"
}
创建客户端
客户端的创建方法如下
let client = SindriBuilder::new(&api_key).build();
客户端允许您编译和证明电路,获取电路和证明元数据,并删除特定的电路和证明。有关各种桑德里 API 端点的信息,请参阅此处:https://sindri.app/docs/reference/api/
示例 main.rs
以下是一个使用 SDK 访问所有可用 API 端点的 Rust 程序的示例。该代码编译并证明一个 Noir 电路,获取电路和证明元数据,获取所有用户电路的列表,获取从特定电路生成的证明列表,并最终从桑德里数据库中删除电路和证明。
use dotenvy::dotenv;
use sindri::SindriBuilder;
#[tokio::main]
async fn main() {
dotenv().expect("Failed to read .env file");
let api_key: String = std::env::var("API_KEY").unwrap();
let client = SindriBuilder::new(&api_key).build();
let circuit_id = client.upload_circuit("noir-sdk-test", "./noir-circuit").await.unwrap();
let proof_id = client.prove_circuit(&circuit_id, "example-input.json").await.unwrap();
let circuit_details = client.get_circuit_details(&circuit_id).await.unwrap();
let proof_details = client.get_proof_details(&proof_id).await.unwrap();
let circuits_list = client.get_all_circuits().await.unwrap();
let proofs_list = client.get_all_circuit_proofs(&circuit_id).await.unwrap();
println!("circuit details {:?}", circuit_details);
println!("proof details {:?}", proof_details);
println!("circuits list {:?}", circuits_list);
println!("proofs list {:?}", proofs_list);
std::thread::sleep(std::time::Duration::from_secs(1));
let _ = client.delete_proof(&proof_id).await.unwrap();
println!("proof succesfully deleted");
std::thread::sleep(std::time::Duration::from_secs(1));
let _ = client.delete_circuit(&circuit_id).await.unwrap();
println!("circuit successfully deleted");
}
依赖项
~8–21MB
~333K SLoC