Rust区块链开发库polkadot-node-primitives的使用,Polkadot节点核心原语与Substrate框架基础组件

Rust区块链开发库polkadot-node-primitives的使用,Polkadot节点核心原语与Substrate框架基础组件

安装

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

cargo add polkadot-node-primitives

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

polkadot-node-primitives = "21.0.0"

基本信息

  • 版本: 21.0.0
  • 许可证: GPL-3.0-only
  • 大小: 43.9 KiB
  • Rust版本: 2021 edition

示例代码

以下是一个使用polkadot-node-primitives的基本示例:

use polkadot_node_primitives::{Block, Header, Hash};

fn main() {
    // 创建一个新区块头
    let header = Header {
        parent_hash: Hash::zero(),  // 父哈希
        number: 1,                  // 区块高度
        state_root: Hash::zero(),   // 状态根
        extrinsics_root: Hash::zero(), // 交易根
        digest: Default::default(), // 摘要
    };

    // 创建一个新区块
    let block = Block {
        header,
        extrinsics: Vec::new(), // 空交易列表
    };

    // 计算区块哈希
    let block_hash = block.hash();
    
    println!("Created new block with hash: {:?}", block_hash);
}

这个示例展示了如何使用polkadot-node-primitives库创建基本的区块链数据结构,包括区块头和完整的区块。

完整示例代码

以下是一个更完整的polkadot-node-primitives使用示例,展示了如何创建带有交易的区块:

use polkadot_node_primitives::{Block, Header, Hash, Extrinsic};
use sp_core::H256;

fn main() {
    // 创建父区块哈希
    let parent_hash = H256::from([1; 32]);
    
    // 创建一个新区块头
    let header = Header {
        parent_hash: Hash::from(parent_hash),  // 设置父哈希
        number: 2,                            // 区块高度
        state_root: Hash::zero(),             // 状态根
        extrinsics_root: Hash::zero(),        // 交易根
        digest: Default::default(),           // 摘要
    };

    // 创建一些示例交易
    let extrinsic1 = Extrinsic::new(b"tx_data_1".to_vec());
    let extrinsic2 = Extrinsic::new(b"tx_data_2".to_vec());

    // 创建一个带有交易的新区块
    let block = Block {
        header,
        extrinsics: vec![extrinsic1, extrinsic2], // 包含两个交易
    };

    // 计算并打印区块哈希
    let block_hash = block.hash();
    println!("Created new block with hash: {:?}", block_hash);
    
    // 打印区块信息
    println!("Block number: {}", block.header.number);
    println!("Parent hash: {:?}", block.header.parent_hash);
    println!("Contains {} extrinsics", block.extrinsics.len());
}

核心功能

polkadot-node-primitives提供了Polkadot节点开发所需的核心原语,包括:

  1. 区块链基本数据结构(区块、头、哈希等)
  2. 状态转换相关类型
  3. 共识机制相关类型
  4. 网络协议相关类型

这些原语是构建在Substrate框架之上的,为Polkadot生态系统的开发提供了基础组件。

所有权

该库由Parity Crate Owner维护。


1 回复

Rust区块链开发库polkadot-node-primitives使用指南

概述

polkadot-node-primitives是Polkadot节点实现中使用的核心原语库,它为Substrate框架提供了基础组件,是构建Polkadot兼容区块链的重要工具。这个库包含了Polkadot网络运行所需的基本数据类型和功能。

主要功能

  1. 提供Polkadot共识相关的核心数据类型
  2. 包含平行链验证相关的原语
  3. 实现Polkadot运行时接口
  4. 提供区块构建和验证工具

使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
polkadot-node-primitives = { git = "https://github.com/paritytech/polkadot-sdk.git", branch = "master" }

核心类型使用示例

use polkadot_node_primitives::{
    BlockWeight, AvailableData, ErasureChunk, PoV, 
    ValidationResult, InvalidDisputeStatementKind
};

// 创建区块权重
let block_weight = BlockWeight::max();

// 创建可用数据
let available_data = AvailableData {
    pov: Arc::new(PoV { block_data: vec![1, 2, 3].into() }),
    validation_data: Default::default(),
};

// 创建擦除编码块
let chunk = ErasureChunk {
    chunk: vec![1, 2, 3].into(),
    index: 0,
    proof: vec![].into(),
};

验证功能示例

use polkadot_node_primitives::{
    ValidDisputeStatementKind, ValidatorIndex, 
    ValidatorSignature, SigningContext
};

// 创建验证上下文
let signing_context = SigningContext {
    parent_hash: Default::default(),
    session_index: 1,
};

// 验证签名
let validator_index = ValidatorIndex(0);
let signature = ValidatorSignature::dummy();
let kind = ValidDisputeStatementKind::Explicit;

if kind.check_signature(
    &validator_public_key,
    &signature,
    &signing_context,
    validator_index,
) {
    println!("签名验证通过");
}

平行链验证示例

use polkadot_node_primitives::{
    MaybeCompressedPoV, CompressedPoV, UncompressedPoV,
    pov_decompress, pov_compress
};

// 压缩PoV数据
let uncompressed = UncompressedPoV {
    block_data: vec![1, 2, 3, 4, 5].into(),
};
let compressed = pov_compress(&uncompressed).unwrap();

// 解压PoV数据
let decompressed = pov_decompress(&compressed).unwrap();
assert_eq!(decompressed.block_data, uncompressed.block_data);

高级用法

自定义验证逻辑

use polkadot_node_primitives::{
    CandidateReceipt, PersistedValidationData, ValidationCode
};

fn validate_candidate(
    candidate: &CandidateReceipt,
    validation_data: &PersistedValidationData,
    validation_code: &ValidationCode,
) -> bool {
    // 实现自定义验证逻辑
    true
}

创建自定义声明

use polkadot_node-primitives::{
    DisputeStatement, DisputeStatementSet, SignedDisputeStatement
};

let statement = DisputeStatement::Valid(ValidDisputeStatementKind::Explicit);
let signed_statement = SignedDisputeStatement::sign(
    statement,
    &validator_id,
    &signing_context,
    validator_index,
    &key_pair,
).unwrap();

let statement_set = DisputeStatementSet {
    candidate_hash: Default::default(),
    session: 1,
    statements: vec![(validator_index, signed_statement)].into_iter().collect(),
};

完整示例Demo

下面是一个综合使用polkadot-node-primitives的完整示例:

use polkadot_node_primitives::{
    BlockWeight, AvailableData, PoV, 
    ValidDisputeStatementKind, ValidatorIndex,
    SigningContext, ValidatorSignature,
    MaybeCompressedPoV, pov_compress, pov_decompress
};
use sp_core::crypto::Pair;
use sp_application_crypto::sr25519;
use std::sync::Arc;

fn main() {
    // 1. 创建区块权重和可用数据
    let block_weight = BlockWeight::max();
    println!("创建区块权重: {:?}", block_weight);

    let available_data = AvailableData {
        pov: Arc::new(PoV { block_data: vec![1, 2, 3].into() }),
        validation_data: Default::default(),
    };
    println!("创建可用数据: {:?}", available_data);

    // 2. 签名验证示例
    let signing_context = SigningContext {
        parent_hash: Default::default(),
        session_index: 1,
    };

    let key_pair = sr25519::Pair::generate().0;
    let validator_index = ValidatorIndex(0);
    let kind = ValidDisputeStatementKind::Explicit;
    
    let signature = ValidatorSignature::dummy(); // 实际使用时应该用真实签名
    
    if kind.check_signature(
        &key_pair.public(),
        &signature,
        &signing_context,
        validator_index,
    ) {
        println!("签名验证通过");
    } else {
        println!("签名验证失败");
    }

    // 3. PoV数据压缩示例
    let uncompressed = MaybeCompressedPoV::Uncompressed(UncompressedPoV {
        block_data: vec![1, 2, 3, 4, 5].into(),
    });
    
    let compressed = pov_compress(&uncompressed).unwrap();
    println!("PoV数据压缩成功");
    
    let decompressed = pov_decompress(&compressed).unwrap();
    assert_eq!(decompressed.uncompressed().unwrap().block_data, uncompressed.uncompressed().unwrap().block_data);
    println!("PoV数据解压并验证成功");
}

注意事项

  1. 这个库主要面向Polkadot节点开发者和Substrate高级用户
  2. 需要熟悉Substrate框架的基本概念
  3. API可能会随着Polkadot版本更新而变化
  4. 生产环境使用时建议锁定特定版本
回到顶部