Hướng dẫn thực hành tối ưu hóa phí Gas cho hợp đồng thông minh Ethereum

Hướng dẫn thực hành tối ưu hóa Gas cho hợp đồng thông minh Ethereum

Phí Gas trên mạng chính Ethereum luôn là một vấn đề khó giải quyết, đặc biệt là khi mạng bị tắc nghẽn. Trong giờ cao điểm, người dùng thường phải trả phí giao dịch cao. Do đó, việc tối ưu hóa phí Gas trong giai đoạn phát triển hợp đồng thông minh là vô cùng quan trọng. Việc tối ưu hóa tiêu thụ Gas không chỉ có thể giảm chi phí giao dịch một cách hiệu quả mà còn nâng cao hiệu quả giao dịch, mang lại cho người dùng trải nghiệm sử dụng blockchain kinh tế và hiệu quả hơn.

Bài viết này sẽ tóm tắt cơ chế phí Gas của Máy ảo Ethereum (EVM), các khái niệm cốt lõi về tối ưu hóa phí Gas, cũng như các thực hành tốt nhất trong tối ưu hóa phí Gas trong phát triển hợp đồng thông minh. Hy vọng rằng những nội dung này có thể cung cấp cảm hứng và sự hỗ trợ thiết thực cho các nhà phát triển, đồng thời giúp người dùng bình thường hiểu rõ hơn về cách thức hoạt động của phí Gas EVM, cùng nhau đối mặt với những thách thức trong hệ sinh thái blockchain.

Gas tối ưu hóa hợp đồng thông minh Ethereum tốt nhất

Giới thiệu về cơ chế phí Gas của EVM

Trong các mạng tương thích EVM, "Gas" là đơn vị dùng để đo lường khả năng tính toán cần thiết để thực hiện các thao tác cụ thể.

Trong cấu trúc của EVM, việc tiêu tốn Gas được chia thành ba phần: thực thi thao tác, gọi tin nhắn từ bên ngoài và đọc/ghi bộ nhớ cũng như lưu trữ.

Do vì việc thực hiện mỗi giao dịch đều cần tài nguyên tính toán, nên sẽ bị thu một khoản phí nhất định để ngăn chặn vòng lặp vô hạn và từ chối dịch vụ (DoS) tấn công. Khoản phí cần thiết để hoàn thành một giao dịch được gọi là "Gas phí".

Kể từ khi EIP-1559( của hard fork London ) có hiệu lực, phí Gas được tính theo 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 sẽ bị tiêu hủy, phí ưu tiên sẽ được sử dụng như một động lực, khuyến khích các xác thực thêm giao dịch vào chuỗi khối. Khi gửi giao dịch, việc đặt phí ưu tiên cao hơn có thể tăng khả năng giao dịch được đưa vào khối tiếp theo. Điều này tương tự như việc người dùng trả "tiền boa" cho các xác thực.

Gas tối ưu hóa cho hợp đồng thông minh Ethereum: Mười thực hành tốt nhất

Hiểu 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 loạt "mã hoạt động", tức là opcodes.

