Jak obliczyć opłaty gas w Ethereum: base fee, priority fee i limit gasu
Dowiedz się, co oznaczają jednostki gas, limit gasu, base fee, priority fee i maksymalna opłata w Ethereum, a następnie oblicz rzeczywisty koszt transakcji.
W tym przewodnikuGas mierzy obliczenia, a nie wysyłaną kwotę
Krótkie podsumowanie
Opłatę gas w Ethereum oblicza się, mnożąc ilość gas faktycznie zużytą przez transakcję przez efektywną cenę gas w bloku, który ją uwzględnił. Protokół ustala i spala base fee; priority fee może trafić do walidatora. Maksymalna opłata jest limitem, a niekoniecznie ceną, którą zapłacisz.
Gas mierzy obliczenia, a nie wysyłaną kwotę
W Ethereum gas to jednostka służąca do mierzenia pracy obliczeniowej potrzebnej EVM do przetworzenia transakcji. Prosty transfer ETH wymaga stosunkowo niewiele pracy, a przeniesienie tokena lub wykonanie wielu warunków smart kontraktu może wymagać jej więcej. Dlatego dwie transakcje wysyłające tę samą ilość ETH mogą zużyć różne ilości gas, jeśli wykonują różne operacje.
Jednostki gas określają ilość pracy. Cena gas wskazuje, ile ETH oferujesz za jednostkę. Iloczyn tych wartości to opłata. Limit gasu określa maksymalną liczbę jednostek, które transakcja może zużyć, natomiast maxFeePerGas wyznacza limit ceny za jednostkę. Te pola nie są zamiennymi wersjami jednej „maksymalnej opłaty”.
Ten poradnik opisuje standardową transakcję EIP-1559 w sieci głównej Ethereum. Inne łańcuchy bloków i sieci warstwy 2 mogą stosować inne struktury opłat, aktywa płatnicze i etykiety. Nie przenoś automatycznie terminologii Ethereum na każdą sieć. Przewodnik po gas w Ethereum.org i przewodnik po transakcjach definiują poszczególne pola.
Zużycie gas zależy od pracy wykonywanej przez transakcję
EVM przypisuje koszty gas do obliczeń i zmian stanu. Wywołanie kontraktu może wymagać wykonania funkcji, odczytu lub zapisu w pamięci oraz zapisania zdarzeń, czego nie wymaga zwykły transfer. Więcej operacji lub dłuższa ścieżka wykonania mogą zwiększyć zużycie gas. Ilości zużytego gas nie oblicza się przez pomnożenie wysyłanej kwoty ETH ani rynkowej ceny tokena.
Transfer ETH, transfer tokena i wywołanie dapp wykonują różne operacje. Wywołania kontraktu mogą wykonywać dodatkowe funkcje oraz odczytywać lub aktualizować pamięć, dlatego mogą zużyć więcej gas niż prosty transfer. W przypadku transakcji uwzględnionej w bloku jej receipt podaje faktycznie zużyty gas.
Ethereum.org podaje 21 000 gas jako przykład standardowego transferu ETH. To wartość referencyjna dla prostego transferu, a nie limit gas do ponownego użycia przy wywołaniach kontraktu, których koszt zależy od wykonywanych funkcji i dostępu do pamięci.
Gas sieciowy różni się też od opłaty za wypłatę pobieranej przez usługę. Giełda może doliczyć koszt operacyjny lub stosować własny cennik. Gas on-chain opłaca obliczenia przetwarzane przez sieć. Jeśli ekran wypłaty pokazuje jedną kwotę, sprawdź, czy łączy ona opłatę platformy z kosztem sieciowym.
Limit gasu i zużyty gas to różne wartości
Limit gasu (gasLimit) to maksymalna liczba jednostek gas, którą transakcja może zużyć. Zużyty gas (gasUsed) to ilość faktycznie wykorzystana po zakończeniu wykonania. Ustawienie wyższego limitu nie oznacza automatycznie, że wszystkie jednostki zostaną naliczone. W przypadku transakcji uwzględnionej w bloku opłata zależy od faktycznie zużytego gas i efektywnej ceny gas; niewykorzystane jednostki limitu nie są zużywane.
Jeśli sama transakcja wyczerpie gas podczas wykonania, zużyty zostanie cały limit gas i transakcja zakończy się niepowodzeniem. Zmiany stanu są cofane, ale wykonane obliczenia nadal kosztują. Wyższy limit pozwala na więcej pracy, ale zwiększa też maksymalną ekspozycję na koszt gas: gasLimit × maxFeePerGas. Rzeczywista opłata nadal zależy od zużytego gas i efektywnej ceny.
Limit gas to pułap, a nie prognoza faktycznego zużycia. To nie cena za jednostkę; podwyższenie ceny nie rozwiąże problemu zbyt małej liczby jednostek gas. Jeśli nie rozumiesz, co wykona dane wywołanie, sprawdź oficjalne wskazówki portfela lub aplikacji, zamiast dowolnie zmieniać limit.
Base fee zmienia się wraz z popytem na miejsce w bloku
W transakcji EIP-1559 base fee to ustalana przez protokół cena za gas w danym bloku. Maksymalna opłata transakcji musi wystarczyć na pokrycie base fee bloku, który ją uwzględni. Protokół dostosowuje base fee z bloku na blok w zależności od tego, ile gas zużył poprzedni blok w porównaniu z celem. Base fee może rosnąć i spadać; nie jest stałą stawką na zawsze.
Protokół spala część base fee przypadającą na faktycznie zużyty gas; walidatorzy nie otrzymują jej jako napiwku. Base fee zmienia się z bloku na blok, dlatego oczekująca transakcja może trafić na inną base fee w chwili uwzględnienia niż w chwili wysłania.
gwei to mała jednostka ETH: 1 gwei to 0,000000001 ETH. Wyższa cena gas zwiększa koszt w ETH, nawet gdy zużycie gas pozostaje bez zmian. Większe zużycie gas zwiększa koszt, nawet jeśli cena za jednostkę się nie zmienia. Oba czynniki mogą zmienić opłatę wyrażoną w ETH niezależnie od dolarowej ceny ETH.
Priority fee to napiwek, który może zachęcić do uwzględnienia transakcji
Priority fee to napiwek za jednostkę gas oferowany walidatorowi, który uwzględnia transakcję. Użytkownicy konkurują o ograniczone miejsce w bloku, więc wyższy napiwek może uatrakcyjnić transakcję, gdy pozostałe warunki są podobne. Sygnalizuje pilność, ale nie gwarantuje uwzględnienia w konkretnym bloku ani w określonym czasie.
Wysoka wartość priority fee to coś innego niż liczba jednostek gas potrzebnych transakcji. Priority fee zmienia cenę za jednostkę, a limit gasu ogranicza dozwoloną ilość pracy. Złożone wywołanie kontraktu nadal może się nie powieść przy zbyt małej ilości gas, nawet z wysokim napiwkiem. Z kolei wystarczająca liczba jednostek gas nie pomoże, jeśli limit ceny nie pokrywa base fee bloku.
Przy wyborze transakcji walidatorzy biorą pod uwagę miejsce w bloku i inne warunki. Specyfikacja EIP-1559 przypisuje base fee i priority fee odrębne role oraz ogranicza ich łączną efektywną cenę do maksymalnej opłaty.
Maksymalna opłata jest limitem ceny, a nie ceną rzeczywistą
maxFeePerGas to najwyższa cena za jednostkę, którą jesteś gotów pokryć. maxPriorityFeePerGas to najwyższy napiwek za jednostkę, jaki oferujesz. Po uwzględnieniu transakcji jej efektywna cena to base fee powiększone o napiwek mieszczący się w obu limitach. Zastosowany napiwek jest ograniczony do mniejszej z wartości: maxPriorityFeePerGas oraz maxFeePerGas - baseFee, więc efektywna cena nie może przekroczyć maksymalnej opłaty.
Załóżmy na przykład, że maksymalna opłata wynosi 30 gwei, maksymalny napiwek 2 gwei, a base fee bloku 18 gwei. Możliwy napiwek to 2 gwei, więc efektywna cena wynosi 20 gwei. Transakcja nie płaci automatycznie 30 gwei tylko dlatego, że tyle wynosi maksimum. Jeśli base fee wzrośnie do 31 gwei, limit 30 gwei nie pokryje kosztu w tym bloku i transakcja nie może zostać w nim uwzględniona.
Gdy base fee zbliża się do maksymalnej opłaty, zostaje mniej miejsca na napiwek. Nawet przy limicie napiwku 5 gwei, jeśli maxFeePerGas - baseFee wynosi tylko 1 gwei, zastosowany napiwek może wynieść najwyżej 1 gwei. Oceniaj oba limity razem z bieżącą base fee.

