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

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

Trên mạng Ethereum, phí Gas luôn là vấn đề khiến người dùng đau đầu, đặc biệt là trong thời gian mạng bị tắc nghẽn. Trong thời điểm cao điểm giao dịch, người dùng thường phải trả phí cao để hoàn thành giao dịch. 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. 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 trải nghiệm sử dụng blockchain tiết kiệm 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 Ethereum Virtual Machine (EVM), các khái niệm cốt lõi về tối ưu hóa phí Gas, cũng như những thực tiễn tốt nhất trong việc tối ưu hóa phí Gas trong 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 tham khảo hữu ích cho các nhà phát triển, đồng thời cũng giúp người dùng thông 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.

10 thực hành tốt nhất tối ưu Gas cho hợp đồng thông minh Ethereum

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

Trong 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 thao tác cụ thể.

Trong cấu trúc bố trí của EVM, việc tiêu thụ Gas chủ yếu đượ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ữ.

Mỗi giao dịch được thực hiện đều cần tiêu tốn tài nguyên tính toán, do đó 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. 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 thực hiện, 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 )

Trong đó, 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. Việc thiết lập phí ưu tiên cao hơn có thể tăng xác suất giao dịch được đóng gói vào khối tiếp theo.

Hiểu về tối ưu hóa Gas trong EVM

Khi sử dụng Solidity để biên dịch hợp đồng thông minh, hợp đồng sẽ được chuyển đổi thành một loạt mã máy (opcodes).

Mỗi đoạn mã thao tác ( 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.v. ) đều có chi phí tiêu thụ Gas cố định. Những chi phí này được ghi lại trong sách vàng Ethereum, nhưng với nhiều lần sửa đổi EIP, chi phí Gas của một số mã thao tác đã được điều chỉnh.

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 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 trong bộ nhớ
  • Đọc các hằng số và biến không thay đổi
  • Đọc và ghi biến cục bộ
  • Đọc biến 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 lặp

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

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

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 có hạn, tiêu tốn Gas cao hơn nhiều so với Memory( bộ nhớ). 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 sách trắng Ethereum, chi phí của 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 mload và mstore chỉ tiêu tốn 3 đơn vị Gas, trong khi sload và sstore ít nhất cũng cần 100 đơn vị ngay cả trong điều kiện lý tưởng.

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 bền vững trong bộ nhớ
  • Giảm số lần sửa đổi lưu trữ: Lưu trữ kết quả trung gian trong bộ nhớ, chờ đến khi tất cả các phép tính hoàn tất, sau đó mới phân phối kết quả cho các biến lưu trữ.

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

2. Đóng gói biến

Số lượng và cách biểu diễn dữ liệu của Storage slot( trong hợp đồng thông minh sẽ ảnh hưởng lớn đến việc tiêu tốn 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, sử dụng 32 byte làm đơn vị cơ bản để 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ới một kho lưu trữ duy nhất.

Thông qua điều chỉnh này, các nhà phát triển có thể tiết kiệm một lượng lớn đơn vị Gas. Vì mỗi ô lưu trữ đều tiêu tốn Gas, việc đóng gói biến sẽ 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.

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

) 3. Tối ưu hóa kiểu dữ liệu

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 phân loại 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.

Tuy nhiên, nếu 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 lại 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à đưa bốn biến uint8 vào bộ nhớ/lưu trữ trong một thao tác.

![10 thực tiễn tốt nhất để tối ưu hóa Gas cho hợp đồng thông minh Ethereum]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.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, các biến có kích thước cố định tiêu tốn ít Gas hơn so với các biến có kích thước thay đổi. Nế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.

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

) 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 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 thì có thể được 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.

![10 thực tiễn tối ưu hóa Gas cho hợp đồng thông minh Ethereum])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 hai loại này là memory có thể được hàm sửa đổi, trong khi calldata là không thay đổi.

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.

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

) 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 tại thời điểm 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 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ể.

![Mười thực hành tốt nhất để tối ưu hóa Gas cho hợp đồng thông minh Ethereum]###https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.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 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 các 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 từ 0.8.0 trở lên không còn cần sử dụng thư viện SafeMath, vì chính biên dịch viên đã tích hợp các tính năng bảo vệ tràn và thiếu.

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

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