Mọi đoạn mã hoạt động ( chẳng hạn như tạo hợp đồng, thực hiện gọi tin nhắn, truy cập lưu trữ tài khoản và thực hiện các thao tác 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 vàng Ethereum.

Sau nhiều lần sửa đổi EIP, một số mã thao tác có chi phí Gas đã được điều chỉnh, có thể sẽ khác với trong sách vàng.

Khái niệm cơ bản về tối ưu hóa Gas

Ý tưởng cốt lõi của việc tối ưu hóa Gas là ưu tiên lựa chọn các hoạt động có hiệu suất chi phí cao trên blockchain EVM, tránh các hoạt động có chi phí Gas đắt đỏ.

Trong EVM, các hoạt động sau đây có chi phí thấp hơn:

  • Đọc và ghi biến trong bộ nhớ
  • Đọc hằng số và biến không thay đổi
  • Đọc và ghi biến cục bộ
  • Đọc biến calldata, chẳng hạn như mảng và cấu trúc calldata
  • Gọi hàm nội bộ

Các hoạt động có chi phí cao bao gồm:

  • Đọc và ghi vào các biến trạng thái được lưu trữ trong hợp đồng thông minh
  • Gọi hàm bên ngoài
  • Hoạt động lặp lại

Gas tối ưu hóa hợp đồng thông minh Ethereum tốt nhất hàng đầu

Thực hành tối ưu hóa chi phí Gas EVM tốt nhất

Dựa trên những khái niệm cơ bản đã nêu, chúng tôi đã biên soạn một danh sách các thực tiễn tối ưu hóa phí Gas cho cộng đồng phát triển. Bằng cách tuân theo những thực tiễn này, các nhà phát triển có thể giảm thiểu mức tiêu thụ phí Gas của hợp đồng thông minh, giảm chi phí giao dịch và xây dựng các ứng dụng hiệu quả hơn và thân thiện với người dùng.

1. Cố gắng giảm thiểu việc sử dụng lưu trữ

Trong Solidity, Storage( lưu trữ) là một tài nguyên hạn chế, tiêu thụ Gas của nó 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ữ, sẽ phát sinh chi phí Gas cao.

Theo định nghĩa trong sách vàng của Ethereum, chi phí cho các thao tác lưu trữ cao hơn hơn 100 lần so với các thao tác bộ nhớ. Ví dụ, các lệnh OPcodesmload và mstore chỉ tiêu tốn 3 đơn vị Gas, trong khi các thao tác lưu trữ như sload và sstore, ngay cả trong điều kiện lý tưởng nhất, cũng cần ít nhất 100 đơn vị.

Các phương pháp hạn chế việc sử dụng lưu trữ bao gồm:

  • Lưu trữ dữ liệu không vĩnh viễn trong bộ nhớ
  • Giảm số lần sửa đổi lưu trữ: Bằng cách giữ kết quả trung gian trong bộ nhớ, sau khi tất cả các phép tính hoàn tất, sau đó phân phối kết quả cho các biến lưu trữ.

Tốp 10 thực tiễn tốt nhất để tối ưu hóa Gas cho hợp đồng thông minh Ethereum

2. Biến đóng gói

Số lượng slot lưu trữ ( và cách mà các nhà phát triển biểu thị dữ liệu trong hợp đồng thông minh sẽ ảnh hưởng lớn đến mức tiêu thụ Gas.

Trình biên dịch Solidity sẽ gộp các biến lưu trữ liên tiếp trong quá trình biên dịch và sử dụng 32 byte làm đơn vị cơ bản để lưu trữ biến. Gộp biến có nghĩa là 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.

Thông qua việc điều chỉnh chi tiết này, các nhà phát triển có thể tiết kiệm 20,000 đơn vị Gas ) để lưu trữ một khe lưu trữ chưa sử dụng cần tiêu tốn 20,000 Gas (, nhưng bây giờ chỉ cần hai khe lưu trữ.

Bởi vì mỗi kho lưu trữ đều tiêu tốn Gas, việc đóng gói biến tối ưu hóa việc sử dụng Gas bằng cách giảm số lượng kho lưu trữ cần thiết.

![Gas tối ưu hóa hợp đồng thông minh Ethereum tốt nhất])https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 3. Tối ưu hóa loại 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í thao tác tương ứng với các loại dữ liệu khác nhau cũng khác nhau. Lựa chọn loại dữ liệu phù hợp sẽ giúp tối ưu hóa việc sử dụng Gas.

Ví dụ, trong Solidity, số nguyên có thể được chia thành các kích thước khác nhau: uint8, uint16, uint32, v.v. Vì EVM thực hiện các phép toán 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.

Xét riêng, việc sử dụng uint256 thì đắt hơn uint8. Tuy nhiên, nếu sử dụng tối ưu hóa đóng gói biến thì khác. Nếu các nhà phát triển có thể đóng gói bốn biến uint8 vào một khe lưu trữ, thì tổng chi phí để lặp qua chúng sẽ thấp hơn so với bốn biến uint256. Bằng cách này, hợp đồng thông minh có thể đọc và ghi một khe lưu trữ một lần, và trong một thao tác, đưa bốn biến uint8 vào bộ nhớ/lưu trữ.

![Tối ưu hóa Gas cho hợp đồng thông minh Ethereum: Mười thực hành tốt nhất]###https://img-cdn.gateio.im/webp-social/moments-55fcdb765912ef9cd238c46b1d248cff.webp(

) 4. Sử dụng biến kích thước cố định thay thế biến động

Nếu dữ liệu có thể được kiểm soát trong 32 byte, nên sử dụng kiểu dữ liệu bytes32 thay cho bytes hoặc strings. Nói chung, biến có kích thước cố định tiêu tốn ít Gas hơn so với biến có kích thước thay đổi. Nếu chiều dài byte có thể bị giới hạn, hãy cố gắng chọn chiều dài nhỏ nhất từ bytes1 đến bytes32.

5. ánh xạ và mảng

Danh sách dữ liệu của 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.

Trong hầu hết các trường hợp, ánh xạ có hiệu suất cao hơn và chi phí thấp hơn, nhưng mảng có thể lặp lại và hỗ trợ việc đóng gói kiểu dữ liệu. Do đó, nên ư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 việc đóng gói kiểu dữ liệu.

![Gas tối ưu hóa hợp đồng thông minh Ethereum - Mười thực tiễn tốt nhất])https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. Sử dụng calldata thay vì memory

Các 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ể bị hàm thay đổi, trong khi calldata là không thay đổi.

Hãy nhớ nguyên tắc này: nếu tham số hàm là chỉ đọc, nên ưu tiên sử dụng calldata thay vì memory. Điều này có thể tránh được các thao tác sao chép không cần thiết từ calldata của hàm sang memory.

7. Cố gắng sử dụng từ khóa Constant/Immutable càng nhiều càng tốt

Biến Constant/Immutable sẽ không được lưu trữ trong bộ nhớ 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ã byte của hợp đồng. Do đó, chi phí truy cập của chúng thấp hơn nhiều so với bộ nhớ, khuyến nghị nên sử dụng từ khóa Constant hoặc Immutable khi có thể.

![Gas tối ưu hóa hợp đồng thông minh Ethereum tốt nhất]###https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.webp(

) 8. Sử dụng Unchecked khi đảm bảo không xảy ra tràn/thiếu.

Khi các nhà phát triển có thể xác định rằng các phép toán số học sẽ không gây tràn hoặc thiếu, 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 thiếu không cần thiết, từ đó tiết kiệm chi phí Gas.

Ngoài ra, các phiên bản biên dịch viên 0.8.0 và cao hơn không còn cần sử dụng thư viện SafeMath, vì biên dịch viên đã tích hợp sẵn chức năng bảo vệ tràn và thiếu.

9. Tối ưu hóa bộ sửa đổi

Mã của bộ chỉnh sửa được nhúng vào các hàm đã được chỉnh sửa, mỗi khi sử dụng bộ chỉnh sửa, mã của nó sẽ được sao chép. Điều này sẽ làm tăng kích thước bytecode và tăng tiêu thụ Gas.

Bằng cách cấu trúc lại logic thành hàm nội bộ _checkOwner###(, cho phép tái sử dụng hàm nội bộ này trong các bộ điều chỉnh, có thể giảm kích thước bytecode và giảm chi phí Gas.

![Gas tối ưu hóa hợp đồng thông minh Ethereum: Mười thực hành tốt nhất])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp(

) 10. Tối ưu hóa ngắn mạch

Đối với || và &&, phép toán logic sẽ xảy ra đánh giá ngắn mạch, tức 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ì điều kiện thứ hai sẽ không được đánh giá.

Để tối ưu hóa mức tiêu thụ Gas, nên đặt các điều kiện có chi phí tính toán thấp ở phía trước, như vậy có thể bỏ qua các phép tính tốn kém.

![Tối ưu hóa Gas cho hợp đồng thông minh Ethereum: 10 thực hành tốt nhất]###https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp(

Những khuyến nghị chung bổ sung

) 1. Xóa mã không cần thiết

