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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

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

Протокол Биткоина фиксирует максимальное предложение монеты в количестве 21\,000\,000 \, \text{BTC}. Об этом говорит код, приведенный ниже. Переменная MAX_MONEY является константой, которая равна 21\,000\,000, умноженному на COIN. COIN равен количеству Сатоши в 1 Биткоине, т.е. 1 \,\text{BTC} = 100\,000\,000 \,\text{Сатоши}. Сатоши является самой маленькой единицей Биткоина, т.е. оперировать суммами меньшими 0{,}00000001 \, \text{BTC} \, (1 \, \text{Сатоши})нельзя.

/** 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 \, \text{BTC}в качестве вознаграждения за блок. Эти 6{,}25 \, \text{BTC}были добыты и увеличили общее предложение монет, но оставшийся 0{,}10285206 \, \text{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 \, \text{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 \, \text{Сатоши}.

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

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

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

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

К 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 с исходным кодом Биткоина.

Источник: https://habr.com/ru/post/689792/

Интересные статьи

Интересные статьи

1. Полуавтоматические свойства и ключевое словоfield.2. Модификатор уровня доступа file.3. Первичные конструкторы для классов и структур.4. Паттерн-матчинг для списков.5. Атрибуты для Main в программа...
Исследователи добились значительного прогресса в скорости конвергенции, точности и интерпретируемости решений визуального трансформера. За подробностями приглашаем под кат. Материалом из блога Google ...
Налоговая отдаёт данные ЕГРЮЛ  по организации в виде PDF. Посредники за автоматический доступ по API хотят денег. На многих сайтах часть данных закрыто, часть функций недоступны бесплатно, и полн...
Похоже на то, что удешевления десктопных ПК, ноутбуков и прочей сложной электроники в ближайшее время ждать не приходится. Мало того, что сейчас в дефиците видеокарты и процессоры, так ...
Пару лет назад выдвигались опасения, что искусственный интеллект очень быстро достигнет уровня, когда его развитие станет неподконтрольным человеку и вдобавок пойдет по экспоненте. С...