Các thực hành tốt nhất để tối ưu hóa phí 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 đề nan giải, đặc biệt là khi mạng bị tắc nghẽn. Trong giờ cao điểm, người dù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à 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ột cách hiệu quả, mà còn nâng cao hiệu quả giao dịch, mang đến cho người dùng trải nghiệm 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 về tối ưu hóa phí Gas, cũng như các thực tiễn tốt nhất khi tối ưu hóa phí Gas trong quá trình 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à hỗ trợ thực tiễn 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 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.
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 lệnh, gọi tin nhắn từ bên ngoài và việc đọc/ghi bộ nhớ và lưu trữ.
Do bởi mỗi giao dịch cần tài nguyên tính toán để thực hiện, nên sẽ thu 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 phân nhánh cứng London EIP-1559( có hiệu lực ), phí Gas được tính theo công thức sau:
Phí gas = đơn vị gas đã sử dụng * (phí cơ bản + phí ưu tiên)
Phí cơ bản sẽ bị phá 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 thêm giao dịch vào chuỗi khối. Việc đặt phí ưu tiên cao hơn khi gửi giao dịch 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 nhận.
1. 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 "mã thao tác", 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 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.
2.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 suất 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à viết 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 lặp
Thực hành tối ưu hóa chi phí Gas EVM tốt nhất
Dựa trên các khái niệm cơ bản nêu trên, chúng tôi đã biên soạn một danh sách các thực hành tốt nhất để tối ưu hóa phí Gas cho cộng đồng nhà phát triển. Bằng cách tuân theo những thực hành 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, hạ thấp 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 bộ nhớ.
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 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 trên bộ nhớ. Ví dụ, các lệnh OPcode 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 trường hợp 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 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ữ.
( 2. Đóng gói biến
Số lượng slot 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 thị dữ liệu 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 và sử dụng các khe lưu trữ 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à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ữ.
Do mỗi khe lưu trữ đều tiêu tốn Gas, việc đóng gói biến giúp tối ưu hóa việc sử dụng Gas bằng cách giảm số lượng khe 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
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. 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. 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.
Khi nhìn riêng, việc sử dụng uint256 ở đây rẻ hơn uint8. Tuy nhiên, nếu sử dụng tối ưu hóa đóng gói biến mà chúng tôi đã đề xuất trước đó thì lại 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. Như vậy, hợp đồng thông minh có thể đọc và ghi một khe lưu trữ và đưa bốn biến uint8 vào bộ nhớ/lưu trữ trong một thao tác.
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, khuyên bạn nên sử dụng kiểu dữ liệu bytes32 thay vì bytes hoặc strings. Nói chung, biến có kích thước cố định tiêu tốn ít Gas hơn 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 từ bytes1 đến bytes32 với độ dài nhỏ nhất.
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.
Bản đồ 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ó tính khả thi và hỗ trợ đóng gói kiểu dữ liệu. Do đó, nên ưu tiên sử dụng bản đồ khi quản lý danh sách dữ liệu, trừ khi cần lặp qua hoặc có thể tối ưu hóa việc tiêu tốn Gas thông qua việc đóng gói kiểu dữ liệu.
![Gas tối ưu hợp đồng thông minh Ethereum hàng đầu mười thực tiễn])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.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ể bị hàm sửa đổi, trong khi calldata là không thể 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 đượ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 thời gian biên dịch và được lưu trữ trong bytecode của hợp đồng. Do đó, chi phí truy cập của chúng sẽ 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 khi có thể.
8. Sử dụng Unchecked khi đảm bảo rằng sẽ 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 số hoặc thiếu số, 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 số hoặc thiếu số 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 0.8.0 và cao hơ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.
9. Tối ưu hóa bộ sửa đổi
Mã của bộ chỉnh sửa được nhúng vào 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 mức tiêu thụ Gas.
Bằng cách tái cấu trúc logic thành hàm nội bộ _checkOwner(), cho phép sử dụng lại hàm nội bộ này trong các bộ sửa đổi, có thể giảm kích thước bytecode và giảm chi phí Gas.
![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-a141884dcdcdc56faff12eee2601b7b7.webp(
) 10. Tối ưu hóa đường ngắn
Đối với || và &&, phép toán logic sẽ xảy ra đánh giá ngắt, 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 phép tính có chi phí cao.
Các gợi ý 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ố lời khuyên 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 toán, 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 toán 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 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, hợp nhất vòng lặp khi có thể, và chuyển các phép tính lặp lại ra khỏi thân vòng lặp.
![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-248337b15929868ed1250ffb9fcfa289.webp###
2. Sử dụng hợp đồng thông minh đã biên soạn sẵn
Hợp đồng đã 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 đã 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 dịch 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. Bằng cách sử dụng các hợp đồng thông minh đã được biên dịch 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 quả hoạt động của ứng dụng.
3. Sử dụng mã lắp ghép nội tuyến
Nội suy lắp ghé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 tiền. Nội suy lắp ghé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. Ngoài ra, nội suy lắp ghép có thể
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.
16 thích
Phần thưởng
16
7
Chia sẻ
Bình luận
0/400
AlgoAlchemist
· 4giờ trước
gas phải làm tôi chết mất
Xem bản gốcTrả lời0
BearEatsAll
· 15giờ trước
Phí gas cao không phải là một con đường chết cho những kẻ muốn hút máu sao?
Xem bản gốcTrả lời0
MEVHunterWang
· 07-11 05:59
gas lại tăng lên nhìn mà đau lòng
Xem bản gốcTrả lời0
CoffeeNFTrader
· 07-11 05:55
gas lại tối ưu vẫn là hố, thật sự không bằng đi layer2
13 thực tiễn tối ưu hóa phí Gas cho hợp đồng thông minh Ethereum
Các thực hành tốt nhất để tối ưu hóa phí 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 đề nan giải, đặc biệt là khi mạng bị tắc nghẽn. Trong giờ cao điểm, người dù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à 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ột cách hiệu quả, mà còn nâng cao hiệu quả giao dịch, mang đến cho người dùng trải nghiệm 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 về tối ưu hóa phí Gas, cũng như các thực tiễn tốt nhất khi tối ưu hóa phí Gas trong quá trình 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à hỗ trợ thực tiễn 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 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.
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 lệnh, gọi tin nhắn từ bên ngoài và việc đọc/ghi bộ nhớ và lưu trữ.
Do bởi mỗi giao dịch cần tài nguyên tính toán để thực hiện, nên sẽ thu 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 phân nhánh cứng London EIP-1559( có hiệu lực ), phí Gas được tính theo công thức sau:
Phí gas = đơn vị gas đã sử dụng * (phí cơ bản + phí ưu tiên)
Phí cơ bản sẽ bị phá 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 thêm giao dịch vào chuỗi khối. Việc đặt phí ưu tiên cao hơn khi gửi giao dịch 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 nhận.
1. 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 "mã thao tác", 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 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.
2.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 suất 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ác hoạt động có chi phí cao bao gồm:
Thực hành tối ưu hóa chi phí Gas EVM tốt nhất
Dựa trên các khái niệm cơ bản nêu trên, chúng tôi đã biên soạn một danh sách các thực hành tốt nhất để tối ưu hóa phí Gas cho cộng đồng nhà phát triển. Bằng cách tuân theo những thực hành 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, hạ thấp 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 bộ nhớ.
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 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 trên bộ nhớ. Ví dụ, các lệnh OPcode 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 trường hợp 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:
( 2. Đóng gói biến
Số lượng slot 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 thị dữ liệu 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 và sử dụng các khe lưu trữ 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à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ữ.
Do mỗi khe lưu trữ đều tiêu tốn Gas, việc đóng gói biến giúp tối ưu hóa việc sử dụng Gas bằng cách giảm số lượng khe 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
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. 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. 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.
Khi nhìn riêng, việc sử dụng uint256 ở đây rẻ hơn uint8. Tuy nhiên, nếu sử dụng tối ưu hóa đóng gói biến mà chúng tôi đã đề xuất trước đó thì lại 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. Như vậy, hợp đồng thông minh có thể đọc và ghi một khe lưu trữ và đưa bốn biến uint8 vào bộ nhớ/lưu trữ trong một thao tác.
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, khuyên bạn nên sử dụng kiểu dữ liệu bytes32 thay vì bytes hoặc strings. Nói chung, biến có kích thước cố định tiêu tốn ít Gas hơn 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 từ bytes1 đến bytes32 với độ dài nhỏ nhất.
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.
Bản đồ 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ó tính khả thi và hỗ trợ đóng gói kiểu dữ liệu. Do đó, nên ưu tiên sử dụng bản đồ khi quản lý danh sách dữ liệu, trừ khi cần lặp qua hoặc có thể tối ưu hóa việc tiêu tốn Gas thông qua việc đóng gói kiểu dữ liệu.
![Gas tối ưu hợp đồng thông minh Ethereum hàng đầu mười thực tiễn])https://img-cdn.gateio.im/webp-social/moments-9c566626ab499ef65d6f5089a2876ad3.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ể bị hàm sửa đổi, trong khi calldata là không thể 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 đượ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 thời gian biên dịch và được lưu trữ trong bytecode của hợp đồng. Do đó, chi phí truy cập của chúng sẽ 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 khi có thể.
8. Sử dụng Unchecked khi đảm bảo rằng sẽ 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 số hoặc thiếu số, 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 số hoặc thiếu số 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 0.8.0 và cao hơ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.
9. Tối ưu hóa bộ sửa đổi
Mã của bộ chỉnh sửa được nhúng vào 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 mức tiêu thụ Gas.
Bằng cách tái cấu trúc logic thành hàm nội bộ _checkOwner(), cho phép sử dụng lại hàm nội bộ này trong các bộ sửa đổi, có thể giảm kích thước bytecode và giảm chi phí Gas.
![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-a141884dcdcdc56faff12eee2601b7b7.webp(
) 10. Tối ưu hóa đường ngắn
Đối với || và &&, phép toán logic sẽ xảy ra đánh giá ngắt, 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 phép tính có chi phí cao.
Các gợi ý 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ố lời khuyên 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 toán, 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 toán 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 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, hợp nhất vòng lặp khi có thể, và chuyển các phép tính lặp lại ra khỏi thân vòng lặp.
![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-248337b15929868ed1250ffb9fcfa289.webp###
2. Sử dụng hợp đồng thông minh đã biên soạn sẵn
Hợp đồng đã 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 đã 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 dịch 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. Bằng cách sử dụng các hợp đồng thông minh đã được biên dịch 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 quả hoạt động của ứng dụng.
3. Sử dụng mã lắp ghép nội tuyến
Nội suy lắp ghé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 tiền. Nội suy lắp ghé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. Ngoài ra, nội suy lắp ghép có thể