3

Help me to understand this code, spend all day to understand this code, and learned python from scratch, now I understand what operators do, but still some parts are complex to me.

import hashlib, struct

ver = 2
prev_block = "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"
mrkl_root = "871714dcbae6c8193a2bb9b2a69fe1c0440399f38d94b3a0f1b447275a29978a"
time_ = 0x53058b35 # 2014-02-20 04:57:25
bits = 0x19015f53

# https://en.bitcoin.it/wiki/Difficulty
exp = bits >> 24
mant = bits & 0xffffff
target_hexstr = '%064x' % (mant * (1<<(8*(exp - 3))))
target_str = target_hexstr.decode('hex')

nonce = 0
while nonce < 0x100000000:
    header = ( struct.pack("<L", ver) + prev_block.decode('hex')[::-1] +
          mrkl_root.decode('hex')[::-1] + struct.pack("<LLL", time_, bits, nonce))
    hash = hashlib.sha256(hashlib.sha256(header).digest()).digest()
    print nonce, hash[::-1].encode('hex')
    if hash[::-1] < target_str:
        print 'success'
        break
nonce += 1

In this code does the

prev_block "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"

is in SHA256 and then later it's decoded in to hexadecimal by using

prev_block.decode('hex')[::-1]

?

I just want to create a full "header" using the data I already have.

  • Any chance you can mark my answer as accepted, if that was the answer that helped you? – Brandon Jul 16 '16 at 20:20
2
prev_block = "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"

This is simply setting a variable called "prev_block" to the hexadecimal text hash of the previous block. It could have been stored as the raw byte hash, but for ease of use it is stored as hexadecimal text.

prev_block.decode('hex')[::-1]

This converts the hexadecimal text stored in prev_block into it's binary representation as a string/array of bytes.

If you simply want to create a header then this code will accomplish that as long as you provide all the variables (ver, prev_block, mrkl_root, time_, bits, and nonce):

ver = 2
prev_block = "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"
mrkl_root = "871714dcbae6c8193a2bb9b2a69fe1c0440399f38d94b3a0f1b447275a29978a"
time_ = 0x53058b35 # 2014-02-20 04:57:25
bits = 0x19015f53
nonce = 1 # make sure to change this to the correct nonce
header = ( struct.pack("<L", ver) + prev_block.decode('hex')[::-1] +
      mrkl_root.decode('hex')[::-1] + struct.pack("<LLL", time_, bits, nonce))
print header.encode('hex')

Update

The struct.pack("<L", ver) and struct.pack("<LLL", time_, bits, nonce) calls simply use the first argument (a format string) as instructions to convert the remaining arguments to little endian (also called least significant byte or LSB) unsigned long Byte arrays more details on that here. In the latter case when three "L"'s are used that's because there are 3 integer arguments provided which we want to convert into unsigned longs.

[::-1] is used to reverse the bytes of an array (this is necessary because the hashes are stored in textual hex in reverse order from how they are stored in binary which is little endian). So if for example prev_block.decode('hex') returned the Byte values 0, 1, 2, 3 then prev_block.decode('hex')[::-1] would return Byte values 3, 2, 1, 0. More about extended slicing here.

  • @Brandon Thank you, and can you explain what "<L", "<LLL" & [::-1] doing in that, all I could find is "L" converts the value to long but couldn't find <L or <LLL is doing. Does the [::-1] used to prevent the overflow exceptions when reading the value? – Pretty_Girl Jun 18 '16 at 7:07
  • @Pretty_Girl I see you are also trying to convert this code into VB.net. My suggestion is to simply take the code block I provided above and put that into a python program all of it's own. Then you can mess around with the different functions by changing them or remove them to see how those changes affect the output. That's the best way to learn how the code works in my opinion - get your hands dirty. – Brandon Jun 19 '16 at 18:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.