安全智能合約工具:端到端開發人員指南
譯文?譯者 | 李睿
審校 | 孫淑娟
對一些人來說,編寫安全智能合約很難。本文將介紹Web3中的一些安全工具,以提高智能合約的安全性。
毫無疑問,編寫安全智能合約比較困難,即使是高級開發人員編寫的智能合約也可能被黑客攻擊。由于這些智能合約通常具有很高的經濟價值,因此黑客攻擊和破解它們的動機也很高。再加上Web3的不變性,安全性變得更加重要。安全性因此成為了智能合約開發人員的首要任務。
本文將介紹智能合約開發的每個階段可用的一些安全工具,并對采用這些工具提供一些建議。
1、為開發做好準備
當開始開發智能合約時,安全性應該是開發人員首要考慮的問題,而一些工具可以在準備編寫代碼時提供幫助,這其中包括文檔、檢測和編寫可重用代碼。
首先,文檔是任何開發項目的關鍵,智能合約開發也不例外。以太坊自然規范格式(NatSpec)是一種記錄智能合約的好方法。
NatSpec是一種特殊形式的注釋,用于為合約、接口、庫、函數和事件提供豐富的文檔。例如以下Tree Contract的穩定性代碼片段:
NatSpec 對Solidity Contract的注釋
通過使用NatSpec注釋,可以很容易地向其他開發人員、審核人員或只想與合約交互的人解釋代碼。簡單地說,它是干凈的、可讀的、容易理解的。
其次,重用經過實戰測試的代碼是降低智能合約中漏洞風險的另一種經過驗證的方法。目前有許多廣泛使用的開源智能合約庫,例如OpenZeppelin,其中包含用于實現訪問控制、暫停功能、升級等的預先編寫的邏輯,以及用于優化使用的Solmate合約。
最后,檢測是在智能合約代碼中發現潛在問題的具有價值的工具。它可以在代碼中發現風格錯誤、違反編程約定和不安全的結構。有很多很好的檢測工具可用,例如ETHLint(以前的Solium)。檢測可以幫助發現潛在的問題(例如重入漏洞這樣的安全問題),甚至在它們成為代價高昂的錯誤之前。
通過在智能合約開發過程中考慮文檔、檢測和可重用代碼,可以提高合約的安全性。從長遠來看,花時間正確地設置這些將會在安全性和效率方面得到回報。
2、開發
現在了解可以在編碼時提供幫助的兩類工具——單元測試和基于屬性的測試。
單元測試顯然是創建安全可靠代碼的重要組成部分。通過測試代碼的單個單元,可以確保合約按照預期的方式運行,并希望在生產中出現問題之前發現任何潛在問題。
有幾種不同的工具可用于為智能合約編寫單元測試。Foundry、Truffle和Brownie都是支持各種編程語言的流行框架。
Foundry(用Rust編寫)是一個用于編寫智能合約的框架,其中包括測試框架Forge。偽造單元測試可以直接在Solidity中編寫,包括許多欺騙代碼,這些代碼可以提供斷言、改變EVM狀態的能力、模擬數據等等。Foundry還帶有內置的Fuzzing(將在后面的文章中詳細討論)。
在Foundry中的Solidity單元測試示例
Truffle也是構建智能合約的框架。Truffle中的單元測試可以用Solidity或JavaScript編寫。開發人員通常使用基于JavaScript的測試與合同進行外部交互,并使用Solidity測試評估合同在實際區塊鏈上的行為。Truffle使用Mocha進行異步測試,使用Chai進行斷言。
Brownie是一個基于python的框架,用于開發和測試智能合約。Brownie與pytest集成用于單元測試,并提供了一個堆棧跟蹤分析工具來測量代碼覆蓋率。
在編寫單元測試時,通過測試盡可能多的代碼不同部分來實現高測試覆蓋率,以確保所有功能都能按預期工作。Foundry不需要額外的插件來測量測試覆蓋率。對于其他框架,可能至少可以添加一個插件來衡量這一點。
雖然單元測試是確保智能合約正確性的可靠方法,但基于屬性的測試允許對智能合約進行更深入的驗證。這是一個相對較新的概念,與傳統的單元測試相比,它提供了一系列優勢。基于屬性的測試側重于測試智能合約的屬性,而不是單個組件。
在指南中,“屬性描述了智能合約的預期行為,并聲明了關于其執行的邏輯斷言。屬性必須始終為真。基于屬性的測試工具將智能合約的代碼和用戶定義的屬性集合作為輸入,并檢查執行是否在任何時間點違反了它們。”
基于屬性的測試基于模糊概念,這是一種通過引入隨機輸入來測試系統的技術。這意味著基于屬性的測試可以在更廣泛的層面上檢查智能合約,因為它不依賴于開發人員提供的特定輸入。正因為如此,它正成為一種越來越流行的測試智能合約的方法。
以之前的合約為例,使用基于屬性的方法來測試一個簡單的staking函數。為此,將使用Scribble,這是一種規范語言和運行時工具,它使這一切變得更加容易。
使用Scribble Notation進行的樣品可靠性測試

不同的工具可以使用Scribble規范進行屬性測試
為了評估staking函數,必須檢查它是否在成功執行的情況下返回true。這可以通過向stake函數代碼添加注釋來完成,正如上面所表明的那樣,不需要單獨的測試文件。然后可以運行Scribble CLI工具將Scribble注釋轉換為斷言。接下來,這些斷言必須通過模糊器(如Diligence Fuzzing或Mythril)運行,以確定是否存在任何違反屬性的情況。

來自Diligence Fuzzing活動示例的報告
還有一些其他工具可用于基于屬性的測試,例如Foundry。Scribble(以上使用的)、Diligence Fuzzing和Mythril是最值得推薦的幾種工具。Scribble和Diligence Fuzzing是由ConsenSys Diligence構建的免費開源工具。Mythril是一個旨在檢測以太坊智能合約中潛在漏洞的工具。
Scribble這種工具令人喜歡,因為把可這些測試放在一起就像添加函數注釋一樣簡單。
3、后期開發
最后一組工具是后期開發。具體來說,就是監控。
因為大多數區塊鏈上的智能合約代碼是不可變的,一旦代碼被推送到主網,就幾乎無法控制它。監控可以幫助開發人員了解代碼中的任何問題或更改,以便可以快速解決它們。這不僅可以幫助開發人員提高合約的安全性,還可以幫助優化和改進其功能。
OpenZepplin的Defender Sentinels和Tenderly的實時警報工具非常適合監控區塊鏈上合約和錢包。
Tenderly Alerts提供了一組自定義觸發器以供選擇,允許快速設置各種活動的警報,例如部署新合同時、發送或接收事務時以及特定地址時。
Defender Sentinel通過定義的一系列自定義參數提供實時安全監控和警報,例如,如果取款超過特定閾值,如果有人執行關鍵操作(例如調用轉賬所有權),或者如果黑名單地址試圖與合約交互的時候。
4、結論
智能合約安全工具非常重要。希望本文能夠幫助人們了解適合工具,以便編寫更安全的智能合約。
原文鏈接:https://dzone.com/articles/secure-smart-contract-tools-an-end-to-end-develope






























