(биткойн) Вычислить хэш из функции getwork - как это сделать?
когда я вызываю getwork на моем сервере биткойн, я получаю следующее:
./bitcoind getwork
{
"midstate" : "695d56ae173bbd0fd5f51d8f7753438b940b7cdd61eb62039036acd1af5e51e3",
"data" : "000000013d9dcbbc2d120137c5b1cb1da96bd45b249fd1014ae2c2b400001511000000009726fba001940ebb5c04adc4450bdc0c20b50db44951d9ca22fc5e75d51d501f4deec2711a1d932f00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000",
"hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000",
"target" : "00000000000000000000000000000000000000000000002f931d000000000000"
}
Этот протокол, похоже, не документирован. Как вычислить хэш из этих данных. Я думаю, что эти данные мало ориентированы. Итак, первый шаг - преобразовать все в большой endian? Как только это будет сделано, я вычислил sha256 данных. Данные можно разделить на две части размером по 64 байта. Хэш первого патрона задается средним штатом и поэтому не нужно вычислять.
Поэтому я должен помечать chunck # 2 с помощью sha256, используя midstate в качестве начальных значений хэш-функции. Как только это будет сделано, я получаю хеш куска 2, который составляет 32 байта. Я вычисляю хэш этого куска еще раз, чтобы получить окончательный хэш.
Затем, нужно ли преобразовать все в маленький конец и отправить работу?
Для чего используется hash1?
Ответы
Ответ 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)