(Биткойн) Рассчитать хэш из функции Getwork - как это сделать? - PullRequest
25 голосов
/ 08 июня 2011

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

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

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

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

Тогда, я могу преобразовать все в little-endian и отправить работу?

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

Ответы [ 3 ]

22 голосов
/ 22 июля 2011

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

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

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

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

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

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

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

4 голосов
/ 08 июня 2011

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

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

1 голос
/ 05 февраля 2014

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

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

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

en.bitcoin.it / вики / Block_hashing_algorithm

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

...