Hướng dẫn tối ưu hóa phí Gas cho hợp đồng thông minh EVM - 13 mẹo hữu ích

Tối ưu hóa Gas phí EVM - Hướng dẫn phát triển hợp đồng thông minh Ethereum

Chi phí Gas của mạng chính Ethereum luôn là một vấn đề được quan tâm, đặc biệt là khi mạng bị tắc nghẽn. Trong thời gian cao điểm, người dùng thường phải trả những khoản phí giao dịch đắt đỏ. Do đó, việc tối ưu hóa chi phí Gas trong giai đoạn phát triển hợp đồng thông minh là vô cùng quan trọng. Tối ưu hóa tiêu thụ Gas không chỉ có thể giảm thiểu chi phí giao dịch 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 Ethereum Virtual Machine (EVM), các khái niệm cốt lõi liên quan đến tối ưu hóa phí Gas, cũng như các thực tiễn tốt nhất trong việc tối ưu hóa phí Gas khi phát triển hợp đồng thông minh. Hy vọng những nội dung này có thể cung cấp cảm hứng và sự trợ giúp 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 trong 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 10 thực tiễn 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ị được sử dụng để đo lường khả năng tính toán cần thiết để thực hiện các hoạt động 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 hiện thao tác, gọi tin nhắn bên ngoài và đọc ghi bộ nhớ cũng như lưu trữ.

Do vì mỗi giao dịch được thực hiện đều cần tài nguyên tính toán, nên sẽ thu một khoản phí nhất định để tránh 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à "phí Gas".

Kể từ khi EIP-1559 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 nhận viên thêm giao dịch vào chuỗi khối. Thiết lập 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 được đưa vào khối tiếp theo. Điều này tương tự như một loại "tiền boa" mà người dùng trả cho các xác nhận viên.

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

Hiểu về 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 các "mã lệnh", tức là opcodes.

Bất kỳ đoạn mã hoạt động nào ( 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 thao tác trên máy ảo ) đều có một chi phí tiêu tốn Gas được công nhận, những chi phí này được ghi lại trong sách vàng của Ethereum.

Sau nhiều lần chỉnh sửa EIP, một số mã thao tác đã được điều chỉnh chi phí Gas, có thể 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 chọn các thao tác có hiệu quả chi phí cao trên blockchain EVM, tránh các thao tác có chi phí Gas đắt đỏ.

Trong EVM, các thao tác sau có chi phí thấp hơn:

  • Đọc và ghi biến 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 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 vòng

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

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

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

Trong Solidity, Storage( là một tài nguyên hạn chế, tiêu tốn Gas cao hơn nhiều so với Memory). Mỗi lần 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 trắng Ethereum, chi phí cho các thao tác lưu trữ cao gấp hơn 100 lần so với các thao tác bộ nhớ. Ví dụ, các lệnh OPcodes mload 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ối thiểu 100 đơn vị.

Các phương pháp hạn chế 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 lưu trữ kết quả trung gian trong bộ nhớ, sau khi tất cả các phép tính hoàn thành, mới phân phối kết quả cho biến lưu trữ.

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

( 2. Gói biến

Số lượng Storage slot) đượ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 lớn đến mức tiêu hao 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 32 byte làm đơn vị cơ bản cho việc lưu trữ biến. Việc đóng gói 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 đóng gói biến, các nhà phát triển có thể tiết kiệm một lượng lớn đơn vị Gas. Do mỗi ô 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 ô 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 kiểu dữ liệu

Việc 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 thành các kích thước khác nhau: uint8, uint16, uint32, v.v. Do EVM thực hiện các thao tác theo đơn vị 256 bit, việc sử dụng uint8 có nghĩa là EVM phải chuyển đổi nó sang uint256 trước, và việc chuyển đổi này sẽ tiêu tốn thêm Gas.

