Недавно представленный релиз программного обеспечения Bitcoin Core 0.16.0 внес вклад в снижение комиссий и облегчение блокчейна, существенно упростив создание SegWit-кошельков и повысив количество SegWit-транзакций. Следующая версия ПО, выход которой намечен на 2019 год, изменит один из основообразующих механизмов биткоин-транзакций — алгоритм селекции монет.

Чтобы понять принцип его работы, можно представить биткоин-транзакцию как процесс оплаты наличными, при котором вы расплачиваетесь купюрой в $10 за вещь стоимостью $7 и получаете $3 сдачи. Биткоин-кошелек, хранящий, к примеру, 2 биткоина, содержит не две отдельных монеты, а так называемые «неизрасходованные выходы транзакций» (UTXO) — «остатки» предшествующих отправленных или полученных транзакций, которые могут представлять сумму 0.1 BTC, 0.3 BTC, 0.1 BTC, 0.5 BTC, 0.2 BTC, 0.4 BTC, 0.3 BTC и 0.1 BTC или любую другую комбинацию подобных (и еще более мелких) составных частей. Углубляясь дальше, эти записи не содержатся на каком-то конкретном адресе или кошельке, но разбросаны среди множества транзакций и блоков. Кошелек вычисляет баланс пользователя путем сканирования блокчейна и нахождения всех UTXO, принадлежащих этому пользователю. То есть каждая биткоин-транзакция состоит из различных более мелких сумм биткоина, и если нужно отправить 0.2 BTC, алгоритм селекции монет в Bitcoin Core может направить отрезок данных, хранящий 0.3 BTC, во «вход транзакции» (input — запись о том, с какого адреса биткоины получены) и создать два выхода (output — на какой адрес биткоины отправлены): 0.2 BTC будут направлены получателю, а 0.1 BTC вернется на кошелек в качестве «сдачи».

Таким образом, алгоритм селекции монет определяет, какие биты данных объединяются в одну транзакцию. По мнению разработчиков, эта функция работает несовершенно, что приводит к лишним комиссиям и загромождению пространства блоков записями о не всегда нужной сдаче. «Оригинальный алгоритм селекции монет в Bitcoin Core нуждается в значительной переработке, особенно в отношении транзакционных сборов. Он неэффективен и в итоге делает странный цикл вычислений, пытаясь угадать сумму необходимого сбора», — рассказал разработчик Bitcoin Core Эндрю Чау. Марк Эрхардт, разработчик кошелька BitGo, называет текущий принцип селекции монет «запутанным». Он не всегда принимает оптимальное решение относительно того, какие записи данных (какие «части монет») выбирать для транзакции. Как пояснил Эрхардт, сегодняшний алгоритм почти всегда автоматически создает «выходы для сдачи», которые могут быть не нужны и, таким образом, просто тратит пространство блоков. К примеру, для того чтобы передать те же 0.2 BTC, можно было использовать два отрезка данных, каждый из которых хранит по 0.1 BTC. «Никто не хочет, чтобы тразакции измельчались до пыли», — говорит Эрхардт, понимая под «пылью» такие части биткоина, которые уже невыгодно тратить, поскольку транзакционный сбор превышает их стоимость.

Новый алгоритм «ветвей и границ» (BnB) группирует данные более эффективно и экономично как в плане масштабируемости, так и в плане сборов. Предложения по оптимизации старой системы внес Эрхардт еще два года назад, а Чау стал автором кода. «Это позволит нам навести порядок в коде селекции и сделать возможным, чтобы каждый точно понимал, что делает алгоритм селекции монет», — говорит Чау. Алгоритм BnB призван по возможности избегать необходимости в сдаче. Он прорабатывает все входы, пытаясь найти среди них ровно такое количество биткоинов, какое пользователь хочет потратить.

«Это помогает сократить количество неизрасходованных выходов. Кроме того, транзакции, для которых было подобрано точное количество биткоинов, будут в целом занимать меньше места, чем те, в которых предусмотрена сдача, потому это также снизит транзакционные сборы и освободит несколько байтов в пространстве блока, куда можно будет записать еще несколько транзакций», — отмечает Чау. В ходе тестирования Эрхардт обнаружил, что новый код «облегчил» примерно 40% транзакций, которые при старой системе имели бы выходы для сдачи.

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

Эрхардт рассказывает, что работа над новым алгоритмом велась несколько лет, поскольку селекция монет — «чувствительная часть» кода, изменение которой будет иметь «глобальные последствия». «К настоящему моменту мы заложили прочный фундамент для дальнейших изменений», — сказал Эрхардт.