新しい getwork

m0mchil の getwork を再設計して SVN rev 189(バージョン 31601)にアップロードした。

m0mchil の外部ビットコインマイナーのアイデアは多くの問題を解決した。GPU プログラミングは未成熟でコンパイルが難しく、ビルドに追加の依存関係を加えたくなかった。getwork により、異なるハードウェアや OS に対して異なるプログラムで、これらの問題を個別に解決できる。サーバーファームが単一の Bitcoin ノードを実行し、残りは getwork クライアントだけを実行できるのも便利だ。

インターフェースにいくつかの変更がある:

getwork [data]
[data]が指定されていない場合、作業用のフォーマット済みハッシュデータを返す:
“midstate” : データの前半をハッシュした後の事前計算されたハッシュ状態
“data” : ブロックデータ
“hash1” : 2回目のハッシュ用のフォーマット済みハッシュバッファ
“target” : リトルエンディアンのハッシュターゲット
[data]が指定された場合、ブロックの解決を試み、成功した場合は true を返す。[data]は”data”フィールドで返されたのと同じ 128 バイトのブロックデータだが、ナンスが変更されている。

注意:

  • 候補を送信した時には work を返さない。パラメーターなしで呼び出した時のみだ。
  • block フィールドは data と hash1 に分離された。
  • data は 128 バイトで、midstate ですでにハッシュされた前半を含む。
  • hash1 は常に同じだが、便利のために含まれている。
  • “ThreadRPCServer method=getwork”のログは無効化されている。ログにゴミが多すぎるためだ。

いいね、これで大量のパッチ作業が省ける 😊

davout 2010年11月23日 20:42 UTC 原文 ·

それは素晴らしい。 GPU マイナーが既に使用しているパッチ済みクライアントのドロップイン置換になるのだろうか?

nelisky 2010年11月23日 20:43 UTC 原文 ·

外部マイナーのユースケースは理解するが、オールインワンのアプローチの方が好みだ。自分のマイニングコードをコンパイルに含めることはまだできるだろうか? あなたが以前導入した刷新されたインターフェースは本当に気に入っていたので、引き続き使いたい。

完全なドロップイン置き換えではない。インターフェースを少し整理したかったのだ。必要な変更はわずかだ。

ScanHash_関数はなくならない。ちなみに、このインターフェースの設計はその関数のパラメーター(midstate、data、hash1)を反映するように設計されている。

davout 2010年11月23日 22:39 UTC 原文 ·

ところでサトシ、git を試してみるべきだ。svn よりずっと良いぞ。特にパッチやフォークがたくさん飛び交っているときはなおさらだ =)

素晴らしい。これで俺のパッチのひとつが完全に不要になる。

外部 CPU マイナーに取り組みたい気持ちもある……

C 言語で簡単な CPU マイナーの作成を開始した。主にデモンストレーション用で、getwork を理解するためだ。

リポジトリは git://github.com/jgarzik/cpuminer.git

実装は完了しているが……動作しないので、あまり興奮しないでほしい。ByteReverse(またはその不在)に関して何か奇妙なことが起こっていると思う。「data」と「ナンス」をバイトリバースする必要があるかどうか、またどのようにするかがまったく不明確だ。

DiabloD3 2010年11月24日 11:31 UTC 原文 ·

サトシ、getwork の実装を m0mchil の仕様に準拠するように修正してほしい

m0mchil 2010年11月24日 11:56 UTC 原文 ·

その必要はない、自分がマイナーを準拠するように変更する。今少し忙しいだけだ。

ジェフ・ガージックの投稿(2010年11月23日 19:47 UTC)

C言語で簡単なCPUマイナーの作成を開始した。主にデモンストレーション用で、getwork を理解するためだ。

getwork がバイト反転を行う。midstate、data、hash1 はすでにビッグエンディアンで、data を返す時もビッグエンディアンのままなので、ビッグエンディアンで作業し、バイト反転は不要だ。これらは ScanHash_関数に渡されるのと同じデータだ。midstate、data、hash1 を 16 バイトアラインされたバッファに入れて ScanHash_関数に渡すことができる。例えば ScanHash(pmidstate, pdata + 64, phash1, nHashesDone)のように。ナンスが見つかったら data にパッチして getwork を呼び出す。

ScanHash_関数が pdata + 64 ではなく pdata を使うように変更して一貫性を持たせるべきかもしれない。

target はリトルエンディアンで、m0mchil のものと同じ方法のはずだ。(もし違えば修正すべきだ)バイト反転を使う唯一のケースだ。こんな感じだと思う:if ByteReverse((unsigned int*)hash[6]) < (unsigned int*)target[6]。

DiabloD3の投稿(2010年11月24日 02:31 UTC)

サトシ、getwork の実装を m0mchil の仕様に準拠するように修正してほしい

これが新しい仕様だ。マイナーをこれに対応させるのは難しくないはずだ。

変更点:

  • 候補を送信した時に work を返さない。パラメーターなしで呼び出した時のみだ。
  • block フィールドが data と hash1 に分割された。
  • 一貫性のため state を midstate に改名。
  • extranonce は不要になった。

問題がわかった。自分の SHA256 アルゴリズムが入力をビッグエンディアンにバイトスワップしていたが、すでにビッグエンディアンだった。

この新しい CPU マイナーの最初のバージョンについてはこちらで説明している:topic 1925

DiabloD3 2010年11月26日 21:17 UTC 原文 ·
サトシ・ナカモトの投稿(2010年11月24日 08:21 UTC)
  • ヒットの可能性を送信した際にワークを返さず、パラメーターなしで呼び出された場合にのみ返す。

送信したものが実際にヒットだったかどうかを返してくれると非常に助かる。健全性チェックにより、マイナーの問題をデバッグしやすくなる。

それがまさにその動作だ。true/false を返す。

balboah 2010年11月26日 22:51 UTC 原文 ·
davoutの投稿(2010年11月23日 20:42 UTC)

それは素晴らしい。 GPU マイナーが既に使用しているパッチ済みクライアントのドロップイン置換になるのだろうか?

同意する。しかも何も移行せずに svn リポジトリと一緒に使うことすらできる。

DiabloD3 2010年12月4日 19:27 UTC 原文 ·

俺のマイナーは新しい getwork を使うように更新された。