Bitcoinのdifficultyについて。regtest、testnetモードでの採掘にかかる時間の違い 〜 採掘11

技術メモ

前回の記事 で、testnetで採掘する所まで動かしたので、regtest、testnetモードでのそれぞれの採掘時間の違いをロジックで見ていく

採掘難易度(ディフィカルティー)

採掘難易度を決める採掘難易度(ディフィカルティー)の違いが、regtestとtestnetでは違うと思われるため、深ぼっていく。

ちなみにdifficulty説明ページ

testnetのdifficultyは以下の値

$ bitcoin-cli getdifficulty
858585.2686224855

一方regtestはというと

$ bitcoin-cli getdifficulty
4.656542373906925e-10 # 0.0000000004・・・ になる。相当低い

ntgbtminer.pyでは、

            # Check if it the block meets the target target hash
            if block_check_target(block_hash, target_hash):
                block_template['nonce'] = nonce
    :

の block_check_target 部分で 正しく計算されたかどうか判定しており、

            # Check if it the block meets the target target hash
            if block_check_target(block_hash, target_hash):
                block_template['nonce'] = nonce
    :

block_hashの値が、target_hashの値より低ければTrueを返している。

# Check if a block header hash meets the target hash
#
# Arguments:
#       block_hash: (string) block hash in big endian binary
#       target:     (string) target in big endian binary
#
# Returns true if header_hash meets target, false if it does not.
def block_check_target(block_hash, target_hash):
    # Header hash must be strictly less than or equal to target hash
    for i in range(len(block_hash)):
        if ord(block_hash[i]) == ord(target_hash[i]):
            continue
        elif ord(block_hash[i]) < ord(target_hash[i]):
            return True
        else:
            return False

このため、target_hashの値次第で難易度が変わる事になる。

target_hashはどう作られているかというと

    # Compute the target hash
    target_hash = block_bits2target(block_template['bits'])

getblocktemplateで得られたbitsの値をもとに、target_hashを以下のロジックで作成。

# Convert block bits to target
#
# Arguments:
#       bits:       (string) compressed target in ASCII Hex
#
# Returns a target in big endian binary
def block_bits2target(bits):
    # Bits: 1b0404cb
    # 1b -> left shift of (0x1b - 3) bytes
    # 0404cb -> value
    shift = ord(hex2bin(bits[0:2])[0]) - 3
    value = hex2bin(bits[2:])

    # Shift value to the left by shift (big endian)
    target = value + "x00"*shift
    # Add leading zeros (big endian)
    target = "x00"*(32-len(target)) + target

    return target

なんで、bits次第で易しくなったり難しくなったりする。

採掘をしていくと、このbitsによって採掘が難しくなっていくと思うんだが、どういう原理なんだろうか?

そのあたりは、先ほど紹介した
https://en.bitcoin.it/wiki/Difficulty
にありそうなので、ここを詳しく読み込んでいく。

Sponsored Link
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


仮想通貨全般
TendermintをDocker使って起動してみる

以前、勉強会に行ってきた際にTendermintの事を聞いて ブロックチェーンプロトコルが実装できる …

仮想通貨全般
Bitcoinのdifficultyを決めるnBitsを理解する

マイニングする際の理解を深めようと思い、マイニング難易度(difficulty)を決めるnBitsに …

仮想通貨全般
EOS Night Meetupにいってきた

今回は、以前からEOSに興味があったので EOS Night Meetupにいってきました。 暗号通 …