Giải thích phí gas Ethereum: base fee, priority fee và gas limit
Tìm hiểu ý nghĩa của đơn vị gas, gas limit, base fee, priority fee và phí tối đa, rồi tính chi phí thực tế của một giao dịch Ethereum.
Trong hướng dẫn nàyGas đo lượng tính toán, không đo số tiền bạn gửi
Tóm tắt ngắn
Phí gas Ethereum được tính bằng lượng gas giao dịch thực sự sử dụng nhân với giá gas hiệu dụng trong khối chứa giao dịch. Giao thức đặt ra và đốt base fee; priority fee có thể được trả cho validator. Phí tối đa là mức trần giá, không nhất thiết là mức bạn phải trả.
Gas đo lượng tính toán, không đo số tiền bạn gửi
Trên Ethereum, gas là đơn vị dùng để đếm lượng tính toán EVM cần thực hiện để xử lý giao dịch. Một giao dịch ETH đơn giản tương đối ít thao tác, trong khi chuyển token hoặc chạy nhiều điều kiện trong hợp đồng thông minh có thể cần nhiều hơn. Vì vậy, hai giao dịch gửi cùng lượng ETH vẫn có thể dùng lượng gas khác nhau nếu chúng thực hiện công việc khác nhau.
Đơn vị gas biểu thị lượng công việc; giá gas biểu thị số ETH bạn đề nghị trả cho mỗi đơn vị. Nhân hai giá trị này sẽ ra phí. Gas limit là số đơn vị tối đa giao dịch được phép tiêu thụ, còn maxFeePerGas là mức trần giá cho mỗi đơn vị. Đây là các trường riêng biệt, không phải những cách gọi có thể thay thế cho cùng một “phí tối đa”.
Bài viết này nói về một giao dịch EIP-1559 tiêu chuẩn trên Ethereum mainnet. Blockchain khác và mạng layer 2 có thể dùng cấu trúc phí, tài sản thanh toán và nhãn trường khác nhau. Đừng tự động áp dụng thuật ngữ Ethereum cho mọi mạng. Hướng dẫn gas của Ethereum.org và hướng dẫn giao dịch định nghĩa các trường này.
Lượng gas dùng phụ thuộc vào công việc giao dịch thực hiện
EVM gán chi phí gas cho phép tính và thay đổi trạng thái. Một lệnh gọi hợp đồng có thể phải chạy hàm, đọc hoặc ghi dữ liệu lưu trữ và ghi sự kiện — những việc một giao dịch chuyển tiền đơn giản không cần. Nhiều thao tác hơn hoặc đường thực thi dài hơn có thể tiêu thụ nhiều gas hơn. Lượng gas dùng không được tính bằng cách nhân số ETH gửi đi hoặc giá thị trường của token.
Giao dịch ETH, giao dịch token và lệnh gọi dApp thực hiện các thao tác khác nhau. Lệnh gọi hợp đồng có thể chạy thêm hàm và đọc hoặc cập nhật dữ liệu lưu trữ, nên có thể dùng nhiều gas hơn giao dịch chuyển tiền đơn giản. Biên nhận của giao dịch đã được đưa vào khối ghi lượng gas thực tế đã dùng.
Ethereum.org lấy 21.000 gas làm ví dụ cho một giao dịch ETH tiêu chuẩn. Đây là mốc tham khảo cho giao dịch chuyển tiền đơn giản, không phải gas limit dùng chung cho lệnh gọi hợp đồng, vì lượng công việc phụ thuộc vào các hàm và thao tác với dữ liệu lưu trữ được thực hiện.
Gas trên mạng cũng khác phí rút tiền của một dịch vụ. Sàn giao dịch có thể cộng phí vận hành hoặc áp dụng biểu phí riêng. Gas on-chain trả cho lượng tính toán mạng xử lý. Khi màn hình rút tiền chỉ hiện một số tiền, hãy kiểm tra xem số đó có gộp phí nền tảng với chi phí mạng hay không.
Gas limit và lượng gas đã dùng là hai con số khác nhau
Gas limit là số đơn vị gas tối đa giao dịch được phép tiêu thụ. Gas used là lượng thực tế đã tiêu thụ khi quá trình thực thi kết thúc. Đặt limit cao hơn không có nghĩa mọi đơn vị trong limit đều tự động bị tính phí. Với giao dịch đã được đưa vào khối, phí được tính theo lượng gas thực dùng và giá gas hiệu dụng; các đơn vị limit không dùng đến không bị tiêu thụ.
Nếu chính giao dịch cạn gas trong lúc thực thi, toàn bộ gas limit sẽ được tiêu thụ và giao dịch thất bại. Các thay đổi trạng thái của giao dịch bị hoàn tác, nhưng phần tính toán vẫn phát sinh phí. Limit cao hơn cho phép thực hiện nhiều công việc hơn, đồng thời tăng mức chi phí gas tối đa có thể gặp: gasLimit × maxFeePerGas. Khoản thực trả vẫn phụ thuộc vào lượng gas đã dùng và giá hiệu dụng.
Gas limit là mức trần, không phải dự đoán lượng dùng thực tế. Limit không phải giá mỗi đơn vị và tăng giá không khắc phục được việc thiếu đơn vị gas. Nếu chưa hiểu lệnh gọi sẽ thực hiện gì, hãy xem hướng dẫn chính thức của ví hoặc ứng dụng thay vì tùy tiện đổi limit.
Base fee thay đổi theo nhu cầu về không gian khối
Trong giao dịch EIP-1559, base fee là giá gas mỗi đơn vị do giao thức đặt cho một khối. Phí tối đa của giao dịch phải đủ để trang trải base fee của khối chứa giao dịch. Giao thức điều chỉnh base fee từ khối này sang khối khác dựa trên lượng gas khối trước đã dùng so với mục tiêu. Mức phí có thể tăng hoặc giảm; đây không phải tỷ lệ cố định mãi mãi.
Phần base fee tương ứng với lượng gas thực dùng sẽ bị đốt. Validator không nhận phần này như tiền boa. Base fee thay đổi theo từng khối, nên giao dịch đang chờ có thể gặp mức base fee lúc được đưa vào khối khác với lúc được gửi.
Gwei là đơn vị nhỏ của ETH: 1 gwei bằng 0,000000001 ETH. Giá gas cao hơn làm tăng chi phí tính bằng ETH ngay cả khi lượng gas dùng không đổi. Dùng nhiều gas hơn cũng tăng chi phí khi giá mỗi đơn vị không đổi. Cả hai đều có thể thay đổi phí tính bằng ETH, độc lập với giá ETH theo đô la.
Priority fee là tiền boa có thể khuyến khích giao dịch được đưa vào khối
Priority fee là khoản boa tính trên mỗi đơn vị gas mà bạn đề nghị trả cho validator đưa giao dịch vào khối. Người dùng cạnh tranh không gian khối có hạn, nên khoản boa cao hơn có thể khiến giao dịch hấp dẫn hơn nếu các điều kiện khác tương tự. Nó thể hiện mức độ khẩn cấp nhưng không đảm bảo giao dịch sẽ được đưa vào một khối cụ thể hoặc trước một thời điểm cụ thể.
Priority fee cao trên màn hình không đồng nghĩa giao dịch cần nhiều đơn vị gas hơn. Priority fee thay đổi giá mỗi đơn vị, còn gas limit giới hạn lượng công việc được phép. Lệnh gọi hợp đồng phức tạp vẫn có thể thất bại vì thiếu gas dù tiền boa cao. Ngược lại, có đủ đơn vị gas cũng không giúp được nếu mức trần giá không đủ trả base fee của khối.
Validator cân nhắc không gian khối và các điều kiện giao dịch khác khi lựa chọn giao dịch. Base fee và không gian khối sẵn có thay đổi theo thời gian; tiền boa cao hơn không đảm bảo giao dịch được đưa vào khối tại một thời điểm cụ thể. Đặc tả EIP-1559 quy định vai trò riêng của base fee và priority fee, đồng thời giới hạn tổng giá hiệu dụng không vượt quá phí tối đa.
Phí tối đa là trần giá, không phải giá thực tế
maxFeePerGas là mức giá cao nhất cho mỗi đơn vị gas mà bạn chấp nhận trả. maxPriorityFeePerGas là tiền boa tối đa cho mỗi đơn vị. Khi giao dịch được đưa vào khối, giá hiệu dụng bằng base fee cộng với khoản boa phù hợp với cả hai mức trần. Tiền boa được áp dụng bị giới hạn ở giá trị nhỏ hơn giữa maxPriorityFeePerGas và maxFeePerGas - baseFee, vì vậy giá hiệu dụng không thể vượt quá phí tối đa.
Ví dụ, giả sử phí tối đa là 30 gwei, tiền boa tối đa là 2 gwei và base fee của khối là 18 gwei. Tiền boa có thể áp dụng là 2 gwei, nên giá hiệu dụng là 20 gwei. Giao dịch không tự động trả 30 gwei chỉ vì đó là mức tối đa. Nếu base fee tăng lên 31 gwei, trần 30 gwei không đủ cho khối đó và giao dịch không thể được đưa vào khối ấy.
Khi base fee tiến gần phí tối đa, phần còn lại dành cho tiền boa sẽ nhỏ hơn. Dù đặt trần tiền boa là 5 gwei, nếu maxFeePerGas - baseFee chỉ còn 1 gwei thì tiền boa áp dụng tối đa là 1 gwei. Hãy xem hai mức trần cùng với base fee hiện tại.

