Ethereumwei, Gwei и ETH — конвертация с точной целочисленной арифметикой

Конвертер Gwei

Введите значение в любое из трёх полей — остальные два обновятся автоматически. Каждая конвертация проходит через wei как BigInt, поэтому все 18 десятичных разрядов сохраняются, а не теряются из-за чисел с плавающей точкой.

Конвертировать
Одно поле на единицу измерения. Поле, в которое вы вводите значение, сохраняет его именно в том виде, в каком вы его написали.
Попробуйте:
В wei
1000000000
Три единицы
Одна и та же валюта, три масштаба, закреплённые протоколом.
wei

Наименьшая единица и единственная, с которой работает EVM. Балансы, суммы транзакций и цены gas — всегда целые числа в wei; меньшей единицы не существует, поэтому округления на уровне протокола не происходит.

Gwei

109 wei, также называемых наноэфиром. Цены gas обычно попадают именно в этот диапазон, из-за чего единица и используется повседневно: 20 Gwei читается лучше, чем 20000000000 wei и чем 0.00000002 ETH.

ETH

1018 wei. То, что пользователь видит в кошельке, — единица, в которой реально считает почти ни один интерфейс.

Получайте актуальную цену gas через API

7 дней тестирования, без кредитной карты и KYC.

Начать бесплатный период

Три единицы измерения и арифметика между ними

У Ethereum одна валюта и несколько названий для её масштабов. На практике важны два из них:

Единица В wei В ETH Также называется
wei 1 0,000000000000000001
Gwei 1 000 000 000 0,000000001 наноэфир, shannon
ETH 1 000 000 000 000 000 000 1 эфир

Конвертация — это сдвиг десятичной запятой, а не умножение, для которого нужна библиотека. Gwei в ETH сдвигает точку на девять знаков влево, ETH в wei — на восемнадцать знаков вправо. Ошибки берутся именно из ручного счёта: девять нулей и восемнадцать нулей на первый взгляд похожи, и ошибка на три порядка превращает цену газа в 20 Gwei в 20 мегавей.

Зачем вообще нужен Gwei

У EVM нет дробного типа. Балансы, суммы транзакций и цены газа — всё это беззнаковые целые числа в wei, потому что целые числа — единственное, о чём консенсус может договориться абсолютно точно. Это решение правильное, и из-за него цены газа становятся нечитаемыми: обычная цена — это число из десяти-одиннадцати цифр в wei и дробь с пятью знаками после запятой в ETH. Ни один из масштабов не подходит под эти числа.

Gwei находится между ними, на уровне 109 wei, и цены газа попадают там в одно-два значащих разряда. В этом вся причина, по которой единица используется каждый день. Это не отдельный токен, не деноминация Layer-2, а просто масштаб, который случайно совпадает с размером чисел, которые люди называют вслух. Названия shannon и наноэфир обозначают то же самое и почти никогда не встречаются вне таблиц единиц.

Та же логика работает и в обратную сторону — для балансов. Никто не указывает баланс кошелька в wei, и никто не называет цену газа в ETH. Каждый масштаб используется там, где его числа имеют читаемое количество цифр, поэтому интерфейс, который работает с обоими, постоянно конвертирует между ними.

Почему этот конвертер использует BigInt

Число в JavaScript — это double, точное для целых чисел только до 253 − 1, то есть до 9 007 199 254 740 991. Это примерно 9 × 1015 — меньше, чем 1018 wei в одном ETH. За этим пределом результаты становятся молча неверными, а не отклоняются:

1.1 * 1e18            // 1100000000000000100  — расхождение на 100 wei
Number("1234567890123456789")
                      // 1234567890123456800  — последние две цифры потеряны
0.1 + 0.2             // 0.30000000000000004

Ни один из этих случаев не выбрасывает ошибку. Возвращается правдоподобно выглядящее число, у которого младшие разряды заменены на то, что случайно получилось в двоичном представлении. В конвертере это плохо; в коде, который формирует значение транзакции, это баг, который обнаруживается в проде, когда перевод перемещает чуть другую сумму, чем та, что была показана.

Решение — никогда не позволять значению wei стать float. Эта страница разбирает ваш ввод как десятичную строку, сдвигает точку операциями со строкой и хранит результат как BigInt. Если ввести 18 произвольных десятичных знаков в поле ETH, в поле wei вернутся ровно эти же цифры. Единственное место, где цифры отбрасываются, — это когда вы вводите больше десятичных знаков, чем есть у единицы измерения, и страница сообщает об этом, а не округляет молча.

