2011-06-08 13 views
24

cuando llamo getwork en mi servidor bitcoind, me sale el siguiente: no parece(bitcoin) Calcula el hash de la función getwork - ¿cómo hacerlo?

./bitcoind getwork 
{ 
    "midstate" : "695d56ae173bbd0fd5f51d8f7753438b940b7cdd61eb62039036acd1af5e51e3", 
    "data" : "000000013d9dcbbc2d120137c5b1cb1da96bd45b249fd1014ae2c2b400001511000000009726fba001940ebb5c04adc4450bdc0c20b50db44951d9ca22fc5e75d51d501f4deec2711a1d932f00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000", 
    "hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000", 
    "target" : "00000000000000000000000000000000000000000000002f931d000000000000" 
} 

Este protocolo de documentarse. ¿Cómo calculo el hash a partir de estos datos? Creo que esta información está en little endian. ¿Entonces el primer paso es convertir todo a big endian? Una vez hecho esto, calculo el sha256 de los datos. Los datos se pueden dividir en dos trozos de 64 bytes cada uno. El hash del primer plato lo da el estado medio y, por lo tanto, no tiene que calcularse.

Debo, por lo tanto, hash el chunck # 2 con sha256, utilizando el midstate como los valores hash iniciales. Una vez hecho esto, termino con un hash de fragmento 2, que es de 32 bytes. Calculo el hash de este pedazo una vez más para obtener un hash final.

¿Luego, convierto todo en little endian y envío el trabajo?

¿Para qué se utiliza hash1?

Respuesta

4

Parece correcto, hay un script en javascript que calcula el hash pero no lo entiendo del todo, así que no sé, tal vez lo entiendas mejor si lo miras.

this.tryHash = function(midstate, half, data, hash1, target, nonce){ 
    data[3] = nonce; 
    this.sha.reset(); 

    var h0 = this.sha.update(midstate, data).state; // compute first hash 
    for (var i = 0; i < 8; i++) hash1[i] = h0[i]; // place it in the h1 holder 
    this.sha.reset();     // reset to initial state 
    var h = this.sha.update(hash1).state;  // compute final hash 
    if (h[7] == 0) { 
     var ret = []; 
     for (var i = 0; i < half.length; i++) 
     ret.push(half[i]); 
     for (var i = 0; i < data.length; i++) 
     ret.push(data[i]); 
     return ret; 
    } else return null; 
    }; 

FUENTE:https://github.com/jwhitehorn/jsMiner/blob/4fcdd9042a69b309035dfe9c9ddf716119831a16/engine.js#L149-165

22

El cálculo de hash se documenta en Block hashing algorithm. Comience allí por los conceptos básicos relativamente simples. Las estructuras de datos básicas están documentadas en Protocol specification - Bitcoin Wiki. Tenga en cuenta que la definición de protocolo (y la definición de trabajo) asume más o menos que los valores hash SHA-256 son valores little-endian de 256 bits, en lugar de big-endian como lo implica el estándar. Consulte también

Getwork es más complicado y se encuentra con una confusión de ordenamiento de endian/byte más grave.

Primero tenga en cuenta que la API getwork está optimizada para acelerar los pasos iniciales de minería. Los valores midstate y hash1 son para estas optimizaciones de rendimiento y se pueden ignorar. Solo mira los "datos". Y cuando se usa una implementación sha256 estándar, solo los primeros 80 bytes (160 caracteres hexadecimales) de los "datos" son hash.

Desafortunadamente, los datos JSON presentados en la estructura de datos getwork tienen diferentes características endian que las necesarias para hash en el ejemplo anterior de bloque.

Todos dicen que vayan al origen de la respuesta, pero la fuente de C++ puede ser grande y confusa. Una alternativa simple es el código poold.py. Hay una discusión de esto aquí: New mining pool for testing. Solo necesita mirar las primeras líneas de la rutina "checkwork" y las funciones "bufreverse" y "bytereverse", para obtener el orden correcto de bytes. Al final, solo se trata de hacer una inversión de los bytes en cada segmento de datos de 32 bits. Sí, muy extraño. Pero los problemas endian son complicados y pueden terminar así ...

Algunos otros datos útiles sobre las obras way "getwork" se puede encontrar en las discusiones en:

Tenga en cuenta que la búsqueda de la señal a ruido en el Bitcoin originales el foro se está poniendo muy difícil, y actualmente hay una propuesta de Area51 para un StackExchange site for Bitcoin and Crypto Currency in general. ¡Ven y únete a nosotros!

1

Hablando francamente Algoritmo de hash de bloques Bitcoin no es oficialmente descrito por ninguna fuente.

" El cálculo de hash se documenta en el Bloque algoritmo de hash. " debe leer

El cálculo hash se "describe" en el bloque algoritmo de hash.

en.bitcoin.it/wiki/Block_hashing_algorithm

por cierto el código de ejemplo en PHP viene con un error (error tipográfico) el código de ejemplo en Python genera errores cuando se ejecuta por Python3.3 para Windows XP 32 (apoyo a string.decode falta)

Cuestiones relacionadas