Nếu trong hợp đồng có các hàm hoặc biến chưa sử dụng, nên xóa chúng. Đâ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ỏ.

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 sử dụng trực tiếp kết quả của một số phép tính, thì nên loại bỏ những quá trình tính toán thừa này. Về bản chất, bất kỳ phép tính nào không được sử dụng đều nên bị xóa.

  • Trong Ethereum, các 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ữ. Nếu không còn cần một biến nào đó, 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 hóa vòng lặp: tránh các thao tác vòng lặp tốn kém, kết hợp các vòng lặp khi có thể và chuyển các phép toán lặp lại ra ngoài thân vòng lặp.

![Ethereum hợp đồng thông minh của Gas tối ưu hóa mười thực hành tốt nhất]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

) 2. Sử dụng hợp đồng thông minh đã biên soạn sẵn

Hợp đồng thông minh được biên dịch trước cung cấp các hàm thư viện phức tạp, chẳng hạn như các thao tác mã hóa và băm. Vì mã không chạy trên EVM mà chạy trên nút khách hàng cục bộ, nên Gas cần thiết ít hơn. Sử dụng hợp đồng thông minh được biên dịch trước có thể tiết kiệm Gas bằng cách giảm khối lượng công việc tính toán cần thiết để thực thi hợp đồng thông minh.

Ví dụ về hợp đồng thông minh được biên soạn trước bao gồm thuật toán chữ ký số đường cong elliptic ###ECDSA( và thuật toán băm SHA2-256. Bằng cách sử dụng những hợp đồng thông minh biên soạn trước này trong hợp đồng thông minh, các nhà phát triển có thể giảm chi phí Gas và tăng hiệu suất hoạt động của ứng dụng.

) 3. Sử dụng mã lắp ghép nội tuyến

Nội tuyến lắp ráp ### in-line assembly ( cho phép các nhà phát triển viết mã cấp thấp nhưng hiệu quả có thể được EVM thực thi trực tiếp, mà không cần sử dụng mã op Solidity tốn kém. Nội tuyến lắp ráp còn cho phép kiểm soát chính xác hơn việc sử dụng bộ nhớ và lưu trữ, từ đó giảm thêm phí Gas. Hơn nữa, nội tuyến lắp ráp có thể thực hiện một số thao tác phức tạp khó thực hiện chỉ bằng Solidity, cung cấp thêm tính linh hoạt cho việc tối ưu hóa tiêu thụ Gas.

Tuy nhiên, việc sử dụng lắp ráp nội tuyến cũng có thể mang lại rủi ro và dễ mắc lỗi. Do đó, nên sử dụng cẩn thận, chỉ dành cho những nhà phát triển có kinh nghiệm.

![Ethereum hợp đồng thông minh của Gas tối ưu hóa mười thực hành tốt nhất])

Xem bản gốc
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Phần thưởng
  • 8
  • Chia sẻ
Bình luận
0/400
WalletInspectorvip
· 9giờ trước
gas phí quá đắt không bằng L2
Xem bản gốcTrả lời0
CryptoCross-TalkClubvip
· 07-11 01:06
Cười chết, phí Gas tăng lên, ví tiền của đồ ngốc đang cháy.
Xem bản gốcTrả lời0
liquiditea_sippervip
· 07-11 01:03
gas thật sự đắt đến mức không thể tin được.
Xem bản gốcTrả lời0
AirdropChaservip
· 07-11 01:03
Bây giờ gas có thể nhân văn hơn một chút không! Tiêu tiền như nước chảy
Xem bản gốcTrả lời0
MEVSandwichVictimvip
· 07-11 01:02
Vẫn đang tối ưu, mỗi ngày đều bị Gas vắt kiệt.
Xem bản gốcTrả lời0
LiquidityNinjavip
· 07-11 01:01
Tôi là ninja của thế giới mã hóa, phí Gas quá cao thực sự làm tôi đau lòng. Giao dịch theo điểm mới là con đường đúng đắn.

Xin hãy viết bình luận bằng tiếng Trung về bài viết này.
Xem bản gốcTrả lời0
DaoDevelopervip
· 07-11 00:56
vừa triển khai một hợp đồng thông minh tối ưu hóa gas... các bạn sẽ không tin vào khoản tiết kiệm này đâu
Xem bản gốcTrả lời0
ImpermanentPhilosophervip
· 07-11 00:44
gas花太 nhiều rồi không ngủ được
Xem bản gốcTrả lời0
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)