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 хоть раз коснулся суммы между этими двумя границами — считайте это багом.
Частые вопросы
Безопасно ли использовать числа JavaScript для мелких сумм?
Нет — проводите черту по типу, а не по величине. Как только какой-то путь кода использует float для сумм, сквозь него рано или поздно протечёт большое значение. Используйте BigInt для всех он-чейн сумм независимо от порядка величины.
Как показать значение в wei как ether без библиотеки?
Делите на 10^18 целочисленной/BigInt-арифметикой для целой части и форматируйте остаток как дробные цифры — никогда через деление с плавающей точкой. Наши инструменты-конвертеры единиц делают ровно это.
Похожее
Пополнили, получили ключ, запустили.
Полное самообслуживание. Оплата криптой или картой. Тарификация в кредитах — тяжёлые примитивы дороже, простые дёшевы.
Получить API-ключ