Rust虚拟机共享库fvm_shared的使用:为Filecoin虚拟机提供核心数据结构和跨模块交互功能
Rust虚拟机共享库fvm_shared的使用:为Filecoin虚拟机提供核心数据结构和跨模块交互功能
fvm_shared是Filecoin虚拟机(FVM)的核心共享库,提供了FVM生态系统中的基础数据结构和跨模块交互功能。
安装
在项目目录中运行以下Cargo命令:
cargo add fvm_shared
或者在Cargo.toml中添加:
fvm_shared = "4.7.2"
文档
完整文档可在docs.rs查看。
示例代码
以下是一个使用fvm_shared的完整示例,展示了一些核心功能:
use fvm_shared::address::Address;
use fvm_shared::bigint::BigInt;
use fvm_shared::econ::TokenAmount;
use fvm_shared::error::ExitCode;
use fvm_shared::version::NetworkVersion;
fn main() {
// 创建Filecoin地址
let addr = Address::new_id(12345);
println!("Filecoin地址: {:?}", addr);
// 使用TokenAmount处理FIL金额
let amount = TokenAmount::from_atto(100_000_000_000_000_000u64); // 0.1 FIL
println!("金额: {}", amount);
// 使用BigInt进行大数运算
let big_num1 = BigInt::from(1_000_000);
let big_num2 = BigInt::from(500_000);
let result = big_num1 + big_num2;
println!("大数相加结果: {}", result);
// 处理退出码
let exit_code = ExitCode::OK;
println!("退出码: {:?}", exit_code);
// 检查网络版本
let nv = NetworkVersion::V18;
println!("网络版本: {:?}", nv);
}
完整示例demo
use fvm_shared::{
address::{Address, Protocol},
bigint::{BigInt, Integer},
econ::TokenAmount,
error::ExitCode,
version::NetworkVersion,
};
fn main() {
// 1. 地址操作示例
// 创建ID类型的地址
let id_addr = Address::new_id(12345);
println!("ID类型地址: {:?}", id_addr);
// 创建SECP256K1类型的地址
let secp_addr = Address::new_secp256k1(&[1, 2, 3, 4]).unwrap();
println!("SECP256K1类型地址: {:?}", secp_addr);
// 检查地址协议类型
match id_addr.protocol() {
Protocol::ID => println!("这是一个ID地址"),
_ => println!("其他类型地址"),
}
// 2. 代币金额操作示例
// 从attoFIL创建金额
let amount1 = TokenAmount::from_atto(100_000_000_000_000_000u64); // 0.1 FIL
let amount2 = TokenAmount::from_atto(50_000_000_000_000_000u64); // 0.05 FIL
// 金额运算
let sum = amount1 + amount2;
let diff = amount1 - amount2;
println!("金额相加: {}", sum);
println!("金额相减: {}", diff);
// 3. 大数运算示例
let big_num1 = BigInt::from(1_000_000);
let big_num2 = BigInt::from(500_000);
// 大数运算
println!("相加: {}", big_num1 + big_num2);
println!("相减: {}", big_num1 - big_num2);
println!("相乘: {}", big_num1 * big_num2);
println!("相除: {}", big_num1.div_floor(&big_num2));
// 4. 错误处理示例
let success_code = ExitCode::OK;
let error_code = ExitCode::USR_ILLEGAL_ARGUMENT;
println!("成功代码: {:?}", success_code);
println!("错误代码: {:?}", error_code);
// 5. 网络版本检查
let current_version = NetworkVersion::V18;
println!("当前网络版本: {:?}", current_version);
match current_version {
NetworkVersion::V18 => println!("支持最新FVM特性"),
_ => println!("需要升级网络版本"),
}
}
主要功能
- 地址处理:提供Filecoin地址类型和相关操作
- 大数运算:支持Filecoin中需要的大整数运算
- 经济模型:处理FIL代币金额和转账
- 错误处理:定义FVM标准退出码
- 版本控制:管理不同网络版本的兼容性
许可证
fvm_shared采用MIT或Apache-2.0双许可证。
1 回复
Rust虚拟机共享库fvm_shared的使用
介绍
fvm_shared是Filecoin虚拟机(FVM)的核心共享库,提供了FVM生态系统中的基础数据结构和跨模块交互功能。它为Filecoin虚拟机的各个组件提供了统一的数据表示和交互接口,确保不同模块间能够高效、安全地通信。
主要功能
- 提供核心数据结构定义
- 实现跨模块交互协议
- 定义虚拟机与外部环境的交互接口
- 提供常用的工具函数和宏
完整示例代码
// main.rs
use fvm_shared::{
address::Address,
bigint::bigint_ser,
econ::TokenAmount,
encoding::{to_vec, from_slice, Serialize, Deserialize},
error::{ExitCode, Error},
message::Message,
sector::{StoragePower, SectorNumber},
};
// 自定义数据结构
#[derive(Debug, Serialize, Deserialize)]
struct CustomData {
id: u64,
name: String,
value: TokenAmount,
}
fn main() -> Result<(), Error> {
// 1. 基本数据结构使用
println!("=== 基本数据结构示例 ===");
// 创建Filecoin地址
let addr = Address::new_id(1234);
println!("Filecoin地址: {}", addr);
// 处理Token金额
let amount = TokenAmount::from_atto(1000);
let serialized = bigint_ser::to_vec(&amount)?;
let deserialized: TokenAmount = bigint_ser::from_slice(&serialized)?;
println!("Token金额序列化/反序列化: {} -> {:?} -> {}",
amount, serialized, deserialized);
// 存储能力处理
let power = StoragePower::from(1024u64);
println!("存储能力: {}", power);
// 2. 跨模块交互
println!("\n=== 跨模块交互示例 ===");
let message = Message {
version: 0,
from: Address::new_id(1),
to: Address::new_id(2),
sequence: 0,
value: TokenAmount::from_atto(100),
method_num: 0,
params: vec![],
gas_limit: 1000,
gas_fee_cap: TokenAmount::from_atto(1),
gas_premium: TokenAmount::from_atto(1),
};
println!("创建的消息: {:?}", message);
// 处理错误码
let exit_code = ExitCode::Ok;
match exit_code {
ExitCode::Ok => println!("操作成功"),
_ => eprintln!("操作失败,错误码: {:?}", exit_code),
}
// 3. 序列化/反序列化
println!("\n=== 序列化示例 ===");
let sector_numbers = vec![SectorNumber::from(1), SectorNumber::from(2)];
let encoded = to_vec(§or_numbers)?;
let decoded: Vec<SectorNumber> = from_slice(&encoded)?;
println!("Sector编号: {:?} -> {:?} -> {:?}",
sector_numbers, encoded, decoded);
// 4. 自定义类型
println!("\n=== 自定义类型示例 ===");
let data = CustomData {
id: 42,
name: "测试数据".to_string(),
value: TokenAmount::from_atto(100),
};
println!("原始数据: {:?}", data);
let bytes = to_vec(&data)?;
println!("序列化后: {:?}", bytes);
let decoded_data: CustomData = from_slice(&bytes)?;
println!("反序列化后: {:?}", decoded_data);
Ok(())
}
// 错误处理示例函数
fn process_custom_data(data: &[u8]) -> Result<CustomData, Error> {
let decoded: CustomData = from_slice(data)?;
println!("处理自定义数据: {:?}", decoded);
Ok(decoded)
}
Cargo.toml 配置
[package]
name = "fvm_shared_demo"
version = "0.1.0"
edition = "2021"
[dependencies]
fvm_shared = { version = "0.1", git = "https://github.com/filecoin-project/fvm" }
注意事项
- 确保使用的fvm_shared版本与FVM其他组件兼容
- 处理敏感数据(如TokenAmount)时要注意安全性
- 跨模块交互时要验证数据的完整性和有效性
- 错误处理要全面,特别是涉及资金操作时
这个示例展示了fvm_shared库的主要功能,包括:
- 核心数据结构的使用
- 跨模块消息传递
- 数据序列化/反序列化
- 自定义类型实现
- 错误处理机制
fvm_shared库是Filecoin虚拟机生态系统的基石,合理使用可以大大提高开发效率和系统可靠性。