CRC-30
技术白皮书

CRC-30

版本 v1.0 2026 年 10 月 运行于比特币主网

比特币让每一笔付款永久公开,也让每一笔付款永久可追。 CRC-30 分三层把这件事拆开:发行层用公开曲线在主网上铸出资产, 每一分钱都可以独立复算;隐私层用一次签名推导出无法回溯的盲地址, 所有权与公开地址之间不再有对应表;交换层让成交直接成为一笔比特币交易, 没有池子、没有做市商、没有第三方持有你的币。 三层各自独立,任何一层都无法单独改写规则。

当前状态
已上线 :发行层的 mint(02)与盲地址推导(03)。这两部分是真在跑的:每一笔付款都落在比特币主网,任何人都能独立重放出同样的份额。
尚未上线 :CRC-30 发射台(见 06)、Swap 交易界面(07)、以及 ZK 隐私协议本身(04、05)。它们在下面以设计形式写清,页面上标注为「待开放」,不会让人误以为已经能用。
这一页不承诺 :ZK 部分尚未实现,我们不写「已具备隐私」。能藏住的是所有权与地址之间的对应关系;付款本身在链上依然是公开的,这一点我们不回避。

00盲地址:一次签名的产物

把信纸放进内衬复写纸的信封,签名者只在封口签名,笔尖的压力透过复写层印在信纸内部。 拆开信封,你拿到一封签名者从未读过的信。[1]

CRC-30 的盲地址是同一个构造的比特币版本,但它不存储。 这一点必须说清楚:如果服务端存了哪怕一张 {公钥地址, 盲地址} 的表, 那么拿到这份数据的人——运维、备份的持有者、一次数据库泄露、一纸传票—— 就能把整张对应表导出来。那不是txOr("y_whitepaperd85188838","降级"),是这个产品唯一的承诺直接归零。 存成哈希或密文也没用:写入请求自带 IP 与时间戳,而对应的付款几秒后就落在链上,两边一对就出来了。

也不能从公钥推导。bc1p(P2TR)地址本身就是 x-only 公钥的 bech32m 编码, 盲地址 = f(公钥) 意味着任何人拿着地址就能算出来, 不需要访问本站,全链回溯就够。这是最坏的一种txOr("y_whitepaper56d2f38fe","看起来很干净")的方案。

所以只剩一条路:从签名推。签名需要私钥,除你之外谁也产生不了; 而地址是签名的函数,不需要被存储——换台设备重新签一次,同一个地址就回来了。

message = "address: " + 你的比特币地址
sig ← wallet_sign(message)
seed = HKDF-SHA256(sig, salt = "crc30.example", info = "CRC-30/blind-id/v1")
crc1 = "crc1" + base36(seed[0..95])  共 100 位,约 2491 空间

⚠️ 签名的确定性是前提。 SHA-256 只有 32 字节,而地址要 95 个 base36 字符, 直接喂进去会在第 32 个字符处耗尽熵。所以先用 HKDF 扩展到 120 字节。 另外,若钱包返回的签名不是逐字节稳定的(Taproot 的 Schnorr 每次带新鲜随机数), 推出来的地址每次都会变——而且因为什么都不存,txOr("y_whitepaperd8edae8ec","漂移")与txOr("y_whitepaper68343a3ee","新用户")在本地无法分辨。 本站的适配层对 ECDSA 显式锁定 RFC 6979 确定性,并在同一会话内二次派生时比对,不一致就报警。

01三层结构

三层互不依赖。发行层不知道隐私层的存在,隐私层不需要 Swap 层的撮合,Swap 层不经手任何资产。

发行层 · 已上线公开曲线 · 条款签名 · 链上重放
隐私层盲地址 · 加密票据 · ZK 证明
合约层CRC-30 covenant
交换层0x83 阶梯报价 · 直换
BTC比特币主网 · 标准交易 · 无软分叉

合约层采用 CRC-30:每一条 deploy / mint / transfer 都是携带唯一规范 OP_RETURN 的标准比特币交易;铸出的份额锁在 Taproot covenant 输出里, 由 32 字节 CMR、owner key 与 CSV 相对时间锁定义txOr("y_whitepaper9c942848a","何时能被谁取走")。 地址本身就是状态:花这笔输出时必须暴露的脚本路径由比特币共识校验, 而不是由某个索引器的判断决定。[2]

