以太坊主網(wǎng)的 Gas 費(fèi)用問(wèn)題在網(wǎng)絡(luò)擁堵時(shí)尤為突出,尤其是在高峰期,用戶(hù)需支付高昂的交易費(fèi)用。因此,在智能合約開(kāi)發(fā)階段進(jìn)行 Gas 費(fèi)優(yōu)化至關(guān)重要。優(yōu)化不僅能降低交易成本,還能提升效率,為用戶(hù)提供更經(jīng)濟(jì)、高效的區(qū)塊鏈體驗(yàn)。
本文概述了以太坊虛擬機(jī)(EVM)的 Gas 費(fèi)機(jī)制、Gas 費(fèi)優(yōu)化的核心概念及最佳實(shí)踐,旨在為開(kāi)發(fā)者提供實(shí)用幫助,并幫助普通用戶(hù)理解 EVM 的 Gas 費(fèi)運(yùn)作方式。
EVM 的 Gas 費(fèi)機(jī)制簡(jiǎn)介
在兼容 EVM 的網(wǎng)絡(luò)中,「Gas」是測(cè)量執(zhí)行特定操作所需計(jì)算能力的單位。
來(lái)源:以太坊官網(wǎng)[1]
每筆交易都需要計(jì)算資源,因此會(huì)收取費(fèi)用以防止無(wú)限循環(huán)和拒絕服務(wù)(DoS)攻擊。自 EIP-1559 生效以來(lái),Gas 費(fèi)通過(guò)以下公式計(jì)算:
Gas fee = units of gas used * (base fee priority fee)
基礎(chǔ)費(fèi)被銷(xiāo)毀,優(yōu)先費(fèi)用作為激勵(lì),鼓勵(lì)驗(yàn)證者將交易添加到區(qū)塊鏈中。
1. 理解 EVM 中的 Gas 優(yōu)化
當(dāng)用 Solidity 編譯智能合約時(shí),合約會(huì)被轉(zhuǎn)換為一系列操作碼(opcodes)。每個(gè)操作碼都有一個(gè)公認(rèn)的 Gas 消耗成本,記錄在以太坊黃皮書(shū)中。
2. Gas 優(yōu)化的基本概念
Gas 優(yōu)化的核心是在 EVM 區(qū)塊鏈上選擇成本效率高的操作,避免昂貴的操作。
低成本操作包括:
讀寫(xiě)內(nèi)存變量 讀取常量和不可變變量 讀寫(xiě)本地變量 讀取 calldata 變量 內(nèi)部函數(shù)調(diào)用高成本操作包括:
讀寫(xiě)存儲(chǔ)中的狀態(tài)變量 外部函數(shù)調(diào)用 循環(huán)操作EVM Gas 費(fèi)優(yōu)化最佳實(shí)踐
以下是 Gas 費(fèi)優(yōu)化的最佳實(shí)踐清單,幫助開(kāi)發(fā)者降低智能合約的 Gas 消耗,減少交易成本并提高應(yīng)用效率。
1. 減少存儲(chǔ)使用
存儲(chǔ)操作的 Gas 成本遠(yuǎn)高于內(nèi)存操作。每次從存儲(chǔ)中讀取或?qū)懭霐?shù)據(jù)都會(huì)產(chǎn)生高額費(fèi)用。限制存儲(chǔ)使用的方法包括:
將非永久性數(shù)據(jù)存儲(chǔ)在內(nèi)存中 減少存儲(chǔ)修改次數(shù)2. 變量打包
合理安排變量,使多個(gè)變量適配到單個(gè)存儲(chǔ)槽中,可以節(jié)省 Gas。例如,將四個(gè) uint8 變量打包到一個(gè)存儲(chǔ)槽中,可節(jié)省大量 Gas。
3. 優(yōu)化數(shù)據(jù)類(lèi)型
選擇合適的數(shù)據(jù)類(lèi)型有助于優(yōu)化 Gas 使用。例如,使用 bytes32 替代 bytes 或 strings 可減少 Gas 消耗。
4. 使用固定大小變量替代動(dòng)態(tài)變量
建議使用固定大小的變量如 bytes32 替代動(dòng)態(tài)變量,以減少 Gas 消耗。
5. 映射與數(shù)組
優(yōu)先使用映射管理數(shù)據(jù)列表,除非需要迭代或可以通過(guò)數(shù)據(jù)類(lèi)型打包優(yōu)化 Gas 消耗。
6. 使用 calldata 代替 memory
如果函數(shù)參數(shù)是只讀的,應(yīng)優(yōu)先使用 calldata 而非 memory。
7. 盡可能使用 Constant/Immutable 關(guān)鍵字
Constant/Immutable 變量不會(huì)存儲(chǔ)在合約的存儲(chǔ)中,訪(fǎng)問(wèn)成本低。
8. 在確保不會(huì)發(fā)生溢出 / 下溢時(shí)使用 Unchecked
使用 unchecked 關(guān)鍵字可以避免多余的溢出或下溢檢查,從而節(jié)省 Gas 成本。
9. 優(yōu)化修改器
重構(gòu)修改器邏輯為內(nèi)部函數(shù),可減少字節(jié)碼大小并降低 Gas 成本。
10. 短路優(yōu)化
將計(jì)算成本低廉的條件放在前面,可以跳過(guò)成本高昂的計(jì)算。
附加一般性建議
1. 刪除無(wú)用代碼
刪除未使用的函數(shù)或變量,減少合約部署成本。
2. 使用預(yù)編譯合約
使用預(yù)編譯合約如 ECDSA 和 SHA2-256 哈希算法,可以降低 Gas 成本。
3. 使用內(nèi)聯(lián)匯編代碼
內(nèi)聯(lián)匯編允許編寫(xiě)高效代碼,減少 Gas 消耗。
4. 使用 Layer 2 解決方案
Layer 2 解決方案如 rollups 和側(cè)鏈可以減少鏈上交易數(shù)量,降低 Gas 費(fèi)用。
5. 使用優(yōu)化工具和庫(kù)
使用 solc 優(yōu)化器等工具可以最小化字節(jié)碼大小,減少 Gas 消耗。
結(jié)論
優(yōu)化 Gas 消耗是開(kāi)發(fā)者的重要步驟,既能降低交易成本,又能提高智能合約效率。遵循上述最佳實(shí)踐,開(kāi)發(fā)者可以有效減少合約的 Gas 消耗,但必須謹(jǐn)慎操作,以防引入安全漏洞。
[1] :https://ethereum.org/en/developers/docs/gas/
[2] :https://ethereum.github.io/yellowpaper/paper.pdf
[3] :https://www.evm.codes/
[4] :https://www.evm.codes/precompiled
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。