Rust区块链运行时库westend-runtime-constants的使用:Westend测试网常量配置与Substrate开发必备工具
Rust区块链运行时库westend-runtime-constants的使用:Westend测试网常量配置与Substrate开发必备工具
安装
在项目目录中运行以下Cargo命令:
cargo add westend-runtime-constants
或者在Cargo.toml中添加以下行:
westend-runtime-constants = "21.0.0"
使用示例
westend-runtime-constants库提供了Westend测试网的各种运行时常量,这些常量对于Substrate开发非常重要。以下是一个完整的使用示例:
use westend_runtime_constants as constants;
fn main() {
// 获取Westend测试网的货币单位
let currency_decimals = constants::currency::DECIMALS;
println!("Westend currency decimals: {}", currency_decimals);
// 获取Westend测试网的区块时间
let block_time = constants::time::SLOT_DURATION;
println!("Westend block time (ms): {}", block_time);
// 获取Westend测试网的最大转账金额
let max_transfer_amount = constants::balances::MAX_TRANSFER_AMOUNT;
println!("Max transfer amount: {}", max_transfer_amount);
// 获取Westend测试网的Epoch时长
let epoch_duration = constants::staking::EPOCH_DURATION_IN_SLOTS;
println!("Epoch duration in slots: {}", epoch_duration);
}
完整示例代码
下面是一个更完整的示例,展示了如何使用westend-runtime-constants库中的各种常量:
use westend_runtime_constants as constants;
fn main() {
// 1. 货币相关常量示例
println!("=== 货币相关常量 ===");
println!("货币小数位数: {}", constants::currency::DECIMALS);
println!("货币符号: {}", constants::currency::CURRENCY_SYMBOL);
// 2. 时间相关常量示例
println!("\n=== 时间相关常量 ===");
println!("区块时间(ms): {}", constants::time::SLOT_DURATION);
println!("Epoch时长(区块数): {}", constants::time::EPOCH_DURATION_IN_SLOTS);
// 3. 余额相关常量示例
println!("\n=== 余额相关常量 ===");
println!("最大转账金额: {}", constants::balances::MAX_TRANSFER_AMOUNT);
println!("账户最低存款金额: {}", constants::balances::EXISTENTIAL_DEPOSIT);
// 4. Staking相关常量示例
println!("\n=== Staking相关常量 ===");
println!("最少验证人数量: {}", constants::staking::MINIMUM_VALIDATOR_COUNT);
println!("最多验证人数量: {}", constants::staking::MAX_VALIDATOR_COUNT);
// 5. 计算示例:计算一个epoch的时长(毫秒)
let epoch_duration_ms = constants::time::SLOT_DURATION * constants::time::EPOCH_DURATION_IN_SLOTS;
println!("\n计算一个epoch的时长(ms): {}", epoch_duration_ms);
}
主要功能
该库包含以下类型的常量:
-
货币相关常量:
- DECIMALS: 货币小数位数
- CURRENCY_SYMBOL: 货币符号
-
时间相关常量:
- SLOT_DURATION: 每个区块的时间(毫秒)
- EPOCH_DURATION_IN_SLOTS: 每个epoch的区块数
-
余额相关常量:
- MAX_TRANSFER_AMOUNT: 最大转账金额
- EXISTENTIAL_DEPOSIT: 账户最低存款金额
-
Staking相关常量:
- MINIMUM_VALIDATOR_COUNT: 最少验证人数量
- MAX_VALIDATOR_COUNT: 最多验证人数量
开发建议
- 在开发Substrate pallet时,使用这些常量可以确保你的代码与Westend测试网兼容
- 当测试链上逻辑时,这些常量可以帮助你设置正确的参数
- 在进行跨链开发时,使用这些常量可以确保与其他Westend链应用的互操作性
1 回复
Rust区块链运行时库westend-runtime-constants使用指南
完整示例代码
以下是一个结合了内容中所有示例的完整demo,展示了如何使用westend-runtime-constants库:
// 引入必要的模块和库
use westend_runtime_constants::{currency::*, time::*, network::*, staking::*};
use substrate_api_client::{Api, PlainTipExtrinsicParamsBuilder};
use sp_runtime::generic::Era;
use sp_core::sr25519;
fn main() {
// 示例1: 基本货币常量使用
println!("=== 货币常量示例 ===");
println!("Westend 网络的 DOLLARS 单位: {}", DOLLARS);
println!("Westend 网络的 CENTS 单位: {}", CENTS);
println!("Westend 网络的 MILLICENTS 单位: {}", MILLICENTS);
let one_dot = 1 * DOLLARS;
println!("1 DOT = {} Planck", one_dot);
let deposit = 100 * DOLLARS; // 100 DOT
let small_fee = 10 * CENTS; // 0.1 DOT
println!("存款: {} Planck, 小额费用: {} Planck", deposit, small_fee);
// 示例2: 时间相关常量
println!("\n=== 时间常量示例 ===");
println!("Westend 区块时间: {:?} 秒", MILLISECS_PER_BLOCK / 1000);
println!("Westend 每个 era 的区块数: {}", BLOCKS_PER_ERA);
// 示例3: 网络特定常量
println!("\n=== 网络常量示例 ===");
println!("Westend 网络ID: {:?}", WESTEND_NETWORK_ID);
// 示例4: 计算质押奖励
println!("\n=== 质押奖励计算示例 ===");
fn calculate_reward(amount: u128, era_duration: u64) -> u128 {
let annual_return = PERBILL_PER_ANNUAL as u128;
let era_return = annual_return * era_duration as u128 / YEAR as u128;
amount * era_return / PERBILL as u128
}
let stake = 1000 * DOLLARS;
let reward = calculate_reward(stake, BLOCKS_PER_ERA * MILLISECS_PER_BLOCK / 1000);
println!("预计每 era 奖励: {} Planck", reward);
// 示例5: 与Substrate客户端结合使用(需要实际网络连接,这里仅展示代码结构)
println!("\n=== 客户端交互示例 ===");
println!("注意: 此示例需要实际网络连接才能运行");
/*
// 实际使用时取消注释
let api = match Api::new("ws://westend-rpc.polkadot.io:443") {
Ok(api) => api.set_signer(sr25519::Pair::from_string("//Alice", None).unwrap()),
Err(e) => {
println!("创建API客户端失败: {}", e);
return;
}
};
let extrinsic_params = PlainTipExtrinsicParamsBuilder::new()
.tip(10 * CENTS)
.era(Era::Immortal, api.genesis_hash())
.build();
println!("已创建extrinsic参数: {:?}", extrinsic_params);
*/
}
#[test]
fn test_constants() {
// 测试常量值是否正确
assert_eq!(DOLLARS, 10_000_000_000_000);
assert_eq!(CENTS, DOLLARS / 100);
assert_eq!(MILLICENTS, CENTS / 1_000);
}
代码说明
-
货币常量:
DOLLARS
: Westend网络的基本货币单位(1 DOT)CENTS
: 1 DOT的1/100MILLICENTS
: 1 CENTS的1/1000
-
时间常量:
MILLISECS_PER_BLOCK
: 每个区块的毫秒数BLOCKS_PER_ERA
: 每个era包含的区块数
-
网络常量:
WESTEND_NETWORK_ID
: Westend测试网的网络标识符
-
质押计算:
PERBILL_PER_ANNUAL
: 年化收益率(按十亿分之一计)YEAR
: 一年的秒数
-
客户端集成:
- 展示了如何与Substrate API客户端结合使用
- 需要实际网络连接才能运行(示例中已注释)
运行说明
- 将上述代码保存为
main.rs
- 确保
Cargo.toml
中包含依赖:[dependencies] westend-runtime-constants = "0.9.0" substrate-api-client = "0.9.0" sp-core = "4.0.0" sp-runtime = "4.0.0"
- 运行
cargo run
执行示例 - 运行
cargo test
执行测试
这个完整示例展示了westend-runtime-constants库的主要用法,包括货币计算、时间相关操作、网络标识获取以及与Substrate客户端的集成。