02发行:mint

总量 21,000,000 CRC = 21,000 份 × 每份 1,000 枚。 第 1 份 $1.00,每往后一份 +$0.01,第 21,000 份 $210.99。

为什么是份,不是枚

枚数可以任意切分,份数不能。一份是 1,000 枚,多付的钱可以买第 74 份的 41.6%, 下一个人就从 41.6% 接着买。这个txOr("y_whitepaper1a6d3b994","可以切、但永远接着走")的性质, 让任意大小的一笔付款都能落在曲线上,且不破坏任何人的位置。

计价

付款按价格折成美元:价值 = 数量 × 价格。BTC 与 ORDI 一视同仁,没有加成。 价格默认是签名那一分钟的现价(精确到分钟),付款人也可以在 K 线上点选之前任意一天的 UTC 日收盘价,甚至有史最高的那一天。价格与它的时间一起写进钱包签名的条款里。

第 k 份价格$0.99 + $0.01k
全部 21,000 份名义总额$2,225,895
最小付款546 sat(P2TR 粉尘下限之上)
BTC 计价上限$130,000 / BTC
ORDI 计价上限$100 / ORDI

计价上限是强制生效的,而且同一个函数要经过四处:浏览器预览、条款文字、 服务端绑定、索引重放。任何一处单独算,价格就会对不上—— 条款里签的是 130,000、结算却按 200,000 计,签名就成了空承诺。

流程与绑定

  1. 向本站索取一个收款地址(10 个地址轮换,派发次数最少的一批中随机取一个)。
  2. 钱包显示条款原文,签名前能逐字读到:付什么、按什么价、付到哪个地址、nonce。
  3. 服务端逐字节重建条款并验签,托管这份签名。
  4. 用户付款。服务端在重放时按 deposit + nonce + 金额 + 资产 精确绑定这一笔。

条款与付款的绑定是资金正确性的关键。同一个收款地址会被派发给多个人, 所以只比地址一定会错配——有人多拿、有人少拿。数据库层用唯一索引兜住: 一份条款只能绑一次,一笔付款只能绑一条条款。这不是应用层的自觉,是存储层的约束。

关闭与销毁

铸造是固定窗口:先等到开始时刻,开放 30 天,不是txOr("y_whitepaper37281569c","随时开放 N 天")。满足任一条件即关闭: 21,000 份全部铸完,或到达 2026-11-22 12:00 UTC(北京时间 11-22 20:00,即开始时刻 2026-10-23 12:00 UTC 之后 30 天)。 未 mint 出的份额于该时刻销毁——总量永远是 21,000,000,销毁只销毁txOr("y_whitepaper51a45bbe0","还没 mint 出来的那部分")。

这个截止时刻在三处强制执行,因为接口层的拒绝挡不住任何人:

  • 派发地址:到期后 /api/deposit 返回 409。
  • 受理条款:到期后不再受理新条款。但已经签过、还没付款的条款仍然结算—— 拒绝的是txOr("y_whitepaper520d33144","现在开始铸"),不是txOr("y_whitepaper11607fb4b","让已签的条款失效")。突然作废别人刚签的东西比按规则算份额恶劣得多。
  • 链上重放(最终防线):任何人绕过本站直接转账到收款地址都是完全合法的, 他不需要本站的任何许可,接口层的 409 一行都拦不住。所以制度最终落在重放里: 按该笔付款自己的区块时间判定,关闭时刻之后确认的不铸份额。 过期付款仍落库(链上事实不能抹掉),只是不带份额。

同样的三处也强制执行开始时刻:在 2026-10-23 12:00 UTC 之前,派发地址与条款受理一律拒绝, 重放里按付款自己的区块时间判定,开始前到账的付款同样不铸份额。 也就是说窗口两端是对称的——开始前打进来的钱和结束后打进来的钱一样铸不出份额, 只是原因不同。这样"谁在什么时候能 mint"才是链上可复算的规则,而不是我们的一句话。

03盲地址 crc1

