Использование Flash-ботов для спасения активов из взломанного кошелька

Использование Flash-ботов для спасения активов из взломанного кошелька

9 января 2023 г.

<цитата>

Иногда флеш-боты действительно могут спасти жизнь.

Давайте посмотрим на реальное событие

Некоторое время назад один из наших кошельков был взломан, и весь эфир в этом кошельке был изъят. Это была проблема, но более серьезная проблема заключалась в том, что этот кошелек был владельцем контракта, который мы развернули, и он все еще владел им, но у него не осталось эфира, поэтому мы не могли передать право собственности другому кошельку, поскольку мы не смог заплатить за газ.

Что ж, просто загрузите кошелек эфиром и переведите токены. Это так просто, правда?

Ну, не совсем!

<цитата>

Существовала большая вероятность того, что человек, взломавший кошелек, настроил бота, который сразу выведет все активы, переведенные на кошелек. Так вот, если бы мы перевели какой-нибудь эфир на кошелек, была большая вероятность, что он тут же будет выведен.

Какое же решение?

Это просто. Нам нужно было перевести немного эфира в кошелек и передать право собственности на контракт, прежде чем бот, созданный хакером, смог выполнить какое-либо действие. Это должно было быть быстро, а это означало, что это нужно было сделать в одном блоке

Можем ли мы сделать это вручную?

Неееет, тогда на помощь приходят флешботы

Сначала разберемся с некоторыми терминами

Максимальная извлекаемая ценность (MEV)

Максимальная извлекаемая стоимость (MEV) представляет собой избыточную стоимость, полученную майнерами (или валидаторами) от пользователей в криптовалютной сети. Эта избыточная стоимость часто возникает из-за переупорядочивания транзакций пользователей с целью максимизации комиссий или добавления новых транзакций, которые позволяют майнеру опережать транзакции пользователей.

Подробнее: Максимальное извлекаемое значение (MEV) | эфириум.org

Флэш-боты

Флэш-боты — это автоматизированные программы, использующие высокоскоростную связь и технологии обработки данных для совершения сделок на децентрализованных биржах (DEX) или других типах торговых платформ на основе блокчейна.

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

Назад к проблеме

В этой статье я попытался воспроизвести сценарий, аналогичный описанному ранее. У нас есть кошелек, который был взломан, хакер забрал все Eth из этого кошелька, но в этом кошельке все еще осталось несколько токенов ERC20, мы хотим взять эти токены и перевести их в другой кошелек.

Давайте посмотрим код

Вы можете клонировать начальный код из этого Repo. n Прежде всего, установите переменные среды

TOKENS=Address of ERC20 token which we need to takeout of that wallet  
RESCUER=Private key of wallet in which we want to transfer those tokens
HACKED_WALLET=Private key of wallet that has been hacked

Давайте сначала определим некоторые константы

const provider = new providers.JsonRpcProvider('<https://rpc.ankr.com/eth_goerli>')
const authSigner = Wallet.createRandom()
const flashbotProvider = await FlashbotsBundleProvider.create(
        provider,
        authSigner,
        FLASHBOTS_URL
    )
const rescuer = new Wallet(RESCUER).connect(provider)
const hackedWallet = new Wallet(HACKED_WALLET).connect(provider)

Мы создали все необходимые подписанты и используем Ankr в качестве поставщиков RPC.

Мы будем использовать метод flashbotProvider с именем sendBundle.

Этот метод принимает массив Транзакций, которые мы хотим выполнить в одном блоке, а в качестве второго аргумента он принимает количество блоков, в которые мы хотим включить транзакции.

Круто? Хорошо. Давайте сначала получим номер текущего блока.

provider.on('block', async (blockNo) => {
    const targetBlock = blockNo + 1;
})

Выходной целевой блок — это следующий блок, который необходимо создать.

А теперь воспользуемся методом sendBundle

.

const resp = await flashbotProvider.sendBundle([
            {
                signer: rescuer,
                transaction: {
                    chainId: 5,
                    type: 2,
                    to: hackedWallet.address,
                    value: utils.parseEther('0.01'),
                    maxFeePerGas: utils.parseUnits('20', 'gwei'),
                    maxPriorityFeePerGas: utils.parseUnits('13', 'gwei')
                }
            },
            {
                signer: hackedWallet,
                transaction: {
                    chainId: 5,
                    type: 2,
                    to: TOKENS,
                    gasLimit: '70000',
                    data: iface.encodeFunctionData("transfer", [
                        rescuer.address,
                        utils.parseEther('200')
                    ]),
                    maxFeePerGas: utils.parseUnits('20', 'gwei'),
                    maxPriorityFeePerGas: utils.parseUnits('13', 'gwei')
                }
            }
        ], targetBlock)

По сути, мы будем выполнять две транзакции

  1. Нам нужно перевести немного эфира на взломанный кошелек, чтобы обеспечить его комиссией за газ, которая будет использоваться для перевода токенов ERC20 на кошелек спасателя.
  2. Теперь мы вызываем функцию перевода из контракта ERC20, используя подписанта взломанного кошелька, и переводим все токены в кошелек спасателя.

Эти транзакции могут быть любыми. Например, передача, NFT, передача права собственности на контракт, вызов любого метода контракта.

Вот и все.


Также опубликовано здесь

<цитата>

Хотите подключиться? Напишите мне в твиттере @pateldeep_eth или LinkedIn

Хотите изучить больше примеров? n https://github.com/flashbots/searcher-sponsored-tx< /p>

Также прочтите


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE