整数内核与 ABI
所有合约使用同一套 v2 区块关系。ABI 3 承诺 16 条指令、两个持久化
无符号 64 位寄存器(state0、state1)、不可变授权规则和收款地址。
每次调用时,两个临时寄存器(scratch0、scratch1)从零开始。应用无需注册,
也无需生成专用矩阵或单独证明。
指令
| 操作码 | 对目标寄存器的作用 |
|---|---|
keep |
保留原值 |
move |
复制左操作数 |
add, subtract |
检查边界的无符号加减 |
min, max |
取两个操作数的最小值或最大值 |
less_than, equal |
写入布尔值 0 或 1 |
assert_equal, assert_less_or_equal |
比较为假则拒绝,保留目标原值 |
断言失败、溢出、下溢或非布尔谓词都会拒绝调用,不使用回绕运算。 指令顺序执行,后续指令能读取之前的写入。继续调用时,最终持久寄存器对成为 后继状态。关闭时仍执行程序,但不创建后继。
每条指令选择四个寄存器之一作为目标、两个操作数和一个谓词。谓词为
always、before_deadline、terminal、has_payout、scratch0 或
scratch1,inverted 对所选布尔值取反。未激活的指令保持目标不变。
末尾未使用的指令以规范 keep 操作补齐。
{
"opcode": "add",
"destination": "state0",
"left": "state0",
"right": "one",
"predicate": {"source": "terminal", "inverted": true},
"immediate": "0"
}
这个例子统计继续调用次数。它只是一条指令,不是完整支出策略。 必填的显式策略字段见 API 集成。
操作数
| 分类 | 名称 |
|---|---|
| 寄存器 | state0, state1, scratch0, scratch1 |
| 常量 | immediate, zero, one |
| 上下文 | height, fee, payout, retained, input_amount |
| 标志 | before_deadline, after_deadline, terminal, has_payout |
| 输出 1 的所有者 | payout_owner0, payout_owner1, payout_owner2, payout_owner3 |
| 精确实例及槽位 | input_creation_id, input_slot, retained_slot, payout_slot |
height 是纳入区块的高度。before_deadline 表示 height < deadline,
after_deadline 包括相等情况。没有直接读取 deadline 的操作数;其他边界可用
指令立即数表示。所有者字为规范 32 字节所有者承诺的四个小端 u64。
程序上下文对应物理输出位置。 retained、retained_slot 始终对应输出 0;
payout、payout_slot 和所有者字对应输出 1。关闭时,输出 0 向关闭收款人付款,
输出 1 不存在。因此内核将关闭金额视为 retained,且 payout = 0;RPC 的
语义结果则将其显示为付款、合约剩余余额为零。自定义程序应使用 terminal
区分这两种情况。
策略与承诺
不可变策略包含领取与恢复分支的授权方、收款人、截止高度、手续费上限、 单次付款上限、最低保留金额及五个模式标志。标志分别允许两个分支继续或关闭, 并可允许继续付款采用任意收款人。不存在隐式管理员。 准确的分支与金额规则见生命周期。
三个域分离承诺分别绑定程序(CNTCODE_)、策略(CNTPOL__)及活对象状态
(CNTOBJ__)。最终 32 字节承诺编码为合约地址。修改任一持久计数器会改变
地址。钱包按不可变条款组织相关状态,这只是本地分组,并非全局注册的合约账户。
规范公开 opening 为 699 字节:
| 字段 | 字节 |
|---|---|
NOIDOBJ3 标记及小端 ABI 版本 |
8 + 2 |
| 16 对指令描述符及立即数 | 16 × 32 |
| 打包持久状态 | 16 |
| 两个授权方及两个收款人 | 4 × 32 |
| 截止高度 | 8 |
| 手续费上限、保留额、付款上限及模式字节 | 8 + 8 + 8 + 1 |
每个描述符及立即数占一个小端 128 位字段。描述符使用 20 位:操作码 4、
目标 2、左操作数 5、右操作数 5、谓词 3、反转 1。其余位必须为零,立即数
必须在 u64 范围内。持久状态低 64 位是 state0,高 64 位是 state1。
请使用提供的编码器或 API,不要自行设计序列化。
JSON 中,计数器和指令立即数使用规范十进制字符串,范围从 "0" 到
"18446744073709551615"。不接受前导零、符号或浮点数。其他整数 API 字段
保留文档规定的数值格式,客户端必须无损处理。
适用范围
内核支持独立出资、有界的权利:预算、委托支出、延迟访问、定期领取和分期释放。 没有循环、无限存储、跨合约调用、网络访问或自动计时器。执行需要授权交易。 每个出资输出有自己的计数器,两笔存款不会形成一个共享预算。
程序和策略不能原地升级;可通过允许的付款将价值转入新条款。符合 ABI 的 新应用无需新矩阵;新增共识操作可能需要协议升级。应测试所有允许的分支, 包括恢复和关闭。