Джеймсон Лопп, разработчик Bitcoin Core, о том, как именно в протоколе Биткойна обеспечивается предсказуемый график эмиссии BTC.
Если вы посвятили изучению Биткойна больше пары минут, то, вероятно, уже в курсе, что объем предложения BTC предсказуем и ограничен 21 миллионом единиц. Строго говоря, лимит составляет 2.099.999.997.690.000 сатоши: на уровне протокола всё рассчитывается в наименьших единицах.
Но как именно определяется это ограничение и что мешает его нарушить?
Можно предположить, что это фундаментальное ограничение должно быть прописано в уайтпейпер Биткойна… Но его там нет, как и многих других важных аспектов протокола. Пуристам оригинального уайтпейпер Накамото стоит иметь в виду, что в нем не описываются, в частности:
Но прочесть уайтпейпер, конечно, важно всё равно. По ссылке доступны переводы на все основные языки мира и даже больше.
Возможно, кто-то из вас даже пытался найти явное определение лимита в реализации Bitcoin Core? Поиском по «21000000» в github-репозитории можно обнаружить определение константы MAX_MONEY, но это тоже не то.
Где же тогда прописан этот лимит эмиссии? Реализация его не так прямолинейна, как можно было бы подумать.
Содержание:
Неявное ограничение
A common misconception is that Bitcoin must regularly check that the money supply remains under 21 million.
In fact, there are 0 such explicit supply checks in Bitcoin Core. Why? It would be onerous to constantly sum 75+ million UTXOs. 21MM cap is implicit rather than explicit.
— Jameson Lopp (@lopp) October 12, 2021
@lopp: Распространено заблуждение о том, что Биткойн должен регулярно проверять, что общий объем его предложения остается ниже 21 миллиона монет.
На самом деле код Bitcoin Core содержит ровно 0 таких явных проверок предложения BTC. Почему? Постоянно суммировать более 75 млн UTXO было бы чрезвычайно ресурсозатратно. Поэтому ограничение в 21 млн BTC реализовано неявно.
Вместо проверки количества выпущенных биткойнов «на определенный момент времени», это ограничение следует рассматривать как геометрическую прогрессию, задающую скользящий верхний предел. В конце концов, нас на самом деле не особенно волнует, сколько именно существует биткойнов. Важно только, чтобы их было меньше определенного количества. Прогрессия, задающая нужную верхнюю границу, может быть описана следующим уравнением:
Это всё равно что сказать:
50 * 210000
+ 25 * 210000
+ 12,5 * 210000
…
+ 0,00000002 * 210000
+ 0,00000001 * 210000
= 20999999,9769
Реализации Биткойна контролируют объем новой эмиссии, проверяя, что каждый блок не создает биткойнов больше разрешенной субсидии на блок. Эта строка кода суммирует общее значение выхода coinbase-транзакции (первой транзакции в блоке, единственной, в которой разрешается создание новых монет).
Вы можете заметить, что к разрешенной субсидии на блок здесь прибавляется также сумма комиссий за транзакции в блоке. Почему? Потому что эти комиссии не являются новыми биткойнами: они уже существовали и выплачиваются майнеру отправителями транзакций. Равно корректно было бы проверять, что выход coinbase-транзакции за вычетом комиссий за транзакции в блоке меньше или равен разрешенной субсидии на блок.
Как определяется кривая эмиссии в протоколе Биткойна? Всего пятью строками кода, две из которых предназначены для покрытия пограничных случаев и будут срабатывать только при высоте блока от 13 440 000 и более, то есть примерно с 2265 года. О логике, лежащей в основе этой проверки на строке 1157, можно прочесть в BIP-042.
Для любой заданной высоты блока можно легко рассчитать положение этого блока на кривой эмиссии / в геометрической прогрессии. Всё, что для этого нужно знать, это сколько произошло халвингов (строка 1155), а затем разделить первоначальную сумму субсидии (50 BTC) надвое соответствующее количество раз, что и выполняется в операции битового сдвига на строке 1162.
Помимо субсидии на блок, необходимо также предотвратить непреднамеренную инфляцию предложения в остальных транзакциях, помимо coinbase.
Первый способ обеспечить такую проверку — это убедиться, что входы каждой транзакции действительно существуют и могут расходоваться. В Bitcoin Core соответствующую проверку можно найти в функции CheckTxInputs.
Это, конечно, одна из самых фундаментальных проверок в протоколе Биткойна — предотвращение двойного расходования. Если бы одни и те же расчетные единицы можно было потратить дважды, это можно было бы использовать и для произвольного увеличения денежной массы.
Мы также выполняем проверку входов на неотрицательные значения и переполнение. Любой из этих случаев привел бы к созданию новых денег; в ранние дни Биткойна, кстати, был эпизод с переполнением, приведший именно к этому!
Еще одна важная проверка для каждой транзакции помимо coinbase — убедиться в том, что сумма выходов меньше или равна сумме входов, поскольку более высокое значение выходов будет означать, что новые расчетные единицы буквально создаются из ничего. Эта проверка выполняется той же функцией здесь.
Таковы критические проверки для предотвращения произвольного увеличения предложения BTC. Существуют еще дополнительные механизмы (регулировка сложности) для контроля скорости эмиссии с точки зрения человеческого времени. Интересующиеся могут обратиться к соответствующим статьям (англ.) автора: Bitcoin’s Timestamp Security и Bitcoin’s Block Time Variance.
Явная проверка
Как я уже говорил выше, суммировать общее предложение биткойнов всякий раз, когда мы хотим убедиться в соблюдении связанных с эмиссией правил протокола, было бы довольно ресурсозатратным решением. Однако более явную проверку выполнить возможно: достаточно просто суммировать значения всех непотраченных выходов транзакций (UTXO).
В Bitcoin Core предусмотрена удобная сервисная функция для аудита общей денежной массы. Называется gettxoutsetinfo.
По состоянию на 9 июля существует ~83,8 млн UTXO, так что выполнение этой операции может занять минуту или две в зависимости от оборудования, на котором запущена ваша нода.
Моя нода, поставляющая данные для statoshi.info, запускает эту функцию после каждого нового блока, который она обрабатывает. Возвращаемое функцией количество монет затем сохраняется базе данных и используется для построения этого графика.
Вот, собственно, и всё. Денежная масса Биткойна одновременно тривиально предсказуема и легко поддается проверке. И тысяча слов, которые вы сейчас прочитали, описывают всего дюжину строк кода.
FAQ
Есть еще несколько очень распространенных вопросов относительно денежной массы Биткойна.
Можно ли изменить ограничение эмиссии в 21 млн BTC?
Технически да, но на самом деле это вопрос скорее управления сетью и стимулов ее участников. Любой может изменить лимит в настройках собственного узла и начать применять новые правила. Сложная часть — это убедить остальных участников сети сделать то же самое. Интересующимся рекомендую следующие статьи:
Почему 21 миллион, а не ______?
Q: Why did Satoshi choose an upper limit of 21,000,000 BTC?
A: The limiting factor is the max value of a 64 bit integer (18,446,744,073,709,551,615) and 21,000,000 BTC is represented as 2,100,000,000,000,000 satoshis.https://t.co/lUo4fRn0yS pic.twitter.com/KbxSyesiNK— Jameson Lopp (@lopp) January 23, 2021
Вопрос: Почему Сатоши установил порог в 21 000 000 BTC?
Ответ: Ограничивающим фактором является максимальное значение 64-битного целого числа (18.446.744.073.709.551.615), а 21.000.000 BTC представляет собой 2.100.000.000.000.000 сатоши.
Что произойдет, когда будут «добыты» все 21 миллион биткойнов?
Майнеры получают не только новые биткойны, но и комиссии за транзакции. Субсидия на блок (block subsidy) получила свое название не просто так: выпуск новых монет предназначен только для того, чтобы помочь запустить систему, пока объем транзакций невелик. Рост распространения и принятия Биткойна предполагает увеличение и спроса на пространство блока, а с ним и комиссий за транзакции. Читайте также:
Сколько биткойнов на самом деле существует и сколько потеряно?
Сумму всех существующих UTXO посчитать довольно легко, однако более глубокое исследование показывает, что часть из них никогда не будут созданы, часть доказуемо не поддаются расходованию и часть нерасходуемы предположительно (но не наверняка). У CoinMetrics был отличный пост с анализом предполагаемого оборотного предложения BTC (правда, от 2019 года).
Источник: bitnovosti.com