広告sp

ビットコイン ブロックチェーン

difficultyとtargetについて

更新日:

※この投稿はBitZenyではなくビットコインのお話です(たぶんBitZenyでも基本的な部分は同じかと思います)

targetとは?

targetとはブロックを認証する為に満たすべき閾値を指しています。

マイナーはnonce(使い捨てのランダムな値)を変えながらブロックヘッダのハッシュを計算し、targetを下回れば発掘となります。(認証されるかどうかはまた別ですが)

targetは16進数で例えば 0x1903a30c のように表現されます。これは先頭の8bitが指数部、残り24bitが仮数部で次のように計算されます。

target = 指数部 * 2^(8 * (仮数部 – 3))
target = 0x03a30c * 2^(0x08 * (0x19 - 0x03))^
target = 0x03a30c * 2^(0x08 * 0x16)^
target = 0x03a30c * 2^0xB0^
target = 0x0000000000000003A30C00000000000000000000000000000000000000000000

difficultyとは?

difficultyとは採掘難易度と表現されています。

あるtargetを1.0とした時の現在のtargetの比率と考えて構わないかと思います。difficulty は下記のように計算できます。

difficulty = difficulty_1_target / current_target
※difficulty_1_target = 0x1d00ffff = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

通常の計算方法では出すのが難しいので例えばpythonであれば下記のプログラムで算出できます。
print 0x00ffff * 2**(8*(0x1d - 3)) / (float)(0x03a30c * 2**(8*(0x19 - 3)))
1180923195.25802612

difficultyの調整

difficultyは特定の周期で調整(Retargeting)されます。この計算は下記のようになります。ビットコインは2週間で2016ブロックになるように調整がかかるという計算ですね。

New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)


2018/01/20 追記

冒頭でBitZenyも基本同じと書いてますが、どうも微妙な調整が入っているように見えます。

ただ正確な背景までは調査しきれなかったのでメモ程度に記しておきます。

stratum-miningやminerdの処理ではLiteCoinやBitZenyの difficulty_1_target は 0x0000FFFF00000000000000000000000000000000000000000000000000000000 で計算している模様。ただ、bitzenyd は 0x00000000FFFF0000000000000000000000000000000000000000000000000000 で算出していると思われる。あくまでも満たすべきtargetはbitsから判断し、認識しやすい指標としてdifficultyが使われているのであればそれぞれが違う解釈をしていてもうまくいくケースはあると思います。考えてみたり調べてみたけど、結局分かりませんでした、無念。

-ビットコイン, ブロックチェーン

Copyright© みずたまりブログ , 2018 All Rights Reserved Powered by STINGER.