2 个不稳定版本

0.1.0 2024年7月19日
0.0.1 2024年5月13日

#121 in #sdk

Download history 131/week @ 2024-05-10 15/week @ 2024-05-17 4/week @ 2024-05-24 1/week @ 2024-05-31 122/week @ 2024-07-19 14/week @ 2024-07-26

136 每月下载次数

MIT 许可证

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