概述
什么是 UTXO_Compiler
UTXO_Compiler(可执行文件名 utxo_compiler)是一个面向比特币 UTXO 模型的智能合约编译器。它接受以 .ct 为扩展名的高级合约源文件,将其编译为可嵌入比特币交易锁定脚本的 BVM 字节码。
合约语言的语法脱胎于 Python——使用缩进划分代码块、def 定义函数——但加入了强制类型声明和一套编译期所有权检查机制,帮助开发者在部署前发现数据误用问题。
比特币智能合约的运作方式
UTXO 模型
与以太坊的账户模型不同,比特币采用 UTXO(Unspent Transaction Output,未花费交易输出) 模型。每一笔比特币交易消耗若干旧的 UTXO,同时产生新的 UTXO。
每个 UTXO 携带两样东西:
- 聪(satoshis):这个输出锁定了多少比特币
- 锁定脚本(locking script):一段字节码,规定了"什么条件下才能花费这笔钱"
花费 UTXO 时,发起方需要在交易输入中提供解锁脚本(unlocking script)。只有当解锁脚本与锁定脚本联合执行后结果为真,花费才被网络认可。
上一笔交易的输出 当前交易
┌──────────────────┐ ┌──────────────────────┐
│ value: 100000聪 │ ─────────▶│ 输入:解锁脚本(钥匙) │
│ 锁定脚本(密码锁) │ │ 输出:新的锁定脚本 │
└──────────────────┘ └──────────────────────┘
锁 钥匙 + 新锁智能合约就是在锁定脚本里写入自定义逻辑:不只是验证签名,还可以验证时间、数据格式、多方条件等任意可编程条件。
BVM 是什么
BVM(Bitcoin Virtual Machine)是执行锁定脚本/解锁脚本的底层虚拟机,是一台基于栈的状态机。它没有堆,没有全局变量,只有两个栈(主栈和副栈)和一组操作码。
UTXO_Compiler 将你的高级合约代码翻译成 BVM 能直接执行的操作码序列。理解 BVM 的栈模型,是读懂编译器行为和所有权系统的关键。更多内容见 比特币基础。
UTXO_Compiler 是如何工作的
合约源码 (.ct)
│
▼
┌──────────┐
│ 词法分析 │ 将源码切分为 Token 流(关键字、标识符、字面量…)
└──────────┘
│
▼
┌──────────┐
│ 语法分析 │ 构建抽象语法树(AST)
└──────────┘
│
▼
┌──────────┐
│ 语义分析 │ 类型检查 · 所有权验证 · 作用域解析
└──────────┘
│
▼
┌──────────┐
│ 字节码生成 │ AST Visitor 遍历 → BVM 操作码序列
└──────────┘
│
▼
JSON 格式字节码(锁定脚本内容)整个编译流程由内部的 Pass Manager 驱动,各阶段以独立 Pass 的形式注册执行。
语言的核心设计取舍
显式类型声明
所有函数参数、结构体字段都必须声明类型。没有自动类型推断,没有 var / auto。这看起来有些繁琐,但在 BVM 这种零容错环境里,"你在代码里看到什么,栈上就发生什么"是比简洁更重要的属性。
编译期所有权检查
局部变量在被传入内置函数或赋值给其他变量后,原变量即被"消耗",之后不能再次引用。这个机制直接对应 BVM 的栈弹出语义——在底层,变量被使用就意味着栈上的值被弹走了。所有权系统让编译器在编译期就捕获这类错误,而不是等到链上执行时出错。
合约状态固化在字节码中
合约成员变量会被直接编译进字节码本身,需要用户在字节码中用不同数据替换以生成不同的锁定脚本。这是 UTXO 模型"状态即代码"特性的直接体现,与以太坊那种"合约地址 + 链上存储"的模型有根本区别。
单合约文件
每个 .ct 文件包含且仅包含一个合约。这与"一个 UTXO 对应一段锁定脚本"的模型天然对齐。
与其他方案的横向对比
UTXO_Compiler .ct | sCrypt (BSV) | Bitcoin Script(原生) | |
|---|---|---|---|
| 抽象层级 | 高级语言 | 高级语言 | 汇编级 |
| 语法风格 | Python-like | TypeScript-like | 操作码序列 |
| 类型系统 | 强类型 | 强类型 | 无类型 |
| 所有权检查 | ✓ 编译期 | ✗ | — |
| 调试工具 | 内置交互式调试器 | 插件支持 | 无 |
| 构造函数 | 手动嵌入 | ✓ | 手动嵌入 |
下一步
- 安装 — 配置编译环境