Как дополнительно защитить крипто-кошелек
Будь то сейф в банке или пакет под матрасом бабушкиной кровати — наши деньги никогда не бывают в безопасности на 100%. Криптовалюты не исключение. Автор канала Шифроденьги специально для читателей DeCenter подготовил колонку, в которой поделился своими наблюдениями о том, как повысить уровень защиты кошелька для хранения криптовалюты.
В этом гайде я не буду расписывать список советов по типу: никому не передавайте свои приватные ключи, делайте бэкапы и будьте внимательны. Предположим, что вы это и так прекрасно понимаете и грамотно подходите к хранению и использованию криптовалют.
Речь пойдет о дополнительной защите вашего кошелька. О такой защите, которая позволит спасти средства даже в том случае, если ваш приватный ключ УЖЕ попал в лапы злоумышленникам. Спасти деньги в момент кражи
Вы спросите «Как это возможно?». Суть в том, что в блокчейнах Bitcoin, Ethereum и других существует механизм, который позволяет перебить еще неподтвержденную транзакцию другой транзакцией с большей комиссией (transaction fee). В биткоине, например, этот механизм называется Replace by Fee.
Обычно RBF используется в случаях, когда надо отправить такую же транзакцию тому же адресату, но с большей комиссией, просто с целью ускорить процесс подтверждения. Но мало кто знает, что можно изменить адресата и создать конкурентную транзакцию! И если все сделать правильно и быть везунчиком, ваша конкурентная транзакция включится в блок раньше, а первая транзакция будет отвергнута как попытка «двойной траты».
Реальная история о том, как были спасены 2 BTC:
«Как-то наш платежный шлюз взломали и поставили на вывод 2 BTC. В той версии шлюза была захардкожена комиссия 0.0001 BTC, что было достаточно мало на тот момент. Времени оказалось достаточно, чтобы во всем разобраться и заменить транзакцию, повысив комиссию до 0.1 BTC. В итоге наша транзакция подтвердилась быстрее, а злоумышленник не получил ничего!» — рассказывает автор статьи, где ставится эксперимент с RBF механизмом для сети биткоина.
Заменить транзакцию в Ethereum?
Возможно ли то же самое в Ethereum? В отличие от модели учета входов и неизрасходованных выходов (UTXO) в Bitcoin, в Ethereum используются состояния («world state») для определения балансов на каждом аккаунте. Чтобы создать конкурентную транзакцию, нужно чтобы у нее был тот же nonce, что у транзакции злоумышленника.
Nonce указывает майнерам и нодам о порядке транзакций и, соответственно, о том, как изменять «состояние аккаунта». Первой примется та транзакция, у которой параметр nonce меньше. Если будет две транзакции с одинаковым nonce, то примется только та, которая первой будет включена в блок.
Большинство Ethereum-кошельков не позволят вам отправить транзакцию с тем же nonce. Но это можно сделать через web3.js — официальную библиотеку для взаимодействия с Ethereum-нодой.
У вас может быть всего 15 секунд
Но сложности на этом не заканчиваются. 15 секунд — среднее время майнинга нового блока в сети Ethereum. Ожидаемое время до включения транзакции злоумышленника в блок при нормальных нагрузках сети и нормальной комиссии — 30 секунд.
Да, конечно, если сеть будет перегружена и транзакции будут подтверждаться очень медленно, как было, например, во время наиболее активных краудсейлов типа Bancor или Status, то время для вашего реагирования может увеличиться до нескольких часов или даже дней, что может оказаться очень кстати.
Получается, что в среднестатистический день в сети Ethereum у вас будет в среднем 30 секунд, чтобы:
Определить, что в мемпуле появилась новая исходящая транзакция с вашего адреса;
Создать конкурентную транзакцию с тем же nonce, но с большей комиссией, и в качестве адресата указать свой резервный кошелек.
Очевидно, что без автоматизации у нас практически нет шансов. Ниже пойдет речь о возможностях реализовать эту автоматизацию.
Ставим свой Ethereum-кошелек на «сигнализацию»
Чтобы создать свою собственную систему реагирования на кражу, необходимо следующее:
Нода или сервис, который постоянно мониторит мемпул и ищет там исходящие транзакции с вашего адреса и в случае опасности выдает сигнал тревоги в виде вебхука или push-уведомления.
Работающий 24/7 компьютер или устройство-кошелек, которое будет обрабатывать вебхук или push-уведомление и создавать конкурентную транзакцию для вывода всех средств на какой-то резервный адрес, включая все ERC20 или другие токены.
Мониторинг мемпула
Для проверки мемпула вы можете самостоятельно поднять свою geth ноду, написать скрипт с использованием Node.js и web3.js. Ресурсоемкое обслуживание Ethereum ноды обойдется вам в среднем в 70$ в месяц. Также учитывайте, что блокчейн Ethereum весит сейчас около 100 ГБ.
Другой путь — воспользоваться каким-то готовым сервисом для мониторинга блокчейнов по заданным адресам. Например, myeth.io. Сервис проверяет мемпул сети Ethereum и Bitcoin каждые 15 секунд и отправляет мгновенное уведомление в Telegram о любых транзакциях, которые там появляются. Возможно добавить до 50 адресов для одновременного мониторинга.
Установите Telegram-бота @myeth_bot, введите свой ETH- или BTC-адрес и получайте уведомления о всех транзакциях в Телеграм. Дополнительно для конкретных адресов можно настроить вебхук, который будет мгновенно отправляться в случае исходящей транзакции (см. скриншот):
Вебхук — это настраиваемый пользователем http url, который позволяет передавать данные туда, куда захочет пользователь. Наличие вебхуков расширяет функциональность любой системы. Например:https://webhook.site/f7c55e64-4809-40f3-9ea0-boa7daec3cf6.
Просто отправляете url вашего вебхука и все. После этого ваш вебхук будет дергаться автоматически в случае исходящей или входящей транзакции.Обработка вебхука и автоматическое создание «конкурентной» транзакции
В идеале хотелось бы просто поставить мобильное приложение, которое бы генерировало конкурентную транзакцию по Push-уведомлению. Но мобильных кошельков с такой функциональностью сейчас, к сожалению, нет на рынке, но я уверен, что скоро они начнут появляться.Кроме того, уже есть наработки SDK, которые дают возможность самостоятельно допилить такую функциональность для open-source кошельков.
Другой путь — использовать не выключающийся домашний компьютер либо VPS, на котором будет крутиться обработчик вебхуков, который запустит самописный скрипт по созданию конкурентной транзакции.
Скрипт для создания конкурентной транзакции в Ethereum можно написать на Node.js, используя библиотеку web3.js, которая предоставляет АПИ для взаимодействия с блокчейном Ethereum. Чтобы не поднимать свою ноду, можно подключиться к публичной от infura.io.
Для Bitcoin выбора намного больше. Можно использовать js библиотеки типа bitcoinjs или решения от BitPay или python библиотеки, чтобы написать свой скрипт по созданию конкурентной транзакции. Публичную ноду стоит поискать на bitnodes.
Вместо заключения
Как видите, крипто-технологии имеют интересные возможности для автоматизации и дополнительной защиты кошельков. Кстати, некоторые блокчейны реализуют функции защиты и страхования средств на основном уровне протокола, например, в EOS украденные средства можно вернуть через встроенный механизм арбитража.
Надеюсь, эта статья открыла для вас полезную информацию по дополнительной защите и мониторингу своих кошельков. Спасибо за чтение!
По вопросам размещения материалов в рамках авторской колонки, пожалуйста, пишите на np@decenter.org.