Использование 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)
По сути, мы будем выполнять две транзакции
- Нам нужно перевести немного эфира на взломанный кошелек, чтобы обеспечить его комиссией за газ, которая будет использоваться для перевода токенов ERC20 на кошелек спасателя.
- Теперь мы вызываем функцию перевода из контракта ERC20, используя подписанта взломанного кошелька, и переводим все токены в кошелек спасателя.
Эти транзакции могут быть любыми. Например, передача, NFT, передача права собственности на контракт, вызов любого метода контракта.
Вот и все.
Также опубликовано здесь
<цитата>Хотите подключиться? Напишите мне в твиттере @pateldeep_eth или LinkedIn
Хотите изучить больше примеров? n https://github.com/flashbots/searcher-sponsored-tx< /p>
Также прочтите
- Как найти длину строки в Solidity — из смарт-контракта «энс»
- Постоянное хранилище файлов для Приложения Web3 с Arweave, Bundlr, Next.js, RainbowKit и Wagmi
- Как разрабатывать и развертывать смарт-контракты с помощью Foundry & Опенцеппелин
Оригинал