Runes 的 edict 分币算术:截断、全给与余数前置三条规则 图 1
Runes 的 edict 分币算术:截断、全给与余数前置三条规则 · 图 1

Runes 协议常被概括成”在比特币 UTXO 上记代币账”,但真正把余额从旧输出搬到新输出的,是一个叫 edict(指令)的小结构。按官方文档(ord 手册 Runes 规格页)的定义,每条 edict 只有三个字段:id(符文 ID,由刻印区块高度加交易序号组成)、amount(数量,协议最小单位)、output(目标输出序号)。解析器把 runestone 里的数字流按顺序解成若干条 edict,逐条执行,规则短小但每一句都有现实后果。

执行前,解析器先凑出一个”未分配池”:交易全部输入里携带的该符文数量,加上本笔交易刻印的预挖(premine)或铸造(mint)所得,暂时都不属于任何输出。第一条规则是顺序与扣减:每执行一条 edict,就从该符文未分配池中扣 amount、加到 output 号输出的分配额上。第二条规则是截断:如果某条 edict 想分配的数量超过当前未分配余额,amount 会被自动降到余额数——即”有多少分多少”,而不是报错回滚。这意味着清单写错超额时,交易照样成功,只是最后一个收到分配的输出拿得比预期少,核对时必须以链上结果为准。第三条规则是”全给”:amount 写零,表示把该符文当前剩余的全部未分配数量都给这个输出,适合”把零头都归我”的收尾行。

特殊值 id 用 0:0 表示”本笔交易正在刻印的那枚符文”——因为刻印的符文 ID 要到打包成块才知道,清单里没法预先写死,协议用这个占位符解决鸡生蛋问题。

输出号也有约定。当 output 恰好等于交易的输出总数时,edict 的含义从”给某个输出”切换成”按顺序把 amount 分给每一个非 OP_RETURN 输出”,像发工资一样逐人定额;若同时 amount 为 0,则把未分配余额在所有非 OP_RETURN 输出间平均分:除以输出数,除不尽的余数 R 逐一分给前 R 个输出,保证总数守恒。这套”整除加余数前置”的确定性算法,让任何节点对同一笔交易的分配结果算得完全一致。

最后是失败边界。任何一条 edict 的输出号大于等于输出总数,或者 id 的区块为 0 而交易序号非 0,整块 runestone 就被判为 cenotaph(衣冠冢):所有 edict 都不执行,交易输入里的全部符文直接烧毁。加上”未分配的余额流向第一个非 OP_RETURN 输出或由 pointer 字段指定输出""进入 OP_RETURN 输出的符文视为销毁”这两条兜底规则,Runes 的转账语义才算闭合。理解这些规则的价值在于签名前自救:钱包展示的只是意图,链上执行永远按这套算术来。

对签名者来说,这套规则真正有用的部分是”执行前自测”。钱包显示的只是它对你意图的理解,链上结果由 edict 算术决定,所以任何一笔大额 Runes 转账,都值得先用同构的小额交易彩排:同样的输入挑选、同样的输出顺序、同样的 edict 清单,金额缩小一百倍。跑完之后去区块链浏览器把揭示出来的 runestone 解码一遍,比对每个输出实际分到的数量与你的预期;一旦看到 cenotaph 的迹象——输入 Rune 全部消失、分配没有发生——说明清单里有字段越界或格式问题,这笔学费远低于正式转账的等值损失。还要注意两次调用的语义差异:0:0 占位符只在刻印当笔交易里有意义,复用到后续转账时它不再指向任何存在的符文;均分模式会把余额撒遍所有非 OP_RETURN 输出,其中包括你自己的找零输出——不想要找零位上留币,就得在构造交易时控制输出总数。规则是确定性的,风险从来只发生在你对清单的想象和交易的实际结构不一致的那一瞬间。

顺带厘清 Runes 与铭文同笔共存的边界:一枚 edict 只管符文数量,比特币与铭文的落点靠 UTXO 规则决定,想给某个输出带铭文,要按聪的数量与顺序安排输出,而不是指望 edict 顺带搬运。实际钱包体验里”转 Runes 时把附带铭文一起送走""比特币被拆成零钱”这类意外,多数源于两套分配规则被当成一套。签名前把交易的输出列表逐行看一遍——谁拿到符文、谁拿到聪、哪行是 OP_RETURN 的销毁与凭证——两分钟的阅读习惯,恰好站在协议与事故的边界上。 本文为机制说明,不构成任何投资建议。

Runes 的 edict 分币算术:截断、全给与余数前置三条规则 图 2
Runes 的 edict 分币算术:截断、全给与余数前置三条规则 · 图 2