Tuy nhiên, nếu sử dụng tối ưu hóa gói biến, việc gói bốn biến uint8 vào một khe lưu trữ sẽ có tổng chi phí lặp lại 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ữ.

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

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, các biến có kích thước cố định tiêu tốn ít Gas hơn các 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 trong Solidity có thể được biểu diễn bằng hai loại dữ liệu: mảng ) Arrays ### và bản đồ ### 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ó tính chất có thể lặp lại và hỗ trợ đó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.

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

) 6. Sử dụng calldata thay thế 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 chúng là, memory có thể được hàm sửa đổi, trong khi calldata là không thay đổi.

Hãy nhớ nguyên tắc này: nếu tham số của 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 việc sao chép không cần thiết từ calldata của hàm sang memory.

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

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à được 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 rất nhiều so với bộ nhớ, vì vậy nên sử dụng từ khóa Constant hoặc Immutable nếu có thể.

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

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 dẫn đến 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 từ 0.8.0 trở lên không còn cần sử dụng thư viện SafeMath, vì trình biên dịch đã tích hợp sẵn chức năng bảo vệ tràn và thiếu trong chính nó.

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

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

Mã của bộ sửa đổi được nhúng vào các hàm đã được sửa đổi, mỗi khi sử dụng bộ sửa đổi, mã của nó sẽ được sao chép. Điều này sẽ làm tăng kích thước bytecode và làm tăng tiêu thụ Gas. Bạn có thể giảm kích thước bytecode và giảm chi phí Gas bằng cách tái cấu trúc logic thành các hàm bên trong và sử dụng lại hàm bên trong đó trong bộ sửa đổi.

Ethereum hợp đồng thông minh của Gas tối ưu hóa mười thực tiễn tốt nhất

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ắt quãng, 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 việc tiêu tốn 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.

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

Các gợi ý chung bổ sung

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

Nếu hợp đồng có các hàm hoặc biến không 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 dư 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 được 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, cố gắng hợp nhất các vòng lặp và di chuyển các phép tính lặp lại ra khỏi thân vòng lặp.

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

Hợp đồng thông minh đã 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. Do mã không chạy trên EVM mà chạy trên nút máy khách cục bộ, nên lượng Gas cần thiết ít hơn. Sử dụng hợp đồng thông minh đã 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 hiện 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 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 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à nâng cao hiệu quả 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ã thao tác Solidity đắt đỏ. Nội tuyến lắp ráp 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ữ, 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 mà chỉ sử dụng Solidity khó có thể thực hiện, cung cấp nhiều tính linh hoạt hơn để tối ưu hóa mức 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 đó, cần sử dụng cẩn thận, chỉ dành cho các nhà phát triển có kinh nghiệm.

4. Sử dụng giải pháp Layer 2

Việc sử dụng giải pháp Layer 2 có thể giảm bớt lượng dữ liệu cần lưu trữ và tính toán trên mạng Ethereum.

Các giải pháp Layer 2 như rollups, sidechain và kênh trạng thái có thể tải giao dịch ra khỏi chuỗi Ethereum chính, từ đó đạt được giao dịch nhanh hơn và rẻ hơn.

Bằng cách gộp nhiều 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, từ đó giảm phí Gas. Việc sử dụng các giải pháp Layer 2 cũng có thể cải thiện khả năng mở rộng của Ethereum, cho phép nhiều người dùng và ứng dụng tham gia vào mạng lưới mà không gây ra

ETH1.8%
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • 4
  • Chia sẻ
Bình luận
0/400
GateUser-beba108dvip
· 19giờ trước
gas phí đè lên đầu tôi đúng không
Xem bản gốcTrả lời0
BTCBeliefStationvip
· 19giờ trước
Gas cũng phải nội chiến sao? Thả một chút cũng được.
Xem bản gốcTrả lời0
ParanoiaKingvip
· 20giờ trước
Phí Gas này ăn người không nhả xương!
Xem bản gốcTrả lời0
DegenGamblervip
· 20giờ trước
gas điên cuồng không có điểm dừng
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)