Oblicz rzeczywisty koszt i limit na przykładowych liczbach
Poniższe wartości są hipotetyczne i służą wyłącznie do pokazania obliczenia. Załóżmy, że limit gasu transakcji wynosi 30 000 jednostek, zużycie to 24 000 jednostek, a transakcja trafia do bloku z base fee 18 gwei. Maksymalny napiwek ustawmy na 2 gwei, a maksymalną opłatę na 30 gwei. Zastosowany napiwek to min(2, 30 - 18) = 2 gwei, więc efektywna cena wynosi 18 + 2 = 20 gwei.
Rzeczywista opłata gas to 24 000 × 20 = 480 000 gwei. Ponieważ 1 ETH to 1 000 000 000 gwei, daje to 0,00048 ETH. Część base fee wynosi 24 000 × 18 = 432 000 gwei, czyli 0,000432 ETH. Napiwek wynosi 24 000 × 2 = 48 000 gwei, czyli 0,000048 ETH. Obie części razem dają rzeczywistą opłatę 0,00048 ETH.
Pomnożenie całego limitu gasu przez limit ceny daje 30 000 × 30 = 900 000 gwei, czyli 0,0009 ETH. To górny limit kosztu gas przy tych ustawieniach, jeśli w pełni wykorzystano by limit gasu i maksymalną cenę za jednostkę. W tym przykładzie nie jest to rzeczywista opłata. Kwota ETH wysyłana odbiorcy jest oddzielna od opłaty gas. Nie traktuj limitu jak stałej opłaty ani opłaty jak procentu transferu. To liczby poglądowe, a nie bieżąca wycena.
Nieudana transakcja nadal może zużyć gas
Nie zakładaj, że opłata gas zostanie zwrócona tylko dlatego, że portfel pokazuje komunikat „niepowodzenie”. Jeśli transakcja została uwzględniona w bloku, a wykonanie EVM zostało następnie cofnięte, zmiany stanu są cofane, ale gas zużyty na obliczenia nadal kosztuje. Jeśli sama transakcja wyczerpie gas podczas wykonania, zużyty zostaje cały limit gas. Obliczenia się odbyły, nawet jeśli nie osiągnięto zamierzonego wyniku.
Inaczej jest z transakcją, która nie przejdzie walidacji przed uwzględnieniem w bloku. Na przykład transfer ETH z mniejszą ilością gas niż wymagana może zostać odrzucony, zanim trafi do bloku; w takim przypadku gas wykonania nie zostaje zużyty. „Odrzucona przed uwzględnieniem” i „uwzględniona, a potem cofnięta podczas wykonania” to różne stany.
Sprawdź hash transakcji, aby zobaczyć jej status, zużyty gas, efektywną cenę gas i wynik wykonania. Krótki komunikat błędu w portfelu może nie wskazywać przyczyny. Ethereum.org rozróżnia odrzucenie podczas walidacji przed uwzględnieniem od transakcji, której zabrakło gas podczas wykonania.
Osobno sprawdź limit, cenę i kwotę transferu
Przed podpisaniem sprawdź, z jakiej sieci korzystasz i czy transakcja jest prostym transferem, czy wywołaniem kontraktu. Portfel może pokazać szacowaną opłatę, limit gasu, szacowaną base fee, limit priority fee, limit maksymalnej opłaty oraz wysyłaną kwotę ETH lub tokena. To różne wartości odpowiadające na różne pytania. Jeśli ekran pokazuje tylko maksymalny koszt gas, otwórz szczegóły, aby sprawdzić, którego limitu dotyczy, zamiast traktować go jak pewne obciążenie.
Portfel może sam uzupełnić szacunki opłat, więc często nie musisz ręcznie zmieniać każdego pola. Są to szacunki oparte na warunkach sieci w danym momencie; nie gwarantują, kiedy transakcja zostanie uwzględniona ani jaki będzie jej ostateczny koszt. Niski limit ceny może pozostawić transakcję w oczekiwaniu. Podniesienie limitu lub napiwku bez zrozumienia wywołania może zwiększyć możliwy koszt, nie rozwiązując problemu. Sprawdź aktualne wartości i podpisz transakcję tylko wtedy, gdy jej szczegóły są dla Ciebie jasne.
Ten opis dotyczy standardowej ścieżki transakcji w Ethereum mainnet. Layer 2 lub inna sieć może pokazywać dodatkowe opłaty za dane, używać innego aktywa do opłat albo wyliczać je w odmienny sposób. Nie stosuj wzoru Ethereum do innej sieci bez sprawdzenia jej dokumentacji. Informacje o sieci docelowej i adresie znajdziesz na liście kontrolnej transferu kryptowalut, a o oddzielnym uprawnieniu kontraktu do używania tokenów — w przewodniku po zatwierdzaniu tokenów.
Częste pytania
Q1Dlaczego nieudana transakcja może nadal kosztować ETH?
Jeśli transakcja została uwzględniona i rozpoczęło się wykonanie, obliczenia mogą zużyć gas, nawet gdy zmiany stanu zostaną cofnięte. Sprawdź hash, aby odróżnić błąd wykonania od odrzucenia przed uwzględnieniem.
Q2Czy `maxFeePerGas` to rzeczywista cena gas pokazywana przez portfel?
Nie. To limit ceny za jednostkę. Efektywna cena łączy base fee bloku, który uwzględnił transakcję, z napiwkiem mieszczącym się w limitach, więc transakcja może zapłacić mniej niż maksimum.
Q3Czy transakcje w Ethereum mainnet płacą za gas w ETH?
Standardowe transakcje w Ethereum mainnet płacą za gas w etherze, natywnym aktywie sieci. Jeśli portfel pokazuje inny token lub zewnętrznego sponsora, sprawdź, czy chodzi o odrębny mechanizm płatności opłat. Inne sieci mogą działać inaczej.
Źródła i dalsza lektura
Zgłoś problem
Przygotujemy e-mail z linkiem do tego artykułu. Mark otrzyma zgłoszenie dopiero po jego wysłaniu
Szybki test
Przeczytano? Sprawdź się w 3 pytaniach
Pytanie 01
Co oznacza `gasLimit`?
Wybierz odpowiedź, aby zobaczyć wyjaśnienie