Биткоин: поиск затерянного сокровища.
Для начала, рекомендую прочитать одну из моих прошлых статей – "Биткоин-кошельки: приватные ключи, методы взлома, кражи и безопасность". В ней описываются ключевые моменты, которые важны для некоторого понимания данной статьи. Коротко, что там описывается:
- мнемоническая фраза – что это и возможные методы взлома;
- приватный ключ и публичный ключ – их принцип работы;
- виды биткоин-адресов;
- "Brute Force";
- статистика биткоин кошельков и их краж;
- безопасность кошелька;
В этой статье, углубимся более детально в тему – поиска биткоин кошельков с не нулевым балансом и более детально рассмотрим следующие темы:
- Метод №1 – код-программа для генерации случайных биткоин-адресов и их приватного ключа;
- Метод №2 – сервис и код-программа для создания кастомных биткоин-адресов;
- Нахождение активного биткоин кошелька: про реальность данного события;
- Нахождение активного биткоин кошелька: мечты, фантазии и будущее;
- Закон и этика;
Метод №1 – код-программа для генерации случайных биткоин-адресов и их приватного ключа.
Начнем с кода-программы. Ниже представлены скриншот кода-программы, которая написана на языке программирования Python и предназначена для генерации случайных биткоин-адресов и проверки их баланса с помощью API BTC.com.
Короткое описание алгоритма работы:
- Генерируется случайный приватный ключ;
- Из этого ключа формируются биткоин-адреса различных типов;
- Программа проверяет баланс каждого адреса с использованием API. Если баланс превышает установленный порог, программа завершает работу и выводит результат. В противном случае процесс повторяется;
Код-программы необязательно должен иметь представленный вид, она может быть написана на другой языке программирования, иметь другую структуру, библиотеки и другие вводные данные.
Разберем более детально каждую строку кода. Скриншот №1:
- os: используется для взаимодействия с операционной системой. В этом коде оно нужно для генерации случайных данных;
- json: позволяет работать с форматом JSON, преобразовывать строки в объекты Python и наоборот;
- time: используется для управления временем, например, чтобы делать паузы между операциями;
- http.client: для отправки HTTP-запросов к API;
- ssl: нужен для создания защищённых HTTPS-соединений;
- binascii: библиотека для работы с двоичными и текстовыми данными (в этом коде — для преобразования между двоичным и шестнадцатеричным форматом);
- certifi: предоставляет набор сертификатов для проверки безопасности HTTPS-соединений;
- bit.PrivateKey: библиотека для работы с биткоин-адресами и ключами. Позволяет создавать приватные ключи и генерировать адреса;
- API_HOST и API_PATH: адрес и путь к API-сервису, который используется для получения информации о балансе биткоин-адресов;
- API_TOKENS: это набор ключей для доступа к API. Они нужны для авторизации при запросах;
- current_token_index: переменная, указывающая, какой API-ключ используется в данный момент;
- error_count: счётчик ошибок для отслеживания числа неудачных попыток запросов к API;
"def fetch_balance (address)" – функция отправляет запрос к API, чтобы узнать баланс биткоин-адреса:
- global error_count, current_token_index: используются глобальные переменные для отслеживания ошибок и текущего API-ключа;
- while error_count < 10: цикл, который продолжается до тех пор, пока количество ошибок не превысит 10;
- conn = http.client.HTTPSConnection(API_HOST...): создается HTTPS-соединение с сервером API с использованием безопасного SSL-контекста;
- headers = {...}: формируются заголовки запроса, включая текущий API-ключ и тип содержимого;
- conn.request("GET", API_PATH.format(address), "", headers): отправляется GET-запрос на получение информации о балансе биткоин-адреса;
- res = conn.getresponse(): получение ответа от API после выполнения запроса;
- data = res.read().decode("utf-8"): чтение ответа и его декодирование из байтового формата в строку;
- conn.close(): закрытие соединения после получения данных;
- json_data = json.loads(data): преобразование строки с ответом в формат JSON для дальнейшей работы с данными;
- if 'data' in json_data and 'balance' in json_data['data']: проверка, содержатся ли в ответе данные о балансе;
- error_count = 0: сброс счётчика ошибок до нуля, если запрос был успешным;
- return json_data['data']['balance']: возвращение значения баланса из данных ответа;
- else: raise ValueError("Непредвиденный формат ответа API."): генерация исключения, если ответ API не соответствует ожидаемому формату;
- except Exception as e: обработка всех ошибок, которые могут возникнуть при выполнении запроса;
- error_count += 1: увеличение счётчика ошибок при возникновении исключения;
- print(f"Не удалось получить баланс..."): вывод сообщения об ошибке, адресе и количестве попыток;
- if error_count >= 10: проверка, достиг ли счётчик ошибок значения 10;
- current_token_index = (current_token_index + 1) % len(API_TOKENS): переключение на следующий API-ключ из списка;
- error_count = 0: сброс счётчика ошибок после переключения на новый API-ключ;
- print(f"Переключение на следующий API-ключ..."): вывод сообщения о смене API-ключа;
- return None: возврат значения None в случае неудачного выполнения запроса;
Примечание: счётчик ошибок и переключение API-ключей реализованы для автоматизации программы. Используются несколько десятков API-токенов, так как каждый из них имеет ограничение на количество запросов. Когда лимит исчерпан, программа получает ошибку и автоматически переключается на следующий токен. Почему счётчик ошибок установлен на 10? Программа может временно выдавать одну или несколько ошибок подряд, поэтому, чтобы точно убедиться, что лимит запросов токена исчерпан, счётчик настроен на 10 попыток.
- Эта функция генерирует случайный приватный ключ длиной 32 байта (256 бит) и возвращает его в шестнадцатеричном формате;
"def generate_addresses_from_private_key(private_key_hex)" – функция для генерации биткоин-адресов из приватного ключа:
- Приватный ключ преобразуется из шестнадцатеричного формата в байты;
- Используя библиотеку bit, из этого ключа создаются два типа биткоин-адресов: legacy (старый формат) и p2sh (адрес с использованием Pay-to-Script-Hash), а bech32 пока не используется, он задаётся как None;
"def check_balance_until_non_zero()" – основная функция для проверки баланса:
- target_balance: устанавливается целевой баланс: 0.0001 биткоина в сатоши (1 биткоин = 100 млн сатоши);
- while True: функция генерирует случайный приватный ключ. На основе приватного ключа генерируются биткоин-адреса;
- for addr_type, address in addresses.items(): для каждого адреса отправляется запрос на проверку баланса, если баланс адреса выше целевого значения, программа завершает работу. Иначе продолжаются попытки;
- Это стандартная конструкция Python, чтобы программа начала выполнение, когда запускается как основной файл;
Подытожим, программа постоянно генерирует случайные приватные ключи и связанные с ними биткоин-адреса. После этого она проверяет баланс этих адресов через API BTC.com, пока не найдёт адрес с балансом выше заданного значения (0.0001 BTC). В целом код-программа представлена в качестве примера и может быть написана по другому. К примеру можно добавить еще два формата кошельков, которые не представлены в этом коде-программы – это Native Segwit Taproot.
Так-же, в примере кода-программы представлена работа с сервисом BTC.com, но вы можете выбрать любой сервис, который будет удовлетворять ваши требования. Рассмотрим некоторые пакетные планы этих сервисов.
Пакетный план сервиса Btc.com:
Пакетный план сервиса BlockCypher:
Пакетный план сервиса CoinGecko:
Пакетный план сервиса Postman:
Сервисов по предоставлению таких услуг вполне себе достаточное количество.
Метод №2 – сервис и код-программа для создания кастомных биткоин-адресов.
Кастомный биткоин-адрес – это адрес, который выглядит определённым образом и включает в себя специфическую последовательность символов. Это обычно делается с помощью программного обеспечения, которое перебирает различные приватные ключи и связанные с ними адреса до тех пор, пока не найдется тот, который соответствует заданным критериям.
Например, некоторые адреса могут начинаться с «1BTC...», «1LOVE...», или «1Donut...». Такие адреса не имеют технического преимущества, но могут быть использованы для маркетинга, донатов или просто для красоты и уникальности.
Создание кастомного адреса основано на переборе вариантов приватных ключей и их соответствующих публичных адресов. Этот процесс называется Vanity Address Generation (генерация «красивых» адресов) и обычно выполняется с помощью специальных инструментов, таких как Vanitygen или его более современные версии.
Упомянутый выше сервис – Vanitygen, не является проверенным мной сервисом и описан здесь в качестве примера. DYOR.
Пример простого кода-программы для генерации кастомных биткоин-адресов и объяснение кода:
- generate_private_key() – генерирует случайный приватный ключ.
- generate_address_from_private_key() – создает биткоин-адрес из приватного ключа.
- find_custom_address() – функция, которая с помощью перебора ищет адрес, начинающийся с заданного шаблона.
Создавать кастомные биткоин кошельки безопасно, но есть пара аспектов, связанных с безопасностью:
- Использование ненадёжных программ для генерации кастомных адресов может привести к утечке приватного ключа и потере средств;
- Создание кастомных адресов не помогает взламывать кошельки, поскольку вероятность случайно сгенерировать чужой приватный ключ остаётся крайне низкой (1 из 2^256);
Нахождение активного биткоин кошелька: про реальность данного события.
Какова вероятность, что первым методом получится найти биткоин-кошелек на котором будет находиться N-ое количество биткоинов? Если говорить коротко, то шансов практически нет.
Второй метод не лучше первого и в нем гораздо меньше шансов. В описанной выше коде, идет перебор тех же самых биткоин-адресов и приватных ключей, но с крайне узким диапазоном. Если в первом методе, условно существует один миллион кошельков с положительным балансом, то во втором методе вы самостоятельно выбираете какой биткоин-адрес и соответственно его приватный ключ вы будите искать. Шансов найти становится еще меньше.
На сегодняшний день существует как минимум две причины такой вероятности:
- Первая – это огромный размер пространства ключей. Приватные ключи биткоина – это 256-битные числа, что даёт около 256^2 возможных ключей. Это число настолько велико, что даже если использовать мощнейшие суперкомпьютеры, шансы случайно сгенерировать приватный ключ, который уже связан с существующим биткоин-кошельком с балансом, фактически нулевые;
- Вторая – защищенность системы. Биткоин был специально разработан для того, чтобы исключить такие атаки на приватные ключи. Приватные ключи надёжно защищены криптографией, и на сегодня не существует известных практических методов нахождения приватных ключей, кроме как перебором, что занимает неопределенно долгое время;
На сегодняшний день существует различные сервисы, которые предоставляют платные услуги или продают программы для поиска биткоин-кошельков с положительным балансом. Идеальным примером здесь может выступать –BitCrack.
BitCrack – один из самых известных инструментов, который используется для поиска приватных ключей через перебор всевозможных вариантов приватных ключей. BitCrack – это программа с открытым исходным кодом, которая пытается вычислить приватные ключи на основе известных публичных адресов. Она использует вычислительные мощности, такие как графические процессоры (GPU), чтобы ускорить процесс. Однако даже с помощью мощного оборудования шансы на успех остаются крайне низкими.
Нахождение активного биткоин кошелька: мечты, фантазии и будущее.
Чтобы шансы нахождения биткоинов в случайно сгенерированных приватных ключах были значительно выше 0 в описанных выше методах или в любом другом, нужно радикально изменить и улучшить существующие технологии и оборудование. Представим себе мечтательные версии будущего:
1. Квантовые компьютеры – такие компьютеры смогут параллельно перебирать миллиарды или даже триллионы приватных ключей за долю секунды. Если классический компьютер использует последовательный перебор, квантовый компьютер с его кубитами способен обрабатывать одновременно множество вариантов. Алгоритмы квантового ускорения позволили бы перебирать ключи с такой скоростью, что поиск приватных ключей от биткоин-адресов, содержащих баланс, стал бы неимоверно быстрым. Шансов поймать на такую удочку активный биткоин-кошелек – кратно растут по сравнению с нынешними технологиями.
2. Искусственный интеллект способный предсказывать приватные ключи – ИИ нового уровня с огромными вычислительными мощностями может обучаться на исторических данных блокчейна и выявлять скрытые закономерности или аномалии в генерируемых адресах. Он мог бы предсказывать вероятные приватные ключи на основе изученных шаблонов, ускоряя процесс нахождения ключей к существующим адресам. Например, нейросети могли бы предсказывать или фильтровать "маловероятные" ключи, фокусируясь только на тех, которые имеют более высокий шанс содержать баланс.
3. Распределённая супер-компьютерная сеть – глобальная распределённая сеть супер-компьютеров, объединяющая мощности миллионов устройств по всему миру, включая телефоны, ПК и серверы. Такое распределённое вычисление позволяло бы создать гигантскую "мозаику" машин, одновременно проверяющую огромные объёмы ключей. Технология блокчейн для децентрализованных вычислений, где участники сети получают вознаграждения за предоставление своих вычислительных мощностей, ускоряя процесс поиска подходящих ключей. DePin – включает в себя концепцию децентрализованного управления и использования физической инфраструктуры, и это может включать предоставление вычислительных мощностей. Однако, DePIN охватывает более широкий спектр децентрализованных услуг и ресурсов. Примером могут служить такие проекты, как Helium, где пользователи предоставляют физические устройства (например, для беспроводной связи) в обмен на вознаграждения в криптовалюте, или Filecoin, где пользователи предлагают вычислительные мощности для хранения данных.
4. Оптимизация генерации ключей – новые криптографические прорывы могут позволить находить ключи с меньшим объёмом вычислений, подобно тому, как была предложена идея взлома эллиптических кривых.
В целом можно много мечтать и думать с какой стороны еще можно подойти, чтобы решить эту задачу. Встреча с инопланетянами, путешествия во времени или что-то еще. Главное, если появится такая технология, которая кратно увеличит шансы на подбор активных биткоин-кошельков и их приватных ключей, то это ставит под угрозу не только существования биткоина, а в целом большинство криптовалют. Однако, пока мы находимся в пределах классической вычислительной мощности, текущие шансы почти равны нулю.
Попробуем разобраться с другой стороны, что условно у вас или другого человека получилось взломать биткоин-кошелек на котором хранится N-сумма биткоинов. Что предусматривает закон и этика на этот счет?
1. Этично ли пользоваться найденными биткоинами?
- С этической точки зрения использование биткоинов, которые были найдены через перебор приватных ключей, является неправомерным и аморальным. Этот процесс – своего рода взлом, и использование средств, которые принадлежат другому человеку, нарушает принципы уважения к чужой собственности и конфиденциальности. Биткоины, как и любая другая форма цифрового или физического имущества, имеют законного владельца, который завладел ими через честные или законные способы. Использование программы для взлома чужого биткоин-кошелька и присвоение средств может считаться аналогом кражи, даже если средства находятся в цифровой форме;
2. Законно ли забрать себе найденные биткоины?
- Забрать найденные биткоины в результате взлома приватных ключей незаконно в большинстве юрисдикций многих стран. Даже если нет прямого закона, регулирующего криптовалюты в вашей стране, такие действия могут подпадать под статьи о краже, мошенничестве, неправомерном доступе к информации или компьютерным преступлениям. В некоторых странах криптовалюты считаются имуществом, поэтому незаконное завладение средствами через взлом будет аналогично краже или присвоению собственности. Законы о киберпреступлениях также охватывают такие действия, так как взлом чужих учетных записей и использование приватных данных – это нарушение закона;
3. Как доказать, что кошелек принадлежит именно тебе и владение приватным ключом = законное владение?
- Приватный ключ дает полный контроль над биткоин-кошельком, и в криптовалютной экосистеме владение ключом действительно означает контроль над средствами. Однако с правовой точки зрения ситуация сложнее. Владелец приватного ключа не всегда имеет законное право на средства. Например, если кто-то украдет ваш кошелек или банковский пароль, он может получить доступ к деньгам, но это не делает его их законным владельцем. В биткоин-системе аналогично: даже при анонимности кошельков существуют способы связать их с владельцем — через использование кошелька для переводов на биржи, оплаты услуг или других операций. Это лишь малая часть возможных доказательств, и их значительно больше. В суде для подтверждения владения могут использоваться не только приватный ключ, но и история транзакций, связи с верифицированными биржами и другие следы. Если владелец кошелька докажет, что совершал транзакции с этого адреса до взлома, это подтвердит его право на средства. Даже если юридически нельзя доказать, кто владеет кошельком, сам факт взлома является незаконным. Законодательство защищает частную собственность, и не столько важно, кто владеет ключом, сколько то, что доступ был получен незаконным путем. Таким образом, обладание приватным ключом после взлома не является законным подтверждением права собственности.
Соответственно можно сделать вывод, что использование биткоинов, полученных через взлом, является не только неэтичным, но и незаконным. Такие действия подпадают под статьи о краже, финансовых и компьютерных преступлениях. Закон защищает частную собственность, и владение ключом не оправдывает получение средств незаконным путем, что может быть доказуемо.
«Что скажете насчет буквы B, перечеркнутой двумя линиями? Нормальный логотип?» © Satoshi Nakamoto