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节点开发所需的核心原语,包括:
- 区块链基本数据结构(区块、头、哈希等)
- 状态转换相关类型
- 共识机制相关类型
- 网络协议相关类型
这些原语是构建在Substrate框架之上的,为Polkadot生态系统的开发提供了基础组件。
所有权
该库由Parity Crate Owner维护。
1 回复
Rust区块链开发库polkadot-node-primitives使用指南
概述
polkadot-node-primitives
是Polkadot节点实现中使用的核心原语库,它为Substrate框架提供了基础组件,是构建Polkadot兼容区块链的重要工具。这个库包含了Polkadot网络运行所需的基本数据类型和功能。
主要功能
- 提供Polkadot共识相关的核心数据类型
- 包含平行链验证相关的原语
- 实现Polkadot运行时接口
- 提供区块构建和验证工具
使用方法
添加依赖
首先在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数据解压并验证成功");
}
注意事项
- 这个库主要面向Polkadot节点开发者和Substrate高级用户
- 需要熟悉Substrate框架的基本概念
- API可能会随着Polkadot版本更新而变化
- 生产环境使用时建议锁定特定版本