Tính thử một khoản phí minh họa
Các con số sau chỉ là giả định để minh họa cách tính. Giả sử giao dịch có gas limit 30.000 đơn vị, dùng 24.000 đơn vị, được đưa vào khối có base fee 18 gwei; đặt tiền boa tối đa là 2 gwei và phí tối đa là 30 gwei. Tiền boa áp dụng là min(2, 30 - 18) = 2 gwei, nên giá hiệu dụng là 18 + 2 = 20 gwei.
Phí gas thực tế là 24.000 × 20 = 480.000 gwei. Vì 1 ETH bằng 1.000.000.000 gwei, số này bằng 0,00048 ETH. Phần base fee là 24.000 × 18 = 432.000 gwei, tức 0,000432 ETH. Phần tiền boa là 24.000 × 2 = 48.000 gwei, tức 0,000048 ETH. Cộng hai phần lại sẽ bằng phí thực tế 0,00048 ETH.
Nhân toàn bộ gas limit với hai mức trần cho kết quả 30.000 × 30 = 900.000 gwei, tức 0,0009 ETH. Đây là mức trần chi phí gas theo các thiết lập đó nếu toàn bộ limit và giá tối đa mỗi đơn vị đều được dùng hết. Đó không phải phí thực tế trong ví dụ. Lượng ETH gửi cho người nhận là khoản riêng với phí gas. Đừng xem mức trần là khoản bị trừ cố định hoặc phí là tỷ lệ phần trăm của số tiền chuyển. Các con số chỉ để giải thích, không phải báo giá mạng hiện tại.
Giao dịch thất bại vẫn có thể tiêu tốn gas
Đừng cho rằng thông báo “thất bại” trên ví có nghĩa phí gas được hoàn lại. Nếu giao dịch đã vào khối và EVM bắt đầu thực thi trước khi bị hoàn tác, thay đổi trạng thái có thể bị hủy nhưng gas đã dùng vẫn phát sinh phí. Nếu chính giao dịch cạn gas trong lúc thực thi, toàn bộ gas limit sẽ bị tiêu thụ. Việc tính toán đã diễn ra dù không đạt kết quả mong muốn.
Giao dịch không vượt qua bước kiểm tra hợp lệ trước khi được đưa vào khối là trường hợp khác. Ví dụ, giao dịch gửi ETH với gas limit thấp hơn mức cần thiết có thể bị từ chối trước khi vào khối; khi đó không tiêu tốn gas thực thi. “Bị từ chối trước khi đưa vào khối” và “đã vào khối rồi bị hoàn tác trong lúc thực thi” là hai trạng thái khác nhau.
Hãy kiểm tra trạng thái, lượng gas đã dùng, giá gas hiệu dụng và kết quả thực thi bằng transaction hash. Thông báo lỗi ngắn của ví có thể không cho biết nguyên nhân. Ethereum.org cũng phân biệt việc bị từ chối khi kiểm tra trước khi vào khối với trường hợp cạn gas trong lúc thực thi.
Đọc riêng limit, giá và số tiền chuyển
Trước khi ký, hãy xác nhận bạn đang ở mạng nào và giao dịch là chuyển tiền đơn giản hay gọi hợp đồng. Ví có thể hiển thị phí ước tính, gas limit, base fee ước tính, trần priority fee, trần phí tối đa và lượng ETH hoặc token sẽ gửi. Các giá trị này trả lời những câu hỏi khác nhau. Nếu màn hình chỉ hiện chi phí gas tối đa, hãy mở chi tiết để xem đó là mức trần nào thay vì coi đó là khoản chắc chắn bị trừ.
Ước tính tự động của ví giúp bạn gửi giao dịch mà không cần tự chỉnh các trường phí. Tuy nhiên, đó vẫn là dự đoán dựa trên tình trạng mạng tại thời điểm ấy, không đảm bảo thời gian hoặc chi phí cuối cùng. Trần giá thấp có thể khiến giao dịch phải chờ; tăng limit hoặc tiền boa khi chưa hiểu lệnh gọi có thể làm tăng chi phí có thể phát sinh mà không giải quyết vấn đề. Xem lại các giá trị hiện tại và chỉ ký khi bạn hiểu giao dịch.
Phần giải thích này áp dụng cho quy trình giao dịch tiêu chuẩn trên Ethereum mainnet. Layer 2 hoặc blockchain khác có thể hiển thị phí dữ liệu bổ sung, dùng tài sản trả phí khác hoặc tính phí theo cách khác. Đừng dùng công thức Ethereum cho mạng khác khi chưa xem tài liệu của mạng đó. Để tìm hiểu mạng đích và địa chỉ, xem danh sách kiểm tra chuyển crypto; để tìm hiểu quyền riêng mà hợp đồng có thể cần để sử dụng token, xem hướng dẫn phê duyệt token.
Câu hỏi thường gặp
Q1Vì sao giao dịch thất bại vẫn có thể tốn ETH?
Nếu giao dịch đã vào khối và bắt đầu thực thi, phép tính có thể tiêu tốn gas ngay cả khi thay đổi trạng thái bị hoàn tác. Hãy xem transaction hash để phân biệt lỗi trong lúc thực thi với việc bị từ chối trước khi vào khối.
Q2maxFeePerGas có phải giá gas thực tế mà ví hiển thị không?
Không. Đây là trần giá cho mỗi đơn vị. Giá hiệu dụng kết hợp base fee của khối chứa giao dịch với tiền boa nằm trong các mức trần, nên giao dịch có thể trả thấp hơn mức tối đa.
Q3Giao dịch Ethereum mainnet trả phí gas bằng ETH phải không?
Giao dịch tiêu chuẩn trên Ethereum mainnet trả gas bằng ether, tài sản gốc của mạng. Nếu ví hiển thị token khác hoặc bên thứ ba tài trợ phí, hãy kiểm tra xem có cơ chế thanh toán phí riêng hay không. Mạng khác có thể hoạt động khác.
Nguồn và tài liệu đọc thêm
Báo lỗi
Chúng tôi sẽ soạn email kèm liên kết bài viết này. Mark chỉ nhận được báo cáo sau khi bạn gửi email
Kiểm tra nhanh
Đọc xong hướng dẫn? Hãy kiểm tra với 3 câu hỏi
Câu hỏi 01
gasLimit biểu thị điều gì?
Chọn một đáp án để xem giải thích