Количество Биткоинов не будет 21.000.000 +33


Откуда появляются новые Биткоины

Биткоин имеет ограниченное предложение и еще не все монеты находятся в циркуляции. Единственный способ создать новые монеты, это майнинг — механизм добавления данных в блокчейн.

Протокол Биткоина фиксирует максимальное предложение монеты в количестве 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 — сумма комиссий всех транзакций в этом блоке (они не влияют на общее предложение монет).

Размер вознаграждения за блок и суммарной комиссии блока Биткоин с высотой 752730
Размер вознаграждения за блок и суммарной комиссии блока Биткоин с высотой 752730

Новые сгенерированные монеты создаются специальным типом транзакции — 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 хранится значение 100 \, 000\,000 \, * \, 50, т.е. 5.000.000.000 Сатоши.

Деление nSubsidy происходит за счет побитового оператора сдвига вправо (>>=). Сдвиг происходит на столько бит право, сколько указано в переменной halvings. Один сдвиг вправо эквивалентен делению числа на два нацело, два сдвига на четыре, три на восемь и так далее. Более подробная работа оператора видна на картинке снизу.

Пример побитового сдвига вправо для числа 157
Пример побитового сдвига вправо для числа 157

Изначальное число в размере 5.000.000.000 Сатоши можно очень долго делить на два до тех пор, пока оно не станет равным нулю. И именно на этот момент опираются эксперты при определении даты, когда будет добыт последний Биткоин.

Суммарное количество Сатоши, которое будет добыто на указанной высоте до следующего халвинга
Суммарное количество Сатоши, которое будет добыто на указанной высоте до следующего халвинга

К 6\,930 \, 000^{-му} блоку вознаграждение за блок будет равно 0 и, соответственно, на этом создание новых Биткоинов закончится. Это должно произойти к 33 халвингу, который состоится примерно к 2140 году (в 2016 была достигнута высота блока 420.000, через 4 года 630.000, т.е. для достижения 6\,930 \, 000^{-го} блока, начиная с 420\,000^{-го}блока, должны быть добыты 6\,930\,000\,-\,420\,000\,=\,6\,510\,000 блоков. За это время произойдет \scriptsize \frac{6\,510\,000}{210\,000}\,=31халвингов, между которыми 4 года. Значит к 6\,930 \, 000^{-му} блоку пройдет 31\,*\,4\,=124 года. Прибавим это к 2016 и получим 2016\,+124\,=2140 год). Отсюда и получается эта примерная дата.

Формула количества Биткоинов

На основе приведенной информации удалось вывести формулу, которая позволила рассчитать суммарное количество Биткоинов в Сатоши, которое будет добыто на высоте n.

\normalsize \begin{equation} f(n)=\left(\sum_{i=0}^{\operatorname{floor}\left(\frac{n}{210\,000}\right)-1} \text { floor }\left(\frac{50 \cdot 100\,000\,000}{2^i}\right)\right) \cdot 210\,000+ \\ +\text { floor }\left(\frac{50 \cdot 100\,000\,000}{2^{\left(\text { floor }\left(\frac{n}{210\,000}\right)\right)}}\right) \cdot \bmod (n,\, 210\,000) \end{equation}

У этой функции есть предел в размере 2\,099\,999\,997\,690\,000 \, \text{Сатоши}, что меньше, чем 21\,000\,000 \, \text{BTC}. Это значит, что Биткоинов никогда не будет 21\,000\,000 \,.

Вывод формулы

Между каждым халвингом создается одинаковое количество блоков (210.000). Все эти 210.000 блоков содержат одинаковое количество вознаграждения за блок (50 \, \cdot \, 100 \,000\,000 \, \text{Сатоши}), но с каждым халвингом оно уменьшается вдвое. Это можно учесть за счет деления на 2^i. Так как мы работаем с целыми числами, то нужно отбросить все, что возникает после запятой из-за деления с помощью функции \text{floor()}. Индекс суммы принимает начальное значение i=0. Чтобы узнать количество халвингов, которые произошли до переданной высоты n, нужно разделить n на 210.000. Так как нас интересует только целый результат, то отбрасываем снова все лишнее с помощью \text{floor()}. Отнимаем 1, чтобы не посчитать лишнее. Так как каждое слагаемое суммы умножается на 210.000, то 210.000 можно вынести за знак суммы.

