Небольшой эксперимент с криптовалютами

Posted: 2016-05-08 in IT
Метки:,

Решил тут посмотреть на такую крайне необычную штуку, как криптовалюты. Если слова bitcoin, майнинг, блокчейн и им подобные вам интересны или знакомы — добро пожаловать в нашу избу-читальню.

Появление распределенных платёжных систем, основанных на строгой математике и криптографии — сама по себе вещь совершенно невероятная и фантастическая, хотя первые идеи бродили за много лет до релиза конечного продукта. Сейчас, когда прошло несколько лет, уже можно посмотреть на некоторые предварительные итоги столь во всех смыслах замечательного финансового эксперимента.
Я воспринимаю криптовалюты именно так — экспериментальное средство проведения взаиморасчетов, базирующееся на математике криптографии. Потребовалось совместить в одном проекте много изящных и необычных идей, чтобы это вообще начало работать.

Я не буду пересказывать историю создания и развития биткоина, а уж тем более его многочисленных форков или аналогов — про это и так уже вылито много воды. Также я не буду погружаться в дискуссии про законодательные статусы криптовалют или экономические определения — юристы и экономисты за прошедшие несколько лет так и не пришли к единому мнению, что же это такое — за многотысячелетнюю историю товарно-денежных отношений подобных систем никогда не было.

Поэтому я просто поставил соответствующий софт и посмотрел, что вообще там есть и получится ли обнаружить что-нибудь интересное.

Главная идея для использования криптовалют — понятие о ключах. Адресация переводов опирается на асимметричную криптографию ECDSA (эллиптические кривые), поэтому у каждого получателя/отправителя средств (монет/записей/расписок) должна быть как минимум одна пара ключей. Пары ключей связаны. Открытая часть пары (публичный ключ) является адресом получателя (аналогично номеру счёта в банке).
Этот номер можно опубликовать на сайте, если вам надо принимать биткойны в свой адрес. Также он позволяет любому посмотреть, сколько там средств (именно по этой ключевой паре) и пришла ли именно его транзакция. Парный открытому закрытый ключ (приватный) храниться должен даже с большей паранойей, чем ключи от PGP и SSH, поскольку он позволяет подписывать распоряжения об осуществлении транзакций. Чем-то он похож на банковский токен, который сам по себе внутри средств не хранит, но содержит секретные данные, позволяющие создавать криптографически подписанные распоряжения о списании средств в чью-либо пользу. Поэтому для обладателей сколь-нибудь существенных балансов очень важно хранить резервные копии ключей приватно, секурно и надёжно. Потеря ключа означает потерю всех средств, числящихся за этим ключом.

Процедура же генерации ключевой пары ECDSA настолько незатратна, что все коин-клиенты при первом запуске автоматически создают одну ключевую пару. Поэтому счёт в системе у вас оказывается создан сразу же, как только вы запустили соответствующий софт =). Что ещё важно — это нигде и никак не отразится ни в глобальной сети, ни в сетевом траффике, пока в отношении этого ключа (публичного, естественно) не появится хотя бы одна запись (транзакция в блоке). Количество возможных адресов совершенно чудовищно, и превышает число атомов в нашей галактике, поэтому даже проверок на уникальность не делается, как и в случае генерации ключей для PGP/SSH. Вероятность совпадения двух сгенерированных ключей — 1 к 10 в сотой с хером степени.

Многие открытые проекты принимают пожертвования в биткойнах, публикуя свой биткоин-адрес на сайте, например GIMP, Blender и OpenOffice.

Вот эти самые строчки:
1NVMCeoBfTAJQ1qwX2Dx1C8zkcRCQWwHBq
1LukukDPYyJQdDryapKrrknSjw3NL3brmm [ Blender ]
1BtjAzWGLyAavUkbw3QsyzzNDKdtPXk95D [ OpenOffice ]

собственно и являются адресами назначения (публичными ключами), аналогичными номерам счётов в банке. И это — всё, что вам необходимо знать для осуществления перевода в адрес соответствующего получателя. Тогда как потратить полученные на эти счета средства (то есть выписать распоряжения о дальнейшем движении поступивших средств) могут только обладатели парных им закрытых ключей из отделов развития соответствующих проектов.

Отсюда следует важнейшее свойство: данные о всех переводах открыты. Вообще всем, по всему миру и без ограничений. За исключением разве что не примкнувших к цивилизации островных туземцев и жителей КНДР.

Поэтому часто говорят, что биткоин не анонимен, а псевдонимен. Если удастся связать адрес ключа и конкретное лицо/компанию — то можно смело утверждать, что все остальные транзакции в отношении этого ключа почти 100% (за исключением случая кражи ключей) касаются данного лица/компании. Для ряда операций такое раскрытие может быть нежелательно, например, магазин может не захотеть публично разглашать величину индивидуально предоставленной скидки. Для этого программные коин-клиенты позволяют генерировать неограниченное количество ключевых пар («счетов») в рамках одного кошелька — вплоть до создания отдельно ключа под каждую транзакцию каждого из клиентов. Это позволяет очень существенно упростить автоматизацию процесса оплаты и последующий действий по регистрации платежа и прочих действий. Хотя для опенсурсных благотворительных пожертвований достаточно и одного адреса, так удобнее.

