OpenZeppelin:保障以太坊智能合約安全的利器
核心要點
以太坊的計算需要在網絡中的所有節點上複製,因此其計算成本高昂且效率低下(事實上,以太坊的GitHub開發者文檔指出,我們不應該期望以太坊的計算能力超過1999年的手機)。
因此,以太坊虛擬機(EVM)的安全,即部署在以太坊區塊鏈上的智能合約的安全,至關重要。所有錯誤都會造成實際的經濟損失——無論是糟糕的合約代碼造成的錯誤,還是黑客利用合約漏洞(例如臭名昭著的DAO黑客事件,導致社區分裂並催生了以太坊經典區塊鏈)造成的損失。
圖靈完備性以及其他一系列設計決策,使以太坊功能更強大、更複雜,但也付出了代價。以太坊的豐富性使其更容易受到錯誤和黑客攻擊。
更糟糕的是,部署在以太坊上的智能合約無法修改。區塊鍊是一種不可變的數據結構。
本文深入探討了智能合約的安全性和幫助我們編寫安全智能合約的工具和庫生態系統。
讓我們來看看一些令人驚嘆的工具升級,我們可以立即使用它們來充分利用Solidity環境提供的最佳實踐。
以太坊開發者最酷的工具之一是OpenZeppelin庫。它是一個框架,包含許多安全可靠的Solidity代碼模式和智能合約模塊。其作者本身就是Solidity審計員和顧問,您可以在此處閱讀對這些模塊的第三方審計報告。 Zeppelin Solutions(一家位於阿根廷的公司)的Manuel Araoz概述了主要的Solidity安全模式和注意事項。
OpenZeppelin已成為可重用且安全的開源(MIT)Solidity代碼的行業標準,可輕鬆使用Truffle部署。它由智能合約組成,這些合約一旦通過npm安裝,就可以輕鬆導入並用於我們的合約中。
Truffle框架發布了一個關於如何將OpenZeppelin與Truffle和Ganache一起使用的教程。
這些合約旨在導入,其方法也旨在根據需要進行覆蓋。文件本身不應修改。
OpenZeppelin庫包含一組用於在以太坊平台上發布代幣的合約——用於ERC20代幣,包括BasicToken合約、BurnableToken、CappedToken(具有固定上限的可鑄造代幣)、MintableToken、PausableToken(可以暫停代幣轉賬)。還有TokenVesting(一個可以像典型的歸屬計劃一樣逐步釋放其代幣餘額的合約,具有斷崖期和歸屬期)等等。
還有一些用於ERC721代幣(或CryptoKitties類型的不可替代的唯一代幣)的合約。
還包括ERC827代幣合約,該標準用於在交易代幣時發送數據。
還有一些眾籌合約——用於進行首次代幣發行的合約。這些合約可以記錄購買、向買家交付/發出代幣、轉發ETH資金。還有一些用於驗證和處理代幣購買的功能。
FinalizableCrowdsale合約允許在銷售後執行某些邏輯。 PostDeliveryCrowdsale允許凍結提款,直到眾籌結束。 RefundableCrowdsale是Crowdsale合約的擴展,它添加了融資目標,以及如果未達到目標,用戶可以獲得退款的可能性。
可銷毀合約可以被所有者銷毀,並將所有資金發送給所有者。還有一些合約用於實現對子合約的可暫停性。
OpenZeppelin提供了許多用於進行ICO的輔助工具和實用程序——例如,一個可以恢復錯誤發送到ICO地址而不是ETH的ERC20代幣的合約。一個可繼承的合約允許在特定情況下將所有權轉移給另一個所有者。 Ownable合約有一個所有者地址,並提供基本授權/權限和所有權轉移。
RBAC合約提供基於角色的訪問控制實用程序。我們可以為不同的地址分配不同的角色,角色數量不限。
Zeppelin還提供了一個尚未經過審計的示例眾籌啟動Truffle項目,因此最好將其用作使用OpenZeppelin的入門介紹。它使快速啟動眾籌和代幣變得容易。
ZeppelinOs是一個開源的、去中心化的工具和服務平台,建立在EVM之上,用於安全地開發和管理智能合約應用程序。
實際上,這是EVM之上的中間件層,比目前的OpenZeppelin框架更進一步。 Zeppelin Solutions在此承諾的是使開發人員能夠通過升級模式選擇其已部署代碼的可變性。那些為EVM編寫智能合約的人知道,一個問題/限制是已部署合約的不可變性:一旦進入區塊鏈,合約就無法更改。這就是ZeppelinOs的承諾如此吸引人的原因之一。
到目前為止,為了“更新”合約,需要部署兩個合約——一個作為具有接口的代理,另一個作為實現。將調用代理的功能,並將請求轉發到實現。然後,如果需要更改,則在代理中切換實現(重新定位另一個實現,並可以選擇使用自殺函數關閉原始實現),新的實現將無縫激活。
我們期待著ZeppelinOs未來被社區採納的情況。 Zeppelin Solutions已經提到了OpenBazaar、district0x、storj.io等一些非微不足道的參與者,他們正在使用ZeppelinOs。
Truffle框架是以太坊的開發環境、測試框架和資產管道。它是工具集最完整、在以太坊開發者中應用最廣泛的工具集。 Truffle的生態系統包括許多Truffle boxes——包含前端JavaScript代碼、Solidity合約和工作流程實用程序(如帶有其工具集的樣板webpack項目)的樣板,例如遷移、測試、構建管道等。 Truffle Boxes可以包含完整的入門dapp。
一些官方支持的boxes包括:
社區創建的boxes還帶來了與移動應用程序/Status IM集成合約的樣板,或提供Angular和Vue.js樣板等。
這些boxes與Truffle集成,因此我們可以通過運行諸如truffle unbox react之類的命令來啟動它們——這將下載React box並在本地安裝其依賴項。
TokenMarket是另一家發布了Solidity合約和用於管理代幣銷售/ICO的工具的企業。它是一家在直布羅陀註冊的有限公司,從事ICO諮詢業務。它在2018年柏林加密貨幣世界博覽會峰會上榮獲“最佳ICO顧問”獎。
Tokenmarket在GitHub上的ICO存儲庫表示,其設計目標/原則之一是使用或構建現有的OpenZeppelin合約,稱其為Solidity合約的黃金標準。因此,TokenMarket的大部分ICO代碼庫都是基於OpenZeppelin的代碼庫,然後在其基礎上進一步構建(通過以面向對象的方式繼承)。
TokenMarket定期(嘗試)與其上游代碼庫OpenZeppelin保持同步。但是,它還添加了更多內容,例如:
儘管我們在此討論的存儲庫中有很多代碼,但EVM是圖靈完備的,因此所有這些不同的合約甚至都不能遠程耗盡其全部功能。如果系統(以太坊)能夠生存並繼續保持競爭力,並且網絡上有足夠多的人,我們可以期待這些區塊鏈合約試圖解決的問題的更大通用性。
Consensys Ventures是一家瑞士風險投資公司,它將自己定位為去中心化領域的風險投資公司——尤其是在以太坊領域。除了他們為受保護公司提供的其他資源外,他們還整理了一份關於以太坊智能合約最佳實踐的簡短彙編。雖然嚴格來說這不是代碼,但它仍然包含大量關於Solidity代碼的優缺點示例。
它主要關注Solidity智能合約的最佳安全實踐。
完整的主題列表超出了本文的範圍,因為該資源非常全面,即使是提醒智能合約開發者在為EVM編寫軟件時需要牢記的所有內容,也值得一讀。如果有人從頭開始編寫程序(不依賴於像OpenZeppelin這樣的現成和經過驗證的代碼),則尤其如此。
一些文章涉及外部調用、避免外部調用後的狀態更改、處理外部調用中的錯誤、優先使用拉取而不是推送進行外部調用、了解抽象合約和接口之間的權衡、不要假設合約是使用零餘額創建的、區分函數和事件、多重繼承注意事項、關於時間戳依賴性和此類結構的可玩性(例如,使用塊)的警告——以及許多其他此類技巧,並附帶大量代碼示例。
然後是特定於代幣的警告、與代幣標準相關的警告、軟件工程技術、安全工具——用於靜態分析、測試、代碼檢查器等。
他們還列出了已知的攻擊,包括那些調用外部代碼和合約、在這種情況下可以重複調用的函數、重入問題、跨函數競爭條件,在這裡他們分析了一系列問題,其中一些問題在DAO黑客事件中表現出來。
他們進一步提到了交易排序依賴性、時間戳依賴性、整數溢出和下溢、不同類型的DoS攻擊可能性/點,例如使用區塊燃氣限制的DoS,然後強制將以太幣發送到合約;他們還分析了歷史上的和已棄用的攻擊。一定要閱讀他們的文檔。
在本篇關於生態系統的介紹中,我們介紹了一些用於在以太坊虛擬機上編寫良好、可用於生產的智能合約的可用資源。這包括重用經過審核和驗證的代碼(OpenZeppelin聲稱有超過40億美元的加密貨幣在其合約上運行)以及學習編寫自己的安全、可用於生產的軟件的實用資源。
我們非常肯定這個列表還不完整。我們是否錯過了任何值得一提的內容?請告訴我們!
OpenZeppelin是一個用於安全智能合約開發的庫。它提供了像ERC20和ERC721這樣的標準的實現,您可以按原樣部署這些標準,也可以根據您的需求進行擴展,以及用於構建自定義合約和更複雜的去中心化系統的Solidity組件。 OpenZeppelin通過提供經過測試和社區審核的代碼來幫助保護區塊鏈項目免受常見威脅。
OpenZeppelin通過提供經過測試、可重用且安全的代碼庫來確保智能合約的安全。 OpenZeppelin Contracts庫是以太坊智能合約開發中最廣泛使用的解決方案。它旨在成為開發人員可重用的安全可靠代碼資源,從而減少單個智能合約中潛在漏洞的範圍。
OpenZeppelin提供升級插件,您可以使用這些插件來升級智能合約。這些插件提供了一種簡單安全的方法來隨著時間的推移升級智能合約,以添加新功能或修復錯誤。這些插件旨在與Truffle和Hardhat開發環境一起使用。
Truffle是以太坊的開發環境、測試框架和資產管道。它通過為智能合約提供測試環境在OpenZeppelin中發揮著至關重要的作用。 Truffle的工具套件幫助開發人員在一個統一的環境中創建、編譯、部署和測試智能合約。
要將OpenZeppelin與Truffle一起使用,您需要在項目中安裝兩者。安裝完成後,您可以將OpenZeppelin合約導入到您自己的合約中,並根據您的需求進行擴展。 Truffle將用於編譯和部署您的合約。
OpenZeppelin為您的Solidity項目提供了穩定、安全的基石。它提供了一個經過測試、可重用且安全的代碼庫,可以幫助保護您的項目免受常見威脅。它還提供升級智能合約的工具,允許您隨著時間的推移添加新功能或修復錯誤。
OpenZeppelin社區歡迎開發人員的貢獻。您可以通過報告錯誤、建議新功能或編寫代碼來做出貢獻。所有貢獻都將由社區審核,並有助於提高OpenZeppelin的安全性和功能性。
雖然OpenZeppelin主要設計用於以太坊,但它的許多原則和庫可以應用於其他區塊鏈項目。但是,具體的實現細節可能會因您使用的區塊鏈平台而異。
OpenZeppelin提供了ERC20和ERC721標準的實現,您可以按原樣部署這些實現,也可以根據您的需求進行擴展。這些實現是安全可靠的,並且經過測試和社區審核。
雖然OpenZeppelin是Solidity開發的熱門選擇,但還有其他可用的庫和框架。這些包括Truffle、Hardhat和Ether.js。每個都有其自身的優缺點,最佳選擇取決於您的具體需求和偏好。
以上是與Openzeppelin和朋友的質量堅固代碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!