Fundamentals·5 мин чтения

wei, gwei, ether: как не ошибиться с единицами в проде

Самый частый баг в крипто-бэкендах — ошибка в единицах: показать wei как ether или, что хуже, отправить их. Лекарство скучное и абсолютное: никогда не используйте плавающую точку для он-чейн сумм и всегда знайте, в какой единице число.

Лестница

У ether 18 decimals. 1 ether = 10^9 gwei = 10^18 wei. Gwei (10^9 wei) — единица, в которой котируются цены на gas; wei — базовая единица, в которой деноминировано каждое значение из RPC. Эквивалент в Bitcoin — satoshi (10^-8 BTC), в TRON — sun (10^-6 TRX), в TON — nanoton (10^-9 TON). У каждой сети есть базовая целочисленная единица — работайте в ней.

Почему float ломается

IEEE-754 double имеет 53 бита мантиссы, около 15–16 значащих десятичных цифр. Значение в wei может иметь 19+ цифр, поэтому в момент, когда вы парсите его в число JavaScript, вы теряете точность — молча. Ошибка округления крошечна в относительных величинах и катастрофична в реестре. Используйте нативный BigInt или библиотеку big-decimal, из конца в конец.

Конвертируйте только на границах

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

1st Node Engineering

Частые вопросы

Безопасно ли использовать числа JavaScript для мелких сумм?

Нет — проводите черту по типу, а не по величине. Как только какой-то путь кода использует float для сумм, сквозь него рано или поздно протечёт большое значение. Используйте BigInt для всех он-чейн сумм независимо от порядка величины.

Как показать значение в wei как ether без библиотеки?

Делите на 10^18 целочисленной/BigInt-арифметикой для целой части и форматируйте остаток как дробные цифры — никогда через деление с плавающей точкой. Наши инструменты-конвертеры единиц делают ровно это.

Похожее

Пополнили, получили ключ, запустили.

Полное самообслуживание. Оплата криптой или картой. Тарификация в кредитах — тяжёлые примитивы дороже, простые дёшевы.

Получить API-ключ