NAC_Blockchain/rwa/nac-multi-jurisdiction/src/cross_jurisdiction.rs

160 lines
4.6 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

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

// 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()
}
}