Angular, Blockchain, Science とか

Angular, Blockchain, Science全般 の情報を主に書いていきます。

proof-of-work のpython スクリプト

Mastering Bitcoinの proof-of-work アルゴリズムのPythonスクリプトにコメントをつけてみました。

特に難しくはないですね。

import hashlib 
import time

max_nonce = 2 ** 32 # 4 billion

def proof_of_work(header, difficulty_bits):
    
    # target は difficulty target のこと
    # target = 0x10000000000...の場合
    # 0x1000000000... より小さい値のハッシュが見つかるまで
    # nonce をループさせる
    target = 2 ** (256 - difficulty_bits)
    
    for nonce in xrange(max_nonce):
        hash_result = hashlib.sha256(str(header)+str(nonce)).hexdigest()
        
        if long(hash_result, 16) < target:
            print "Success with nonce %d" % nonce
            print "Hash is %s" % hash_result
            return (hash_result, nonce)
        
    print "Failed after %d (max_nonce) tries" % nonce
    return nonce

#if __name__ == '__main__': 今回はrepl.itで実行してるので省略 

nonce = 0
hash_result = ''

# difficulty が高くなるほどマイニングに時間がかかる=難しくなる
for difficulty_bits in xrange(32):
    difficulty = 2 ** difficulty_bits
    print "Difficuty: %ld (%d bits)" % (difficulty, difficulty_bits)
    print "starting search..."
    
    # マイニングにかかるスピードを計る
    start_time = time.time()
    
    # new_blockがheaderになる header + nonce でハッシュをとる
    new_block = 'test block with transactions' + hash_result
    
    # proof-of-work 実行
    (hash_result, nonce) = proof_of_work(new_block, difficulty_bits)
    
    end_time = time.time()
    elapsed_time = end_time - start_time
    
    # マイニング時間表示
    print "Elapsed Time : %.4f seconds" % elapsed_time
    
    # nonce を マイニングにかかった時間で割ったのがハッシュパワー
    if elapsed_time > 0:
        hash_power = float(long(nonce)/elapsed_time)
        print "Hashing Power: %ld hashes per second" % hash_power