26

ビットコインサーバーでgetworkを呼び出すと、次のようになります。

./bitcoind getwork
{
    "midstate" : "695d56ae173bbd0fd5f51d8f7753438b940b7cdd61eb62039036acd1af5e51e3",
    "data" : "000000013d9dcbbc2d120137c5b1cb1da96bd45b249fd1014ae2c2b400001511000000009726fba001940ebb5c04adc4450bdc0c20b50db44951d9ca22fc5e75d51d501f4deec2711a1d932f00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000",
    "hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000",
    "target" : "00000000000000000000000000000000000000000000002f931d000000000000"
}

このプロトコルは文書化されていないようです。このデータからハッシュを計算するにはどうすればよいですか。このデータはリトルエンディアンだと思います。では、最初のステップはすべてをビッグエンディアンに変換することですか?それが終わったら、データのsha256を計算します。データは、それぞれ64バイトの2つのチャンクに分割できます。最初のチャックのハッシュはmidstateによって与えられるため、計算する必要はありません。

したがって、初期ハッシュ値としてミッドステートを使用して、チャンク#2をsha256でハッシュする必要があります。それが完了すると、32バイトのチャンク2のハッシュになります。このチャンクのハッシュをもう一度計算して、最終的なハッシュを取得します。

次に、すべてをリトルエンディアンに変換して作業を送信しますか?

hash1は何に使用されますか?

4

3 に答える 3

22

ハッシュ計算は、ブロックハッシュアルゴリズムで文書化されています。比較的単純な基本から始めましょう。基本的なデータ構造は、プロトコル仕様-ビットコインWikiに記載されています。プロトコル定義(および作業の定義)は、SHA-256ハッシュが、標準が示すビッグエンディアンではなく、256ビットのリトルエンディアン値であることを多かれ少なかれ想定していることに注意してください。も参照してください

Getworkはより複雑で、より深刻なエンディアン/バイト順序の混乱に遭遇します。

まず、getwork APIは、マイニングの初期ステップを高速化するように最適化されていることに注意してください。midstate値とhash1値はこれらのパフォーマンス最適化用であり、無視できます。「データ」を見てください。また、標準のsha256実装を使用する場合、「データ」の最初の80バイト(160桁の16進文字)のみがハッシュされます。

残念ながら、getworkデータ構造で提示されるJSONデータは、上記のブロック例のハッシュに必要なものとは異なるエンディアン特性を持っています。

彼らは皆、答えを得るためにソースに行くと言っていますが、C++ソースは大きくて混乱する可能性があります。簡単な代替手段は、pooled.pyコードです。ここでそれについての議論があります:テストのための新しいマイニングプール。「checkwork」ルーチンの最初の数行、および「bufreverse」関数と「bytereverse」関数を確認するだけで、バイトの順序を正しく設定できます。結局のところ、データの各32ビットセグメントのバイトを反転するだけです。はい-非常に奇妙です。しかし、エンディアンの問題は注意が必要であり、そのようになってしまう可能性があります。

「getwork」が機能する方法に関するその他の役立つ情報は、次のディスカッションで見つけることができます。

元のビットコインフォーラムで信号対雑音比を見つけるのは非常に困難になっていることに注意してください。現在、ビットコインと暗号通貨のStackExchangeサイトに関するArea51の提案が一般的にあります。是非ご参加!

于 2011-07-22T16:44:09.033 に答える
4

正しく聞こえます。ハッシュを計算するスクリプトがjavascriptにありますが、私はそれを完全には理解していないのでわかりません。見ればもっとよく理解できるかもしれません。

this.tryHash = function(midstate, half, data, hash1, target, nonce){  
    data[3] = nonce;
    this.sha.reset();

    var h0 = this.sha.update(midstate, data).state;   // compute first hash
    for (var i = 0; i < 8; i++) hash1[i] = h0[i];   // place it in the h1 holder
    this.sha.reset();                 // reset to initial state
    var h = this.sha.update(hash1).state;       // compute final hash
    if (h[7] == 0) {
      var ret = [];
      for (var i = 0; i < half.length; i++)
        ret.push(half[i]);
      for (var i = 0; i < data.length; i++)
        ret.push(data[i]);
      return ret;
    } else return null;
  };

出典: https ://github.com/jwhitehorn/jsMiner/blob/4fcdd9042a69b309035dfe9c9ddf716119831a16/engine.js#L149-165

于 2011-06-08T19:30:01.020 に答える
1

率直に言って、ビットコインブロックハッシュアルゴリズムは、どのソースからも公式に説明されていません。

「ハッシュ計算はブロックハッシュアルゴリズムで文書化されています。」

ハッシュ計算は、ブロックハッシュアルゴリズムで「記述」されます。

en.bitcoin.it/wiki/Block_hashing_algorithm

ところで、PHPのサンプルコードにはバグ(タイプミス)があります。Pythonのサンプルコードは、Windows XP 32用のPython3.3で実行するとエラーを生成します(string.decodeのサポートがありません)

于 2014-02-05T16:58:55.170 に答える