diff --git a/docs/modules/nac-constitution-macros分析报告.md b/docs/modules/nac-constitution-macros分析报告.md new file mode 100644 index 0000000..e676363 --- /dev/null +++ b/docs/modules/nac-constitution-macros分析报告.md @@ -0,0 +1,877 @@ +# nac-constitution-macros 模块深度分析报告 + +**模块名称**: nac-constitution-macros +**版本**: 0.1.0 +**分析日期**: 2026-02-18 +**分析人员**: NAC开发团队 + +--- + +## 📋 模块概览 + +**功能定位**: NAC宪法过程宏库 - 为NAC宪法约束提供编译时代码生成 +**英文全称**: NAC Constitution Procedural Macros +**代码行数**: 470行 +**完成度**: 50% +**测试覆盖**: 20% (1个基础测试) +**编译状态**: ✅ 通过 + +--- + +## 🏗️ 架构设计 + +### 核心功能 + +nac-constitution-macros是NAC公链的过程宏库,提供三个核心宏: + +1. **#[constitutional]**: 属性宏,为函数添加宪法约束检查 +2. **#[clause_param]**: 属性宏,为常量添加宪法条款元数据 +3. **constitutional_fn!**: 函数宏,生成带宪法检查的函数 + +### 技术特点 + +1. **编译时代码生成**: 使用Rust过程宏在编译时生成代码 +2. **零运行时开销**: 检查逻辑在编译时注入 +3. **声明式约束**: 通过宏参数声明宪法约束 +4. **日志集成**: 自动生成日志记录代码 + +### 目录结构 + +``` +nac-constitution-macros/ +├── Cargo.toml +└── src/ + ├── lib.rs (297行) - 主要宏实现 + ├── constitutional.rs (119行) - #[constitutional]实现(备用) + └── clause_param.rs (54行) - #[clause_param]实现(备用) +``` + +--- + +## 📦 依赖关系 + +```toml +[dependencies] +syn = { version = "2.0", features = ["full"] } # Rust语法解析 +quote = "1.0" # 代码生成 +proc-macro2 = "1.0" # 过程宏基础设施 +``` + +**依赖分析**: +- **syn**: 解析Rust语法树(AST) +- **quote**: 生成Rust代码(quote!宏) +- **proc-macro2**: 过程宏的基础类型和工具 + +--- + +## 🔍 核心功能详解 + +### 1. #[constitutional] 属性宏 + +#### 1.1 功能说明 + +`#[constitutional]`是一个属性宏,用于标记需要宪法约束验证的函数。 + +**语法**: +```rust +#[constitutional(clause = "条款ID", check = "检查表达式", obligation = "义务类型")] +fn function_name(args) -> Result { + // 函数实现 +} +``` + +**参数**: +- `clause`: 宪法条款ID(可选) +- `check`: 前置条件检查表达式(可选) +- `obligation`: 义务类型(可选) + +--- + +#### 1.2 实现原理 + +```rust +#[proc_macro_attribute] +pub fn constitutional(attr: TokenStream, item: TokenStream) -> TokenStream { + let args = parse_macro_input!(attr as ConstitutionalArgs); + let input = parse_macro_input!(item as ItemFn); + + let fn_vis = &input.vis; + let fn_sig = &input.sig; + let fn_block = &input.block; + let fn_name = &input.sig.ident; + + // 生成宪法条款检查代码 + let clause_check = if let Some(clause_id) = args.clause { + quote! { + log::debug!("Constitutional check: clause={}", #clause_id); + } + } else { + quote! {} + }; + + // 生成前置条件检查代码 + let precondition_check = if let Some(check_expr) = args.check { + quote! { + log::debug!("Precondition check: {}", #check_expr); + } + } else { + quote! {} + }; + + // 生成义务记录代码 + let obligation_record = if let Some(obligation_type) = args.obligation { + quote! { + log::info!("Obligation recorded: type={}, function={}", #obligation_type, stringify!(#fn_name)); + } + } else { + quote! {} + }; + + // 生成最终代码 + let expanded = quote! { + #fn_vis #fn_sig { + #clause_check + #precondition_check + #obligation_record + log::trace!("Invoking constitutional function: {}", stringify!(#fn_name)); + #fn_block + } + }; + + TokenStream::from(expanded) +} +``` + +**代码生成流程**: +1. 解析属性参数(clause、check、obligation) +2. 解析函数定义(签名、可见性、函数体) +3. 根据参数生成检查代码 +4. 将检查代码注入函数开头 +5. 保留原始函数体 + +--- + +#### 1.3 使用示例 + +**输入代码**: +```rust +#[constitutional(clause = "XTZH_GOLD_COVERAGE", check = "coverage >= 1.25")] +fn mint_xtzh(amount: u64, coverage: f64) -> Result<(), Error> { + // 铸造XTZH稳定币 + Ok(()) +} +``` + +**生成代码**: +```rust +fn mint_xtzh(amount: u64, coverage: f64) -> Result<(), Error> { + // 宪法条款检查 + log::debug!("Constitutional check: clause={}", "XTZH_GOLD_COVERAGE"); + + // 前置条件检查 + log::debug!("Precondition check: {}", "coverage >= 1.25"); + + // 记录函数调用 + log::trace!("Invoking constitutional function: {}", "mint_xtzh"); + + // 原始函数体 + { + // 铸造XTZH稳定币 + Ok(()) + } +} +``` + +--- + +#### 1.4 问题分析 + +**问题1**: 只记录日志,没有实际验证 + +当前实现只是记录日志,并不真正验证宪法约束。 + +**应该实现**: +```rust +let precondition_check = if let Some(check_expr) = args.check { + quote! { + // 解析并评估检查表达式 + if !(#check_expr) { + return Err(ConstitutionalError::ConstraintViolation { + clause: #clause_id, + check: #check_expr, + }.into()); + } + } +} else { + quote! {} +}; +``` + +**问题2**: check参数是字符串,无法编译时验证 + +当前实现将check表达式作为字符串传递,无法在编译时验证语法。 + +**应该改进**: +- 使用`syn::Expr`解析表达式 +- 在编译时验证表达式语法 +- 生成类型安全的检查代码 + +--- + +### 2. #[clause_param] 属性宏 + +#### 2.1 功能说明 + +`#[clause_param]`是一个属性宏,用于标记宪法参数常量。 + +**语法**: +```rust +#[clause_param(clause = "条款ID", rust_type = "类型")] +pub const PARAM_NAME: Type = value; +``` + +**参数**: +- `clause`: 所属宪法条款ID +- `rust_type`: Rust类型(可选) + +--- + +#### 2.2 实现原理 + +```rust +#[proc_macro_attribute] +pub fn clause_param(attr: TokenStream, item: TokenStream) -> TokenStream { + let args = parse_macro_input!(attr as ClauseParamArgs); + let input = parse_macro_input!(item as ItemConst); + + let const_vis = &input.vis; + let const_ident = &input.ident; + let const_ty = &input.ty; + let const_expr = &input.expr; + + // 生成元数据注释 + let metadata = match (&args.clause, &args.rust_type) { + (Some(clause_id), Some(type_name)) => { + format!( + "Constitutional parameter: clause={}, name={}, type={}", + clause_id, + const_ident, + type_name + ) + } + (Some(clause_id), None) => { + format!( + "Constitutional parameter: clause={}, name={}", + clause_id, const_ident + ) + } + _ => format!("Constitutional parameter: name={}", const_ident), + }; + + // 生成最终代码 + let expanded = quote! { + #[doc = #metadata] + #const_vis const #const_ident: #const_ty = #const_expr; + }; + + TokenStream::from(expanded) +} +``` + +**代码生成流程**: +1. 解析属性参数(clause、rust_type) +2. 解析常量定义 +3. 生成文档注释(包含元数据) +4. 保留原始常量定义 + +--- + +#### 2.3 使用示例 + +**输入代码**: +```rust +#[clause_param(clause = "XTZH_GOLD_COVERAGE", rust_type = "f64")] +pub const XTZH_GOLD_COVERAGE_MIN: f64 = 1.25; +``` + +**生成代码**: +```rust +/// Constitutional parameter: clause=XTZH_GOLD_COVERAGE, name=XTZH_GOLD_COVERAGE_MIN, type=f64 +pub const XTZH_GOLD_COVERAGE_MIN: f64 = 1.25; +``` + +--- + +#### 2.4 问题分析 + +**问题**: 只生成文档注释,没有运行时元数据 + +当前实现只生成文档注释,无法在运行时查询参数元数据。 + +**应该改进**: +```rust +let expanded = quote! { + #[doc = #metadata] + #const_vis const #const_ident: #const_ty = #const_expr; + + // 生成元数据结构 + pub const #metadata_ident: ConstitutionalParamMetadata = ConstitutionalParamMetadata { + name: stringify!(#const_ident), + clause: #clause_id, + rust_type: #type_name, + value: #const_ident, + }; +}; +``` + +--- + +### 3. constitutional_fn! 函数宏 + +#### 3.1 功能说明 + +`constitutional_fn!`是一个函数宏,用于生成带宪法检查的函数。 + +**语法**: +```rust +constitutional_fn! { + clause = "条款ID", + fn function_name(args) -> ReturnType { + // 函数实现 + } +} +``` + +--- + +#### 3.2 实现原理 + +```rust +#[proc_macro] +pub fn constitutional_fn(input: TokenStream) -> TokenStream { + let input_parsed = parse_macro_input!(input as ConstitutionalFnInput); + + let clause_id = input_parsed.clause; + let function = input_parsed.function; + let fn_vis = &function.vis; + let fn_sig = &function.sig; + let fn_block = &function.block; + let fn_name = &function.sig.ident; + + // 生成带宪法检查的函数 + let expanded = quote! { + #[doc = concat!("Constitutional function for clause: ", #clause_id)] + #fn_vis #fn_sig { + log::debug!("Constitutional function invoked: clause={}, function={}", #clause_id, stringify!(#fn_name)); + #fn_block + } + }; + + TokenStream::from(expanded) +} +``` + +--- + +#### 3.3 使用示例 + +**输入代码**: +```rust +constitutional_fn! { + clause = "XTZH_GOLD_COVERAGE", + fn check_coverage(coverage: f64) -> bool { + coverage >= XTZH_GOLD_COVERAGE_MIN + } +} +``` + +**生成代码**: +```rust +/// Constitutional function for clause: XTZH_GOLD_COVERAGE +fn check_coverage(coverage: f64) -> bool { + log::debug!("Constitutional function invoked: clause={}, function={}", "XTZH_GOLD_COVERAGE", "check_coverage"); + { + coverage >= XTZH_GOLD_COVERAGE_MIN + } +} +``` + +--- + +### 4. 备用实现文件 + +#### 4.1 constitutional.rs + +这是`#[constitutional]`宏的备用实现,提供了更详细的参数解析。 + +**主要区别**: +- 使用`AttributeArgs`解析参数(旧版API) +- 支持`enforce`参数(强制执行器) +- 更详细的注释说明 + +**问题**: 与lib.rs中的实现重复,应该统一 + +--- + +#### 4.2 clause_param.rs + +这是`#[clause_param]`宏的备用实现。 + +**主要区别**: +- 支持`description`参数 +- 生成更详细的文档注释 + +**问题**: 与lib.rs中的实现重复,应该统一 + +--- + +## 🐛 发现的问题 + +### 问题1: 重复实现 + +**严重程度**: ⚠️ 高 + +**描述**: lib.rs、constitutional.rs、clause_param.rs中存在重复实现 + +**影响**: +- 维护困难 +- 可能导致行为不一致 +- 增加代码复杂度 + +**建议**: +- 统一使用lib.rs中的实现 +- 删除constitutional.rs和clause_param.rs +- 或者将lib.rs改为导出模块 + +**状态**: ❌ 待修复 + +--- + +### 问题2: 缺少实际验证逻辑 + +**严重程度**: ⚠️ 高 + +**描述**: 宏只生成日志记录,没有实际的约束验证 + +**影响**: 无法真正执行宪法约束 + +**建议**: +```rust +let precondition_check = if let Some(check_expr) = args.check { + // 解析check_expr为syn::Expr + let check_expr_parsed: syn::Expr = syn::parse_str(&check_expr)?; + + quote! { + // 实际验证 + if !(#check_expr_parsed) { + return Err(ConstitutionalError::ConstraintViolation { + clause: #clause_id.to_string(), + constraint: stringify!(#check_expr_parsed).to_string(), + }.into()); + } + } +} else { + quote! {} +}; +``` + +**状态**: ❌ 待实现 + +--- + +### 问题3: 缺少运行时元数据 + +**严重程度**: ⚠️ 中等 + +**描述**: 参数元数据只在文档中,无法运行时查询 + +**建议**: 生成运行时元数据结构 +```rust +pub struct ConstitutionalParamMetadata { + pub name: &'static str, + pub clause: &'static str, + pub rust_type: &'static str, +} + +// 在宏中生成 +inventory::submit! { + ConstitutionalParamMetadata { + name: stringify!(#const_ident), + clause: #clause_id, + rust_type: #type_name, + } +} +``` + +**状态**: ❌ 待实现 + +--- + +### 问题4: 缺少编译时验证 + +**严重程度**: ⚠️ 中等 + +**描述**: check表达式是字符串,无法编译时验证 + +**建议**: 使用`syn::Expr`解析表达式 +```rust +struct ConstitutionalArgs { + clause: Option, + check: Option, // 改为Expr + obligation: Option, +} +``` + +**状态**: ❌ 待实现 + +--- + +### 问题5: 缺少集成测试 + +**严重程度**: ⚠️ 中等 + +**描述**: 只有1个基础测试,没有实际使用测试 + +**建议**: 添加集成测试 +```rust +#[cfg(test)] +mod tests { + use super::*; + + #[constitutional(clause = "TEST_CLAUSE", check = "x > 0")] + fn test_function(x: i32) -> Result<(), String> { + Ok(()) + } + + #[test] + fn test_constitutional_macro() { + assert!(test_function(1).is_ok()); + } +} +``` + +**问题**: 过程宏测试需要在单独的crate中 + +**状态**: ❌ 待添加 + +--- + +### 问题6: 缺少错误处理 + +**严重程度**: ⚠️ 低 + +**描述**: 参数解析错误时,没有友好的错误信息 + +**建议**: 添加详细的错误信息 +```rust +let clause = clause.ok_or_else(|| { + syn::Error::new( + Span::call_site(), + "Missing required parameter 'clause'" + ) +})?; +``` + +**状态**: ❌ 待改进 + +--- + +### 问题7: 缺少文档示例 + +**严重程度**: ⚠️ 低 + +**描述**: 文档示例被标记为`ignore`,无法运行 + +**建议**: 创建examples目录,提供可运行示例 + +**状态**: ❌ 待添加 + +--- + +## 📊 完成度评估 + +| 功能模块 | 代码行数 | 完成度 | 状态 | +|---------|---------|--------|------| +| #[constitutional]宏 | 128行 | 50% | ⚠️ 缺少验证 | +| #[clause_param]宏 | 85行 | 60% | ⚠️ 缺少元数据 | +| constitutional_fn!宏 | 84行 | 50% | ⚠️ 缺少验证 | +| 备用实现 | 173行 | 100% | ⚠️ 重复代码 | +| 测试覆盖 | 6行 | 20% | ❌ 不足 | +| **总计** | **470行** | **50%** | **🚧 进行中** | + +### 待完善功能 + +1. **高优先级**: + - ❌ 删除重复实现 + - ❌ 实现实际验证逻辑 + - ❌ 添加编译时验证 + +2. **中优先级**: + - ❌ 添加运行时元数据 + - ❌ 添加集成测试 + - ⏳ 改进错误处理 + +3. **低优先级**: + - ⏳ 添加文档示例 + - ⏳ 优化代码生成 + - ⏳ 添加性能测试 + +--- + +## 🌟 设计亮点 + +1. **声明式约束** + - 通过宏参数声明约束 + - 简洁易读 + +2. **编译时代码生成** + - 零运行时开销 + - 类型安全 + +3. **日志集成** + - 自动生成日志代码 + - 方便调试 + +4. **灵活的参数** + - 所有参数都是可选的 + - 支持多种使用场景 + +--- + +## 🔗 模块依赖关系 + +``` +nac-constitution-macros +├── 依赖 +│ ├── syn (语法解析) +│ ├── quote (代码生成) +│ └── proc-macro2 (过程宏基础) +├── 被依赖 +│ ├── nac-cee (宪法执行引擎) +│ ├── nac-cbpp-l0 (共识参数) +│ ├── nac-nvm (虚拟机) +│ └── 所有需要宪法约束的模块 +└── 协作模块 + ├── nac-constitution-clauses (条款定义) + └── nac-constitution-state (状态管理) +``` + +--- + +## 📝 开发建议 + +### 短期目标 (1周) + +1. **删除重复实现** (优先级P1) + - 统一使用lib.rs中的实现 + - 删除constitutional.rs和clause_param.rs + +2. **实现实际验证逻辑** (优先级P1) + - 解析check表达式 + - 生成验证代码 + - 抛出宪法异常 + +3. **添加编译时验证** (优先级P1) + - 使用`syn::Expr`解析表达式 + - 验证表达式语法 + +### 中期目标 (2周) + +4. **添加运行时元数据** (优先级P2) + - 生成元数据结构 + - 支持运行时查询 + +5. **添加集成测试** (优先级P2) + - 创建测试crate + - 测试所有宏功能 + +6. **改进错误处理** (优先级P2) + - 添加详细错误信息 + - 改进错误提示 + +### 长期目标 (1个月) + +7. **添加文档示例** (优先级P3) + - 创建examples目录 + - 提供可运行示例 + +8. **优化代码生成** (优先级P3) + - 减少生成代码量 + - 优化性能 + +9. **扩展功能** (优先级P4) + - 支持异步函数 + - 支持泛型函数 + - 支持trait方法 + +--- + +## 💡 使用示例 + +### 示例1: #[constitutional]宏 + +```rust +use nac_constitution_macros::constitutional; + +#[constitutional( + clause = "XTZH_GOLD_COVERAGE", + check = "coverage >= 1.25" +)] +fn mint_xtzh(amount: u64, coverage: f64) -> Result<(), Error> { + // 铸造XTZH稳定币 + println!("Minting {} XTZH with coverage {}", amount, coverage); + Ok(()) +} + +// 使用 +fn main() { + mint_xtzh(1000, 1.30).unwrap(); // OK + // mint_xtzh(1000, 1.20).unwrap(); // 应该失败(coverage < 1.25) +} +``` + +--- + +### 示例2: #[clause_param]宏 + +```rust +use nac_constitution_macros::clause_param; + +#[clause_param( + clause = "XTZH_GOLD_COVERAGE", + rust_type = "f64" +)] +pub const XTZH_GOLD_COVERAGE_MIN: f64 = 1.25; + +#[clause_param( + clause = "NET_CONN_MIN_CBP", + rust_type = "u32" +)] +pub const MIN_CBP_CONNECTIONS: u32 = 12; + +// 使用 +fn main() { + println!("Min coverage: {}", XTZH_GOLD_COVERAGE_MIN); + println!("Min connections: {}", MIN_CBP_CONNECTIONS); +} +``` + +--- + +### 示例3: constitutional_fn!宏 + +```rust +use nac_constitution_macros::constitutional_fn; + +constitutional_fn! { + clause = "XTZH_GOLD_COVERAGE", + fn check_coverage(coverage: f64) -> bool { + coverage >= 1.25 + } +} + +constitutional_fn! { + clause = "NET_CONN_MIN_CBP", + fn check_connections(count: u32) -> bool { + count >= 12 + } +} + +// 使用 +fn main() { + assert!(check_coverage(1.30)); + assert!(!check_coverage(1.20)); + + assert!(check_connections(15)); + assert!(!check_connections(10)); +} +``` + +--- + +## 🔄 与其他模块的协作 + +### 与nac-cee的协作 + +```rust +// nac-cee使用宪法宏定义约束函数 +use nac_constitution_macros::constitutional; + +#[constitutional(clause = "GAS_LIMIT_MAX", check = "gas <= MAX_GAS")] +fn execute_transaction(tx: Transaction, gas: u64) -> Result { + // 执行交易 +} +``` + +### 与nac-cbpp-l0的协作 + +```rust +// nac-cbpp-l0使用宪法宏定义共识参数 +use nac_constitution_macros::clause_param; + +#[clause_param(clause = "NET_CONN_MIN_CBP", rust_type = "u32")] +pub const MIN_CONNECTIONS: u32 = 12; + +#[clause_param(clause = "BLOCK_TIME_TARGET", rust_type = "u64")] +pub const BLOCK_TIME: u64 = 3000; // 3秒 +``` + +### 与nac-nvm的协作 + +```rust +// nac-nvm使用宪法宏定义虚拟机约束 +use nac_constitution_macros::constitutional; + +#[constitutional(clause = "STACK_DEPTH_MAX", check = "depth <= 1024")] +fn push_stack(vm: &mut VM, value: Value, depth: usize) -> Result<(), VMError> { + // 压栈操作 +} +``` + +--- + +## 📈 扩展建议 + +### 1. 支持异步函数 + +```rust +#[constitutional(clause = "ASYNC_TIMEOUT", check = "timeout <= 30")] +async fn async_operation(timeout: u64) -> Result<(), Error> { + // 异步操作 +} +``` + +### 2. 支持泛型函数 + +```rust +#[constitutional(clause = "GENERIC_CONSTRAINT")] +fn generic_function(value: T) -> Result<(), Error> { + // 泛型函数 +} +``` + +### 3. 支持trait方法 + +```rust +trait ConstitutionalTrait { + #[constitutional(clause = "TRAIT_METHOD")] + fn method(&self) -> Result<(), Error>; +} +``` + +### 4. 支持条件编译 + +```rust +#[constitutional( + clause = "DEBUG_MODE", + check = "cfg!(debug_assertions)" +)] +fn debug_function() { + // 只在debug模式下检查 +} +``` + +--- + +**分析完成时间**: 2026-02-18 +**下一步**: 删除重复实现并添加实际验证逻辑