June 5, 2023

Эмиссия в 21млн. - наебка? Может быть.

Фиксированная денежная масса Биткойна - 21 000 000 биткойнов - в наши дни является достаточно известным фактом, но было время, когда это было не так. На самом деле, до 2014 года в биткоине существовала серьезная ошибка, из-за которой его предложение могло раздуваться бесконечно.

Если вы прочитаете уморительную и короткую статью BIP-42, то сможете получить некоторое представление о том, что представляла собой ошибка бесконечной инфляции:

Как известно, Сатоши был мастером программирования, чьи знания C++ превосходили только его знания японской культуры. Код ниже:

int64_t nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks
    // which will occur approximately every 4 years.
    nSubsidy >>= (nHeight / 210000);

тщательно написан, чтобы полагаться на неопределенное поведение в спецификации C++ - возможно, для того, чтобы в будущем его можно было аппаратно ускорить.

Основная проблема при написании программ с неопределенным поведением заключается в том, что они сразу же становятся непортабельными. Поскольку стандарт не определяет, как можно обрабатывать такое поведение, разные компиляторы и даже разные версии одного и того же компилятора или один и тот же компилятор, предназначенный для разных платформ, могут обрабатывать такое поведение совершенно по-разному. Это означает, что автор программы не может заранее знать, какой эффект будет иметь его код.

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

Так в чем же заключалось неопределенное поведение, проявляющееся в ошибке инфляции? Вы можете продемонстрировать это сами себе, написав быструю программу на C++:

// satoshis_infinite_inflation_bug.cpp

#include <iostream>
#include <iomanip>
#include <stdint.h>
using namespace std;

int main(int argc, char* argv[]) {
  int64_t minerReward = INT64_MAX;

  for (int32_t shift = 0; shift < 128; shift++) {
    cout << "#"
         << std::dec << std::setw(3) << std::setfill('0')
         << shift
         << ": "
         << std::hex << std::setw(16) << std::setfill('0')
         << (minerReward >> shift) << endl;
  }

  return 0;
}

Эта программа берет наибольшее возможное 64-битное целое значение и постоянно сдвигает его вправо до 128 бит. Поскольку в программе всего 64 бита, это поведение становится неопределенным, как только мы сдвигаем более 63 бит. Затем вы можете скомпилировать эту программу в соответствии со стандартом C++, доступным в то время, следующим образом:

gcc -std=c++98 satoshis_infinite_inflation_bug.cpp -o satoshis_infinite_inflation_bug

Запуск полученной программы дает следующий результат:

#000: 7fffffffffffffff
#001: 3fffffffffffffff
#002: 1fffffffffffffff
#003: 0fffffffffffffff
#004: 07ffffffffffffff
#005: 03ffffffffffffff
#006: 01ffffffffffffff
#007: 00ffffffffffffff
#008: 007fffffffffffff
#009: 003fffffffffffff
#010: 001fffffffffffff
#011: 000fffffffffffff
#012: 0007ffffffffffff
... snip ...
#061: 0000000000000003
#062: 0000000000000001
#063: 0000000000000000
#064: 7fffffffffffffff
#065: 3fffffffffffffff
#066: 1fffffffffffffff
#067: 0fffffffffffffff
#068: 07ffffffffffffff
... snip ...

Как вы можете видеть, как только мы полностью сдвигаем все биты на 63-м правом сдвиге, поведение этого конкретного компилятора (Apple LLVM версии 9.1.0 (clang-902.0.39.2)) заключается в том, чтобы начать заново с исходного значения. В терминах Биткойна это запускает график инфляции заново (упс!).

Мы можем доказать себе, что такое поведение не определено, поискав его в соответствующем стандарте C++98. В разделе 5.8 "Операторы сдвига" мы находим следующее:

Поведение не определено, если правый операнд отрицательный, или больше или равен длине в битах продвигаемого левого операнда.

Вот так, написав код, который потенциально может сдвинуть более 63 бит вправо, Сатоши в конечном итоге заставил программу проявить неопределенное поведение. Вполне вероятно, что Сатоши вообразил, что это поведение похоже на поведение других систем и языков, которые справляются с этой конкретной ошибкой, продолжая возвращать 0 при сдвиге.

К счастью, BIP-42 нашел и исправил эту ошибку, гарантируя, что Биткойн будет проводить свой денежный эксперимент с фиксированным предложением.

Но это не говорит о том, что эту самую денежную эмиссию невозможно будет увеличить.
Вот и думай теперь.

Если нет потенциально потолка эмиссии, то и смысла в халвингах тоже нет. Зачем копать по 1 сатоши, если через век можно сделать тоже самое, но за 50 BTC, что больше в 5 миллиардов раз?

Возможность этого уже будет заложена рынком в цену, что обесценит работу по поддержанию сети. Как следствие - постепенное отключение всех крупных майнеров от сети и ее смерть либо от рук последних майнеров, либо из-за их отсутствия.

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