在2021 年9 月20 日星期一UTC 时间12:21 到12:23 之间,Pyth BTC/USD 总价格在40000 美元以下有几次大幅下跌,最低跌至5402 美元导致置信区间(Confidence Interval)变得非常宽。以下是有关时间段内Pyth BTC/USD 价格的图表,加上前后各两分钟:

几个依赖Pyth 价格的Solana 程序受到了这次事件的影响。由于一些程序在不使用置信度的情况下依赖收到的总价格数据,这导致情况加剧并触发了清算机制,即使公布的价格有高度不确定度。

根本原因

这个问题是由(1) 两个不同的Pyth 发布商发布了BTC/USD 接近零的价格和(2) 聚合逻辑超重这些发布商的贡献所造成的。

两家发布商都遇到了与处理数据小数点相关的问题。链上Pyth程序是使用定点数表示,其中每个数字表示为一个整数加上一些称为指数的小数点的组合。例如: $52.21 可能表示为52210 和10^-3 的指数。指数是按Pyth 产品定义的; 例如: 提交BTC/USD 的所有价格都应该使用10^-8 的指数。发布者照理来说应该读取每个产品的指数,然后使用它来将他们的浮点价格转换为一个整数,再将该整数价格发布到Pyth。

第一个发布者使用Pyth 实用程序来生成和提交他们的Solana 交易。这个发布商遇到了一个错误(bug),他们将浮点数当作价格提交而实用程序预期的是一个整数。该实用程序没有丢出异常讯息,而是自动将浮点数转换为整数0 并发布它。第二个发布者遇到了两个程序之间的竞争情况,导致它们在这事件的2 分钟间隔读取10⁰ 的BTC/USD 指数,而不是10^-8的指数。以下是总价与发布商价格叠加的图表:

Pyth 聚合逻辑将这些价格与其他9 家发布商相结合,导致聚合数据出现非常宽置信区间的低价格。该逻辑使用加权中位数来计算总价格,其中每个发布者的权重与其置信区间加上异常检测分数成反比并以达到最大值为上限。计算是以美元为单位比较置信区间而不是相对于报价者的价格。因此$100 +- 1 和$1 +- 1 的权重相同,即使第一个区间代表价格的1%,第二个区间代表100%。较低的价格需要较小的美元置信区间;因此这两个接近零的价格在总体上获得了不成比例的大权重。此外异常检测分数被定义为到发布者最近邻居的距离;在这种情况下,有两个发布商接近于零,因此异常值也很小。最后两个发布商在加权中位数计算中都被分配了较高的权重,这拖累了总价格并扩大了置信区间。

补救措施

Pyth 核心开发人员正在采取几个步骤来防止这些问题再次发生。

首先,开发人员正在进行多项更改,以降低发布商因软件错误而产生错误价格的可能性,包括开发建议的整合测试协议,发布商可以运行该协议来验证其软件的变更。这个过程将使发布商更容易在测试网上记录市场数据并通过统计健全性检查对其进行验证。开发人员也在改进发布商的监测工具,以帮助他们快速应对主网中的异常数据。

其次,开发人员正在调整聚合逻辑,以适当加权来应对偏差范围值大的价格。当前的加权方案失败是因为在绝对值基础上比较置信区间。新的聚合逻辑将从相对价格差异中得出其权重,这将防止较低价格自然较小的置信区间过度影响聚合。

第三,开发人员正在为与Pyth 整合的协议制作更仔细的说明文件、最佳范例和示范程序代码,这将强调利用价格和置信区间作为准确反映市场的最佳方式的重要性。这种设计对于整合的人来说更为复杂但它提供了更好的市场资讯,并考虑到各种可能的现实情况,根据资产的市场价格可能会有因不同场所而异。开发人员也会与目前正在使用Pyth 的协议联系,以确保他们以稳健的方式使用Pyth的价格数据。