難易度の計算方法を平易な英語で説明してもらえますか?私はそれが特定の期間にわたるすべてのビットコインコミュニティのハッシュパワーの量に基づいて計算されていることを非常に大まかに理解しています。しかし、これは非常にあいまいです。
また、非常に急速に変化する可能性があることも理解しています。増やすことしかできませんか?それを計算または予測する方法はありますか?
詳細な回答をありがとう、MeniRosenfeld。私がすべてを正しくしたことを確認するためだけに。私はいつも要約していますが、最後の2016ブロックを生成するのにかかりました。そして、式を適用します。
コメント
- 回答へのコメントとして、フォローアップの質問の方が良いと思います。基本的には可能ですが、実際には合計は必要ありません。最後のブロックと前の2016ブロックのタイムスタンプを取得して減算するだけです。
回答
ビットコインの難易度は1から始まりました(それを下回ることはできません)。次に、見つかった2016ブロックごとに、ブロックのタイムスタンプを比較して、2016ブロックを見つけるのにかかった時間を調べます。これをTと呼びます。2016ブロックには2週間かかるため、Tが異なる場合は乗算します。難易度(2週間/ T)-このように、ハッシュレートが以前の状態のままである場合、2016ブロックを見つけるのに2週間かかります。
たとえば、10日しかかからなかった場合難易度が低すぎるため、40%増加します。
2016年のブロックを見つけるのに2週間もかからなかったかによって、難易度が増減する可能性があります。一般に、ネットワークハッシュレートが低下すると、難易度は低下します。
補正係数が4より大きい(または1/4より小さい)場合は、変更を防ぐために、代わりに4または1/4が使用されます。
実装にバグがあります。そのため、計算は2016年ではなく最後の2015ブロックを見つける時間に基づいています。修正するにはハードフォークが必要になるため、今のところ延期されています。
最近のブロックを見つける時間に基づいて、次の難易度の変更の大まかな見積もりを出すことができます。将来の難易度を確実に長期的に予測することはできませんが、為替レートの傾向、ムーアの法則、その他のハードウェアの進歩に基づいて、誰でも自由に推測できます。
コメント
- @StevenRoose:そうですが、コアコードにもっと関わっている人にコメントを任せます…これは別のSEの質問には十分です。
- 良い答えですが、1つは小さいですが、重要なポイントはわかりません。ネットワーク内のノードは、難易度についてどのように合意していますか?
- @deadalnix:ブロックの難易度は、データに基づく決定論的な計算です。すべてのノードが独立して同じ計算を実行し、同じ結果を取得します。
- @deadalnix:タイムスタンプはブロックの一部です。つまり、ブロックを見つけた人は誰でもブロックに何を入れるかを決定します。 。タイムスタンプは、過去11ブロックの中央値よりも早くする必要があります。また、ノードが2時間以上先にタイムスタンプを持つブロックを受信した場合、ジェクトし、伝播しないでください。
- @tobi:わかりました。以前のコメントはバグに関するもので、"エラー"は'がバグなので、'それについて話していると思いました。あ、はい。ハッシュレートが現在の約2140であると仮定すると、スケジュールは96週間、つまりほぼ2年早くなります。しかし、さらに別の影響があります。ハッシュレートが'それを正当化するのに十分ではなかったにもかかわらず、最初は難易度が1であったという事実によって引き起こされた遅延です。
回答
メニの回答は良いです。難易度の計算について、おそらく将来に役立つ実用的な詳細な方法をいくつか紹介したいと思います。この質問の回答のビュー。
サトシのジェネシスブロックヘッダー(関連情報の一部)を見てみましょう:
$ bitcoin-cli getblockhash 0 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f $ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f { ... "height": 0, ... "bits": "1d00ffff", "difficulty": 1, ... }
上記のように、ジェネシスブロックには「1」の難易度と「1d00ffff」のビットがあります。 ビットコインビットは「ターゲット」ハッシュ値を意味し、新しく生成されたブロックは条件を満たす必要があります。ブロックヘッダーのダブルSHA-256ハッシュ値はこれより小さくなければなりません「ターゲット」値。
ジェネシスブロックの「1d00ffff」ビット値は、「ターゲット」値を意味します。
[0x00000000,0xffff,{0x00..0x00}] {0x00..0x00} at above has 26 bytes 0x00.
次に、新しいブロックを見つけるには、ブロックハッシュ値の先頭が4バイトになるまで、その32ビットのnNonce値(およびnTimesとhashMerkleRootも)を検索する必要があります。ちなみに、nNonceはブロックヘッダー構造のフィールドの1つです。
struct header_structure{ // BYTES NAME uint32_t nVersion; // 4 version uint8_t hashPrevBlock[32]; // 32 previous block header hash uint8_t hashMerkleRoot[32]; // 32 merkle root hash uint32_t nTime; // 4 time uint32_t nBits; // 4 target uint32_t nNonce; // 4 nonce };
SHA-256アルゴリズム(および暗号的に安全なハッシュアルゴリズム)のため均一にランダムなシーケンスのように見える出力を生成します。実用的な「試行錯誤」方法は、条件を満たす新しいブロックを見つける唯一の方法です。 4バイトのゼロ先行ハッシュ値を持つブロックを見つける確率は1 /(2 ^ 32)です。つまり、平均の「試行錯誤」数は正確に2 ^ 32(つまり、4G)です。
この「ターゲット」ハッシュ値を人間が簡単に理解できるように、「難易度」という用語を定義します。これは、「ターゲット」条件を満たすブロックを見つけるための「試行錯誤」の平均数を意味します。そして、「difficulty」単位を定義します。1「difficulty」= 4Gハッシュ
次に、今日まで、ビットコインブロックチェーンの高さは501509に達します。そのヘッダーを見てみましょう:
$ bitcoin-cli getblockheader 0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147 { ... "height": 501509, ... "bits": "18009645", "difficulty": 1873105475221.611, ... }
ブロック501509のビット= 0x18009645、256ビット整数のコンパクトフォーマット、256ビットフォーマットは次のとおりです。
[0x00000000,0x00000000,0x009645,{0x00..0x00}] {0x00..0x00} at above has 21 bytes 0x00. that is 0x009645 * (256 ^ 21) The genesis block"s target is ( 0x00ffff * 256 ^ 26 )which is the difficulty unit "1.0". So, the difficulty = (0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21) = 65535/38469 * (256^5) = 1.703579505575918 * 2^40 = 1873105475221.611
これまでのところ、「難易度」の計算方法について詳しく説明しています。場合によっては、単純な形式 1.7Tも使用します。 難易度を言うと、上記の例では:
(1.703579505575918 * 2^40) = 1.703579505575918T 1T = 2^40 = 1024^4
コメント
- 1dは12月に29です(26ではありません)。SHSはSHAです
- @BorisIvanovに感謝し、タイプミスエラー
SHS
は修正されました。1d
は、実際には29ではなく26バイトのゼロテールを意味します。上記の詳細例をお読みください。 - そうです。重要
回答
2をあげたいここでは、現在のターゲットt
が与えられたブロックをマイニングする確率と対応する難易度d
との関係を明示することでセントビットコインコアで。
したがって、暗号化ハッシュ関数はランダムオラクル抽象化によって理想化されます[ https://en.wikipedia.org/wiki/Random_oracle] 。したがって、PoWで使用されるdoubleSHA256
ハッシュ関数の出力を、空間{0,1}^256
の均一変数、つまり256ビットの配列としてモデル化できます。 。したがって、単一のハッシュh
が有効なハッシュである確率は次のとおりです。
p = P(h < t) = t /( 2^{256} - 1 )
一方、d
は、@ garyが小数に変換する前に説明したように、次のように計算されます。
d = ( (2^{16} - 1) * 2^{8*26} ) / t = ( (2^{16} -1) * 2^{208} ) / t
実装は[ https://github.com/bitcoin/bitcoin/blob/master/src/rpc/blockchain.cpp] 、60行目、関数GetDifficulty
。実際、誰かがコードが上記の式にどのように正確にマッピングされているかを説明できれば、それは役に立ちます。次の2つの式を組み合わせると次のようになります。
d = ( (2^{16} -1) * 2^{208} ) / ( p * (2^{256} - 1) ) ~ 2^{-32} / p
この最後の式を分析するのが難しいのは、(32個のゼロビットで始まる256ビットを使用した2進表現を持つ最小の10進数)および現在のターゲットに基づいて有効なハッシュを取得する確率t
。これは、ジェネシスブロックで、難易度1 として16進ターゲット
0x1d00ffff 、256ビット数の32ビットコンパクト形式と呼ばれるもので表現されます。
A良い質問は、なぜこの特定のコンパクトなフォームがターゲットを表すために選ばれたのかということです。
コメント
- 賛成です!コンパクト形式は、ターゲットに最上位3バイトを提供しますが、最小の難易度では、最上位3バイトは00ffffです。