crc1 共 100 位(5 位前缀 + 95 位 base36)。它与你的公开地址之间不存在、也不存储任何对应关系。 换设备重新签一次,同一个地址会回来——因为它是签名的函数,不是一次查询的结果。

页面上一律画成 crc1 加 16 个遮蔽符号,一个真字符都不露。 这不是美观考虑:哪怕只露 5 位尾巴,在几百行的列表里那就成了主键, 两行尾巴相同就能把两组公开地址并成同一个人。

04加密票据与 nullifier · 尚未上线

Blind 协议用加密票据承载价值:票据是链下一段密文,只有持币人知道内容。 花掉它时公开一个 nullifier(nullifier hash)——它指向某张票据, 但无法反推出是哪一张,因此无法把txOr("y_whitepaper91531ab72","花掉的")和txOr("y_whitepaper07aa9264e","持有的")对应起来。

每次转移都附一个零知识证明,证明"我知道这张票据的 spending key, 而它确实在系统内且尚未被花掉txOr("y_whitepaper5524c53e4", ",但不证明任何具体金额或接收方。") + '[3]'

这一节目前是设计,不是实现。本站没有部署 Groth16 电路、没有信任设置仪式、 没有可用的 nullifier 集合。下面 05 与 09 描述的隐私属性,是这套设计成立后会得到的, 不是现在就能用的。想要隐私转账的人,现在请不要把大额放进盲地址流程。

05重放 · 部分已上线

比特币只负责发布与排序,不理解任何规则。协议的全部账目由索引器从链上重放得出, 而任何一次正确的重放都得到同一个状态。

发行层的重放规则是确定的:把付款按 (height, blockTime, vout, txid) 全序排列, 逐笔套用已签名的条款,用同一个曲线函数累计。 之所以要 blockTime 与 txid 参与排序键: 光靠 (height, vout) 无法区分同一高度同一 vout 的两笔不同交易 (尤其都在内存池、height=0),而排序比较器返回 0 时不保证稳定, 结果就是同一份数据两次重放出不同顺序、份额区间出现空洞。

关闭时刻是一道硬闸门,落在重放里而不是接口里:付款按自己的区块时间判定, 关闭之后确认的不铸份额(见 02)。

06CRC-30 发射台 · 界面已上线,交易待开放

发射台让任何人在比特币主网上部署自己的 covenant token。三步,与 BRC-20 同构:

  • deploy:一条 OP_RETURN 声明代号、总量与每次铸造上限。一条链只有一个起点。
  • mint:每次不超过上限,多铸几次直到铸完。余额由索引器从链上重放。
  • transfer:OP_RETURN 里列出txOr("y_whitepaper9d3e23c48","哪些输出、转多少、转给谁")。
deploy: {"p":"crc-20","op":"deploy","tick":"…","max":"…","lim":"…"}
mint: {"p":"crc-20","op":"mint","tick":"…","amt":"…"}
transfer:["crc-20","transfer","…",[[输出序号,数量,地址], …]]

铸出的份额锁在 Taproot covenant 输出里。锁定期随发行进度加深: 前 10% 锁 144 块(约 1 天),10%–60% 锁 1,008 块(约 7 天),60% 之后锁 4,320 块(约 30 天)。 规则写在 UTXO 里,索引器说什么都不影响这一点。

有一条边界值得单独说明:铭文原文里不放收款地址。 链上能看到txOr("y_whitepaper30d05618f","有人铸了 1,000,000 个 X"),看不到txOr("y_whitepapere523a886e","铸给了谁")—— 否则发射台就成了反向的隐私黑洞,与本协议的承诺相冲突。

当前状态:交易待开放。页面上可以填表、看到将要写入的字节、看到锁的规格, 但不会连接钱包、不会签名、不会广播。上线时只换数据源。

07Swap:0x83 阶梯报价 · 界面已上线,交易待开放

成交直接是一笔比特币交易:你的输入 UTXO 和对方的输入 UTXO 在同一笔交易里 各自落到对方名下。全过程没有平台钱包,没有池子,没有做市商—— 我们的服务器不接触你的币,也无权改动任何一笔交易。

挂单用 0x83 这个签名位:0x83 = SIGHASH_SINGLE | ANYONECANPAY。 它只对txOr("y_whitepaperad4fe584d","这一个输出 + 这一笔交易")有效,链上任何人都改不动你的签名, 也抢不走挂单里的币。吃单方把同一笔交易构造出来,你的 UTXO 直接落到他的地址。

