新しい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バイトのブロックデータだが、nonceが変更されている。
注意:
- 候補を送信した時にはworkを返さない。パラメータなしで呼び出した時のみだ。
- blockフィールドはdataとhash1に分離された。
- dataは128バイトで、midstateですでにハッシュされた前半を含む。
- hash1は常に同じだが、便利のために含まれている。
- “ThreadRPCServer method=getwork”のログは無効化されている。ログにゴミが多すぎるためだ。
完全なドロップイン置き換えではない。インターフェースを少し整理したかったのだ。必要な変更はわずかだ。
ScanHash_関数はなくならない。ちなみに、このインターフェースの設計はその関数のパラメータ(midstate、data、hash1)を反映するように設計されている。
Quote from: jgarzik on November 24, 2010, 04:47:42 AMByteReverseに何か奇妙なことが起きている(あるいは不足している)のではないかと思います。‘data’と’nonce’をバイト反転する必要があるかどうか、どのようにするかがかなり不明確です。 getworkがバイト反転を行う。midstate、data、hash1はすでにビッグエンディアンで、dataを返す時もビッグエンディアンのままなので、ビッグエンディアンで作業し、バイト反転は不要だ。これらはScanHash_関数に渡されるのと同じデータだ。midstate、data、hash1を16バイトアラインされたバッファに入れてScanHash_関数に渡すことができる。例えばScanHash(pmidstate, pdata + 64, phash1, nHashesDone)のように。nonceが見つかったらdataにパッチしてgetworkを呼び出す。
ScanHash_関数がpdata + 64ではなくpdataを使うように変更して一貫性を持たせるべきかもしれない。
targetはリトルエンディアンで、m0mchilのものと同じ方法のはずだ。(もし違えば修正すべきだ)バイト反転を使う唯一のケースだ。こんな感じだと思う:if ByteReverse((unsigned int*)hash[6]) < (unsigned int*)target[6]。
Quote from: DiabloD3 on November 24, 2010, 11:31:11 AMSatoshi、getworkの実装をm0mchilの仕様に準拠するように修正してください これが新しい仕様だ。マイナーをこれに対応させるのは難しくないはずだ。
変更点:
- 候補を送信した時にworkを返さない。パラメータなしで呼び出した時のみだ。
- blockフィールドがdataとhash1に分割された。
- 一貫性のためstateをmidstateに改名。
- extranonceは不要になった。