Откуда появляются новые Биткоины
Биткоин имеет ограниченное предложение и еще не все монеты находятся в циркуляции. Единственный способ создать новые монеты, это майнинг — механизм добавления данных в блокчейн.
Протокол Биткоина фиксирует максимальное предложение монеты в количестве 21.000.000 BTC. Об этом говорит код, приведенный ниже. Переменная MAX_MONEY
является константой, которая равна 21.000.000, умноженному на COIN
. COIN
равен количеству Сатоши в 1 Биткоине, т.е. 1 BTC = 100.000.000 Сатоши. Сатоши является самой маленькой единицей Биткоина, т.е. оперировать суммами меньшими 0,00000001 BTC (1 Сатоши) нельзя.
/** The amount of satoshis in one BTC. */
static constexpr CAmount COIN = 100000000;
static constexpr CAmount MAX_MONEY = 21000000 * COIN;
По состоянию на сентябрь 2022 года было добыто около 91% от всех Биткоинов (примерно 19.142.006), но для добычи оставшихся Биткоинов потребуется более 100 лет. Это связано с периодическим событием под названием халвинг (подробнее в следующей главе), задача которого состоит в том, чтобы постепенно уменьшать вознаграждение за майнинг криптовалюты.
Майнинг позволяет участникам сети добавлять блоки в блокчейн. Для этого они должны направить вычислительную мощность своего компьютера для решения определенной криптографической задачи. В качестве стимула есть вознаграждение, доступное тому, кто найдет соответствующее решение и сформирует действительный (валидный) блок.
Чтобы сформировать блок необходимо большое количество ресурсов, в то время как проверить действительность этого блока очень легко. Если кто-то попытается обмануть сеть и добавить недействительный блок, такой запрос будет немедленно отклонен, и майнер не получит вознаграждение за проделанный майнинг.
Вознаграждение состоит из двух компонентов: комиссий с транзакций в блоке и вознаграждения за блок. Вознаграждение за блок является единственным источником новых биткоинов. С каждым добытым блоком увеличивается общее предложение монет. Для примера возьмем блок, имеющий высоту 752.730. Майнер, который добыл этот блок, получает 6,25 BTC в качестве вознаграждения за блок. Эти 6,25 BTC были добыты и увеличили общее предложение монет, но оставшийся 0,10285206 BTC — сумма комиссий всех транзакций в этом блоке (они не влияют на общее предложение монет).
Новые сгенерированные монеты создаются специальным типом транзакции — coinbase. Как правило, транзакция coinbase является первой транзакцией, которая добавляется в блок, и она в основном генерирует монеты из ничего.
coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight,
chainparams.GetConsensus());
Именно функция GetBlockSubsidy
определяет вознаграждение за блок.
Протокол Биткоина корректирует сложность майнинга так, чтобы поиск решения для нового блока занимал приблизительно 10 минут. Блоки не всегда добываются ровно за десять минут, но данная установка является своеобразным ориентиром для всех участников сети. Переменная nPowTargetTimespan
отражает время (в секундах) корректировки сложности создания блока (по умолчанию две недели), чтобы контролировать общую скорость создания блока. Переменная nPowTargetSpacing
содержит среднее время (в секундах) генерации блока (по умолчанию 10 минут).
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
Что такое халвинг Биткоина
Первый блок Биткоина был сгенерирован 3 января 2009 года в 18:15:05 (время по Гринвичу). Такой блок называется генезис-блоком (Genesis Block). Время создания можно узнать по первому аргументу функции CreateGenesisBlock
. 1231006505
— это unix-время (unix-время — количество секунд, прошедших с полуночи 1 января 1970 года). При конвертации этого числа получается исходная дата.
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
Изначально вознаграждение за блок было 50 BTC. Вознаграждение уменьшается вдвое через каждые 210.000 созданных блоков. Переменная nSubsidyHalvingInterval
отвечает за количество блоков, которое должно создаться перед уменьшением вознаграждения за майнинг, т.е. после создания 210.000 блоков вознаграждение за блок уменьшается вдвое (примерно раз в 4 года).
consensus.nSubsidyHalvingInterval = 210000;
Если более формально, то халвинг — это процесс уменьшения скорости создания новых единиц криптовалюты. Т.е. это относится к периодическому уменьшению награды майнеров за добытый блок.
Как видно на графике вознаграждение за блок с каждым халвингом становится меньше до тех пор, пока и вовсе не станет равным нулю (к 2140 году).
Халвинг является неотъемлемой частью экономической модели криптовалют, поскольку он отвечает за стабильный темп создания новых монет и его дальнейшее регулирование. Такой контролируемый уровень денежной инфляции является одним из основных различий между криптовалютами и традиционными фиатными валютами, которые, по сути, имеют бесконечное циркулирующее предложение.
Вознаграждение за блок
Рассмотрим более подробной функцию GetBlockSubsidy
.
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
// Force block reward to zero when right shift is undefined.
if (halvings >= 64)
return 0;
CAmount nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
nSubsidy >>= halvings;
return nSubsidy;
}
Первый аргумент функции nHeight
– высота блока, второй аргумент параметры консенсуса, которые являются неизменными. Значение высоты блока делится целочисленно на 210.000 (потому что nSubsidyHalvingInterval = 210000)
. Если значение переменной halvings >= 64
, то вознаграждения за блок не будет. Но в каком случае halvings
будет равен 64
? Для этого высота блока должна быть не меньше 13.440.000, но это произойдет примерно только к 2264 году, а вознаграждение за блок будет равно нулю уже к 2140 году, значит, есть другое условие, из-за которого это произойдет.
Если посмотреть на код, приведенный выше, более детально, то мы можем заметить, что значение переменной nSubsidy
имеет тип CAmount
. А тип CAmount
это псевдоним для типа int64_t
(целочисленный тип данных фиксированного размера, в данном случае 64 бит или 8 байт).
typedef int64_t CAmount;
В переменной nSubsidy
хранится значение , т.е. 5.000.000.000 Сатоши.
Деление nSubsidy
происходит за счет побитового оператора сдвига вправо (>>=
). Сдвиг происходит на столько бит право, сколько указано в переменной halvings
. Один сдвиг вправо эквивалентен делению числа на два нацело, два сдвига на четыре, три на восемь и так далее. Более подробная работа оператора видна на картинке снизу.
Изначальное число в размере 5.000.000.000 Сатоши можно очень долго делить на два до тех пор, пока оно не станет равным нулю. И именно на этот момент опираются эксперты при определении даты, когда будет добыт последний Биткоин.
К блоку вознаграждение за блок будет равно 0 и, соответственно, на этом создание новых Биткоинов закончится. Это должно произойти к 33 халвингу, который состоится примерно к 2140 году (в 2016 была достигнута высота блока 420.000, через 4 года 630.000, т.е. для достижения блока, начиная с блока, должны быть добыты блоков. За это время произойдет халвингов, между которыми 4 года. Значит к блоку пройдет года. Прибавим это к 2016 и получим год). Отсюда и получается эта примерная дата.
Формула количества Биткоинов
На основе приведенной информации удалось вывести формулу, которая позволила рассчитать суммарное количество Биткоинов в Сатоши, которое будет добыто на высоте .
У этой функции есть предел в размере , что меньше, чем . Это значит, что Биткоинов никогда не будет .
Вывод формулы
Между каждым халвингом создается одинаковое количество блоков (210.000). Все эти 210.000 блоков содержат одинаковое количество вознаграждения за блок , но с каждым халвингом оно уменьшается вдвое. Это можно учесть за счет деления на . Так как мы работаем с целыми числами, то нужно отбросить все, что возникает после запятой из-за деления с помощью функции . Индекс суммы принимает начальное значение . Чтобы узнать количество халвингов, которые произошли до переданной высоты , нужно разделить на 210.000. Так как нас интересует только целый результат, то отбрасываем снова все лишнее с помощью . Отнимаем 1, чтобы не посчитать лишнее. Так как каждое слагаемое суммы умножается на 210.000, то 210.000 можно вынести за знак суммы.
Чтобы учесть Биткоины, полученные до очередного халвинга, нужно получить актуальное значение вознаграждения за блок за счет множителя
Для получения количества блоков, созданных после крайнего халвинга, необходимо воспользоваться функцией .
Умножение этих двух множителей и дает оставшееся количество Биткоинов, а все в сумме искомый ответ.
Аналогичные результаты можно получить и в Excel.
Вывод
Теперь вы знаете, что Биткоинов никогда не будет 21.000.000 и почему последняя его доля будет получена приблизительно к 2140 году.
Дополнительно
Ссылка на github с исходным кодом Биткоина.
Комментарии (13)
nochkin
23.09.2022 20:11+5В чём прикол бо́льшую часть чисел делать картинкой?
prudent Автор
23.09.2022 20:16-6Такой стиль оформления, для более читабильного представления чисел, чтобы не сливались с текстом.
nochkin
23.09.2022 20:54+8По мне так стало хуже читаемо, так как другой шрифт режет глаз и выбивает из общего потока. Особенно на фоне того, что некоторые числа всё же нормально написаны. Я уже молчу про размер шрифта и "подпрыгивании" таких чисел поверх линии.
IMHO можно было просто bold сделать если надо акцентировать внимание, но не делать чтение неудобным.
314159abc
24.09.2022 09:10Спасибо, я не понимал, как это вычислили
prudent Автор
24.09.2022 10:11Рассмотрим вычисление на примере таблицы Excel из статьи.
До 210.000 блока вознаграждение за блок составляло 50 BTC или 5.000.000.000 Сатоши.
Значит в первых 210.000 блоках будут транзакции по созданию Биткоина в размере 50 BTC, поэтому я в первой строке умножаю 5.000.000.000 на 210.000 для получения суммарного количества Сатоши, которое будет получено в первых 210.000 блоках.
Далее вознаграждение за блок уменьшается вдвое (за счет побитового сдвига вправо, т.е. это тоже самое, что и деление нацело на 2). Поэтому во второй строке уже 2.500.000.000 Сатоши в качестве вознаграждения за блок. Также умножаем это на 210.000 блоков.
По аналогии проделываем это до тех пор, пока вознаграждение за блок не станет равным нулю. И в конце суммируем все строки последнего столбца, получив искомый ответ (суммарное количество Биткоинов в Сатоши, которое когда-либо будет создано).
Sergeant101
24.09.2022 13:47Биткоины всегда будут выходить из оборота из-за "потерянных" кошельков.
А недостаток оборотных средств - это большой залёт.
Greendq
24.09.2022 14:49Там нет проблем с оборотнми средствами - ну будет один сатоши стоить 10 долларов, и что? :) Всего лишь будет неудобно. Но тогда можно нолик подвинуть и разрешить делить уже и сатоши.
LordDarklight
26.09.2022 10:22К 2140 году, если майнинг криптовалюты вообще, и, в частности Биткойнов, (как и сами Биткойны) будет ещё актуален (причём не факт, что к тому моменту лидирующей будет другая криптовалюта, а Биткойн будет где-то на дне) - то алгоритм майнинга Биткойна могут модернизировать, сохранив все кошельки - перейдя на другой - и продолжить майнинг. Хотя по задумке Сатоши Накамото - к 2140 году майнинг биткойна (как необходимый сейчас процесс поддержания процесса транзакций) будет уже не актуален - тут либо сеть будет поддерживаться уже самостоятельно без вознаграждений - скорее всего за счёт криптовалютных бирж, которые будут брать комиссию за трансакции. Либо майнинг криптовалют, возможно только нынешних, включая Биткойн, к тому моменту уже отомрёт вовсе как процесс (и такая криптовалюта будет не входу - ибо без поддержания сети - ей пользоваться будет невозможно).
Вот, кстати, такое обновление алгоритма уже было в 2017-2018 году - wiki:Bitcoin Cash и хабр - и ещё сейчас есть две ветки Bitcoin ABC и Bitcoin SV (и позже их стало куда больше). Так что, нечто подобное может произойти и к 2140 году - если в этом будет нужда. Главное дожить. Ну и что-бы в этом момент мир не накрыл очередной глобальный кризис, куда помасштабнее текущий в XXI веке.
anone9465
Никогда бы и не было, даже не углубляясь в математику- потерянные монет никто не восстановит)
prudent Автор
Имеется в виду, что Максимальное предложение (Максимальное предложение определяет максимальное количество монет, которые когда-либо будут существовать, включая монеты, которые будут добыты или станут доступными в будущем) меньше, чем , хотя почти нигде это не уточняется.
Вы же подразумеваете Циркулирующее предложение (относится к количеству криптовалют или токенов, которые являются общедоступными и обращаются на рынке).
Кстати, Биткоины "не теряются", они все есть и будут в блокчейне. Может потеряться только доступ к ним, который осуществляется посредством приватного ключа.
Можно сказать, что эти монеты сожгли, хотя технически это не совсем так.
sancoder
Существуют блоки, когда майнеры не клеймили все доступные им сатоши. Такие монеты потеряны навсегда и это объективно.