EIP-3529: 減少gas 返還
一級標題
一級標題
原因
原因
原因
最初引入SSTORE 和SELFDESTRUCT 的gas 返還是為了鼓勵應用開發者寫應用時能踐行“良好的狀態衛生”,清理不再需要的存儲槽與合約。但是,結果證明這項技術帶來的效率遠低於預期,gas 返還還帶來多項未預料到的有害後果:
參數
一級標題
參數
參數
對於存在block.number >= FORK_BLOCK 的區塊,需要作下列變更。
1. 移除SELFDESTRUCT 的返還
一級標題
一級標題
原理闡釋
EIP-2200 引入了返還的三種情況:
1. 如果原始值是非零,新值是零,添加SSTORE_CLEARS_SCHEDULE (當前是15,000)的gas 量到返還計算器
2. 如果原始值是零,當前值是非零,新值為零,添加SSTORE_SET_GAS - SLOAD_GAS (當前是19,900) 的gas 量到返還計算器
3. 如果原始值是非零,當前值是一個不一樣的非零值,新值等於原始值,添加SSTORE_RESET_GAS - SLOAD_GAS (當前是4,900)的gas 到返還計算器
在這三種情況裡,只有(1) 會啟動gastoken 且允許區塊在執行上消耗超過區塊gas limit 的gas。 (2) 不具有這個特點,因為要獲得19,900 的gas 返還,同一個存儲槽必須在之前從零改為非零,這需要消耗20,000 gas。無法從一個存儲槽獲得gas 並用它來編輯另一個存儲槽,意味著它不能被用作gas token。另外,獲得返還需要恢復存儲的寫入和擴展,使得返還的gas 不會增加客戶端處理區塊的工作量。 (3) 是相似的:只有當同一個存儲槽在之前已經消耗了5,000 gas 的時候才能獲得4,900 gas 返還。
此EIP 處理第一種情況。我們可以通過使用一個相似的“配對” 變元來確定在何種條件下gastoken 是不可用的(例如,你不可以在一個存儲槽裡獲得比你的輸入更多的gas) ,將每一筆返還映射到同一筆交易的同一個存儲槽的前一筆支出。當一個存儲槽的原始值是非零值,如果它被改為0 時,有兩個可能性:
1. 這可能是存儲槽第一次被設置為零。在這種情況下,我們可以把這個時間與SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST 第一次讀取和編輯存儲槽的最小開銷進行配對。
2. 這可能是存儲槽第二次被設置為零或被設置為零後的情況。在這種情況下,我們可以把這個事件與最近一次數值從零改為其他值,且SSTORE_CLEARS_SCHEDULE 的gas 從返還中被移除的變元進行配對。
對於第二次或之後的情況,SSTORE_CLEARS_SCHEDULE 的值是什麼並不重要,因為那個gas 大小的返還是與相同大小的清除返還相匹配的。這就只剩下第一種情況了。為了確保存儲槽上消耗的gas 總量為正,我們需要SSTORE_CLEARS_SCHEDULE <= SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST。因此,此EIP 只把SSTORE_CLEARS_SCHEDULE 減少到那兩項開銷的總和。
此EIP 的另一個原因是,清除還未被讀取的數據(通常是“無用”數據) 是不會有淨返還的,但清除被讀取過的數據(通常是“有用”數據) 還繼續會有淨返還。
向後兼容性
返還當前僅在交易執行後應用,因此無法對執行中任何特定可用的調用框架造成影響。因此,清除它們將不會破壞任何代碼的執行,儘管它將使得一些應用變得經濟上不可行。
Gas token 會變得沒有價值。 DeFi 套利機器人今天經常不是使用已有的gas token 方案就是一個定制的,以減少鏈上的開銷,這得益於重寫它們的代碼以清除對那些不再有用的gas 存儲機制的調用。
然而,完全保留在new = original = 0 != current 裡的返還,以及保留在其他nonzero -> zero 情況裡的一些返還能確保一些接收(和值得) 更好的gas 開銷待遇的關鍵用例能持續獲益。例如,zero -> nonzero -> zero 的存儲設置模式保持只需消耗大約100 gas。這些模式包括兩個重要實例:
➤ 反重入鎖(通常在一個子調用開始前從0 變為1,當子調用結束時再變回0)
➤ ERC20 授權與發送(當代幣轉移得到授權,"二級標題"二級標題
對清除存儲激勵的影響
對之前關於移除返還的EIP (EIP-3298 和EIP-3403) 的批評是這些EIP 完全消除了把一個值設為零的激勵,相當於鼓勵用戶不要完全清除一個存儲槽(即使他們想這麼做),哪怕他們想再次使用該存儲槽的機率是最小的。
舉一個例子,如果你有一個單位的ERC20 代幣,且你要送出或賣出你的所有餘額,你可以只給出0.999999 個單位,把剩餘的留下。如果你想在未來重新放入更多該種代幣到同一個賬戶,你僅需要為SSTORE 支付5,000 gas (2,100用於讀取+ 2,900用於非零變為非零的設置) 而不是22,100 ( 20,000 用於零到非零值的設置)。今天,這部分的gas 會被清除存儲獲得的15,000 gas 返還所抵消,因此,如果你有超過15000 / 17100 = 87.7% 的把握會再使用這個存儲槽,你才會有動力這樣做;按照EIP 3298或EIP 3403 的設定,抵消激勵這部分是不存在的,因此,如果你再次使用該存儲槽的可能性是大於0 的,設為非零值會更好。
二級標題
一級標題
二級標題
二級標題
二級標題
一級標題
一級標題
安全考慮
ECN的翻譯工作旨在為中國以太坊社區傳遞優質資訊和學習資源,文章版權歸原作者所有,轉載須註明原文出處以及ETH中文站。若需長期轉載,請聯繫eth@ecn.co進行授權。
ECN的翻譯工作旨在為中國以太坊社區傳遞優質資訊和學習資源,文章版權歸原作者所有,轉載須註明原文出處以及ETH中文站。若需長期轉載,請聯繫eth@ecn.co進行授權。
原文鏈接:https://eips.ethereum.org/EIPS/eip-3529
ECN的翻譯工作旨在為中國以太坊社區傳遞優質資訊和學習資源,文章版權歸原作者所有,轉載須註明原文出處以及ETH中文站。若需長期轉載,請聯繫eth@ecn.co進行授權。
公眾號:ETH 中文站
網站:ethereum.cn


