На Openssl весь алгоритм выглядит так:
SHA256_Init(&sha256_pass1); SHA256_Update(&sha256_pass1, (unsigned char*)&header, 64); SHA256_Update(&sha256_pass1, ((unsigned char*)&header)+64, sizeof(block_header)-64); SHA256_Final(hash1, &sha256_pass1);
SHA256_Init(&sha256_pass2); SHA256_Update(&sha256_pass2, hash1, SHA256_DIGEST_LENGTH); SHA256_Final(hash2, &sha256_pass2);
Следующие строки это просто вычисление первого хеша вручную, здесь ничего особенного нет, просто эксперимент. Здесь мы имеем попытку разобраться с тем, что переносить в ПЛИС из всего алгоритма Bitcoin, см. дальше. for (i = 0; i < 16; i++) M[i] = 0; hash[0] = (0xdc6a3b8d); hash[1] = (0x0c69421a); hash[2] = (0xcb1a5434); hash[3] = (0xe536f7d5); hash[4] = (0xc3c1b9e4); hash[5] = (0x4cbb9b8f); hash[6] = (0x95f0172e); hash[7] = (0xfc48d2df);
M[0] = BSWAP32(0x871714dc); M[1] = BSWAP32(0x53058b35); M[2] = BSWAP32(0x19015f53); M[3] = BSWAP32(0x33087548); M[4] = 0x80000000; M[15] = 0x00000280;
sha256 (M, hash);
Фишка здесь в том, что базовых операций SHA-2 здесь 3 штуки. hash1 от блока sizeof(block_header) - 2 базовых операции, первая из которых от счётчика не зависит и кэшируется. hash2 от hash1 (hash1 размером SHA256_DIGEST_LENGTH)- 1 базовая операция SHA-2.
Таким образом, нужно вычислять только 2 и 3 операции SHA-2, зависящие от счётчика. В общем, всё здесь есть, кмк, чтобы разобраться.
|