В суматохе последних дней, связанной с кризисами в разных концах света - Европе и Китае, мы уже начали забывать о технических проблемах в сети Bitcoin. В самом деле, когда вся Европа наблюдает за саммитом по Греции, валятся китайские акции, а курс Биткоина за несколько дней растет и падает на десятки долларов - очереди транзакций и работа программистов отходят на второй план.

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

Упорству неизвестного спамера можно позавидовать - уже с 10 июля размер очереди стабилизировался в диапазоне 12-20 тысяч транзакций, но он продолжает упорно рассыпать по сети свою "пыль".  Она причиняет некоторые неудобства, возможно даже заставляет кого-то чихать, но большая часть пользователей уже не обращает на нее внимания.

Между тем, разработчики ядра Биткоина не сидели без дела и прошлой ночью выпустили большое обновление - версию Bitcoin Core 0.11.0. В свете последних событий она очень актуальна, так как большая часть изменений направлена именно на борьбу со спамом и оптимизацию хранения блокчейна, чего пользователи ждали уже давно. Из-за постоянного роста базы данных количество полных узлов в сети начало сокращаться, а без них обеспечение децентрализации невозможно. Способ на данный момент придуман достаточно странный, но его возможно доработать.

Скачать новую версию можно на официальном сайте Bitcoin.org. Версия 0.11.0 обратно совместима с версиями 0.10.*, тогда как перейти на более старые без повторной загрузки блокчейна уже невозможно из-за изменения механизма синхронизации блоков.

Так как я давно не запускал свой кошелек и еще не проверял новой параллельной загрузки, то решил удалить свою копию блокчейна и закачать ее "с чистого листа". Новый кошелек быстро установился и запустился. Закачка нового блокчейна стартовала через минуту и пошла достаточно резво, по сравнению со старыми версиями, поедая дисковое пространство со скоростью нескольких десятков мегабайт в минуту. 

Запуск кошелька

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

Экран отправки транзакций

Но невидимые для пользователя компоненты клиента изменились еще более значительно. Итак, традиционный список главных изменений:

  1. Защита от "спама транзакций" (transaction flooding): 

    a) Для мониторинга использования памяти кошельком введена команда для вывода информации по mempool - массиву неподтвержденных транзакций. Это команда getmempoolinfo.

    б) Появилась возможность фильтровать ретрансляцию транзакций вашим узлом по минимально заложенному объему комиссии. По умолчанию установлено значение в 1000 сатоши (0.00001 BTC). Его можно поменять с помощью команды minrelaytxfee. Транзакции с комиссией меньше заданного значения, будут отвергаться кошельком и не будут ретранслироваться другим узлам.

    в) Еще одна команда позволяет задать количество бесплатных транзакций, которое клиент будет размещать в mempool, а при майнинге включать в блок. Это команда limitfreerelay, по умолчанию стоит значение 15.

    Эти значения можно задавать и в файле bitcoin.conf. Более существенные меры для борьбы со спамом обещаны в следующем релизе.

  2. Обрезка файла блоков (Block file pruning). База данных блокчейна состоит из четырех основных компонентов: базы неистраченных выходов (UTXO), индекса блоков, данных отката (undo) и "сырых блоков" (raw blocks), полученных по сети.

    "Обрезка" позволяет удалять два последних компонента, как только они были использованы и внесены в индекс. Пользователь может задать вручную размер накапливаемых данных. Минимальное значение - 550 Мб. Оно задано из расчета, что кошелек сможет хранить в "сыром" виде не меньше 288 блоков - то есть примерно за двое суток. Если отведенное место заполнено, более старые блоки удаляются.

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

  3. Другие важные изменения:

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

    б) Улучшен механизм расчета комиссии и отбора транзакций для включения в блок.

    в) Возможность отключения ретрансляции транзакций командой -walletbroadcast=0. Такой кошелек будет принимать транзакции, но не передавать их на другие. Передачу транзакций можно будет организовать с помощью отдельных скриптов, в том числе направлять их через Tor. Эта функция может пригодиться сторонникам максимальной анонимности.

    г) Также через Tor можно будет создавать и отдельные соединения, таким образом кошелек сможет работать в "сером" режиме - и в публичной, и в анонимной сети.

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