以太坊開發者需要知道的四項安全性原則,以及一些基本權衡。
儘管區塊鏈行業的發展日趨成熟,但是智能合約的開發仍是一個相對較新的領域。因此,為了應對新的漏洞和安全危機,以及滿足開發新的最佳實踐的需要,我們應該不斷完善安全性方面的問題。學習最佳實踐只是智能合約開發者在安全性方面踏出的第一步。
智能合約編程需要一種不同於傳統的工程思維。智能合約失敗的代價很高,更新迭代需要較大工程量,這使得它在某些方面更類似於硬體編程或金融服務編程,而不是web或者移動端開發。因此,僅僅防禦已知的風險是遠遠不夠的,還需要掌握新的開發理念。
準備應急措施
任何重要的合約都會出現故障。因此,開發者必須做好充足的準備,以便及時應對漏洞。
出現故障時暫停合約 (「斷路器」)。
管理風險資金的數量 (限制流量,最大化利用率)。
準備有效的升級路徑以修復和改進bug。
防患未然
最好是在完整的產品發布之前發現bug。
全面測試合約,並在發現新的攻擊向量時添加相應測試。
alpha測試網版本發布之後,提供bug賞金。
分階段推出,每個階段更新功能並添加新測試。
保持智能合約的簡潔性
複雜性會提高出現故障的概率。
確保合約邏輯簡單。
模塊化代碼以使合約和函數保持較小。
請儘可能使用既有工具或代碼 (例如不要使用自己的隨機數生成器)。
在保證清晰度的前提下再考慮性能。
只在系統中需要去中心化的部分使用區塊鏈技術。
保持更新
跟進新的安全性措施。
檢查智能合約,以最快的速度定位新漏洞。
儘快升級到任何工具或庫的最新版本。
採用可能有效的保障安全性的新技術。
了解EVM的特性
儘管開發者對以太坊編程較熟悉,但仍需要注意一些陷阱。
要特別小心外部合約調用,該過程可能會執行惡意代碼並改變控制流 (control flow)。
要明白,開發者的公共函數是公開的,可能會被惡意調用,調用順序也可能是任意的。任何人都可以查看智能合同中的隱私數據。
注意gas成本和區塊gas限制。
注意,區塊鏈上的時間戳是不精確的:礦工可以在幾秒內影響交易執行的時間。
隨機性是區塊鏈上一個重要的特性,大多數產生隨機數的方法在區塊鏈上是具有博弈性的。
基本權衡因素
在評估智能合約系統的結構和安全性時,需要考慮多種基本的權衡。對於所有智能合約系統的普遍建議是,在這些權衡之間找到平衡點。
從軟體工程的角度來看,理想的智能合約系統是模塊化的,即重用代碼而不是複製代碼,以及支持可升級的組件。而從安全架構的角度來看,理想的智能合約系統可能同樣會使用這種模式,尤其是面對更為複雜的智能合約系統。
然而,當安全性和軟體工程最佳實踐出現不一致時,也會有一些例外情況發生。而在每種情況下,可通過選擇合約系統上的最佳性能組合來達到平衡,例如:
固定版本vs.可升級
整塊化vs.模塊化
複製vs.重用
固定版本vs.可升級
當多個資源 (包括此資源) 強調自身的延伸性時 (比如可中斷的、可升級的或可修改的模式),那麼就需要在延伸性和安全性之間找到一個平衡點。
延伸性增加了複雜性和潛在的受攻擊性。如果智能合約系統在預先規定的有限時間內能夠完成的功能非常有限,那麼這時簡潔性比複雜性要有效得多,例如,無治理的限時代幣發售合約系統。
整塊化vs.模塊化
獨立的整塊化合約允許信息在本地識別和讀取。雖然整塊化合約一般不被重視,但對於數據和流的極端本地化存在爭議,例如代碼審計的效率優化。
與
猜你喜歡
文章評論
冷萃財經原創,作者:Awing,轉載請註明出處:https://www.lccjd.top/2020/07/16/%e5%bf%85%e5%a4%87%e4%b9%9d%e6%9d%a1%e6%8e%aa%e6%96%bd%ef%bc%8c%e4%bf%9d%e9%9a%9c%e6%99%ba%e8%83%bd%e5%90%88%e7%ba%a6%e5%ae%89%e5%85%a8%e6%80%a7/?variant=zh-tw
文章評論