Skip to main content
一笔衍生品交易,是一个比成交那一刻活得更久的承诺。双方谈定价格,从那一刻起直到仓位关闭,每一方都暴露在对方的偿付能力之下。真正难办的不是价格,而是这份敞口。 传统市场的答案是一家机构:中央对手方(CCP)。清算所保留了这份职能,去掉了这家机构。它是站在每个买方与每个卖方之间的那个组件——而它是在区块内部执行的协议代码,不是一家你必须先获准加入的公司。

中央对手方是用来做什么的

没有它,敞口就是双边的。跟你交易的每一个人,都是一次你必须做、而且要一直做下去的信用判断,而这样的判断会成倍增长:n 个参与者最多产生 n(n-1)/2 段关系,每一段都有自己的条款、自己的抵押品,以及自己对”你值多少”的判断。违约不会停在它开始的地方,因为付不出钱给你的那一方,同时也在对另外四家违约。 中央对手方用一个中心取代这张网,靠的是一个叫合约更替的法律步骤:买方与卖方之间的原合约被解除,替换成两份合约——买方面对清算所,清算所面对卖方。它成了每个卖方的买方,每个买方的卖方。
双边 — n(n-1)/2 条敞口
合约更替 — n 条敞口
参与方 A
参与方 C
参与方 B
参与方 D
参与方 A
参与方 C
参与方 B
参与方 D
清算所
每一方都是一次单独的信用判断,而违约不会停在它开始的地方。
中心方对每个卖方都是买方、对每个买方都是卖方:只需评估一个对手方、一套保证金规则、一个损失吸收顺序。
由此有四个结果,它们合起来就是这家机构存在的全部理由。 只需面对一个对手方。 你评估的是一张资产负债表,不是其他所有人的,而且只评估一次。 净额结算。 方向相反的仓位相互抵消,收敛成一个数。行情平静时要交的抵押品更少;不平静时要平掉的头寸也更少。 按公开规则收取的保证金。 中心方不可能在不收取的前提下承接所有人的风险,所以它事前收取初始保证金,并随价格变动收取变动保证金——依据的是参与者可以提前读到、并据此衡量自己的一套方法。 违约瀑布。 真的有人违约时,损失按事先约定的顺序被吸收:先是违约方自己的保证金,然后是它对共担基金的出资,然后是清算所自己的资本,最后是其他所有人的出资。这个顺序就是那份承诺。正因为事前知道它,会员才能给”自己对中心方的敞口”定价。 这是市场在把其他路都试过一遍之后收敛出来的做法,而且它管用。这也是为什么中央对手方是一家具系统重要性的机构,而不是一件基础设施。

机构身份的代价

上面四项好处,每一项都附带一个约束,而这些约束都来自同一件事:中央对手方是一家公司,不是一套机制。 加密世界迄今给出的两个答案,都比它更差而不是更好。中心化交易所是一个同时还在经营这个市场、并保管着抵押品的中央对手方,既没有那套监管,也没有任何办法核验它声称持有的保证金。早期的链上场所则走向另一端,干脆没有清算所:双边资金池、外部 keeper,以及一次”等有人觉得发这笔交易划算了才发生”的强平。

同一份职能,不要那家机构

Intention 把中央对手方的职责清单拿过来,实现成内核执行的一个组件。 那张表里有一行比其他几行更重。在传统市场里,中央对手方和「保管谁持有什么」的那家机构——中央证券存管机构——是被刻意分开的两个法人。你不会希望承担对手方风险的那一方,同时还是记录谁拥有什么的那本账的保管人:一本私有账簿加上一家机构,就没有任何东西能制衡它。分立本身就是那道制衡。 清算所两者兼任。它既是每一个仓位的对手方,又是那份记录唯一的写入方。这个合并在这里是安全的,理由恰恰就是当初分立的理由:这本账不是私有的。每一笔余额、仓位和保险基金变动都是公开状态,并归属到引起它的那笔交易;瀑布在阈值处启动,任何人都没有裁量余地;整条链条作为区块的一个单元整体提交或整体中止。机构分立当初买到的那道制衡,在这里由「账本可读」买到了。 以上没有一句是在说协议在每一方面都比中央对手方更安全。中央对手方有资本、有监管者,背后还有一个世纪的违约处置经验。它没有的,是一份在违约正在发生时任何人都能读到的账本,以及一条不需要有人决定启动就会自行运行的瀑布。这套设计买到的就是这两样,而它的买法,是把清算所做成区块的一个函数,而不是这笔交易的一方。

唯一的写入方

在协议内部,清算所是任何人的余额、仓位、保证金或未平仓合约量发生变化的唯一路径。结算一笔成交要走它,强制平仓(强平)、自动减仓、资金费结算和保证金预留也都要走它。 这种排他性正是设计本身。持有状态的模块——账户、仓位、订单簿——只管存放数据、暴露修改数据的操作,自己不发起任何事情。账本只有一个地方会动:审计只看这一处,埋点只在这一处,不变式也在这一处强制执行,不必指望每个调用方都记得。

