跳到主要内容

偿付能力证明方法论 v1

Rocky 每日发布一份密码学承诺,证明平台托管资产 ≥ 全部用户负债,并让每位用户无需信任平台即可验证自己的余额被完整包含。本页是该机制的完整口径说明;口径一经发布即受版本约束,任何变更都会递增版本号并保留历史版本。

状态(2026-09-08): 已上线。solvency-prover 每日 UTC 00:30 运行,首份报告(liabilities_only)已于 2026-09-08 发布;GET /v1/solvency/latest 无需登录即可获取。托管(资产)侧尚未纳入,见 §4。

  • 公开报告页:交易所 /solvency(顶部导航的 Transparency 入口暂时隐藏,页面与路由保留,可直接访问)
  • 公开接口:GET /v1/solvency/latest(报告,无需登录)、GET /v1/solvency/proof/me(登录后取个人证明,Authorization: Bearer <session_token>)
  • 参考实现(与线上逐字节一致):rocky-backend crates/solvency-merkle(树与哈希)、services/solvency-prover(快照与报告)

1. 快照​

每日 UTC 00:30(solvency-prover 的 SNAPSHOT_UTC 配置,默认 00:30)对内部账本执行单事务(REPEATABLE READ)一致性快照,同时记录事件流高水位(ledger.events 中最新一条事件的 ID),使快照可被钉在事件历史的确定位置上。

计算未实现盈亏所用的各合约价格在快照瞬间取自交易所指数价格流(oracle.index_price.>,由 oracle-poller 发布),并原样写入报告(mark_prices 字段),保证任何人可复算。若任一有持仓合约的价格缺失或过期,快照直接失败而不是用旧价格出报告。

2. 负债口径​

负债 = Σ 每用户每资产的净权益,构成如下:

项目处理方式
合约保证金余额(ledger.accounts)可用 + 冻结,全额计入
现货余额(ledger.spot_balances)可用 + 冻结,全额计入
未实现盈亏(ledger.positions)按快照价格折入保证金资产。不计入会系统性低估负债
已实现盈亏、资金费已体现在余额中,不重复计
在途取款(pending / submitted)计入负债(资产未离开托管、用户未收到)
在途充值两侧均不计,保持不等式对称
保险基金(ledger.insurance_fund)非用户负债,单列披露(insurance_fund);为负时如实披露缺口
平台自营账户(Rocky 自有做市与吃单舰队,即 house 限速档的 API key 所属账户)从负债中剔除(属平台权益),剔除户数与总额公开披露(house_excluded、house_totals)。外部做市商是普通用户,仍计入负债。
负权益账户(穿仓)钳为 0 计入,负值总额单列为坏账(bad_debt)披露
零余额从叶子中省略;仅坏账渠道体现欠额

3. 资产口径​

资产 = 交易所托管 party 在 Canton 账本上的实际持仓,按资产分列,与负债同刻读取。在途充值对应的链上合约同样剔除。

托管核验模块尚未上线:当前报告的 assets 字段为 null,status 为 liabilities_only。模块上线后 status 变为 complete;若资产侧读取失败则为 degraded。

4. 承诺结构:Merkle Sum Tree​

  • 叶子: SHA-256("rocky-solvency-leaf-v1" ‖ salt ‖ SHA-256(user_id) ‖ canonical(balances))
    • salt 为按用户派生的 32 字节盐:HMAC-SHA256(主盐, user_id)。主盐是 solvency-prover 的 SOLVENCY_MASTER_SALT 配置(hex 编码,至少 16 字节,由运营轮换,并非按日派生),仅在你本人的证明中向你披露;
    • canonical(balances) 为按资产名字节序排序的 资产:金额 列表,金额定格 18 位小数,以 | 连接,例如 CC:12.000000000000000000|CUSD:3.500000000000000000。
  • 内部节点: SHA-256("rocky-solvency-node-v1" ‖ 左哈希 ‖ 右哈希 ‖ canonical(sums)),其中 sums 为左右子树逐资产金额之和。根节点的 sums 即公开的负债总额——验证者可确认公布总额确实由全部叶子逐层加总而来,平台无法漏记任何用户。
  • 奇数节点直接提升到上一层(不复制,杜绝重复计数);所有求和溢出即报错;叶子金额非负是结构安全前提(见 §2 钳零)。

5. 接口​

5.1 GET /v1/solvency/latest​

返回最近一次快照的报告:

字段说明
report_id、snapshot_at报告 ID 与快照时间(UTC)
event_high_water快照时的事件流高水位
root_hashMerkle Sum Tree 根哈希(hex)
liabilities根节点 sums,按资产的负债总额
assets托管 party 链上持仓;托管核验上线前为 null
mark_prices快照所用的各合约价格
insurance_fund、bad_debt、house_excluded、house_totals见 §2 的披露项
user_count叶子数量
statusliabilities_only / complete / degraded

尚无报告时返回 404。

5.2 GET /v1/solvency/proof/me​

返回当前登录用户在最近一次报告中的包含证明:

字段说明
report_id、snapshot_at、root_hash对应的报告
leaf.user_id、leaf.leaf_index你的叶子位置
leaf.balances快照时你的各资产净权益
leaf.salt你的派生盐(hex)
leaf.leaf_hash服务端计算的叶子哈希(hex)
path[]自叶子到根的兄弟节点:sibling_hash、sibling_sums、sibling_on_left

6. 自行验证​

登录后在 /solvency 页点击 Verify my balance,浏览器将在本地完成三步(代码见前端 src/shared/lib/solvency/verify.ts,不向服务器发送任何计算结果):

  1. 用披露的盐与余额重算你的叶子哈希,与服务端返回的叶子哈希比对;
  2. 沿兄弟路径逐层合并,比对公布的 Merkle 根;
  3. 若公开报告与证明属同一快照,比对由路径推导的负债总额与公布总额。

三项全部通过,意味着:你的余额被如实包含、且计入了公开负债总额。任何篡改(改你的余额、漏记你、虚报总额)都会导致至少一项失败。

7. 已知边界​

  1. 资产侧为托管 party 链上持仓,不含链下资产(Rocky 当前全链上,不受影响);托管核验模块上线前报告只覆盖负债侧。
  2. 未实现盈亏依赖平台发布的指数价格;oracle-poller 支持 Chainlink Data Streams 作为价格源(PRICE_SOURCE=chainlink),启用后该价格本身可由第三方验证。
  3. 快照频率为每日一次,间隔内不做承诺;极端行情下日内覆盖率变化不被当日报告捕捉。
  4. "无用户被漏记"依赖用户抽查自验证(经典 PoR 局限),验证入口常驻页面以提高抽查率。

8. 版本​

版本日期变更
v12026-08首次发布