NAC_Blockchain/nac-wallet-core/tests/wallet_integration_test.rs

374 lines
12 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.

//! 钱包核心集成测试
use nac_wallet_core::*;
use nac_wallet_core::mnemonic::{Language, MnemonicLength};
use nac_wallet_core::multisig::{MultisigScheme, Signer};
use nac_wallet_core::security::{EncryptionConfig, AuditEvent, AuditEventType, Operation, PermissionLevel};
#[test]
fn test_mnemonic_to_address() {
// 创建助记词
let entropy = vec![0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0];
let mnemonic = Mnemonic::from_entropy(&entropy, Language::English).unwrap();
// 创建派生路径
let path = DerivationPath::bip44(60, 0, 0, 0);
// 生成地址
let address = AddressGenerator::from_mnemonic(&mnemonic, &path, "").unwrap();
assert!(address.starts_with("0x"));
assert_eq!(address.len(), 42);
}
#[test]
fn test_batch_address_generation() {
// 创建助记词
let entropy = vec![0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0];
let mnemonic = Mnemonic::from_entropy(&entropy, Language::English).unwrap();
// 批量生成地址
let addresses = AddressGenerator::generate_addresses(&mnemonic, 60, 0, 10, "").unwrap();
assert_eq!(addresses.len(), 10);
for (address, path) in addresses {
assert!(address.starts_with("0x"));
assert_eq!(path.components().len(), 5);
}
}
#[test]
fn test_multisig_workflow() {
// 创建签名者
let signers = vec![
Signer::new("0x1111".to_string(), vec![1; 32]),
Signer::new("0x2222".to_string(), vec![2; 32]),
Signer::new("0x3333".to_string(), vec![3; 32]),
];
// 创建2-of-3多签配置
let config = MultisigConfig::m_of_n(signers.clone(), 2).unwrap();
let address = MultisigAddress::from_config(config, 1000);
// 创建签名收集器
let mut collector = SignatureCollector::new();
collector.register_address(address.clone());
// 创建交易
let tx_id = collector.create_transaction(
address.address().to_string(),
vec![1, 2, 3, 4, 5],
1000
).unwrap();
// 添加第一个签名
let sig1 = multisig::Signature::new(signers[0].address.clone(), vec![10, 20, 30], 1100);
collector.add_signature(&tx_id, sig1, 1100).unwrap();
// 此时不能广播只有1个签名
assert!(!collector.can_broadcast(&tx_id).unwrap());
// 添加第二个签名
let sig2 = multisig::Signature::new(signers[1].address.clone(), vec![40, 50, 60], 1200);
collector.add_signature(&tx_id, sig2, 1200).unwrap();
// 现在可以广播有2个签名
assert!(collector.can_broadcast(&tx_id).unwrap());
// 广播交易
collector.broadcast_transaction(&tx_id).unwrap();
let tx = collector.get_transaction(&tx_id).unwrap();
assert_eq!(tx.status, multisig::TransactionStatus::Broadcasted);
}
#[test]
fn test_weighted_multisig() {
// 创建加权签名者
let signers = vec![
Signer::new("0x1111".to_string(), vec![1; 32]).with_weight(3),
Signer::new("0x2222".to_string(), vec![2; 32]).with_weight(2),
Signer::new("0x3333".to_string(), vec![3; 32]).with_weight(1),
];
// 创建加权多签配置阈值为4
let config = MultisigConfig::weighted(signers.clone(), 4).unwrap();
let address = MultisigAddress::from_config(config, 1000);
let mut collector = SignatureCollector::new();
collector.register_address(address.clone());
let tx_id = collector.create_transaction(
address.address().to_string(),
vec![1, 2, 3],
1000
).unwrap();
// 添加权重为3的签名不够
let sig1 = multisig::Signature::new(signers[0].address.clone(), vec![1], 1100);
collector.add_signature(&tx_id, sig1, 1100).unwrap();
assert!(!collector.can_broadcast(&tx_id).unwrap());
// 添加权重为2的签名总权重5超过阈值4
let sig2 = multisig::Signature::new(signers[1].address.clone(), vec![2], 1200);
collector.add_signature(&tx_id, sig2, 1200).unwrap();
assert!(collector.can_broadcast(&tx_id).unwrap());
}
#[test]
fn test_hardware_wallet_integration() {
// 创建设备管理器
let mut manager = DeviceManager::new();
// 扫描设备
let devices = manager.scan_devices().unwrap();
assert!(devices.len() >= 2);
// 连接Ledger设备
manager.connect_ledger("ledger_001".to_string()).unwrap();
assert!(manager.is_connected("ledger_001"));
// 连接Trezor设备
manager.connect_trezor("trezor_001".to_string()).unwrap();
assert!(manager.is_connected("trezor_001"));
// 断开设备
manager.disconnect("ledger_001").unwrap();
assert!(!manager.is_connected("ledger_001"));
}
#[test]
fn test_secure_storage_workflow() {
// 创建安全存储
let mut storage = SecureStorage::default();
// 存储多个密钥
let password = "strong_password";
storage.store_key("key1".to_string(), b"secret_data_1", password).unwrap();
storage.store_key("key2".to_string(), b"secret_data_2", password).unwrap();
storage.store_key("key3".to_string(), b"secret_data_3", password).unwrap();
// 列出所有密钥
let keys = storage.list_keys();
assert_eq!(keys.len(), 3);
// 获取密钥
let data1 = storage.get_key("key1", password).unwrap();
assert_eq!(data1, b"secret_data_1");
// 删除密钥
storage.delete_key("key2").unwrap();
assert_eq!(storage.list_keys().len(), 2);
}
#[test]
fn test_permission_control() {
// 创建权限控制器
let mut controller = PermissionController::new();
// 添加用户
controller.add_user("user1".to_string(), PermissionLevel::ReadOnly);
controller.add_user("user2".to_string(), PermissionLevel::ReadWrite);
controller.add_user("admin".to_string(), PermissionLevel::Admin);
// 检查权限
assert!(controller.check_permission("user1", Operation::Read).is_ok());
assert!(controller.check_permission("user1", Operation::Write).is_err());
assert!(controller.check_permission("user2", Operation::Read).is_ok());
assert!(controller.check_permission("user2", Operation::Write).is_ok());
assert!(controller.check_permission("user2", Operation::Delete).is_err());
assert!(controller.check_permission("admin", Operation::Read).is_ok());
assert!(controller.check_permission("admin", Operation::Write).is_ok());
assert!(controller.check_permission("admin", Operation::Delete).is_ok());
assert!(controller.check_permission("admin", Operation::Export).is_ok());
}
#[test]
fn test_security_audit() {
// 创建审计器
let mut auditor = SecurityAuditor::new(1000);
// 记录事件
auditor.log_event(AuditEvent::new(
AuditEventType::KeyCreated,
"user1".to_string(),
"key1".to_string(),
None,
true,
1000,
"Created new key".to_string()
));
auditor.log_event(AuditEvent::new(
AuditEventType::KeyAccessed,
"user1".to_string(),
"key1".to_string(),
Some(Operation::Read),
true,
2000,
"Accessed key".to_string()
));
auditor.log_event(AuditEvent::new(
AuditEventType::AuthenticationFailed,
"user1".to_string(),
"key1".to_string(),
None,
false,
3000,
"Wrong password".to_string()
));
// 查询事件
let user1_events = auditor.query_events(Some("user1"), None);
assert_eq!(user1_events.len(), 3);
let failed_events = auditor.get_failed_events();
assert_eq!(failed_events.len(), 1);
// 获取统计
let stats = auditor.get_user_stats("user1");
assert_eq!(stats.total_events, 3);
assert_eq!(stats.successful_events, 2);
assert_eq!(stats.failed_events, 1);
}
#[test]
fn test_complete_wallet_workflow() {
// 1. 创建助记词
let entropy = vec![0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0];
let mnemonic = Mnemonic::from_entropy(&entropy, Language::English).unwrap();
// 2. 派生密钥
let seed = mnemonic.to_seed("");
let master_key = ExtendedKey::from_seed(&seed).unwrap();
let path = DerivationPath::bip44(60, 0, 0, 0);
let derived_key = master_key.derive_path(&path).unwrap();
// 3. 加密存储密钥
let mut storage = SecureStorage::default();
let password = "my_secure_password";
storage.store_key("master_key".to_string(), derived_key.private_key(), password).unwrap();
// 4. 设置权限
let mut controller = PermissionController::new();
controller.add_user("owner".to_string(), PermissionLevel::Admin);
// 5. 审计日志
let mut auditor = SecurityAuditor::new(1000);
auditor.log_event(AuditEvent::new(
AuditEventType::KeyCreated,
"owner".to_string(),
"master_key".to_string(),
None,
true,
1000,
"Wallet initialized".to_string()
));
// 6. 验证工作流
assert!(storage.has_key("master_key"));
assert!(controller.check_permission("owner", Operation::Export).is_ok());
assert_eq!(auditor.get_all_events().len(), 1);
}
#[test]
fn test_multisig_with_security() {
// 创建多签钱包
let signers = vec![
Signer::new("0x1111".to_string(), vec![1; 32]),
Signer::new("0x2222".to_string(), vec![2; 32]),
];
let config = MultisigConfig::m_of_n(signers.clone(), 2).unwrap();
let address = MultisigAddress::from_config(config, 1000);
// 设置权限
let mut controller = PermissionController::new();
controller.add_user("0x1111".to_string(), PermissionLevel::ReadWrite);
controller.add_user("0x2222".to_string(), PermissionLevel::ReadWrite);
// 审计
let mut auditor = SecurityAuditor::new(1000);
// 创建交易
let mut collector = SignatureCollector::new();
collector.register_address(address.clone());
let tx_id = collector.create_transaction(
address.address().to_string(),
vec![1, 2, 3],
1000
).unwrap();
// 第一个签名者签名
if controller.check_permission("0x1111", Operation::Sign).is_ok() {
let sig1 = multisig::Signature::new(signers[0].address.clone(), vec![1], 1100);
collector.add_signature(&tx_id, sig1, 1100).unwrap();
auditor.log_event(AuditEvent::new(
AuditEventType::SignOperation,
"0x1111".to_string(),
tx_id.clone(),
Some(Operation::Sign),
true,
1100,
"Signed multisig transaction".to_string()
));
}
// 第二个签名者签名
if controller.check_permission("0x2222", Operation::Sign).is_ok() {
let sig2 = multisig::Signature::new(signers[1].address.clone(), vec![2], 1200);
collector.add_signature(&tx_id, sig2, 1200).unwrap();
auditor.log_event(AuditEvent::new(
AuditEventType::SignOperation,
"0x2222".to_string(),
tx_id.clone(),
Some(Operation::Sign),
true,
1200,
"Signed multisig transaction".to_string()
));
}
// 验证
assert!(collector.can_broadcast(&tx_id).unwrap());
assert_eq!(auditor.get_all_events().len(), 2);
}
#[test]
fn test_hardware_wallet_with_security() {
// 创建设备管理器
let mut manager = DeviceManager::new();
// 权限控制
let mut controller = PermissionController::new();
controller.add_user("user1".to_string(), PermissionLevel::Admin);
// 审计
let mut auditor = SecurityAuditor::new(1000);
// 连接硬件钱包(需要管理员权限)
if controller.check_permission("user1", Operation::Write).is_ok() {
manager.connect_ledger("ledger_001".to_string()).unwrap();
auditor.log_event(AuditEvent::new(
AuditEventType::KeyAccessed,
"user1".to_string(),
"ledger_001".to_string(),
Some(Operation::Write),
true,
1000,
"Connected hardware wallet".to_string()
));
}
assert!(manager.is_connected("ledger_001"));
assert_eq!(auditor.get_all_events().len(), 1);
}