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时间戳
},
})
}
主要类型
该库提供了以下核心类型,用于与汇率容器交互:
Asset
- 表示基础资产或报价资产ExchangeRateRequest
- 汇率查询请求结构ExchangeRate
- 包含汇率值和元数据的响应ExchangeRateMetadata
- 汇率元数据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开发者设计的跨链资产管理和类型定义工具库,主要用于处理不同区块链网络间的资产交互和类型转换。该库提供了标准化的类型定义和实用功能,简化了跨链应用开发过程。
主要功能
- 跨链资产类型定义
- 资产元数据管理
- 跨链交易数据结构
- 资产转换工具
- 标准化接口实现
安装方法
在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,
};
// 处理事件...
最佳实践
- 始终验证资产定义是否完整
- 处理转换时检查汇率是否有效
- 使用标准化的链ID和资产符号
- 为重要操作添加错误处理
错误处理示例
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开发者提供了处理跨链资产的标准工具集,通过统一的类型定义和实用函数简化了跨链应用的开发。合理使用该库可以确保资产定义的一致性和转换操作的可靠性。