值得關注的其他問題
盡管有一個安全問題排名很不錯,但它往往一些有趣的細節,因為某些細節與排名列表并不完全一致。在深入挖掘10大問題之前,必要闡述一下原始研究中一些值得關注的亮點問題:
在2018年,最主要的兩個問題是外部合約拒絕服務和重入。但是現在這些問題有所緩解。可以從我們的研究博客中了解更多有關Reentrancy的信息:從安全角度出發審視智能合約。
譯者注:實際上由于DeFi應用之間的組合應用,又導致了多起嚴重的重入攻擊事件。
現在Solidityv0.6.x發布了,它帶來了許多重大變化,然而掃描的智能合約中有50%甚至還沒有準備好使用Solidityv0.5.0編譯器。另外30%智能合約使用了過時的語法,并且83%的合約在指定編譯器版本存在規范問題。
數據:大多數區塊鏈網絡上的智能合約交互次數少于10次:金色財經報道,據Dune數據顯示,大多數區塊鏈網絡上的智能合約的交互次數少于10次,尤其是BNB Chain和以太坊,其中BNB Chain的比例是97.7%(107667592),以太坊的比例為95.1%(36152963)。[2022/8/31 13:00:47]
譯者注:Solidity0.6在語義上更明確了,有助于編譯器及時發現問題,讓代碼更安全,
盡管可見性問題沒有出現在2018年的前10位,也沒有出現今年的前10,但可見性問題增加了48%,值得關注。
下表比較了2018年和2020年十大常見問題列表之間的變化。這些問題按嚴重程度和流行程度排序:
1.未檢查的外部調用
智能合約平臺Fantom研究人員提出智能合約鏈下執行和測試解決方案:官方消息,智能合約平臺Fantom的研究人員在Usenix2021年度技術會議中,展示了一種專注智能合約鏈下執行和測試的全新解決方案,其效率將高于現有的解決方案。目前,開發人員測試智能合約需要用三個方案:存檔節點、全節點或測試網,其中每一種都可能受到擴展性、速度和存儲的限制。為了解決這些問題,Fantom的研究人員提出了一個建立在交易「記錄和重放」機制的鏈下測試環境,開發者就能重放交易,而不依賴于以前的交易和區塊鏈的整個世界狀態。在針對900萬個區塊樣本集的測試中,「記錄和重放」模型將所需的存儲量減少了50%。[2021/7/21 1:07:13]
在2018年Solidity十大安全問題榜單上未檢查的外部調用是第三個常見問題。由于現在前兩個解決了,因此未檢查的外部調用成為了2020年更新列表中最常見的問題。
Solidity底層調用方法,(例如
address.call()
ZB發布基于TrueChain的ZB智能合約,總量為4000萬枚ZB:9月28日消息,ZB發公告稱,為豐富ZB的應用場景,支持TrueChain生態建設,中幣(ZB)發布基于TrueChain的ZB智能合約,總量為4000萬枚ZB,合約地址為0x25A59078E24f37100D2d617FEE2D12A7729debb8。平臺將于近期在ZB原合約地址(0xbd0793332e9fb844a52a205a233ef27a5b34b927)對應銷毀4000萬枚ZB幣,并開放基于TrueChain的ZB充提業務。此次發布,ZB積分的名稱、發行總量和流通量均保持不變。[2020/9/28]
)不會拋出異常。而是在遇到錯誤,返回
false
。
而如果使用合約調用
ExternalContract.doSomething()
時,如果
doSomething()
通過分布式賬本、智能合約可以促進應對氣候挑戰:一位評論人士就區塊鏈如何促進應對氣候挑戰提出以下觀點。第一,通過區塊鏈建立一個分布式賬本增加透明度,對不同企業的碳減排任務進行分配,避免同一個任務被兩家企業認領。同時通過鏈接物聯網等設備,可以保證碳減排任務完成。第二,對于退出氣候協定的國家如美國以及其他拒絕執行氣候協定的機構,可以設置一個智能合約讓這些國家和機構將一定量資金存入來做保障,如果他們違約則將這些資金用于解決氣候問題。但是這樣做有兩大弊端,第一不能保證上鏈數據正確性,第二不能保證關鍵機構加入。(econotimes)[2020/6/13]
拋出異常,則異常會繼續「冒泡」傳播。
應該通過檢查返回值來顯式處理不成功的情況,以下使用
addr.send()
進行以太幣轉賬是一個很好的例子,這對于其他外部調用也有效。
if(!addr.send(1)){revert(。
美國銀行CEO:美國銀行信任分布式賬本和智能合約的概念 擁有許多區塊鏈專利:今天美國銀行CEO Brian Moynihan在瑞士達沃斯世界經濟論壇接受了雅虎財經的采訪。被問及對比特幣的看法時,Moynihan首先發表了對區塊鏈的看法,他表示美國銀行信任分布式賬本和智能合約的概念,美國銀行擁有的區塊鏈專利比其他公司都要多。Moynihan隨后談到比特幣時表示,匿名貨幣的問題是政策問題。據谷歌專利數據庫的搜索顯示,美國銀行擁有27個包含“區塊鏈”詞的專利,36個專利包含“比特幣”,36個專利包含“數字貨幣”。[2018/1/25]
2.高成本循環
高成本循環從Solidity安全榜單的第四名上升至第二名。受該問題影響的智能合約數量增長了近30%。
大家都知道,以太坊上的運算是需要付費的。因此,減少完成操作所需的計算,不僅僅是優化問題,還涉及到成本費用。
循環是一個昂貴的操作,這里有一個很好的例子:數組中包含的元素越多,就需要更多迭代才能完成循環。最終,無限循環會耗盡所有可用GAS。
for(uint256i=0;i<elements.length;i++){//dosomething}
如果攻擊者能夠影響元素數組的長度,則上述代碼將導致拒絕服務(執行無法跳出循環)。而在掃描的智能合約中發現有8%的合約存在數組長度操縱問題。
3.權力過大的所有者
這是Soldiity十大安全問題新出現的問題,該問題影響了約16%的合約,某些合約與其所有者緊密相關,某些函數只能由所有者地址調用,如下例所示:
只有合約所有者能夠調用
doSomething()和doSomethingElse()
函數:前者使用onlyOwner修飾器,而后者則顯式執行該修飾器。這帶來了嚴重的風險:如果所有者的私鑰遭到泄露,則攻擊者可以控制該合約。
4.算術精度問題
由于使用256位虛擬機,Solidity的數據類型有些復雜。Solidity不提供浮點運算,并且少于32個字節的數據類型將被打包到同一個32字節的槽位中。考慮到這一點,你應該預見以下程序精度問題:
functioncalculateBonus(uintamount)returns(uint){returnamount/DELIMITER*BONUS;}
如上例所示,在乘法之前執行的除法,可能會有巨大的舍入誤差。
5.依賴tx.origin
6.溢出
Solidity的256位虛擬機存在上溢出和下溢出問題,這里有具體的分析。在
for
循環條件中使用
uint
數據類型時,開發人員要格外小心,因為它可能導致無限循環:
7.不安全的類型推導
該問題在Solidity十大安全問題排行榜中上升了兩位,現在影響到的智能合約比之前多了17%以上。
8.不正確的轉賬
此問題在Solidity十大安全問題榜單中從第六位下降到第八位,目前影響不到1%的智能合約。
9.循環內轉帳
當在循環體中進行以太幣轉賬時,如果其中一個轉賬失敗,那么整個交易將被回滾。
for(uinti=0;i<users.lenghth;i++){users.transfer(amount);}
在這個例子中,攻擊者可能利用此行為來進行拒絕服務攻擊,從而阻止其他用戶接收以太幣。
10.時間戳依賴
如果你的應用需要隨機性,可以參考RANDAO合約,該合約基于任何人都可以參與的去中心化自治組織,是所有參與者共同生成的隨機數。
總結
比較2018年和2020年十大常見問題時,我們可以觀察到開發最佳實踐的一些進展,尤其是那些影響安全性的實踐。看到2018年排名前2位的問題:外部合約拒絕服務和重入,已經不再榜單了,這是一個積極的信號,但仍然需要采取措施來避免這類常見錯誤。
請記住,智能合約在設計上是不可變的,這意味著一旦創建,就無法修補源代碼。這對安全性構成了巨大挑戰,開發人員應利用可用的安全測試工具來確保在部署之前對源代碼進行了充分的測試和審核。
Solidity是一種非常新且仍在成熟的編程語言,Solidityv0.6.0引入了一些重大更改,并且預計在以后的版本中還會有更多更改。
小探本期為大家帶來的內容主題是“歐洲刑警沒收價值超過4700萬美元的比特幣!”歡迎大家關注小探,小探每天都會給您獻上關于幣圈的優質內容哦 迄今為止.
1900/1/1 0:00:00在FTX崩盤之后,關于可能發生的事情的問題一直在肆虐。在過去的一周里,幣安首席執行官趙長鵬“CZ”和加拿大投資者凱文奧利里也因涉嫌參與FTX而展開了一場激烈的口水戰.
1900/1/1 0:00:00小探本期為大家帶來的內容主題是“狗狗幣能達到0.85美元嗎?看漲格局暗示上漲潛力”歡迎大家關注小探,小探每天都會給您獻上關于幣圈的優質內容哦。 狗狗幣最近因其價格下跌而引起關注.
1900/1/1 0:00:00小探本期為大家帶來的內容主題是“大多數美國人對接受央行數字貨幣很猶豫”歡迎大家關注小探,小探每天都會給您獻上關于幣圈的優質內容哦.
1900/1/1 0:00:00小探本期為大家帶來的內容主題是“為什么DARC會改變人類世界?”歡迎大家關注小探,小探每天都會給您獻上關于幣圈的優質內容哦 運營后股權情況為:DARC的Github代碼在這里.
1900/1/1 0:00:00小探本期為大家帶來的內容主題是“以太坊項目推出MEVBlocker以最小化無形稅收”歡迎大家關注小探.
1900/1/1 0:00:00