Samczsun:請勿用現貨價格作爲預言機!這有替代方案供參考

安全專家、Paradigm 研究合夥人 Samczsun 梳理了四種去中心化預言機的使用指南。

撰文:Samczsun,著名安全專家、區塊鏈投資機構 Paradigm 研究合夥人
翻譯:盧江飛

我該用現貨價格作爲預言機嗎?

不!

因爲,你可以試試下面幾個預言機。

Uniswap TWAP

概述

Uniswap TWAP 預言機適用於任何在 Uniswap V2 或 V3 上有交易對的代幣,幫助用戶在一定條件下計算相關數字資產特定時間段內的平均價格。

何時使用

如果您的代幣已經在 Uniswap V2 或 V3 上線,並且具有足夠的交易者活動和流動性,那麼請使用 Uniswap TWAP 預言機。換句話說,正常情況下,如果有套利機會,交易者會快速捕獲價格信息以重新平衡流動性資金池。如果情況並非如此,可能是「攻擊者」在扭曲價格,你也只能耐心等待 TWAP 更新喂價信息。

潛在風險

使用 Uniswap TWAP 必須選擇使用時間間隔,這可能是個很棘手的問題。因爲:

  • 如果將時間間隔設置更短,意味着您可以更快看到喂價數據更新,但也降低了操縱預言機的攻擊成本(the cost of attack)。
  • 如果將時間間隔設置更長,意味着操縱平均價格變得更加困難,但也意味着您將無法對市場的波動及時做出反應。

示例實現

  • 對於 Uniswap V2,可以參閱 GitHub 以獲取 24 小時 TWAP 預言機的示例實現。
  • 對於 Uniswap V3,可以參閱 GitHub 以獲取可以集成到項目中的代碼庫。

Curve Virtual Price

概述

Curve 流動性池提供了一種功能,能夠用「抵禦」閃電貸的方式計算出單個 LP 代幣的價格。

何時使用

如果您需要計算 Curve LP 代幣的價格,可以使用 get_virtual_price 函數。

潛在風險

除了 Curve 流動性池支持的每個代幣存在依賴風險(dependency risk)之外,沒有其他風險。

示例實現

如果你想了解更多相關信息,請參閱 Curve 文檔。

Maker Price Feed

概述

Maker 運營着自己的喂價網絡,他們會將數據公開給鏈上白名單合約(whitelisted contracts on-chain),其他項目可以通過治理流程向 Maker 申請訪問價格數據。

何時使用

如果您認爲可以通過治理流程,並且希望將你的預言機風險轉移給 Maker 預言機團隊,那麼可以使用 Maker 的 Price Feed。

潛在風險

您需要信任 Maker 團隊和匿名喂價數據才能正確運行、使用 Price Feed,然而,鑑於 Maker 本身依賴於這些預言機,因此在實踐中的風險其實很低。此外,由於喂價數據運營商需要手動提交鏈上價格,因此在鏈上擁堵非常嚴重的時期,價格數據更新可能會出現延遲。

示例實現

向 Maker Governance 提交 MIP10c9 子提案

概述

Chainlink 在以太坊主網上支持超過 100 個代幣的喂價,主要用於 ETH 交易對和美元交易對,開發人員只需在需要時查詢智能合約,即可免費訪問這些數據。

何時使用

對於 Maker 或 Uniswap 不支持的加密資產而言,如果您需要了解這些資產的定價數據,或者你的項目無法接受 TWAP 預言機延遲,那麼可以使用 Chainlink。

潛在風險

與 Maker 類似,您需要信任 Chainlink 團隊和節點運營商才能正確運行、使用 Chainlink。 Chainlink 還要求節點運營者在鏈上操作,因此在鏈上擁堵比較嚴重的時期也可能會出現延遲。

示例實現

如果你想了解如何從 Chainlink 聚合器智能合約獲取價格的示例,請參閱 Chainlink 文檔。

關於該話題的關鍵問題

1. 爲什麼我不能直接使用現貨價格?

這取決於您使用現貨價格的目的,您可能想用它來計算某些用戶存入平臺的資產價格,這意味着要確保用戶不能就資產的真正價值向您撒謊——這點至關重要。

不幸的是,根據定義,只要有人買賣資產,現貨價格就會發生變化。這意味着攻擊者可以輕鬆地使資產的表觀價值(apparent value)遠高於或遠低於資產的真實價值。對於使用現貨價格來計算用戶借貸能力的協議而言,如果作爲抵押品存入的資產價值被人爲誇大,意味着整個協議可能(並且將會,正如許多黑客所表明的那樣)最終被榨乾。

2. 如何判斷我是否使用現貨價格?

事實證明,如果您使用現貨價格,效果可能不會被立即顯現出來。

舉個例子,如果您想找到 WBTC 兌 ETH 的價格。一個看似簡單的解決方案是使用 Uniswap V2 裏的 ETH/WBTC 交易對,抓取 ETH 和 WBTC 的儲備金餘額,然後將兩者分開。但是,由於你計算的其實是現貨價格,因此攻擊者可以通過在流動性池內買入或賣出資產,這樣交易對價格就能輕鬆被操縱了。

當然,這看起來相當簡單,如果你真的想計算單個 ETH/WBTC 流動性池的 LP 代幣價格時,又該怎麼辦呢?當你想要計算 ETH/WBTC 流動性池的美元總價值時,一個簡單的做法是分別計算 ETH 和 WBTC 的美元價值。但是,這樣做,本質上其實已經在考慮現貨價格了,因爲你仍然依賴於流動性池的準備金餘額。這是一個極其微妙的細節,但許多項目可能都採用這種計算方式。如果您想了解更多這方面的信息,可以參閱這篇 文章。

最後要說的是,你可能正在使用一個沒有在本文中列出的預言機,實際上,本文提到的這四個預言機並沒有覆蓋市場上的全部預言機,也不意味着它們是市場上最好的四個預言機。