惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
IT之家
IT之家
N
Netflix TechBlog - Medium
MyScale Blog
MyScale Blog
雷峰网
雷峰网
T
Tailwind CSS Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
The Blog of Author Tim Ferriss
S
Schneier on Security
C
CERT Recently Published Vulnerability Notes
Help Net Security
Help Net Security
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
I
InfoQ
H
Help Net Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
G
GRAHAM CLULEY
Blog — PlanetScale
Blog — PlanetScale
G
Google Developers Blog
I
Intezer
大猫的无限游戏
大猫的无限游戏
AWS News Blog
AWS News Blog
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
Spread Privacy
Spread Privacy
博客园_首页
宝玉的分享
宝玉的分享
量子位
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Security Latest
Security Latest
C
Cybersecurity and Infrastructure Security Agency CISA
SecWiki News
SecWiki News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - Franky
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
The Exploit Database - CXSecurity.com
T
Tenable Blog
Know Your Adversary
Know Your Adversary
P
Proofpoint News Feed
The Register - Security
The Register - Security
V2EX - 技术
V2EX - 技术
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Last Week in AI
Last Week in AI
L
LangChain Blog
T
Tor Project blog
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Тестируем программы для вскрытия биткойн-головоломок
inetstar (RU · 2026-04-30 · via Все публикации подряд на Хабре

Тестируем программы для вскрытия биткойн-головоломок

Уровень сложностиСредний

Время на прочтение15 мин

Охват и читатели6

Обзор

Тест программ-решателей биткойн-головоломок

Тест программ-решателей биткойн-головоломок

После того как я написал статью «Головоломка на 1000 BTC» мне стали писать в личку авторы программ для их решения. В этой статье я расскажу о целом семействе таких программ и протестирую все те, что попали мне в руки, на скорость.

А заодно расскажу, как авторы этих программ выжимают соки из железа.

Речь идёт про головоломки, у которых известен только BTC-адрес формата P2PKH, но не известен публичный ключ. Это головоломки с номерами 71-159, кроме тех, чей номер кратен 5. У головоломок кратных 5 известен публичный ключ и для них применяются совсем другие алгоритмы — кенгуру Полларда или BSGS, на порядки более быстрые, чем bruteforce. Самая лёгкая ещё не вскрытая головоломка с известным публичным ключом — 135.

Краткая хронология программ

Я не претендую на полное знание этой сферы, поэтому, если я что-то упустил, , пишите в личку или в комментарии

Год начала разработки

Программа

Автор

Платформа

Язык

2018

BitCrack

brichard19

CUDA + OpenCL

C++

2019

VanitySearch

JeanLucPons

CPU + CUDA

C++

2021

KeyHunt

albertobsd

CPU

C++

2021

KeyHunt-Cuda

Qalander

CUDA

C++

2024

Cyclone

dookoo2

CPU (AVX2/512)

C++

2024

ecloop

vladkens

CPU

чистый C

2025

CUDACyclone

dookoo2

CUDA

CUDA

2025

BtcMole

keymole

CPU (x86-64, ARM64) + CUDA + AMDGPU

closed source

BitCrack (2018)

Старейшина жанра. Первая массовая программа для перебора приватных ключей на GPU, поддерживает и CUDA, и OpenCL. Сегодня морально устарела — отстаёт от лидеров примерно в 5 раз. Технические причины разберём в разделе «Что используют авторы для ускорения перебора».

VanitySearch (2019)

Программа Жан-Люка Понса (JeanLucPons) задумывалась для генерации «красивых» биткойн-адресов (1Love…, 1Btc…), но архитектурно оказалась настолько удачна, что почти все последующие проекты связанные с биткойн-головоломками — её прямые потомки или форки. Канонические трюки массовой инверсии Монтгомери и работы с PTX зародились именно здесь.

KeyHunt (2021)

Программа-комбайн для CPU от Alberto: поддерживает Bloom-фильтр по списку адресов, режим BSGS (Baby-step Giant-step) для подбора по известному pubkey, несколько типов целей (BTC, ETH).

KeyHunt-Cuda (2021)

Порт логики KeyHunt + VanitySearch на CUDA от Qalander. Долгое время держался в топе по CUDA-производительности.

Cyclone (2024)

Современная CPU-перебиралка от @dookoo2. Некоторым эта программа знакома из комментариев к моей статье «Головоломка на 1000 BTC» — там автор объясняет принятые им архитектурные решения. За точку отсчёта в наших таблицах берётся именно Cyclone.

ecloop (2024)

Минималистичный C-проект от русскоязычного разработчика vladkens: main.c + несколько библиотек для хэшей, минимум зависимостей.

CUDACyclone (2025)

CUDA-версия Cyclone от того же @dookoo2.

BtcMole (2025)

Свежий проект от автора под ником keymole. Распространяется в виде бинарных сборок. Поддерживает Windows, Linux; процессоры amd64, arm64, arm; видеокарты Nvidia, AMD.

Методика бенчмаркинга

Почему нельзя верить «попугаям»

Каждая из этих программ во время работы рисует на экране собственную скорость в Mkey/s (миллионах ключей в секунду). Доверять этим цифрам нельзя по нескольким причинам:

  1. Скам в крипте — обыденность. Цифру можно нарисовать любую.

  2. Холодный VS горячий старт. Первые несколько секунд GPU/CPU показывают результат заметно выше среднего рабочего.

  3. Внутренние счётчики бывают просто кривые.

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

Технически это «реши одну и ту же задачу»: каждой программе даётся одинаковый диапазон и случайный ключ-цель внутри него. Время — по системным часам, факт находки — по поиску известного hex в выводе.

Размер выборки: почему 100 итераций. Сначала я делал по 10–20 прогонов на программу. На таких выборках одна «неудачная» позиция ключа могла кардинально перевернуть таблицу: разные программы сканируют диапазон в разном порядке (последовательно, со смещением, случайно), и один и тот же случайный ключ оказывается для одной программы «на старте», а для другой «в самом конце». Один такой выброс при 10 запусках сдвигал среднее на десятки процентов. Мне пришлось увеличить поисковые интервалы примерно вдвое относительно первой версии бенча и поднять число прогонов до 100 на каждую программу — итоговый бенчмарк работал всю ночь. Стандартная ошибка среднего теперь ≈ σ/√100 ≈ σ/10, чего вполне достаточно для статистической достоверности.

Репозиторий бенчмарка

Скрипт и все патчи доступны на GitHub.

Дизайнерские решения в `bench.py`
  • Все программы — с настройками по умолчанию. Я сознательно не подбирал размер батча, число потоков, grid/slices и т.п. — предполагаю, что авторы выставляют оптимальные настройки по умолчанию. Точные команды можно посмотреть в скрипте.

  • Один источник случайности. SEED фиксирован (SEED = 42), так что на повторных запусках набор ключей-целей идентичный — можно честно сравнивать прогон с прогоном.

  • Per-device параметры. Для CPU и CUDA задаются разные интервалы (2^33 и 2^35 соответственно) и одинаковое число итераций (100). Для AMDGPU — короткий интервал и мало итераций (см. соответствующий раздел).

  • Единый разбор вывода. Каждой программе сопоставлен success_re — регулярное выражение, по которому распознаётся «нашёл этот ключ».

  • Тайм-аут с принудительным завершением. Если программа уходит в бесконечный цикл или зависает, через BENCH_TIMEOUT секунд ей шлётся SIGTERM, потом SIGKILL. Итерация засчитывается как FAIL.

  • Изоляция подпрограмм. Каждая программа клонируется и собирается в отдельной папке work/<name>/ (кроме BtcMole — cpu/cuda/amdgpu делят одну папку, так как репозиторий один на все версии).

  • Патчи под сборку. Часть программ из обзора без правок просто не собирается на свежем GCC/CUDA/ROCm. Для таких случаев в бенче лежат собственные патчи (bug-fix Makefile’ов, замены deprecated CUDA-API, правки include’ов), которые применяются перед сборкой.

Запуск: ./bench.py --device cpu, ./bench.py --device cuda или ./bench.py --device amdgpu. Перед первым запуском — --prepare (clone + build). Все настройки (число итераций, прогревов, размер интервала, seed) — вверху скрипта.

Сам скрипт bench.py написан с помощью Claude Code.

Оборудование стенда

  • CPU: AMD EPYC 7C13 (64 ядра / 128 потоков, 2.45 GHz base)

  • GPU: NVIDIA CMP 90HX (Ampere, sm_86, 50 SM, 1530 MHz @ 200 W power-limit)

  • AMDGPU: Radeon R9 Fury (gfx803, 56 CUs)

  • OS: Linux (Calculate Linux, kernel 6.18)

Тестирование CPU-программ

Особенности тестирования на CPU

Эти программы рассчитаны на круглосуточную работу — в реальности процессор нагрет, может сбрасывать частоту. Холодный замер дал бы завышенные цифры. Поэтому перед каждой программой идёт прогревочный прогон, результаты которого не учитываются (константа WARMUP_PER_DEVICE в bench.py).

Сколько потоков отдаётся программе. Каждой CPU-программе передаётся 115 потоков из 128 доступных (~90%). Оставшиеся 13 потоков остаются за графической оболочкой, фоновыми службами, самим bench.py и т.п. Если отдать программе все 128, она будет конкурировать за процессорное время с GUI и системой — итог станет менее точным.

Важная оговорка про SIMD. На моей машине нет AVX-512, есть только AVX-2. Поэтому Cyclone собирается и тестируется именно в этом варианте. Бенчмарк ARM64 я тоже не проводил.

Тестируемые программы

Программа

Год разработки

Язык

Источник

KeyHunt

2021

C++

GitHub

Cyclone

2024

C++

GitHub

ecloop

2024

C

GitHub

btcmole (CPU)

2025

закрытый

GitHub

Параметры прогона

  • Диапазон поиска: [0x200000000, 0x3ffffffff] (size = 2^33 ≈ 8.6 миллиарда ключей).

  • Ключи: 100 (разные случайные внутри диапазона).

  • Эталон скорости: Cyclone (за 1.00× принят его суммарный результат).

Результаты

Программа

OK / FAIL

Σ время (s)

Avg (s)

Скорость (× эталон)

btcmole (CPU)

100 / 0

1111.15

11.11

1.32

ecloop

100 / 0

1384.45

13.84

1.06

Cyclone (AVX-2)

100 / 0

1469.36

14.69

1.00

keyhunt

100 / 0

3691.10

36.91

0.40

Тестирование GPU-программ

Особенности тестирования на GPU

Холодная карта ≠ рабочая карта: на холодной частота держится на разгонной, после прогрева начинаются сброс частот (так называемый тротлинг — защита от перегрева). Любитель публиковать рекорды просто запустит свою программу первой. Чтобы убрать этот эффект, частота и power limit GPU зафиксированы:

Плюс 2 прогревочных прогона перед общим тестированием, как и на CPU.

Что заявляют сами авторы

Заявленные скорости на топовой RTX 5090 (Blackwell, sm_120):

  • CycloneCUDA (dookoo2) — 6200 Mkey/s.

  • btcmole (keymole) — 9520 Mkey/s.

Значения приведены для справки, в тестах мы на них не ориентируемся.

Карты Nvidia

Тестируемые программы

Программа

Год разработки

Язык

Источник

BitCrack (CUDA)

2018

C++ / CUDA

GitHub

KeyHunt-Cuda

2021

C++ / CUDA

GitHub

CUDACyclone

2025

CUDA

GitHub

btcmole (CUDA)

2025

закрытый

GitHub

KeyKiller-Cuda

2024

C++ / CUDA

GitLab

KeyScanner

2024

C++ / CUDA

GitHub

Параметры прогона

  • Диапазон поиска: [0x800000000, 0xfffffffff] (size = 2^35 ≈ 34.4 миллиарда ключей).

  • Ключи: 100.

  • Эталон скорости: CUDACyclone (за 1.00× принят его суммарный результат).

  • Карта: NVIDIA CMP 90HX (sm_86, 50 SM, 200 W @ 1530 MHz).

Результаты

Программа

OK / FAIL

Σ время (s)

Avg (s)

Скорость (× эталон)

BtcMole (CUDA)

100 / 0

901.99

9.02

1.46

KeyHunt-Cuda

100 / 0

1302.08

13.02

1.01

CUDACyclone

100 / 0

1320.70

13.21

1.00

KeyKiller-Cuda

100 / 0

2952.25

29.52

0.45

KeyScanner

92 / 8

6166.90

67.03

0.21

BitCrack (CUDA)

100 / 0

6289.19

62.89

0.21

Карты AMD

На AMD-картах из публичных проектов работает только BitCrack через OpenCL — да и тот на нашем стенде стабильно возвращает Reached end of keyspace без находки.

BtcMole — единственная программа, авторы которой заморочились с поддержкой AMD-железа. Остальная индустрия молчаливо живёт в парадигме «есть только NVIDIA».

К сожалению, внешне работающая под AMD clBitCrack в реальности совсем не ищет ключи. Она сдулась на первом же ключе из бенча: диапазон 0x40000000:0x7fffffff (всего 2³⁰ ≈ 1.07 млрд ключей), цель — адрес 1Q4U2cBxgduTyEiWFWBF16tjsb4hR7zee9, известный приватный ключ 0x6d06ef13. BtcMole-AMDGPU нашёл ключ за секунды. clBitCrack прокрутил весь диапазон и завершился сообщением Reached end of keyspace — ключ не найден. То же самое — на остальных трёх итерациях. Похоже, в OpenCL-ядре BitCrack есть баг арифметики или хеширования. Поэтому скрипт пометил все запуски clBitCrack как FAIL.

Грубая оценка скорости clBitCrack. На независимом тесте на AMD RX 580 clBitCrack показывает ~9.42 Mkey/s, btcmole-AMDGPU на той же карте — ~240 Mkey/s. То есть даже если бы clBitCrack находил ключи, отрыв был бы в 25 раз в пользу BtcMole. Это уже не «оптимизация», а просто другая весовая категория.

Тестируемые программы

Программа

Год разработки

Язык

Источник

BitCrack (OpenCL)

2018

C++ / OpenCL

GitHub

BtcMole (AMDGPU)

2025

закрытый

GitHub

Параметры прогона

  • Диапазон поиска: [0x40000000, 0x7fffffff] (size = 2^30 ≈ 1.07 миллиарда ключей) — короткий, потому что BitCrack-OpenCL заведомо FAIL и тратить на него больше времени смысла нет.

  • Ключи: 4 — достаточно для проверки работоспособности BtcMole-AMDGPU, не претендует на статистическую значимость.

  • Карта: AMD Radeon RX 580.

Результаты

Программа

OK / FAIL

Σ время (s)

Avg (s)

BtcMole (AMDGPU)

4 / 0

16.73

4.18

BitCrack (OpenCL)

0 / 4

Если кто-то знает другие живые решатели для карт AMD — сообщите мне.

Что используют авторы для ускорения перебора

Все рассматриваемые проекты решают одну и ту же задачу — массовое сложение точек на secp256k1, хеширование SHA-256 + RIPEMD-160, сравнение с целью. Различаются они где считают и как глубоко оптимизируют. Ниже — основные технические приёмы, упорядоченные по программам.

BitCrack — «в лоб», без массовой инверсии

Старейшина считает каждое сложение точек отдельно. На каждом шаге — собственная модулярная инверсия (InvMod в конечном поле). Это самая дорогая операция в EC-арифметике (грубо в 100 раз дороже умножения). VanitySearch и все последующие убирают эту цену через массовую инверсию — отсюда и пятикратное отставание BitCrack.

VanitySearch — массовая инверсия Монтгомери

Здесь нужно отдельно сказать спасибо Жан-Люку Понсу (JeanLucPons на GitHub). Его проект VanitySearch 2019 года — это, без преувеличения, фундамент всей современной ниши. По моим оценкам, больше 90% всех CPU- и GPU-программ для перебора приватных ключей так или иначе содержат куски его C+±кода: классы Int, IntGroup, IntMod, Point, SECP256K1, файлы Random.cpp, Timer.cpp, GMP-обёртки, базовые PTX-макросы для 256-битной арифметики. Это видно невооружённым глазом — открываешь репозиторий любого «нового» решателя, а внутри лежит копия этих файлов с минимальными правками. KeyHunt, KeyHunt-Cuda, KeyKiller, KeyScanner, частично Cyclone — все они стоят на плечах этого человека.

Ценность работы Понса не в одной идее, а в их сочетании: он принёс в нишу высокопроизводительный 256-битный класс Int с inline-asm для x86-64, батчи для обработки точек, принципы работы с памятью CUDA (__constant__, __ldg), компактную реализацию EC-арифметики над secp256k1 без зависимости от тяжёлого OpenSSL/libsecp256k1. И — главное изобретение, ставшее каноном для всех последователей: одна инверсия по модулю на батч из ~1024 точек.

Идея массовой инверсии: копим произведение разностей (x_i − x_target), делаем единственный InvMod от полного произведения, потом «раскручиваем» обратно, получая инверсию каждой разности по очереди. Эффективная стоимость самой дорогой операции в EC-арифметике падает до пары умножений на точку. Эту схему сейчас использует каждая CUDA-программа из обзора, кроме BitCrack — и каждая вторая CPU-программа.

То, что один человек проделал такую колоссальную работу и выложил её под свободной лицензией, — большое везение для всей индустрии. Без VanitySearch не было бы ни KeyHunt-Cuda, ни Cyclone, ни большинства проектов, которые мы здесь сравниваем.

KeyHunt — гибкость и BSGS

KeyHunt берёт код secp256k1 от Жан-Люка Понса, но накручивает поверх Bloom-фильтр (для проверки по большому списку адресов) и BSGS (для поиска по известному pubkey). Никаких AVX, никакой массовой инверсии в основных режимах перебора. Зато умеет: BTC + ETH, P2PKH + P2SH + bech32, файлы со списками целей. Сила этой программы в алгоритме BabyStep-GiantStep (работает с известными публичными ключами), в простом брутфорсе P2PKH она работает хорошо, но отстаёт от лидеров.

KeyHunt-Cuda и CUDACyclone — inline PTX

На первый взгляд — там C++ код, но если присмотреться, то многие макросы разворачиваются в inline PTX-ассемблер для 256-битной арифметики:

#define UADDO(c, a, b) asm volatile ("add.cc.u64 %0, %1, %2;" : "=l"(c) : "l"(a), "l"(b) : "memory");
#define UADDC(c, a, b) asm volatile ("addc.cc.u64 %0, %1, %2;" : "=l"(c) : "l"(a), "l"(b) : "memory");

CUDACyclone дополнительно реализует батчевую инверсию — тот же приём массовой инверсии Монтгомери, перенесённый в ядро. По умолчанию: батч в 128 точек.

Cyclone — AVX-2 интринсики для хешей

Cyclone использует __m256i напрямую: SHA-256 и RIPEMD-160 для 8 параллельных потоков сжимаются в одно 256-битное регистр-поле. Файлы sha256_avx2.cpp и ripemd160_avx2.cpp — почти учебник по SIMD-хешированию:

#define Maj(x, y, z) _mm256_or_si256(_mm256_and_si256(x, y), _mm256_and_si256(z, _mm256_or_si256(x, y)))
#define Ch(x, y, z)  _mm256_xor_si256(_mm256_and_si256(x, y), _mm256_andnot_si256(x, z))
#define ROR(x, n)    _mm256_or_si256(_mm256_srli_epi32(x, n), _mm256_slli_epi32(x, 32 - n))

Модулярная арифметика — на стандартных C+±операторах + наработки Жана-Люка. Есть отдельный AVX-512-вариант для процессоров с поддержкой AVX-512.

ecloop — компиляторные builtin’ы + AVX2

ecloop сознательно отказался от inline-ассемблера, но взял AVX2-интринсики. 256-битная арифметика — через GCC/Clang-builtin’ы:

__builtin_addcll(x, y, carryin, &carryout)   // add-with-carry
__builtin_uaddll_overflow(x, y, &rs)         // overflow detection

Расчёт на то, что современный clang сам поднимет это в adc/adcx-инструкции (вместо ручного inline-asm).

Хеши — полноценный AVX2 и AVX-512 в lib/rmd160s.c: SHA-256 и RIPEMD-160 параллельно по 8 потоков через __m256i и т.п. Размер батча для инверсии — 2048 точек. Итог — 1.06× от Cyclone при компактном коде.

BtcMole — возможные оптимизации

С BtcMole сложнее — исходники закрыты, все суждения только по бинарникам. Что можно утверждать наверняка:

  • Аппаратная поддержка x86-64 + ARM64 — обычно достигается компиляторными SIMD-интринсиками (__m256i/__m512i под Intel, vqaddq_*/vmlal_* под NEON), либо отдельными asm-вставками для каждой архитектуры. Раз скорость на x86 опережает Cyclone, велика вероятность использования более подходящих интрисинков и ручных asm-вставок.

  • CUDA-сборка единая для sm_50…sm_120 — это Fat Binary с заранее скомпилированными .cubin-ами. Внутри почти наверняка inline PTX (как у конкурентов) или даже SASS (если автор пошёл дорогой Retired Coder).

  • AMDGPU-сборка покрывает GCN 3-4, CDNA, RDNA1-4

  • Массовая инверсия Монтгомери — с такой скоростью без неё нельзя; вопрос только в размере группы.

Fat Binary — почему некоторые программы такие большие

Технология Fat Binary в CUDA-мире — это упаковка нескольких прекомпилированных .cubin-ов под разные compute capabilities в один исполняемый файл, плюс PTX-код для архитектур, для которых нет предкомпилированного ядра. Преимущество: один бинарник работает «и на 1080Ti, и на RTX 4090, и на новых Blackwell без перекомпиляции». Недостаток — размер.

Программа

Размер бинарника

Архитектуры в FatBin

KeyHunt-Cuda

~1.5 МБ

одна (выбирается через make ccap=86)

CUDACyclone

~2.6 МБ

три (sm_75, sm_86, sm_89)

BtcMole (GPU)

~16 МБ

11 NVIDIA + ~10 AMD

CycloneCUDA и BtcMole заработали без всяких патчей. KeyHunt-Cuda требует ручной сборки под целевую архитектуру (make ccap=89) — для пользователя без NVCC это барьер.

Сводка по стеку оптимизаций

Программа

Mass-inverse

Inline asm

SIMD-хеши

Fat Binary

Особое

BitCrack

VanitySearch

✅ (родоначальник)

PTX

KeyHunt

в спец-режимах

BSGS, Bloom

KeyHunt-Cuda

PTX

Cyclone

AVX2/512

n/a

ecloop

✅ (2048)

builtin’ы

AVX2

n/a

компактность

CUDACyclone

✅ (один-на-батч)

PTX

✅ (3 arch)

настраиваемые параметры запуска

BtcMole

предположительно да

предположительно да

✅ (~20 arch)

мульти-платформа CPU+CUDA+AMDGPU

Двигаемся к потолку производительности

Retired Coder и проект RCAsm

Разработчик под ником Retired Coder (RC) известен как автор серии быстрых решателей биткойн-головоломок по алгоритму кенгуру Полларда. На днях он опубликовал проект RCAsm — DSL-обёртку над cuAssembler для написания CUDA-ядер прямо на уровне SASS, без участия PTX и nvcc.

Зачем это нужно? Цитирую RC из README:

PTX is not powerful enough: 1. You still cannot control registers usage. 2. PTX does not provide all instructions, some of them can be really important. 3. There is no way to declare fast functions. 4. There is no way to use uniform registers and instructions directly. 5. There is no way to specify control codes. 6. There is no good management for carry flags. 7. You have to check what SASS is generated every time.

PTX — это промежуточное представление, которое NVIDIA-компилятор ptxas потом транслирует в реальный машинный код для GPU (SASS). На многих этапах ptxas принимает решения «за разработчика» в ущерб эффективности.

RCAsm обходит это, давая прямой доступ к SASS ценой головной боли — синтаксис SASS намного ужаснее обычного ассемблера.

Под капотом — модифицированный cuAssembler и Python-обёртка. Требуется CUDA v12.8 (другие версии не поддерживаются).

Работает хакерским образом — вначале пишется обычное ядро, компилируется, а потом патчится.

Это и есть последнее слово индустрии для перебора приватных ключей. Если кто-то решит побить рекорды Retired Coder (19 Mkey/s на 5090 в алгоритме кенгуру Полларда), наверное, ему придётся идти тем же путём.

Команды для индивидуального поиска

Если хочется попробовать всё-таки вскрыть нерешённую головоломку — это для тех, кто верит в удачу или у кого куча собственного железа (см. ниже про математику лотереи). Команды ниже — для головоломки № 71 (BTC-адрес 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU, диапазон 2^70..2^71-1). Подставьте свой кошелёк/диапазон по аналогии для других номеров.

CPU

# Cyclone (AVX2)
./Cyclone -t 24 -r 400000000000000000:7fffffffffffffffff \
  -a 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU

# ecloop — режим mul (умножение точек)
./ecloop mul -t 24 -f target.h160 \
  -r 400000000000000000:7fffffffffffffffff

# keyhunt — последовательный режим по адресу
./keyhunt -m address -t 24 -l c \
  -r 400000000000000000:7fffffffffffffffff \
  -a 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU

# BtcMole — единый бинарник для всех устройств
./bm bf -pz 71 +cpu              # только CPU
./bm bf -pz 71 +cpu:50%          # 50% ядер
./bm bf --address 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU \
        --range 400000000000000000:7fffffffffffffffff +cpu

CUDA

CUDACyclone

./CUDACyclone --address 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU \
  --range 400000000000000000:7fffffffffffffffff \
  --grid 128,8 --slices 64

KeyHunt-Cuda

./KeyHunt -t 0 -g --gpui 0 --gpux 256,256 \
  -m address -l c \
  -r 400000000000000000:7fffffffffffffffff \
  1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU

KeyKiller-Cuda — принимает только размер диапазона в битах

./kk -r 71 -a 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU

KeyScanner

./keyscanner -a 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU \
  -r 400000000000000000:7fffffffffffffffff

BitCrack (CUDA)

./cuBitCrack --keyspace 400000000000000000:7fffffffffffffffff \
  -o found.txt 1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU

BtcMole — CUDA с тонкой настройкой числа SM

./bm bf -pz 71 -cpu +cuda            # все SM
./bm bf -pz 71 -cpu +cuda:30,40      # 30 SM на карте 0, 40 на карте 1

AMDGPU

BtcMole — единственный реально работающий вариант на картах AMD.

./bm bf -pz 71 -cpu -cuda +amdgpu
# Оставляем 20% GPU для интерфейса и роликов
./bm bf -pz 71 -cpu -cuda +amdgpu:80%

Сохранение прогресса между рестартами

После проверки CLI каждой программы и кода — поддержка чек-поинтов есть у большего числа проектов, чем казалось:

Программа

Сохраняет прогресс с возможностью продолжения

Как включить

BitCrack

да

--continue FILE

BtcMole

да, для каждого устройства при диапазонах размером в 2^40 ключей и выше

автоматически подхватывается

Cyclone (CPU)

пишет log в progress.txt каждые 5 мин, ручное возобновление

KeyKiller-Cuda

да (только в range-режиме, не в random)

флаг -b («backup mode»)

KeyScanner

да (только в range-режиме)

-n N — чек-поинт каждые N минут

KeyHunt (CPU)

нет

KeyHunt-Cuda

нет

CUDACyclone

нет

ecloop

нет

Вероятность открытия головоломки

Если у вас нет сотен видеокарт, то вскрытие нерешённой головоломки (№ 71, 72, …) — это лотерея. Победит либо тот, кто сильно раньше начал, либо тот, у кого больше железок.

Поясню масштаб. Размер диапазона головоломки № 71 — 2^70 ≈ 1.18 × 10^21 ключей. Производительность одной CMP 90HX в btcmole-cuda ≈ 1950 Mkeys/s (среднее по нашему бенчу). Одной картой полный перебор 50% интервала займёт 9 599 лет. То есть если вы 1 год перебираете, то у вас примерно 1 шанс из 19 000, что именно вы вскроете головоломку. Это выше, чем сорвать джекпот в лотерею, но всё равно мало.

Заключение

Победители:

  • Среди программ с открытым кодом:

    • На CPU — ecloop (1.06× относительно Cyclone). Cyclone почти не уступает (1.00×).

    • На CUDA — KeyHunt-Cuda (1.01×) с минимальным отрывом от CUDACyclone (1.00×); фактически паритет.

  • Среди всех программ (включая закрытый код):

    • На CPU — btcmole (1.32× относительно Cyclone).

    • На CUDA — btcmole (1.46× относительно CUDACyclone).

    • На AMD GPU — btcmole (единственный, кто работает; остальные либо не пытались поддержать AMD, либо не работают на свежем ROCm).

Конкретные источники преимущества BtcMole проверить нельзя — код закрыт. Но судя по поведению, набор приёмов мало отличается от лидеров с открытым кодом: массовая инверсия Монтгомери, низкоуровневая работа с флагами переноса, толстый Fat Binary под все актуальные железки.

Про внутренние «попугаи». В целом, к моему удивлению, заявленные авторами цифры более или менее соответствуют реальности — относительный расклад программ на «их» Mkey/s примерно совпадает с тем, что показывает наш честный wall-clock-бенчмарк. Единственное яркое исключение — KeyKiller-Cuda: там внутренний счётчик завышал результат раза в полтора (учитывалось только GPU-время, без CPU-составляющей), и без патча программа выглядела бы намного сильнее, чем есть. У CUDACyclone цифры в Mkey/s заметно «пляшут» от запуска к запуску, но среднее всё равно близко к реальной скорости. Так что общее правило «не верьте экранным цифрам» сохраняется, но конкретно у этих авторов — без злого умысла.

Индустрия не стоит на месте. Retired Coder (человек решивший 120, 125 и 130 головоломки) уже показал, что чистый SASS даёт ещё 15-25 процентов по сравнению с PTX. Правда, по его словам, программироание на SASS несёт серьёзные риски потери психического здоровья.

Про пулы. На базе почти каждой программы из списка есть свой пул для совместного перебора. Я не буду брать на себя ответственность кого-то рекомендовать: основатели пулов, как правило, анонимны, проверить их репутацию невозможно, гарантий выплаты вашей доли в случае находки нет.

Я прошу прощения у авторов непротестированных программ — я протестировал всё, что нашёл из поиска гугла и телеграм-чатов. Хотя, уверен, что есть масса авторов со своими самописными решениями, которые не попали в обзор.

Но комментарии открыты — напишите там о своих программах. Запускайте бенчмарк на своём железе со своими программами, пишите свои результаты.

В следующей части (она будет не ранее чем через месяц) мы будем рассматривать программы для решения 135-й и 140-й головоломок. Так что допиливайте ваш софт и присылайте ссылки в личку.

Всем цифровым кладоискателям — удачи!

© 2026 ООО «МТ ФИНАНС»