Cơ bản
Giao ngay
Giao dịch tiền điện tử một cách tự do
Giao dịch ký quỹ
Tăng lợi nhuận của bạn với đòn bẩy
Chuyển đổi và Đầu tư định kỳ
0 Fees
Giao dịch bất kể khối lượng không mất phí không trượt giá
ETF
Sản phẩm ETF có thuộc tính đòn bẩy giao dịch giao ngay không cần vay không cháy tải khoản
Giao dịch trước giờ mở cửa
Giao dịch token mới trước niêm yết
Futures
Truy cập hàng trăm hợp đồng vĩnh cửu
CFD
Vàng
Một nền tảng cho tài sản truyền thống
Quyền chọn
Hot
Giao dịch với các quyền chọn kiểu Châu Âu
Tài khoản hợp nhất
Tối đa hóa hiệu quả sử dụng vốn của bạn
Giao dịch demo
Giới thiệu về Giao dịch hợp đồng tương lai
Nắm vững kỹ năng giao dịch hợp đồng từ đầu
Sự kiện tương lai
Tham gia sự kiện để nhận phần thưởng
Giao dịch demo
Sử dụng tiền ảo để trải nghiệm giao dịch không rủi ro
Launch
CandyDrop
Sưu tập kẹo để kiếm airdrop
Launchpool
Thế chấp nhanh, kiếm token mới tiềm năng
HODLer Airdrop
Nắm giữ GT và nhận được airdrop lớn miễn phí
IPO Access
Mở khóa quyền truy cập đầy đủ vào các IPO cổ phiếu toàn cầu
Điểm Alpha
Giao dịch trên chuỗi và nhận airdrop
Điểm Futures
Kiếm điểm futures và nhận phần thưởng airdrop
Đầu tư
Simple Earn
Kiếm lãi từ các token nhàn rỗi
Đầu tư tự động
Đầu tư tự động một cách thường xuyên.
Sản phẩm tiền kép
Kiếm lợi nhuận từ biến động thị trường
Soft Staking
Kiếm phần thưởng với staking linh hoạt
Vay Crypto
0 Fees
Thế chấp một loại tiền điện tử để vay một loại khác
Trung tâm cho vay
Trung tâm cho vay một cửa
Khuyến mãi
AI
Gate AI
Trợ lý AI đa năng đồng hành cùng bạn
Gate AI Bot
Sử dụng Gate AI trực tiếp trong ứng dụng xã hội của bạn
GateClaw
Gate Tôm hùm xanh, mở hộp là dùng ngay
Gate for AI Agent
Hạ tầng AI, Gate MCP, Skills và CLI
Gate Skills Hub
Hơn 10.000 kỹ năng
Từ văn phòng đến giao dịch, thư viện kỹ năng một cửa giúp AI tiện lợi hơn
GateRouter
Lựa chọn thông minh từ hơn 40 mô hình AI, với 0% phí bổ sung
Ethereum坊hợp đồng thông minh的gas优化十大最佳实践
Gas trong Mạng chính của Ethereum đã trở thành một vấn đề khó khăn, đặc biệt là trong thời gian mạng bị tắc nghẽn. Trong đỉnh điểm, người dùng thường phải trả mức phí Rửa tiền cao. Do đó, tối ưu hóa chi phí Gas trong giai đoạn phát triển Hợp đồng thông minh là rất quan trọng. Tối ưu hóa tiêu thụ Gas không chỉ giúp giảm Chi phí giao dịch mà còn nâng cao hiệu suất giao dịch, mang lại trải nghiệm sử dụng blockchain kinh tế và hiệu quả hơn cho người dùng.
Bài viết này sẽ tổng quan về cơ chế phí gas của máy ảo Ethereum (EVM), các khái niệm cốt lõi liên quan đến tối ưu hóa phí gas, và các thực hành tốt nhất khi tối ưu hóa phí gas khi phát triển hợp đồng thông minh. Hy vọng rằng thông qua những nội dung này, sẽ cung cấp cảm hứng và hỗ trợ thực tế cho các nhà phát triển, đồng thời giúp người dùng thông thường hiểu rõ hơn về cách hoạt động phí gas của EVM, từ đó cùng nhau đối phó với thách thức trong hệ sinh thái blockchain.
Cơ chế phí Gas của EVM giới thiệu
Trên mạng lưới tương thích EVM, "gas" là đơn vị được sử dụng để đo lường khả năng tính toán cần thiết để thực hiện một hoạt động cụ thể.
Hình dưới đây mô tả cấu trúc của EVM. Trong hình, Chi phí gas được chia thành ba phần: thực hiện thao tác, gọi tin nhắn bên ngoài và đọc/ghi bộ nhớ và lưu trữ.
Do mỗi giao dịch đều cần tài nguyên tính toán để thực hiện, do đó sẽ thu phí nhất định để ngăn chặn vòng lặp vô hạn và tấn công từ chối dịch vụ (DoS). Phí cần thiết để hoàn thành một giao dịch được gọi là "phí Gas".
Từ khi EIP-1559 (London Hard Fork) có hiệu lực, phí gas được tính bằng công thức sau:
Phí gas = số đơn vị gas sử dụng * (phí cơ bản + phí ưu tiên)
Phí cơ bản được đốt cháy và phí ưu tiên được sử dụng như một động lực để khuyến khích người xác thực thêm các giao dịch vào blockchain. Đặt mức phí ưu tiên cao hơn khi gửi giao dịch có thể làm tăng khả năng giao dịch sẽ được đưa vào khối tiếp theo. Điều này tương tự như "tiền boa" mà người dùng trả cho trình xác thực.
1. Hiểu về việc tối ưu hóa gas trong EVM
Khi biên dịch hợp đồng thông minh bằng Solidity, hợp đồng sẽ được chuyển đổi thành một chuỗi các "mã hoạt động", hay còn gọi là opcodes.
Mỗi mã hoạt động (ví dụ như tạo hợp đồng, thực hiện cuộc gọi thông điệp, truy cập lưu trữ tài khoản và thực hiện hoạt động trên máy ảo) đều có một chi phí tiêu thụ Gas được công nhận, các chi phí này được ghi lại trong sách trắng Ethereum [2].
Sau nhiều lần điều chỉnh từ EIP, chi phí Gas của một số mã hoạt động đã được điều chỉnh và có thể khác so với sách vàng. Để biết thông tin chi tiết về chi phí mới nhất của mã hoạt động, vui lòng tham khảo tại đây [3].
2. Khái niệm cơ bản về tối ưu hóa gas
Phương châm tối ưu hóa Gas là ưu tiên chọn các hoạt động hiệu quả về chi phí trên chuỗi khối EVM, tránh các hoạt động tốn kém Gas.
Trong EVM, các hoạt động sau có chi phí thấp hơn:
Các hoạt động có chi phí cao bao gồm:
EVM Gas Chi phí tối ưu hóa của các thực hành tốt nhất
Dựa trên các khái niệm cơ bản trên, chúng tôi đã tổng hợp một danh sách các thực hành tối ưu hóa chi phí gas dành cho cộng đồng nhà phát triển. Bằng việc tuân theo những thực hành này, nhà phát triển có thể giảm thiểu chi phí gas cho hợp đồng thông minh, giảm thiểu chi phí giao dịch và xây dựng ứng dụng hiệu quả và thân thiện với người dùng hơn.
1. Hãy cố gắng giảm thiểu việc sử dụng bộ nhớ lưu trữ
Trong Solidity, Storage(lưu trữ)là một loại tài nguyên hạn chế, tiêu thụ Gas cao hơn nhiều so với Memory(bộ nhớ). Mỗi khi hợp đồng thông minh đọc hoặc ghi dữ liệu từ lưu trữ, đều tạo ra chi phí Gas cao.
The cost of storage operations is more than 100 times higher than that of memory operations, according to the definition in the ETH Yellow Paper. For example, the OPcodesmload and mstore instructions consume only 3 gas units, while storage operations such as sload and sstore, even in the best-case scenario, cost at least 100 units.
Các phương pháp giới hạn việc sử dụng lưu trữ bao gồm:
2. Gói biến
Số lượng Storage slot(khe lưu trữ) được sử dụng trong hợp đồng thông minh và cách mà các nhà phát triển biểu diễn dữ liệu sẽ ảnh hưởng đáng kể đến việc tiêu tốn chi phí gas.
Trình biên dịch Solidity sẽ đóng gói các biến lưu trữ liên tiếp trong quá trình biên dịch và sử dụng khe lưu trữ 32 byte làm đơn vị lưu trữ cơ bản của biến. Đóng gói biến có nghĩa là thông qua sắp xếp hợp lý các biến để nhiều biến có thể phù hợp vào một khe lưu trữ duy nhất.
Bên trái là cách triển khai hiệu quả thấp, sẽ tiêu tốn 3 khe lưu trữ; bên phải là cách triển khai hiệu quả hơn.
Thông qua việc điều chỉnh chi tiết này, nhà phát triển có thể tiết kiệm 20.000 đơn vị gas (để lưu trữ một khoảng trống chưa sử dụng, cần tiêu tốn 20.000 gas), nhưng hiện chỉ cần hai khoảng trống.
Vì mỗi khe lưu trữ đều tiêu tốn gas, việc đóng gói biến số giảm số lượng khe lưu trữ cần thiết để tối ưu hóa việc sử dụng gas.
3. Tối ưu hóa kiểu dữ liệu
Một biến có thể được biểu diễn bằng nhiều loại dữ liệu khác nhau, nhưng chi phí của các hoạt động tương ứng cũng khác nhau. Lựa chọn loại dữ liệu phù hợp giúp tối ưu hóa việc sử dụng Gas.
Ví dụ, trong Solidity, số nguyên có thể được chia nhỏ thành các kích thước khác nhau: uint8, uint16, uint32, vv. Do EVM thực hiện các hoạt động theo đơn vị 256 bit, việc sử dụng uint8 có nghĩa là EVM phải chuyển đổi nó thành uint256 trước, và việc chuyển đổi này sẽ tiêu tốn thêm Gas.
! [Top 10 phương pháp hay nhất để tối ưu hóa khí của Hợp đồng thông minh] (https://cdn-img.panewslab.com/yijian/2024/12/30/images/6e6c47d1fdce232294b30341f5f2ece6.jpg)
Chúng ta có thể so sánh chi phí gas của uint8 và uint256 thông qua đoạn mã trong hình. Hàm UseUint() tiêu tốn 120,382 đơn vị Gas, trong khi hàm UseUInt8() tiêu tốn 166,111 đơn vị Gas.
Khi xem riêng lẻ, sử dụng uint256 ở đây rẻ hơn uint8. Tuy nhiên, nếu sử dụng tối ưu hóa biến đã được đề xuất trước đó, điều này sẽ khác biệt. Nếu nhà phát triển có thể đóng gói bốn biến uint8 vào một khay lưu trữ, thì tổng chi phí của việc lặp lại chúng sẽ thấp hơn so với bốn biến uint256. Điều này cho phép Hợp đồng thông minh đọc/ghi một lần vào khay lưu trữ và đặt bốn biến uint8 vào bộ nhớ/lưu trữ trong một lần thao tác.
4. Sử dụng biến cố định kích thước thay vì biến động
Nếu dữ liệu có thể được kiểm soát trong 32 byte, đề nghị sử dụng kiểu dữ liệu bytes32 thay vì bytes hoặc strings. Thông thường, biến có kích thước cố định tốn ít Gas hơn biến có kích thước có thể thay đổi. Nếu độ dài byte có thể bị giới hạn, hãy chọn độ dài nhỏ nhất từ bytes1 đến bytes32 nếu có thể.
5. Ánh xạ và mảng
Danh sách dữ liệu trong Solidity có thể được biểu diễn bằng hai loại dữ liệu: Mảng (Arrays) và Ánh xạ (Mappings), nhưng cú pháp và cấu trúc của chúng hoàn toàn khác nhau.
Ánh xạ thường hiệu quả hơn và chi phí thấp hơn trong hầu hết các trường hợp, nhưng mảng có khả năng lặp lại và hỗ trợ gói dữ liệu. Do đó, khuyến nghị ưu tiên sử dụng ánh xạ khi quản lý danh sách dữ liệu, trừ khi cần lặp lại hoặc có thể tối ưu hóa tiêu thụ Gas thông qua gói dữ liệu.
6. Sử dụng calldata thay vì bộ nhớ
Biến được khai báo trong tham số hàm có thể được lưu trữ trong calldata hoặc memory. Sự khác biệt chính giữa hai loại này là memory có thể được thay đổi bởi hàm, trong khi calldata là không thay đổi.
Nhớ nguyên tắc này: Nếu tham số hàm là chỉ đọc, hãy ưu tiên sử dụng calldata thay vì memory. Điều này giúp tránh việc sao chép không cần thiết từ calldata của hàm sang memory.
Ví dụ 1: Sử dụng bộ nhớ
![EthereumHợp đồng thông minh的gas优化十大最佳实践]()
Khi sử dụng từ khóa memory, các giá trị của mảng sẽ được sao chép từ calldata đã được mã hóa vào memory trong quá trình giải mã ABI. Chi phí thực hiện khối mã này là 3,694 đơn vị gas.
Ví dụ 2: Sử dụng calldata
Khi đọc giá trị trực tiếp từ calldata, bỏ qua việc thao tác trung gian trong bộ nhớ. Cách tối ưu này giúp giảm chi phí thực hiện xuống chỉ còn 2.413 đơn vị Gas, hiệu suất Gas tăng lên 35%.
7. Hãy sử dụng từ khóa Constant/Immutable một cách tối đa
Biến Constant/Immutable không được lưu trữ trong bộ nhớ lưu trữ của hợp đồng. Những biến này sẽ được tính toán trong quá trình biên dịch và lưu trữ trong mã bytecode của hợp đồng. Do đó, so với việc lưu trữ, chi phí truy cập của chúng thấp hơn nhiều, đề nghị sử dụng từ khóa Constant hoặc Immutable càng nhiều càng tốt.
8. Sử dụng Unchecked khi đảm bảo không xảy ra tràn / tràn dữ liệu
Khi nhà phát triển có thể xác định rằng các phép toán số học không gây ra tràn hoặc tràn dưới, họ có thể sử dụng từ khóa unchecked được giới thiệu trong Solidity v0.8.0 để tránh kiểm tra tràn hoặc tràn dưới dư thừa, từ đó tiết kiệm Chi phí Gas.
Trong hình sau, bị ràng buộc điều kiện i
Ngoài ra, trình biên dịch phiên bản 0.8.0 trở lên không còn cần sử dụng thư viện SafeMath nữa, vì trình biên dịch đã tích hợp sẵn chức năng bảo vệ tràn và tràn âm.
9. Tối ưu hóa công cụ sửa đổi
Mã của trình sửa đổi được nhúng vào hàm đã được sửa đổi, mỗi khi sử dụng trình sửa đổi, mã của nó sẽ được sao chép. Điều này làm tăng kích thước byte mã và tăng gas tiêu thụ. Dưới đây là một phương pháp tối ưu hóa chi phí gas của trình sửa đổi:
Tối ưu trước:
! [Top 10 phương pháp hay nhất để tối ưu hóa khí của Hợp đồng thông minh] (https://cdn-img.panewslab.com/yijian/2024/12/30/images/59757bbd4eb217a80657c9b064d269bc.jpg)
Sau khi tối ưu hóa:
Trong trường hợp này, việc tái cấu trúc logic thành hàm nội bộ _checkOwner() cho phép tái sử dụng hàm nội bộ đó trong modifier, có thể giảm kích thước bytecode và giảm Chi phí giao dịch gas.
10. Tối ưu hóa ngắn mạch
Đối với||và toán tử &&, phép toán logic sẽ xảy ra đánh giá ngắn, nghĩa là nếu điều kiện đầu tiên đã có thể xác định kết quả của biểu thức logic, thì sẽ không đánh giá điều kiện thứ hai.
Để tối ưu hóa việc tiêu thụ gas, điều kiện tính toán có chi phí thấp nên được đặt phía trước, điều này có thể giúp bỏ qua các tính toán có chi phí cao.
Gợi ý tổng quát
1. Xóa mã không cần thiết
Nếu hợp đồng có chứa các hàm hoặc biến chưa được sử dụng, nên xóa chúng đi. Đây là cách trực tiếp nhất để giảm chi phí triển khai hợp đồng và giữ cho kích thước hợp đồng nhỏ nhất.
Dưới đây là một số gợi ý hữu ích:
Sử dụng thuật toán hiệu quả nhất để tính toán. Nếu hợp đồng trực tiếp sử dụng kết quả của một số phép tính, thì các quá trình tính toán dư thừa này nên được loại bỏ. Theo bản chất, bất kỳ phép tính nào không sử dụng cũng nên được xóa bỏ.
Trong Ethereum, nhà phát triển có thể nhận được phần thưởng Gas bằng cách giải phóng không gian lưu trữ. Khi không còn cần biến số nào nữa, bạn nên sử dụng từ khóa delete để xóa nó hoặc đặt nó về giá trị mặc định.
Tối ưu vòng lặp: Tránh các hoạt động vòng lặp có chi phí cao, hợp nhất các vòng lặp một cách tối đa và di chuyển tính toán lặp lại ra khỏi cơ thể vòng lặp.
2. Sử dụng hợp đồng tiền tố
Hợp đồng tiên lượng cung cấp các hàm thư viện phức tạp, chẳng hạn như mã hóa và băm. Do mã không chạy trên EVM mà chạy cục bộ trên nút khách hàng, nên cần ít Gas hơn. Sử dụng hợp đồng tiên lượng có thể tiết kiệm Gas bằng cách giảm công việc tính toán cần thiết để thực hiện hợp đồng thông minh.
Ví dụ về hợp đồng được biên dịch trước bao gồm thuật toán chữ ký số đường cong elip (ECDSA) và thuật toán băm SHA2-256. Bằng cách sử dụng các hợp đồng thông minh này trong Ethereum, nhà phát triển có thể giảm chi phí giao dịch và tăng hiệu suất hoạt động của ứng dụng.
Để xem danh sách đầy đủ các hợp đồng được biên dịch trước được hỗ trợ trên mạng chính Ethereum (ETH),vui lòng xem tại đây [4].
3. Sử dụng mã lồng ghép
Lập trình nhúng (in-line assembly) cho phép nhà phát triển viết mã hiệu quả nhưng cấp thấp có thể được thực thi trực tiếp bởi EVM mà không cần sử dụng các mã hoạt động Solidity đắt tiền. Lập trình nhúng cũng cho phép kiểm soát chính xác hơn việc sử dụng bộ nhớ và lưu trữ, giúp giảm chi phí Gas. Ngoài ra, lập trình nhúng có thể thực hiện một số thao tác phức tạp mà khó có thể thực hiện bằng Solidity, cung cấp thêm linh hoạt cho việc tối ưu hóa tiêu thụ Gas.
Dưới đây là ví dụ mã sử dụng lệnh nhúng để tiết kiệm gas:
Từ hình trên, có thể thấy so với trường hợp sử dụng chuẩn, trường hợp thứ hai sử dụng công nghệ lắp ráp nội tại có hiệu suất Gas cao hơn.
Tuy nhiên, việc sử dụng lập trình nhúng cũng có thể mang lại rủi ro và dễ mắc lỗi. Do đó, hãy sử dụng cẩn thận, chỉ dành cho các nhà phát triển giàu kinh nghiệm.
4. Sử dụng giải pháp Layer 2
Sử dụng giải pháp Layer 2 có thể giảm lượng dữ liệu cần được lưu trữ và tính toán trên Mạng chính Ethereum.
Các giải pháp Layer 2 như rollups, sidechain và state channel có thể giảm bớt giao dịch từ chuỗi chính Ethereum, giúp giao dịch nhanh hơn và rẻ hơn.
Bằng cách gói gọn một lượng lớn giao dịch lại với nhau, các giải pháp này giảm số lượng giao dịch trên chuỗi và giảm Thả phí Gas. Sử dụng giải pháp Layer 2 cũng cải thiện tính mở rộng của Ethereum, cho phép thêm người dùng và ứng dụng tham gia vào mạng mà không gây tắc nghẽn mạng.
5. Sử dụng công cụ và thư viện tối ưu hóa
Có nhiều công cụ tối ưu hóa có sẵn để sử dụng, ví dụ như trình tối ưu hóa solc, trình tối ưu hóa xây dựng của Truffle và trình biên dịch Solidity của Remix.
Những công cụ này có thể giúp giảm kích thước bytecode, loại bỏ mã không sử dụng và giảm số lần thực hiện các hoạt động cần thiết cho hợp đồng thông minh. Kết hợp với các thư viện tối ưu Gas khác như 'solmate', nhà phát triển có thể giảm chi phí Gas và tăng hiệu quả của hợp đồng thông minh.
Kết luận
Tối ưu hóa tiêu thụ gas là bước quan trọng đối với nhà phát triển, không chỉ giúp giảm Chi phí giao dịch mà còn tăng hiệu suất của Hợp đồng thông minh trên mạng EVM tương thích. Bằng cách ưu tiên thực hiện các hoạt động tiết kiệm chi phí, giảm việc sử dụng bộ nhớ, sử dụng lập trình nhúng và tuân thủ các quy tắc tốt nhất khác được thảo luận trong bài viết này, nhà phát triển có thể hiệu quả giảm tiêu thụ gas của hợp đồng.
Tuy nhiên, điều cần lưu ý là trong quá trình tối ưu hóa, nhà phát triển phải thận trọng để tránh tạo ra lỗ hổng bảo mật. Trong quá trình tối ưu hóa mã và giảm tiêu thụ Gas, không bao giờ nên hy sinh tính bảo mật của hợp đồng thông minh.
[1] :
[2] :
[3] :
[4] :precompiled