卖方可以按档位加价:卖得越多,单价越高。买方可以只吃一部分,剩下的挂单继续有效。

当前状态:交易待开放。页面上可以试算阶梯报价(纯本地算术,不联网),但不能挂单。

08什么公开,什么不公开

把话说全,比说得好听重要。

项链上可见说明
铸造付款是谁付了多少、付到哪个收款地址、什么时间,全部公开。每一笔都能在主网上核验。
收款地址与付款人的对应部分10 个地址轮换,且从txOr("y_whitepaper18c33f332","派发次数最少")的一批中随机取,观察者无法从上一笔推算下一笔。但地址池是有限的,长期观察仍可推断。
铸造份额是份额由付款序列重放得出,任何人都能算出同样的结果。这正是txOr("y_whitepaperd54f1edbe","可复算")的意思。
盲地址 crc1否不存储、不入库、不由公钥推导。它与公开地址之间没有对应表,因为那张表根本不存在。
盲地址 ↔ 公开地址否只有能重新产生那次签名的人(即你)能对上。页面不显示真实盲地址,只显示遮蔽符。
条款内容是条款原文可通过 /api/index/terms?h= 取回,任何人都能核对签名。
转账金额与接收方(ZK 阶段)否尚未上线。这是加密票据与零知识证明要解决的问题,不是现在已有的能力。

一句话概括:价值是公开的,所有权是私密的。 mint 阶段你买到了多少,全世界都算得出来;但txOr("y_whitepapera536f6873","这份所有权对应哪个比特币地址"),没有任何人算得出来。

09安全性:数字与边界

盲地址空间100 位 ≈ 2491(前缀 5 + base36 95)
条款绑定deposit + nonce + 金额 + 资产,四项全等
条款有效期3 小时
结算窗口仅未确认或 ≤ 2 个确认的付款允许绑定
记账起点4 个确认后计入(抗重组)
存储SQLite · WAL · 事务 · 唯一索引

诚实的边界:这份清单里没有对 ZK 电路的审计报告,因为电路还不存在。 也没有形式化证明。重放规则是公开的、可自行验证的, 但txOr("y_whitepaper5573315ea","验证一段代码按预期运行")与txOr("y_whitepaper21ca10d8d","验证一段数学成立")不是一回事。

10路线

顺序是有意的:先把可验证的部分做完,再动需要信任的部分。

阶段内容状态
发行层曲线、条款签名、多资产付款、历史计价、到期销毁、盲地址已上线
合约层CRC-30 deploy / mint / transfer,Taproot covenant 输出界面已上线,交易待开放
交换层0x83 阶梯报价挂单与吃单界面已上线,交易待开放
隐私层加密票据、nullifier、Groth16 电路、信任设置仪式设计阶段
盲 sat隐私资产进出:铸造与赎回的盲化路径边界尚未确定

11参数一览

代号 / 名称CRC / CRC-30
总量21,000,000 CRC
份数 × 每份21,000 × 1,000
价格$0.99 + $0.01k(第 k 份)
开始时刻2026-10-23T12:00:00Z(北京 10-23 20:00)
关闭时刻2026-11-22T12:00:00Z(开始后 30 天)
可付资产BTC · ORDI(BRC-20)
盲地址前缀crc1
协议标识CRC-30/1

公开的价值。私有的所有权。

12References

  1. [1]David Chaum,Blind Signatures,1983。最初的盲签名构造:签名者对未读内容签名。
  2. [2]Malte Möser 等,Bitcoin Covenants,2021。软约束与 covenant 输出结构。
  3. [3]Ben-Sasson 等,zk-SNARKs(Groth16,2018)与 Zcash 的 shielded 交易设计。nullifier 与 note commitment 的关系。
  4. [4]Bitcoin Core,OP_CHECKSEQUENCEVERIFY(BIP 112)。CSV 相对时间锁。
  5. [5]BIP 341,Tapscript。P2TR 输出与脚本路径。
  6. [6]Ordinals 协议规范,BRC-20 的 deploy / mint / transfer 数据结构。