Rust的IC-XRC-Types库使用指南:跨链资产管理与类型定义的核心工具

Rust的IC-XRC-Types库使用指南:跨链资产管理与类型定义的核心工具

IC-XRC-Types是一个用于与互联网计算机(Internet Computer)上的汇率容器(Exchange Rate Canister)进行通信所需的类型库。

安装

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

cargo add ic-xrc-types

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

ic-xrc-types = "1.2.0"

示例使用

以下是一个完整的示例demo,展示如何使用IC-XRC-Types库进行跨链资产管理和汇率查询:

use ic_xrc_types::{Asset, ExchangeRateMetadata, ExchangeRateError};

// 定义资产类型
let base_asset = Asset {
    symbol: "BTC".to_string(),
    class: "cryptocurrency".to_string(),
};

let quote_asset = Asset {
    symbol: "USD".to_string(),
    class: "fiat".to_string(),
};

// 创建汇率查询请求
let request = ExchangeRateRequest {
    base_asset,
    quote_asset,
    timestamp: None, // 可选的时间戳
};

// 模拟从汇率容器获取响应
let response = match get_exchange_rate_from_canister(&request) {
    Ok(rate) => rate,
    Err(ExchangeRateError::StablecoinRateTooOld) => {
        eprintln!("稳定币汇率数据过时");
        return;
    }
    Err(e) => {
        eprintln!("获取汇率失败: {:?}", e);
        return;
    }
};

// 处理汇率数据
println!(
    "汇率: 1 {} = {} {}",
    response.base_asset.symbol,
    response.rate,
    response.quote_asset.symbol
);

println!(
    "元数据: 更新时间 {}, 小数位数 {}",
    response.metadata.timestamp,
    response.metadata.decimals
);

// 模拟从汇率容器获取数据的函数
fn get_exchange_rate_from_canister(
    request: &ExchangeRateRequest
) -> Result<ExchangeRate, ExchangeRateError> {
    // 这里是实际调用IC汇率容器的逻辑
    // 返回模拟数据用于演示
    Ok(ExchangeRate {
        base_asset: request.base_asset.clone(),
        quote_asset: request.quote_asset.clone(),
        rate: 50000.0, // 示例汇率值
        metadata: ExchangeRateMetadata {
            decimals: 8,
            base_asset_num_received_rates: 100,
            base_asset_num_queried_sources: 10,
            quote_asset_num_received_rates: 100,
            quote_asset_num_queried_sources: 10,
            standard_deviation: 0.5,
            timestamp: 1638316800, // Unix时间戳
        },
    })
}

主要类型

该库提供了以下核心类型,用于与汇率容器交互:

  1. Asset - 表示基础资产或报价资产
  2. ExchangeRateRequest - 汇率查询请求结构
  3. ExchangeRate - 包含汇率值和元数据的响应
  4. ExchangeRateMetadata - 汇率元数据
  5. ExchangeRateError - 错误类型枚举

完整示例代码

use ic_xrc_types::{
    Asset, 
    ExchangeRate, 
    ExchangeRateRequest, 
    ExchangeRateMetadata, 
    ExchangeRateError
};

// 主函数
fn main() {
    // 定义基础资产(BTC)
    let base_asset = Asset {
        symbol: "BTC".to_string(),
        class: "cryptocurrency".to_string(),
    };

    // 定义报价资产(USD)
    let quote_asset = Asset {
        symbol: "USD".to_string(),
        class: "fiat".to_string(),
    };

    // 创建汇率查询请求
    let request = ExchangeRateRequest {
        base_asset,
        quote_asset,
        timestamp: None, // 不指定时间戳,获取最新汇率
    };

    // 调用汇率容器获取汇率数据
    match fetch_exchange_rate(&request) {
        Ok(rate) => {
            // 打印汇率信息
            println!(
                "当前汇率: 1 {} = {} {}",
                rate.base_asset.symbol,
                rate.rate,
                rate.quote_asset.symbol
            );
            
            // 打印元数据信息
            println!(
                "汇率元数据:\n小数位数: {}\n更新时间: {}\n标准偏差: {}",
                rate.metadata.decimals,
                rate.metadata.timestamp,
                rate.metadata.standard_deviation
            );
        }
        Err(e) => {
            // 处理错误情况
            eprintln!("查询汇率失败: {:?}", e);
        }
    }
}

// 从汇率容器获取汇率的函数
fn fetch_exchange_rate(
    request: &ExchangeRateRequest
) -> Result<ExchangeRate, ExchangeRateError> {
    // 这里应该是实际调用IC上的汇率容器的代码
    // 为了演示,我们返回一个模拟响应
    
    Ok(ExchangeRate {
        base_asset: request.base_asset.clone(),
        quote_asset: request.quote_asset.clone(),
        rate: 48732.56, // 当前BTC/USD汇率
        metadata: ExchangeRateMetadata {
            decimals: 8,
            base_asset_num_received_rates: 120,
            base_asset_num_queried_sources: 12,
            quote_asset_num_received_rates: 120,
            quote_asset_num_queried_sources: 12,
            standard_deviation: 0.42,
            timestamp: 1672531200, // 2023-01-01 00:00:00 UTC
        },
    })
}

1 回复

Rust的IC-XRC-Types库使用指南:跨链资产管理与类型定义的核心工具

概述

IC-XRC-Types库是专为Rust开发者设计的跨链资产管理和类型定义工具库,主要用于处理不同区块链网络间的资产交互和类型转换。该库提供了标准化的类型定义和实用功能,简化了跨链应用开发过程。