Mã của trình sửa được nhúng vào các hàm đã được sửa đổi, mỗi khi sử dụng trì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 các hàm nội bộ, cho phép tái sử dụng hàm nội bộ trong các bộ điều chỉnh, có thể giảm kích thước bytecode và giảm chi phí Gas.

![Mười phương pháp tối ưu Gas cho hợp đồng thông minh Ethereum]###https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp(

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

Đối với || và &&, phép toán logic sẽ xảy ra đánh giá ngắt ngắn, 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 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 tính toán có chi phí cao.

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

Đề xuất 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 được sử dụng, nên xóa chúng. Đây là phương pháp trực tiếp nhất để giảm chi phí triển khai hợp đồng và giữ cho kích thước của hợp đồng nhỏ.

Một số gợi ý hữu ích:

  • Sử dụng thuật toán hiệu quả nhất để tính toán.
  • Xóa các quy trình tính toán không sử dụng.
  • Sử dụng từ khóa delete để xóa các biến không còn cần thiết, hoặc đặt chúng 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, gộp các vòng lặp khi có thể 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 dịch sẵn

Hợp đồng đượ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 phép toán mã hóa và băm. Do mã không chạy trên EVM mà chạy trên nút khách hàng cục bộ, nên cần ít Gas hơn. Sử dụng hợp đồng đượ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 ellip ###ECDSA( và thuật toán băm SHA2-256.

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

Hợp đồng thông minh cho phép các nhà phát triển viết mã 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 đỏ. Hợp đồng thông minh 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 thiểu phí Gas hơn nữa. Ngoài ra, hợp đồng thông minh có thể thực hiện một số thao tác phức tạp mà chỉ sử dụng Solidity thì khó khăn, cung cấp nhiều linh hoạt hơn 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 một cách thận trọng, 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 lượng dữ liệu cần lưu trữ và tính toán trên mạng chính của Ethereum.

Các giải pháp Layer 2 như rollups, sidechains và state channels có khả năng chuyển tải xử lý 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 một lượng lớn giao dịch lại với nhau, những giải pháp này giảm số lượng giao dịch trên chuỗi, từ đó làm 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 tình trạng quá tải dẫn đến tắc nghẽn.

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, chẳng hạn 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 tối thiểu hóa kích thước bytecode, xóa mã không cần thiết và giảm số lần thao tác cần thiết để thực thi 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", các nhà phát triển có thể giảm chi phí Gas một cách hiệu quả và nâng cao hiệu suất của hợp đồng thông minh.

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

Kết luận

Tối ưu hóa tiêu thụ Gas là bước quan trọng của nhà phát triển

GAS-3.08%
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
  • 9
  • Chia sẻ
Bình luận
0/400
NotGonnaMakeItvip
· 07-13 18:50
Cộng đồng chuỗi khối nước trắng đều hiểu, cốt lõi chỉ là bán gas.
Xem bản gốcTrả lời0
DeFiGraylingvip
· 07-13 18:26
gas đắt quá, suýt nữa thì phá sản.
Xem bản gốcTrả lời0
BearMarketSurvivorvip
· 07-13 13:49
gas phí lại khiến người dân nghèo khổ rồi ôi ôi
Xem bản gốcTrả lời0
WalletManagervip
· 07-12 02:38
gas quá đắt không bằng đi L2 giao dịch
Xem bản gốcTrả lời0
RugDocDetectivevip
· 07-12 02:36
Đừng có rườm rà nữa, phí gas mới là vấn đề lớn.
Xem bản gốcTrả lời0
BearMarketGardenervip
· 07-12 02:21
chuyên nghiệp lại bắt đầu làm trò Ở đây có gì để cắt lỗ không?
Xem bản gốcTrả lời0
DataChiefvip
· 07-12 02:18
Trời ơi lại phí gas nước, có thể nói điều gì mới không?
Xem bản gốcTrả lời0
RektCoastervip
· 07-12 02:16
Ai có thể cho tôi biết làm thế nào để cứu ví tiền của tôi, phí gas thật sự quá cao.
Xem bản gốcTrả lời0
MaticHoleFillervip
· 07-12 02:10
Phí gas thật tuyệt, lại khiến Vitalik Buterin kiếm được một đống tiền.
Xem bản gốcTrả lời0
Xem thêm
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)