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);
}

主要功能

该库包含以下类型的常量:

  1. 货币相关常量:

    • DECIMALS: 货币小数位数
    • CURRENCY_SYMBOL: 货币符号
  2. 时间相关常量:

    • SLOT_DURATION: 每个区块的时间(毫秒)
    • EPOCH_DURATION_IN_SLOTS: 每个epoch的区块数
  3. 余额相关常量:

    • MAX_TRANSFER_AMOUNT: 最大转账金额
    • EXISTENTIAL_DEPOSIT: 账户最低存款金额
  4. Staking相关常量:

    • MINIMUM_VALIDATOR_COUNT: 最少验证人数量
    • MAX_VALIDATOR_COUNT: 最多验证人数量

开发建议

  1. 在开发Substrate pallet时,使用这些常量可以确保你的代码与Westend测试网兼容
  2. 当测试链上逻辑时,这些常量可以帮助你设置正确的参数
  3. 在进行跨链开发时,使用这些常量可以确保与其他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);
}

代码说明

  1. 货币常量:

    • DOLLARS: Westend网络的基本货币单位(1 DOT)
    • CENTS: 1 DOT的1/100
    • MILLICENTS: 1 CENTS的1/1000
  2. 时间常量:

    • MILLISECS_PER_BLOCK: 每个区块的毫秒数
    • BLOCKS_PER_ERA: 每个era包含的区块数
  3. 网络常量:

    • WESTEND_NETWORK_ID: Westend测试网的网络标识符
  4. 质押计算:

    • PERBILL_PER_ANNUAL: 年化收益率(按十亿分之一计)
    • YEAR: 一年的秒数
  5. 客户端集成:

    • 展示了如何与Substrate API客户端结合使用
    • 需要实际网络连接才能运行(示例中已注释)

运行说明

  1. 将上述代码保存为main.rs
  2. 确保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"
    
  3. 运行cargo run执行示例
  4. 运行cargo test执行测试

这个完整示例展示了westend-runtime-constants库的主要用法,包括货币计算、时间相关操作、网络标识获取以及与Substrate客户端的集成。

回到顶部