Помогите пожалуйста.
Как преобразовать этот код для лайткоинa?
Для биткоина это выглядит так:
static uint8_t diff_to_bits(double diff)
{
uint64_t diff64;
uint8_t i;
diff /= 0.9999847412109375;
diff *= (double)2147483648.0;
if (diff > 0x8000000000000000ULL)
diff = 0x8000000000000000ULL;
/* Convert it to an integer */
diff64 = diff;
for (i = 0; diff64; i++, diff64 >>= 1);
return i;
}
static double bits_to_diff(uint8_t bits)
{
double ret = 1.0;
if (likely(bits > 32))
ret *= 1ull << (bits - 32);
else if (unlikely(bits < 32))
ret /= 1ull << (32 - bits);
applog(LOG_INFO, "ret=\n",ret);
return ret;
}
Спасибо!
Что бы что-то менять, нужно понимать как это всё работает, я считаю. Был бы кто-то, кто бы мне всё по полочкам разложил, когда я только начинал изучение этих алгоритмов.
В общем в биткоине кроме bits и difficulty имеет значение еще параметр target. Все эти параметры жестко завязаны между собой на математике. bits нужен для компактной записи больного числа, и данный формат так и называется compact. Target необходим для операции сравнения с хешем, т.е. для самого майнинга, а difficulty просто для человекочитаемости, как разница между максимальным target и текущим.
Начну издалека. В конфиге битка maxtarget указан как 0x1d00ffff, и этот параметр учитывается при расчете difficulty. Проще всего посчитать difficulty можно через связку bits -> target -> difficulty и сейчас объясню почему.
Bits и target это по сути одно и тоже число+-, просто в разных форматах. Для примера есть научный формат записи 3 * 10 ^ 15. Вот именно этот формат с мантиссой (3) и экспонентой (15) используется в ЯП для хранения чисел с плавающей точкой.
Для того, чтобы получить из bits - target, необходимо разделить наш bits на мантиссу и экспоненту. Первый байт bits - экспонента, остальное- мантисса. Для примера 0x1d00ffff - экспонента 0x1d, мантисса 0x00ffff. Далее произведя нехитрую операцию
0x00ffff* 2**(8*(0x1d - 3)) получаем значение 0xffff0000000000000000000000000000000000000000000000000000, которое и используется для сравнения с хешем при майнинге блока, необходимо чтобы хеш был меньше этого числа, общего для всех майнеров.
Кстати, если мы внезапно возьмем log2(0xffff0000000000000000000000000000000000000000000000000000) = 224, то мы получим степень, ниже которой должен быть искомый хеш при майнинге. С увеличением сложности эта степень уменьшается, тем самым включается теория вероятности и закон больших чисел.
Теперь, чтобы получить difficulty - осталось немного, просто посчитать разницу между нашим target и эталонным. Как я писал выше, эталонный target это 0xffff0000000000000000000000000000000000000000000000000000, т.е. в текущем примере разница будет 1.
Если брать другие хеши, например недавний блок 0000000000000000000b518f692832004576bd42162f464fa0151b11e72d8b53. У него bits = 0x170e134e, target = e134e0000000000000000000000000000000000000000, а степень = 180, соответственно difficulty = ffff0000000000000000000000000000000000000000000000000000/e134e0000000000000000000000000000000000000000 = 19997335994446
А для того, чтобы из target получить bits необходимо посчитать у target недостающие нули до формата uint256, посчитать их количество - это и будет экспонентой будущего bits (там есть несколько тонких моментов, но в общем и целом - так). Мантисса же, это первые 3 байта числа (без нулей). Для нашего примера - если добавить лидирующий байт к target = 0x00ffff0000000000000000000000000000000000000000000000000000 - мы получим 29 байт или 0x1d, мантисса же в этом случае будет 0x00ffff. Что и приводит нас обратно к bits 0x1d00ffff.
В вашем же случае вычисления сделаны более замудренными для максимальной эффективности майнинга и увеличения скорости, но суть сводится к тому же, пропуская момент с target. В случае же с litecoin (как и с любым форком биткоина, в основном) - вам достаточно найти параметр maxtarget в коде лайткоина и с помощью него высчитать тоже самое.
Кстати говоря, мне кажется более человекочитаем формат сложности именно по степени необходимого хеша, но тогда тяжелее строить графики и отслеживать статистику. А математика сложности более интересна (на мой взгляд) и элегантна у monero (работа с переполнениями).