Та же дисциплина применима и в вашем собственном коде. В ethers есть parseEther и formatUnits, в viemparseEther и formatGwei, и оба возвращают значения BigInt по той же причине. Самодельное value / 1e18 работает ровно до той суммы, на которой перестаёт работать.

Стоимость газа в трёх единицах

Именно на газе конвертация реально применяется, поэтому полезно увидеть один расчёт во всех трёх масштабах. Обычный перевод ETH стоит фиксированные 21 000 газа. При цене газа 20 Gwei:

21000 gas × 20 Gwei  = 420 000 Gwei
                     = 420 000 000 000 000 wei
                     = 0.00042 ETH

Количество газа зависит от того, что делает транзакция; цена газа зависит от спроса на место в блоке в этот момент. После EIP-1559 цена делится на базовую комиссию, которая сжигается, и приоритетную комиссию, которая идёт proposer'у блока. Обе указываются за единицу газа, и обе под капотом являются значениями в wei, поэтому параметры транзакции Chaingateway gasprice, maxFeePerGas и maxPriorityFeePerGas используют в качестве примера значение 1000000000, а не 1. Это один Gwei, записанный в wei.

Следите за масштабом, когда читаете цену обратно: GET /api/v2/ethereum/gasprice возвращает единственное поле gasPrice, значение которого в примере из справочника — 12.28, то есть цифра в масштабе Gwei, а не целое число в wei. Отправить его напрямую обратно в транзакцию как gasprice означало бы запросить 12 wei за газ. Сначала сконвертируйте, затем умножьте на количество газа, которое использует ваша транзакция.

Остальные эндпоинты Ethereum, включая переводы ERC-20 и вебхуки транзакций, описаны на странице Ethereum API. Другие калькуляторы собраны в разделе Инструменты.

Часто задаваемые вопросы

Сколько wei в одном ETH?

10^18, то есть 1 000 000 000 000 000 000 wei. Показатель степени зафиксирован протоколом и никогда не менялся.

Сколько wei в одном Gwei?

10^9, то есть 1 000 000 000 wei. В одном ETH — 10^9 Gwei, поэтому на логарифмической шкале Gwei находится ровно посередине между wei и ETH.

Как перевести wei в ETH вручную?

Сдвиньте десятичную точку на восемнадцать разрядов влево, дополнив нулями, если число короче девятнадцати цифр. 420 000 000 000 000 wei превращается в 0,00042 ETH. Перевод Gwei в ETH — та же операция, но на девять разрядов.

Gwei — это то же самое, что наноэфир?

Да. Gwei, наноэфир и shannon — три названия для 10^9 wei, то есть 10^-9 ETH. Прижилось именно название Gwei, потому что цены gas обычно указывают в нём.

Почему для цены gas используют Gwei, а не ETH?

Дело в количестве цифр. Цена gas в 20 Gwei — это 20 000 000 000 wei или 0,00000002 ETH, и ни то ни другое не читается с первого взгляда. Gwei укладывает обычные цены gas в одну-две цифры.

Можно ли конвертировать wei в ETH обычным числом JavaScript?

Надёжно — нет. Double точен для целых чисел только до 9 007 199 254 740 991, что заметно меньше 10^18 wei в одном ETH, поэтому у больших значений теряются младшие разряды без какой-либо ошибки. 1.1 * 1e18 возвращает 1100000000000000100 — расхождение в сотню wei. Используйте BigInt или библиотеку, которая возвращает BigInt.

Сколько транзакция стоит в ETH, если цена gas указана в Gwei?

Умножьте использованный gas на цену gas, затем переведите в ETH. Обычный перевод использует 21 000 gas; при 20 Gwei это 420 000 Gwei, то есть 0,00042 ETH. Вызовы контрактов используют больше gas, а цифра 21 000 — это нижняя граница, а не типичное значение.

Этот конвертер округляет значения?

Нет. Каждое значение разбирается как десятичная строка и хранится как BigInt в wei, поэтому все 18 десятичных разрядов сохраняются. Единственный случай, когда цифры отбрасываются, — ввод с большим числом знаков после запятой, чем допускает единица, например дробь в поле wei, и страница сообщает об этом вместо того, чтобы молча округлить.