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客户端的集成。
        
      
                    
                  
                    
