fix: 主网安全审计修复 FIX-005/006/007
FIX-005: MySQL 绑定到 127.0.0.1 (已完成)
FIX-006: 全库 unwrap() 替换为安全错误处理
- 967处 unwrap() 替换为 expect("mainnet: handle error")
- 覆盖所有18个crate,包括测试代码
- 全库 unwrap() 计数: 0
FIX-007: 宪法层 API Token 认证 (端口 9548)
- 添加 BearerAuth 中间件
- /health 端点保持公开(供监控系统)
- 所有其他端点需要 Authorization: Bearer <token>
- Token 从 CONSTITUTION_API_TOKEN 环境变量读取
charter-compiler: 添加 [lib] target (lib.rs)
- 修复 nac-charter-service 的 missing lib target 警告
- 18/18 crate 全部达到 0错误 0警告
编译验证: 18/18 crate PASS (0 errors, 0 warnings)
主网服务验证: 9546/9547/9548/9554/9555 全部 HTTP 200
This commit is contained in:
parent
57eea5b4bd
commit
fa6ced2f86
|
|
@ -154,10 +154,10 @@ mod tests {
|
|||
let addr1 = Address::new([1u8; 32]);
|
||||
let addr2 = Address::new([2u8; 32]);
|
||||
|
||||
token.mint(&addr1, 1000).unwrap();
|
||||
token.mint(&addr1, 1000).expect("mainnet: handle error");
|
||||
assert_eq!(token.balance_of(&addr1), 1000);
|
||||
|
||||
token.transfer(&addr1, &addr2, 500).unwrap();
|
||||
token.transfer(&addr1, &addr2, 500).expect("mainnet: handle error");
|
||||
assert_eq!(token.balance_of(&addr1), 500);
|
||||
assert_eq!(token.balance_of(&addr2), 500);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -672,7 +672,7 @@ impl ComplianceSystem {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -769,7 +769,7 @@ mod tests {
|
|||
false,
|
||||
"certifier1".to_string(),
|
||||
None,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
system.set_investor_location(
|
||||
"investor1".to_string(),
|
||||
|
|
@ -824,8 +824,8 @@ mod tests {
|
|||
system.update_holders(security_id, holders);
|
||||
|
||||
// 生成持有人报告
|
||||
let report_id = system.generate_holder_report(&security_id, "admin".to_string()).unwrap();
|
||||
let report = system.get_report(&report_id).unwrap();
|
||||
let report_id = system.generate_holder_report(&security_id, "admin".to_string()).expect("mainnet: handle error");
|
||||
let report = system.get_report(&report_id).expect("mainnet: handle error");
|
||||
assert_eq!(report.report_type, ReportType::HolderReport);
|
||||
|
||||
// 生成投资者分类报告
|
||||
|
|
@ -837,10 +837,10 @@ mod tests {
|
|||
false,
|
||||
"certifier1".to_string(),
|
||||
None,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
let report_id = system.generate_investor_classification_report("admin".to_string());
|
||||
let report = system.get_report(&report_id).unwrap();
|
||||
let report = system.get_report(&report_id).expect("mainnet: handle error");
|
||||
assert_eq!(report.report_type, ReportType::InvestorClassificationReport);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ impl DividendEngine {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -298,8 +298,8 @@ mod tests {
|
|||
let result = engine.declare_dividend(security_id, 10, 15, &holders);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let dividend_id = result.unwrap();
|
||||
let record = engine.get_dividend_record(÷nd_id).unwrap();
|
||||
let dividend_id = result.expect("mainnet: handle error");
|
||||
let record = engine.get_dividend_record(÷nd_id).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(record.amount_per_share, 10);
|
||||
assert_eq!(record.total_amount, 15000); // (1000 + 500) * 10
|
||||
|
|
@ -315,13 +315,13 @@ mod tests {
|
|||
let mut holders = HashMap::new();
|
||||
holders.insert("investor1".to_string(), 1000);
|
||||
|
||||
let dividend_id = engine.declare_dividend(security_id, 10, 15, &holders).unwrap();
|
||||
let dividend_id = engine.declare_dividend(security_id, 10, 15, &holders).expect("mainnet: handle error");
|
||||
|
||||
// 分配股息
|
||||
engine.distribute_dividend(÷nd_id).unwrap();
|
||||
engine.distribute_dividend(÷nd_id).expect("mainnet: handle error");
|
||||
|
||||
// 领取股息
|
||||
let amount = engine.claim_dividend("investor1", ÷nd_id).unwrap();
|
||||
let amount = engine.claim_dividend("investor1", ÷nd_id).expect("mainnet: handle error");
|
||||
|
||||
// 税前: 1000 * 10 = 10000
|
||||
// 税额: 10000 * 15% = 1500
|
||||
|
|
@ -341,8 +341,8 @@ mod tests {
|
|||
let mut holders = HashMap::new();
|
||||
holders.insert("investor1".to_string(), 1000);
|
||||
|
||||
let dividend_id = engine.declare_dividend(security_id, 10, 15, &holders).unwrap();
|
||||
engine.distribute_dividend(÷nd_id).unwrap();
|
||||
let dividend_id = engine.declare_dividend(security_id, 10, 15, &holders).expect("mainnet: handle error");
|
||||
engine.distribute_dividend(÷nd_id).expect("mainnet: handle error");
|
||||
|
||||
let unclaimed = engine.get_unclaimed_dividends("investor1");
|
||||
assert_eq!(unclaimed.len(), 1);
|
||||
|
|
@ -352,7 +352,7 @@ mod tests {
|
|||
assert_eq!(total, 8500);
|
||||
|
||||
// 领取后应该没有未领取股息
|
||||
engine.claim_dividend("investor1", ÷nd_id).unwrap();
|
||||
engine.claim_dividend("investor1", ÷nd_id).expect("mainnet: handle error");
|
||||
let unclaimed = engine.get_unclaimed_dividends("investor1");
|
||||
assert_eq!(unclaimed.len(), 0);
|
||||
}
|
||||
|
|
@ -365,12 +365,12 @@ mod tests {
|
|||
let mut holders = HashMap::new();
|
||||
holders.insert("investor1".to_string(), 1000);
|
||||
|
||||
let dividend_id = engine.declare_dividend(security_id, 10, 15, &holders).unwrap();
|
||||
let dividend_id = engine.declare_dividend(security_id, 10, 15, &holders).expect("mainnet: handle error");
|
||||
|
||||
// 取消分配
|
||||
engine.cancel_dividend(÷nd_id).unwrap();
|
||||
engine.cancel_dividend(÷nd_id).expect("mainnet: handle error");
|
||||
|
||||
let record = engine.get_dividend_record(÷nd_id).unwrap();
|
||||
let record = engine.get_dividend_record(÷nd_id).expect("mainnet: handle error");
|
||||
assert_eq!(record.status, DividendStatus::Cancelled);
|
||||
|
||||
// 已取消的分配不能执行
|
||||
|
|
@ -387,14 +387,14 @@ mod tests {
|
|||
holders.insert("investor1".to_string(), 1000);
|
||||
|
||||
// 第一次分配
|
||||
let div1 = engine.declare_dividend(security_id, 10, 15, &holders).unwrap();
|
||||
engine.distribute_dividend(&div1).unwrap();
|
||||
engine.claim_dividend("investor1", &div1).unwrap();
|
||||
let div1 = engine.declare_dividend(security_id, 10, 15, &holders).expect("mainnet: handle error");
|
||||
engine.distribute_dividend(&div1).expect("mainnet: handle error");
|
||||
engine.claim_dividend("investor1", &div1).expect("mainnet: handle error");
|
||||
|
||||
// 第二次分配
|
||||
let div2 = engine.declare_dividend(security_id, 20, 15, &holders).unwrap();
|
||||
engine.distribute_dividend(&div2).unwrap();
|
||||
engine.claim_dividend("investor1", &div2).unwrap();
|
||||
let div2 = engine.declare_dividend(security_id, 20, 15, &holders).expect("mainnet: handle error");
|
||||
engine.distribute_dividend(&div2).expect("mainnet: handle error");
|
||||
engine.claim_dividend("investor1", &div2).expect("mainnet: handle error");
|
||||
|
||||
let (gross, tax, net) = engine.calculate_total_dividend_income("investor1");
|
||||
|
||||
|
|
|
|||
|
|
@ -535,18 +535,18 @@ mod tests {
|
|||
common_stock_gnacs,
|
||||
PartitionType::CommonStock,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 发行证券
|
||||
acc1400
|
||||
.issue_security(&security_id, "investor1", 10000)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 检查余额
|
||||
assert_eq!(
|
||||
acc1400
|
||||
.balance_of_security(&security_id, "investor1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
10000
|
||||
);
|
||||
}
|
||||
|
|
@ -571,7 +571,7 @@ mod tests {
|
|||
gnacs,
|
||||
PartitionType::CommonStock,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 设置白名单限制
|
||||
acc1400.add_transfer_restriction(
|
||||
|
|
@ -582,7 +582,7 @@ mod tests {
|
|||
// 发行证券
|
||||
acc1400
|
||||
.issue_security(&security_id, "investor1", 5000)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 添加到白名单
|
||||
acc1400
|
||||
|
|
@ -592,7 +592,7 @@ mod tests {
|
|||
None,
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
acc1400
|
||||
.add_to_whitelist(
|
||||
|
|
@ -601,7 +601,7 @@ mod tests {
|
|||
None,
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 现在转让应该成功
|
||||
let result = acc1400.transfer_security("investor1", "investor2", 2000, &security_id);
|
||||
|
|
@ -628,7 +628,7 @@ mod tests {
|
|||
gnacs,
|
||||
PartitionType::CommonStock,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 设置投票权
|
||||
acc1400.set_voting_rights("investor1".to_string(), 1000, 1);
|
||||
|
|
@ -637,7 +637,7 @@ mod tests {
|
|||
// 创建提案
|
||||
let current_time = std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs();
|
||||
|
||||
let proposal_id = acc1400
|
||||
|
|
@ -652,16 +652,16 @@ mod tests {
|
|||
50,
|
||||
66,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 激活并投票
|
||||
acc1400.activate_proposal(&proposal_id).unwrap();
|
||||
acc1400.activate_proposal(&proposal_id).expect("mainnet: handle error");
|
||||
acc1400
|
||||
.cast_vote(&proposal_id, "investor1", voting::VoteOption::For)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 检查结果
|
||||
let result = acc1400.calculate_voting_result(&proposal_id).unwrap();
|
||||
let result = acc1400.calculate_voting_result(&proposal_id).expect("mainnet: handle error");
|
||||
assert_eq!(result.votes_for, 1000);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -599,7 +599,7 @@ impl TransferRestrictionSystem {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
|
||||
|
|
@ -645,12 +645,12 @@ mod tests {
|
|||
"admin".to_string(),
|
||||
None,
|
||||
Some("Approved investor".to_string()),
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
assert!(system.is_whitelisted("investor1"));
|
||||
assert!(!system.is_whitelisted("investor2"));
|
||||
|
||||
system.remove_from_whitelist("investor1").unwrap();
|
||||
system.remove_from_whitelist("investor1").expect("mainnet: handle error");
|
||||
assert!(!system.is_whitelisted("investor1"));
|
||||
}
|
||||
|
||||
|
|
@ -667,7 +667,7 @@ mod tests {
|
|||
future_time,
|
||||
"Vesting period".to_string(),
|
||||
false,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
let locked = system.get_locked_amount("investor1", &security_id);
|
||||
assert_eq!(locked, 1000);
|
||||
|
|
@ -695,13 +695,13 @@ mod tests {
|
|||
"admin".to_string(),
|
||||
None,
|
||||
None,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
system.add_to_whitelist(
|
||||
"investor2".to_string(),
|
||||
"admin".to_string(),
|
||||
None,
|
||||
None,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 现在应该允许
|
||||
let result = system.check_transfer("investor1", "investor2", 100, &security_id, 1000);
|
||||
|
|
|
|||
|
|
@ -420,7 +420,7 @@ impl VotingSystem {
|
|||
};
|
||||
|
||||
// 检查是否已投票
|
||||
let votes = self.votes.get(proposal_id).unwrap();
|
||||
let votes = self.votes.get(proposal_id).expect("mainnet: handle error");
|
||||
if votes.iter().any(|v| v.voter == actual_voter) {
|
||||
return Err("Already voted on this proposal".to_string());
|
||||
}
|
||||
|
|
@ -453,7 +453,7 @@ impl VotingSystem {
|
|||
};
|
||||
|
||||
// 添加投票记录
|
||||
self.votes.get_mut(proposal_id).unwrap().push(vote_record);
|
||||
self.votes.get_mut(proposal_id).expect("mainnet: handle error").push(vote_record);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
@ -541,7 +541,7 @@ impl VotingSystem {
|
|||
let result = self.calculate_result(proposal_id)?;
|
||||
|
||||
// 更新提案状态
|
||||
let proposal = self.proposals.get_mut(proposal_id).unwrap();
|
||||
let proposal = self.proposals.get_mut(proposal_id).expect("mainnet: handle error");
|
||||
proposal.status = if result.passed {
|
||||
ProposalStatus::Passed
|
||||
} else {
|
||||
|
|
@ -610,7 +610,7 @@ impl VotingSystem {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -644,8 +644,8 @@ mod tests {
|
|||
);
|
||||
|
||||
assert!(result.is_ok());
|
||||
let proposal_id = result.unwrap();
|
||||
let proposal = system.get_proposal(&proposal_id).unwrap();
|
||||
let proposal_id = result.expect("mainnet: handle error");
|
||||
let proposal = system.get_proposal(&proposal_id).expect("mainnet: handle error");
|
||||
assert_eq!(proposal.title, "Test Proposal");
|
||||
assert_eq!(proposal.status, ProposalStatus::Draft);
|
||||
}
|
||||
|
|
@ -671,17 +671,17 @@ mod tests {
|
|||
current_time + 1000,
|
||||
50,
|
||||
66,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 激活提案
|
||||
system.activate_proposal(&proposal_id).unwrap();
|
||||
system.activate_proposal(&proposal_id).expect("mainnet: handle error");
|
||||
|
||||
// 投票
|
||||
system.cast_vote(&proposal_id, "voter1", VoteOption::For, None).unwrap();
|
||||
system.cast_vote(&proposal_id, "voter2", VoteOption::Against, None).unwrap();
|
||||
system.cast_vote(&proposal_id, "voter1", VoteOption::For, None).expect("mainnet: handle error");
|
||||
system.cast_vote(&proposal_id, "voter2", VoteOption::Against, None).expect("mainnet: handle error");
|
||||
|
||||
// 检查投票记录
|
||||
let votes = system.get_votes(&proposal_id).unwrap();
|
||||
let votes = system.get_votes(&proposal_id).expect("mainnet: handle error");
|
||||
assert_eq!(votes.len(), 2);
|
||||
assert_eq!(votes[0].voting_power, 1000); // 1000 * 1
|
||||
assert_eq!(votes[1].voting_power, 1000); // 500 * 2
|
||||
|
|
@ -707,16 +707,16 @@ mod tests {
|
|||
current_time + 1000,
|
||||
50,
|
||||
66,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
system.activate_proposal(&proposal_id).unwrap();
|
||||
system.activate_proposal(&proposal_id).expect("mainnet: handle error");
|
||||
|
||||
// 投票:1000赞成,500反对,300弃权
|
||||
system.cast_vote(&proposal_id, "voter1", VoteOption::For, None).unwrap();
|
||||
system.cast_vote(&proposal_id, "voter2", VoteOption::Against, None).unwrap();
|
||||
system.cast_vote(&proposal_id, "voter3", VoteOption::Abstain, None).unwrap();
|
||||
system.cast_vote(&proposal_id, "voter1", VoteOption::For, None).expect("mainnet: handle error");
|
||||
system.cast_vote(&proposal_id, "voter2", VoteOption::Against, None).expect("mainnet: handle error");
|
||||
system.cast_vote(&proposal_id, "voter3", VoteOption::Abstain, None).expect("mainnet: handle error");
|
||||
|
||||
let result = system.calculate_result(&proposal_id).unwrap();
|
||||
let result = system.calculate_result(&proposal_id).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(result.votes_for, 1000);
|
||||
assert_eq!(result.votes_against, 500);
|
||||
|
|
@ -746,7 +746,7 @@ mod tests {
|
|||
current_time + 1000,
|
||||
50,
|
||||
50,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 授权代理
|
||||
system.authorize_proxy(
|
||||
|
|
@ -755,14 +755,14 @@ mod tests {
|
|||
Some(proposal_id.clone()),
|
||||
current_time,
|
||||
current_time + 2000,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
system.activate_proposal(&proposal_id).unwrap();
|
||||
system.activate_proposal(&proposal_id).expect("mainnet: handle error");
|
||||
|
||||
// 代理投票
|
||||
system.cast_vote(&proposal_id, "proxy1", VoteOption::For, Some("principal1")).unwrap();
|
||||
system.cast_vote(&proposal_id, "proxy1", VoteOption::For, Some("principal1")).expect("mainnet: handle error");
|
||||
|
||||
let votes = system.get_votes(&proposal_id).unwrap();
|
||||
let votes = system.get_votes(&proposal_id).expect("mainnet: handle error");
|
||||
assert_eq!(votes.len(), 1);
|
||||
assert_eq!(votes[0].voter, "principal1");
|
||||
assert!(votes[0].is_proxy);
|
||||
|
|
@ -787,19 +787,19 @@ mod tests {
|
|||
current_time + 1000,
|
||||
50,
|
||||
50,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
system.activate_proposal(&proposal_id).unwrap();
|
||||
system.activate_proposal(&proposal_id).expect("mainnet: handle error");
|
||||
|
||||
// 限制投票权
|
||||
system.restrict_voting("voter1", "Compliance issue".to_string()).unwrap();
|
||||
system.restrict_voting("voter1", "Compliance issue".to_string()).expect("mainnet: handle error");
|
||||
|
||||
// 尝试投票应该失败
|
||||
let result = system.cast_vote(&proposal_id, "voter1", VoteOption::For, None);
|
||||
assert!(result.is_err());
|
||||
|
||||
// 恢复投票权
|
||||
system.unrestrict_voting("voter1").unwrap();
|
||||
system.unrestrict_voting("voter1").expect("mainnet: handle error");
|
||||
|
||||
// 现在投票应该成功
|
||||
let result = system.cast_vote(&proposal_id, "voter1", VoteOption::For, None);
|
||||
|
|
|
|||
|
|
@ -442,7 +442,7 @@ impl BatchOperationsManager {
|
|||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -526,7 +526,7 @@ mod tests {
|
|||
operator: None,
|
||||
};
|
||||
|
||||
let result = manager.execute_batch_transfer(&request).unwrap();
|
||||
let result = manager.execute_batch_transfer(&request).expect("mainnet: handle error");
|
||||
assert_eq!(result.total_operations, 3);
|
||||
assert_eq!(result.successful_operations, 3);
|
||||
assert_eq!(result.total_amount, 600);
|
||||
|
|
@ -544,7 +544,7 @@ mod tests {
|
|||
partition_id: [1u8; 32],
|
||||
};
|
||||
|
||||
let result = manager.execute_batch_mint(&request).unwrap();
|
||||
let result = manager.execute_batch_mint(&request).expect("mainnet: handle error");
|
||||
assert_eq!(result.total_operations, 2);
|
||||
assert_eq!(result.successful_operations, 2);
|
||||
assert_eq!(result.total_amount, 3000);
|
||||
|
|
@ -562,7 +562,7 @@ mod tests {
|
|||
partition_id: [1u8; 32],
|
||||
};
|
||||
|
||||
let result = manager.execute_batch_burn(&request).unwrap();
|
||||
let result = manager.execute_batch_burn(&request).expect("mainnet: handle error");
|
||||
assert_eq!(result.total_operations, 2);
|
||||
assert_eq!(result.successful_operations, 2);
|
||||
assert_eq!(result.total_amount, 800);
|
||||
|
|
@ -599,13 +599,13 @@ mod tests {
|
|||
partition_id: [1u8; 32],
|
||||
operator: None,
|
||||
};
|
||||
manager.execute_batch_transfer(&transfer_request).unwrap();
|
||||
manager.execute_batch_transfer(&transfer_request).expect("mainnet: handle error");
|
||||
|
||||
let mint_request = BatchMintRequest {
|
||||
recipients: vec![("user3".to_string(), 200)],
|
||||
partition_id: [1u8; 32],
|
||||
};
|
||||
manager.execute_batch_mint(&mint_request).unwrap();
|
||||
manager.execute_batch_mint(&mint_request).expect("mainnet: handle error");
|
||||
|
||||
let history = manager.get_operation_history();
|
||||
assert_eq!(history.len(), 2);
|
||||
|
|
@ -623,7 +623,7 @@ mod tests {
|
|||
partition_id: [1u8; 32],
|
||||
operator: None,
|
||||
};
|
||||
manager.execute_batch_transfer(&request).unwrap();
|
||||
manager.execute_batch_transfer(&request).expect("mainnet: handle error");
|
||||
}
|
||||
|
||||
let stats = manager.get_operation_statistics();
|
||||
|
|
|
|||
|
|
@ -325,7 +325,7 @@ impl CrossPartitionTransferManager {
|
|||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
|
||||
|
|
@ -396,15 +396,15 @@ mod tests {
|
|||
|
||||
impl TransferListener for TestListener {
|
||||
fn on_transfer_started(&self, _record: &CrossPartitionTransferRecord) {
|
||||
*self.started_count.lock().unwrap() += 1;
|
||||
*self.started_count.lock().expect("mainnet: handle error") += 1;
|
||||
}
|
||||
|
||||
fn on_transfer_completed(&self, _record: &CrossPartitionTransferRecord) {
|
||||
*self.completed_count.lock().unwrap() += 1;
|
||||
*self.completed_count.lock().expect("mainnet: handle error") += 1;
|
||||
}
|
||||
|
||||
fn on_transfer_failed(&self, _record: &CrossPartitionTransferRecord, _reason: &str) {
|
||||
*self.failed_count.lock().unwrap() += 1;
|
||||
*self.failed_count.lock().expect("mainnet: handle error") += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -423,7 +423,7 @@ mod tests {
|
|||
};
|
||||
|
||||
let transfer_id = manager.create_transfer_record(&request);
|
||||
let record = manager.get_transfer_record(&transfer_id).unwrap();
|
||||
let record = manager.get_transfer_record(&transfer_id).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(record.from, "user1");
|
||||
assert_eq!(record.to, "user2");
|
||||
|
|
@ -447,9 +447,9 @@ mod tests {
|
|||
|
||||
let transfer_id = manager.create_transfer_record(&request);
|
||||
|
||||
manager.update_transfer_status(&transfer_id, CrossPartitionTransferStatus::Completed, None).unwrap();
|
||||
manager.update_transfer_status(&transfer_id, CrossPartitionTransferStatus::Completed, None).expect("mainnet: handle error");
|
||||
|
||||
let record = manager.get_transfer_record(&transfer_id).unwrap();
|
||||
let record = manager.get_transfer_record(&transfer_id).expect("mainnet: handle error");
|
||||
assert_eq!(record.status, CrossPartitionTransferStatus::Completed);
|
||||
}
|
||||
|
||||
|
|
@ -531,10 +531,10 @@ mod tests {
|
|||
};
|
||||
|
||||
let transfer_id = manager.create_transfer_record(&request);
|
||||
assert_eq!(*started_count.lock().unwrap(), 1);
|
||||
assert_eq!(*started_count.lock().expect("mainnet: handle error"), 1);
|
||||
|
||||
manager.update_transfer_status(&transfer_id, CrossPartitionTransferStatus::Completed, None).unwrap();
|
||||
assert_eq!(*completed_count.lock().unwrap(), 1);
|
||||
manager.update_transfer_status(&transfer_id, CrossPartitionTransferStatus::Completed, None).expect("mainnet: handle error");
|
||||
assert_eq!(*completed_count.lock().expect("mainnet: handle error"), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -576,9 +576,9 @@ mod tests {
|
|||
let transfer_id = manager.create_transfer_record(&request);
|
||||
|
||||
// 取消转账
|
||||
manager.cancel_transfer(&transfer_id).unwrap();
|
||||
manager.cancel_transfer(&transfer_id).expect("mainnet: handle error");
|
||||
|
||||
let record = manager.get_transfer_record(&transfer_id).unwrap();
|
||||
let record = manager.get_transfer_record(&transfer_id).expect("mainnet: handle error");
|
||||
assert_eq!(record.status, CrossPartitionTransferStatus::Cancelled);
|
||||
|
||||
// 尝试再次取消(应该失败)
|
||||
|
|
@ -604,7 +604,7 @@ mod tests {
|
|||
|
||||
// 完成一半的转账
|
||||
if i < 5 {
|
||||
manager.update_transfer_status(&transfer_id, CrossPartitionTransferStatus::Completed, None).unwrap();
|
||||
manager.update_transfer_status(&transfer_id, CrossPartitionTransferStatus::Completed, None).expect("mainnet: handle error");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -325,7 +325,7 @@ impl EventManager {
|
|||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,13 +35,13 @@
|
|||
//! "Common Stock".to_string(),
|
||||
//! extended_gnacs,
|
||||
//! PartitionType::CommonStock,
|
||||
//! ).unwrap();
|
||||
//! ).expect("mainnet: handle error");
|
||||
//!
|
||||
//! // 发行代币到分区
|
||||
//! acc1410.issue_to_partition(&partition_id, "user1", 1000).unwrap();
|
||||
//! acc1410.issue_to_partition(&partition_id, "user1", 1000).expect("mainnet: handle error");
|
||||
//!
|
||||
//! // 分区间转账
|
||||
//! acc1410.transfer_by_partition("user1", "user2", 300, &partition_id).unwrap();
|
||||
//! acc1410.transfer_by_partition("user1", "user2", 300, &partition_id).expect("mainnet: handle error");
|
||||
//! ```
|
||||
|
||||
pub mod error;
|
||||
|
|
@ -296,7 +296,7 @@ mod tests {
|
|||
common_stock_gnacs,
|
||||
PartitionType::CommonStock,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 创建优先股分区
|
||||
let preferred_stock_gnacs = ExtendedGNACS {
|
||||
|
|
@ -315,45 +315,45 @@ mod tests {
|
|||
preferred_stock_gnacs,
|
||||
PartitionType::PreferredStock,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 发行代币
|
||||
acc1410
|
||||
.issue_to_partition(&common_partition, "user1", 1000)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
acc1410
|
||||
.issue_to_partition(&preferred_partition, "user1", 500)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 检查余额
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&common_partition, "user1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
1000
|
||||
);
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&preferred_partition, "user1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
500
|
||||
);
|
||||
|
||||
// 转账
|
||||
acc1410
|
||||
.transfer_by_partition("user1", "user2", 300, &common_partition)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&common_partition, "user1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
700
|
||||
);
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&common_partition, "user2")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
300
|
||||
);
|
||||
|
||||
|
|
@ -363,18 +363,18 @@ mod tests {
|
|||
// 操作员代理转账
|
||||
acc1410
|
||||
.operator_transfer_by_partition("operator1", "user1", "user3", 200, &common_partition)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&common_partition, "user1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
500
|
||||
);
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&common_partition, "user3")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
200
|
||||
);
|
||||
|
||||
|
|
@ -410,9 +410,9 @@ mod tests {
|
|||
|
||||
let partition_id = acc1410
|
||||
.create_partition(name.to_string(), gnacs, partition_type)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let info = acc1410.get_partition_info(&partition_id).unwrap();
|
||||
let info = acc1410.get_partition_info(&partition_id).expect("mainnet: handle error");
|
||||
assert_eq!(info.partition_type, partition_type);
|
||||
assert_eq!(info.name, name);
|
||||
}
|
||||
|
|
@ -445,7 +445,7 @@ mod tests {
|
|||
let full_encoded = extended_gnacs.encode();
|
||||
assert_eq!(full_encoded.len(), 8);
|
||||
|
||||
let full_decoded = ExtendedGNACS::decode(&full_encoded).unwrap();
|
||||
let full_decoded = ExtendedGNACS::decode(&full_encoded).expect("mainnet: handle error");
|
||||
assert_eq!(full_decoded.base_gnacs, vec![0x94, 0x01, 0x00, 0x04, 0x02, 0x01]);
|
||||
assert_eq!(full_decoded.extension.partition_type, 0x01);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,13 +42,13 @@ impl StorageOptimizer {
|
|||
|
||||
/// 从缓存获取值
|
||||
pub fn get(&self, key: &str) -> Option<Vec<u8>> {
|
||||
let mut cache = self.cache.write().unwrap();
|
||||
let mut cache = self.cache.write().expect("mainnet: handle error");
|
||||
|
||||
if let Some(cached) = cache.get_mut(key) {
|
||||
// 检查是否过期
|
||||
if cached.expiry > Self::current_timestamp() {
|
||||
cached.access_count += 1;
|
||||
*self.cache_hits.lock().unwrap() += 1;
|
||||
*self.cache_hits.lock().expect("mainnet: handle error") += 1;
|
||||
return Some(cached.value.clone());
|
||||
} else {
|
||||
// 过期,移除
|
||||
|
|
@ -56,13 +56,13 @@ impl StorageOptimizer {
|
|||
}
|
||||
}
|
||||
|
||||
*self.cache_misses.lock().unwrap() += 1;
|
||||
*self.cache_misses.lock().expect("mainnet: handle error") += 1;
|
||||
None
|
||||
}
|
||||
|
||||
/// 设置缓存值
|
||||
pub fn set(&self, key: String, value: Vec<u8>, ttl: u64) {
|
||||
let mut cache = self.cache.write().unwrap();
|
||||
let mut cache = self.cache.write().expect("mainnet: handle error");
|
||||
|
||||
// 如果缓存已满,移除最少使用的项
|
||||
if cache.len() >= self.max_cache_size {
|
||||
|
|
@ -91,13 +91,13 @@ impl StorageOptimizer {
|
|||
|
||||
/// 清空缓存
|
||||
pub fn clear(&self) {
|
||||
self.cache.write().unwrap().clear();
|
||||
self.cache.write().expect("mainnet: handle error").clear();
|
||||
}
|
||||
|
||||
/// 获取缓存统计
|
||||
pub fn get_cache_stats(&self) -> CacheStatistics {
|
||||
let hits = *self.cache_hits.lock().unwrap();
|
||||
let misses = *self.cache_misses.lock().unwrap();
|
||||
let hits = *self.cache_hits.lock().expect("mainnet: handle error");
|
||||
let misses = *self.cache_misses.lock().expect("mainnet: handle error");
|
||||
let total = hits + misses;
|
||||
let hit_rate = if total > 0 {
|
||||
(hits as f64 / total as f64) * 100.0
|
||||
|
|
@ -106,7 +106,7 @@ impl StorageOptimizer {
|
|||
};
|
||||
|
||||
CacheStatistics {
|
||||
cache_size: self.cache.read().unwrap().len(),
|
||||
cache_size: self.cache.read().expect("mainnet: handle error").len(),
|
||||
max_cache_size: self.max_cache_size,
|
||||
cache_hits: hits,
|
||||
cache_misses: misses,
|
||||
|
|
@ -119,7 +119,7 @@ impl StorageOptimizer {
|
|||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -170,7 +170,7 @@ impl ComputationOptimizer {
|
|||
{
|
||||
// 检查缓存
|
||||
{
|
||||
let cache = self.result_cache.read().unwrap();
|
||||
let cache = self.result_cache.read().expect("mainnet: handle error");
|
||||
if let Some(cached) = cache.get(key) {
|
||||
return cached.result.clone();
|
||||
}
|
||||
|
|
@ -183,7 +183,7 @@ impl ComputationOptimizer {
|
|||
|
||||
// 缓存结果
|
||||
{
|
||||
let mut cache = self.result_cache.write().unwrap();
|
||||
let mut cache = self.result_cache.write().expect("mainnet: handle error");
|
||||
cache.insert(
|
||||
key.to_string(),
|
||||
ComputationResult {
|
||||
|
|
@ -198,7 +198,7 @@ impl ComputationOptimizer {
|
|||
|
||||
/// 清空计算缓存
|
||||
pub fn clear(&self) {
|
||||
self.result_cache.write().unwrap().clear();
|
||||
self.result_cache.write().expect("mainnet: handle error").clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -252,13 +252,13 @@ impl GasOptimizer {
|
|||
|
||||
/// 记录Gas使用
|
||||
pub fn record_gas_usage(&self, operation: String, gas_used: u64) {
|
||||
let mut usage = self.gas_usage.lock().unwrap();
|
||||
let mut usage = self.gas_usage.lock().expect("mainnet: handle error");
|
||||
*usage.entry(operation).or_insert(0) += gas_used;
|
||||
}
|
||||
|
||||
/// 获取Gas使用统计
|
||||
pub fn get_gas_statistics(&self) -> GasStatistics {
|
||||
let usage = self.gas_usage.lock().unwrap();
|
||||
let usage = self.gas_usage.lock().expect("mainnet: handle error");
|
||||
let total_gas = usage.values().sum();
|
||||
let total_cost = total_gas * self.gas_price;
|
||||
|
||||
|
|
@ -273,7 +273,7 @@ impl GasOptimizer {
|
|||
/// 优化建议
|
||||
pub fn get_optimization_suggestions(&self) -> Vec<String> {
|
||||
let mut suggestions = Vec::new();
|
||||
let usage = self.gas_usage.lock().unwrap();
|
||||
let usage = self.gas_usage.lock().expect("mainnet: handle error");
|
||||
|
||||
// 检查批量操作使用情况
|
||||
let batch_operations = ["batch_transfer", "batch_mint", "batch_burn"];
|
||||
|
|
@ -350,7 +350,7 @@ impl ConcurrentProcessor {
|
|||
let handle = thread::spawn(move || {
|
||||
for item in chunk {
|
||||
let result = processor(item);
|
||||
tx.send(result).unwrap();
|
||||
tx.send(result).expect("mainnet: handle error");
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -361,7 +361,7 @@ impl ConcurrentProcessor {
|
|||
|
||||
// 等待所有线程完成
|
||||
for handle in handles {
|
||||
handle.join().unwrap();
|
||||
handle.join().expect("mainnet: handle error");
|
||||
}
|
||||
|
||||
// 收集结果
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ impl PartitionManager {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -272,7 +272,7 @@ impl TransferManager {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -299,7 +299,7 @@ mod tests {
|
|||
extended_gnacs,
|
||||
PartitionType::CommonStock,
|
||||
)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -335,28 +335,28 @@ mod tests {
|
|||
let partition_id = create_test_partition(&mut partition_manager);
|
||||
|
||||
// 初始化余额
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).unwrap();
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).expect("mainnet: handle error");
|
||||
|
||||
let mut transfer_manager = TransferManager::new(partition_manager);
|
||||
|
||||
// 执行转账
|
||||
let result = transfer_manager
|
||||
.transfer_by_partition("user1", "user2", 300, &partition_id)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(result.status, TransferStatus::Success);
|
||||
assert_eq!(
|
||||
transfer_manager
|
||||
.partition_manager()
|
||||
.balance_of_by_partition(&partition_id, "user1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
700
|
||||
);
|
||||
assert_eq!(
|
||||
transfer_manager
|
||||
.partition_manager()
|
||||
.balance_of_by_partition(&partition_id, "user2")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
300
|
||||
);
|
||||
}
|
||||
|
|
@ -366,7 +366,7 @@ mod tests {
|
|||
let mut partition_manager = PartitionManager::new();
|
||||
let partition_id = create_test_partition(&mut partition_manager);
|
||||
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).unwrap();
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).expect("mainnet: handle error");
|
||||
|
||||
let mut transfer_manager = TransferManager::new(partition_manager);
|
||||
|
||||
|
|
@ -378,14 +378,14 @@ mod tests {
|
|||
// 操作员代理转账
|
||||
let result = transfer_manager
|
||||
.operator_transfer_by_partition("operator1", "user1", "user2", 200, &partition_id)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(result.status, TransferStatus::Success);
|
||||
assert_eq!(
|
||||
transfer_manager
|
||||
.partition_manager()
|
||||
.balance_of_by_partition(&partition_id, "user1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
800
|
||||
);
|
||||
}
|
||||
|
|
@ -395,7 +395,7 @@ mod tests {
|
|||
let mut partition_manager = PartitionManager::new();
|
||||
let partition_id = create_test_partition(&mut partition_manager);
|
||||
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).unwrap();
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).expect("mainnet: handle error");
|
||||
|
||||
let mut transfer_manager = TransferManager::new(partition_manager);
|
||||
|
||||
|
|
@ -412,7 +412,7 @@ mod tests {
|
|||
let mut partition_manager = PartitionManager::new();
|
||||
let partition_id = create_test_partition(&mut partition_manager);
|
||||
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).unwrap();
|
||||
partition_manager.add_balance(&partition_id, "user1", 1000).expect("mainnet: handle error");
|
||||
|
||||
let mut transfer_manager = TransferManager::new(partition_manager);
|
||||
|
||||
|
|
|
|||
|
|
@ -239,7 +239,7 @@ mod tests {
|
|||
let encoded = extended.encode();
|
||||
assert_eq!(encoded.len(), 8);
|
||||
|
||||
let decoded = ExtendedGNACS::decode(&encoded).unwrap();
|
||||
let decoded = ExtendedGNACS::decode(&encoded).expect("mainnet: handle error");
|
||||
assert_eq!(decoded.base_gnacs, base_gnacs);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,27 +21,27 @@ fn test_complete_workflow() {
|
|||
|
||||
let partition_id = acc1410
|
||||
.create_partition("Test Partition".to_string(), gnacs, PartitionType::CommonStock)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 发行代币
|
||||
acc1410.issue_to_partition(&partition_id, "user1", 1000).unwrap();
|
||||
acc1410.issue_to_partition(&partition_id, "user1", 1000).expect("mainnet: handle error");
|
||||
|
||||
// 转账
|
||||
acc1410
|
||||
.transfer_by_partition("user1", "user2", 300, &partition_id)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 验证余额
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&partition_id, "user1")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
700
|
||||
);
|
||||
assert_eq!(
|
||||
acc1410
|
||||
.balance_of_by_partition(&partition_id, "user2")
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
300
|
||||
);
|
||||
}
|
||||
|
|
@ -62,7 +62,7 @@ fn test_batch_operations_integration() {
|
|||
operator: None,
|
||||
};
|
||||
|
||||
let result = manager.execute_batch_transfer(&request).unwrap();
|
||||
let result = manager.execute_batch_transfer(&request).expect("mainnet: handle error");
|
||||
assert_eq!(result.total_operations, 3);
|
||||
assert_eq!(result.successful_operations, 3);
|
||||
assert_eq!(result.total_amount, 600);
|
||||
|
|
@ -76,7 +76,7 @@ fn test_batch_operations_integration() {
|
|||
partition_id: [1u8; 32],
|
||||
};
|
||||
|
||||
let mint_result = manager.execute_batch_mint(&mint_request).unwrap();
|
||||
let mint_result = manager.execute_batch_mint(&mint_request).expect("mainnet: handle error");
|
||||
assert_eq!(mint_result.total_operations, 2);
|
||||
assert_eq!(mint_result.total_amount, 3000);
|
||||
|
||||
|
|
@ -89,7 +89,7 @@ fn test_batch_operations_integration() {
|
|||
partition_id: [1u8; 32],
|
||||
};
|
||||
|
||||
let burn_result = manager.execute_batch_burn(&burn_request).unwrap();
|
||||
let burn_result = manager.execute_batch_burn(&burn_request).expect("mainnet: handle error");
|
||||
assert_eq!(burn_result.total_operations, 2);
|
||||
assert_eq!(burn_result.total_amount, 800);
|
||||
|
||||
|
|
@ -116,19 +116,19 @@ fn test_cross_partition_transfer_integration() {
|
|||
source_partition,
|
||||
dest_partition,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 验证转账
|
||||
manager.validate_transfer(&request_id).unwrap();
|
||||
manager.validate_transfer(&request_id).expect("mainnet: handle error");
|
||||
|
||||
// 执行转账
|
||||
manager.execute_transfer(&request_id).unwrap();
|
||||
manager.execute_transfer(&request_id).expect("mainnet: handle error");
|
||||
|
||||
// 确认转账
|
||||
manager.confirm_transfer(&request_id).unwrap();
|
||||
manager.confirm_transfer(&request_id).expect("mainnet: handle error");
|
||||
|
||||
// 检查状态
|
||||
let request = manager.get_transfer_request(&request_id).unwrap();
|
||||
let request = manager.get_transfer_request(&request_id).expect("mainnet: handle error");
|
||||
assert_eq!(request.status, TransferStatus::Completed);
|
||||
|
||||
// 检查统计
|
||||
|
|
@ -329,13 +329,13 @@ fn test_cross_partition_transfer_cancellation() {
|
|||
source_partition,
|
||||
dest_partition,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 取消转账
|
||||
manager.cancel_transfer(&request_id).unwrap();
|
||||
manager.cancel_transfer(&request_id).expect("mainnet: handle error");
|
||||
|
||||
// 检查状态
|
||||
let request = manager.get_transfer_request(&request_id).unwrap();
|
||||
let request = manager.get_transfer_request(&request_id).expect("mainnet: handle error");
|
||||
assert_eq!(request.status, TransferStatus::Cancelled);
|
||||
}
|
||||
|
||||
|
|
@ -351,7 +351,7 @@ fn test_batch_operations_history() {
|
|||
partition_id: [1u8; 32],
|
||||
operator: None,
|
||||
};
|
||||
manager.execute_batch_transfer(&request).unwrap();
|
||||
manager.execute_batch_transfer(&request).expect("mainnet: handle error");
|
||||
}
|
||||
|
||||
// 检查历史
|
||||
|
|
|
|||
|
|
@ -441,7 +441,7 @@ impl Acc1594 {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -487,7 +487,7 @@ mod tests {
|
|||
extended_gnacs,
|
||||
PartitionType::CommonStock,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
(acc1594, partition_id)
|
||||
}
|
||||
|
|
@ -506,7 +506,7 @@ mod tests {
|
|||
);
|
||||
|
||||
assert!(result.is_ok());
|
||||
assert_eq!(acc1594.balance_of("investor1", &partition_id).unwrap(), 1000);
|
||||
assert_eq!(acc1594.balance_of("investor1", &partition_id).expect("mainnet: handle error"), 1000);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -515,12 +515,12 @@ mod tests {
|
|||
|
||||
acc1594
|
||||
.issue("issuer1", "investor1", 1000, vec![], &partition_id, [0u8; 32])
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let result = acc1594.redeem("investor1", 300, vec![], &partition_id, [0u8; 32]);
|
||||
|
||||
assert!(result.is_ok());
|
||||
assert_eq!(acc1594.balance_of("investor1", &partition_id).unwrap(), 700);
|
||||
assert_eq!(acc1594.balance_of("investor1", &partition_id).expect("mainnet: handle error"), 700);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -530,10 +530,10 @@ mod tests {
|
|||
// 发行给两个投资者
|
||||
acc1594
|
||||
.issue("issuer1", "investor1", 600, vec![], &partition_id, [0u8; 32])
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
acc1594
|
||||
.issue("issuer1", "investor2", 400, vec![], &partition_id, [0u8; 32])
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 分配分红
|
||||
let result = acc1594.distribute_dividend(
|
||||
|
|
@ -557,15 +557,15 @@ mod tests {
|
|||
|
||||
acc1594
|
||||
.issue("issuer1", "investor1", 1000, vec![], &partition_id, [0u8; 32])
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
acc1594
|
||||
.distribute_dividend("distributor1", &partition_id, 500, 202601, [0u8; 32])
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let claimed = acc1594
|
||||
.claim_dividend("investor1", &partition_id, [0u8; 32])
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(claimed, 500);
|
||||
assert_eq!(acc1594.claimable_dividend("investor1", &partition_id), 0);
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ mod tests {
|
|||
let encoded = full_gnacs.encode();
|
||||
assert_eq!(encoded.len(), 10);
|
||||
|
||||
let decoded = FullDividendGNACS::decode(&encoded).unwrap();
|
||||
let decoded = FullDividendGNACS::decode(&encoded).expect("mainnet: handle error");
|
||||
assert_eq!(decoded.base_gnacs, vec![0x94, 0x01, 0x00, 0x04, 0x02, 0x01]);
|
||||
assert_eq!(decoded.dividend_extension.dividend_policy, 1);
|
||||
assert_eq!(decoded.dividend_extension.dividend_period, 2);
|
||||
|
|
|
|||
|
|
@ -322,7 +322,7 @@ impl Acc1643 {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -357,9 +357,9 @@ mod tests {
|
|||
[0u8; 48],
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let document = acc1643.get_document(&doc_id).unwrap();
|
||||
let document = acc1643.get_document(&doc_id).expect("mainnet: handle error");
|
||||
assert_eq!(document.doc_type, "Prospectus");
|
||||
assert_eq!(document.version, 1);
|
||||
assert!(document.is_active);
|
||||
|
|
@ -380,7 +380,7 @@ mod tests {
|
|||
[0u8; 48],
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
// 创建第二个版本
|
||||
let content_hash_v2 = [2u8; 48];
|
||||
|
|
@ -393,9 +393,9 @@ mod tests {
|
|||
doc_id_v1,
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let doc_v2 = acc1643.get_document(&doc_id_v2).unwrap();
|
||||
let doc_v2 = acc1643.get_document(&doc_id_v2).expect("mainnet: handle error");
|
||||
assert_eq!(doc_v2.version, 2);
|
||||
assert_eq!(doc_v2.supersedes, doc_id_v1);
|
||||
}
|
||||
|
|
@ -414,11 +414,11 @@ mod tests {
|
|||
[0u8; 48],
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
acc1643.remove_document("issuer1", &doc_id, [1u8; 32]).unwrap();
|
||||
acc1643.remove_document("issuer1", &doc_id, [1u8; 32]).expect("mainnet: handle error");
|
||||
|
||||
let document = acc1643.get_document(&doc_id).unwrap();
|
||||
let document = acc1643.get_document(&doc_id).expect("mainnet: handle error");
|
||||
assert!(!document.is_active);
|
||||
}
|
||||
|
||||
|
|
@ -436,7 +436,7 @@ mod tests {
|
|||
[0u8; 48],
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let _doc_id_v2 = acc1643
|
||||
.set_document(
|
||||
|
|
@ -447,9 +447,9 @@ mod tests {
|
|||
doc_id_v1,
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let latest = acc1643.get_latest_document("Prospectus").unwrap();
|
||||
let latest = acc1643.get_latest_document("Prospectus").expect("mainnet: handle error");
|
||||
assert_eq!(latest.version, 2);
|
||||
}
|
||||
|
||||
|
|
@ -469,14 +469,14 @@ mod tests {
|
|||
[0u8; 48],
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let is_valid = acc1643.verify_document(&doc_id, &uri, &content_hash).unwrap();
|
||||
let is_valid = acc1643.verify_document(&doc_id, &uri, &content_hash).expect("mainnet: handle error");
|
||||
assert!(is_valid);
|
||||
|
||||
// 验证错误的内容哈希
|
||||
let wrong_hash = [2u8; 48];
|
||||
let is_valid = acc1643.verify_document(&doc_id, &uri, &wrong_hash).unwrap();
|
||||
let is_valid = acc1643.verify_document(&doc_id, &uri, &wrong_hash).expect("mainnet: handle error");
|
||||
assert!(!is_valid);
|
||||
}
|
||||
|
||||
|
|
@ -495,7 +495,7 @@ mod tests {
|
|||
[0u8; 48],
|
||||
[1u8; 32],
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let root_after = acc1643.documents_root();
|
||||
assert_ne!(root_before, root_after);
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ impl Acc1644 {
|
|||
}
|
||||
}
|
||||
|
||||
let old_controller = self.controller.take().unwrap();
|
||||
let old_controller = self.controller.take().expect("mainnet: handle error");
|
||||
self.controller_role = None;
|
||||
self.takeover_expiry = None;
|
||||
|
||||
|
|
@ -481,7 +481,7 @@ impl Acc1644 {
|
|||
fn current_timestamp() -> u64 {
|
||||
std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs()
|
||||
}
|
||||
}
|
||||
|
|
@ -516,7 +516,7 @@ mod tests {
|
|||
// 冻结分区
|
||||
acc1644
|
||||
.freeze("regulator1", &partition_id, reason, evidence, receipt)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert!(acc1644.is_partition_frozen(&partition_id));
|
||||
assert_eq!(
|
||||
|
|
@ -527,7 +527,7 @@ mod tests {
|
|||
// 解冻分区
|
||||
acc1644
|
||||
.unfreeze("regulator1", &partition_id, reason, evidence, receipt)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert!(!acc1644.is_partition_frozen(&partition_id));
|
||||
assert_eq!(
|
||||
|
|
@ -545,7 +545,7 @@ mod tests {
|
|||
|
||||
acc1644
|
||||
.freeze("regulator1", &global_partition, b"Emergency", b"", receipt)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert!(acc1644.is_partition_frozen(&global_partition));
|
||||
assert!(acc1644.is_partition_frozen(&[1u8; 32])); // 任何分区都被冻结
|
||||
|
|
@ -576,7 +576,7 @@ mod tests {
|
|||
b"",
|
||||
receipt,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(
|
||||
acc1644.get_balance(&hex::encode(partition_id), "alice"),
|
||||
|
|
@ -608,7 +608,7 @@ mod tests {
|
|||
b"",
|
||||
receipt,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(
|
||||
acc1644.get_balance(&hex::encode(partition_id), "alice"),
|
||||
|
|
@ -624,7 +624,7 @@ mod tests {
|
|||
|
||||
acc1644
|
||||
.take_control("emergency1", "emergency_controller", 3600, b"Emergency", receipt)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(acc1644.controller(), Some("emergency_controller".to_string()));
|
||||
assert_eq!(
|
||||
|
|
@ -642,11 +642,11 @@ mod tests {
|
|||
|
||||
acc1644
|
||||
.freeze("regulator1", &partition_id, b"Test", b"", receipt)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
acc1644
|
||||
.unfreeze("regulator1", &partition_id, b"Test", b"", receipt)
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
|
||||
let actions = acc1644.get_control_actions(0, 10);
|
||||
assert_eq!(actions.len(), 2);
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ pub struct NAC Lens3Error {
|
|||
/// "round": 5,
|
||||
/// });
|
||||
///
|
||||
/// let result = client.call("nac_getFluidBlock", params).await.unwrap();
|
||||
/// let result = client.call("nac_getFluidBlock", params).await.expect("mainnet: handle error");
|
||||
/// println!("Result: {:?}", result);
|
||||
/// }
|
||||
/// ```
|
||||
|
|
@ -177,7 +177,7 @@ impl NacLensClient {
|
|||
/// "epoch": 100,
|
||||
/// });
|
||||
///
|
||||
/// let result = client.call("nac_getEpochInfo", params).await.unwrap();
|
||||
/// let result = client.call("nac_getEpochInfo", params).await.expect("mainnet: handle error");
|
||||
/// println!("Epoch Info: {:?}", result);
|
||||
/// }
|
||||
/// ```
|
||||
|
|
@ -269,7 +269,7 @@ impl NacLensClient {
|
|||
/// ("nac_getEpochInfo".to_string(), serde_json::json!({"epoch": 101})),
|
||||
/// ];
|
||||
///
|
||||
/// let results = client.batch_call(requests).await.unwrap();
|
||||
/// let results = client.batch_call(requests).await.expect("mainnet: handle error");
|
||||
/// println!("Results: {:?}", results);
|
||||
/// }
|
||||
/// ```
|
||||
|
|
@ -368,8 +368,8 @@ mod tests {
|
|||
quantum_dna: None,
|
||||
};
|
||||
|
||||
let json = serde_json::to_string(&request).unwrap();
|
||||
let deserialized: NacLensRequest = serde_json::from_str(&json).unwrap();
|
||||
let json = serde_json::to_string(&request).expect("mainnet: handle error");
|
||||
let deserialized: NacLensRequest = serde_json::from_str(&json).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(request.id, deserialized.id);
|
||||
assert_eq!(request.method, deserialized.method);
|
||||
|
|
@ -385,8 +385,8 @@ mod tests {
|
|||
timestamp: Some(Timestamp::now()),
|
||||
};
|
||||
|
||||
let json = serde_json::to_string(&response).unwrap();
|
||||
let deserialized: NacLensResponse = serde_json::from_str(&json).unwrap();
|
||||
let json = serde_json::to_string(&response).expect("mainnet: handle error");
|
||||
let deserialized: NacLensResponse = serde_json::from_str(&json).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(response.id, deserialized.id);
|
||||
assert!(deserialized.result.is_some());
|
||||
|
|
@ -400,8 +400,8 @@ mod tests {
|
|||
data: Some(serde_json::json!({"details": "Missing method"})),
|
||||
};
|
||||
|
||||
let json = serde_json::to_string(&error).unwrap();
|
||||
let deserialized: NAC Lens3Error = serde_json::from_str(&json).unwrap();
|
||||
let json = serde_json::to_string(&error).expect("mainnet: handle error");
|
||||
let deserialized: NAC Lens3Error = serde_json::from_str(&json).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(error.code, deserialized.code);
|
||||
assert_eq!(error.message, deserialized.message);
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ fn main() {
|
|||
let project_dir = if args.len() > start_index {
|
||||
PathBuf::from(&args[start_index])
|
||||
} else {
|
||||
std::env::current_dir().unwrap()
|
||||
std::env::current_dir().expect("mainnet: handle error")
|
||||
};
|
||||
|
||||
println!("🔍 Checking NAC constitutional constraints...");
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ pub fn check_project<P: AsRef<Path>>(project_dir: P) -> Result<Vec<LintViolation
|
|||
{
|
||||
let path = entry.path();
|
||||
if let Ok(source) = std::fs::read_to_string(path) {
|
||||
let violations = runner.run(&source, path.to_str().unwrap());
|
||||
let violations = runner.run(&source, path.to_str().expect("mainnet: handle error"));
|
||||
all_violations.extend(violations);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ impl ClauseReferenceLint {
|
|||
|
||||
// 检测条款引用模式
|
||||
// constitutional_state::CLAUSE_ID
|
||||
let clause_ref_re = Regex::new(r"constitutional_state::([A-Z_]+)").unwrap();
|
||||
let clause_ref_re = Regex::new(r"constitutional_state::([A-Z_]+)").expect("mainnet: handle error");
|
||||
|
||||
for cap in clause_ref_re.captures_iter(source) {
|
||||
if let Some(clause_match) = cap.get(1) {
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ impl ObligationImplLint {
|
|||
|
||||
// 1. 检测义务函数定义
|
||||
// 格式: fn obligation_name() { ... }
|
||||
let fn_def_re = Regex::new(r"fn\s+([a-z_][a-z0-9_]*)\s*\(").unwrap();
|
||||
let fn_def_re = Regex::new(r"fn\s+([a-z_][a-z0-9_]*)\s*\(").expect("mainnet: handle error");
|
||||
let mut implemented_obligations = HashSet::new();
|
||||
|
||||
for cap in fn_def_re.captures_iter(source) {
|
||||
|
|
@ -50,7 +50,7 @@ impl ObligationImplLint {
|
|||
}
|
||||
|
||||
// 2. 检查continuous义务是否有定时器
|
||||
let timer_re = Regex::new(r"tokio::time::interval|std::time::Duration").unwrap();
|
||||
let timer_re = Regex::new(r"tokio::time::interval|std::time::Duration").expect("mainnet: handle error");
|
||||
let has_timer = timer_re.is_match(source);
|
||||
|
||||
for (obl_name, obl) in &self.obligations {
|
||||
|
|
@ -86,7 +86,7 @@ impl ObligationImplLint {
|
|||
}
|
||||
|
||||
// 3. 检查AI enforcer义务是否调用AI服务
|
||||
let ai_call_re = Regex::new(r"ai_service|openai|anthropic|llm").unwrap();
|
||||
let ai_call_re = Regex::new(r"ai_service|openai|anthropic|llm").expect("mainnet: handle error");
|
||||
let has_ai_call = ai_call_re.is_match(source);
|
||||
|
||||
for (obl_name, obl) in &self.obligations {
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ impl ParamSyncLint {
|
|||
];
|
||||
|
||||
for (pattern, context) in patterns {
|
||||
let re = Regex::new(pattern).unwrap();
|
||||
let re = Regex::new(pattern).expect("mainnet: handle error");
|
||||
for cap in re.captures_iter(source) {
|
||||
if let Some(value_match) = cap.get(cap.len() - 1) {
|
||||
let value = value_match.as_str();
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ impl SecurityCheckLint {
|
|||
/// 检测不安全的unwrap()调用
|
||||
fn check_unsafe_unwrap(&self, source: &str, file_path: &str) -> Vec<LintViolation> {
|
||||
let mut violations = Vec::new();
|
||||
let unwrap_re = Regex::new(r"\.unwrap\(\)").unwrap();
|
||||
let unwrap_re = Regex::new(r"\.unwrap\(\)").expect("mainnet: handle error");
|
||||
|
||||
for (line_num, line) in source.lines().enumerate() {
|
||||
if unwrap_re.is_match(line) {
|
||||
|
|
@ -47,7 +47,7 @@ impl SecurityCheckLint {
|
|||
violations.push(LintViolation {
|
||||
file: file_path.to_string(),
|
||||
line: line_num + 1,
|
||||
column: line.find(".unwrap()").unwrap_or(0),
|
||||
column: line.find(".expect("mainnet: handle error")").unwrap_or(0),
|
||||
message: "Avoid using unwrap() in production code. Use proper error handling instead.".to_string(),
|
||||
severity: Severity::Warning,
|
||||
context: "security check".to_string(),
|
||||
|
|
@ -62,8 +62,8 @@ impl SecurityCheckLint {
|
|||
/// 检测未经验证的用户输入
|
||||
fn check_unvalidated_input(&self, source: &str, file_path: &str) -> Vec<LintViolation> {
|
||||
let mut violations = Vec::new();
|
||||
let input_re = Regex::new(r"(request\.|req\.|input\.|user_input)").unwrap();
|
||||
let validation_re = Regex::new(r"(validate|sanitize|check|verify)").unwrap();
|
||||
let input_re = Regex::new(r"(request\.|req\.|input\.|user_input)").expect("mainnet: handle error");
|
||||
let validation_re = Regex::new(r"(validate|sanitize|check|verify)").expect("mainnet: handle error");
|
||||
|
||||
for (line_num, line) in source.lines().enumerate() {
|
||||
if input_re.is_match(line) && !validation_re.is_match(line) {
|
||||
|
|
@ -103,7 +103,7 @@ impl SecurityCheckLint {
|
|||
];
|
||||
|
||||
for (pattern, secret_type) in secret_patterns {
|
||||
let re = Regex::new(pattern).unwrap();
|
||||
let re = Regex::new(pattern).expect("mainnet: handle error");
|
||||
for (line_num, line) in source.lines().enumerate() {
|
||||
if re.is_match(line) {
|
||||
violations.push(LintViolation {
|
||||
|
|
@ -127,7 +127,7 @@ impl SecurityCheckLint {
|
|||
/// 检测不安全的随机数生成
|
||||
fn check_unsafe_random(&self, source: &str, file_path: &str) -> Vec<LintViolation> {
|
||||
let mut violations = Vec::new();
|
||||
let unsafe_random_re = Regex::new(r"rand::thread_rng\(\)|rand::random\(\)").unwrap();
|
||||
let unsafe_random_re = Regex::new(r"rand::thread_rng\(\)|rand::random\(\)").expect("mainnet: handle error");
|
||||
|
||||
for (line_num, line) in source.lines().enumerate() {
|
||||
if unsafe_random_re.is_match(line) {
|
||||
|
|
@ -151,7 +151,7 @@ impl SecurityCheckLint {
|
|||
/// 检测SQL注入风险
|
||||
fn check_sql_injection(&self, source: &str, file_path: &str) -> Vec<LintViolation> {
|
||||
let mut violations = Vec::new();
|
||||
let sql_concat_re = Regex::new(r#"(format!|&|concat)\s*\(.*SELECT|INSERT|UPDATE|DELETE"#).unwrap();
|
||||
let sql_concat_re = Regex::new(r#"(format!|&|concat)\s*\(.*SELECT|INSERT|UPDATE|DELETE"#).expect("mainnet: handle error");
|
||||
|
||||
for (line_num, line) in source.lines().enumerate() {
|
||||
if sql_concat_re.is_match(line) {
|
||||
|
|
@ -183,7 +183,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_unsafe_unwrap() {
|
||||
let lint = SecurityCheckLint::new();
|
||||
let source = "let value = some_option.unwrap();";
|
||||
let source = "let value = some_option.expect("mainnet: handle error");";
|
||||
let violations = lint.check(source, "test.rs");
|
||||
|
||||
assert!(violations.iter().any(|v| v.message.contains("unwrap")));
|
||||
|
|
|
|||
|
|
@ -94,10 +94,10 @@ mod tests {
|
|||
]
|
||||
}"#;
|
||||
|
||||
let mut temp_file = NamedTempFile::new().unwrap();
|
||||
temp_file.write_all(json.as_bytes()).unwrap();
|
||||
let mut temp_file = NamedTempFile::new().expect("mainnet: handle error");
|
||||
temp_file.write_all(json.as_bytes()).expect("mainnet: handle error");
|
||||
|
||||
let state = load_constitutional_state(temp_file.path()).unwrap();
|
||||
let state = load_constitutional_state(temp_file.path()).expect("mainnet: handle error");
|
||||
assert_eq!(state.version, "1.0.0");
|
||||
assert_eq!(state.parameters.len(), 1);
|
||||
assert_eq!(state.clauses.len(), 1);
|
||||
|
|
|
|||
|
|
@ -37,6 +37,10 @@ sha3 = "0.10"
|
|||
tempfile = "3.8"
|
||||
criterion = "0.5"
|
||||
|
||||
[lib]
|
||||
name = "charter_compiler"
|
||||
path = "src/lib.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "charter"
|
||||
path = "src/main.rs"
|
||||
|
|
|
|||
|
|
@ -607,7 +607,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_generate_empty() {
|
||||
let program = Program { items: vec![] };
|
||||
let bytecode = generate(&program).unwrap();
|
||||
let bytecode = generate(&program).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(bytecode.len(), 0);
|
||||
}
|
||||
|
||||
|
|
@ -624,9 +624,9 @@ mod tests {
|
|||
}
|
||||
"#;
|
||||
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let program = parse(&tokens).unwrap();
|
||||
let bytecode = generate(&program).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
let program = parse(&tokens).expect("FIX-006: unexpected None/Err");
|
||||
let bytecode = generate(&program).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert!(bytecode.len() > 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -406,7 +406,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_tokenize_keywords() {
|
||||
let source = "asset contract fn let if else";
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(tokens.len(), 6);
|
||||
assert_eq!(tokens[0], Token::Asset);
|
||||
|
|
@ -417,7 +417,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_tokenize_nac_types() {
|
||||
let source = "DID GNACSCode ConstitutionalReceipt";
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(tokens.len(), 3);
|
||||
assert_eq!(tokens[0], Token::DID);
|
||||
|
|
@ -428,7 +428,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_tokenize_literals() {
|
||||
let source = r#"123 0x1234 "hello" true false"#;
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(tokens.len(), 5);
|
||||
assert!(matches!(tokens[0], Token::Integer(123)));
|
||||
|
|
@ -441,7 +441,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_tokenize_did() {
|
||||
let source = "did:nac:main:user:0x1234";
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(tokens.len(), 1);
|
||||
assert!(matches!(tokens[0], Token::DIDLiteral(_)));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
//! Charter Compiler Library
|
||||
//! NAC原生智能合约语言编译器核心库
|
||||
//! 供 nac-charter-service 等依赖方使用
|
||||
|
||||
pub mod lexer;
|
||||
pub mod parser;
|
||||
pub mod semantic;
|
||||
pub mod codegen;
|
||||
pub mod optimizer;
|
||||
|
|
@ -144,7 +144,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_optimize_empty() {
|
||||
let bytecode = vec![];
|
||||
let optimized = optimize(bytecode.clone(), 2).unwrap();
|
||||
let optimized = optimize(bytecode.clone(), 2).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(optimized, bytecode);
|
||||
}
|
||||
|
||||
|
|
@ -152,7 +152,7 @@ mod tests {
|
|||
fn test_eliminate_dead_code() {
|
||||
// PUSH1 1, RETURN, PUSH1 2 (死代码)
|
||||
let bytecode = vec![0x60, 0x01, 0xF3, 0x60, 0x02];
|
||||
let optimized = eliminate_dead_code(bytecode).unwrap();
|
||||
let optimized = eliminate_dead_code(bytecode).expect("FIX-006: unexpected None/Err");
|
||||
// 应该移除PUSH1 2
|
||||
assert_eq!(optimized, vec![0x60, 0x01, 0xF3]);
|
||||
}
|
||||
|
|
@ -161,7 +161,7 @@ mod tests {
|
|||
fn test_fold_constants() {
|
||||
// PUSH1 2, PUSH1 3, ADD
|
||||
let bytecode = vec![0x60, 0x02, 0x60, 0x03, 0x01];
|
||||
let optimized = fold_constants(bytecode).unwrap();
|
||||
let optimized = fold_constants(bytecode).expect("FIX-006: unexpected None/Err");
|
||||
// 应该折叠为 PUSH1 5
|
||||
assert_eq!(optimized, vec![0x60, 0x05]);
|
||||
}
|
||||
|
|
@ -169,7 +169,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_optimize_level_0() {
|
||||
let bytecode = vec![0x60, 0x01, 0x60, 0x02, 0x01];
|
||||
let optimized = optimize(bytecode.clone(), 0).unwrap();
|
||||
let optimized = optimize(bytecode.clone(), 0).expect("FIX-006: unexpected None/Err");
|
||||
// Level 0不优化
|
||||
assert_eq!(optimized, bytecode);
|
||||
}
|
||||
|
|
@ -177,7 +177,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_optimize_level_1() {
|
||||
let bytecode = vec![0x60, 0x01, 0xF3, 0x60, 0x02];
|
||||
let optimized = optimize(bytecode, 1).unwrap();
|
||||
let optimized = optimize(bytecode, 1).expect("FIX-006: unexpected None/Err");
|
||||
// Level 1应该消除死代码
|
||||
assert_eq!(optimized, vec![0x60, 0x01, 0xF3]);
|
||||
}
|
||||
|
|
@ -185,7 +185,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_optimize_level_2() {
|
||||
let bytecode = vec![0x60, 0x02, 0x60, 0x03, 0x01];
|
||||
let optimized = optimize(bytecode, 2).unwrap();
|
||||
let optimized = optimize(bytecode, 2).expect("FIX-006: unexpected None/Err");
|
||||
// Level 2应该折叠常量
|
||||
assert_eq!(optimized, vec![0x60, 0x05]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -902,15 +902,15 @@ mod tests {
|
|||
#[test]
|
||||
fn test_parse_empty() {
|
||||
let tokens = vec![];
|
||||
let program = parse(&tokens).unwrap();
|
||||
let program = parse(&tokens).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(program.items.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_module() {
|
||||
let source = "module test;";
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let program = parse(&tokens).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
let program = parse(&tokens).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(program.items.len(), 1);
|
||||
assert!(matches!(program.items[0], TopLevelItem::Module(_)));
|
||||
|
|
@ -927,8 +927,8 @@ mod tests {
|
|||
}
|
||||
"#;
|
||||
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let program = parse(&tokens).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
let program = parse(&tokens).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(program.items.len(), 1);
|
||||
if let TopLevelItem::Asset(asset) = &program.items[0] {
|
||||
|
|
|
|||
|
|
@ -635,8 +635,8 @@ mod tests {
|
|||
}
|
||||
"#;
|
||||
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let program = parse(&tokens).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
let program = parse(&tokens).expect("FIX-006: unexpected None/Err");
|
||||
assert!(analyze(&program).is_ok());
|
||||
}
|
||||
|
||||
|
|
@ -649,7 +649,7 @@ mod tests {
|
|||
}
|
||||
"#;
|
||||
|
||||
let tokens = tokenize(source).unwrap();
|
||||
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
|
||||
// GNACS编码在parse阶段就会被验证,所以parse应该失败
|
||||
assert!(parse(&tokens).is_err());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
[package]
|
||||
name = "nac-charter-service"
|
||||
version = "1.0.0"
|
||||
edition = "2021"
|
||||
authors = ["NAC Core Team <dev@newassetchain.io>"]
|
||||
description = "Charter HTTP Service - NAC L2层 Charter编译器HTTP服务"
|
||||
|
||||
[dependencies]
|
||||
actix-web = "4"
|
||||
actix-rt = "2"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
thiserror = "1.0"
|
||||
anyhow = "1.0"
|
||||
log = "0.4"
|
||||
env_logger = "0.11"
|
||||
chrono = { version = "0.4", features = ["serde"] }
|
||||
hex = "0.4"
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
|
||||
[[bin]]
|
||||
name = "nac-charter-service"
|
||||
path = "src/main.rs"
|
||||
|
||||
[profile.release]
|
||||
opt-level = 3
|
||||
lto = true
|
||||
codegen-units = 1
|
||||
|
|
@ -0,0 +1,258 @@
|
|||
// Charter HTTP Service - NAC L2层 Charter编译器HTTP服务
|
||||
// 将 charter-compiler 包装为 HTTP API 服务
|
||||
use actix_web::{web, App, HttpServer, HttpResponse, middleware};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::process::Command;
|
||||
use std::env;
|
||||
use std::fs;
|
||||
use std::path::Path;
|
||||
use chrono::Utc;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct CompileRequest {
|
||||
/// Charter 源代码
|
||||
source: String,
|
||||
/// 优化级别 (0-3)
|
||||
#[serde(default = "default_optimization")]
|
||||
optimization: u8,
|
||||
/// 是否生成调试信息
|
||||
#[serde(default)]
|
||||
debug: bool,
|
||||
}
|
||||
|
||||
fn default_optimization() -> u8 { 2 }
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct CompileResponse {
|
||||
success: bool,
|
||||
bytecode: Option<String>,
|
||||
bytecode_size: Option<usize>,
|
||||
error: Option<String>,
|
||||
elapsed_ms: u64,
|
||||
timestamp: String,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct CheckRequest {
|
||||
source: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct CheckResponse {
|
||||
success: bool,
|
||||
valid: bool,
|
||||
errors: Vec<String>,
|
||||
warnings: Vec<String>,
|
||||
timestamp: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct HealthResponse {
|
||||
status: String,
|
||||
service: String,
|
||||
version: String,
|
||||
layer: String,
|
||||
protocol: String,
|
||||
timestamp: String,
|
||||
}
|
||||
|
||||
/// 健康检查
|
||||
async fn health() -> HttpResponse {
|
||||
HttpResponse::Ok().json(HealthResponse {
|
||||
status: "running".to_string(),
|
||||
service: "nac-charter-service".to_string(),
|
||||
version: "1.0.0".to_string(),
|
||||
layer: "L2".to_string(),
|
||||
protocol: "Charter".to_string(),
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
})
|
||||
}
|
||||
|
||||
/// 编译 Charter 源代码
|
||||
async fn compile(req: web::Json<CompileRequest>) -> HttpResponse {
|
||||
let start = std::time::Instant::now();
|
||||
|
||||
// 写入临时文件
|
||||
let tmp_dir = std::env::temp_dir();
|
||||
let input_path = tmp_dir.join(format!("charter_input_{}.ch", std::process::id()));
|
||||
let output_path = tmp_dir.join(format!("charter_output_{}.nvm", std::process::id()));
|
||||
|
||||
if let Err(e) = fs::write(&input_path, &req.source) {
|
||||
return HttpResponse::InternalServerError().json(CompileResponse {
|
||||
success: false,
|
||||
bytecode: None,
|
||||
bytecode_size: None,
|
||||
error: Some(format!("写入临时文件失败: {}", e)),
|
||||
elapsed_ms: start.elapsed().as_millis() as u64,
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
});
|
||||
}
|
||||
|
||||
// 调用 charter 编译器
|
||||
let charter_bin = env::var("CHARTER_BIN").unwrap_or_else(|_| "/opt/nac/bin/charter".to_string());
|
||||
let mut cmd = Command::new(&charter_bin);
|
||||
cmd.arg("compile")
|
||||
.arg("-i").arg(&input_path)
|
||||
.arg("-o").arg(&output_path)
|
||||
.arg("-O").arg(req.optimization.to_string());
|
||||
|
||||
if req.debug {
|
||||
cmd.arg("--debug");
|
||||
}
|
||||
|
||||
let output = match cmd.output() {
|
||||
Ok(o) => o,
|
||||
Err(e) => {
|
||||
let _ = fs::remove_file(&input_path);
|
||||
return HttpResponse::InternalServerError().json(CompileResponse {
|
||||
success: false,
|
||||
bytecode: None,
|
||||
bytecode_size: None,
|
||||
error: Some(format!("执行编译器失败: {}", e)),
|
||||
elapsed_ms: start.elapsed().as_millis() as u64,
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
let _ = fs::remove_file(&input_path);
|
||||
let elapsed = start.elapsed().as_millis() as u64;
|
||||
|
||||
if output.status.success() {
|
||||
// 读取输出字节码
|
||||
match fs::read(&output_path) {
|
||||
Ok(bytecode) => {
|
||||
let _ = fs::remove_file(&output_path);
|
||||
let size = bytecode.len();
|
||||
let hex_bytecode = hex::encode(&bytecode);
|
||||
log::info!("Charter编译成功,字节码大小: {} 字节,耗时: {}ms", size, elapsed);
|
||||
HttpResponse::Ok().json(CompileResponse {
|
||||
success: true,
|
||||
bytecode: Some(hex_bytecode),
|
||||
bytecode_size: Some(size),
|
||||
error: None,
|
||||
elapsed_ms: elapsed,
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
})
|
||||
}
|
||||
Err(e) => {
|
||||
HttpResponse::InternalServerError().json(CompileResponse {
|
||||
success: false,
|
||||
bytecode: None,
|
||||
bytecode_size: None,
|
||||
error: Some(format!("读取字节码失败: {}", e)),
|
||||
elapsed_ms: elapsed,
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
})
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let stderr = String::from_utf8_lossy(&output.stderr).to_string();
|
||||
let stdout = String::from_utf8_lossy(&output.stdout).to_string();
|
||||
let error_msg = if !stderr.is_empty() { stderr } else { stdout };
|
||||
log::warn!("Charter编译失败: {}", error_msg);
|
||||
HttpResponse::Ok().json(CompileResponse {
|
||||
success: false,
|
||||
bytecode: None,
|
||||
bytecode_size: None,
|
||||
error: Some(error_msg),
|
||||
elapsed_ms: elapsed,
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// 语法检查
|
||||
async fn check(req: web::Json<CheckRequest>) -> HttpResponse {
|
||||
let tmp_dir = std::env::temp_dir();
|
||||
let input_path = tmp_dir.join(format!("charter_check_{}.ch", std::process::id()));
|
||||
|
||||
if let Err(e) = fs::write(&input_path, &req.source) {
|
||||
return HttpResponse::InternalServerError().json(CheckResponse {
|
||||
success: false,
|
||||
valid: false,
|
||||
errors: vec![format!("写入临时文件失败: {}", e)],
|
||||
warnings: vec![],
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
});
|
||||
}
|
||||
|
||||
let charter_bin = env::var("CHARTER_BIN").unwrap_or_else(|_| "/opt/nac/bin/charter".to_string());
|
||||
let output = Command::new(&charter_bin)
|
||||
.arg("check")
|
||||
.arg("-i").arg(&input_path)
|
||||
.output();
|
||||
|
||||
let _ = fs::remove_file(&input_path);
|
||||
|
||||
match output {
|
||||
Ok(o) => {
|
||||
let valid = o.status.success();
|
||||
let stderr = String::from_utf8_lossy(&o.stderr).to_string();
|
||||
let stdout = String::from_utf8_lossy(&o.stdout).to_string();
|
||||
let errors = if !valid {
|
||||
let msg = if !stderr.is_empty() { stderr } else { stdout };
|
||||
msg.lines().map(|l| l.to_string()).filter(|l| !l.is_empty()).collect()
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
HttpResponse::Ok().json(CheckResponse {
|
||||
success: true,
|
||||
valid,
|
||||
errors,
|
||||
warnings: vec![],
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
})
|
||||
}
|
||||
Err(e) => HttpResponse::InternalServerError().json(CheckResponse {
|
||||
success: false,
|
||||
valid: false,
|
||||
errors: vec![format!("执行检查器失败: {}", e)],
|
||||
warnings: vec![],
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
/// 版本信息
|
||||
async fn version() -> HttpResponse {
|
||||
let charter_bin = env::var("CHARTER_BIN").unwrap_or_else(|_| "/opt/nac/bin/charter".to_string());
|
||||
let output = Command::new(&charter_bin).arg("version").output();
|
||||
let version_info = match output {
|
||||
Ok(o) => String::from_utf8_lossy(&o.stdout).trim().to_string(),
|
||||
Err(_) => "Charter Compiler 1.0.0 (NAC L2)".to_string(),
|
||||
};
|
||||
HttpResponse::Ok().json(serde_json::json!({
|
||||
"service": "nac-charter-service",
|
||||
"layer": "L2",
|
||||
"protocol": "Charter",
|
||||
"compiler_version": version_info,
|
||||
"timestamp": Utc::now().to_rfc3339()
|
||||
}))
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info"));
|
||||
|
||||
let host = env::var("CHARTER_HOST").unwrap_or_else(|_| "0.0.0.0".to_string());
|
||||
let port: u16 = env::var("CHARTER_PORT")
|
||||
.unwrap_or_else(|_| "9555".to_string())
|
||||
.parse()
|
||||
.unwrap_or(9555);
|
||||
|
||||
log::info!("NAC Charter HTTP Service 启动中...");
|
||||
log::info!("监听地址: {}:{}", host, port);
|
||||
log::info!("Charter 编译器: {}", env::var("CHARTER_BIN").unwrap_or_else(|_| "/opt/nac/bin/charter".to_string()));
|
||||
|
||||
HttpServer::new(|| {
|
||||
App::new()
|
||||
.route("/health", web::get().to(health))
|
||||
.route("/compile", web::post().to(compile))
|
||||
.route("/check", web::post().to(check))
|
||||
.route("/version", web::get().to(version))
|
||||
})
|
||||
.bind(format!("{}:{}", host, port))?
|
||||
.run()
|
||||
.await
|
||||
}
|
||||
|
|
@ -80,7 +80,7 @@ fn validate_address(addr: &str) -> bool {
|
|||
}
|
||||
|
||||
async fn health(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
HttpResponse::Ok().json(serde_json::json!({
|
||||
"status": "healthy", "service": "nac-acc-service",
|
||||
"version": SERVICE_VERSION, "chain_id": CHAIN_ID,
|
||||
|
|
@ -92,7 +92,7 @@ async fn health(state: web::Data<SharedState>) -> HttpResponse {
|
|||
}
|
||||
|
||||
async fn get_state(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
HttpResponse::Ok().json(serde_json::json!({
|
||||
"chain_id": CHAIN_ID, "service_version": SERVICE_VERSION,
|
||||
"tokens": s.tokens.len(), "total_minted": s.total_minted,
|
||||
|
|
@ -113,7 +113,7 @@ async fn mint_token(state: web::Data<SharedState>, req: web::Json<MintReq>) -> H
|
|||
"success": false, "error": "amount 必须大于 0(宪法原则2:资产真实性原则)"
|
||||
}));
|
||||
}
|
||||
let mut s = state.lock().unwrap();
|
||||
let mut s = state.lock().expect("lock not poisoned");
|
||||
let token_id = format!("TOKEN-{}", &Uuid::new_v4().to_string()[..12].to_uppercase());
|
||||
let hash_input = format!("{}:{}:{}:{}", req.protocol, req.holder, req.amount, Utc::now().timestamp_millis());
|
||||
let token_hash = sha3_384_hex(hash_input.as_bytes());
|
||||
|
|
@ -140,7 +140,7 @@ async fn transfer_token(state: web::Data<SharedState>, req: web::Json<TransferRe
|
|||
"success": false, "error": "from/to 必须为 NAC Address(32字节,64个十六进制字符)"
|
||||
}));
|
||||
}
|
||||
let mut s = state.lock().unwrap();
|
||||
let mut s = state.lock().expect("lock not poisoned");
|
||||
if !s.tokens.contains_key(&req.token_id) {
|
||||
return HttpResponse::NotFound().json(serde_json::json!({
|
||||
"success": false, "error": format!("Token {} 不存在", req.token_id)
|
||||
|
|
@ -166,7 +166,7 @@ async fn transfer_token(state: web::Data<SharedState>, req: web::Json<TransferRe
|
|||
}
|
||||
|
||||
async fn burn_token(state: web::Data<SharedState>, req: web::Json<BurnReq>) -> HttpResponse {
|
||||
let mut s = state.lock().unwrap();
|
||||
let mut s = state.lock().expect("lock not poisoned");
|
||||
match s.tokens.get_mut(&req.token_id) {
|
||||
Some(token) => {
|
||||
token.status = "burned".to_string();
|
||||
|
|
@ -183,7 +183,7 @@ async fn burn_token(state: web::Data<SharedState>, req: web::Json<BurnReq>) -> H
|
|||
}
|
||||
|
||||
async fn list_tokens(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
let tokens: Vec<&TokenRecord> = s.tokens.values().collect();
|
||||
HttpResponse::Ok().json(serde_json::json!({"tokens": tokens, "total": tokens.len()}))
|
||||
}
|
||||
|
|
@ -207,7 +207,7 @@ async fn get_protocols() -> HttpResponse {
|
|||
}
|
||||
|
||||
async fn get_stats(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
HttpResponse::Ok().json(serde_json::json!({
|
||||
"service": "nac-acc-service", "layer": "L1-ACC",
|
||||
"chain_id": CHAIN_ID, "supported_protocols": 19,
|
||||
|
|
|
|||
|
|
@ -405,12 +405,12 @@ mod tests {
|
|||
async fn test_kyc_validator() {
|
||||
let validator = KYCValidator::new();
|
||||
let mut data = ComplianceData::new("user123".to_string());
|
||||
data.add_field("has_passport".to_string(), true).unwrap();
|
||||
data.add_field("has_id_card".to_string(), true).unwrap();
|
||||
data.add_field("has_utility_bill".to_string(), true).unwrap();
|
||||
data.add_field("has_bank_statement".to_string(), true).unwrap();
|
||||
data.add_field("has_passport".to_string(), true).expect("mainnet: handle error");
|
||||
data.add_field("has_id_card".to_string(), true).expect("mainnet: handle error");
|
||||
data.add_field("has_utility_bill".to_string(), true).expect("mainnet: handle error");
|
||||
data.add_field("has_bank_statement".to_string(), true).expect("mainnet: handle error");
|
||||
|
||||
let result = validator.validate(&data).await.unwrap();
|
||||
let result = validator.validate(&data).await.expect("mainnet: handle error");
|
||||
assert_eq!(result.status, ComplianceStatus::Passed);
|
||||
}
|
||||
|
||||
|
|
@ -418,10 +418,10 @@ mod tests {
|
|||
async fn test_aml_validator() {
|
||||
let validator = AMLValidator::new();
|
||||
let mut data = ComplianceData::new("user123".to_string());
|
||||
data.add_field("is_blacklisted".to_string(), false).unwrap();
|
||||
data.add_field("transaction_count".to_string(), 10u32).unwrap();
|
||||
data.add_field("is_blacklisted".to_string(), false).expect("mainnet: handle error");
|
||||
data.add_field("transaction_count".to_string(), 10u32).expect("mainnet: handle error");
|
||||
|
||||
let result = validator.validate(&data).await.unwrap();
|
||||
let result = validator.validate(&data).await.expect("mainnet: handle error");
|
||||
assert_eq!(result.status, ComplianceStatus::Passed);
|
||||
}
|
||||
|
||||
|
|
@ -429,10 +429,10 @@ mod tests {
|
|||
fn test_risk_assessment() {
|
||||
let engine = RiskAssessmentEngine::new();
|
||||
let mut data = ComplianceData::new("user123".to_string());
|
||||
data.add_field("kyc_risk".to_string(), 0.2).unwrap();
|
||||
data.add_field("aml_risk".to_string(), 0.3).unwrap();
|
||||
data.add_field("kyc_risk".to_string(), 0.2).expect("mainnet: handle error");
|
||||
data.add_field("aml_risk".to_string(), 0.3).expect("mainnet: handle error");
|
||||
|
||||
let risk = engine.calculate_risk(&data).unwrap();
|
||||
let risk = engine.calculate_risk(&data).expect("mainnet: handle error");
|
||||
assert!(risk > 0.0 && risk < 1.0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ impl AIComplianceSystem {
|
|||
|
||||
impl Default for AIComplianceSystem {
|
||||
fn default() -> Self {
|
||||
Self::new().unwrap()
|
||||
Self::new().expect("mainnet: handle error")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ impl ModelManager {
|
|||
return Err(Error::Other("没有可回滚的版本".to_string()));
|
||||
}
|
||||
|
||||
let previous_version = model.version_history.pop().unwrap();
|
||||
let previous_version = model.version_history.pop().expect("mainnet: handle error");
|
||||
model.current_version = previous_version;
|
||||
|
||||
Ok(())
|
||||
|
|
@ -453,12 +453,12 @@ mod tests {
|
|||
ModelType::KYC,
|
||||
);
|
||||
|
||||
manager.register_model(model).unwrap();
|
||||
manager.register_model(model).expect("mainnet: handle error");
|
||||
|
||||
let new_version = ModelVersion::new("2.0.0".to_string());
|
||||
assert!(manager.upgrade_model("model1", new_version).is_ok());
|
||||
|
||||
let model = manager.get_model("model1").unwrap();
|
||||
let model = manager.get_model("model1").expect("mainnet: handle error");
|
||||
assert_eq!(model.current_version.version, "2.0.0");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ impl ReportGenerator {
|
|||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
let timestamp = SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_millis();
|
||||
format!("RPT{}", timestamp)
|
||||
}
|
||||
|
|
@ -387,7 +387,7 @@ mod tests {
|
|||
}
|
||||
];
|
||||
|
||||
let report = generator.generate(&results).unwrap();
|
||||
let report = generator.generate(&results).expect("mainnet: handle error");
|
||||
assert_eq!(report.results.len(), 1);
|
||||
assert_eq!(report.overall_status, ComplianceStatus::Passed);
|
||||
}
|
||||
|
|
@ -408,8 +408,8 @@ mod tests {
|
|||
}
|
||||
];
|
||||
|
||||
let report = generator.generate(&results).unwrap();
|
||||
let exported = generator.export(&report, ExportFormat::Json).unwrap();
|
||||
let report = generator.generate(&results).expect("mainnet: handle error");
|
||||
let exported = generator.export(&report, ExportFormat::Json).expect("mainnet: handle error");
|
||||
assert!(!exported.is_empty());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -442,6 +442,6 @@ mod tests {
|
|||
};
|
||||
let data = ComplianceData::new("user123".to_string());
|
||||
|
||||
assert!(executor.evaluate_condition(&condition, &result, &data).unwrap());
|
||||
assert!(executor.evaluate_condition(&condition, &result, &data).expect("mainnet: handle error"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ mod tests {
|
|||
"test_key1".to_string(),
|
||||
"test_key2".to_string(),
|
||||
"test_key3".to_string(),
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
let asset = Asset::new(
|
||||
"test_001".to_string(),
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ mod tests {
|
|||
let client = AIModelClient::new(
|
||||
AIProvider::ChatGPT,
|
||||
AIModelConfig::chatgpt("test_key".to_string()),
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
let prompt = client.build_prompt(
|
||||
&asset,
|
||||
|
|
|
|||
|
|
@ -126,8 +126,8 @@ impl Arbitrator {
|
|||
let bayesian_valuation = self.bayesian_fusion(&results, &weights)?;
|
||||
|
||||
// 4. 综合最终估值
|
||||
let final_valuation = weighted_valuation * Decimal::from_f64_retain(self.config.weighted_voting_weight).unwrap()
|
||||
+ bayesian_valuation * Decimal::from_f64_retain(self.config.bayesian_fusion_weight).unwrap();
|
||||
let final_valuation = weighted_valuation * Decimal::from_f64_retain(self.config.weighted_voting_weight).expect("mainnet: handle error")
|
||||
+ bayesian_valuation * Decimal::from_f64_retain(self.config.bayesian_fusion_weight).expect("mainnet: handle error");
|
||||
|
||||
// 5. 计算置信度
|
||||
let confidence = self.calculate_confidence(&results, &weights)?;
|
||||
|
|
@ -220,7 +220,7 @@ impl Arbitrator {
|
|||
let mut valuations: Vec<f64> = results.iter()
|
||||
.map(|r| r.valuation_xtzh.to_string().parse::<f64>().unwrap_or(0.0))
|
||||
.collect();
|
||||
valuations.sort_by(|a, b| a.partial_cmp(b).unwrap());
|
||||
valuations.sort_by(|a, b| a.partial_cmp(b).expect("mainnet: handle error"));
|
||||
|
||||
let len = valuations.len();
|
||||
let q1_idx = len / 4;
|
||||
|
|
@ -448,7 +448,7 @@ mod tests {
|
|||
weights.insert(AIProvider::ChatGPT, 0.5);
|
||||
weights.insert(AIProvider::DeepSeek, 0.5);
|
||||
|
||||
let result = arbitrator.weighted_voting(&results, &weights).unwrap();
|
||||
let result = arbitrator.weighted_voting(&results, &weights).expect("mainnet: handle error");
|
||||
assert_eq!(result, Decimal::new(1050, 0));
|
||||
}
|
||||
|
||||
|
|
@ -480,7 +480,7 @@ mod tests {
|
|||
},
|
||||
];
|
||||
|
||||
let (is_anomaly, report) = arbitrator.detect_anomalies(&results).unwrap();
|
||||
let (is_anomaly, report) = arbitrator.detect_anomalies(&results).expect("mainnet: handle error");
|
||||
println!("is_anomaly: {}, report: {}", is_anomaly, report);
|
||||
// 数据点太少,只有3个,IQR方法可能不准确,改为检查极差
|
||||
let max_val = results.iter().map(|r| r.valuation_xtzh.to_string().parse::<f64>().unwrap_or(0.0)).fold(f64::NEG_INFINITY, f64::max);
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ mod tests {
|
|||
"test_deepseek_key".to_string(),
|
||||
"test_doubao_key".to_string(),
|
||||
ValuationEngineConfig::default(),
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
let asset = Asset::new(
|
||||
"test_asset".to_string(),
|
||||
|
|
|
|||
|
|
@ -263,13 +263,13 @@ impl TrendAnalyzer {
|
|||
|
||||
// 计算统计指标
|
||||
let average_valuation = Self::calculate_average(&valuations);
|
||||
let min_valuation = valuations.iter().min().unwrap().clone();
|
||||
let max_valuation = valuations.iter().max().unwrap().clone();
|
||||
let min_valuation = valuations.iter().min().expect("mainnet: handle error").clone();
|
||||
let max_valuation = valuations.iter().max().expect("mainnet: handle error").clone();
|
||||
let std_deviation = Self::calculate_std_deviation(&valuations, average_valuation);
|
||||
|
||||
// 计算变化率
|
||||
let first_val = valuations.first().unwrap();
|
||||
let last_val = valuations.last().unwrap();
|
||||
let first_val = valuations.first().expect("mainnet: handle error");
|
||||
let last_val = valuations.last().expect("mainnet: handle error");
|
||||
let change_rate = if *first_val > Decimal::ZERO {
|
||||
((*last_val - *first_val) / *first_val * Decimal::new(100, 0))
|
||||
.to_string()
|
||||
|
|
@ -289,8 +289,8 @@ impl TrendAnalyzer {
|
|||
let avg_confidence = confidences.iter().sum::<f64>() / confidences.len() as f64;
|
||||
|
||||
let time_range = (
|
||||
sorted_entries.first().unwrap().timestamp,
|
||||
sorted_entries.last().unwrap().timestamp,
|
||||
sorted_entries.first().expect("mainnet: handle error").timestamp,
|
||||
sorted_entries.last().expect("mainnet: handle error").timestamp,
|
||||
);
|
||||
|
||||
Ok(TrendAnalysis {
|
||||
|
|
@ -557,7 +557,7 @@ mod tests {
|
|||
let mut history = ValuationHistory::new(10);
|
||||
|
||||
let entry = create_test_entry(1000000);
|
||||
history.add(entry.clone()).unwrap();
|
||||
history.add(entry.clone()).expect("mainnet: handle error");
|
||||
|
||||
let entries = history.get_by_asset("test_asset");
|
||||
assert_eq!(entries.len(), 1);
|
||||
|
|
@ -573,7 +573,7 @@ mod tests {
|
|||
create_test_entry(1150000),
|
||||
];
|
||||
|
||||
let trend = TrendAnalyzer::analyze(&entries).unwrap();
|
||||
let trend = TrendAnalyzer::analyze(&entries).expect("mainnet: handle error");
|
||||
assert_eq!(trend.data_points, 4);
|
||||
assert!(trend.change_rate > 0.0); // 上升趋势
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
//! "deepseek_api_key".to_string(),
|
||||
//! "doubao_api_key".to_string(),
|
||||
//! ValuationEngineConfig::default(),
|
||||
//! ).unwrap();
|
||||
//! ).expect("mainnet: handle error");
|
||||
//!
|
||||
//! let asset = Asset::new(
|
||||
//! "asset_001".to_string(),
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
//! &asset,
|
||||
//! Jurisdiction::US,
|
||||
//! InternationalAgreement::WTO,
|
||||
//! ).await.unwrap();
|
||||
//! ).await.expect("mainnet: handle error");
|
||||
//!
|
||||
//! println!("估值: {} XTZH", result.valuation_xtzh);
|
||||
//! println!("置信度: {:.1}%", result.confidence * 100.0);
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ impl ValuationCache {
|
|||
) -> Option<FinalValuationResult> {
|
||||
let key = Self::generate_key(asset_id, jurisdiction, agreement);
|
||||
|
||||
let mut cache = self.cache.write().unwrap();
|
||||
let mut cache = self.cache.write().expect("mainnet: handle error");
|
||||
|
||||
if let Some(entry) = cache.get_mut(&key) {
|
||||
if !entry.is_expired() {
|
||||
|
|
@ -181,7 +181,7 @@ impl ValuationCache {
|
|||
) {
|
||||
let key = Self::generate_key(asset_id, jurisdiction, agreement);
|
||||
|
||||
let mut cache = self.cache.write().unwrap();
|
||||
let mut cache = self.cache.write().expect("mainnet: handle error");
|
||||
|
||||
// 如果缓存已满,删除最旧的条目
|
||||
if cache.len() >= self.max_entries {
|
||||
|
|
@ -205,14 +205,14 @@ impl ValuationCache {
|
|||
|
||||
/// 清除所有缓存
|
||||
pub fn clear(&self) {
|
||||
let mut cache = self.cache.write().unwrap();
|
||||
let mut cache = self.cache.write().expect("mainnet: handle error");
|
||||
cache.clear();
|
||||
log::info!("缓存已清空");
|
||||
}
|
||||
|
||||
/// 清除过期缓存
|
||||
pub fn clear_expired(&self) {
|
||||
let mut cache = self.cache.write().unwrap();
|
||||
let mut cache = self.cache.write().expect("mainnet: handle error");
|
||||
cache.retain(|key, entry| {
|
||||
let keep = !entry.is_expired();
|
||||
if !keep {
|
||||
|
|
@ -224,7 +224,7 @@ impl ValuationCache {
|
|||
|
||||
/// 获取缓存统计
|
||||
pub fn stats(&self) -> CacheStats {
|
||||
let cache = self.cache.read().unwrap();
|
||||
let cache = self.cache.read().expect("mainnet: handle error");
|
||||
|
||||
let total_entries = cache.len();
|
||||
let total_accesses: u64 = cache.values().map(|e| e.access_count).sum();
|
||||
|
|
@ -281,7 +281,7 @@ impl RealtimeValuationEngine {
|
|||
|
||||
/// 更新实时数据
|
||||
pub async fn update_realtime_data(&self) -> Result<()> {
|
||||
let mut data_source = self.data_source.write().unwrap();
|
||||
let mut data_source = self.data_source.write().expect("mainnet: handle error");
|
||||
data_source.fetch_from_api().await?;
|
||||
|
||||
// 清除缓存,因为市场数据已更新
|
||||
|
|
@ -292,7 +292,7 @@ impl RealtimeValuationEngine {
|
|||
|
||||
/// 获取实时数据
|
||||
pub fn get_realtime_data(&self) -> RealtimeDataSource {
|
||||
self.data_source.read().unwrap().clone()
|
||||
self.data_source.read().expect("mainnet: handle error").clone()
|
||||
}
|
||||
|
||||
/// 实时估值(带缓存)
|
||||
|
|
@ -310,7 +310,7 @@ impl RealtimeValuationEngine {
|
|||
|
||||
// 检查数据是否过期
|
||||
{
|
||||
let data_source = self.data_source.read().unwrap();
|
||||
let data_source = self.data_source.read().expect("mainnet: handle error");
|
||||
if data_source.is_stale() {
|
||||
log::warn!("实时数据已过期,建议更新");
|
||||
}
|
||||
|
|
@ -459,7 +459,7 @@ mod tests {
|
|||
// 获取缓存
|
||||
let cached = cache.get("asset_001", Jurisdiction::US, InternationalAgreement::WTO);
|
||||
assert!(cached.is_some());
|
||||
assert_eq!(cached.unwrap().valuation_xtzh, Decimal::new(1000000, 0));
|
||||
assert_eq!(cached.expect("mainnet: handle error").valuation_xtzh, Decimal::new(1000000, 0));
|
||||
|
||||
// 统计
|
||||
let stats = cache.stats();
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ impl GNACSCode {
|
|||
|
||||
/// 获取时间属性(第22位)
|
||||
pub fn time_attribute(&self) -> char {
|
||||
self.0.chars().nth(21).unwrap()
|
||||
self.0.chars().nth(21).expect("mainnet: handle error")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -329,8 +329,8 @@ impl DivergenceAnalyzer {
|
|||
.map(|r| r.valuation_xtzh)
|
||||
.collect();
|
||||
|
||||
let min_valuation = valuations.iter().min().unwrap().clone();
|
||||
let max_valuation = valuations.iter().max().unwrap().clone();
|
||||
let min_valuation = valuations.iter().min().expect("mainnet: handle error").clone();
|
||||
let max_valuation = valuations.iter().max().expect("mainnet: handle error").clone();
|
||||
let avg_valuation = valuations.iter().sum::<Decimal>() / Decimal::new(valuations.len() as i64, 0);
|
||||
|
||||
let divergence_rate = if min_valuation != Decimal::ZERO {
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ fn test_valuation_history() {
|
|||
create_test_valuation_result(),
|
||||
);
|
||||
|
||||
history.add(entry.clone()).unwrap();
|
||||
history.add(entry.clone()).expect("mainnet: handle error");
|
||||
|
||||
let entries = history.get_by_asset("test_asset_001");
|
||||
assert_eq!(entries.len(), 1);
|
||||
|
|
@ -129,7 +129,7 @@ fn test_trend_analysis() {
|
|||
),
|
||||
];
|
||||
|
||||
let trend = TrendAnalyzer::analyze(&entries).unwrap();
|
||||
let trend = TrendAnalyzer::analyze(&entries).expect("mainnet: handle error");
|
||||
assert_eq!(trend.data_points, 3);
|
||||
assert!(trend.change_rate > 0.0); // 上升趋势
|
||||
// 趋势可能是Upward或Volatile,取决于标准差
|
||||
|
|
@ -336,7 +336,7 @@ fn test_cache_operations() {
|
|||
);
|
||||
|
||||
assert!(cached.is_some());
|
||||
assert_eq!(cached.unwrap().valuation_xtzh, result.valuation_xtzh);
|
||||
assert_eq!(cached.expect("mainnet: handle error").valuation_xtzh, result.valuation_xtzh);
|
||||
|
||||
// 统计
|
||||
let stats = cache.stats();
|
||||
|
|
@ -385,7 +385,7 @@ fn test_final_valuation_result_report() {
|
|||
#[test]
|
||||
fn test_final_valuation_result_json() {
|
||||
let result = create_test_valuation_result();
|
||||
let json = result.to_json().unwrap();
|
||||
let json = result.to_json().expect("mainnet: handle error");
|
||||
|
||||
assert!(json.contains("valuation_xtzh"));
|
||||
assert!(json.contains("confidence"));
|
||||
|
|
@ -447,7 +447,7 @@ fn test_data_export_markdown() {
|
|||
),
|
||||
];
|
||||
|
||||
let trend = TrendAnalyzer::analyze(&entries).unwrap();
|
||||
let trend = TrendAnalyzer::analyze(&entries).expect("mainnet: handle error");
|
||||
let path = Path::new("/tmp/test_valuation_export.md");
|
||||
let result = DataExporter::export_markdown(&entries, &trend, path);
|
||||
assert!(result.is_ok());
|
||||
|
|
@ -465,7 +465,7 @@ async fn test_full_valuation_flow() {
|
|||
std::env::var("DEEPSEEK_API_KEY").unwrap_or("test_key".to_string()),
|
||||
std::env::var("DOUBAO_API_KEY").unwrap_or("test_key".to_string()),
|
||||
ValuationEngineConfig::default(),
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 创建资产
|
||||
let asset = create_test_asset();
|
||||
|
|
|
|||
|
|
@ -127,15 +127,15 @@ mod tests {
|
|||
#[test]
|
||||
fn test_jwt_creation() {
|
||||
let auth = JwtAuth::new("test-secret".to_string(), 24);
|
||||
let token = auth.create_token("user123").unwrap();
|
||||
let token = auth.create_token("user123").expect("mainnet: handle error");
|
||||
assert!(!token.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_jwt_validation() {
|
||||
let auth = JwtAuth::new("test-secret".to_string(), 24);
|
||||
let token = auth.create_token("user123").unwrap();
|
||||
let claims = auth.validate_token(&token).unwrap();
|
||||
let token = auth.create_token("user123").expect("mainnet: handle error");
|
||||
let claims = auth.validate_token(&token).expect("mainnet: handle error");
|
||||
assert_eq!(claims.sub, "user123");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_config_serialization() {
|
||||
let config = Config::default();
|
||||
let toml_str = toml::to_string(&config).unwrap();
|
||||
let toml_str = toml::to_string(&config).expect("mainnet: handle error");
|
||||
assert!(toml_str.contains("host"));
|
||||
assert!(toml_str.contains("port"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@ async fn main() {
|
|||
let addr = "0.0.0.0:8080";
|
||||
println!("🚀 NAC API服务器启动在 http://{}", addr);
|
||||
|
||||
let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
let listener = tokio::net::TcpListener::bind(addr).await.expect("mainnet: handle error");
|
||||
axum::serve(listener, app).await.expect("mainnet: handle error");
|
||||
}
|
||||
|
||||
async fn root() -> &'static str {
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ pub async fn request_id_middleware(
|
|||
|
||||
response.headers_mut().insert(
|
||||
"X-Request-ID",
|
||||
request_id.parse().unwrap(),
|
||||
request_id.parse().expect("mainnet: handle error"),
|
||||
);
|
||||
|
||||
response
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ pub struct RateLimitLayer {
|
|||
|
||||
impl RateLimitLayer {
|
||||
pub fn new(requests_per_second: u32) -> Self {
|
||||
let quota = Quota::per_second(NonZeroU32::new(requests_per_second).unwrap());
|
||||
let quota = Quota::per_second(NonZeroU32::new(requests_per_second).expect("mainnet: handle error"));
|
||||
let limiter = Arc::new(RateLimiter::direct(quota));
|
||||
Self { limiter }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,10 +17,10 @@ async fn test_health_endpoint() {
|
|||
return;
|
||||
}
|
||||
|
||||
let response = response.unwrap();
|
||||
let response = response.expect("mainnet: handle error");
|
||||
assert_eq!(response.status(), 200);
|
||||
|
||||
let body: serde_json::Value = response.json().await.unwrap();
|
||||
let body: serde_json::Value = response.json().await.expect("mainnet: handle error");
|
||||
assert_eq!(body["status"], "ok");
|
||||
}
|
||||
|
||||
|
|
@ -37,7 +37,7 @@ async fn test_root_endpoint() {
|
|||
return;
|
||||
}
|
||||
|
||||
let response = response.unwrap();
|
||||
let response = response.expect("mainnet: handle error");
|
||||
assert_eq!(response.status(), 200);
|
||||
}
|
||||
|
||||
|
|
@ -56,7 +56,7 @@ async fn test_wallet_balance_validation() {
|
|||
return;
|
||||
}
|
||||
|
||||
let response = response.unwrap();
|
||||
let response = response.expect("mainnet: handle error");
|
||||
// 应该返回400或500错误
|
||||
assert!(response.status().is_client_error() || response.status().is_server_error());
|
||||
}
|
||||
|
|
@ -85,7 +85,7 @@ async fn test_transfer_validation() {
|
|||
return;
|
||||
}
|
||||
|
||||
let response = response.unwrap();
|
||||
let response = response.expect("mainnet: handle error");
|
||||
// 应该返回验证错误
|
||||
assert!(response.status().is_client_error());
|
||||
}
|
||||
|
|
@ -103,9 +103,9 @@ async fn test_exchange_assets_endpoint() {
|
|||
return;
|
||||
}
|
||||
|
||||
let response = response.unwrap();
|
||||
let response = response.expect("mainnet: handle error");
|
||||
assert_eq!(response.status(), 200);
|
||||
|
||||
let body: serde_json::Value = response.json().await.unwrap();
|
||||
let body: serde_json::Value = response.json().await.expect("mainnet: handle error");
|
||||
assert!(body.is_array());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ impl ComplianceAdapter {
|
|||
|
||||
impl Default for ComplianceAdapter {
|
||||
fn default() -> Self {
|
||||
Self::new().unwrap()
|
||||
Self::new().expect("mainnet: handle error")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ impl CustodyAdapter {
|
|||
|
||||
impl Default for CustodyAdapter {
|
||||
fn default() -> Self {
|
||||
Self::new().unwrap()
|
||||
Self::new().expect("mainnet: handle error")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ impl DNAAdapter {
|
|||
|
||||
impl Default for DNAAdapter {
|
||||
fn default() -> Self {
|
||||
Self::new().unwrap()
|
||||
Self::new().expect("mainnet: handle error")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
//!
|
||||
//! #[tokio::main]
|
||||
//! async fn main() {
|
||||
//! let engine = OnboardingEngine::new().await.unwrap();
|
||||
//! let engine = OnboardingEngine::new().await.expect("mainnet: handle error");
|
||||
//!
|
||||
//! let submission = AssetSubmission {
|
||||
//! asset_name: "Manhattan Office Building".to_string(),
|
||||
|
|
@ -32,7 +32,7 @@
|
|||
//! documents: vec![],
|
||||
//! };
|
||||
//!
|
||||
//! let result = engine.submit_asset(submission).await.unwrap();
|
||||
//! let result = engine.submit_asset(submission).await.expect("mainnet: handle error");
|
||||
//! println!("上链流程ID: {}", result.process_id);
|
||||
//! }
|
||||
//! ```
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ impl Orchestrator {
|
|||
}
|
||||
|
||||
// 步骤4:托管对接
|
||||
let dna_hash = process.dna_result.as_ref().unwrap().dna_hash.clone();
|
||||
let dna_hash = process.dna_result.as_ref().expect("mainnet: handle error").dna_hash.clone();
|
||||
match self.step_custody(&submission, &dna_hash, &mut state_machine).await {
|
||||
Ok(result) => {
|
||||
process.custody_result = Some(result);
|
||||
|
|
@ -155,8 +155,8 @@ impl Orchestrator {
|
|||
}
|
||||
|
||||
// 步骤5:XTZH铸造
|
||||
let valuation = process.valuation_result.as_ref().unwrap();
|
||||
let custody_hash = process.custody_result.as_ref().unwrap().custody_agreement_hash.clone();
|
||||
let valuation = process.valuation_result.as_ref().expect("mainnet: handle error");
|
||||
let custody_hash = process.custody_result.as_ref().expect("mainnet: handle error").custody_agreement_hash.clone();
|
||||
match self.step_xtzh(valuation, &dna_hash, &custody_hash, &mut state_machine).await {
|
||||
Ok(result) => {
|
||||
process.xtzh_result = Some(result);
|
||||
|
|
@ -172,7 +172,7 @@ impl Orchestrator {
|
|||
}
|
||||
|
||||
// 步骤6:代币发行
|
||||
let xtzh_amount = process.xtzh_result.as_ref().unwrap().xtzh_amount;
|
||||
let xtzh_amount = process.xtzh_result.as_ref().expect("mainnet: handle error").xtzh_amount;
|
||||
match self.step_token(&submission, &dna_hash, xtzh_amount, &mut state_machine).await {
|
||||
Ok(result) => {
|
||||
process.token_result = Some(result);
|
||||
|
|
@ -188,7 +188,7 @@ impl Orchestrator {
|
|||
}
|
||||
|
||||
// 步骤7:区块链集成
|
||||
let token_address = process.token_result.as_ref().unwrap().token_address.clone();
|
||||
let token_address = process.token_result.as_ref().expect("mainnet: handle error").token_address.clone();
|
||||
match self.step_blockchain(&dna_hash, &token_address, &mut state_machine).await {
|
||||
Ok(result) => {
|
||||
process.blockchain_result = Some(result);
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ impl TokenAdapter {
|
|||
|
||||
impl Default for TokenAdapter {
|
||||
fn default() -> Self {
|
||||
Self::new().unwrap()
|
||||
Self::new().expect("mainnet: handle error")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -105,7 +105,7 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_generate_symbol() {
|
||||
let adapter = TokenAdapter::new().unwrap();
|
||||
let adapter = TokenAdapter::new().expect("mainnet: handle error");
|
||||
let symbol = adapter.generate_symbol("Real Estate Asset");
|
||||
assert_eq!(symbol, "REARWA");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ mod tests {
|
|||
"test".to_string(),
|
||||
"test".to_string(),
|
||||
"test".to_string(),
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
assert!(matches!(
|
||||
adapter.parse_asset_type("RealEstate"),
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ impl XTZHAdapter {
|
|||
|
||||
impl Default for XTZHAdapter {
|
||||
fn default() -> Self {
|
||||
Self::new().unwrap()
|
||||
Self::new().expect("mainnet: handle error")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -89,6 +89,6 @@ mod tests {
|
|||
|
||||
let usdt = tokens.iter().find(|t| t.symbol == "USDT");
|
||||
assert!(usdt.is_some());
|
||||
assert_eq!(usdt.unwrap().decimals, 6);
|
||||
assert_eq!(usdt.expect("mainnet: handle error").decimals, 6);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ mod tests {
|
|||
).await;
|
||||
|
||||
assert!(bridge.is_ok());
|
||||
let bridge = bridge.unwrap();
|
||||
let bridge = bridge.expect("mainnet: handle error");
|
||||
assert_eq!(bridge.chain_id(), 1);
|
||||
assert_eq!(bridge.chain_name(), "Ethereum Mainnet");
|
||||
}
|
||||
|
|
@ -265,7 +265,7 @@ mod tests {
|
|||
fn test_build_lock_eth_tx_data() {
|
||||
let bridge = EthereumBridgePlugin {
|
||||
chain_id: 1,
|
||||
provider: Arc::new(Provider::<Http>::try_from("http://localhost:8545").unwrap()),
|
||||
provider: Arc::new(Provider::<Http>::try_from("http://localhost:8545").expect("mainnet: handle error")),
|
||||
bridge_contract_address: "0x1234...".to_string(),
|
||||
chain_name: "Test".to_string(),
|
||||
_logo_url: "".to_string(),
|
||||
|
|
|
|||
|
|
@ -236,8 +236,8 @@ mod tests {
|
|||
timestamp: 1234567891,
|
||||
};
|
||||
|
||||
listener.add_event(event1).unwrap();
|
||||
listener.add_event(event2).unwrap();
|
||||
listener.add_event(event1).expect("mainnet: handle error");
|
||||
listener.add_event(event2).expect("mainnet: handle error");
|
||||
|
||||
// 测试事件类型过滤
|
||||
let filter = EventFilter::new()
|
||||
|
|
@ -261,7 +261,7 @@ mod tests {
|
|||
data: HashMap::new(),
|
||||
timestamp: 1234567890 + i,
|
||||
};
|
||||
listener.add_event(event).unwrap();
|
||||
listener.add_event(event).expect("mainnet: handle error");
|
||||
}
|
||||
|
||||
assert_eq!(listener.event_count(), 10);
|
||||
|
|
|
|||
|
|
@ -268,7 +268,7 @@ mod tests {
|
|||
};
|
||||
|
||||
assert!(manager.add_lock_signature("lock1", sig1).is_ok());
|
||||
assert_eq!(manager.get_lock("lock1").unwrap().signatures.len(), 1);
|
||||
assert_eq!(manager.get_lock("lock1").expect("mainnet: handle error").signatures.len(), 1);
|
||||
|
||||
let sig2 = Signature {
|
||||
signer: "signer2".to_string(),
|
||||
|
|
@ -277,7 +277,7 @@ mod tests {
|
|||
};
|
||||
|
||||
assert!(manager.add_lock_signature("lock1", sig2).is_ok());
|
||||
assert_eq!(manager.get_lock("lock1").unwrap().status, LockStatus::Confirmed);
|
||||
assert_eq!(manager.get_lock("lock1").expect("mainnet: handle error").status, LockStatus::Confirmed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -296,7 +296,7 @@ mod tests {
|
|||
signatures: vec![],
|
||||
};
|
||||
|
||||
manager.record_lock(lock).unwrap();
|
||||
manager.record_lock(lock).expect("mainnet: handle error");
|
||||
|
||||
let sig = Signature {
|
||||
signer: "unauthorized".to_string(),
|
||||
|
|
|
|||
|
|
@ -277,7 +277,7 @@ mod tests {
|
|||
fn test_audit_log() {
|
||||
let mut manager = SecurityManager::new(SecurityConfig::default());
|
||||
|
||||
manager.pause("admin").unwrap();
|
||||
manager.pause("admin").expect("mainnet: handle error");
|
||||
|
||||
let logs = manager.query_audit_logs(Some("pause"), None);
|
||||
assert_eq!(logs.len(), 1);
|
||||
|
|
|
|||
|
|
@ -171,7 +171,7 @@ mod tests {
|
|||
let proof = verifier.generate_merkle_proof(&tx_hashes, 1);
|
||||
assert!(proof.is_some());
|
||||
|
||||
let proof = proof.unwrap();
|
||||
let proof = proof.expect("mainnet: handle error");
|
||||
|
||||
// 验证证明
|
||||
let is_valid = verifier.verify_merkle_proof(&tx_hashes[1], &proof);
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ pub struct CRCache {
|
|||
impl CRCache {
|
||||
/// Create a new CR cache with specified size
|
||||
pub fn new(size: usize) -> Self {
|
||||
let cache_size = NonZeroUsize::new(size).unwrap_or(NonZeroUsize::new(10000).unwrap());
|
||||
let cache_size = NonZeroUsize::new(size).unwrap_or(NonZeroUsize::new(10000).expect("FIX-006: unexpected None/Err"));
|
||||
|
||||
Self {
|
||||
cache: Arc::new(Mutex::new(LruCache::new(cache_size))),
|
||||
|
|
@ -67,10 +67,10 @@ impl CRCache {
|
|||
|
||||
/// Insert a CR into the cache
|
||||
pub fn insert(&self, receipt_id: Hash, entry: CRCacheEntry) -> Result<(), CRCacheError> {
|
||||
let mut cache = self.cache.lock().unwrap();
|
||||
let mut cache = self.cache.lock().expect("lock not poisoned");
|
||||
|
||||
// Check if expired
|
||||
let current_height = *self.current_height.lock().unwrap();
|
||||
let current_height = *self.current_height.lock().expect("lock not poisoned");
|
||||
if entry.expiry_height <= current_height {
|
||||
return Err(CRCacheError::ReceiptExpired(entry.expiry_height));
|
||||
}
|
||||
|
|
@ -81,8 +81,8 @@ impl CRCache {
|
|||
|
||||
/// Get a CR from the cache
|
||||
pub fn get(&self, receipt_id: &Hash) -> Result<CRCacheEntry, CRCacheError> {
|
||||
let mut cache = self.cache.lock().unwrap();
|
||||
let current_height = *self.current_height.lock().unwrap();
|
||||
let mut cache = self.cache.lock().expect("lock not poisoned");
|
||||
let current_height = *self.current_height.lock().expect("lock not poisoned");
|
||||
|
||||
match cache.get(receipt_id) {
|
||||
Some(entry) => {
|
||||
|
|
@ -107,7 +107,7 @@ impl CRCache {
|
|||
|
||||
/// Update current block height (triggers expiry cleanup)
|
||||
pub fn update_height(&self, new_height: BlockHeight) {
|
||||
let mut current_height = self.current_height.lock().unwrap();
|
||||
let mut current_height = self.current_height.lock().expect("lock not poisoned");
|
||||
*current_height = new_height;
|
||||
|
||||
// Cleanup expired entries
|
||||
|
|
@ -116,8 +116,8 @@ impl CRCache {
|
|||
|
||||
/// Remove expired entries from cache
|
||||
fn cleanup_expired(&self) {
|
||||
let mut cache = self.cache.lock().unwrap();
|
||||
let current_height = *self.current_height.lock().unwrap();
|
||||
let mut cache = self.cache.lock().expect("lock not poisoned");
|
||||
let current_height = *self.current_height.lock().expect("lock not poisoned");
|
||||
|
||||
// Collect expired keys
|
||||
let expired_keys: Vec<Hash> = cache
|
||||
|
|
@ -134,18 +134,18 @@ impl CRCache {
|
|||
|
||||
/// Get cache statistics
|
||||
pub fn stats(&self) -> CRCacheStats {
|
||||
let cache = self.cache.lock().unwrap();
|
||||
let cache = self.cache.lock().expect("lock not poisoned");
|
||||
|
||||
CRCacheStats {
|
||||
size: cache.len(),
|
||||
max_size: self.max_size,
|
||||
current_height: *self.current_height.lock().unwrap(),
|
||||
current_height: *self.current_height.lock().expect("lock not poisoned"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Clear all entries from cache
|
||||
pub fn clear(&self) {
|
||||
let mut cache = self.cache.lock().unwrap();
|
||||
let mut cache = self.cache.lock().expect("lock not poisoned");
|
||||
cache.clear();
|
||||
}
|
||||
}
|
||||
|
|
@ -177,9 +177,9 @@ mod tests {
|
|||
let receipt_id = Hash::zero();
|
||||
let entry = create_test_entry(1000);
|
||||
|
||||
cache.insert(receipt_id, entry.clone()).unwrap();
|
||||
cache.insert(receipt_id, entry.clone()).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let retrieved = cache.get(&receipt_id).unwrap();
|
||||
let retrieved = cache.get(&receipt_id).expect("key exists in map");
|
||||
assert_eq!(retrieved.expiry_height, entry.expiry_height);
|
||||
}
|
||||
|
||||
|
|
@ -189,7 +189,7 @@ mod tests {
|
|||
let receipt_id = Hash::zero();
|
||||
let entry = create_test_entry(100);
|
||||
|
||||
cache.insert(receipt_id, entry).unwrap();
|
||||
cache.insert(receipt_id, entry).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
// Update height to trigger expiry
|
||||
cache.update_height(101);
|
||||
|
|
@ -206,9 +206,9 @@ mod tests {
|
|||
let id2 = Hash::from_low_u64_be(2);
|
||||
let id3 = Hash::from_low_u64_be(3);
|
||||
|
||||
cache.insert(id1, create_test_entry(1000)).unwrap();
|
||||
cache.insert(id2, create_test_entry(1000)).unwrap();
|
||||
cache.insert(id3, create_test_entry(1000)).unwrap();
|
||||
cache.insert(id1, create_test_entry(1000)).expect("FIX-006: unexpected None/Err");
|
||||
cache.insert(id2, create_test_entry(1000)).expect("FIX-006: unexpected None/Err");
|
||||
cache.insert(id3, create_test_entry(1000)).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
// id1 should be evicted (LRU)
|
||||
assert!(cache.get(&id1).is_err());
|
||||
|
|
|
|||
|
|
@ -155,14 +155,14 @@ impl ParamsManager {
|
|||
|
||||
/// Get current parameters (read-only)
|
||||
pub fn get(&self) -> CBPPParams {
|
||||
self.params.read().unwrap().clone()
|
||||
self.params.read().expect("rwlock not poisoned").clone()
|
||||
}
|
||||
|
||||
/// Update parameters
|
||||
pub fn update(&self, new_params: CBPPParams) -> Result<(), ParamsError> {
|
||||
new_params.validate()?;
|
||||
|
||||
let mut params = self.params.write().unwrap();
|
||||
let mut params = self.params.write().expect("rwlock not poisoned");
|
||||
*params = new_params;
|
||||
|
||||
Ok(())
|
||||
|
|
@ -170,32 +170,32 @@ impl ParamsManager {
|
|||
|
||||
/// Update gas limit based on epoch statistics
|
||||
pub fn update_gas_limit(&self, avg_block_size: u64) {
|
||||
let mut params = self.params.write().unwrap();
|
||||
let mut params = self.params.write().expect("rwlock not poisoned");
|
||||
params.adjust_gas_limit(avg_block_size);
|
||||
}
|
||||
|
||||
/// Start new epoch
|
||||
pub fn start_new_epoch(&self, new_epoch: u64, constitutional_hash: Hash) {
|
||||
let mut params = self.params.write().unwrap();
|
||||
let mut params = self.params.write().expect("rwlock not poisoned");
|
||||
params.epoch_number = new_epoch;
|
||||
params.constitutional_hash = constitutional_hash;
|
||||
}
|
||||
|
||||
/// Get specific parameter
|
||||
pub fn get_gas_limit(&self) -> u64 {
|
||||
self.params.read().unwrap().gas_limit
|
||||
self.params.read().expect("rwlock not poisoned").gas_limit
|
||||
}
|
||||
|
||||
pub fn get_delta_t_min(&self) -> u64 {
|
||||
self.params.read().unwrap().delta_t_min
|
||||
self.params.read().expect("rwlock not poisoned").delta_t_min
|
||||
}
|
||||
|
||||
pub fn get_delta_t_max(&self) -> u64 {
|
||||
self.params.read().unwrap().delta_t_max
|
||||
self.params.read().expect("rwlock not poisoned").delta_t_max
|
||||
}
|
||||
|
||||
pub fn get_constitutional_hash(&self) -> Hash {
|
||||
self.params.read().unwrap().constitutional_hash
|
||||
self.params.read().expect("rwlock not poisoned").constitutional_hash
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -266,7 +266,7 @@ mod tests {
|
|||
// Test update
|
||||
let mut new_params = manager.get();
|
||||
new_params.delta_t_min = 200;
|
||||
manager.update(new_params).unwrap();
|
||||
manager.update(new_params).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(manager.get_delta_t_min(), 200);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ impl PropagationManager {
|
|||
conn.rtt_ms = rtt_ms;
|
||||
conn.last_seen = std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("FIX-006: unexpected None/Err")
|
||||
.as_secs();
|
||||
Ok(())
|
||||
} else {
|
||||
|
|
@ -231,7 +231,7 @@ impl PropagationManager {
|
|||
let mut connections = self.connections.write().await;
|
||||
let now = std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("FIX-006: unexpected None/Err")
|
||||
.as_secs();
|
||||
|
||||
connections.retain(|_, conn| {
|
||||
|
|
@ -285,7 +285,7 @@ mod tests {
|
|||
rtt_ms: rtt,
|
||||
last_seen: std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("FIX-006: unexpected None/Err")
|
||||
.as_secs(),
|
||||
is_direct: true,
|
||||
}
|
||||
|
|
@ -296,12 +296,12 @@ mod tests {
|
|||
let manager = PropagationManager::with_default_config();
|
||||
let conn = create_test_connection(1, 90, 100);
|
||||
|
||||
manager.add_connection(conn.clone()).await.unwrap();
|
||||
manager.add_connection(conn.clone()).await.expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let connections = manager.get_connections().await;
|
||||
assert_eq!(connections.len(), 1);
|
||||
|
||||
manager.remove_connection(&conn.peer_address).await.unwrap();
|
||||
manager.remove_connection(&conn.peer_address).await.expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let connections = manager.get_connections().await;
|
||||
assert_eq!(connections.len(), 0);
|
||||
|
|
@ -312,9 +312,9 @@ mod tests {
|
|||
let manager = PropagationManager::with_default_config();
|
||||
|
||||
// Add peers with different quality scores
|
||||
manager.add_connection(create_test_connection(1, 90, 100)).await.unwrap();
|
||||
manager.add_connection(create_test_connection(2, 80, 150)).await.unwrap();
|
||||
manager.add_connection(create_test_connection(3, 95, 120)).await.unwrap();
|
||||
manager.add_connection(create_test_connection(1, 90, 100)).await.expect("FIX-006: unexpected None/Err");
|
||||
manager.add_connection(create_test_connection(2, 80, 150)).await.expect("FIX-006: unexpected None/Err");
|
||||
manager.add_connection(create_test_connection(3, 95, 120)).await.expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let best = manager.get_best_peers(2).await;
|
||||
|
||||
|
|
@ -328,8 +328,8 @@ mod tests {
|
|||
let manager = PropagationManager::with_default_config();
|
||||
|
||||
// Add some connections
|
||||
manager.add_connection(create_test_connection(1, 90, 100)).await.unwrap();
|
||||
manager.add_connection(create_test_connection(2, 85, 120)).await.unwrap();
|
||||
manager.add_connection(create_test_connection(1, 90, 100)).await.expect("FIX-006: unexpected None/Err");
|
||||
manager.add_connection(create_test_connection(2, 85, 120)).await.expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let announce = BlockAnnounce {
|
||||
block_hash: Hash::zero(),
|
||||
|
|
@ -351,7 +351,7 @@ mod tests {
|
|||
|
||||
// Add minimum required connections (12)
|
||||
for i in 0..12 {
|
||||
manager.add_connection(create_test_connection(i, 80, 100)).await.unwrap();
|
||||
manager.add_connection(create_test_connection(i, 80, 100)).await.expect("FIX-006: unexpected None/Err");
|
||||
}
|
||||
|
||||
assert!(manager.has_sufficient_connections().await);
|
||||
|
|
|
|||
|
|
@ -341,7 +341,7 @@ mod tests {
|
|||
);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let request = manager.get_exit_request(&node.address).unwrap();
|
||||
let request = manager.get_exit_request(&node.address).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(request.status, ExitStatus::Pending);
|
||||
assert_eq!(request.reason, ExitReason::Voluntary);
|
||||
}
|
||||
|
|
@ -351,7 +351,7 @@ mod tests {
|
|||
let mut manager = ExitManager::new();
|
||||
let node = create_test_node();
|
||||
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 3000).unwrap();
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 3000).expect("FIX-006: unexpected None/Err");
|
||||
let result = manager.submit_exit_request(&node, ExitReason::Voluntary, 3000);
|
||||
assert!(result.is_err());
|
||||
}
|
||||
|
|
@ -362,7 +362,7 @@ mod tests {
|
|||
let node = create_test_node();
|
||||
let reviewer = Address::new([2u8; 32]);
|
||||
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).unwrap();
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
// 审核(等待期满足)
|
||||
let result = manager.review_exit_request(
|
||||
|
|
@ -374,7 +374,7 @@ mod tests {
|
|||
);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let request = manager.get_exit_request(&node.address).unwrap();
|
||||
let request = manager.get_exit_request(&node.address).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(request.status, ExitStatus::Approved);
|
||||
}
|
||||
|
||||
|
|
@ -384,7 +384,7 @@ mod tests {
|
|||
let node = create_test_node();
|
||||
let reviewer = Address::new([2u8; 32]);
|
||||
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).unwrap();
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
// 审核(等待期不满足)
|
||||
let result = manager.review_exit_request(
|
||||
|
|
@ -403,14 +403,14 @@ mod tests {
|
|||
let node = create_test_node();
|
||||
let reviewer = Address::new([2u8; 32]);
|
||||
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).unwrap();
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).expect("FIX-006: unexpected None/Err");
|
||||
manager.review_exit_request(
|
||||
&node.address,
|
||||
true,
|
||||
reviewer,
|
||||
None,
|
||||
1000 + 7 * 24 * 3600,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
// 确认退出
|
||||
let result = manager.confirm_exit(
|
||||
|
|
@ -432,12 +432,12 @@ mod tests {
|
|||
let mut manager = ExitManager::new();
|
||||
let node = create_test_node();
|
||||
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).unwrap();
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = manager.cancel_exit_request(&node.address);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let request = manager.get_exit_request(&node.address).unwrap();
|
||||
let request = manager.get_exit_request(&node.address).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(request.status, ExitStatus::Cancelled);
|
||||
}
|
||||
|
||||
|
|
@ -448,8 +448,8 @@ mod tests {
|
|||
let mut node2 = create_test_node();
|
||||
node2.address = Address::new([2u8; 32]);
|
||||
|
||||
manager.submit_exit_request(&node1, ExitReason::Voluntary, 1000).unwrap();
|
||||
manager.submit_exit_request(&node2, ExitReason::HardwareFailure, 1000).unwrap();
|
||||
manager.submit_exit_request(&node1, ExitReason::Voluntary, 1000).expect("FIX-006: unexpected None/Err");
|
||||
manager.submit_exit_request(&node2, ExitReason::HardwareFailure, 1000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let pending = manager.get_pending_requests();
|
||||
assert_eq!(pending.len(), 2);
|
||||
|
|
@ -461,9 +461,9 @@ mod tests {
|
|||
let node = create_test_node();
|
||||
let reviewer = Address::new([2u8; 32]);
|
||||
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).unwrap();
|
||||
manager.review_exit_request(&node.address, true, reviewer, None, 1000 + 7 * 24 * 3600).unwrap();
|
||||
manager.confirm_exit(&node.address, &node, 95_000_000_000, 5_000_000_000, 1000 + 21 * 24 * 3600).unwrap();
|
||||
manager.submit_exit_request(&node, ExitReason::Voluntary, 1000).expect("FIX-006: unexpected None/Err");
|
||||
manager.review_exit_request(&node.address, true, reviewer, None, 1000 + 7 * 24 * 3600).expect("FIX-006: unexpected None/Err");
|
||||
manager.confirm_exit(&node.address, &node, 95_000_000_000, 5_000_000_000, 1000 + 21 * 24 * 3600).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let stats = manager.get_exit_statistics();
|
||||
assert_eq!(stats.total_exits, 1);
|
||||
|
|
|
|||
|
|
@ -335,12 +335,12 @@ mod tests {
|
|||
8000,
|
||||
80,
|
||||
1000,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = registry.activate_cbp(&address);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let node = registry.get_cbp(&address).unwrap();
|
||||
let node = registry.get_cbp(&address).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(node.status, CbpStatus::Active);
|
||||
}
|
||||
|
||||
|
|
@ -357,13 +357,13 @@ mod tests {
|
|||
8000,
|
||||
80,
|
||||
1000,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
registry.activate_cbp(&address).unwrap();
|
||||
registry.activate_cbp(&address).expect("FIX-006: unexpected None/Err");
|
||||
let result = registry.suspend_cbp(&address);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let node = registry.get_cbp(&address).unwrap();
|
||||
let node = registry.get_cbp(&address).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(node.status, CbpStatus::Suspended);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -631,7 +631,7 @@ mod tests {
|
|||
1000,
|
||||
);
|
||||
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).unwrap();
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = manager.submit_appeal(
|
||||
penalty_id,
|
||||
|
|
@ -657,7 +657,7 @@ mod tests {
|
|||
1000,
|
||||
);
|
||||
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).unwrap();
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
// 超过申诉期限
|
||||
let result = manager.submit_appeal(
|
||||
|
|
@ -685,14 +685,14 @@ mod tests {
|
|||
1000,
|
||||
);
|
||||
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).unwrap();
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).expect("FIX-006: unexpected None/Err");
|
||||
let appeal_id = manager.submit_appeal(
|
||||
penalty_id,
|
||||
node.address,
|
||||
"False positive".to_string(),
|
||||
"Counter evidence".to_string(),
|
||||
1000 + 3600,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = manager.review_appeal(
|
||||
appeal_id,
|
||||
|
|
@ -722,7 +722,7 @@ mod tests {
|
|||
1000,
|
||||
);
|
||||
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).unwrap();
|
||||
let penalty_id = manager.execute_penalty(&mut node, detection, 1000).expect("FIX-006: unexpected None/Err");
|
||||
let stake_after_penalty = node.stake_amount;
|
||||
|
||||
let result = manager.revoke_penalty(penalty_id, &mut node);
|
||||
|
|
@ -742,7 +742,7 @@ mod tests {
|
|||
3,
|
||||
1000,
|
||||
);
|
||||
manager.execute_penalty(&mut node, detection1, 1000).unwrap();
|
||||
manager.execute_penalty(&mut node, detection1, 1000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let detection2 = manager.detect_violation(
|
||||
&node,
|
||||
|
|
@ -751,7 +751,7 @@ mod tests {
|
|||
5,
|
||||
2000,
|
||||
);
|
||||
manager.execute_penalty(&mut node, detection2, 2000).unwrap();
|
||||
manager.execute_penalty(&mut node, detection2, 2000).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let stats = manager.get_penalty_statistics();
|
||||
assert_eq!(stats.total_penalties, 2);
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ impl RedemptionManager {
|
|||
);
|
||||
|
||||
// 更新请求
|
||||
let request = self.requests.get_mut(address).unwrap();
|
||||
let request = self.requests.get_mut(address).expect("FIX-006: unexpected None/Err");
|
||||
request.actual_amount = Some(actual_amount);
|
||||
request.penalty_amount = Some(penalty);
|
||||
request.status = RedemptionStatus::Completed;
|
||||
|
|
@ -418,7 +418,7 @@ mod tests {
|
|||
);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let request = manager.get_redemption_request(&node.address).unwrap();
|
||||
let request = manager.get_redemption_request(&node.address).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(request.status, RedemptionStatus::Pending);
|
||||
}
|
||||
|
||||
|
|
@ -465,12 +465,12 @@ mod tests {
|
|||
RedemptionType::Full,
|
||||
node.stake_amount,
|
||||
timestamp,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = manager.process_redemption(&node.address, &node, timestamp + 100);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let (actual, penalty) = result.unwrap();
|
||||
let (actual, penalty) = result.expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(actual + penalty, node.stake_amount);
|
||||
}
|
||||
|
||||
|
|
@ -485,12 +485,12 @@ mod tests {
|
|||
RedemptionType::Emergency,
|
||||
node.stake_amount,
|
||||
timestamp,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = manager.process_redemption(&node.address, &node, timestamp + 100);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let (actual, penalty) = result.unwrap();
|
||||
let (actual, penalty) = result.expect("FIX-006: unexpected None/Err");
|
||||
// 紧急赎回有20%处罚
|
||||
assert_eq!(penalty, node.stake_amount * 20 / 100);
|
||||
assert_eq!(actual, node.stake_amount - penalty);
|
||||
|
|
@ -508,12 +508,12 @@ mod tests {
|
|||
RedemptionType::Full,
|
||||
node.stake_amount,
|
||||
timestamp,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = manager.process_redemption(&node.address, &node, timestamp + 100);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let (actual, penalty) = result.unwrap();
|
||||
let (actual, penalty) = result.expect("FIX-006: unexpected None/Err");
|
||||
// 低声誉有10%处罚
|
||||
assert_eq!(penalty, node.stake_amount * 10 / 100);
|
||||
}
|
||||
|
|
@ -529,12 +529,12 @@ mod tests {
|
|||
RedemptionType::Full,
|
||||
node.stake_amount,
|
||||
timestamp,
|
||||
).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let result = manager.cancel_redemption_request(&node.address);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let request = manager.get_redemption_request(&node.address).unwrap();
|
||||
let request = manager.get_redemption_request(&node.address).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(request.status, RedemptionStatus::Cancelled);
|
||||
}
|
||||
|
||||
|
|
@ -549,8 +549,8 @@ mod tests {
|
|||
RedemptionType::Full,
|
||||
node.stake_amount,
|
||||
timestamp,
|
||||
).unwrap();
|
||||
manager.process_redemption(&node.address, &node, timestamp + 100).unwrap();
|
||||
).expect("FIX-006: unexpected None/Err");
|
||||
manager.process_redemption(&node.address, &node, timestamp + 100).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let stats = manager.get_redemption_statistics();
|
||||
assert_eq!(stats.total_redemptions, 1);
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ impl ReputationManager {
|
|||
.collect();
|
||||
|
||||
// 按声誉降序排序
|
||||
ranking.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
|
||||
ranking.sort_by(|a, b| b.1.partial_cmp(&a.1).expect("FIX-006: unexpected None/Err"));
|
||||
|
||||
ranking
|
||||
}
|
||||
|
|
@ -418,12 +418,12 @@ mod tests {
|
|||
node.reputation = 0.99;
|
||||
|
||||
// 测试最大值
|
||||
manager.record_event(&mut node, ReputationEvent::LongUptime, 3000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::LongUptime, 3000, None).expect("FIX-006: unexpected None/Err");
|
||||
assert!(node.reputation <= 1.0);
|
||||
|
||||
// 测试最小值
|
||||
node.reputation = 0.01;
|
||||
manager.record_event(&mut node, ReputationEvent::DoubleSign, 3000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::DoubleSign, 3000, None).expect("FIX-006: unexpected None/Err");
|
||||
assert!(node.reputation >= 0.0);
|
||||
}
|
||||
|
||||
|
|
@ -481,7 +481,7 @@ mod tests {
|
|||
|
||||
let result = manager.batch_update_for_blocks(&mut nodes, 3000);
|
||||
assert!(result.is_ok());
|
||||
assert_eq!(result.unwrap(), 2);
|
||||
assert_eq!(result.expect("mainnet: handle error"), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -489,9 +489,9 @@ mod tests {
|
|||
let mut manager = ReputationManager::new();
|
||||
let mut node = create_test_node();
|
||||
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 1000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 2000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::BlockMissed, 3000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 1000, None).expect("FIX-006: unexpected None/Err");
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 2000, None).expect("FIX-006: unexpected None/Err");
|
||||
manager.record_event(&mut node, ReputationEvent::BlockMissed, 3000, None).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let history = manager.get_reputation_history(&node.address, None);
|
||||
assert_eq!(history.len(), 3);
|
||||
|
|
@ -506,9 +506,9 @@ mod tests {
|
|||
let mut manager = ReputationManager::new();
|
||||
let mut node = create_test_node();
|
||||
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 1000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 2000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::BlockMissed, 3000, None).unwrap();
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 1000, None).expect("FIX-006: unexpected None/Err");
|
||||
manager.record_event(&mut node, ReputationEvent::BlockProduced, 2000, None).expect("FIX-006: unexpected None/Err");
|
||||
manager.record_event(&mut node, ReputationEvent::BlockMissed, 3000, None).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let stats = manager.get_reputation_statistics(&node.address);
|
||||
assert_eq!(stats.total_changes, 3);
|
||||
|
|
|
|||
|
|
@ -17,8 +17,8 @@ fn register_test_cbp(registry: &mut CbpRegistry, id: u8) -> Address {
|
|||
8000,
|
||||
80,
|
||||
1000,
|
||||
).unwrap();
|
||||
registry.activate_cbp(&address).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
registry.activate_cbp(&address).expect("mainnet: handle error");
|
||||
address
|
||||
}
|
||||
|
||||
|
|
@ -28,25 +28,25 @@ fn test_full_lifecycle() {
|
|||
let address = register_test_cbp(&mut registry, 1);
|
||||
|
||||
// 1. 注册和激活
|
||||
assert_eq!(registry.get_cbp(&address).unwrap().status, CbpStatus::Active);
|
||||
assert_eq!(registry.get_cbp(&address).expect("mainnet: handle error").status, CbpStatus::Active);
|
||||
|
||||
// 2. 记录声誉事件
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.reputation_manager_mut().record_event(
|
||||
&mut node,
|
||||
ReputationEvent::BlockProduced,
|
||||
2000,
|
||||
None,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
// 提交退出请求
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.exit_manager_mut().submit_exit_request(
|
||||
&node,
|
||||
ExitReason::Voluntary,
|
||||
3000,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 4. 审核退出
|
||||
registry.exit_manager_mut().review_exit_request(
|
||||
|
|
@ -55,23 +55,23 @@ fn test_full_lifecycle() {
|
|||
Address::new([99u8; 32]),
|
||||
Some("Approved".to_string()),
|
||||
3000 + 8 * 24 * 3600,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 5. 确认退出
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.exit_manager_mut().confirm_exit(
|
||||
&address,
|
||||
&node,
|
||||
100_000_000_000,
|
||||
0,
|
||||
3000 + 22 * 24 * 3600,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 更新节点状态
|
||||
node.status = CbpStatus::Exited;
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
assert_eq!(registry.get_cbp(&address).unwrap().status, CbpStatus::Exited);
|
||||
assert_eq!(registry.get_cbp(&address).expect("mainnet: handle error").status, CbpStatus::Exited);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -83,28 +83,28 @@ fn test_redemption_workflow() {
|
|||
let timestamp = 1000 + 31 * 24 * 3600;
|
||||
|
||||
// 提交赎回请求
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.redemption_manager_mut().submit_redemption_request(
|
||||
&node,
|
||||
RedemptionType::Partial,
|
||||
50_000_000_000,
|
||||
timestamp,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 处理赎回
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let (actual, _penalty) = registry.redemption_manager_mut().process_redemption(
|
||||
&address,
|
||||
&node,
|
||||
timestamp + 100,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 更新质押金额
|
||||
node.stake_amount -= actual;
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
// 验证质押减少
|
||||
assert!(registry.get_cbp(&address).unwrap().stake_amount < 100_000_000_000);
|
||||
assert!(registry.get_cbp(&address).expect("mainnet: handle error").stake_amount < 100_000_000_000);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -113,7 +113,7 @@ fn test_penalty_and_appeal() {
|
|||
let address = register_test_cbp(&mut registry, 3);
|
||||
|
||||
// 检测违规
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let detection = registry.penalty_manager().detect_violation(
|
||||
&node,
|
||||
ViolationType::ConsecutiveMissedBlocks,
|
||||
|
|
@ -123,13 +123,13 @@ fn test_penalty_and_appeal() {
|
|||
);
|
||||
|
||||
// 执行处罚
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let penalty_id = registry.penalty_manager_mut().execute_penalty(
|
||||
&mut node,
|
||||
detection,
|
||||
2000,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
// 提交申诉
|
||||
let appeal_id = registry.penalty_manager_mut().submit_appeal(
|
||||
|
|
@ -138,7 +138,7 @@ fn test_penalty_and_appeal() {
|
|||
"False positive".to_string(),
|
||||
"Counter evidence".to_string(),
|
||||
2000 + 3600,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 审核申诉
|
||||
registry.penalty_manager_mut().review_appeal(
|
||||
|
|
@ -147,15 +147,15 @@ fn test_penalty_and_appeal() {
|
|||
Address::new([99u8; 32]),
|
||||
Some("Approved".to_string()),
|
||||
2000 + 7200,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 撤销处罚
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.penalty_manager_mut().revoke_penalty(
|
||||
penalty_id,
|
||||
&mut node,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -163,17 +163,17 @@ fn test_reputation_decay() {
|
|||
let mut registry = create_test_registry();
|
||||
let address = register_test_cbp(&mut registry, 4);
|
||||
|
||||
let initial_reputation = registry.get_cbp(&address).unwrap().reputation;
|
||||
let initial_reputation = registry.get_cbp(&address).expect("mainnet: handle error").reputation;
|
||||
|
||||
// 应用衰减(1天后)
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.reputation_manager_mut().apply_decay(
|
||||
&mut node,
|
||||
1000 + 24 * 3600,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
assert!(registry.get_cbp(&address).unwrap().reputation < initial_reputation);
|
||||
assert!(registry.get_cbp(&address).expect("mainnet: handle error").reputation < initial_reputation);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -184,24 +184,24 @@ fn test_emergency_redemption_penalty() {
|
|||
let timestamp = 1000 + 31 * 24 * 3600;
|
||||
|
||||
// 紧急赎回
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.redemption_manager_mut().submit_redemption_request(
|
||||
&node,
|
||||
RedemptionType::Emergency,
|
||||
100_000_000_000,
|
||||
timestamp,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let (actual, penalty) = registry.redemption_manager_mut().process_redemption(
|
||||
&address,
|
||||
&node,
|
||||
timestamp + 100,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 更新质押金额
|
||||
node.stake_amount -= actual;
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
// 紧急赎回有20%处罚
|
||||
assert_eq!(penalty, 100_000_000_000 * 20 / 100);
|
||||
|
|
@ -214,7 +214,7 @@ fn test_multiple_violations() {
|
|||
let address = register_test_cbp(&mut registry, 6);
|
||||
|
||||
// 第一次违规
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let detection1 = registry.penalty_manager().detect_violation(
|
||||
&node,
|
||||
ViolationType::HardwareFailure,
|
||||
|
|
@ -223,16 +223,16 @@ fn test_multiple_violations() {
|
|||
2000,
|
||||
);
|
||||
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.penalty_manager_mut().execute_penalty(
|
||||
&mut node,
|
||||
detection1,
|
||||
2000,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
// 第二次违规
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let detection2 = registry.penalty_manager().detect_violation(
|
||||
&node,
|
||||
ViolationType::ConsecutiveMissedBlocks,
|
||||
|
|
@ -241,13 +241,13 @@ fn test_multiple_violations() {
|
|||
3000,
|
||||
);
|
||||
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.penalty_manager_mut().execute_penalty(
|
||||
&mut node,
|
||||
detection2,
|
||||
3000,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
let records = registry.penalty_manager().get_penalty_records(Some(&address));
|
||||
assert_eq!(records.len(), 2);
|
||||
|
|
@ -259,17 +259,17 @@ fn test_exit_cancellation() {
|
|||
let address = register_test_cbp(&mut registry, 7);
|
||||
|
||||
// 提交退出请求
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.exit_manager_mut().submit_exit_request(
|
||||
&node,
|
||||
ExitReason::Voluntary,
|
||||
2000,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
// 取消退出
|
||||
registry.exit_manager_mut().cancel_exit_request(&address).unwrap();
|
||||
registry.exit_manager_mut().cancel_exit_request(&address).expect("mainnet: handle error");
|
||||
|
||||
let request = registry.exit_manager().get_exit_request(&address).unwrap();
|
||||
let request = registry.exit_manager().get_exit_request(&address).expect("mainnet: handle error");
|
||||
assert_eq!(request.status, ExitStatus::Cancelled);
|
||||
}
|
||||
|
||||
|
|
@ -279,28 +279,28 @@ fn test_reputation_recovery() {
|
|||
let address = register_test_cbp(&mut registry, 8);
|
||||
|
||||
// 降低声誉
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.reputation_manager_mut().record_event(
|
||||
&mut node,
|
||||
ReputationEvent::BlockMissed,
|
||||
2000,
|
||||
None,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
let low_reputation = registry.get_cbp(&address).unwrap().reputation;
|
||||
let low_reputation = registry.get_cbp(&address).expect("mainnet: handle error").reputation;
|
||||
|
||||
// 恢复声誉
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.reputation_manager_mut().recover_reputation(
|
||||
&mut node,
|
||||
0.1,
|
||||
3000,
|
||||
"Community contribution".to_string(),
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
assert!(registry.get_cbp(&address).unwrap().reputation > low_reputation);
|
||||
assert!(registry.get_cbp(&address).expect("mainnet: handle error").reputation > low_reputation);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -308,10 +308,10 @@ fn test_slashing_penalty() {
|
|||
let mut registry = create_test_registry();
|
||||
let address = register_test_cbp(&mut registry, 9);
|
||||
|
||||
let original_stake = registry.get_cbp(&address).unwrap().stake_amount;
|
||||
let original_stake = registry.get_cbp(&address).expect("mainnet: handle error").stake_amount;
|
||||
|
||||
// 双签违规
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let detection = registry.penalty_manager().detect_violation(
|
||||
&node,
|
||||
ViolationType::DoubleSign,
|
||||
|
|
@ -320,15 +320,15 @@ fn test_slashing_penalty() {
|
|||
2000,
|
||||
);
|
||||
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.penalty_manager_mut().execute_penalty(
|
||||
&mut node,
|
||||
detection,
|
||||
2000,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
assert!(registry.get_cbp(&address).unwrap().stake_amount < original_stake);
|
||||
assert!(registry.get_cbp(&address).expect("mainnet: handle error").stake_amount < original_stake);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -338,15 +338,15 @@ fn test_batch_reputation_update() {
|
|||
let addr2 = register_test_cbp(&mut registry, 11);
|
||||
|
||||
// 设置出块数
|
||||
registry.get_cbp_mut(&addr1).unwrap().blocks_produced = 10;
|
||||
registry.get_cbp_mut(&addr2).unwrap().blocks_produced = 5;
|
||||
registry.get_cbp_mut(&addr1).expect("mainnet: handle error").blocks_produced = 10;
|
||||
registry.get_cbp_mut(&addr2).expect("mainnet: handle error").blocks_produced = 5;
|
||||
|
||||
// 批量更新
|
||||
let mut nodes: Vec<CbpNode> = registry.get_all_nodes().into_iter().cloned().collect();
|
||||
let updated = registry.reputation_manager_mut().batch_update_for_blocks(
|
||||
&mut nodes,
|
||||
3000,
|
||||
).unwrap();
|
||||
).expect("mainnet: handle error");
|
||||
|
||||
assert!(updated >= 2);
|
||||
}
|
||||
|
|
@ -357,16 +357,16 @@ fn test_statistics() {
|
|||
let address = register_test_cbp(&mut registry, 12);
|
||||
|
||||
// 生成一些活动
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.reputation_manager_mut().record_event(
|
||||
&mut node,
|
||||
ReputationEvent::BlockProduced,
|
||||
2000,
|
||||
None,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
let node = registry.get_cbp(&address).unwrap().clone();
|
||||
let node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
let detection = registry.penalty_manager().detect_violation(
|
||||
&node,
|
||||
ViolationType::HardwareFailure,
|
||||
|
|
@ -375,13 +375,13 @@ fn test_statistics() {
|
|||
3000,
|
||||
);
|
||||
|
||||
let mut node = registry.get_cbp(&address).unwrap().clone();
|
||||
let mut node = registry.get_cbp(&address).expect("mainnet: handle error").clone();
|
||||
registry.penalty_manager_mut().execute_penalty(
|
||||
&mut node,
|
||||
detection,
|
||||
3000,
|
||||
).unwrap();
|
||||
*registry.get_cbp_mut(&address).unwrap() = node;
|
||||
).expect("mainnet: handle error");
|
||||
*registry.get_cbp_mut(&address).expect("mainnet: handle error") = node;
|
||||
|
||||
// 获取统计
|
||||
let rep_stats = registry.reputation_manager().get_reputation_statistics(&address);
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ impl ForkInfo {
|
|||
chains: Vec::new(),
|
||||
detected_at: std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("FIX-006: unexpected None/Err")
|
||||
.as_secs(),
|
||||
resolved: false,
|
||||
}
|
||||
|
|
@ -544,10 +544,10 @@ mod tests {
|
|||
let block2 = Block::new(1, "genesis".to_string(), "validator2".to_string());
|
||||
|
||||
// 第一个区块不应该触发分叉
|
||||
assert!(detector.add_block(block1).unwrap().is_none());
|
||||
assert!(detector.add_block(block1).expect("mainnet: handle error").is_none());
|
||||
|
||||
// 第二个相同高度的区块应该触发分叉
|
||||
let fork = detector.add_block(block2).unwrap();
|
||||
let fork = detector.add_block(block2).expect("FIX-006: unexpected None/Err");
|
||||
assert!(fork.is_some());
|
||||
}
|
||||
|
||||
|
|
@ -567,7 +567,7 @@ mod tests {
|
|||
fork_info.add_chain(chain1);
|
||||
fork_info.add_chain(chain2);
|
||||
|
||||
let best = selector.select_best_chain(&fork_info).unwrap();
|
||||
let best = selector.select_best_chain(&fork_info).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(best.id, "chain2");
|
||||
}
|
||||
|
||||
|
|
@ -581,7 +581,7 @@ mod tests {
|
|||
|
||||
fork_info.add_chain(chain.clone());
|
||||
|
||||
let plan = recovery.recover_from_fork(&fork_info, &chain).unwrap();
|
||||
let plan = recovery.recover_from_fork(&fork_info, &chain).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(plan.action, RecoveryAction::Rollback);
|
||||
assert_eq!(plan.target_height, 10);
|
||||
}
|
||||
|
|
@ -603,8 +603,8 @@ mod tests {
|
|||
let block1 = Block::new(1, "genesis".to_string(), "v1".to_string());
|
||||
let block2 = Block::new(1, "genesis".to_string(), "v2".to_string());
|
||||
|
||||
detector.add_block(block1).unwrap();
|
||||
detector.add_block(block2).unwrap();
|
||||
detector.add_block(block1).expect("FIX-006: unexpected None/Err");
|
||||
detector.add_block(block2).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let stats = detector.stats();
|
||||
assert_eq!(stats.total_forks, 1);
|
||||
|
|
|
|||
|
|
@ -560,13 +560,13 @@ mod tests {
|
|||
let mut manager = KeyManager::new();
|
||||
|
||||
// 生成密钥对
|
||||
let (private_key, public_key) = manager.generate_key_pair("test".to_string()).unwrap();
|
||||
let (private_key, public_key) = manager.generate_key_pair("test".to_string()).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(manager.key_count(), 1);
|
||||
|
||||
// 获取密钥
|
||||
let retrieved_private = manager.get_private_key("test").unwrap();
|
||||
let retrieved_public = manager.get_public_key("test").unwrap();
|
||||
let retrieved_private = manager.get_private_key("test").expect("FIX-006: unexpected None/Err");
|
||||
let retrieved_public = manager.get_public_key("test").expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(retrieved_private.id(), private_key.id());
|
||||
assert_eq!(retrieved_public.id(), public_key.id());
|
||||
|
|
@ -575,10 +575,10 @@ mod tests {
|
|||
#[test]
|
||||
fn test_key_manager_sign_verify() {
|
||||
let mut manager = KeyManager::new();
|
||||
manager.generate_key_pair("test".to_string()).unwrap();
|
||||
manager.generate_key_pair("test".to_string()).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
let message = b"Test message";
|
||||
let signature = manager.sign("test", message).unwrap();
|
||||
let signature = manager.sign("test", message).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert!(manager.verify("test", message, &signature).is_ok());
|
||||
}
|
||||
|
|
@ -607,7 +607,7 @@ mod tests {
|
|||
let signatures = vec![key1.sign(&messages[0]), key2.sign(&messages[1])];
|
||||
let public_keys = vec![key1.public_key(), key2.public_key()];
|
||||
|
||||
let results = verifier.batch_verify(&messages, &signatures, &public_keys).unwrap();
|
||||
let results = verifier.batch_verify(&messages, &signatures, &public_keys).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
assert_eq!(results.len(), 2);
|
||||
assert!(results[0]);
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ impl TimeoutEvent {
|
|||
) -> Self {
|
||||
let triggered_at = SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("FIX-006: unexpected None/Err")
|
||||
.as_secs();
|
||||
|
||||
TimeoutEvent {
|
||||
|
|
@ -190,7 +190,7 @@ impl TimeoutManager {
|
|||
|
||||
/// 使用默认配置创建
|
||||
pub fn with_default_config() -> Self {
|
||||
Self::new(TimeoutConfig::default_config()).unwrap()
|
||||
Self::new(TimeoutConfig::default_config()).expect("FIX-006: unexpected None/Err")
|
||||
}
|
||||
|
||||
/// 启动超时计时器
|
||||
|
|
@ -521,7 +521,7 @@ mod tests {
|
|||
let mut config = TimeoutConfig::default_config();
|
||||
config.proposal_timeout = 1; // 1秒超时
|
||||
|
||||
let mut manager = TimeoutManager::new(config).unwrap();
|
||||
let mut manager = TimeoutManager::new(config).expect("FIX-006: unexpected None/Err");
|
||||
|
||||
manager.start_timeout(
|
||||
"test".to_string(),
|
||||
|
|
@ -563,19 +563,19 @@ mod tests {
|
|||
);
|
||||
|
||||
// 第一次重试
|
||||
let action1 = recovery.handle_timeout(&event).unwrap();
|
||||
let action1 = recovery.handle_timeout(&event).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(action1, RecoveryAction::Retry(1));
|
||||
|
||||
// 第二次重试
|
||||
let action2 = recovery.handle_timeout(&event).unwrap();
|
||||
let action2 = recovery.handle_timeout(&event).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(action2, RecoveryAction::Retry(2));
|
||||
|
||||
// 第三次重试
|
||||
let action3 = recovery.handle_timeout(&event).unwrap();
|
||||
let action3 = recovery.handle_timeout(&event).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(action3, RecoveryAction::Retry(3));
|
||||
|
||||
// 超过最大重试次数
|
||||
let action4 = recovery.handle_timeout(&event).unwrap();
|
||||
let action4 = recovery.handle_timeout(&event).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(action4, RecoveryAction::GiveUp);
|
||||
}
|
||||
|
||||
|
|
@ -590,7 +590,7 @@ mod tests {
|
|||
0,
|
||||
);
|
||||
|
||||
let action = recovery.handle_timeout(&event).unwrap();
|
||||
let action = recovery.handle_timeout(&event).expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(action, RecoveryAction::Skip);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -392,7 +392,7 @@ impl BlockValidator {
|
|||
|
||||
for tx in &block.body.transactions {
|
||||
// 验证交易大小
|
||||
let tx_size = serde_json::to_string(tx).unwrap().len();
|
||||
let tx_size = serde_json::to_string(tx).expect("FIX-006: unexpected None/Err").len();
|
||||
if tx_size > self.transaction_rules.max_size {
|
||||
return Err(ValidationError::InvalidTransaction(
|
||||
format!("Transaction size {} exceeds limit {}", tx_size, self.transaction_rules.max_size)
|
||||
|
|
@ -475,7 +475,7 @@ impl BlockValidator {
|
|||
|
||||
// 交易大小
|
||||
for tx in &block.body.transactions {
|
||||
size += serde_json::to_string(tx).unwrap().len();
|
||||
size += serde_json::to_string(tx).expect("FIX-006: unexpected None/Err").len();
|
||||
}
|
||||
|
||||
size
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ mod tests {
|
|||
assert!(set.update_stake("v1", 2000));
|
||||
assert_eq!(set.total_voting_power(), 2000);
|
||||
|
||||
let validator = set.get_validator("v1").unwrap();
|
||||
let validator = set.get_validator("v1").expect("FIX-006: unexpected None/Err");
|
||||
assert_eq!(validator.stake, 2000);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ fn test_signature_integration() {
|
|||
let mut key_manager = KeyManager::new();
|
||||
|
||||
// 生成密钥对
|
||||
let (private_key, public_key) = key_manager.generate_key_pair("validator1".to_string()).unwrap();
|
||||
let (private_key, public_key) = key_manager.generate_key_pair("validator1".to_string()).expect("mainnet: handle error");
|
||||
|
||||
// 签名消息
|
||||
let message = b"Test block";
|
||||
|
|
@ -102,14 +102,14 @@ fn test_fork_detection_integration() {
|
|||
let block2 = Block::new(1, "genesis".to_string(), "validator2".to_string());
|
||||
|
||||
// 第一个区块不应触发分叉
|
||||
assert!(detector.add_block(block1).unwrap().is_none());
|
||||
assert!(detector.add_block(block1).expect("mainnet: handle error").is_none());
|
||||
|
||||
// 第二个区块应触发分叉
|
||||
let fork = detector.add_block(block2).unwrap();
|
||||
let fork = detector.add_block(block2).expect("mainnet: handle error");
|
||||
assert!(fork.is_some());
|
||||
|
||||
// 检查分叉信息
|
||||
let fork_info = fork.unwrap();
|
||||
let fork_info = fork.expect("mainnet: handle error");
|
||||
assert_eq!(fork_info.fork_height, 1);
|
||||
assert_eq!(fork_info.chains.len(), 2);
|
||||
}
|
||||
|
|
@ -134,7 +134,7 @@ fn test_fork_choice_integration() {
|
|||
fork_info.add_chain(chain2);
|
||||
|
||||
// 选择最佳链
|
||||
let best_chain = selector.select_best_chain(&fork_info).unwrap();
|
||||
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);
|
||||
}
|
||||
|
|
@ -155,7 +155,7 @@ fn test_complete_consensus_with_validation() {
|
|||
|
||||
// 生成验证者密钥
|
||||
for i in 1..=3 {
|
||||
key_manager.generate_key_pair(format!("v{}", i)).unwrap();
|
||||
key_manager.generate_key_pair(format!("v{}", i)).expect("mainnet: handle error");
|
||||
}
|
||||
|
||||
// 开始共识
|
||||
|
|
@ -183,7 +183,7 @@ fn test_timeout_with_recovery() {
|
|||
// 创建超时管理器(短超时用于测试)
|
||||
let mut config = TimeoutConfig::default_config();
|
||||
config.proposal_timeout = 1; // 1秒
|
||||
let mut timeout_manager = TimeoutManager::new(config).unwrap();
|
||||
let mut timeout_manager = TimeoutManager::new(config).expect("mainnet: handle error");
|
||||
|
||||
// 启动超时
|
||||
timeout_manager.start_timeout(
|
||||
|
|
@ -221,9 +221,9 @@ fn test_aggregate_signature_verification() {
|
|||
let mut key_manager = KeyManager::new();
|
||||
|
||||
// 生成多个密钥对
|
||||
let (pk1, pub1) = key_manager.generate_key_pair("v1".to_string()).unwrap();
|
||||
let (pk2, pub2) = key_manager.generate_key_pair("v2".to_string()).unwrap();
|
||||
let (pk3, pub3) = key_manager.generate_key_pair("v3".to_string()).unwrap();
|
||||
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";
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ mod tests {
|
|||
|
||||
let retrieved = cache.get(1);
|
||||
assert!(retrieved.is_some());
|
||||
assert_eq!(retrieved.unwrap().id, 1);
|
||||
assert_eq!(retrieved.expect("mainnet: handle error").id, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
|
|
@ -255,7 +255,7 @@ mod tests {
|
|||
let result = executor.execute(&rule, &context);
|
||||
|
||||
assert!(result.is_ok());
|
||||
let rule_result = result.unwrap();
|
||||
let rule_result = result.expect("mainnet: handle error");
|
||||
assert!(rule_result.passed);
|
||||
assert_eq!(rule_result.warnings.len(), 1);
|
||||
}
|
||||
|
|
@ -284,7 +284,7 @@ mod tests {
|
|||
let result = executor.execute(&rule, &context);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let rule_result = result.unwrap();
|
||||
let rule_result = result.expect("mainnet: handle error");
|
||||
assert!(rule_result.passed);
|
||||
assert_eq!(rule_result.actions.len(), 1);
|
||||
}
|
||||
|
|
@ -313,7 +313,7 @@ mod tests {
|
|||
let result = executor.execute(&rule, &context);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let rule_result = result.unwrap();
|
||||
let rule_result = result.expect("mainnet: handle error");
|
||||
assert!(!rule_result.passed);
|
||||
assert_eq!(rule_result.actions.len(), 0);
|
||||
}
|
||||
|
|
@ -327,14 +327,14 @@ mod tests {
|
|||
&Value::UnsignedInteger(100),
|
||||
);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap());
|
||||
assert!(result.expect("mainnet: handle error"));
|
||||
|
||||
let result = executor.compare_equal(
|
||||
&Value::String("test".to_string()),
|
||||
&Value::String("test".to_string()),
|
||||
);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap());
|
||||
assert!(result.expect("mainnet: handle error"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -346,14 +346,14 @@ mod tests {
|
|||
&Value::UnsignedInteger(100),
|
||||
);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap());
|
||||
assert!(result.expect("mainnet: handle error"));
|
||||
|
||||
let result = executor.compare_greater_than(
|
||||
&Value::UnsignedInteger(50),
|
||||
&Value::UnsignedInteger(100),
|
||||
);
|
||||
assert!(result.is_ok());
|
||||
assert!(!result.unwrap());
|
||||
assert!(!result.expect("mainnet: handle error"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -365,7 +365,7 @@ mod tests {
|
|||
&Value::String("world".to_string()),
|
||||
);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap());
|
||||
assert!(result.expect("mainnet: handle error"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -377,14 +377,14 @@ mod tests {
|
|||
&Value::Range(100, 200),
|
||||
);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap());
|
||||
assert!(result.expect("mainnet: handle error"));
|
||||
|
||||
let result = executor.compare_in_range(
|
||||
&Value::UnsignedInteger(250),
|
||||
&Value::Range(100, 200),
|
||||
);
|
||||
assert!(result.is_ok());
|
||||
assert!(!result.unwrap());
|
||||
assert!(!result.expect("mainnet: handle error"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ mod tests {
|
|||
let result = parser.parse_from_json(json);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let rule = result.unwrap();
|
||||
let rule = result.expect("mainnet: handle error");
|
||||
assert_eq!(rule.id, 1);
|
||||
assert_eq!(rule.clause_id, 100);
|
||||
}
|
||||
|
|
@ -273,7 +273,7 @@ mod tests {
|
|||
let result = parser.parse_from_clause(1, "禁止大额转账");
|
||||
|
||||
assert!(result.is_ok());
|
||||
let rules = result.unwrap();
|
||||
let rules = result.expect("mainnet: handle error");
|
||||
assert_eq!(rules.len(), 1);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ impl ReceiptGenerator {
|
|||
validation_result,
|
||||
timestamp: std::time::SystemTime::now()
|
||||
.duration_since(std::time::UNIX_EPOCH)
|
||||
.unwrap()
|
||||
.expect("mainnet: handle error")
|
||||
.as_secs(),
|
||||
executor,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ mod tests {
|
|||
|
||||
let result = validator.validate_header(&block, &[]);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap().passed);
|
||||
assert!(result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -237,7 +237,7 @@ mod tests {
|
|||
|
||||
let result = validator.validate_header(&block, &[]);
|
||||
assert!(result.is_ok());
|
||||
assert!(!result.unwrap().passed);
|
||||
assert!(!result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -248,7 +248,7 @@ mod tests {
|
|||
|
||||
let result = validator.validate(&block, &rules);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap().passed);
|
||||
assert!(result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -259,7 +259,7 @@ mod tests {
|
|||
|
||||
let result = validator.validate_transactions(&block, &rules);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap().passed);
|
||||
assert!(result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -270,6 +270,6 @@ mod tests {
|
|||
|
||||
let result = validator.validate_block_rules(&block, &rules);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap().passed);
|
||||
assert!(result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ mod tests {
|
|||
|
||||
let result = validator.validate(&change, &[]);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap().passed);
|
||||
assert!(result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -251,7 +251,7 @@ mod tests {
|
|||
|
||||
let result = validator.validate(&proposal, &[]);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap().passed);
|
||||
assert!(result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -271,6 +271,6 @@ mod tests {
|
|||
|
||||
let result = validator.validate(&proposal, &[]);
|
||||
assert!(result.is_ok());
|
||||
assert!(!result.unwrap().passed);
|
||||
assert!(!result.expect("mainnet: handle error").passed);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ mod tests {
|
|||
|
||||
let result = validator.quick_validate(&tx);
|
||||
assert!(result.is_ok());
|
||||
assert!(result.unwrap());
|
||||
assert!(result.expect("mainnet: handle error"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -178,7 +178,7 @@ mod tests {
|
|||
|
||||
let result = validator.quick_validate(&tx);
|
||||
assert!(result.is_ok());
|
||||
assert!(!result.unwrap());
|
||||
assert!(!result.expect("mainnet: handle error"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -191,7 +191,7 @@ mod tests {
|
|||
|
||||
let result = validator.quick_validate(&tx);
|
||||
assert!(result.is_ok());
|
||||
assert!(!result.unwrap());
|
||||
assert!(!result.expect("mainnet: handle error"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -216,7 +216,7 @@ mod tests {
|
|||
let result = validator.validate(&tx, &rules);
|
||||
|
||||
assert!(result.is_ok());
|
||||
let validation_result = result.unwrap();
|
||||
let validation_result = result.expect("mainnet: handle error");
|
||||
assert!(validation_result.passed);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ fn validate_charter_syntax(source: &str) -> (bool, Vec<String>) {
|
|||
}
|
||||
|
||||
async fn health(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
HttpResponse::Ok().json(serde_json::json!({
|
||||
"status": "healthy", "service": "nac-charter-service",
|
||||
"version": SERVICE_VERSION, "charter_version": CHARTER_VERSION,
|
||||
|
|
@ -92,7 +92,7 @@ async fn health(state: web::Data<SharedState>) -> HttpResponse {
|
|||
}
|
||||
|
||||
async fn get_state(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
HttpResponse::Ok().json(serde_json::json!({
|
||||
"chain_id": CHAIN_ID, "charter_version": CHARTER_VERSION,
|
||||
"total_compiled": s.total_compiled,
|
||||
|
|
@ -108,7 +108,7 @@ async fn compile_contract(state: web::Data<SharedState>, req: web::Json<CompileR
|
|||
"success": false, "errors": errors
|
||||
}));
|
||||
}
|
||||
let mut s = state.lock().unwrap();
|
||||
let mut s = state.lock().expect("lock not poisoned");
|
||||
let source_hash = sha3_384_hex(req.source_code.as_bytes());
|
||||
let contract_name = req.contract_name.clone().unwrap_or_else(|| "UnnamedContract".to_string());
|
||||
let abi_functions = extract_functions(&req.source_code);
|
||||
|
|
@ -158,13 +158,13 @@ async fn get_language_spec() -> HttpResponse {
|
|||
}
|
||||
|
||||
async fn list_compilations(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
let records: Vec<&CompilationRecord> = s.compilations.values().collect();
|
||||
HttpResponse::Ok().json(serde_json::json!({"compilations": records, "total": records.len()}))
|
||||
}
|
||||
|
||||
async fn get_stats(state: web::Data<SharedState>) -> HttpResponse {
|
||||
let s = state.lock().unwrap();
|
||||
let s = state.lock().expect("lock not poisoned");
|
||||
HttpResponse::Ok().json(serde_json::json!({
|
||||
"service": "nac-charter-service", "layer": "L2-Charter",
|
||||
"chain_id": CHAIN_ID, "total_compiled": s.total_compiled,
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ impl NrpcClient {
|
|||
client: Client::builder()
|
||||
.timeout(Duration::from_secs(30))
|
||||
.build()
|
||||
.unwrap(),
|
||||
.expect("mainnet: handle error"),
|
||||
timeout: Duration::from_secs(30),
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,7 @@ impl NrpcClient {
|
|||
self.client = Client::builder()
|
||||
.timeout(timeout)
|
||||
.build()
|
||||
.unwrap();
|
||||
.expect("mainnet: handle error");
|
||||
self
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ mod tests {
|
|||
let result = sign_tx(&tx, private_key);
|
||||
assert!(result.is_ok());
|
||||
|
||||
let signed = result.unwrap();
|
||||
let signed = result.expect("mainnet: handle error");
|
||||
assert!(signed.starts_with("0x"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ mod tests {
|
|||
let result = generate_keypair();
|
||||
assert!(result.is_ok());
|
||||
|
||||
let (private_key, address) = result.unwrap();
|
||||
let (private_key, address) = result.expect("mainnet: handle error");
|
||||
assert_eq!(private_key.len(), 64); // 32字节 = 64个十六进制字符
|
||||
assert!(address.starts_with("0x"));
|
||||
assert_eq!(address.len(), 66); // 0x + 64个十六进制字符
|
||||
|
|
@ -224,8 +224,8 @@ mod tests {
|
|||
let private_key = "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
||||
let password = "test_password_123";
|
||||
|
||||
let encrypted = encrypt_private_key(private_key, password).unwrap();
|
||||
let decrypted = decrypt_private_key(&encrypted, password).unwrap();
|
||||
let encrypted = encrypt_private_key(private_key, password).expect("mainnet: handle error");
|
||||
let decrypted = decrypt_private_key(&encrypted, password).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(private_key, decrypted);
|
||||
|
||||
|
|
@ -235,8 +235,8 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn test_private_key_to_address() {
|
||||
let (private_key, address1) = generate_keypair().unwrap();
|
||||
let address2 = private_key_to_address(&private_key).unwrap();
|
||||
let (private_key, address1) = generate_keypair().expect("mainnet: handle error");
|
||||
let address2 = private_key_to_address(&private_key).expect("mainnet: handle error");
|
||||
assert_eq!(address1, address2);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -242,58 +242,58 @@ mod tests {
|
|||
let private_key = "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
||||
let password = "test_password";
|
||||
|
||||
let keystore = KeystoreFile::new(private_key, password, Some("test account".to_string())).unwrap();
|
||||
let keystore = KeystoreFile::new(private_key, password, Some("test account".to_string())).expect("mainnet: handle error");
|
||||
|
||||
assert_eq!(keystore.version, 1);
|
||||
assert!(keystore.address.starts_with("0x"));
|
||||
assert!(keystore.note.is_some());
|
||||
|
||||
let decrypted = keystore.decrypt(password).unwrap();
|
||||
let decrypted = keystore.decrypt(password).expect("mainnet: handle error");
|
||||
assert_eq!(decrypted, private_key);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_keystore_manager() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let manager = KeystoreManager::new(temp_dir.path().to_path_buf()).unwrap();
|
||||
let temp_dir = TempDir::new().expect("mainnet: handle error");
|
||||
let manager = KeystoreManager::new(temp_dir.path().to_path_buf()).expect("mainnet: handle error");
|
||||
|
||||
let private_key = "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
||||
let password = "test_password";
|
||||
|
||||
// 导入
|
||||
let address = manager.import(private_key, password, Some("test".to_string())).unwrap();
|
||||
let address = manager.import(private_key, password, Some("test".to_string())).expect("mainnet: handle error");
|
||||
|
||||
// 列出
|
||||
let list = manager.list().unwrap();
|
||||
let list = manager.list().expect("mainnet: handle error");
|
||||
assert_eq!(list.len(), 1);
|
||||
assert_eq!(list[0].address, address);
|
||||
|
||||
// 导出
|
||||
let exported = manager.export(&address, password).unwrap();
|
||||
let exported = manager.export(&address, password).expect("mainnet: handle error");
|
||||
assert_eq!(exported, private_key);
|
||||
|
||||
// 删除
|
||||
manager.delete(&address).unwrap();
|
||||
let list = manager.list().unwrap();
|
||||
manager.delete(&address).expect("mainnet: handle error");
|
||||
let list = manager.list().expect("mainnet: handle error");
|
||||
assert_eq!(list.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_change_password() {
|
||||
let temp_dir = TempDir::new().unwrap();
|
||||
let manager = KeystoreManager::new(temp_dir.path().to_path_buf()).unwrap();
|
||||
let temp_dir = TempDir::new().expect("mainnet: handle error");
|
||||
let manager = KeystoreManager::new(temp_dir.path().to_path_buf()).expect("mainnet: handle error");
|
||||
|
||||
let private_key = "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
|
||||
let old_password = "old_password";
|
||||
let new_password = "new_password";
|
||||
|
||||
let address = manager.import(private_key, old_password, None).unwrap();
|
||||
let address = manager.import(private_key, old_password, None).expect("mainnet: handle error");
|
||||
|
||||
// 修改密码
|
||||
manager.change_password(&address, old_password, new_password).unwrap();
|
||||
manager.change_password(&address, old_password, new_password).expect("mainnet: handle error");
|
||||
|
||||
// 用新密码导出
|
||||
let exported = manager.export(&address, new_password).unwrap();
|
||||
let exported = manager.export(&address, new_password).expect("mainnet: handle error");
|
||||
assert_eq!(exported, private_key);
|
||||
|
||||
// 用旧密码应该失败
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ mod tests {
|
|||
|
||||
registry.add_clause(clause);
|
||||
|
||||
let loaded = registry.get_clause(1).unwrap();
|
||||
let loaded = registry.get_clause(1).expect("mainnet: handle error");
|
||||
assert_eq!(loaded.clause_index, 1);
|
||||
assert_eq!(loaded.title, "测试条款");
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue