CRC-30
比特币让每一笔付款永久公开,也让每一笔付款永久可追。 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","看起来很干净")的方案。
所以只剩一条路:从签名推。签名需要私钥,除你之外谁也产生不了; 而地址是签名的函数,不需要被存储——换台设备重新签一次,同一个地址就回来了。
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 层不经手任何资产。
合约层采用 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 计,签名就成了空承诺。
流程与绑定
- 向本站索取一个收款地址(10 个地址轮换,派发次数最少的一批中随机取一个)。
- 钱包显示条款原文,签名前能逐字读到:付什么、按什么价、付到哪个地址、nonce。
- 服务端逐字节重建条款并验签,托管这份签名。
- 用户付款。服务端在重放时按 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","哪些输出、转多少、转给谁")。
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]David Chaum,Blind Signatures,1983。最初的盲签名构造:签名者对未读内容签名。
- [2]Malte Möser 等,Bitcoin Covenants,2021。软约束与 covenant 输出结构。
- [3]Ben-Sasson 等,zk-SNARKs(Groth16,2018)与 Zcash 的 shielded 交易设计。nullifier 与 note commitment 的关系。
- [4]Bitcoin Core,OP_CHECKSEQUENCEVERIFY(BIP 112)。CSV 相对时间锁。
- [5]BIP 341,Tapscript。P2TR 输出与脚本路径。
- [6]Ordinals 协议规范,BRC-20 的 deploy / mint / transfer 数据结构。