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