Bitcoin Core 0.13.0 разрабатывали около ста участников, что заняло у них примерно пять месяцев. В то время, как большая часть усилий разработчиков была сосредоточена на Segregated Witness, что потребует небольшого изменения ПО, Bitcoin Core 0.13.0 по сравнению с Bitcoin Core 0.12.0 имет дюжину важных новшеств. Приведём список наиболее существенных изменений.
«Ребёнок платит за родителя»
Число транзакций в сети биткоина долгое время постоянно росло. В результате растёт заполнение блоков, и майнерам приходится брать более высокие комиссии за то, чтобы включить транзакции в блоки. Транзакции, которые не имеют достаточных комиссий, включаются в блоки с опозданием или они могут вообще не войти в блок. Это оказалось существенной проблемой, особенно в период так называемых «стресс тестов» сети, когда пиковое количество транзакций привело к существенным задержкам в работе.
Отдельные пользователи могут решить данную проблему путём повышения комиссий за свои транзакции, что делает обработку их транзакций более приоритетной для майнеров. Это возможно осуществить, даже если транзакция уже отправлена, используя выборочную замену комиссии (Opt-in Replace-by-Fee, RBF); однако пока не многие программы кошельков поддерживают эту опцию. Кроме того, RBF является опцией, доступной только отправителю транзакции. До настоящего времени у получателя не было возможности доплатить комиссию за транзакцию, чтобы ускорить подтверждение сделки.
Данную проблему эффективно решает уловка под названием «Ребёнок платит за родителя» (Child Pays for Parent, CPFP). CPFP является набором правил, который используют майнеры для того, чтобы выбирать, какие именно транзакции включать в блок. При помощи CPFP, майнеры не обязательно выбирают самую выгодную и проверенную транзакцию, но могут выбрать наиболее выгодный для них набор транзакций. Другими словами: они могут выбрать транзакцию с низкой комиссией, если последующая транзакция, связанная с ней, предложит более высокую комиссию. Тогда майнеры включают обе транзакции одновременно.
На практике это значит, что получатель комиссии с низкой транзакцией может «приложить» транзакцию с высокой комиссией, потратив часть своих монет. В результате, получатель не будет долго ждать подтверждения сделки, а майнер сможет увеличить свои доходы.
Поддержка компактных блоков
Одноранговый протокол Биткоина в настоящее время несколько не эффективен. Узлы отправляют друг другу большинство данных транзакции дважды: один раз это транзакция, первоначально отправленная по сети и второй раз как часть блока, когда транзакция подтверждена.
У этого есть некоторые недостатки. Отправка данных транзакции дважды требует большего количества пропускной способности, чем это действительно нужно. Это повышает стоимость функционирования сети Биткоина. Во-вторых (что, возможно, ещё более важно) передача новых блоков нескольким узлам может вызывать пиковые перегрузки пропускной способности.
Но самое важное здесь то, что замедляется распространение блоков по сети. Медленное распространение блоков в свою очередь приводит к выживанию более крупных пулов, что делает майнинг биткоина в целом более централизованным.
Компактные блоки (BIP 152), которые разработал один из авторов Bitcoin Core и Blockstream Мэтт Коралло, предназначены для того, чтобы уменьшить избыточность передачи данных. Когда новый блок находится, узлы первоначально сообщают очень компактный хэш данных транзакции. Поскольку узлы уже получили полные данные по транзакции, когда их первоначально переслали по сети, они могут использовать эти хэши, чтобы выяснить, какие операции включены в блок и восстановить блок самостоятельно.
Конечно, эта уловка не является панацеей. Если узел не получил транзакцию перед тем, как получить хэш, узел не сможет выбрать транзакцию. К тому же, в некоторых случаях неправильная транзакция может дать правильный хэш, обманув узел, который поверит, что это правильная транзакция — пока не попытается восстановить блок и не увидит её ошибочность.
И в том, и в другом случае проблема не критична, поскольку узел всегда может уточнить нужные ему данные транзакции. Даже если в блок будет только несколько полных транзакций, компактные блоки передадутся по сети гораздо быстрее, и потребуют значительно меньшего количества пропускной способности.
Иерархическая детерминированная генерация ключей
До настоящего времени Bitcoin Core генерировало новую и абсолютно случайную пару с закрытым ключом и открытым ключом для каждого нового адреса биткоина. Это важно для безопасности и конфиденциальности, но представляет некоторые сложности для пользователей. Чтобы защитить все закрытые ключи от потери, они должны регулярно делать резервные копии.
Иерархическая детерминированная генерация ключей (Hierarchical Deterministic Key Generation) или BIP 32, является криптографическим приёмом, который был создан в 2012 и 2013 году разработчиками Bitcoin Core Грегори Максвеллом и доктором Питером Вуилли, а также специалистов по защите компьютерной информации Аланом Рейнером, который и предложил решение проблемы. С HD-генерацией ключей Bitcoin Core создаёт абсолютно новуюм пару ключей для каждого нового адреса, но все эти ключи получены из единственного ключа, доступ к которому даёт кодовая фраза из 12 слов. Пока пользователь помнит эту кодовую фразу, он может генерировать приватные ключи и иметь доступ ко всем своим средствам.
Нужно отметить, что HD-генерация ключей не является новой функцией в мире биткоина. Многие кошельки бумажников уже использовали данную опцию, которой уже несколько лет. Просто она никогда не существовала на уровне клиентской программы Биткоина. До сих пор.
Производительность & безопасность
Конечно же, Bitcoin Core 0.13.0 включает в себя внушительный список улучшений производительности и безопасности. Их полный список выходит за рамки данной статьи (смотрите примечания к релизу Bitcoin Core 0.13.0, чтобы узнать детали), но вкратце говоря…
Кэш-память базы данных была увеличена, что позволяет узлам ускорить проверку допустимости транзакции. Инструмент командной строки биткоина теперь позволяет пользователям вводить пароли и другую уязвимую информацию в интерактивном режиме с улучшенной безопасностью, не храня эту информацию в простом тексте.
Программное обеспечение получило обновление, позволяющее использовать C++ 11 и Python 3, новые версии языков программирования, которые допускают более мощные функции.
Исходники для ARM под Linux теперь входят в состав ядра, и пользователям больше не нужно компилировать их для себя. Данные, относительно которых транзакции в mempool полагаются друг на друга (как в случае с CPFP) могут передаваться внешним программам.
Узлы в сети могут запросить только транзакции, имеющие комиссию выше опредённого порога, что позволит предотвратить DoS атаки. И, наконец, внесено много низкоуровневых улучшений связи между узлами, вызова удаленной процедуры и протоколов системы обмена сообщениями (ZMQ).
Спасибо главному разработчику Bitcoin Core, Владимиру ван дер Лаану и директору Ciphrex Эрику Ломброзо за информацию и обратную связь.