help me to understand this mining code 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 &gt;&gt; 24
mant = bits &amp; 0xffffff
target_hexstr = '%064x' % (mant * (1&lt;&lt;(8*(exp - 3))))
target_str = target_hexstr.decode('hex')

nonce = 0
while nonce &lt; 0x100000000:
    header = ( struct.pack("&lt;L", ver) + prev_block.decode('hex')[::-1] +
          mrkl_root.decode('hex')[::-1] + struct.pack("&lt;LLL", time_, bits, nonce))
    hash = hashlib.sha256(hashlib.sha256(header).digest()).digest()
    print nonce, hash[::-1].encode('hex')
    if hash[::-1] &lt; 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.
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("&lt;L", ver) + prev_block.decode('hex')[::-1] +
      mrkl_root.decode('hex')[::-1] + struct.pack("&lt;LLL", time_, bits, nonce))
print header.encode('hex')


Update

The struct.pack("&lt;L", ver) and struct.pack("&lt;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.