nikke
New Member
Posts: 30
|
Post by nikke on May 28, 2018 12:25:33 GMT 1
Tänkte jag skulle testa att plocka ut valda delar från ett block och köra en dubbel sha256 och se om jag kan få samma blockhash. Med samma värden på nonce etc så ska väl hashen bli densamma, men än så länge ingen framgång. Stämmer det att det som ska hashas är version + previousblockhash + merkleroot + time + bits + nonce?
|
|
|
Post by thomaslundqvist on May 28, 2018 14:13:44 GMT 1
Det låter rätt. Kontrollera att det är exakt 80 bytes. Och hasha binär-bytes inte hexsiffrorna! Prova med befintligt block för att se om du tänkt rätt kanske...
|
|
nikke
New Member
Posts: 30
|
Post by nikke on May 28, 2018 18:32:50 GMT 1
Om jag gör binascii.hexlify(thingsToHash).decode('ascii') så blir den 160 i längd. Om två hex per byte så borde det väl stämma.
Men så här ser den ut annars:
b'\x00\x00\x00 t\x8f\x0c\xa4\xfe\xb3\xa0\x04\xbdS\xeb"\x85\x14\x18\xdf\x00\x0f\xb8\x93XK\xe6\x86\xd4\x03\x92|\x00\x00\x00\x00\xd7\xf0\xa0\x9d \xd3\xda\x92\x95\xe3\xa7{\xd9^\xa0\xe5\xe95\xe6\xbf\x0eC\xe9\xf3\xe6\xbb?1\xd2v\x92,\xec\x03\xd2Z\x16\xd5\x00\x1d0\x15\x00\x00' Det ser konstigt ut på några ställen, t.ex ett mellanrum på fjärde byten är det väl så nåt måste gått fel
|
|
|
Post by thomaslundqvist on May 28, 2018 19:33:11 GMT 1
Python skriver vissa bytes som ascii när det går (t ex mellanslag som är 0x20 hexadecimalt):
Detta är binär-bytes och det du ska hasha:
b'\x00\x00\x00 t\x8f\x0c\xa4\xfe\xb3\xa0\x04\xbdS\xeb"\x85\x14\x18\xdf\x00\x0f\xb8\x93XK\xe6\x86\xd4\x03\x92|\x00\x00\x00\x00\xd7\xf0\xa0\x9d \xd3\xda\x92\x95\xe3\xa7{\xd9^\xa0\xe5\xe95\xe6\xbf\x0eC\xe9\xf3\xe6\xbb?1\xd2v\x92,\xec\x03\xd2Z\x16\xd5\x00\x1d0\x15\x00\x00'
Hexadecimalt och uppdelat (bara för oss människor):
00000020 version 748f0ca4feb3a004bd53eb22851418df000fb893584be686d403927c00000000 prev hash d7f0a09d20d3da9295e3a77bd95ea0e5e935e6bf0e43e9f3e6bb3f31d276922c merkle root ec03d25a time 16d5001d bits/difficulty 30150000 nonce Ser fint ut! Tänk på att hashar är baklänges precis som heltalen som är little endian (också baklänges).
|
|
nikke
New Member
Posts: 30
|
Post by nikke on May 28, 2018 20:21:18 GMT 1
Vad bra, men jag får hash 0aebb703e6c295f0a396a755fe2e2ec10269c580703c1d5d452ade5e4b5b11a7 istället för
00000000b05395b2f87200408ec7e5114f5131ae9504cd0643076e9c69adf430 Det blir samma fel om jag matar in det i funktionen decodeHeader..?
|
|
nikke
New Member
Posts: 30
|
Post by nikke on May 30, 2018 5:41:24 GMT 1
Någon ledtråd?
|
|
|
Post by thomaslundqvist on May 30, 2018 11:56:59 GMT 1
Du har råkat vända på hexsiffrorna i merkle rooten verkar det som. Orginalblocket ser ut så här:
7d0f0ad9023dad29593e7ab79de50a5e9e536efbe0349e3f6ebbf3132d6729c2
Dina: d7f0a09d20d3da9295e3a77bd95ea0e5e935e6bf0e43e9f3e6bb3f31d276922c
|
|
nikke
New Member
Posts: 30
|
Post by nikke on Jun 7, 2018 14:37:03 GMT 1
Jag har börjat titta på decode.py och frågorna hopar sig T.ex i decodeBlock varför raw = io.BytesIO(rawblock) ? Vad blir skillnaden raw och rawblock? När jag läser om BytesIO verkar det mest handla om prestanda? Och sen txCount = varint(raw) . Skickar det hela blocket men får tillbaks antal tx? Hur?
|
|
|
Post by thomaslundqvist on Jun 8, 2018 9:13:23 GMT 1
Jag har börjat titta på decode.py och frågorna hopar sig T.ex i decodeBlock varför raw = io.BytesIO(rawblock) ? Vad blir skillnaden raw och rawblock? När jag läser om BytesIO verkar det mest handla om prestanda? Och sen txCount = varint(raw) . Skickar det hela blocket men får tillbaks antal tx? Hur? rawblock och raw är ungefär samma men raw går att läsa strömmande som när man läser från en fil. varint()-funktionen läser så många bytes den behöver, tar bort dem och lämnar kvar resten i raw-strömmen. Man hade lika gärna kunnat plocka ut bytes med indexering istället, typ rawblock[3] men har valt att läsa strömmande bytes istället med read().
|
|