July 23, 2022

Генерируем красивые адреса в ETH

Привет старички.

С вами @danoneo и сегодня я расскажу вам как генерировать красивые и ЭФФЕКТИВНЫЕ адреса для любой EVM сети.


1. Зачем это надо?

Во первых, это удобно - можно сгенерировать адрес с определенной комбинацией символов в начале, например с годом рождения, или почтить память почившего деда (0xDeadDed...).

Во вторых - так можно сделать "энергоэффективные" адреса и контракты, которые потребляют меньше газа, а следовательно экономят вам бутериумы.

Чем больше нулей в начале адреса - тем дешевле обходятся контрактные взаимодействия! За каждый "нулевой" байт (2 нуля подряд) вы экономите 64 газа. Вот прекрасная статья, которая объясняет этот феномен.


2. Генерируем кошельки

Для генерации красивого кошелька нам понадобится profanity.
Это GPU генератор, который работает в сотни раз быстрее любых CPU-скриптов.

Установка:
1. Заходим в Releases, скачиваем архив "profanity-v1.60-x64.zip.zip".

2. Достаем файлы из архива в папку, нас интересуют два файла. Для Windows это profanity.exe, для unix-систем - profanity.x64.

3. Открываем консоль (командную строку), перетягиваем туда мышкой файл profanity.exe, и дописываем --benchmark. Лично у меня на Windows скрипт отказался работать, зато прекрасно завёлся на WSL.

--benchmark это тест производительности, если снизу появился хешрейт вашей GPU - значит всё работает!

4. Определяемся с тем, что будем генерировать - все возможные настройки можете глянуть в репозитории profanity.

5. Запускаем скрипт, в данном случае я хочу много нулей (аргумент --leading 0). Как видите, для генерации 8 нулей подряд (4 нулевых байта, экономия 256 газа) понадобилось всего 46 секунд. Мне удалось найти адрес с 12 нулями за 10 часов на старенькой GTX 1060 6GB.

Можете сами проверить, вот приватный ключ: 0x331c97251c204feed2e52f156c59530f9c8d82b69ad6a9443be91a68f623850c

6. Попробуем получить адрес DA707E0 (типа DANONEO, поняли??). Использую аргумент --matching DA707E0 , кошелек был найден через 12 секунд:

https://stjerneskinn.com/hexadecimal-words.htm - список слов из hex символов.

Но это всё цветочки, перейдем к ягодкам!


3. Генерируем контракты


Взгляните на адреса Opensea Seaport, GasToken, MEV бота.

Я уже рассказывал про это - каждый нулевой байт экономит газ. Это хорошо использовать для контрактов с огромным количеством пользователей (OpenSea), и просто необходимо если вы хотите быть конкурентоспособным MEV-игроком. Ведь там битва идет за каждый наногазик, и побеждает самый дешевый контракт.

Генерировать адрес для контракта можно двумя способами:
Первый - с помощью старины profanity. Адрес контракта можно "предугадать" если известен sender (кошелек-деплоер), и его nonce (кол-во совершенных транзакций). Profanity генерирует кошельки с nonce=0, и смотрит, какой контракт может из них родиться. Это лоховской способ, т.к. у нас есть EIP-1014 и CREATE2.

Второй - с помощью ERADICATE2 от того же разработчика. Здесь используется CREATE2, который генерирует контракт исходя из: sender(адрес деплоера), salt(рандомные 32 байта), bytecode(байткод создаваемого контракта).

Попробуем сгенерировать контракт с помощью ERADICATE2:

1. Повторяем те же действия, что делали с profanity.

2. Выбираем аргументы для запуска. После -A пишем адрес контракта, с которого будем деплоить целевой контракт. Вместо -I (init-code) лучше выбирать -i (init-code-file), и указывать путь к файлу с байткодом целевого контракта.

3. Добываем байткод - для этого можно использовать Remix, либо взять его на Etherscan во вкладке Contract. Вот байткод для Opensea Seaport:

4. Копируем байткод в файл initcode.txt, добавляем в начало 0x. Ракета заряжена, можем запускать скрипт:

./ERADICATE2.exe -A 0x7f9a26980b0Ecd2F79Af99a18A191e2Aa051aeFc -i ./initcode.txt --leading 0

Чуть больше минуты - и получаем salt для генерации контракта с 10 нулями. Сверяем в Remix:

Сработало! Осталось только задеплоить. Код для контракта-деплоера можно подсмотреть здесь.


4. Что делать если нет видеокарты

Если вы хотите МНОГО нулей, но у вас нету хорошей GPU - можно арендовать GPU ферму. Совершенно точно не стоит использовать это для генерации приватников, т.к. это просто небезопасно.

Зато сервис отлично подходит для генерации salt для контрактов.


5. Бонус

С помощью данных фишек также можно организовать себе удобную работу с большим массивом контрактов. Мне понадобилось сделать сотни прокси-контрактов, и я предварительно сгенерировал salt для контрактов с порядковыми номерами, в диапазоне 0x000-0x999. Это сильно облегчает жизнь, когда надо найти конкретный контракт для одиночного взаимодействия.


На этом всё!

Подписывайтесь на мой канал: https://t.me/danoneo_systems

Больше подписчиков = больше контента :)