MNT — это два разных актива, и другие причины, почему коду валюты нельзя верить
MNT — это монгольский тугрик. MNT — это ещё и Mantle, криптотокен. Один
стоит примерно три сотых цента, другой — примерно доллар. Они различаются на три
порядка и делят одно имя.
Если финансовое приложение хранит ваши активы по коду валюты, а у вас есть оба, различить их оно не сможет. Ошибки не будет. Оно покажет число, и это число будет неверным в несколько тысяч раз.
Это небольшая история про небольшую ошибку — и самая наглядная иллюстрация того, как устроен Walleet.
Допущение, которое перестаёт работать
ISO 4217 присваивает трёхбуквенные коды национальным валютам: USD, EUR,
JPY. Это настоящий стандарт с органом регистрации, и внутри своей области коды
уникальны.
У криптовалют такого органа нет. Токены выбирают тикеры сами, и ничто не мешает выбрать тикер, уже занятый ISO. Некоторые так и сделали.
И как только приложение начинает оценивать и валюты, и криптовалюты, допущение, лежащее в основе почти всего его кода — код определяет актив, — тихо перестаёт быть верным. Никто об этом не сообщает. Схема продолжает работать. Запросы продолжают возвращать строки. Просто не те.
Почему это хуже обычной ошибки
Большинство ошибок падают громко. Неверное имя колонки бросает исключение. Отсутствующая запись возвращает пустоту.
Эта возвращает правдоподобное число. Ваш капитал посчитан, отформатирован, нарисован на графике и показан — и он неверен. Ошибку наследует всё, что ниже: итог, разбивка по валютам, изменение за месяц, исторический максимум. Ничто не выглядит сломанным.
Хуже того, ошибка зависит от данных. Она срабатывает только у пользователей,
держащих оба конфликтующих актива — для MNT это узкий круг, — поэтому переживает
тестирование, ревью и месяцы продакшена. Такое находят по письму в поддержку «у
меня какая-то странная сумма», если повезёт.
Что делает Walleet
Актив определяется парой: кодом и типом. MNT/валюта — это тугрик.
MNT/крипто — это Mantle. Это две строки, две цены, две истории.
Пара идёт везде. Валюта счёта — пара. Валюта, в которой вы смотрите капитал, — пара. Запрос курса принимает пару. База данных это обеспечивает: валюта счёта — внешний ключ на код-и-тип поддерживаемого актива, поэтому счёт в несуществующем активе создать нельзя.
И тип нельзя опустить на границах системы. API запрашивает его там, где он нужен, а части кода, работающие с активами, написаны так, что потерять половину пары — это ошибка компиляции. Это сделано намеренно: правило, которое держится на ревью, рано или поздно нарушат, а правило, которое держит компилятор, — нет.
Где коды лгут ещё
То же неверное допущение всплывает при форматировании.
Стандартный механизм отображения валют в браузере принимает трёхбуквенный код
ISO. Дайте ему четыре буквы — USDT, DOGE — и он не вернёт что-нибудь
приблизительное. Он бросит исключение. В неудачном месте это кладёт страницу
целиком, а не портит одно число.
А трёхбуквенный криптокод хуже, потому что он принимается. BTC — три буквы,
значит, форматируется охотно: с двумя знаками после запятой, как принято для
ISO. Десятая биткоина отрисуется как BTC 0,10, и это нормально, а тысяча
сатоши — как BTC 0,00, и это нет.
Оба случая обрабатываются явно: коды классифицируются до того, как попадут в форматтер, и у каждого актива своя точность. Национальные валюты берут её из тех же стандартных данных, что и ваша операционная система — у иены знаков нет, у бахрейнского динара три, — а монеты берут заявленную, с потолком в восемь.
Восемь — объявленный предел, а не скрытый. Некоторые токены делятся до восемнадцати знаков, а число с плавающей точкой не удержит восемнадцать значащих цифр рядом с реальным объёмом. Поэтому потолок задокументирован и применяется единообразно, вместо того чтобы число тихо теряло хвост.
Почему это в маркетинговой статье
Потому что снаружи это не проверить.
Любой трекер капитала показывает вам число. Ни один не показывает рассуждение, а с экрана верная сумма и сумма, ошибочная на три порядка, выглядят одинаково уверенно. Вы доверяете арифметике и не можете её осмотреть.
Мы предпочитаем рассказать, где острые углы и что с ними сделано. Команда, подумавшая про тугрик, вероятно, подумала и про обычные случаи, — а если что-то здесь окажется неверным, исправлять это надо в продукте, а не в формулировке.
Если хочется подробнее о том, как устроена арифметика, метод пересчёта описан в статье что на самом деле значит «капитал в одной валюте».
