Вот дикое предложение: после того, как блок 209999, заменим функцию вознаграждения блок с приближенной экспоненциальной, так что награда в 210000 по-прежнему близка к 50 BTC, а сумма всех наград когда-либо до сих пор, как правило (и не достигает) 21M BTC.
Поскольку мы держим высокую награду (около 50 BTC) для дольше, это необходимо будет компенсировано позже. Это приводит к несколько более быстрой сходимости к 21М, с двукратное сокращение вознаграждения каждые 145561 блоки (вместо 210000).
Вот функция, которая вычисляет C вознаграждение, сумма которых достигает 20999999.99999336 в блоке 4899870 (текущая система достигает 20999999.9769 в блоке 6929999). Он использует только 64-битную целочисленную арифметику и довольно быстро.
Код:
статический Const int64_t коэфа [11] =
{419991, 630002, 840000, 1050003,
1260003, 1470003, 1680004, 1890005,
2100005, 2310005, 2520006};
uint64_t вознаграждение (интермедиат blocknum) {
int64_t RET = 5000000000ULL;
если (blocknum<210000) возврата RET;
blocknum - = 210000;
INT сдвиг = blocknum / 145561;
blocknum% = 145561;
int64_t т = (blocknum * 2380982516ULL) / 100000;
RET - = т;
для (INT I = 0; я<11; я ++) {
т = (-m * blocknum) / коэффициент [I];
если (м!) перерыва;
RET - = т;
}
возврат (RET>>сдвиг);
}
{419991, 630002, 840000, 1050003,
1260003, 1470003, 1680004, 1890005,
2100005, 2310005, 2520006};
uint64_t вознаграждение (интермедиат blocknum) {
int64_t RET = 5000000000ULL;
если (blocknum<210000) возврата RET;
blocknum - = 210000;
INT сдвиг = blocknum / 145561;
blocknum% = 145561;
int64_t т = (blocknum * 2380982516ULL) / 100000;
RET - = т;
для (INT I = 0; я<11; я ++) {
т = (-m * blocknum) / коэффициент [I];
если (м!) перерыва;
RET - = т;
}
возврат (RET>>сдвиг);
}
Полученная награда показано здесь:
В результате чего расстояние от целевого количества в обращении (21M BTC) показано здесь:
С некоторой настройки я уверен, что это возможно, чтобы он идти до конечного значения несколько более гладкой.
Итак, вопросы:
* Как вы думаете, непрерывное уменьшение вознаграждения блока лучше?
* Стоит ли ломать обратную совместимость?
* Кто-нибудь знает, чем красивее функции A * ехр (В * х), которые могут быть установлены, чтобы лучше соответствовать существующей награды?