Привет всем, я пытаюсь написать открытым исходным кодом C # шахтера, но у меня возникают некоторые проблемы с горнорудной логикой.
Как я уже читал, основной шахтер делает это:
вар blockheader = DoGetWorkRPCCall ();
целевая переменная = ExtractTarget (blockheader);
для (Nonce = 0; нонса < 4294967295; нонс ++)
{
Попытка вар = ModifyNonce (blockheader, Nonce);
вар хэш = SHA256 (SHA256 (попытка));
если (хэш <= Мишень)
ReportSolution (попытка);
}
1) Есть ли на самом деле несколько решений? Если что вместо чтения:
если (хэш <= Мишень)
{
ReportSolution (попытка);
ломать;
}
2) если (хэш <= Мишень) - Я не могу понять, где GPU шахтеры это сделать. Они все, кажется, чтобы добавить некоторую волшебную константу к Uper 32 бита, а затем проверить, что == 0. Разве это не просто приближение "< цель" ? Не будет ли результат в некоторых неправильных решений сообщается?
3) Из http://blog.ezyang.com/2011/06/the-cryptography-of-bitcoin/: вычислительно трудной задачей является по существу разбавленную версию первого-прообразом атаки на хэш-функции. Шахтеры дают множество решений хешей (хэш все нулей до целевого хэша), и требуются найти сообщение с определенной структурой (цепочками блоков плюс одноразовый номер), что хэширует к одному из этих хешей. Это точно? В приведенном выше коде, это DoGetWorkRPCCall получить один хэш решение? Что именно делает "хэш всех нулей на целевой хэш" имею в виду?
4) Наконец, есть некоторый простой (комментировала?) Неоптимизированный исходный код для полного шахтера, который служит ярким примером того, как все это должно работать?