主要功能

  1. 跨链资产类型定义
  2. 资产元数据管理
  3. 跨链交易数据结构
  4. 资产转换工具
  5. 标准化接口实现

安装方法

在Cargo.toml中添加依赖:

[dependencies]
ic-xrc-types = "0.5.0"  # 请检查最新版本

基本使用方法

1. 定义跨链资产

use ic_xrc_types::{Asset, AssetClass, ChainId};

// 创建比特币资产定义
let btc = Asset {
    class: AssetClass::Cryptocurrency,
    symbol: "BTC".to_string(),
    chain: ChainId::Bitcoin,
    decimals: 8,
    metadata: None,  // 可选的元数据
};

2. 处理跨链交易

use ic_xrc_types::{CrossChainTransaction, TransactionStatus};

let tx = CrossChainTransaction {
    source_asset: btc.clone(),
    target_asset: Asset {
        class: AssetClass::Cryptocurrency,
        symbol: "ETH".to_string(),
        chain: ChainId::Ethereum,
        decimals: 18,
        metadata: None,
    },
    amount: 100_000_000,  // 1 BTC (以最小单位表示)
    status: TransactionStatus::Pending,
    // 其他字段...
};

3. 资产转换

use ic_xrc_types::convert_asset_amount;

// 将1 BTC转换为ETH (假设汇率为1 BTC = 15 ETH)
let eth_amount = convert_asset_amount(
    &btc,
    &tx.target_asset,
    100_000_000,  // 1 BTC
    15.0,         // 汇率
).expect("Conversion failed");

println!("1 BTC = {} ETH (wei)", eth_amount);

高级用法

1. 自定义资产元数据

use std::collections::HashMap;
use ic_xrc_types::AssetMetadata;

let metadata = AssetMetadata {
    name: "Wrapped Bitcoin".to_string(),
    contract_address: Some("0x2260fac5e5542a773aa44fbcfedf7c193bc2c599".to_string()),
    additional_info: {
        let mut map = HashMap::new();
        map.insert("protocol".to_string(), "ERC-20".to_string());
        map
    },
};

let wbtc = Asset {
    class: AssetClass::Cryptocurrency,
    symbol: "WBTC".to_string(),
    chain: ChainId::Ethereum,
    decimals: 8,
    metadata: Some(metadata),
};

2. 处理跨链交易事件

use ic_xrc_types::{CrossChainEvent, EventType};

let event = CrossChainEvent {
    event_type: EventType::SwapCompleted,
    transaction: tx.clone(),
    timestamp: 1672531200,  // Unix时间戳
    additional_data: None,
};

// 处理事件...

最佳实践

  1. 始终验证资产定义是否完整
  2. 处理转换时检查汇率是否有效
  3. 使用标准化的链ID和资产符号
  4. 为重要操作添加错误处理

错误处理示例

use ic_xrc_types::ConversionError;

match convert_asset_amount(&btc, &wbtc, 100_000_000, 1.0) {
    Ok(amount) => println!("Converted amount: {}", amount),
    Err(ConversionError::InvalidRate) => eprintln!("Invalid exchange rate provided"),
    Err(ConversionError::DecimalsMismatch) => eprintln!("Decimal places mismatch"),
    Err(e) => eprintln!("Conversion failed: {:?}", e),
}

完整示例代码

use ic_xrc_types::{
    Asset, AssetClass, ChainId, AssetMetadata, 
    CrossChainTransaction, TransactionStatus,
    convert_asset_amount, ConversionError,
    CrossChainEvent, EventType
};
use std::collections::HashMap;

fn main() {
    // 1. 定义跨链资产
    let btc = Asset {
        class: AssetClass::Cryptocurrency,
        symbol: "BTC".to_string(),
        chain: ChainId::Bitcoin,
        decimals: 8,
        metadata: None,
    };

    // 2. 自定义资产元数据
    let metadata = AssetMetadata {
        name: "Wrapped Bitcoin".to_string(),
        contract_address: Some("0x2260fac5e5542a773aa44fbcfedf7c193bc2c599".to_string()),
        additional_info: {
            let mut map = HashMap::new();
            map.insert("protocol".to_string(), "ERC-20".to_string());
            map
        },
    };

    let wbtc = Asset {
        class: AssetClass::Cryptocurrency,
        symbol: "WBTC".to_string(),
        chain: ChainId::Ethereum,
        decimals: 8,
        metadata: Some(metadata),
    };

    // 3. 处理跨链交易
    let tx = CrossChainTransaction {
        source_asset: btc.clone(),
        target_asset: wbtc.clone(),
        amount: 100_000_000, // 1 BTC
        status: TransactionStatus::Pending,
        // 其他字段...
    };

    // 4. 资产转换
    match convert_asset_amount(&btc, &wbtc, 100_000_000, 1.0) {
        Ok(amount) => println!("转换成功: 1 BTC = {} WBTC", amount),
        Err(e) => eprintln!("转换失败: {:?}", e),
    }

    // 5. 处理跨链交易事件
    let event = CrossChainEvent {
        event_type: EventType::SwapCompleted,
        transaction: tx,
        timestamp: 1672531200,
        additional_data: None,
    };

    process_event(event);
}

fn process_event(event: CrossChainEvent) {
    match event.event_type {
        EventType::SwapCompleted => {
            println!("跨链交易完成: {:?}", event.transaction);
        }
        _ => println!("处理其他类型事件"),
    }
}

总结

IC-XRC-Types库为Rust开发者提供了处理跨链资产的标准工具集,通过统一的类型定义和实用函数简化了跨链应用的开发。合理使用该库可以确保资产定义的一致性和转换操作的可靠性。

回到顶部