Для обычных пользователей может быть удобно создать несколько адресов получения по типам активности, например «оплата по фриланс-заказам», «пожертвования на проект-1», «возвраты средств из интернет-магазинов» и так далее. Число не лимитировано, вопрос только в удобстве. Важнейший момент — при создании нового адреса получения генерируется новый закрытый ключ (парный и математически связанный с новым адресом получения), и поэтому необходимо сразу же актуализировать резервные копии. Иначе при восстановлении из старого бэкапа, где нет новых ключей, ассоциированные с этими новыми ключами средства будут утрачены без малейших шансов на восстановление ( равносильно утере нескольких бумажных купюр из-за их падения в жерло вулкана 😀 ). Будет втройне обидно, если туда ещё придут какие-то средства, а что-либо с ними сделать без ключей будет невозможно.

Поэтому правильный и секурный бэкап — первоочередное, что должен сделать пользователь любых криптовалют. Тут нет банков, страхующих косяки — судьба счёта целиком и полностью в руках открывшего его пользователя. На 100%, без оговорок и ограничений. Да, это даёт огромную свободу, но и полную и неотчуждаемую единоличную ответственность за каждое распоряжение по своему аккаунту.

Для эксперимента я поставил три разных клиента — MultiBit для компьютера, и клиенты Bitcoin и DashCoin (раньше назывался DarkCoin) под мобильный телефон. Первым делом я снял дампы траффика после запуска эти клиентов. Логика работы там такая — клиент качает из пиринговой сети заголовки блоков, и применяет данные из тех, где есть транзакции в адрес принадлежащих клиенту ключей.
Сам траффик не обфусцирован, протоколы прекрасно идентифицируются, в wireshark есть даже стандартный фильтр:

bitcoin_traffic_dump

Как видим, сетевой протокол биткоин использует TCP-соединения на порт 8333, в передаваемых данных открытым текстом видны User-Agent биткоин-клиента и удалённой ноды, с которой было соединение. Парсер протокола bitcoin в Wireshark вполне качественный, поддерживается фильтрация по куче свойств.

У DASH (DarkCoin) TCP-соединения идут на порт 9999, и готового парсера у wireshark нет. Но сетевой протокол узнаваем:

darkcoin_traffic_dump

Качественная DPI-система со свежими прошивками и протокол-паками такой траффик должна различать на раз-два, так что труЪ-параноикам ещё есть где озадачиваться =)

Кстати, такой опрос соседей однозначно раскрывает факт использования криптовалютного клиента, но не позволяет узнать, есть ли приход средств и с какими именно аккаунтами связана данная сетевая активность. По данным некоторых исследователей, такая привязка может быть получена лишь при расходовании средств, то есть когда клиент отправляет пирам подписанную своим ключом новую транзакцию — в этом случае IP-адрес может быть сопоставлен с адресом койн-аккаунта. И как назло, опции «указать Socks-прокси» в клиенте нету.

Подобные данные из дампа траффика клиент выкачивает периодически, по мере появления в сети новых блоков. Если клиент давно не запускался — обработка накопившихся за это время блоков может занять заметно больше времени.

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

Самый простой и очевидный — воспользоваться обменником или биткоин-биржей, коих расплодилось немало. Обменники принимают кучу всего — от вебманей, киви и яндекс-денех до классического безнала по картам. Но этот путь а) слишком очевиден и скучен б) несколько рискован в плане мошенничества и засветки данных своей карты. Если вам нужно сколь-нибудь существенное количество криптовалюты без сложных заморочек, то обменники и биржи — ваш путь. Только сперва пробную транзакцию небольшую киньте, не рискуйте понапрасну.

Мне же для тестов приложений, дампов траффика и снятия скриншотов вполне достаточно нескольких самых минимальных платежей.
Оказывается, такая возможность приобщиться к крипто-движухе тоже есть — гуглим по фразе «bitcoin faucet». Идея в чем — есть специализированные сайты, крутящие рекламу. Заходим на них, логинимся (логин у большинства сделан просто указанием адреса кошелька) и решая капчи или играя в какую-нибудь незатейливую онлайн-игру, потихоньку копим на локальном счете малые количества сатоши (это одна стомиллионная часть криптовалютной монеты). Процесс можно ускорить, используя промежуточный агрегатор нано-платежей FaucetBOX.com и сайты, сразу выводящие туда средства. Другие сайты такого типа требуют сперва собрать некоторое более-менее заметное количество сатоши (10-20 тысяч) и иногда — адрес почты для подтверждения вывода. Почту для таких непотребных безобразий лучше завести отдельную +)

Занятие совершенно монотонное, финансово мало-продуктивное и заниматься таким можно только после долгой медитации, зато сможете почувствовать себя настоящим индусом 😉 Зато никаких рисков для своей банковской карты или наличных денег.

Наковыряв минимально необходимое количество, делаем [WITHDRAW] — и через некоторое время (когда будут вычислены подтверждения транзакций) запущенный клиент отобразит новые значения баланса, а в списке переводов появится перевод в наш адрес:

btc_trans1__3

Запись появляется в клиенте, как только есть первое подтверждение сети, то есть вычислен первый красивый хэш, защищающий блок с вашей транзакцией. Свежая транзакция висит с особым статусом, показывающим, что подтверждений пока ещё мало.
Через некоторое время (несколько дополнительных подтверждений) транзакция будет окончательно зафиксирована в данном блоке и статус сменится:

btc_trans1__4

На мобильном клиенте всё тоже самое:

Bitcoin_Mobile_Client_satoshi_drips

Текущий баланс (в монетах и по фиатному курсу одной из бирж), список последних транзакций, QR-код с адресом аккаунта и пара кнопок для отправки монет или создания запроса на приём заданного количества.
В момент обнаружения транзакции в свой адрес мобильный клиент издаёт прикольный звук сыпящихся монет =)

Потыкавшись по так называемым «кранам», что мне быстро надоело, я решил попробовать самую волшебную фишку криптовалют — а именно майнинг. Тонкостей тут довольно много, и про это в интернетах написано весьма немало. У меня же как раз возникла параллельная задача потестить систему на стабильность под топовой CPU-нагрузкой, для чего майнинг — вполне годная идея, совмещающая приятное с полезным.

Пару слов, что это такое. Майнинг криптовалют — это такой поиск решения специализированной математической задачи, суть которой — найти красивый хэш от пачки ранее присланных, но ещё не подтвержденных транзакций и некоторого числа. Красота хэша определяется (если грубо) числом нулей в начале, а точнее — требованием, чтобы хэш был меньше некоторого заданного значения. Проблема в том, что нулей этих в начале просто до беса, а единственный способ поиска — старый-добрый брутфорс, то бишь тупой перебор миллиардов и триллиардов чисел, пока не удастся найти красивый хэш тупо по теории вероятностей. Майнинг прекрасно параллелится, но сами криптовалюты спроектированы таким образом, чтобы с ростом вычислительной мощности сложность вычислений поднимать динамически (в пределе получить значение хэша из одних нулей ещё никому ни разу не удалось), в итоге средняя скорость нахождения нового красивого блока остается более-менее постоянной. У биткоина — это один блок каждые 10 минут. На весь мир, ага.
Ну а чтобы этим хоть кто-то занимался — в дизайне системы заложено, что решивший задачку первым получит бонус в виде увеличения баланса на заранее указанном аккаунте.

Однако из-за использования легко реализуемой на специфическом железе функции SHA-256 целиком аппаратным способом хитроумные китайцы догадались проводить расчёты несоизмеримо быстрее, чем на любых суперкомпьютерах. В итоге сложность майнинга биткоинов стала совершенно заоблачной, и на CPU/GPU стало невозможно внести сколь-нибудь заметный вклад в общую вычислительную мощность. А без этого не получится замутить тестовую транзакцию. Короче, без специализированного железа делать там нечего, железо это весьма дорогое, едет из Китая месяцами, а устаревает быстрее, чем любое компьютерное железо.

Поэтому я обратил внимание на другую криптовалюту — DASH. Там используется гораздо более навороченная хэш-функция (точнее, целая пачка из 11 вложенных друг в друга хэшей), гораздо меньше сложность (в сравнении с биткоином) и я нашёл готовую инструкцию. Впрочем, меньше — это сугубо в сравнении с монструозной сложностью поиска биткойн. 12 нулей в начале хэша — весомый аргумент, чтобы майнить дарккойны в пуле, тем более, если цели сугубо тестовые.

Собираем, запускаем, естественно, указав свой адрес кошелька в командной строке, а не чей-то ещё =)
На утро свалилась целая пачка мелких транзакций:

DASH_Mobile_Client

Оно даже сработало =) По степени закрашенности зеленой метки видно, что более свежие транзакции имеют меньшее число подтверждений, а надёжно подтверждена только четвертая.

Так что эксперимент прошел удачно, технология работает, и несмотря на все катаклизмы, помирать похоже не собирается. Сложно сказать, как будут развиваться криптовалюты дальше, как в техническом, так и экономико-правовом плане. В любом случае, штука получилась прелюбопытнейшая.

Всем всего наилучшего.

Реклама
- комментарии
  1. Вера:

    Биткоин это отлично + вывод на кошелек

  2. Макс:

    Уже есть куча обменников, которые позволяют вывести криптовалюты на нашу карту через несколько минут, вот вспомнил сайт http://xchange.cc

  3. Amin:

    С интернет-обменниками есть проблема доверия. Вот скажем возьмём тот же xchange.cc

    Это кто вообще ? Доверять-то им можно ?
    Вот я как-то на таком сайте очкую данные банковской карты вводить =)

    + неизвестно, как они хранят логи, и покупка коинов в любом подобном обменнике оставит в логах и статистике связь вида данные_карты (полные ФИО) номер_биткоин_аккаунта.
    Надо быть очень и очень аккуратным, пользуясь подобными сервисами, случаи кидалова встречались, а проверить особо и никак — разве что кидать малыми порциями / делать тестовые транзакции / читать отзывы.

    Почему и пишу — финансовый эксперимент. =)