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");
}
完整示例
- 首先,在项目中创建proto文件(例如
src/proto/example.proto
):
syntax = "proto3";
package example;
message Request {
string data = 1;
}
message Response {
string result = 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");
}
- 在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"
基本使用方法
- 首先在项目根目录下创建
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(())
}
- 在项目根目录创建
protos
文件夹,并添加你的.proto
文件,例如message.proto
:
syntax = "proto3";
package my_project;
message Transaction {
string from = 1;
string to = 2;
uint64 amount = 3;
bytes signature = 4;
}
- 在你的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
插件:
- 项目结构
my_project/
├── Cargo.toml
├── build.rs
├── src/
│ ├── main.rs
└── protos/
└── message.proto
- 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"
- 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(())
}
- 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;
}
- 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)
}