Операции с биткойнами, связанные с байтами, немного сложны, так как они имеют тенденцию переключать порядковый номер прихоти. Сначала мы берем начальный байтовый массив [], представляющий
00000001c570c4764aadb3f09895619f549000b8b51a789e7f58ea750000709700000000103ca064f8c76c390683f8203043e91466a7fcc40e6ebc428fbcc2d89b574a864db8345b1b00b5ac00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000
Затем мы выделяем первую половину массива, получая:
00000001c570c4764aadb3f09895619f549000b8b51a789e7f58ea750000709700000000103ca06 4f8c76c390683f8203043e91466a7fcc40e6ebc428fbcc2d8
После этого нам нужно поменять местами несколько байтов. Мы меняем порядок байтов в каждом срезе по 4 байта, получая таким образом:
0100000076C470C5F0B3AD4A9F619598B80090549E781AB575EA587F977000000000000064A03C10396CC7F820F8830614E94330C4FCA76642BC6E0ED8C2BC8F
И это массив, который мы будем использовать для вычисления среднего состояния. Теперь нам нужно изменить файл hash.go
, добавив к type Hash interface
:
Midstate() []byte
И измените файл sha256.go
, добавив эту функцию:
func (d *digest) Midstate() []byte {
var answer []byte
for i:=0;i<len(d.h);i++{
answer=append(answer[:], Uint322Hex(d.h[i])...)
}
return answer
}
Где Uint322Hex
преобразует переменную uint32
в переменную []byte
. Имея все это, мы можем позвонить:
var h BitSHA.Hash = BitSHA.New()
h.Write(Str2Hex("0100000076C470C5F0B3AD4A9F619598B80090549E781AB575EA587F977000000000000064A03C10396CC7F820F8830614E94330C4FCA76642BC6E0ED8C2BC8F"))
log.Printf("%X", h.Midstate())
Где Str2Hex
превращает string
в []byte
. Результат:
69FC72E76DB0E764615A858F483E3566E42D56B2BC7A03ADCE9492887010EDA8
Запоминание правильного ответа:
e772fc6964e7b06d8f855a6166353e48b2562de4ad037abc889294cea8ed1070
Мы можем сравнить их:
69FC72E7 6DB0E764 615A858F 483E3566 E42D56B2 BC7A03AD CE949288 7010EDA8
e772fc69 64e7b06d 8f855a61 66353e48 b2562de4 ad037abc 889294ce a8ed1070
Итак, мы можем видеть, что нам просто нужно поменять местами байты в каждом срезе по 4 байта, и у нас будет правильное «среднее состояние», используемое пулами и майнерами биткойнов (до тех пор, пока оно больше не понадобится из-за того, что Устаревшее).