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!("需要升级网络版本"),
    }
}

主要功能

  1. 地址处理:提供Filecoin地址类型和相关操作
  2. 大数运算:支持Filecoin中需要的大整数运算
  3. 经济模型:处理FIL代币金额和转账
  4. 错误处理:定义FVM标准退出码
  5. 版本控制:管理不同网络版本的兼容性

许可证

fvm_shared采用MIT或Apache-2.0双许可证。


1 回复

Rust虚拟机共享库fvm_shared的使用

介绍

fvm_shared是Filecoin虚拟机(FVM)的核心共享库,提供了FVM生态系统中的基础数据结构和跨模块交互功能。它为Filecoin虚拟机的各个组件提供了统一的数据表示和交互接口,确保不同模块间能够高效、安全地通信。

主要功能

  1. 提供核心数据结构定义
  2. 实现跨模块交互协议
  3. 定义虚拟机与外部环境的交互接口
  4. 提供常用的工具函数和宏

完整示例代码

// 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(&sector_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" }

注意事项

  1. 确保使用的fvm_shared版本与FVM其他组件兼容
  2. 处理敏感数据(如TokenAmount)时要注意安全性
  3. 跨模块交互时要验证数据的完整性和有效性
  4. 错误处理要全面,特别是涉及资金操作时

这个示例展示了fvm_shared库的主要功能,包括:

  • 核心数据结构的使用
  • 跨模块消息传递
  • 数据序列化/反序列化
  • 自定义类型实现
  • 错误处理机制

fvm_shared库是Filecoin虚拟机生态系统的基石,合理使用可以大大提高开发效率和系统可靠性。

回到顶部