Pyth Network:Pythの根本原因解析(透明性レポート)

著:Pyth Network

 2021年9月20日(月)12:21~12:23UTCの間、Pyth BTC/USDの集約価格は40000ドルを下回り5402ドルにまで達する急激な下落が数回あり、信頼区間が極端に広くなりました。ここでは、当該時間帯のPyth BTC/USD価格系列に、左右2分を加えたグラフを掲載しています。

画像1

Pyth価格に依存しているいくつかのSolanaプログラムは、この事故によって影響を受けました。この影響は、一部のプログラムが信頼度を使用せずに集約価格のフィードに依存していたために悪化し、公表された価格が非常に不確実であるにもかかわらず、リクイデーションが発生してしまいました。

根本原因

 この問題は、(1)2つの異なるPythパブリッシャーがBTC/USDのゼロに近い価格を発表したこと、(2)アグリゲーションロジックがこれらのパブリッシャーの貢献度を過大評価したこと、の組み合わせにより発生しました。どちらのパブリッシャーも、10進数の扱いに関する問題がありました。オンチェーンのPythプログラムでは、固定小数点数表現を採用しており、各数値は整数と指数と呼ばれる小数点数の組み合わせで表現されます。例えば、52.21ドルは52210、指数は10^-3と表されるかもしれません。指数はPythプロダクトごとに定義されています。例えば、BTC/USDに送信されるすべての価格は、10^-8という指数を使用する必要があります。パブリッシャーはこのプロダクトごとの指数を読み、それを使って浮動小数点の価格を整数に変換し、その整数の価格をPythに公開することが期待されています。一番目のパブリッシャーは、Pythユーティリティプログラムを使用して、Solanaトランザクションを生成し、送信していました。このパブリッシャーは、ユーティリティーが整数を期待するところ、価格を浮動小数点数で送信するというバグに遭遇しました。このユーティリティーは、例外を発生させる代わりに、浮動小数点数を自動的に整数の0に変換して発行しました。2番目のパブリッシャーでは、2つのプログラム間の競合状態が発生し、事故の2分間の間隔で、BTC/USDの指数を10^-8ではなく10^0と読み取ってしまいました。以下は、パブリッシャーの価格を重ね合わせた集約価格のグラフです。

画像2

 Pythの集計ロジックでは、これらの価格と他の9つの価格を組み合わせ、信頼区間の広い低い集計価格を算出しました。このロジックでは、各パブリッシャーの重みを信頼区間に反比例させ、さらに異常値検出スコアを加え、最大値を上限とする加重中央値を使用して集計価格を算出しています。この計算では、信頼区間を引用者の価格と相対的にではなく、ドルベースで比較します。そのため、100ドル+-1と1ドル+-1の信頼区間は、最初の信頼区間が価格の1%、2番目の信頼区間が100%であっても、同じ重みとなります。 価格が低いほど,ドルベースでの信頼区間は小さくなる.したがって,ゼロに近い価格の両方とも,集計では不釣り合いに大きなウェイトを受けています。さらに、異常値検出スコアは、パブリッシャーの最近傍までの距離として定義されま。このケースでは、2つのパブリッシャーがゼロに近かったので、異常値スコアも小さくなりました.その結果、加重中央値の計算において、両出版社が高いウェイトを割り当てられ、集計価格が引き下げられ、信頼区間が拡大しました。

改善策

 Pythコアデブロッパーは、このような問題が再び起こらないよう、いくつかの対策を講じています。まず、デブロッパーは、パブリッシャーがソフトウェアの変更を検証するために実行できる統合テストプロトコルを開発するなど、ソフトウェアのエラーによってパブリッシャーが誤った価格を生成する可能性を減らすためのいくつかの変更を行っています。このプロセスにより、パブリッシャーはテストネットに市場データを記録し、統計的サニティチェックで検証することが容易になります。また、開発者は、パブリッシャーがメインネットの異常なデータに迅速に対応できるように、パブリッシャー用の監視ツールの改善も行っています。
 第二に、開発者は、大きな値の範囲にまたがる価格を適切に加重するために、集計ロジックを調整しています。現在の加重方式は、信頼区間が絶対値で比較されているために失敗していました。新しい集計方法では、相対的な価格差に基づいて重み付けを行います。これにより、低い価格の信頼区間が自然と小さくなり、集計結果に過度な影響を与えることがなくなります。
 第三に、デベロッパーは、Pythと統合するプロトコルのために、ドキュメント、ベストプラクティス、サンプルコードを充実させ、市場を正確に反映する最良の方法として、価格と信頼区間の両方を利用することの重要性を強調しています。この設計はインテグレーターにとっては複雑ですが、市場をよりよく把握することができ、ある資産の市場価格が会場によって異なるという現実的なシナリオを考慮に入れています。開発者は、現在Pythを使用しているプロトコルにも連絡を取り、当社の価格フィードが確実に使用されるようにしています。

この記事が気に入ったらサポートをしてみませんか?