Skip to main content
这些页面反复给出四条主张:一次保证金计算可以脱离环境验证、任何人都能重算一次自动减仓的选择、资金费是推导出来的而不是定出来的、两个诚实节点会产出逐字节相同的结果。这种形状的主张,在协议之外有人真的跑过一遍之前,一文不值。 这一页讲的就是怎么跑。每一项检查都写明需要哪些输入、输入从哪来,以及同样重要的:它不能证明什么。
只需算术
公开数据,任一节点
你自己的全节点
一次保证金要求
一个强平价格
一次 ADL 选择
一笔资金费
一个区块,逐字节
五项里有两项完全不需要联网:这些公式是对公开档位记录的纯函数。

1 · 一次保证金要求

你需要什么: 一份杠杆档位记录,加一个仓位规模。没有别的了。不需要节点,不需要联网,也不需要账户。 起始保证金和维持保证金都是名义价值与档位记录的纯函数,公式和确切的舍入规则见杠杆: 起始保证金=名义价值×im_leverage×10exponent\text{起始保证金} = \text{名义价值} \times \text{im\_leverage} \times 10^{\text{exponent}} 维持保证金=max⁡ ⁣(名义价值×mm_leverage×10exponent−扣减项,  0)\text{维持保证金} = \max\!\left(\text{名义价值} \times \text{mm\_leverage} \times 10^{\text{exponent}} - \text{扣减项},\; 0\right) 档位记录发布在 API 参考的 DEX Config 分组里——im_leverage、mm_leverage、共用的 exponent,以及每档的 deduction。挑一个名义价值,在纸上把两个式子算出来,再跟场所对同一个仓位实际收的数对一下。 它证明了什么: 这个要求是公开参数的一个公开函数,不是逐账户的判断。 它没有证明什么: 档位记录本身定得好不好。那是治理问题,不是算术问题。
舍入是规范的一部分,不是容差。如果你的整数和场所的差一个单位,那么两者之中必有一个是错的——先看清算所那页的舍入规则,再判断错的是哪一个。

2 · 一个强平价格

你需要什么: 同一份档位记录,加上你的余额和仓位。 阈值是一个比率,定义见强平: 占用率=维持保证金净保证金资产\text{占用率} = \frac{\text{维持保证金}}{\text{净保证金资产}} 净保证金资产是余额加未实现盈亏,再减去挂单已经预留的部分。解出这个比率达到触发点时的标记价,你就拿到了协议将会动手的那个价格——在它动手之前。 它证明了什么: 触发点可以提前从你自己的数字里推出来。 它没有证明什么: 你实际会被平在什么价。那取决于那一刻的订单簿,并以破产价格为界。

3 · 一次自动减仓的选择

你需要什么: 某个市场的未平仓仓位和标记价,从任何一个全节点都能取。 选择依据是一个分数,定义见自动减仓: 排序分=未实现盈利百分比×有效杠杆\text{排序分} = \text{未实现盈利百分比} \times \text{有效杠杆} 从 Accounts 分组取某个市场的仓位,从 Oracle 分组取认证价格,对盈利那一侧的每个仓位算出分数,然后排序。这个顺序就是队列。把你算出来的队首跟界面上显示的 ADL 指示灯比一比。 它证明了什么: 队列是公开状态的函数。没有人在挑,队列里也不存在你自己的算术找不到的仓位。 它没有证明什么: 减仓不会轮到你。一个你能算出来的队列,仍然是一个你可能身在其中的队列。

4 · 一笔资金费

你需要什么: 结算那一轮的订单簿和认证指数价,加上你的仓位。 费率在资金费率里分三步搭出来——深度加权溢价,按该市场的结算间隔缩放,再钳制: P=max⁡(0,  深度加权买价−指数价格)  −  max⁡(0,  指数价格−深度加权卖价)指数价格P = \frac{\max(0,\; \text{深度加权买价} - \text{指数价格}) \;-\; \max(0,\; \text{指数价格} - \text{深度加权卖价})}{\text{指数价格}} F=F8h×周期秒数28,800Ffinal=clamp⁡ ⁣(F,  Fmin⁡,  Fmax⁡)F = F_{8h} \times \frac{\text{周期秒数}}{28{,}800} \qquad F_{\text{final}} = \operatorname{clamp}\!\left(F,\; F_{\min},\; F_{\max}\right) 然后是这笔费用本身: 资金费=仓位数量×标记价格×资金费率\text{资金费} = \text{仓位数量} \times \text{标记价格} \times \text{资金费率} 订单簿来自 Markets 分组,认证指数来自 Oracle,协议实际扣的那笔钱来自 Accounts 分组里的资金费支付接口。重算一遍,对一下。 它证明了什么: 费率是从订单簿和指数推导出来的,不是运营方定的。 它没有证明什么: 指数本身是对的。见预言机保证什么、不保证什么。

5 · 一个区块,逐字节

你需要什么: 一个你自己的全节点。任何人都可以跑一个——见运行节点。
这是本页唯一目前还跑不了的检查。在公开访问开放之前,网络运行在一个私有测试网上,所以前四项现在就能跑,这一项到那时才能跑。把它列在这里,是因为另外四项的价值全部压在它上面。
其余四项都压在这一项上。取一个已提交的区块和它的前置状态,执行一遍,把你的结果和网络的比对。这里的确定性是被强制的,不是被指望的:执行路径读不到墙钟、运行时熵、浮点数,也读不到哈希随机化的迭代顺序,所以出现分歧就是缺陷,不是容差。见为什么结果是可复现的。 有两条性质让这件事是真的检验而不是走过场。定序是共识提交的对象,所以你重放的次序是法定人数签过名的那一份,不是你的节点自己推断出来的。而价格由同一批签名提交,所以不存在一个窗口,能让你对着网络没有认证过的价格去重放。 它证明了什么: 你被喂到的状态,是按已公布的规则、在网络提交过的输入上产出的。 它没有证明什么: 规则本身没有缺陷。逐字节复现一个 bug,复现出来的仍然是那个 bug——这正是审计和漏洞赏金要和这件事并存的原因。

这些都覆盖不到的部分

验证为「必须交给信任的东西」封顶,但它消不掉信任。剩下的部分——验证者集合、价格法定人数、治理对参数的触及范围,以及跨链桥——列在信任假设那一页。如果你来这里是想找边界而不是找保证,下一页就读那个。

后续阅读

信任假设

所有能查的都查完之后,还剩下什么。

运行节点

硬件、同步,以及一个验证者实际在跑什么。

IntentionKernel

让重放这件事有意义的那四重封闭。

API 参考

上面点到的每一项输入的字段级细节。