NAC_Blockchain/protocol/nac-cbpp/tests/integration_test.rs

283 lines
9.0 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! CBPP集成测试
//!
//! 测试各模块之间的集成和完整的共识流程
use nac_cbpp::*;
use nac_cbpp::fork::ForkChain;
#[test]
fn test_full_consensus_flow() {
// 1. 创建验证者集合
let mut validator_set = ValidatorSet::new();
validator_set.add_validator(Validator::new("validator1".to_string(), 1000));
validator_set.add_validator(Validator::new("validator2".to_string(), 1000));
validator_set.add_validator(Validator::new("validator3".to_string(), 1000));
// 2. 创建共识引擎
let mut engine = ConsensusEngine::new();
engine.set_validator_set(validator_set);
// 3. 开始新高度
engine.start_new_height(1);
assert_eq!(engine.state(), ConsensusState::NewHeight);
// 4. 进入提议阶段
engine.enter_propose();
assert_eq!(engine.state(), ConsensusState::Propose);
// 5. 创建并验证区块
let block = Block::new(1, "genesis".to_string(), "validator1".to_string());
assert!(engine.handle_proposal(block));
assert_eq!(engine.state(), ConsensusState::Prevote);
}
#[test]
fn test_block_validation_integration() {
// 创建区块验证器
let validator = BlockValidator::new();
// 创建区块使用长地址满足KYC要求
let mut block = Block::new(0, "0".repeat(96), "0x1234567890123456789012345678901234567890".to_string());
block.header.state_root = "0".repeat(64);
block.header.timestamp = chrono::Utc::now();
// 计算Merkle根空交易列表
block.header.merkle_root = "0".repeat(64);
// 验证区块
match validator.validate_block(&block, None) {
Ok(_) => {},
Err(e) => panic!("Validation failed: {:?}", e),
}
}
#[test]
fn test_signature_integration() {
// 创建密钥管理器
let mut key_manager = KeyManager::new();
// 生成密钥对
let (private_key, public_key) = key_manager.generate_key_pair("validator1".to_string()).expect("mainnet: handle error");
// 签名消息
let message = b"Test block";
let signature = private_key.sign(message);
// 验证签名
assert!(public_key.verify(message, &signature).is_ok());
// 创建聚合签名
let mut aggregate = AggregateSignature::new();
assert!(aggregate.add_signature(&signature, &public_key).is_ok());
assert_eq!(aggregate.signer_count(), 1);
}
#[test]
fn test_timeout_integration() {
// 创建超时管理器
let mut timeout_manager = TimeoutManager::with_default_config();
// 启动超时
timeout_manager.start_timeout(
"proposal_1_0".to_string(),
TimeoutType::Proposal,
1,
0,
);
assert_eq!(timeout_manager.active_timer_count(), 1);
// 取消超时
assert!(timeout_manager.cancel_timeout("proposal_1_0"));
assert_eq!(timeout_manager.active_timer_count(), 0);
}
#[test]
fn test_fork_detection_integration() {
// 创建分叉检测器
let mut detector = ForkDetector::new(1);
// 添加相同高度的不同区块
let block1 = Block::new(1, "genesis".to_string(), "validator1".to_string());
let block2 = Block::new(1, "genesis".to_string(), "validator2".to_string());
// 第一个区块不应触发分叉
assert!(detector.add_block(block1).expect("mainnet: handle error").is_none());
// 第二个区块应触发分叉
let fork = detector.add_block(block2).expect("mainnet: handle error");
assert!(fork.is_some());
// 检查分叉信息
let fork_info = fork.expect("mainnet: handle error");
assert_eq!(fork_info.fork_height, 1);
assert_eq!(fork_info.chains.len(), 2);
}
#[test]
fn test_fork_choice_integration() {
// 创建分叉选择器
let selector = ForkChoiceSelector::new(ForkChoiceRule::LongestChain);
// 创建分叉信息
let mut fork_info = ForkInfo::new("test_fork".to_string(), 1);
// 创建两条链
let mut chain1 = ForkChain::new("chain1".to_string());
chain1.add_block(Block::new(1, "genesis".to_string(), "v1".to_string()));
let mut chain2 = ForkChain::new("chain2".to_string());
chain2.add_block(Block::new(1, "genesis".to_string(), "v2".to_string()));
chain2.add_block(Block::new(2, "block1".to_string(), "v2".to_string()));
fork_info.add_chain(chain1);
fork_info.add_chain(chain2);
// 选择最佳链
let best_chain = selector.select_best_chain(&fork_info).expect("mainnet: handle error");
assert_eq!(best_chain.id, "chain2");
assert_eq!(best_chain.length(), 2);
}
#[test]
fn test_complete_consensus_with_validation() {
// 创建完整的共识环境
let mut validator_set = ValidatorSet::new();
validator_set.add_validator(Validator::new("v1".to_string(), 1000));
validator_set.add_validator(Validator::new("v2".to_string(), 1000));
validator_set.add_validator(Validator::new("v3".to_string(), 1000));
let mut engine = ConsensusEngine::new();
engine.set_validator_set(validator_set);
let block_validator = BlockValidator::new();
let mut key_manager = KeyManager::new();
// 生成验证者密钥
for i in 1..=3 {
key_manager.generate_key_pair(format!("v{}", i)).expect("mainnet: handle error");
}
// 开始共识
engine.start_new_height(1);
engine.enter_propose();
// 创建并验证区块使用长地址满足KYC要求
let mut block = Block::new(0, "0".repeat(96), "0x1234567890123456789012345678901234567890".to_string());
block.header.state_root = "0".repeat(64);
block.header.timestamp = chrono::Utc::now();
block.header.merkle_root = "0".repeat(64);
// 验证区块
assert!(block_validator.validate_block(&block, None).is_ok());
// 处理提议
assert!(engine.handle_proposal(block));
}
#[test]
fn test_timeout_with_recovery() {
use std::thread;
use std::time::Duration;
// 创建超时管理器(短超时用于测试)
let mut config = TimeoutConfig::default_config();
config.proposal_timeout = 1; // 1秒
let mut timeout_manager = TimeoutManager::new(config).expect("mainnet: handle error");
// 启动超时
timeout_manager.start_timeout(
"test_timeout".to_string(),
TimeoutType::Proposal,
1,
0,
);
// 等待超时
thread::sleep(Duration::from_secs(2));
// 检查超时事件
let events = timeout_manager.check_timeouts();
assert_eq!(events.len(), 1);
assert_eq!(events[0].timeout_type, TimeoutType::Proposal);
}
#[test]
fn test_compliance_checking() {
let mut validator = BlockValidator::new();
// 添加黑名单地址
validator.compliance_checker_mut().add_to_blacklist("0x_malicious".to_string());
// 创建区块
let block = Block::new(1, "genesis".to_string(), "0x_malicious".to_string());
// 应该失败(提议者在黑名单中)
assert!(validator.validate_block(&block, None).is_err());
}
#[test]
fn test_aggregate_signature_verification() {
let mut key_manager = KeyManager::new();
// 生成多个密钥对
let (pk1, pub1) = key_manager.generate_key_pair("v1".to_string()).expect("mainnet: handle error");
let (pk2, pub2) = key_manager.generate_key_pair("v2".to_string()).expect("mainnet: handle error");
let (pk3, pub3) = key_manager.generate_key_pair("v3".to_string()).expect("mainnet: handle error");
// 签名相同消息
let message = b"Block proposal";
let sig1 = pk1.sign(message);
let sig2 = pk2.sign(message);
let sig3 = pk3.sign(message);
// 创建聚合签名
let mut aggregate = AggregateSignature::new();
assert!(aggregate.add_signature(&sig1, &pub1).is_ok());
assert!(aggregate.add_signature(&sig2, &pub2).is_ok());
assert!(aggregate.add_signature(&sig3, &pub3).is_ok());
assert_eq!(aggregate.signer_count(), 3);
assert!(aggregate.verify(message).is_ok());
}
#[test]
fn test_fork_prevention() {
let mut prevention = ForkPrevention::new(3, 1000);
// 添加恶意验证者到黑名单
prevention.add_to_blacklist("malicious_validator".to_string());
// 创建由恶意验证者提议的区块
let block = Block::new(1, "genesis".to_string(), "malicious_validator".to_string());
// 应该被阻止
assert!(prevention.check_block(&block).is_err());
// 正常验证者应该通过
let good_block = Block::new(1, "genesis".to_string(), "good_validator".to_string());
assert!(prevention.check_block(&good_block).is_ok());
}
#[test]
fn test_multi_round_consensus() {
let mut validator_set = ValidatorSet::new();
validator_set.add_validator(Validator::new("v1".to_string(), 1000));
validator_set.add_validator(Validator::new("v2".to_string(), 1000));
let mut engine = ConsensusEngine::new();
engine.set_validator_set(validator_set);
// 第一轮
engine.start_new_height(1);
engine.enter_propose();
let block1 = Block::new(1, "genesis".to_string(), "v1".to_string());
assert!(engine.handle_proposal(block1));
// 第二轮
engine.start_new_height(2);
engine.enter_propose();
let block2 = Block::new(2, "block1".to_string(), "v2".to_string());
assert!(engine.handle_proposal(block2));
}