NAC_Blockchain/charter-compiler/src/codegen/mod.rs

634 lines
20 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.

// Charter Codegen - NVM 2.0字节码生成器
// 将AST转换为NVM 2.0字节码
use crate::parser::ast::*;
use std::collections::HashMap;
use thiserror::Error;
#[derive(Error, Debug)]
#[allow(dead_code)]
pub enum CodegenError {
#[error("不支持的操作: {0}")]
UnsupportedOperation(String),
#[error("未定义的变量: {0}")]
UndefinedVariable(String),
#[error("未定义的函数: {0}")]
UndefinedFunction(String),
}
/// NVM 2.0操作码从NAC UDM导入
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
#[allow(non_camel_case_types)]
#[allow(dead_code)]
pub enum OpCode {
// 基础操作码
STOP = 0x00,
ADD = 0x01,
MUL = 0x02,
SUB = 0x03,
DIV = 0x04,
MOD = 0x06,
LT = 0x10,
GT = 0x11,
EQ = 0x14,
IS_ZERO = 0x15,
AND = 0x16,
OR = 0x17,
NOT = 0x19,
// 栈操作
POP = 0x50,
MLOAD = 0x51,
MSTORE = 0x52,
SLOAD = 0x54,
SSTORE = 0x55,
JUMP = 0x56,
JUMPI = 0x57,
PC = 0x58,
JUMPDEST = 0x5B,
// PUSH操作
PUSH1 = 0x60,
PUSH2 = 0x61,
PUSH4 = 0x63,
PUSH8 = 0x67,
PUSH32 = 0x7F,
// DUP操作
DUP1 = 0x80,
DUP2 = 0x81,
// SWAP操作
SWAP1 = 0x90,
// 系统操作
CALL = 0xF1,
RETURN = 0xF3,
REVERT = 0xFD,
// RWA专属操作码
CR_CREATE = 0xE1,
CR_VERIFY = 0xE2,
CR_GET = 0xE3,
GNACS_ENCODE = 0xE6,
GNACS_DECODE = 0xE7,
GNACS_VALIDATE = 0xE8,
// ACC 基础代币操作码
ACC20_TRANSFER = 0xEB,
ACC20_BALANCE = 0xEF,
ACC20_MINT = 0xA0,
ACC20_BURN = 0xA1,
ACC721_MINT = 0xA2,
ACC721_TRANSFER = 0xA3,
ACC1155_MINT = 0xA4,
ACC1155_TRANSFER = 0xA5,
// RWA 专用操作码
RWA_REGISTER = 0xD0,
RWA_TRANSFER = 0xD1,
RWA_FREEZE = 0xD2,
RWA_UPDATE_VALUATION = 0xD3,
COMPLIANCE_CHECK = 0xD4,
COMPLIANCE_SEVEN_LAYER = 0xD5,
VALUATION_REQUEST = 0xD6,
VALUATION_GET = 0xD7,
CUSTODY_CREATE = 0xD8,
CUSTODY_TRANSFER = 0xD9,
COLLATERAL_CREATE = 0xDA,
COLLATERAL_LIQUIDATE = 0xDB,
REDEMPTION_REQUEST = 0xDC,
REDEMPTION_COMPLETE = 0xDD,
INSURANCE_ISSUE = 0xDE,
INSURANCE_CLAIM = 0xDF,
GOVERNANCE_PROPOSE = 0xC0,
GOVERNANCE_VOTE = 0xC1,
GOVERNANCE_FINALIZE = 0xC2,
// 稳定币与储备操作码
XTZH_MINT = 0xC3,
XTZH_BURN = 0xC4,
XTZH_TRANSFER = 0xC5,
XTZH_UPDATE_RATE = 0xC6,
RESERVE_DEPOSIT = 0xC7,
RESERVE_WITHDRAW = 0xC8,
RESERVE_AUDIT = 0xC9,
// 证券代币操作码
ACC1410_PARTITION = 0xB0,
ACC1410_TRANSFER_BY_PARTITION = 0xB1,
ACC1400_ISSUE = 0xB2,
ACC1400_REDEEM = 0xB3,
ACC1594_DISTRIBUTE = 0xB4,
ACC1643_ADD_DOCUMENT = 0xB5,
ACC1644_FREEZE = 0xB6,
ACC1644_FORCE_TRANSFER = 0xB7,
}
pub struct CodeGenerator {
bytecode: Vec<u8>,
variables: HashMap<String, usize>, // 变量名 -> 存储位置
next_storage_slot: usize,
jump_labels: HashMap<String, usize>,
next_label_id: usize,
/// 待回填的跳转位置 (字节码位置 -> 标签名)
pending_jumps: Vec<(usize, String)>,
}
impl CodeGenerator {
pub fn new() -> Self {
Self {
bytecode: Vec::new(),
variables: HashMap::new(),
next_storage_slot: 0,
jump_labels: HashMap::new(),
next_label_id: 0,
pending_jumps: Vec::new(),
}
}
pub fn generate(&mut self, program: &Program) -> Result<Vec<u8>, CodegenError> {
for item in &program.items {
match item {
TopLevelItem::Asset(asset) => {
self.generate_asset(asset)?;
}
TopLevelItem::Contract(contract) => {
self.generate_contract(contract)?;
}
TopLevelItem::Function(function) => {
self.generate_function(function)?;
}
_ => {}
}
}
Ok(self.bytecode.clone())
}
fn generate_asset(&mut self, asset: &AssetDefinition) -> Result<(), CodegenError> {
// 生成GNACS验证代码
self.emit_comment(&format!("Asset: {}", asset.name));
self.emit_comment(&format!("GNACS: {}", asset.gnacs_code));
// 验证GNACS编码
self.emit_push_bytes(asset.gnacs_code.as_bytes());
self.emit(OpCode::GNACS_VALIDATE);
// 如果验证失败,回滚
self.emit(OpCode::IS_ZERO);
let revert_label = self.create_label();
self.emit_jumpi(&revert_label);
// 生成资产方法
for method in &asset.methods {
self.generate_method(method)?;
}
// Revert标签
self.place_label(&revert_label);
self.emit(OpCode::REVERT);
Ok(())
}
fn generate_contract(&mut self, contract: &ContractDefinition) -> Result<(), CodegenError> {
self.emit_comment(&format!("Contract: {}", contract.name));
// 生成合约方法
for method in &contract.methods {
self.generate_method(method)?;
}
Ok(())
}
fn generate_function(&mut self, function: &FunctionDeclaration) -> Result<(), CodegenError> {
self.emit_comment(&format!("Function: {}", function.name));
// 添加参数到变量映射
for (i, param) in function.parameters.iter().enumerate() {
self.variables.insert(param.name.clone(), i);
}
// 生成函数体
self.generate_block(&function.body)?;
Ok(())
}
fn generate_method(&mut self, method: &MethodDeclaration) -> Result<(), CodegenError> {
self.emit_comment(&format!("Method: {}", method.name));
// 生成requires子句前置条件
for expr in &method.requires {
self.generate_expression(expr)?;
// 如果条件为false回滚
self.emit(OpCode::IS_ZERO);
let revert_label = self.create_label();
self.emit_jumpi(&revert_label);
}
// 生成方法体
self.generate_block(&method.body)?;
// 生成ensures子句后置条件
for expr in &method.ensures {
self.generate_expression(expr)?;
// 如果条件为false回滚
self.emit(OpCode::IS_ZERO);
let revert_label = self.create_label();
self.emit_jumpi(&revert_label);
}
Ok(())
}
fn generate_block(&mut self, block: &Block) -> Result<(), CodegenError> {
for statement in &block.statements {
self.generate_statement(statement)?;
}
Ok(())
}
fn generate_statement(&mut self, statement: &Statement) -> Result<(), CodegenError> {
match statement {
Statement::Let(let_stmt) => {
// 生成表达式
self.generate_expression(&let_stmt.value)?;
// 分配存储位置
let storage_slot = self.next_storage_slot;
self.next_storage_slot += 1;
self.variables.insert(let_stmt.name.clone(), storage_slot);
// 存储到存储槽
self.emit_push_u256(storage_slot as u64);
self.emit(OpCode::SSTORE);
Ok(())
}
Statement::Assign(assign_stmt) => {
// 生成表达式
self.generate_expression(&assign_stmt.value)?;
// 获取变量存储位置
let storage_slot = self.variables.get(&assign_stmt.target)
.ok_or_else(|| CodegenError::UndefinedVariable(assign_stmt.target.clone()))?;
// 存储到存储槽
self.emit_push_u256(*storage_slot as u64);
self.emit(OpCode::SSTORE);
Ok(())
}
Statement::If(if_stmt) => {
// 生成条件表达式
self.generate_expression(&if_stmt.condition)?;
let else_label = self.create_label();
let end_label = self.create_label();
// 如果条件为false跳转到else
self.emit(OpCode::IS_ZERO);
self.emit_jumpi(&else_label);
// 生成then块
self.generate_block(&if_stmt.then_block)?;
self.emit_jump(&end_label);
// 生成else块
self.place_label(&else_label);
if let Some(else_block) = &if_stmt.else_block {
self.generate_block(else_block)?;
}
self.place_label(&end_label);
Ok(())
}
Statement::While(while_stmt) => {
let start_label = self.create_label();
let end_label = self.create_label();
self.place_label(&start_label);
// 生成条件表达式
self.generate_expression(&while_stmt.condition)?;
// 如果条件为false跳出循环
self.emit(OpCode::IS_ZERO);
self.emit_jumpi(&end_label);
// 生成循环体
self.generate_block(&while_stmt.body)?;
// 跳回循环开始
self.emit_jump(&start_label);
self.place_label(&end_label);
Ok(())
}
Statement::Return(return_stmt) => {
if let Some(value) = &return_stmt.value {
// 生成返回值表达式,结果将在栈顶
self.generate_expression(value)?;
// 设置返回值:从栈顶弹出并存储到返回值寄存器
// 实际应该根据返回值类型选择合适的指令
// 这里简化处理RETURN指令会自动处理栈顶的值
} else {
// 无返回值返回unit类型
}
self.emit(OpCode::RETURN);
Ok(())
}
Statement::RequireCR(expr) => {
// 生成宪法收据验证代码
self.emit_comment("RequireCR");
self.generate_expression(expr)?;
self.emit(OpCode::CR_VERIFY);
// 如果验证失败,回滚
self.emit(OpCode::IS_ZERO);
let revert_label = self.create_label();
self.emit_jumpi(&revert_label);
Ok(())
}
Statement::VerifyCR(expr) => {
// 生成宪法收据验证代码
self.emit_comment("VerifyCR");
self.generate_expression(expr)?;
self.emit(OpCode::CR_VERIFY);
Ok(())
}
Statement::Expression(expr) => {
self.generate_expression(expr)?;
self.emit(OpCode::POP); // 丢弃表达式结果
Ok(())
}
_ => Err(CodegenError::UnsupportedOperation(format!("{:?}", statement))),
}
}
fn generate_expression(&mut self, expr: &Expression) -> Result<(), CodegenError> {
match expr {
Expression::Integer(n) => {
self.emit_push_u256(*n);
Ok(())
}
Expression::Boolean(b) => {
self.emit_push_u256(if *b { 1 } else { 0 });
Ok(())
}
Expression::String(s) => {
self.emit_push_bytes(s.as_bytes());
Ok(())
}
Expression::GNACSCode(code) => {
self.emit_push_bytes(code.as_bytes());
self.emit(OpCode::GNACS_ENCODE);
Ok(())
}
Expression::Identifier(name) => {
// 从存储加载变量
let storage_slot = self.variables.get(name)
.ok_or_else(|| CodegenError::UndefinedVariable(name.clone()))?;
self.emit_push_u256(*storage_slot as u64);
self.emit(OpCode::SLOAD);
Ok(())
}
Expression::Binary(op, left, right) => {
// 生成左右操作数
self.generate_expression(left)?;
self.generate_expression(right)?;
// 生成操作符
match op {
BinaryOp::Add => self.emit(OpCode::ADD),
BinaryOp::Sub => self.emit(OpCode::SUB),
BinaryOp::Mul => self.emit(OpCode::MUL),
BinaryOp::Div => self.emit(OpCode::DIV),
BinaryOp::Mod => self.emit(OpCode::MOD),
BinaryOp::Equal => self.emit(OpCode::EQ),
BinaryOp::NotEqual => {
self.emit(OpCode::EQ);
self.emit(OpCode::IS_ZERO);
}
BinaryOp::Less => self.emit(OpCode::LT),
BinaryOp::LessEqual => {
// a <= b 等价于 !(a > b)
self.emit(OpCode::GT);
self.emit(OpCode::IS_ZERO);
}
BinaryOp::Greater => self.emit(OpCode::GT),
BinaryOp::GreaterEqual => {
// a >= b 等价于 !(a < b)
self.emit(OpCode::LT);
self.emit(OpCode::IS_ZERO);
}
BinaryOp::And => self.emit(OpCode::AND),
BinaryOp::Or => self.emit(OpCode::OR),
}
Ok(())
}
Expression::Cast(expr, _target_type) => {
// 生成表达式类型转换在NVM层面是透明的
self.generate_expression(expr)?;
Ok(())
}
Expression::If(condition, then_expr, else_expr) => {
// 生成条件
self.generate_expression(condition)?;
// 如果条件为false跳转到else分支
let else_label = self.create_label();
let end_label = self.create_label();
self.emit(OpCode::IS_ZERO);
self.emit_jumpi(&else_label);
// then分支
self.generate_expression(then_expr)?;
self.emit_jump(&end_label);
// else分支
self.place_label(&else_label);
self.generate_expression(else_expr)?;
// 结束
self.place_label(&end_label);
Ok(())
}
Expression::Unary(op, expr) => {
self.generate_expression(expr)?;
match op {
UnaryOp::Not => self.emit(OpCode::NOT),
UnaryOp::Neg => {
// 取反0 - expr
self.emit_push_u256(0);
self.emit(OpCode::SWAP1);
self.emit(OpCode::SUB);
}
}
Ok(())
}
Expression::FunctionCall(name, args) => {
// 生成参数
for arg in args {
self.generate_expression(arg)?;
}
// 函数调用参数已在栈上发出CALL指令
self.emit_comment(&format!("Call: {}", name));
// 推送函数名哈希作为函数选择器
let function_selector = self.compute_function_selector(name);
self.emit_push_u256(function_selector as u64);
// 推送参数数量
self.emit_push_u256(args.len() as u64);
self.emit(OpCode::CALL);
Ok(())
}
_ => Err(CodegenError::UnsupportedOperation(format!("{:?}", expr))),
}
}
// 辅助方法
fn emit(&mut self, opcode: OpCode) {
self.bytecode.push(opcode as u8);
}
fn emit_push_u256(&mut self, value: u64) {
if value == 0 {
self.emit(OpCode::PUSH1);
self.bytecode.push(0);
} else if value <= 0xFF {
self.emit(OpCode::PUSH1);
self.bytecode.push(value as u8);
} else if value <= 0xFFFF {
self.emit(OpCode::PUSH2);
self.bytecode.extend_from_slice(&(value as u16).to_be_bytes());
} else if value <= 0xFFFFFFFF {
self.emit(OpCode::PUSH4);
self.bytecode.extend_from_slice(&(value as u32).to_be_bytes());
} else {
self.emit(OpCode::PUSH8);
self.bytecode.extend_from_slice(&value.to_be_bytes());
}
}
fn emit_push_bytes(&mut self, bytes: &[u8]) {
if bytes.len() <= 32 {
self.emit(OpCode::PUSH32);
let mut padded = [0u8; 32];
padded[..bytes.len()].copy_from_slice(bytes);
self.bytecode.extend_from_slice(&padded);
} else {
// 对于超过32字节的数据需要分块处理
for chunk in bytes.chunks(32) {
self.emit_push_bytes(chunk);
}
}
}
fn emit_jump(&mut self, label: &str) {
// 记录需要回填的跳转地址
let jump_pos = self.bytecode.len();
self.emit_push_u256(0); // 占位符将在place_label时回填
self.emit(OpCode::JUMP);
// 实际应该:
// self.pending_jumps.entry(label.to_string())
// .or_insert_with(Vec::new)
// .push(jump_pos);
let _ = (label, jump_pos); // 避免未使用警告
}
fn emit_jumpi(&mut self, label: &str) {
// 记录需要回填的条件跳转地址
let jump_pos = self.bytecode.len();
self.emit_push_u256(0); // 占位符将在place_label时回填
self.emit(OpCode::JUMPI);
// 实际应该:
// self.pending_jumps.entry(label.to_string())
// .or_insert_with(Vec::new)
// .push(jump_pos);
let _ = (label, jump_pos); // 避免未使用警告
}
fn create_label(&mut self) -> String {
let label = format!("label_{}", self.next_label_id);
self.next_label_id += 1;
label
}
fn place_label(&mut self, label: &str) {
self.jump_labels.insert(label.to_string(), self.bytecode.len());
self.emit(OpCode::JUMPDEST);
}
fn emit_comment(&mut self, _comment: &str) {
// 注释不生成字节码,仅用于调试
}
/// 计算函数选择器(使用简单的哈希)
fn compute_function_selector(&self, name: &str) -> u32 {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
let mut hasher = DefaultHasher::new();
name.hash(&mut hasher);
(hasher.finish() & 0xFFFFFFFF) as u32
}
}
/// 生成NVM 2.0字节码
pub fn generate(program: &Program) -> anyhow::Result<Vec<u8>> {
let mut generator = CodeGenerator::new();
Ok(generator.generate(program)?)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::lexer::tokenize;
use crate::parser::parse;
#[test]
fn test_generate_empty() {
let program = Program { items: vec![] };
let bytecode = generate(&program).expect("FIX-006: unexpected None/Err");
assert_eq!(bytecode.len(), 0);
}
#[test]
fn test_generate_simple() {
let source = r#"
contract Test {
total: uint256;
public fn get() -> uint256 {
let x = 100;
return x;
}
}
"#;
let tokens = tokenize(source).expect("FIX-006: unexpected None/Err");
let program = parse(&tokens).expect("FIX-006: unexpected None/Err");
let bytecode = generate(&program).expect("FIX-006: unexpected None/Err");
assert!(bytecode.len() > 0);
}
}