快速制作创世区块

先说一下环境,我用的是Ubuntu16.04,bitcoin源码0.12.2

一、脚本源码

  1. import hashlib, binascii, struct, array, os, time, sys, optparse  
  2. import scrypt  
  3.   
  4. from construct import *  
  5.   
  6.   
  7. def main():  
  8.   options = get_args()  
  9.   
  10.   algorithm = get_algorithm(options)  
  11.   
  12.   # https://en.bitcoin.it/wiki/Difficulty  
  13.   bits, target   = get_difficulty(algorithm)  
  14.   
  15.   input_script  = create_input_script(options.timestamp)  
  16.   output_script = create_output_script(options.pubkey)  
  17.   # hash merkle root is the double sha256 hash of the transaction(s)   
  18.   tx = create_transaction(input_script, output_script,options)  
  19.   hash_merkle_root = hashlib.sha256(hashlib.sha256(tx).digest()).digest()  
  20.   print_block_info(options, hash_merkle_root, bits)  
  21.   
  22.   block_header        = create_block_header(hash_merkle_root, options.time, bits, options.nonce)  
  23.   genesis_hash, nonce = generate_hash(block_header, algorithm, options.nonce, target)  
  24.   announce_found_genesis(genesis_hash, nonce)  
  25.   
  26.   
  27. def get_args():  
  28.   parser = optparse.OptionParser()  
  29.   parser.add_option("-t""--time", dest="time", default=int(time.time()),   
  30.                    type="int", help="the (unix) time when the genesisblock is created")  
  31.   parser.add_option("-z""--timestamp", dest="timestamp", default="The Times 03/Jan/2009 Chancellor on brink of second bailout for banks",  
  32.                    type="string", help="the pszTimestamp found in the coinbase of the genesisblock")  
  33.   parser.add_option("-n""--nonce", dest="nonce", default=0,  
  34.                    type="int", help="the first value of the nonce that will be incremented when searching the genesis hash")  
  35.   parser.add_option("-a""--algorithm", dest="algorithm", default="SHA256",  
  36.                     help="the PoW algorithm: [SHA256|scrypt|X11|X13|X15]")  
  37.   parser.add_option("-p""--pubkey", dest="pubkey", default="04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f",  
  38.                    type="string", help="the pubkey found in the output script")  
  39.   parser.add_option("-v""--value", dest="value", default=5000000000,  
  40.                    type="int", help="the value in coins for the output, full value (exp. in bitcoin 5000000000 - To get other coins value: Block Value * 100000000)")  
  41.   
  42.   (options, args) = parser.parse_args()  
  43.   return options  
  44.   
  45. def get_algorithm(options):  
  46.   supported_algorithms = ["SHA256""scrypt""X11""X13""X15"]  
  47.   if options.algorithm in supported_algorithms:  
  48.     return options.algorithm  
  49.   else:  
  50.     sys.exit("Error: Given algorithm must be one of: " + str(supported_algorithms))  
  51.   
  52. def get_difficulty(algorithm):  
  53.   if algorithm == "scrypt":  
  54.     return 0x1e0ffff00x0ffff0 * 2**(8*(0x1e - 3))  
  55.   elif algorithm == "SHA256":  
  56.     return 0x1d00ffff0x00ffff * 2**(8*(0x1d - 3))   
  57.   elif algorithm == "X11" or algorithm == "X13" or algorithm == "X15":  
  58.     return 0x1e0ffff00x0ffff0 * 2**(8*(0x1e - 3))  
  59.   
  60. def create_input_script(psz_timestamp):  
  61.   psz_prefix = ""  
  62.   #use OP_PUSHDATA1 if required  
  63.   if len(psz_timestamp) > 76: psz_prefix = '4c'  
  64.   
  65.   script_prefix = '04ffff001d0104' + psz_prefix + chr(len(psz_timestamp)).encode('hex')  
  66.   print (script_prefix + psz_timestamp.encode('hex'))  
  67.   return (script_prefix + psz_timestamp.encode('hex')).decode('hex')  
  68.   
  69.   
  70. def create_output_script(pubkey):  
  71.   script_len = '41'  
  72.   OP_CHECKSIG = 'ac'  
  73.   return (script_len + pubkey + OP_CHECKSIG).decode('hex')  
  74.   
  75.   
  76. def create_transaction(input_script, output_script,options):  
  77.   transaction = Struct("transaction",  
  78.     Bytes("version"4),  
  79.     Byte("num_inputs"),  
  80.     StaticField("prev_output"32),  
  81.     UBInt32('prev_out_idx'),  
  82.     Byte('input_script_len'),  
  83.     Bytes('input_script', len(input_script)),  
  84.     UBInt32('sequence'),  
  85.     Byte('num_outputs'),  
  86.     Bytes('out_value'8),  
  87.     Byte('output_script_len'),  
  88.     Bytes('output_script',  0x43),  
  89.     UBInt32('locktime'))  
  90.   
  91.   tx = transaction.parse('\x00'*(127 + len(input_script)))  
  92.   tx.version           = struct.pack('1)  
  93.   tx.num_inputs        = 1  
  94.   tx.prev_output       = struct.pack('0,0,0,0)  
  95.   tx.prev_out_idx      = 0xFFFFFFFF  
  96.   tx.input_script_len  = len(input_script)  
  97.   tx.input_script      = input_script  
  98.   tx.sequence          = 0xFFFFFFFF  
  99.   tx.num_outputs       = 1  
  100.   tx.out_value         = struct.pack(' ,options.value)#0x000005f5e100)#012a05f200) #50 coins  
  101.   #tx.out_value         = struct.pack('  
  102.   tx.output_script_len = 0x43  
  103.   tx.output_script     = output_script  
  104.   tx.locktime          = 0   
  105.   return transaction.build(tx)  
  106.   
  107.   
  108. def create_block_header(hash_merkle_root, time, bits, nonce):  
  109.   block_header = Struct("block_header",  
  110.     Bytes("version",4),  
  111.     Bytes("hash_prev_block"32),  
  112.     Bytes("hash_merkle_root"32),  
  113.     Bytes("time"4),  
  114.     Bytes("bits"4),  
  115.     Bytes("nonce"4))  
  116.   
  117.   genesisblock = block_header.parse('\x00'*80)  
  118.   genesisblock.version          = struct.pack('1)  
  119.   genesisblock.hash_prev_block  = struct.pack('0,0,0,0)  
  120.   genesisblock.hash_merkle_root = hash_merkle_root  
  121.   genesisblock.time             = struct.pack(', time)  
  122.   genesisblock.bits             = struct.pack(', bits)  
  123.   genesisblock.nonce            = struct.pack(', nonce)  
  124.   return block_header.build(genesisblock)  
  125.   
  126.   
  127. # https://en.bitcoin.it/wiki/Block_hashing_algorithm  
  128. def generate_hash(data_block, algorithm, start_nonce, target):  
  129.   print 'Searching for genesis hash..'  
  130.   nonce           = start_nonce  
  131.   last_updated    = time.time()  
  132.   difficulty      = float(0xFFFF) * 2**208 / target  
  133.   update_interval = int(1000000 * difficulty)  
  134.   
  135.   while True:  
  136.     sha256_hash, header_hash = generate_hashes_from_block(data_block, algorithm)  
  137.     last_updated             = calculate_hashrate(nonce, update_interval, difficulty, last_updated)  
  138.     if is_genesis_hash(header_hash, target):  
  139.       if algorithm == "X11" or algorithm == "X13" or algorithm == "X15":  
  140.         return (header_hash, nonce)  
  141.       return (sha256_hash, nonce)  
  142.     else:  
  143.      nonce      = nonce + 1  
  144.      data_block = data_block[0:len(data_block) - 4] + struct.pack(', nonce)    
  145.   
  146.   
  147. def generate_hashes_from_block(data_block, algorithm):  
  148.   sha256_hash = hashlib.sha256(hashlib.sha256(data_block).digest()).digest()[::-1]  
  149.   header_hash = ""  
  150.   if algorithm == 'scrypt':  
  151.     header_hash = scrypt.hash(data_block,data_block,1024,1,1,32)[::-1]   
  152.   elif algorithm == 'SHA256':  
  153.     header_hash = sha256_hash  
  154.   elif algorithm == 'X11':  
  155.     try:  
  156.       exec('import %s' % "xcoin_hash")  
  157.     except ImportError:  
  158.       sys.exit("Cannot run X11 algorithm: module xcoin_hash not found")  
  159.     header_hash = xcoin_hash.getPoWHash(data_block)[::-1]  
  160.   elif algorithm == 'X13':  
  161.     try:  
  162.       exec('import %s' % "x13_hash")  
  163.     except ImportError:  
  164.       sys.exit("Cannot run X13 algorithm: module x13_hash not found")  
  165.     header_hash = x13_hash.getPoWHash(data_block)[::-1]  
  166.   elif algorithm == 'X15':  
  167.     try:  
  168.       exec('import %s' % "x15_hash")  
  169.     except ImportError:  
  170.       sys.exit("Cannot run X15 algorithm: module x15_hash not found")  
  171.     header_hash = x15_hash.getPoWHash(data_block)[::-1]  
  172.   return sha256_hash, header_hash  
  173.   
  174.   
  175. def is_genesis_hash(header_hash, target):  
  176.   return int(header_hash.encode('hex_codec'), 16) < target  
  177.   
  178.   
  179. def calculate_hashrate(nonce, update_interval, difficulty, last_updated):  
  180.   if nonce % update_interval == update_interval - 1:  
  181.     now             = time.time()  
  182.     hashrate        = round(update_interval/(now - last_updated))  
  183.     generation_time = round(difficulty * pow(232) / hashrate / 36001)  
  184.     sys.stdout.write("\r%s hash/s, estimate: %s h"%(str(hashrate), str(generation_time)))  
  185.     sys.stdout.flush()  
  186.     return now  
  187.   else:  
  188.     return last_updated  
  189.   
  190.   
  191. def print_block_info(options, hash_merkle_root, bits):  
  192.   print "algorithm: "    + (options.algorithm)  
  193.   print "merkle hash: "  + hash_merkle_root[::-1].encode('hex_codec')  
  194.   print "pszTimestamp: " + options.timestamp  
  195.   print "pubkey: "       + options.pubkey  
  196.   print "time: "         + str(options.time)  
  197.   print "bits: "         + str(hex(bits))  
  198.   
  199.   
  200. def announce_found_genesis(genesis_hash, nonce):  
  201.   print "genesis hash found!"  
  202.   print "nonce: "        + str(nonce)  
  203.   print "genesis hash: " + genesis_hash.encode('hex_codec')  
  204.   
  205.   
  206. # GOGOGO!  
  207. main()  

二、安装必要的库

sudo apt-get install python-pip python-dev build-essential 

sudo pip install --upgrade pip  

sudo pip install --upgrade virtualenv  

sudo pip install scrypt construct==2.5.2(不进行这步汇报参数错误)


三、在本目录下运行这段python脚本

example:

python genesis.py  -z "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks" -n 2083236893 -t 1231006505 

参数可自己选择

Options:
  -h, --help show this help message and exit
  -t TIME, --time=TIME  the (unix) time when the genesisblock is created
  -z TIMESTAMP, --timestamp=TIMESTAMP
     the pszTimestamp found in the coinbase of the genesisblock
  -n NONCE, --nonce=NONCE
     the first value of the nonce that will be incremented
     when searching the genesis hash
  -a ALGORITHM, --algorithm=ALGORITHM
     the PoW algorithm: [SHA256|scrypt|X11|X13|X15]
  -p PUBKEY, --pubkey=PUBKEY
     the pubkey found in the output script
  -v VALUE, --value=VALUE
     the value in coins for the output, full value (exp. in bitcoin 5000000000 - To get other coins value: Block Value * 100000000)
  -b BITS, --bits=BITS
     the target in compact representation, associated to a difficulty of 1

制作莱特币的时候要加scrypt

example:

python genesis.py -a scrypt -z "NY Times 05/Oct/2011 Steve Jobs, Apple’s Visionary, Dies at 56" -p "040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9" -t 1317972665 -n 2084524493


接下来耐心等就可以啦,难度调的大的话可能要等数小时,看运气吧。贴张结果图:

四、把得到的值填入源码就可以制作自己的创世区块啦

你可能感兴趣的:(快速制作创世区块)