KeyFrame內部研究專用

Mutation Testing with Slither - A New Way to Find High Severity Issues

DeFi Security Summit - DSS·11月23日週日·5 min英文

三句話摘要

透過變異測試(Mutation Testing)自動化驗證智能合約測試套件的有效性。 代碼覆蓋率只是表象,變異測試才是驗證測試套件真正有效性的手段——用 `slither-mutate` 自動化執行,讓測試本身也接受考驗。 代碼覆蓋率是不夠的指標:覆蓋率只告訴你哪些代碼被執行過,但無法說明測試是否真的能抓到那段代碼裡的錯誤,兩者根本上是不同的問題。

重點整理

重點
  • 1

    代碼覆蓋率是不夠的指標:覆蓋率只告訴你哪些代碼被執行過,但無法說明測試是否真的能抓到那段代碼裡的錯誤,兩者根本上是不同的問題。

  • 2

    變異測試的核心邏輯:對代碼庫進行細小改動(替換運算符、修改條件判斷、注釋掉某行等),若測試套件仍然通過,代表測試無法偵測該類型的錯誤,即存在測試盲點。

  • 3

    自動化工具 Slither Mutate:Trail of Bits 的 Slither 靜態分析框架內建變異測試模組,只需指定合約目錄與測試指令即可自動產生所有變異體並逐一驗證,輸出每個變異的前後代碼與偵測結果。

  • 4

    建議使用時機:審計人員應在審計開始時執行,以快速找出測試覆蓋薄弱處;開發人員應定期執行,確保測試套件隨代碼演進持續有效。

實用技巧與重點

乾貨
  • 工具名稱:Slither Mutate(隸屬 Slither 靜態分析框架)
  • 開發公司:Trail of Bits
  • 支援框架:Foundry(`forge test`)、Hardhat(`hardhat test`)或任何自定義腳本
  • 使用方式:指定合約所在資料夾 + 指定測試指令
  • 變異器(Mutator)種類:替換賦值運算符、算術運算符、if 條件式、for 迴圈條件、注釋掉某行等
  • 輸出內容:合約名稱、使用的修改器、修改前後代碼、是否被測試套件偵測
  • 特別建議:對存在算術或捨入誤差風險的項目,額外實施「誤差測試(error testing)」
  • 資源:Trail of Bits 官方博客有真實案例文章與 mutator 說明文件

結論

結論

代碼覆蓋率只是表象,變異測試才是驗證測試套件真正有效性的手段——用 `slither-mutate` 自動化執行,讓測試本身也接受考驗。

完整解析

詳細

現代區塊鏈項目的測試體系通常包含單元測試(驗證單個函數行為與邊界情況)、集成測試(驗證不同合約或功能之間的互動)以及針對算術捨入誤差的專項測試。然而,當一個測試套件已經就位,開發者與審計人員面臨一個根本性問題:這套測試真的有效嗎?它能抓到真實的 bug 嗎?

直覺上,許多人會用代碼覆蓋率(code coverage)來衡量測試品質。但 Trail of Bits 的 Gizarmo 指出,覆蓋率只能說明某段代碼「被執行過」,卻無法說明測試是否真的對代碼中的錯誤敏感。一段代碼可能被執行了,但測試的斷言(assertion)根本不夠嚴格,任何改動都能通過——這就是覆蓋率的根本局限。

變異測試(Mutation Testing)正是為了解決這個問題而生。其核心思路是:對代碼庫刻意引入小錯誤(稱為「變異體 mutant」),例如把 `>` 改成 `>=`、把加法換成減法、注釋掉某行關鍵邏輯等,然後對這個被修改過的代碼庫重新執行測試套件。若測試因此失敗,代表測試有效地偵測到了該錯誤;若測試仍然全部通過,則代表測試套件存在盲點,對該類型的錯誤完全無感,需要深入追查原因。這個過程本質上是「用錯誤來測試測試本身」。

Slither 框架內建的 `slither-mutate` 工具將這個流程完全自動化。使用者只需提供合約目錄與測試指令(Foundry 用 `forge test`,Hardhat 用 `hardhat test`),工具便會自動遍歷每個文件的每一行,產生對應變異體並逐一執行測試,最終輸出詳細報告,列出每個合約的每個變異、修改前後的代碼對比,以及是否被測試偵測。由於大型代碼庫的變異體數量極多,執行時間較長,建議審計人員在審計初期就運行,快速定位測試薄弱點;對一般開發人員而言,應定期執行以確保測試品質隨代碼更新不退步。

關鍵時刻

Pipeline v2

帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。

事實查核

Pipeline v2

說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

更多「Web3 安全」的內容

IF YOU OWN XRP YOU NEED TO SEE THIS PRICE MANIPULATION! ⚠️
8 min
Web3 安全英文8月14日

IF YOU OWN XRP YOU NEED TO SEE THIS PRICE MANIPULATION! ⚠️

Zach Humphries

  • 機構支撐的積極意義:價格操縱常被視為負面,但Ripple掌握大量XRP供應與escrow,在熊市期間提高價格下限,實際上替零售投資者鎖定了低風險的積累區間,這不是剝削而是市場穩定機制。
  • 歷史模式驗證:2024年7月至11月XRP在50美分附近橫盤整理,低點觸及42美分(wick),高點65美分;隨後11月5日至12月5日單月上漲456%,年底到2025年初累計漲幅534%,這個歷史周期正在1美元價位重演。
  • 比特幣聯動邏輯:講者在4-5月就預測「如果比特幣跌至60k以下,XRP會跌至1美元或更低」,此預測精準應驗,反映出熊市中兩者的明確連動關係。
Minimmit, Multimmit and the New Consensus Frontier with Patrick O'Grady
72 min
Web3 安全英文PODCAST8月5日

Minimmit, Multimmit and the New Consensus Frontier with Patrick O'Grady

Zero Knowledge

  • 反向 Linux 架構:Commonware 刻意暴露棧各層級控制,讓開發者自訂執行環境、共識機制、密碼學實現,而非像 Cosmos SDK 只允許應用層以上定制。2-3 個月能組裝一條定製鏈,代價是額外深度但回報是長期維護成本降低及效能優化彈性。
  • 容錯假設的典範轉移:Alpine Glow(Solana 2025)實現單輪投票定終的關鍵是將容錯預算分離為獨立的 Byzantine 和 Crash 容限。傳統系統把 33% 當一個整體預算;新模型允許 20% 惡意加 20% 崩潰,打破了 PBFT 理論界線,釋放單輪設計空間。
  • Minimet 與 Multimet 的遞進:Minimet 是 5F+1 設定下的乾淨構造,實現更短視圖延遲;Multimet(剛發布)進一步允許並行 mini-commits 且驗證者可推翻領導者審查,使用者交易在全球分布式網路達到 200-300 毫秒端到端定終。
Private Information Retrieval (PIR) with Alex Hoover
64 min
Web3 安全英文PODCAST7月29日

Private Information Retrieval (PIR) with Alex Hoover

Zero Knowledge

  • PIR 保護的是訪問模式,不是資料本身
  • PIR 與加密不同,它關注的是隱藏「客戶端查詢了什麼」,而非「資料是否加密」。在公開資料庫(如區塊鏈)上,客戶端可以在不洩露查詢對象給伺服器的情況下檢索特定條目,解決了輕量級客戶端的隱私和防審查問題。
  • 客戶端預處理方案是突破瓶頸的關鍵