公式与效果是分开的

决定多少的那些规则,实现为纯的、无状态的函数:保证金要求、强平价格、减仓对象选择、手续费计算、未平仓合约量上限,以及杠杆档位。它们接受值、返回值;不读取任何账本状态,也不修改任何东西。 清算所调用它们,并把结果落到状态上。
风险公式 — 纯函数,不写状态
清算所 — 唯一的写入方
保证金
结算成交
强制平仓
冻结保证金
减仓对手选择
执行强平
手续费
执行减仓
未平仓合约量上限
结算资金费
账户 · 仓位 · 未平仓合约量状态只有一个写入方,重放不会分叉
数值
写入
由此有两个结果。一次保证金计算可以脱离环境单独验证——对着一张输入与预期输出的表就行,不需要链,也不需要准备任何状态。另一个结果来自定点数:这些公式逐位精确,舍入规则固定在算术层,不由每个调用点各自决定,所以两个验证者算同一项要求,得到的是同一个整数,而不是”在容差内相同的数”。
舍入是规范的一部分,不是实现细节。保证金往有利于系统安全的方向上取整;手续费按对哪一方有利,分别向下或向上取整。舍入方式不同的节点,不是”稍微算错了一点”——它会产出另一份账本,然后分叉。

保证金与预留

账户的可用额度不等于它的余额。挂着的订单会按可能开出的仓位先预留一份,这样账户就不会把同一份保证金资产同时许给两笔订单,等两笔都成交了才发现撞车。 下单、改单、撤单、成交,每一步清算所都在维护预留。挂单底下的仓位一变,预留就重新推导一次。所以:仓位后来缩小了,挂在它上面的只减仓订单会被重新评估,不会留着一个过时的值。 保证金是分档的:要求随仓位规模在治理设定的边界内递增,因此大到难以平掉的仓位,会按比例承担更高的要求。交易侧的说明见保证金模式和杠杆。

违约瀑布

这就是上面讲的那套中央对手方机制,只是把委员会拿掉了。内核在撮合之前按固定次序跑风险阶段:被迫产生的流量先了结,自主流量才放行。 当一个账户无法覆盖自己的亏损时,缺口沿着一条固定的承接序列向下传递:
撮合之前,按固定次序运行的风险阶段
1 · 金库减仓
2 · 强制平仓
3 · 自动减仓
无法覆盖自己亏损的账户
在订单簿上平掉仓位以破产价格为界
保险基金协议状态,由强平罚金注入——不是多签
自动减仓对手方仓位由任何人都能重算的确定性分数选出
了结
仍有缺口
仍有缺口
强平是协议动作。账户的保证金资产跌破维持要求,网络就自己在订单簿上平掉这个仓位,以破产价格为界。没有 keeper 交易,没有 gas 竞价,也没有”谁先触发”的竞速——这既堵掉了竞速带来的价值抽取,也堵掉了另一种失效:偏偏在拥堵到必须强平的那几分钟里,没有人出现。 保险基金是协议里对应共担违约基金的那一层,而且它是协议状态:由强平罚金注入,用来吸收破产缺口。它不是多签——注资和支取都不必偏偏在人工签名最难凑齐的那几分钟里去凑签名。 自动减仓是最后一层损失承担,用在订单簿和保险基金合起来也吸收不了一次破产的时候。它占据的是中央对手方用强制平仓和向存续会员追缴现金去填的那个位置——区别在于:对手方仓位按破产价格平掉,选谁由一个从公开状态算出的确定性分数决定。任何人都能把这个结果重算一遍;没有人在挑。 阈值和完整算例见强平与自动减仓。

资金费

资金费持续采样,按计划时点对结算时刻的仓位结算;费率由标记价格相对指数价格的溢价推导,并钳制在协议设定的边界之内。它作为清算所的一个阶段在区块执行内部运行,所以一次资金费支付就是协议操作,带的归属信息和其他任何状态变更一样——不是某个外部进程的周期性扫账。 费率、结算间隔以及溢价如何计算,见资金费率。

为什么这该放在协议里

另一种做法——把清算做成一组对撮合引擎作出反应的合约——会开出一个窗口。成交与保证金检查之间,存在一段账户保证金不足、而且外界看得见的状态。触发与 keeper 交易之间,存在一段仓位本该强平却还没强平的状态。 在这里,整条链条——一笔成交引发保证金检查,检查触发强平,强平动用保险基金,可能进一步触发减仓,减仓又带来新的保证金检查——在区块里作为一个单元整体提交,或者整体中止。不存在这样的中间状态:越界已经看得见,处置却还没开始。 这正是中央对手方承诺、却交付不了的那条性质——因为它的保证活在规则手册里,而它的账本每天日终就关了。在这里,保证就是执行本身。

后续阅读

撮合

清算所结算的那些成交是从哪里来的。

IntentionKernel

把被迫流量排在自主流量之前的那个阶段次序。

强平

阈值、强平瀑布,以及交易者会看到什么。

资金费率

费率、结算间隔与溢价计算。