Stamps 的 OLGA 编码:把文件切成 32 字节,一排 P2WSH 输出装进去 图 1
Stamps 的 OLGA 编码:把文件切成 32 字节,一排 P2WSH 输出装进去 · 图 1

“把图片永久写进比特币”这句话,真正决定成本的是编码方式。Bitcoin Stamps 的 OLGA(Octet Linked Graphics & Artifacts)改进提案,就是为了改掉 Classic Stamp 那套 base64 多签写法的浪费而提出的,提案原文把账算得很细。

base64 为什么贵:六比八

提案先给出一个算术:base64 把 24 位(3 字节)二进制编码成 4 个字符,也就是 32 位,效率是 24 比 32,即每 1 字节原始数据要 8 位里的 6 位。放在比特币交易里,就是 3 字节的文件要用 4 字节来存。Classic Stamp 还使用多签交易编码,三个输出里只有两个被用来承载数据。两重折扣叠加,才出现提案表格里那组数字:一个 2853 字节的 Classic Stamp,交易体 8579 字节(3.0 倍),烧掉 73,000 聪,平均到每字节约 26 聪;同一尺寸的 OLGA(示例文件 2474 字节),交易 3613 字节(1.5 倍),烧 27,306 聪,每字节约 11 聪。提案的结论是:OLGA 比 Classic 便宜一半以上。

Stamps 的 OLGA 编码:把文件切成 32 字节,一排 P2WSH 输出装进去 图 2
Stamps 的 OLGA 编码:把文件切成 32 字节,一排 P2WSH 输出装进去 · 图 2

编码规则只有四步

OLGA 的规范部分非常短:

1. 在文件字节前面加一个两字节的整数,标明文件大小
2. 把整段字节流切成 32 字节的块
3. 最后一块用空字节补齐到 32 字节
4. 每一块转成一个 P2WSH 地址,作为交易输出挂上

32 字节不是随意取的:那正是 P2WSH 输出脚本数据部分的长度。这些输出因为只放了极少量 dust,实际效果是造出”几乎永久存在的 UTXO”,代价是烧掉那点 dust。提案同时提醒,这套方法基于”把文件存进 P2WSH 输出”的思路(原文归功于 JP Janssen,并引用 Counterparty 的 CIP-0033)。

怎么和 Classic 区分开

链上要有个标记,规则写在发行交易里:同一笔交易要带合法的 op_return 或 multisig Counterparty 发行记录,资产描述必须以 STAMP: 开头且不区分大小写;冒号后面的字符目前被忽略、留作将来使用;为了避免和 Classic Stamp 冲突,冒号后如果跟着 base64 数据,这笔交易可能会被 Bitcoin Stamps 判定为不收录。资产本身必须是数字资产,不能是有名字或子资产的资产。生效门槛也写死了:OLGA 编码的 Stamps 只在比特币区块高度 833,000 及之后才算有效。官方索引器仓库的 README 给出了各协议分别采用 OLGA 的区块:Classic Stamps 在 833,000、SRC-20 在 865,000、SRC-101 在 940,000。

单文件能存多大

容量受节点默认规则限制:标准节点最多接受 200 个输出,其中一个要留给 op_return、一个留给找零,于是剩 198 个 P2WSH 输出,即 198 乘 32 再减去那 2 字节长度前缀,最大约 6334 字节。提案还补了一句理论上限:只受两字节长度前缀约束的话,可达 65536 字节,但那需要节点接受非标准规则的交易的。

收藏者该怎么用这些信息

同一枚图在两种编码下成本可以差一倍以上,这解释了为什么不同 Stamps 的铸造费用与”每字节价格”看起来不齐。判断一枚藏品是哪种写法,可以看交易的输出结构与资产描述前缀:一串 32 字节的 P2WSH 输出指向 OLGA,STAMP: 后面直接跟 base64 则属于 Classic 路径。文件类型的取舍也值得记住:提案聚焦 PNG、JPG、GIF、SVG,并列出被排除的类型,其中包括纯文本、octet-stream、js、css、x-empty 与 json。

为什么偏偏是 32 字节,答案在地址结构里:P2WSH 输出的脚本数据部分就是 32 字节,把文件切成这个长度,一段数据正好对应一个输出的脚本哈希。这也是提案把“效率账”算清的原因——base64 用 8 位承载 6 位有效信息,多签三输出只有两个可用,两处折扣叠在一起;OLGA 直接放二进制,且每个输出都用来承载内容,所以交易只比文件本身大一半。至于这些输出为什么“几乎永久”,是因为它们只放了极少量 dust:花掉它付出的手续费往往得不偿失,于是数据长期留在未花费集合里。

对照另一条路线可以更明白这类取舍的意义:OP_RETURN 的输出属于可修剪部分,节点在需要时可以不再保存这部分历史数据;而放进普通输出的数据,提案的说法是可以被所有全节点一直保留。于是同一张图有三种写法——放在可花的多签输出里(Classic,之后可能被花掉)、放在不可花的 P2WSH 输出里(OLGA 加 Key Burn 的思路)、或者放进 OP_RETURN(省费但可被修剪)。这三种选择的差别不是画质,而是若干年后由谁负责还能读到它。铸造费的差异也应放到这个框架里理解,而不是简单比大小。

本文为机制说明,不构成任何投资建议。