Извините за мой плохой Englisch, но это не мой родной язык, так как я из Германии.
Я прочитал о концепции Bitcoin некоторого время назад и уже установил шахтер на моей Radeon 5850. Работает назад, но я хотел бы получить небольшой шахтер собирается на мою ежедневное кодировании машины, которая имеет GeForce 7. Так что я получил меня BrookGPU, получил некоторые демонстрационные приложения собираются и хотят, чтобы написать код для него.
Так как у меня не так много понятия о том, весь процесс добычи, я думал, что я должен начать с очень простой демо-приложение, называется хэш-код и изменить его, чтобы сделать что-то полезное. Поэтому я портировал его на cc65 компилятора и запустить его на Vice (а c64 эмулятор) просто поразвлечься с ним и понимать код и т.д.
Моя нынешняя проблема заключается в трудности <знак равно> хэш сравнения. Я написал функцию декодирования для сложности в соответствии с записью Wiki:
Код:
/ **
* Decode цели в 256 битном междунар. См запись цели в Bitcoin вики для деталей.
* /
недействительный decodeDifficulty (uint8 * TargetArray, целевая uint32) {
uint32 смещения = ((цель >> 24) - 3) << 3;
INT Bitshift = смещение & 7;
INT currentByte = смещение >> 3;
uint32 targetBits = целевая & (UInt32) 0x00FFFFFF;
если (targetBits & 0x00800000) = (uint32) 0xff000000;
bzero (TargetArray, SizeOf (uint8) * currentByte); // Пустое все ниже битовую
MemSet ( &TargetArray [currentByte + 4], 0xff, SizeOf (uint8) * (SHA256_DIGEST_LENGTH - 4 - currentByte)); // Заполнить биты над битовым с 1 для расширения знака
еще {
bzero (TargetArray, SizeOf (uint8) * SHA256_DIGEST_LENGTH); // пустой целевой массив
}
TargetArray [currentByte ++] = (Uint8) (targetBits & 0xff);
targetBits >>= 8;
TargetArray [currentByte ++] = (Uint8) (targetBits & 0xff);
targetBits >>= 8;
TargetArray [currentByte ++] = (Uint8) (targetBits & 0xff);
targetBits >>= 8;
TargetArray [currentByte] = (Uint8) (targetBits & 0xff);
}
и функции сравнения для 32 байт целых чисел:
Код:
/ **
* Сравните 2 256 бит целочисленных значений.
*
* @return значения > 0, если hash1 > hash2, значение < 0, если hash1 < hash2 и 0, если они равны.
* /
INT compareHash (uint8 * hash1, uint8 * hash2) {
uint8 msb1, msb2;
INT currentByte;
INT byteDifference;
// Проверяет, если оба числа имеют одинаковый знак ..
msb1 = hash1 [SHA256_DIGEST_LENGTH - 1] & 0х80;
msb2 = hash2 [SHA256_DIGEST_LENGTH - 1] & 0х80;
если (msb1! = msb2) {// Оба числа отличаются знаком
вернуться msb1? -1: 1;
}
// Мы должны сравнивать побайтно ... 🙁
для (currentByte = SHA256_DIGEST_LENGTH - 1; currentByte >= 0; --currentByte) {
byteDifference = hash1 [currentByte] - hash2 [currentByte]; // Вычислить разность текущего bytes-.
если (byteDifference) {// Если байты различаются.
вернуться byteDifference; // просто вернуть разницу.
}
}
возвращать 0; // оба Интс равны.
}
, но что произойдет, если хэш больше чем 0x8000 .... => отрицательна? Это меньше в моем текущем коде, так что это будет решение, которое не так, как я его понимаю. Так что я должен сравнения абс (хэш) < трудность?
Заранее спасибо,
Andreas