合约docs/contracts/core.md

整数内核与 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 操作补齐。

json
{
  "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 的 新应用无需新矩阵;新增共识操作可能需要协议升级。应测试所有允许的分支, 包括恢复和关闭。

ParanO(1)d 技术文档共识行为以源代码为准。