Подтвердить что ты не робот

(биткойн) Вычислить хэш из функции getwork - как это сделать?

когда я вызываю getwork на моем сервере биткойн, я получаю следующее:

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

Этот протокол, похоже, не документирован. Как вычислить хэш из этих данных. Я думаю, что эти данные мало ориентированы. Итак, первый шаг - преобразовать все в большой endian? Как только это будет сделано, я вычислил sha256 данных. Данные можно разделить на две части размером по 64 байта. Хэш первого патрона задается средним штатом и поэтому не нужно вычислять.

Поэтому я должен помечать chunck # 2 с помощью sha256, используя midstate в качестве начальных значений хэш-функции. Как только это будет сделано, я получаю хеш куска 2, который составляет 32 байта. Я вычисляю хэш этого куска еще раз, чтобы получить окончательный хэш.

Затем, нужно ли преобразовать все в маленький конец и отправить работу?

Для чего используется hash1?

4b9b3361

Ответ 1

Звучит правильно, в javascript есть script, которые вычисляют хэш, но я не совсем понимаю его, поэтому я не знаю, возможно, вы понимаете это лучше, если вы посмотрите.

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;
  };

ИСТОЧНИК: https://github.com/jwhitehorn/jsMiner/blob/4fcdd9042a69b309035dfe9c9ddf716119831a16/engine.js#L149-165

Ответ 2

Расчет хэша документирован в алгоритм хеширования блоков. Начните там относительно простые основы. Основные структуры данных документированы в Спецификация протокола - Bitcoin Wiki. Обратите внимание, что определение протокола (и определение работы) более или менее предполагает, что хэши SHA-256 являются 256-битными значениями little-endian, а не big-endian, как предполагает стандарт. См. Также

Сетью сложнее и запутывается более серьезная путаница упорядочения по порядку/байту.

Прежде всего обратите внимание, что getwork API оптимизирован для ускорения начальных шагов разработки. Значения midstate и hash1 предназначены для этих оптимизаций производительности и могут быть проигнорированы. Просто взгляните на "данные". И когда используется стандартная реализация sha256, хэшируются только первые 80 байтов (160 шестнадцатеричных символов).

К сожалению, данные JSON, представленные в структуре данных getwork, имеют разные конечные характеристики, чем то, что необходимо для хэширования в примере блока выше.

Они все говорят, чтобы перейти к источнику ответа, но источник С++ может быть большим и запутанным. Простой альтернативой является poold.py. Здесь обсуждается это: Новый пул для тестирования. Вам нужно только взглянуть на первые несколько строк подпрограммы "checkwork" и "bufreverse" и "bytereverse", чтобы получить порядок байтов. В конце концов, это всего лишь вопрос об изменении байтов в каждом 32-битном сегменте данных. Да - очень странно. Но проблемы с эндитами сложны и могут закончиться таким образом.

Некоторые другие полезные сведения о том, как работают "сетки", можно найти в дискуссиях по адресу:

Обратите внимание, что поиск сигнала для шума на исходном форуме Bitcoin становится очень трудным, и в настоящее время существует предложение Area51 для сайта сайта StackExchange для биткойнов и криптовалюты вообще. Приходите к нам!

Ответ 3

Откровенно говоря Алгоритм хэширования блоков биткойнов официально не описывается никаким источником.

"Расчет хэша документирован в алгоритме хэширования блоков." следует читать

Расчет хэша "описан" в алгоритме хэширования блоков.

en.bitcoin.it/wiki/Block_hashing_algorithm

btw код примера в PHP содержит ошибку (опечатку) код примера в Python генерирует ошибки при запуске Python3.3 для Windows XP 32 (отсутствует поддержка string.decode)