Как стать автором
Обновить

🗝 Так вот он какой мой адрес кошелька в Ethereum

Почти три года занимаюсь разработкой смарт-контрактов для Ethereum и ему подобных. И сегодня коллега задал мне вопрос на который я не смог ответить сразу!

Есть два адреса: 0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed и 0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed. Это один и тот же адрес? Или два разных?

Эти два адреса отличаются только тем, что в первом все буквы в нижнем регистре, а во втором некоторые в верхнем регистре. Я говорю буквы, потому что цифр регистр не касается. Столкнулся мой коллега с такой ситуацией при работе с Metamask. Первый адрес выскочил в окне предупреждения в момент совершения транзакции, второй — это адрес кошелька для копирования.

И вот тут я крепко задумался… Тем более когда начинаешь копать, то ответ лежит наверху: Ethereum адреса не чувствительны к регистру!

В природе Ethereum адреса можно встретить разные:

  • 0xabc... (нижний регистр)

  • 0xABC... (верхний регистр)

  • 0xAbC... (смешанный регистр)

▫️Но как их видит сама EVM?

Любой адрес преобразуется в 40 шестнадцатеричных символов (hex) нижнего регистра (без 0x). Используются символы [0-9A-F]*. Однако EVM не важен регистр, так как она все символы преобразует в нижний регистр по умолчанию. Таким образом в EVM наш адрес будет всегда 5aaeb…435e7ef1beaed.

Но зайдем в etherscan, вставим наш адрес и увидим некоторые буквы с верхним регистром в поле адреса.

▫️Что не так с etherscan?

А все так! Ответ на этот казус кроется в ERC-55: Mixed-case checksum address encoding. Согласно спецификации, "сбоку» (сугубо off-chain) для адресов вводится понятие checksum (контрольная сумма). В Ethereum — это механизм проверки целостности адреса, который помогает обнаружить ошибки ввода (опечатки) за счёт использования заглавных букв в шестнадцатеричной записи адреса.

Существует простой алгоритм, который определяет какие буквы необходимо перевести из нижнего регистра в верхний. Адрес хешируется, затем каждая буква адреса сопоставляется с символом в хеше и если он больше или равен 8, то букву нужно преобразовать в верхний регистр.

Сама EVM не проверяет checksum — это делают только кошельки и интерфейсы (например, MetaMask или Etherscan). Если отправить транзакцию на 0x5AAEB... (все буквы с верхним регистром), EVM всё равно обработает её, как 0x5aaeb.... Получается, что пользователи могут видеть, что адрес введён верно (ошибки в регистре могут сигнализировать об опечатке или мошенничестве).

Это хорошая защита от дурака, но не стопроцентная! Изменение одного символа в адресе влечет за собой смену схемы символов в верхнем регистре, но с вероятностью 0,0247% это может не спасти и проверка контрольной суммы пройдет успешно.

▫️Проверь свой адрес

Используй Etherscan или ETH Checksum Tool. При помощи этих сервисов можно проверить контрольную сумму адреса.

▫️Вывод

EVM понимает адрес в любом регистре, но checksum — наша близкая к стопроцентной защита от ошибок и опечаток! Не стоит пугаться, если разные кошельки в разные моменты времени показывают адреса то в нижнем регистре, то в смешанном.

@pnaydanovgoo

Теги:
+4
Комментарии0

Публикации

Работа

Ближайшие события