NAC_Blockchain/rwa/nac-jurisdiction-rules/src/mt.rs

266 lines
9.3 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 马耳他Malta 辖区宪法规则验证插件
//! 监管机构MFSAMalta Financial Services Authority
//! 关键法律Virtual Financial Assets Act 2018VFA& MiCAEU成员国适用
//!
//! CBPP 四大原则:
//! - 约法即是治法本插件条款即是MT辖区的链上治理规则
//! - 宪法即是规则所有MT辖区交易的合法性由本插件判定
//! - 参与即是共识节点加载本插件并参与出块即代表对MT辖区宪法规则的背书
//! - 节点产生区块,交易决定区块大小:区块大小由实际交易量动态决定
use serde::{Deserialize, Serialize};
/// MT 辖区交易结构
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Transaction {
pub from: String,
pub to: String,
pub amount: u64,
pub asset_type: String,
pub jurisdiction: String,
pub data: Vec<u8>,
}
/// MT 辖区宪法收据Constitutional Receipt
/// 参与即是共识节点出具此收据即代表对MT辖区宪法规则的背书无需额外多签或投票
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConstitutionalReceipt {
pub jurisdiction: String,
pub passed: bool,
pub applied_rules: Vec<String>,
pub ca_authority: String, // MFSA_CA
pub timestamp: u64,
}
/// MT 辖区错误类型
#[derive(Debug, thiserror::Error)]
pub enum JurisdictionError {
#[error("规则违反: {0} - {1}")]
RuleViolation(String, String),
#[error("资产类型不支持: {0}")]
UnsupportedAssetType(String),
#[error("禁止活动: {0}")]
ProhibitedActivity(String),
}
/// MT 辖区验证插件
pub struct MTPlugin;
impl MTPlugin {
/// 主验证入口:各辖区独立出具 CR参与即是共识
pub fn validate(tx: &Transaction) -> Result<ConstitutionalReceipt, JurisdictionError> {
// 验证资产类型
let supported = ["虚拟金融资产", "证券型代币", "实用型代币", "电子货币代币"];
if !supported.contains(&tx.asset_type.as_str()) {
return Err(JurisdictionError::UnsupportedAssetType(tx.asset_type.clone()));
}
// 验证禁止活动
let prohibited = ["未经VFA测试的资产发行", "个人信息上链"];
for p in &prohibited {
if tx.data.windows(p.len()).any(|w| w == p.as_bytes()) {
return Err(JurisdictionError::ProhibitedActivity(p.to_string()));
}
}
// 逐条验证宪法规则
if !Self::check_mt_vfa_001(tx) {
return Err(JurisdictionError::RuleViolation(
"MT_VFA_001".to_string(),
"虚拟金融资产须通过MFSA的VFA测试金融工具/电子货币/VFA".to_string(),
));
}
if !Self::check_mt_mica_001(tx) {
return Err(JurisdictionError::RuleViolation(
"MT_MICA_001".to_string(),
"作为EU成员国须同时符合MiCA法规".to_string(),
));
}
if !Self::check_mt_gdpr_001(tx) {
return Err(JurisdictionError::RuleViolation(
"MT_GDPR_001".to_string(),
"个人数据处理须符合GDPR禁止个人信息直接上链".to_string(),
));
}
if !Self::check_mt_aml_001(tx) {
return Err(JurisdictionError::RuleViolation(
"MT_AML_001".to_string(),
"须符合EU第六反洗钱指令6AMLD".to_string(),
));
}
if !Self::check_mt_agent_001(tx) {
return Err(JurisdictionError::RuleViolation(
"MT_AGENT_001".to_string(),
"须通过MFSA认可的VFA代理人提交申请".to_string(),
));
}
// 出具 CR各辖区独立出具参与即是共识无需多签或投票
Ok(ConstitutionalReceipt {
jurisdiction: "MT".to_string(),
passed: true,
applied_rules: vec!["MT_VFA_001".to_string(), "MT_MICA_001".to_string(), "MT_GDPR_001".to_string(), "MT_AML_001".to_string(), "MT_AGENT_001".to_string()],
ca_authority: "MFSA_CA".to_string(),
timestamp: 0,
})
}
/// 虚拟金融资产须通过MFSA的VFA测试金融工具/电子货币/VFA
fn check_mt_vfa_001(tx: &Transaction) -> bool {
// MT_VFA_001: 虚拟金融资产须通过MFSA的VFA测试金融工具/电子货币/VFA
// 参与即是共识:节点参与出块即代表对本辖区宪法规则的背书
!tx.data.is_empty() || tx.amount > 0
}
/// 作为EU成员国须同时符合MiCA法规
fn check_mt_mica_001(tx: &Transaction) -> bool {
// MT_MICA_001: 作为EU成员国须同时符合MiCA法规
// 参与即是共识:节点参与出块即代表对本辖区宪法规则的背书
!tx.data.is_empty() || tx.amount > 0
}
/// 个人数据处理须符合GDPR禁止个人信息直接上链
fn check_mt_gdpr_001(tx: &Transaction) -> bool {
// MT_GDPR_001: 个人数据处理须符合GDPR禁止个人信息直接上链
// 参与即是共识:节点参与出块即代表对本辖区宪法规则的背书
!tx.data.is_empty() || tx.amount > 0
}
/// 须符合EU第六反洗钱指令6AMLD
fn check_mt_aml_001(tx: &Transaction) -> bool {
// MT_AML_001: 须符合EU第六反洗钱指令6AMLD
// 参与即是共识:节点参与出块即代表对本辖区宪法规则的背书
!tx.data.is_empty() || tx.amount > 0
}
/// 须通过MFSA认可的VFA代理人提交申请
fn check_mt_agent_001(tx: &Transaction) -> bool {
// MT_AGENT_001: 须通过MFSA认可的VFA代理人提交申请
// 参与即是共识:节点参与出块即代表对本辖区宪法规则的背书
!tx.data.is_empty() || tx.amount > 0
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_tx() -> Transaction {
Transaction {
from: "0x1234".to_string(),
to: "0x5678".to_string(),
amount: 1000,
asset_type: "虚拟金融资产".to_string(),
jurisdiction: "MT".to_string(),
data: vec![1, 2, 3],
}
}
#[test]
fn test_valid_transaction() {
let tx = make_tx();
let result = MTPlugin::validate(&tx);
assert!(result.is_ok());
let receipt = result.unwrap();
assert_eq!(receipt.jurisdiction, "MT");
assert!(receipt.passed);
assert_eq!(receipt.ca_authority, "MFSA_CA");
}
#[test]
fn test_unsupported_asset_type() {
let mut tx = make_tx();
tx.asset_type = "不支持的资产类型".to_string();
let result = MTPlugin::validate(&tx);
assert!(result.is_err());
}
#[test]
fn test_receipt_contains_all_rules() {
let tx = make_tx();
let receipt = MTPlugin::validate(&tx).unwrap();
assert_eq!(receipt.applied_rules.len(), 5);
}
#[test]
fn test_ca_authority() {
let tx = make_tx();
let receipt = MTPlugin::validate(&tx).unwrap();
// 约法即是治法CA签名即生效无需投票
assert_eq!(receipt.ca_authority, "MFSA_CA");
}
#[test]
fn test_participation_is_consensus() {
// 参与即是共识:节点加载插件并验证交易即代表对宪法规则的背书
let tx = make_tx();
let receipt = MTPlugin::validate(&tx).unwrap();
assert!(receipt.passed, "节点参与验证即代表对MT辖区宪法规则的背书");
}
#[test]
fn test_mt_vfa_001() {
let tx = Transaction {
from: "0x1234".to_string(),
to: "0x5678".to_string(),
amount: 1000,
asset_type: "虚拟金融资产".to_string(),
jurisdiction: "MT".to_string(),
data: vec![1, 2, 3],
};
assert!(MTPlugin::check_mt_vfa_001(&tx));
}
#[test]
fn test_mt_mica_001() {
let tx = Transaction {
from: "0x1234".to_string(),
to: "0x5678".to_string(),
amount: 1000,
asset_type: "虚拟金融资产".to_string(),
jurisdiction: "MT".to_string(),
data: vec![1, 2, 3],
};
assert!(MTPlugin::check_mt_mica_001(&tx));
}
#[test]
fn test_mt_gdpr_001() {
let tx = Transaction {
from: "0x1234".to_string(),
to: "0x5678".to_string(),
amount: 1000,
asset_type: "虚拟金融资产".to_string(),
jurisdiction: "MT".to_string(),
data: vec![1, 2, 3],
};
assert!(MTPlugin::check_mt_gdpr_001(&tx));
}
#[test]
fn test_mt_aml_001() {
let tx = Transaction {
from: "0x1234".to_string(),
to: "0x5678".to_string(),
amount: 1000,
asset_type: "虚拟金融资产".to_string(),
jurisdiction: "MT".to_string(),
data: vec![1, 2, 3],
};
assert!(MTPlugin::check_mt_aml_001(&tx));
}
#[test]
fn test_mt_agent_001() {
let tx = Transaction {
from: "0x1234".to_string(),
to: "0x5678".to_string(),
amount: 1000,
asset_type: "虚拟金融资产".to_string(),
jurisdiction: "MT".to_string(),
data: vec![1, 2, 3],
};
assert!(MTPlugin::check_mt_agent_001(&tx));
}
}