160 lines
4.6 KiB
Rust
160 lines
4.6 KiB
Rust
// nac-multi-jurisdiction/src/cross_jurisdiction.rs
|
||
// Issue #59: 跨辖区交易处理与双宪法收据
|
||
|
||
use serde::{Serialize, Deserialize};
|
||
use crate::jurisdiction::JurisdictionId;
|
||
|
||
/// 双宪法收据(跨辖区交易必须携带)
|
||
/// 发起辖区 + 接收辖区都必须签署
|
||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
pub struct DualConstitutionalReceipt {
|
||
/// 交易唯一标识(SHA3-384)
|
||
pub tx_id: Vec<u8>,
|
||
/// 发起辖区 ID
|
||
pub source_jurisdiction: JurisdictionId,
|
||
/// 接收辖区 ID
|
||
pub target_jurisdiction: JurisdictionId,
|
||
/// 发起辖区宪法收据(原始字节)
|
||
pub source_receipt: Vec<u8>,
|
||
/// 接收辖区宪法收据(原始字节)
|
||
pub target_receipt: Vec<u8>,
|
||
/// 时间戳(Unix 秒)
|
||
pub timestamp: u64,
|
||
/// 纪元编号
|
||
pub epoch: u64,
|
||
/// 是否已最终确认
|
||
pub is_finalized: bool,
|
||
}
|
||
|
||
impl DualConstitutionalReceipt {
|
||
/// 验证双收据完整性
|
||
pub fn is_valid(&self) -> bool {
|
||
!self.source_receipt.is_empty()
|
||
&& !self.target_receipt.is_empty()
|
||
&& self.source_jurisdiction != self.target_jurisdiction
|
||
&& self.tx_id != vec![0u8; 48]
|
||
}
|
||
|
||
/// 检查是否包含指定辖区的收据
|
||
pub fn has_receipt_for(&self, jid: &JurisdictionId) -> bool {
|
||
&self.source_jurisdiction == jid || &self.target_jurisdiction == jid
|
||
}
|
||
}
|
||
|
||
/// 跨辖区交易
|
||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
pub struct CrossJurisdictionTx {
|
||
/// 交易 ID
|
||
pub id: Vec<u8>,
|
||
/// 发起辖区
|
||
pub source_jurisdiction: JurisdictionId,
|
||
/// 接收辖区
|
||
pub target_jurisdiction: JurisdictionId,
|
||
/// 交易数据
|
||
pub payload: Vec<u8>,
|
||
/// 双宪法收据(可选,处理中为 None)
|
||
pub dual_receipt: Option<DualConstitutionalReceipt>,
|
||
/// 交易状态
|
||
pub status: CrossTxStatus,
|
||
/// 冲突解决策略
|
||
pub conflict_resolution: ConflictResolutionStrategy,
|
||
}
|
||
|
||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||
pub enum CrossTxStatus {
|
||
/// 待处理(等待接收辖区收据)
|
||
Pending,
|
||
/// 源辖区已确认
|
||
SourceConfirmed,
|
||
/// 双方已确认
|
||
DualConfirmed,
|
||
/// 最终确认
|
||
Finalized,
|
||
/// 失败(附带原因)
|
||
Failed(String),
|
||
/// 冲突(需要解决)
|
||
Conflicted,
|
||
}
|
||
|
||
/// 规则冲突解决策略
|
||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||
pub enum ConflictResolutionStrategy {
|
||
/// 严格模式:任何冲突都拒绝交易
|
||
StrictReject,
|
||
/// 源辖区优先:以发起辖区规则为准
|
||
SourcePriority,
|
||
/// 目标辖区优先:以接收辖区规则为准
|
||
TargetPriority,
|
||
/// 协商模式:双方辖区协商解决
|
||
Negotiated,
|
||
/// 宪法仲裁:提交宪法法院仲裁
|
||
ConstitutionalArbitration,
|
||
}
|
||
|
||
/// 跨辖区路由器
|
||
pub struct CrossJurisdictionRouter {
|
||
pending_txs: Vec<CrossJurisdictionTx>,
|
||
/// 最大待处理交易数
|
||
max_pending: usize,
|
||
}
|
||
|
||
impl CrossJurisdictionRouter {
|
||
pub fn new() -> Self {
|
||
CrossJurisdictionRouter {
|
||
pending_txs: Vec::new(),
|
||
max_pending: 10000,
|
||
}
|
||
}
|
||
|
||
/// 提交跨辖区交易
|
||
pub fn submit(&mut self, tx: CrossJurisdictionTx) -> Result<Vec<u8>, String> {
|
||
if self.pending_txs.len() >= self.max_pending {
|
||
return Err("待处理交易队列已满".to_string());
|
||
}
|
||
let id = tx.id.clone();
|
||
self.pending_txs.push(tx);
|
||
Ok(id)
|
||
}
|
||
|
||
/// 附加目标辖区收据(完成双收据)
|
||
pub fn attach_target_receipt(
|
||
&mut self,
|
||
tx_id: &Vec<u8>,
|
||
receipt: Vec<u8>,
|
||
) -> Result<(), String> {
|
||
for tx in &mut self.pending_txs {
|
||
if &tx.id == tx_id {
|
||
if let Some(ref mut dr) = tx.dual_receipt {
|
||
dr.target_receipt = receipt;
|
||
dr.is_finalized = true;
|
||
tx.status = CrossTxStatus::DualConfirmed;
|
||
return Ok(());
|
||
}
|
||
}
|
||
}
|
||
Err(format!("交易 {:?} 不存在", tx_id))
|
||
}
|
||
|
||
/// 检测规则冲突
|
||
pub fn detect_conflict(
|
||
&self,
|
||
source_rules: &[u8],
|
||
target_rules: &[u8],
|
||
) -> bool {
|
||
// 规则冲突检测:比较两个辖区的规则哈希
|
||
// 实际实现由 NVM 系统调用处理
|
||
source_rules.is_empty() || target_rules.is_empty()
|
||
}
|
||
|
||
/// 获取待处理交易数量
|
||
pub fn pending_count(&self) -> usize {
|
||
self.pending_txs.len()
|
||
}
|
||
}
|
||
|
||
impl Default for CrossJurisdictionRouter {
|
||
fn default() -> Self {
|
||
Self::new()
|
||
}
|
||
}
|