智能合約安全與審計
預言機操縱
預言機操縱是誘使合約依據一個攻擊者能撥動的價格或資料來行動。借貸協議、穩定幣或衍生品合約需要知道某資產的價格,於是向預言機詢問。若這個預言機是攻擊者能在單一交易內推來推去的東西,那麼合約對價值的整套認知都會被腐蝕:抵押品可被弄得看起來比實際更值錢、債務可被抹去、資產可被遠低於公允價值地買走。
最典型的錯誤是直接從鏈上資金池讀取即時價格,例如呼叫 Uniswap 配對的 getReserves 再相除。這個數字反映的是池子當下的餘額,而攻擊者只要做一筆大額兌換就能撥動它,在淺薄、低流動性的池子裡尤其如此。再配上閃電貸提供臨時資本,攻擊者推動價格、利用一個信任這個扭曲數字的合約、然後平倉,全部在原子性的一筆交易內完成。真實案例包括 bZx、Harvest Finance 與 Mango Markets,它們因這套手法合計損失數億美元。
穩健的設計絕不信任單一、可即時撥動的價格。緩解之道包括:時間加權平均價格(TWAP),跨許多區塊取平均,使單一區塊的尖刺幾乎撼動不了均值;像 Chainlink 這類聚合眾多鏈下來源的去中心化預言機網路;採用多個獨立饋送並剔除離群值;以及對偏離度與資料陳舊度做合理性檢查。沒有一招是萬靈丹:TWAP 有延遲,在淺市中仍可被跨數個區塊操縱,連聲譽良好的饋送也可能停機或在極端波動時出現缺口。
攻擊者用閃電貸借入一大筆錢,倒進一個淺薄的代幣池把該代幣的鏈上即時價格砸崩,再利用一個剛好讀取這個即時價格的借貸市場,借出遠超其(如今被低估的)抵押品所應允許的金額,然後償還閃電貸,把差額留下。
一個你能在單一交易內撥動的價格不是預言機,而是攻擊面。從單一鏈上資金池讀取即時價格,是 DeFi 中被利用最多的預言機錯誤。
又称
另见