Чтобы учесть Биткоины, полученные до очередного халвинга, нужно получить актуальное значение вознаграждения за блок за счет множителя

\text { floor }\left(\frac{50 \cdot 100\,000\,000}{2^{\left(\text { floor }\left(\frac{n}{210\,000}\right)\right)}}\right){.}

Для получения количества блоков, созданных после крайнего халвинга, необходимо воспользоваться функцией \text{mod}().

Умножение этих двух множителей и дает оставшееся количество Биткоинов, а все в сумме искомый ответ.

Аналогичные результаты можно получить и в Excel.

Результаты вычисления количества Биткоинов в Сатоши, которые будут добыты к указанной высоте
Результаты вычисления количества Биткоинов в Сатоши, которые будут добыты к указанной высоте

Вывод

Теперь вы знаете, что Биткоинов никогда не будет 21.000.000 и почему последняя его доля будет получена приблизительно к 2140 году.

Дополнительно

Ссылка на github с исходным кодом Биткоина.




Комментарии (12):

  1. anone9465
    /#24762086 / +2

    Никогда бы и не было, даже не углубляясь в математику- потерянные монет никто не восстановит)

    • prudent
      /#24762104 / +1

      Имеется в виду, что Максимальное предложение (Максимальное предложение определяет максимальное количество монет, которые когда-либо будут существовать, включая монеты, которые будут добыты или станут доступными в будущем) меньше, чем 21\,000\,000, хотя почти нигде это не уточняется.

      Вы же подразумеваете Циркулирующее предложение (относится к количеству криптовалют или токенов, которые являются общедоступными и обращаются на рынке).

      Кстати, Биткоины "не теряются", они все есть и будут в блокчейне. Может потеряться только доступ к ним, который осуществляется посредством приватного ключа.

      Можно сказать, что эти монеты сожгли, хотя технически это не совсем так.

      • sancoder
        /#24762236

        Существуют блоки, когда майнеры не клеймили все доступные им сатоши. Такие монеты потеряны навсегда и это объективно.

  2. nochkin
    /#24762206 / +4

    В чём прикол бо́льшую часть чисел делать картинкой?

    • prudent
      /#24762228 / -5

      Такой стиль оформления, для более читабильного представления чисел, чтобы не сливались с текстом.

      • nochkin
        /#24762296 / +8

        По мне так стало хуже читаемо, так как другой шрифт режет глаз и выбивает из общего потока. Особенно на фоне того, что некоторые числа всё же нормально написаны. Я уже молчу про размер шрифта и "подпрыгивании" таких чисел поверх линии.

        IMHO можно было просто bold сделать если надо акцентировать внимание, но не делать чтение неудобным.

        • prudent
          /#24762304 / +1

          Учту, спасибо.

          • nochkin
            /#24762738

            Сейчас выглядит классно. Спасибо.

  3. 314159abc
    /#24763054

    Спасибо, я не понимал, как это вычислили

    • prudent
      /#24763144

      Рассмотрим вычисление на примере таблицы 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 блоков.
      По аналогии проделываем это до тех пор, пока вознаграждение за блок не станет равным нулю. И в конце суммируем все строки последнего столбца, получив искомый ответ (суммарное количество Биткоинов в Сатоши, которое когда-либо будет создано).

  4. Sergeant101
    /#24763570

    Биткоины всегда будут выходить из оборота из-за "потерянных" кошельков.

    А недостаток оборотных средств - это большой залёт.

    • Greendq
      /#24763662

      Там нет проблем с оборотнми средствами - ну будет один сатоши стоить 10 долларов, и что? :) Всего лишь будет неудобно. Но тогда можно нолик подвинуть и разрешить делить уже и сатоши.