多話短說:坎昆升級即將到來,此次升級主要包括 EIP-1153、EIP-4788、EIP-4844、EIP-5656、EIP-6780 和 EIP-7516 六大 EIP 提出的執行層變更。 EIP-4844 是此次升級的主角,旨在提高 以太坊 的可擴充性,降低 交易成本 L2,提高交易速度。 坎昆升級於1月17日、1月30日、2月7日在以太坊戈爾利、塞波利亞和霍爾斯基測試網完成,計劃於3月13日在以太坊 主網啟動。 在升級之前,Salus已經為這次升級整理了重要的安全注意事項,供開發者自行檢查。
彈性公網IP提案審核
官方披露的安全注意事項
智能合約相關風險
閱讀更多
EIP-1153 引入了臨時存儲操作碼,這些操作碼用於操作狀態,其行為與存儲幾乎相同,但在每次事務完成後都會被丟棄。 這意味著臨時存儲不會反序列化存儲中的值,也不會將值序列化到存儲,因此臨時存儲的成本較低,因為它不需要磁碟訪問。 使用兩個新的操作代碼,TLOAD和TSTORE(其中“T”代表“臨時”),智能合約可以訪問臨時存儲。 該提案旨在為以太坊事務執行中多嵌套執行框架之間的通信提供專用且高效的解決方案。
EIP-4788 旨在向 EVM 公開信標鏈塊的哈希樹根,以允許訪問智能合約內的這些根。 這樣做提供了對共識層狀態的無信任訪問,支援多用例,例如質押池、重新質押結構、智能合約橋、MEV 緩解等。 該提案通過智能合約存儲這些根,並使用環形緩衝區來限制存儲消耗,確保每個執行區塊只需要一個常量空來表示此資訊。
EIP-4844 引入了一種稱為“分片 Blob 事務”的新事務格式,旨在以簡單、向前相容的方式擴展以太坊的數據可用性。 此提案通過引入「攜帶 blob 的事務」來實現此目的,這些事務包含大量數據,EVM 執行無法訪問這些數據,但可以訪問其承諾。 此格式與完整分片將來使用的格式完全相容,為滾動縮放提供了暫時但顯著的緩解。
EIP-5656 引入了新的 EVM 指令 MCOPY,用於高效複製記憶體區域。 該提案旨在通過 MCOPY 指令直接啟用記憶體之間的數據複製,從而降低在 EVM 上執行記憶體複製操作的開銷。 MCOPY 允許源和目標地址 地址重疊,在設計時考慮了向後相容性,旨在提高多場景的執行效率,包括數據結構構建、高效訪問記憶體中物件和複製。
EIP-6780 修改了自毀操作碼的功能。 在此提案中,SELFDESTRUCT只會刪除帳戶並轉移與創建合約相同的交易中的所有以太,除了在執行SELFDESTRUCT時,合約不會被刪除,而只是將所有以太轉移到指定的目的地。 此更改旨在適應將來使用 Verkle 樹,並旨在簡化 EVM 實現並降低狀態更改的複雜性,同時保留 SELFDESTRUCT 使用的一些常見方案。
EIP-7516 引入了新的 EVM 指令 BLOBBASEFEE,該指令返回當前區塊執行中的 blob 基本費用值。 此指令類似於 EIP-3198 中的 BASEFEE 操作碼,不同之處在於它返回 EIP-4844 定義的 blob 基本費用。 此功能允許合約以程式設計方式考慮 blob 數據的 gas 價格,例如,允許匯總合約以不受信任的方式計算使用 blob 數據的成本,或基於此實現 blob gas 期貨以平滑 blob 數據成本。
智能合約開發人員在使用臨時存儲變數之前應了解它們的生命週期。 由於臨時存儲會在事務結束時自動清除,因此智能合約開發人員可能會盡量避免在調用期間清除插槽以節省燃料。 但是,這可能會阻止在同一事務中與合約進一步交互(例如,在可重入鎖的情況下)或導致其他錯誤,因此智能合約開發人員應注意僅在保留臨時槽時保留非零值。 旨在供同一事務中的未來調用使用。 否則,這些操作代碼的行為與 和 SLOAD 完全相同,因此所有常見的安全注意事項都適用,尤其是在涉及重入風險時。
智能合約開發人員還可以嘗試使用瞬態存儲作為記憶體映射的替代方法。 他們應該知道,當調用返回或恢復時,臨時存儲不會像記憶體一樣被丟棄,並且在這些用例中應優先考慮記憶體,以避免在同一事務中重新進入時出現意外行為。 記憶體上的瞬態存儲必然是昂貴的,這應該可以防止這種使用模式。 使用鍵排序的條目清單可以更好地實現記憶體中映射的大量多使用,並且在智能合約中很少需要記憶體中映射(即作者知道生產中沒有已知的用例)。
此 EIP 將頻寬需求增加約 0.75 MB,每個信標塊的最大多。 這比今天的理論最大區塊大小(30 M Gas / 16 Gas per calldata 位元組 = 1.875 M 位元組)大 40%,因此它不會顯著增加最壞情況下的頻寬。 合併后,區塊時間是靜態的,而不是不可預測的泊松分佈,為大區塊的傳播提供了有保證的時間段。
即使調用數據有限,此 EIP 的持續負載也比可能降低調用數據成本的替代方案低多,因為不需要存儲 blob 的時間與執行負載一樣長。 這樣就可以實現這些 Blob 必須至少保留一段時間的策略。 選擇的特定值是 MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS 紀元,大約為 18 天,與建議的(但尚未實現)的執行有效負載歷史記錄的一年輪換相比,延遲為 多。
用戶端應注意,它們的實現不使用中間緩衝區(例如,C stdlibmemmove 函數不使用中間緩衝區),因為這是潛在的拒絕服務 (DoS) 向量。 多用於移動位元組的語言內置/標準庫函數在這裡具有正確的性能特徵。
除此之外,對拒絕服務 (DoS) 和記憶體耗盡攻擊的分析與其他觸摸記憶體的操作碼相同,因為記憶體擴展遵循相同的定價規則。
以下自毀應用程式將受到損害,以這種方式使用它的應用程式不再安全:
其中 CREATE 2 用於在同一位置重新部署協定,以便協定可升級。 不再支援此功能,應改用 ERC-2535 或其他類型的代理合約。
如果合約依賴於以SELFDESTRUCT合約為受益人的銷毀以太,則合約不會在同一筆交易中創建。
考慮使用操作碼 LOAD 和 TSTORE 的兩種方案:
風險 1 :
與傳統的SSTORE和SLOAD相比,新的瞬態存儲主要改變了數據的存儲週期,tstore存儲的數據通過tload讀取,數據將在交易執行后釋放,而不是像sstore被永久記錄的那樣寫入合約。 開發者在使用操作碼時應認識到操作碼的特點,避免因錯誤使用無法正確寫入合約的數據而造成的損失。 此外,tstore 的數據是一個私有變數,只能由合約本身訪問。 如果要在外部使用數據,則只能將其作為參數傳遞或將其暫存到公共存儲變數中。
風險 2 :
另一個潛在風險是,如果智能合約開發人員沒有正確管理瞬態存儲變數的生命週期,可能會導致數據在不適當的時間被清除或錯誤地保留。 如果合約希望在對事務的後續調用中使用存儲在瞬態存儲中的數據,但未能正確管理該數據的生命週期,則數據可能會在不同調用之間錯誤地共用或丟失,從而導致邏輯錯誤或安全漏洞。 考慮到類似代幣專案的餘額或準備金數據存儲不正確,會導致合同邏輯錯誤,造成損失。 或者在設置擁有者地址時使用此操作碼會導致特權地址無法正確記錄,從而失去對合約重要參數的修改。
考慮一個使用瞬態存儲臨時記錄加密貨幣交易平臺上交易價格的智能合約。 合約在每筆交易完成時更新價格,並允許使用者在短時間內查詢最新價格。 但是,如果合約設計沒有考慮到瞬態存儲在交易結束時自動清除的事實,那麼使用者可能會在一筆交易結束和下一筆交易開始之間的時間段內獲得錯誤或過時的價格。 這不僅可能導致使用者根據錯誤資訊做出決策,而且還可能被惡意利用,影響平臺的聲譽和用戶資產的安全。
該提案改變了自毀操作碼之前的行為,不銷毀合約,只轉移代幣,只有與自毀在同一交易中創建的合約才會被銷毀。 這個彈性公網IP的影響比較大。
與 create 2 在同一地址重新部署合約以升級合約。 不再支援此功能,應改用 ERC-2535 或其他類型的代理合約。 (這可能會影響使用 create 2 實現可擴展合約的鏈上合約的安全性)
智能合約中的自毀操作允許銷毀合約,並將合約餘額發送到指定的目的地地址。 在這種情況下,合約使用 SELFDESTRUCT 燒錄以太並將燒錄的以太發送到合約。 但是,合約只能是在同一筆交易中創建的合約(由該合約創建的合約或同一筆交易中的其他合約)。 否則,只轉讓以太而不銷毀合同(例如自毀,受益人是自毀合同,不會改變任何東西)。 這將影響任何依賴自毀提款或其他操作的合約。
類似於 1 英寸 CHI 代幣的 gas 代幣工作:保持偏移量,始終在該偏移量處執行 CREATE 2 或自毀。 在此更新之後,如果具有當前偏移量的合約尚未正確自毀,則後續的 CREATE 2 將無法成功部署合約。
這個提議的實施不會導致對合約的直接攻擊,但會破壞原來部署依賴自毀操作的合約的正常邏輯(只依靠自毀進行資金轉帳的合約不受影響,如果後續操作必須要求刪除自毀合約,就會受到影響),導致合約無法按預期工作,只對合約和使用者而言,可能導致合約的罷工、資金損失等危害(如原使用Create 2)。 在原地址部署新合約,自毀原合約升級的合約無法再成功部署)。 從長遠來看,修改操作碼的能力可能會導致集中化問題。
例如,有一個現有的保管庫合約保管庫需要更新:
坎昆升級將進一步增強以太坊的競爭優勢。 但是,此升級會給核心智能合約層的更改帶來風險,這將影響現有DApp的安全運行。 在智能合約發展過程中,這些變化和可能出現的風險也需要密切關注。 您可以聯繫Salus進行風險檢查或審計支援,也可以進一步閱讀以瞭解更改。
坎昆網路升級規範
EIP-1153
EIP-4788
EIP-4844
EIP-5656
EIP-6780
EIP-7516
元足合約
氣體代幣 2 合約