技术 › FCMP++
Carrot:新地址方案
与 FCMP++ 一同到来的新地址与密钥方案
简而言之
Carrot(Cryptonote Address on Rerandomizable-RingCT-Output Transactions)是 FCMP++ 时代的地址和一次性输出方案。它保留了现有的地址格式,但引入了更灵活的密钥层级(分别用于“查看收入”、“查看全部”、“生成 key image”、“证明花费权限”),堵住了 Janus 攻击,并加快了扫描速度。
为什么要改变行之有效的东西
FCMP++ 的输出形如 O = x·G + y·T,而旧的一次性地址公式没有考虑到这一点。既然无论如何都要改,Carrot 顺便修复了 CryptoNote 长期存在的几个麻烦:
- 只读钱包看不到支出。你必须导入 key image。
- 针对子地址的 Janus 攻击:发送方可以测试两个子地址是否相关联。
- “销毁漏洞”(burning bug):可以发送两个一次性公钥相同的输出,而接收方只能花费其中一个。
- 扫描缓慢——Ed25519 运算加上 1 字节的 view tag。
密钥层级
| 密钥 | 赋予的能力 |
|---|---|
k_vi——查看收入(view-incoming) | 找到收款(类似旧的查看私钥) |
k_gi——生成镜像(generate-image) | 计算 key image → 看到哪些输出已被花费 |
s_vb——查看余额(view-balance) | 看到所有收入和支出、准确的余额;识别自己的找零 |
s_ga——生成地址(generate-address) | 创建子地址(例如在商店服务器上),但无权查看付款 |
k_ps——证明花费(prove-spend) | 花费时真正唯一需要的密钥;可以存放在硬件钱包中 |
与旧钱包的兼容性
现有钱包按如下方式映射到 Carrot:k_vi = a、k_gi = b、k_ps = 0。于是 K_s = b·G = B,旧地址保持不变——你仍然可以向它们发送并扫描它们。新功能(独立的查看余额密钥等)只提供给按新方案创建的钱包。
输出中还有哪些变化
- 基于 X25519 的密钥交换(使用 Montgomery 曲线而非 Edwards 曲线)——扫描更快。
- view tag 为 3 字节而非 1 字节:误报减少 65,536 倍。
- Janus 防护:输出中加入一个“锚点”,让接收方能够检查发送方知道完整的地址,而不是用不同子地址的部分拼凑而成。
- 销毁漏洞防护:一次性公钥与交易的第一个 key image 绑定,因此不可能存在两个相同的输出。
- 内部(发给自己的)输出:找零通过
s_vb构建,持有查看余额密钥的钱包能够可靠地识别它。
原始资料
Carrot 规范发布在 jeffro256/carrot 仓库中,FCMP++ 规范见 kayabaNerve 的论文以及 monero-oxide 仓库。本站是对它们的转述;如有出入,请以规范为准。