Адреса Bitcoin. Часть I, теория.
Адреса Bitcoin. Часть II, практика.
В предыдущей части статьи мы подробно рассмотрели по каким правилам генерируется Bitcoin адреса, теперь перейдем к практическим занятиям. В этой части мы научимся практическим приемам генерации адресов и закрытых ключей к ним с помощью утилиты Vanitygen и интеграции их в существующий кошелек.
Описанные действия производились под Windows 7 64bit. Первым делом качаем кошелек Bitcoin, лучше всего в .zip версии. Распаковываем, я это сделал в корень диска C :\
Создаем в этой папке папку key, где будем хранить ключи. Настройка ACL на папки на совести пользователя, рекомендую про них не забывать, если это боевой кошелек. В данном случае это был экспериментальный, и настройки прав доступа я не трогал. Создаем файл run.cmd с следующим содержанием:
Запускаем run.cmd, и пока скачиваются блоки, изучим вопрос создания адресов.
Vanitygen – утилита, работающая через командную строку, которая способна генерировать биткоин адреса. Если вам надоели рандомные криптоадреса, которые генерируются биткоин клиентами, вы можете использовать Vanitygen для создания более персонализированных адресов. Можно повысить свою уникальность, когда вы говорите человеку, чтобы он отправил вам биткоины на кошелек, который как-либо ассоциируется с вами, например для сайта BTCsec.com можно сделать адрес, который начинается на 1BTCSEC*. Кроме того, Vanitygen может использоваться для генерации случайных адресов в offline.
Vanitygen принимает в качестве входных данных шаблон или список шаблонов, после чего он подбирает варианты адресов и закрытых ключей к ним. Подбор Vanitygen основан на вероятностном поиске, на который требуется некоторое время. Время зависит от сложности заданного шаблона, скорости вашего компьютера и вашей удачливости. Vanitygen использует ресурсы вашего процессора. А его собрат – oclvanitygen – использует OpenCL-совместимые GPU. Они оба могут быть cобраны из исходников, или скачаны в виде бинарных пакетов, в том числе для Windows.
Скачиваем архив Vanitygen, распаковываем. Я для примера распаковал в корень диска C:
Заходим в папку, создаем файл gen.cmd с следующим содержанием:
Подробную расшифровку ключей и FAQ по Vanitygen можно найти ниже, пока разберем только этот пример:
oclvanitygen.exe - Используем версию генератора для OpenCL устройств
-p 0 -d 1 - Указание устройства, на котором производится расчет: платформа 0 устройство 1
-o result.txt - Сохранить результаты работы в файл result.txt
1BTCSEC - начало искомого адреса.
Стоит сразу отметить, что в искомой строке нельзя использовать 0 (ноль), O (большое o), I (большое i), l (маленькое L), и он должен начинаться с 1(единицы).
Запускаем gen.cmd:
В процессе работы программа покажет сложность нахождения адреса по указанному шаблону, скорость генерации и вероятностное ожидание. После нахождения ключа окно закроется, а в файле result.txt будет примерно такой результат:
Address: 1BTCSECzALEjhEjCBRiDWnm8icb5sjt5Rx
Privkey: 5JfxV8BAMT5CkQEEcTmZoRvNv7e6jyJpv1WFLuBDG8gHtc5L5TE
Отлично, у нас есть адрес и приватный ключ! Чтобы было интереснее продолжать, я отправил 0,01 BTC на этот адрес. Теперь задача импортировать этот адрес с ключом в кошелек и убедиться в его работоспособности.
Предположим, что клиент все блоки докачал, а кошелек зашифрован, пароль "yourpassphrase". Открываем клиент, в верхнем меню нажимаем "Help", в нем "Debug window" и переходим на вкладку "Console". В нижнюю строку вводим:
Эта команда разблокирует кошелек на указанное количество секунд, в данном примере - на 2 минуты.
Эта команда непосредственно импортирует наш свежеполученный ключ в кошелек. Стоит обратить внимание, что может показаться, что клиент завис. На самом деле это не так, он проверяет базу, и это может занять довольно длительное время.
Если все прошло успешно, и все блоки скачаны, то на вкладке транзакций отобразится наша транзакция поступления 0,01 BTC, на которую, кстати, увеличится и итоговый баланс кошелька.
Для окончательной проверки, что мы можем управлять средствами на этом адресе, отправим эти же 0,01 BTC на другой адрес, для примера я отправил их на адрес для добровольных пожертвований на развитие BTCsec.com - 1BQ9qza7fn9snSCyJQB3ZcN46biBtkt4ee
Как видно, транзакция прошла, эксперимент можно считать успешно завершенным.
FAQ по Vanitygen:
Какие типы шаблонов адреса можно давать vanitygen для соответствующего подбора?
Как я могу указать список шаблонов?
Могу ли я использовать Vanitygen для поиска чьего-то еще закрытого ключа зная его bitcoin адрес?
Как я могу собрать vanitygen из исходников?
Какую скорость поиска ключей я могу ожидать от устройства X?
Как защитить адрес, генерируемый данной программой? Может ли кто-то разгадать мой закрытый ключ и украсть мои BTC?
Какие опции можно задавать ключами Vanitygen?
Можно ли совместно искать адреса?
Какая вероятность нахождения нужного адреса?
Какие типы шаблонов адреса можно давать vanitygen для соответствующего подбора?
Vanitygen может делать подборку для простых префиксов и регулярных выражений. Префиксом является строчка, с которой начинается адрес. Когда подбирается адрес с установленным префиксом, Vanitygen проверяет, что такой префикс в принципе возможен и выдаст оценку сложности такого подбора. По умолчанию, префикс чувствителен к регистру, однако можно использовать ключик –i для поиска без учета регистра. Регулярные выражения представляют собой фильтрующие шаблоны. Они очень мощны и могут использоваться для подбора соответствующих префиксов, суффиксов, ключей различной длины и подбора последовательностей символов, и т.д. Чтобы использовать регулярные выражения, укажите ключ –r. К сожалению, подбор по регулярным выражениям очень медленный и сложность сильно влияет на скорость поиска ключей. Поэтому регулярные выражения следует использовать только если это действительно требуется. Регулярные выражения не будут эффективно отрабатывать с oclvanitygen, так как на настоящий момент oclvanitygen не может работать с регулярными выражениями на GPU.
Как я могу указать список шаблонов?
Vanitygen может искать по списку шаблонов из командной строки или взятых из файла, используя ключ –f. Файл источник должен быть сформирован так, чтобы каждый шаблон шел с новой строки. Найдя соответствие заданному шаблону, vanitygen остановит поиск других соответствий данному шаблону. Для поиска нескольких соответствий используйте ключ –k.
Могу ли я использовать Vanitygen для поиска чьего-то еще закрытого ключа зная его bitcoin адрес?
Конечно! Фактически, Vanitygen – это приложение для подбора ключей. Однако, чтобы найти полностью соответствующий bitcoin адрес, даже используя все компьютертные мощности на планете, вам понадобится неприемлемо большое количество времени.
Как я могу собрать vanitygen из исходников?
Все это указано в файле INSTALL в дистрибутиве исходника.
Какую скорость поиска ключей я могу ожидать от устройства X?
Некоторые приблизительные оценки:
Dual-core desktop CPUs, 32-bit mode: 100-250 тыс. ключей/сек.Dual-core desktop CPUs, 64-bit mode: 150-450 тыс. ключей/сек
Quad-core desktop CPUs, 32-bit mode: 200-400 тыс. ключей/сек
Quad-core desktop CPUs, 64-bit mode: 300-750 тыс. ключей/сек
NVIDIA GT200 GPUs: до 6.5 млн. ключей/сек
AMD Radeon 58XX, 68XX GPUs: до 23.5 млн. ключей/сек.
AMD Radeon 69XX GPUs: до 19.5 млн. ключей/сек.
vanitygen выполняет множество крупных целочисленных арифметических операций, и запуск утилиты на 64 битной системе дает существенное увеличение в скорости поиска ключей, приблизительно 50% увеличения по сравнению с 32-х битной. Для 64-х битной версии Windows, при условии, что используется не GPU, не забудьте использовать vanitygen64.exe.
Radeon 58XX превосходит Radeon 69XX. Oclvanitygen использует умножение целых чисел, а Radeon 58XX производит умножение параллельно с другими оперциями. За одинаковое время Radeon 5830 превзойдет Radeon 6970.
В пользовательских сборках производительность CPU будет меньше ожидаемой, если OpenSSL библиотеки старой версии (<1.0.0d) либо не собирались с включённой оптимизацией.
Как защитить адрес, генерируемый данной программой? Может ли кто-то разгадать мой закрытый ключ и украсть мои BTC?
Vanitygen использует OpenSSL для генерации случайных чисел. Это такой же RNG (генератор случайных чисел), как и используемый в bitcoin и большинстве серверов, использующих HTTPS. Они рассматриваются как хорошо изученные. В Linux RNG берутся из /dev/urandom. Отгадывание приватного ключа для адреса подобранного vanitygen не проще, чем отгадывание приватного ключа, сгенерированного самим приложением bitcoin. Vanitygen использует генератор случайных чисел для создания закрытого ключа и адресов, сравнивая полученные адреса с исходным шаблоном. Он обновляет закрытый ключ после 10,000,000 неудачных попыток подбора (100M для oclvanitygen), или пока не найдется соответствие
Какие опции можно задавать ключами Vanitygen?
-v Verbose output -q Quiet output -i Case-insensitive prefix search -k Keep pattern and continue search after finding a match -N Generate namecoin address -T Generate bitcoin testnet address -X <vеrsion> Generate address with the given version -e Encrypt private keys, prompt for password -E <pаssword> Encrypt private keys with <pаssword> (UNSAFE) -p <platform> Select OpenCL platform -d <device> Select OpenCL device -D <devstr> Use OpenCL device, identified by device string Form: <platform>:< devicenumber>[,<options>] Example: 0:0,grid=1024x1024 -S Safe mode, disable OpenCL loop unrolling optimizations -w <worksize> Set work items per thread in a work unit -t <threads> Set target thread count per multiprocessor -g <x>x<y> Set grid size -b <invsize> Set modular inverse ops per thread -V Enable kernel/OpenCL/hardware verification (SLOW) -f <filе> File containing list of patterns, one per line (Use "-" as the file name for stdin) -o <filе> Write pattern matches to < filе> -s <filе> Seed random number generator from < filе>
Можно ли совместно искать адреса?
Да, можно. Для этого существует vanitypool.
Какая вероятность нахождения нужного адреса?
- количество вариантов bitcoin адресов; | |
- количество не подходящих нам bitcoin адресов; | |
- вероятность не найти подходящий нам адрес; | |
- вероятность не найти подходящий нам адрес за х попыток; | |
- вероятность, что за х попыток требуемый адрес будет найден; | |
V - скорость поиска (ключей в секунду) T – время поиска. |
Возьмем вероятность нахождения 50% и посчитаем время, которое потребуется для этого.
Тогда:
Скорость генерации возьмем к примеру 2*107 ключей/с . Что равно примерно 6,3*1014 ключей в год.
= 1,6*1033 лет.