// 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, /// 发起辖区 ID pub source_jurisdiction: JurisdictionId, /// 接收辖区 ID pub target_jurisdiction: JurisdictionId, /// 发起辖区宪法收据(原始字节) pub source_receipt: Vec, /// 接收辖区宪法收据(原始字节) pub target_receipt: Vec, /// 时间戳(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, /// 发起辖区 pub source_jurisdiction: JurisdictionId, /// 接收辖区 pub target_jurisdiction: JurisdictionId, /// 交易数据 pub payload: Vec, /// 双宪法收据(可选,处理中为 None) pub dual_receipt: Option, /// 交易状态 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, /// 最大待处理交易数 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, 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, receipt: Vec, ) -> 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() } }