Rust Protobuf构建插件zksync_protobuf_build的使用,支持高效协议缓冲区代码生成与ZkSync集成

Rust Protobuf构建插件zksync_protobuf_build的使用,支持高效协议缓冲区代码生成与ZkSync集成

安装

在项目目录中运行以下Cargo命令:

cargo add zksync_protobuf_build

或者在Cargo.toml中添加以下行:

zksync_protobuf_build = "0.13.0"

基本使用示例

以下是一个完整的示例,展示如何使用zksync_protobuf_build插件来生成Protobuf代码并与ZkSync集成:

// 首先,在build.rs中添加以下代码
fn main() {
    zksync_protobuf_build::Config {
        input_root: "src/proto".into(),
        output_root: "src/generated".into(),
        protobuf_crate: "::protobuf".into(),
        is_public: true,
    }
    .generate()
    .expect("protobuf codegen failed");
}

完整示例

  1. 首先,在项目中创建proto文件(例如src/proto/example.proto):
syntax = "proto3";

package example;

message Request {
    string data = 1;
}

message Response {
    string result = 1;
}
  1. 创建build.rs文件:
// build.rs
use std::path::PathBuf;

fn main() {
    // 配置protobuf代码生成
    zksync_protobuf_build::Config {
        input_root: PathBuf::from("src/proto"),
        output_root: PathBuf::from("src/generated"),
        protobuf_crate: "::protobuf".to_string(),
        is_public: true,
    }
    .generate()
    .expect("Failed to generate protobuf code");

    // 告诉Cargo在proto文件更改时重新运行构建脚本
    println!("cargo:rerun-if-changed=src/proto");
}
  1. 在main.rs中使用生成的代码:
// src/main.rs
mod generated {
    include!(concat!(env!("OUT_DIR"), "/example.rs"));
}

use generated::{Request, Response};
use protobuf::Message;

fn main() {
    // 创建请求消息
    let mut request = Request::new();
    request.set_data("Hello, ZkSync!".to_string());

    // 序列化消息
    let bytes = request.write_to_bytes().unwrap();

    // 反序列化消息
    let parsed_request = Request::parse_from_bytes(&bytes).unwrap();
    println!("Parsed request: {:?}", parsed_request);

    // 在这里可以添加ZkSync集成的代码
    // ...
}

特性

  • 高效生成Protobuf Rust代码
  • 与ZkSync生态系统的紧密集成
  • 支持自定义输出目录和可见性设置
  • 自动处理依赖关系

许可证

此crate采用MIT或Apache-2.0许可证。


1 回复

Rust Protobuf构建插件zksync_protobuf_build使用指南

简介

zksync_protobuf_build是一个专门为Rust项目设计的Protobuf构建插件,它优化了Protocol Buffers代码生成过程,并提供了与ZkSync区块链平台的无缝集成能力。该插件简化了Protobuf在Rust项目中的使用流程,特别适合需要与ZkSync交互的分布式应用程序开发。

主要特性

  • 高效的Protobuf代码生成
  • 自动化的依赖管理
  • 与ZkSync生态系统的原生集成
  • 支持Protobuf v3语法
  • 可定制的代码生成选项

安装方法

在项目的Cargo.toml中添加以下依赖:

[dependencies]
zksync_protobuf_build = "0.1"  # 使用最新版本号

[build-dependencies]
zksync_protobuf_build = "0.1"

基本使用方法

  1. 首先在项目根目录下创建build.rs文件:
fn main() -> Result<(), Box<dyn std::error::Error>> {
    zksync_protobuf_build::Config::new()
        .out_dir("src/protos")
        .input(&["protos/message.proto"])
        .compile()?;
    Ok(())
}
  1. 在项目根目录创建protos文件夹,并添加你的.proto文件,例如message.proto:
syntax = "proto3";

package my_project;

message Transaction {
    string from = 1;
    string to = 2;
    uint64 amount = 3;
    bytes signature = 4;
}
  1. 在你的Rust代码中使用生成的模块:
mod protos {
    include!(concat!(env!("OUT_DIR"), "/protos/mod.rs"));
}

use protos::my_project::Transaction;

fn create_transaction() -> Transaction {
    let mut tx = Transaction::default();
    tx.from = "0x1234...".to_string();
    tx.to = "0x5678...".to_string();
    tx.amount = 1000;
    tx
}

完整示例demo

下面是一个完整的项目示例,展示如何使用zksync_protobuf_build插件:

  1. 项目结构
my_project/
├── Cargo.toml
├── build.rs
├── src/
│   ├── main.rs
└── protos/
    └── message.proto
  1. Cargo.toml 内容
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"

[dependencies]
zksync_protobuf_build = "0.1"
prost = "0.11"
tokio = { version = "1.0", features = ["full"] }

[build-dependencies]
zksync_protobuf_build = "0.1"
  1. build.rs 内容
fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 配置protobuf代码生成
    zksync_protobuf_build::Config::new()
        .out_dir("src/protos")  // 输出目录
        .input(&["protos/message.proto"])  // 输入proto文件
        .type_attribute(".my_project.Transaction", "#[derive(serde::Serialize, serde::Deserialize)]")  // 为Transaction添加Serde派生
        .compile()?;  // 执行编译
    Ok(())
}
  1. protos/message.proto 内容
syntax = "proto3";

package my_project;

// 交易消息定义
message Transaction {
    string from = 1;      // 发送方地址
    string to = 2;        // 接收方地址
    uint64 amount = 3;    // 交易金额
    bytes signature = 4;  // 交易签名
}

// ZkSync服务定义
service ZkSyncService {
    rpc SubmitTransaction (Transaction) returns (TransactionResponse);
}

message TransactionResponse {
    bool success = 1;
    string tx_hash = 2;
}
  1. src/main.rs 示例代码
// 包含生成的protobuf代码
mod protos {
    include!(concat!(env!("OUT_DIR"), "/protos/mod.rs"));
}

use protos::my_project::{Transaction, TransactionResponse};
use zksync_protobuf_build::zksync::ZkSyncClient;
use tokio::runtime::Runtime;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建交易
    let tx = create_transaction();
    println!("Created transaction: {:?}", tx);

    // 异步运行时
    let rt = Runtime::new()?;
    
    // 发送交易到ZkSync
    rt.block_on(async {
        let result = send_transaction_to_zksync(tx).await;
        match result {
            Ok(response) => println!("Transaction submitted successfully: {}", response.tx_hash),
            Err(e) => eprintln!("Error submitting transaction: {}", e),
        }
    });

    Ok(())
}

// 创建交易函数
fn create_transaction() -> Transaction {
    let mut tx = Transaction::default();
    tx.from = "0x1234567890abcdef".to_string();
    tx.to = "0x9876543210fedcba".to_string();
    tx.amount = 1000;
    tx.signature = vec![0u8; 64];  // 模拟签名
    tx
}

// 发送交易到ZkSync网络
async fn send_transaction_to_zksync(tx: Transaction) -> Result<TransactionResponse, Box<dyn std::error::Error>> {
    // 创建ZkSync客户端
    let client = ZkSyncClient::new("https://zksync.io/api").await?;
    
    // 编码交易为字节
    let tx_bytes = tx.encode_to_vec();
    
    // 提交交易
    let response = client.submit_transaction(tx_bytes).await?;
    
    Ok(response)
}
回到顶部