getblocktemplate

提供: tezos-wiki
移動先: 案内検索

getblocktemplateは、2012年半ばにBitcoinコミュニティによって公開された、新しい分散型Bitcoinマイニングプロトコルです。 古いネットワークマイニングプロトコルに代わるものです。

テンプレート:TOC制限

なぜ作品が変わるのですか?[編集]

地方分権[編集]

オリジナルのネットワーク・マイニング・プロトコルは、単にマイナーが解決するためのブロック・ヘッダーを発行します。 鉱夫はこのブロックに実際に何があるかについて暗闇の中に保持され、それに影響を与えません。 事実、どの取引が受け入れられるかを決定するための鉱夫の権限は、すべて盲目的にプール運営者に移転される。 壊れた(または危殆化した)プールオペレータは、すべての鉱夫の複合ハッシュ・パワーを使用して、二重使用攻撃または他の同様の攻撃を実行することができます。

getblocktemplateはブロックの作成をマイナーに移し、プールには参加ルールを設定する方法を与えます。 プールはこれらのルールで表現することで以前と同じようにできるが、鉱夫は暗闇の中で保管することはできず、鉱業に参加するものを自由に選択することができる。 これにより、ブロックを再度分散化することで、Bitcoinネットワークのセキュリティが向上します。

ASIC[編集]

オリジナルのネットワークプロトコルは、合計約4GHのマイニングに十分な単一のブロックヘッダーしか提供しません。 「ロールタイム(roll-roll)」延長により、これは1秒当たり4GH *に拡張することができますが、ハイエンドでは1000GH / sの次世代鉱山機器(ASIC)にはそれほど遠くありません。

ブロックの作成を鉱夫に移すことで、ローカルで必要なだけの作業を可能にし、この制限を克服します。

スケーラビリティ[編集]

スケーラビリティの問題から、ビットコインドのJSON-RPCスタックは、今日のソロ・マイニングに必要なハッシュ・レートに追いつくことができませんでした。 getblocktemplateは、ネットワーク上の新しいブロックごとに単一の要求に必要な負荷を大幅に削減するため、ビットコントの直接ソロ・マイニングも可能です。 Poolserversは同様に、独自のブロックを作ることができる鉱夫の需要をはるかに満たさなくてはならないというメリットがあります。

拡張可能[編集]

オリジナルのネットワークプロトコルは、拡張機能とは非常に互換性のない方法で設計されていました。 その結果、新しい機能が必要になったとき、拡張機能はHTTPヘッダーを使用して帯域外で「ハッキング」されました。 getblocktemplateは、将来の拡張のために柔軟に設計されており、 BIP 23仕様はすでに、トランスポートプロトコルに関係なく、確立されたネットワーク拡張機能をきれいに実装する方法をカバーしています。

使い方[編集]

鉱夫のために[編集]

GBTをサポートする鉱山ソフトウェア:

getblocktemplateを利用するには、互換性のあるプールも必要です。

プールオペレータの場合[編集]

参照:プールサーバー

独自のプールサーバーを実装している場合は、#プールサーバー開発のためのプールプールソフトウェアを参照してください。

開発者のために[編集]

マイニングソフトウェア[編集]

libblkmaker(Cライブラリ)を使う[編集]

あなたの鉱夫がCライブラリを含むことができるなら、あなたはlibblkmakerを利用してGBTの解釈をすべて行うことができます: あなたの鉱夫は、ネットワーキング(libblkmakerはあなたのためにJSONを準備することができます)を処理し、libblkmakerにデータを要求します(ブロックヘッダーを検索する必要があります)。 libblkmakerはSHA256の実装を提供しておらず、あなたの鉱夫はそれを実現する必要があることに注意してください。 libblkmakerは現在、 Jansson JSON libraryのみをサポートしていますが、他のユーザーに簡単に移植できるように設計されています。 Luke Dashjrは、リクエストに応じて他のJSONライブラリへのこの移植を無償で行います。

python-blkmakerを使う[編集]

あなたの鉱夫がPythonで書かれている場合、libblkmakerのネイティブPythonポートであるpython-blkmakerを利用して、GBTの解釈をすべて行うことができます: あなたの鉱夫は、ネットワーキング(python-blkmakerはあなたのためにJSONを準備することができます)を処理し、blkmakerモジュールにデータを要求します(ブロックヘッダーを検索する必要があります)。 CPUマイニングを使用して準備された共有を見つける短いサンプルのPythonスクリプトが含まれています。

最初から[編集]
マイナーリクエストブロックテンプレート[編集]

参加を開始するには、鉱夫がプールに連絡し、初期テンプレートを要求します。  {"id":0、 "method": "getblocktemplate"、 "params":[{"capabilities": "coinbasetxn"、 "workid"、 "coinbase / append"}}}}

サーバーは、マイニングブロックをすぐに開始するのに必要な詳細情報をすべて返します。  {   "error":null、   "result":{     "coinbasetxn":{       "data": "0100000001000000000000000000000000000000000000000000000000000000  0000000000ffffffff1302955d0f00456c6967697573005047dc66085fffffffff02fff1052a01  0071  a9147c866aee1fa2f3b3d5effad576df3dbf1f07475588ac00000000 "     }、     "previousblockhash": "000000004d424dec1c660a68456b8271d09628a80cc62583e5904f5894a2483c"、     "transactions":[]、     "expires":120、     "target": "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"、     "longpollid": "何かばかげた"     "height":23957、     "バージョン":2、     "curtime":1346886758、     "mutable":["coinbase / append"]、     "bits": "ffff001d"   }、   "id":0  }

コインベース取引を構築する方法[編集]

プールが "変更可能"キーにそれを含めることによって "coinbase / append"突然変異を許可している場合、extinonceのような鉱山者が望む任意のデータを追加するためにcoinbaseトランザクションを再構築することができます。コインベースのデータが100バイトのハードリミットをオーバーフローしない限り長くしてください。 サーバが "coinbase / append"を許可していない*か、あるいは変更したくない場合は、この手順を完全にスキップすることができます:)

コインベースのデータは、コインベーストランザクションの正確に42バイト後に常に開始されます。 42バイト目(データの直前のバイト)はデータの長さです。 したがって、コインベースのデータに追加する場合は、42 + DataLenバイトをトランザクションに挿入し、挿入されたデータの長さだけ42バイト目をインクリメントします。

Pythonの例:  import binascii  coinbase = binascii.a2b_hex(テンプレート['coinbasetxn'] ['data'])  extradata = b'myブロック '  #以下はPython 2とPython 3の両方でよりうまくいくかもしれませんが、この方法は両方の  origLen = ord(coinbase [41:42])  newLen = origLen + len(extradata)  coinbase = coinbase [0:41] + chr(newLen).encode( 'ascii')+コインベース[42:42 + origLen] +エクストラデータ+コインベース[42 + origLen:]

メルクルルートの構築方法[編集]

サーバーによって提供される "トランザクション"リストの前にコインベーストランザクション(変更されているかどうか)を収集します。 リスト内の各トランザクションにdouble-SHA256ハッシュを適用します。

今度は、リストに1つ以上のハッシュが残っている限り、各ペアを調べて一緒にハッシュします。 つまり、最初の2つのSHA256を連結し、次の2つを繰り返すなどです。 奇数のペアが発生した場合(つまり、ハッシュリストが1つのアイテムで終わり、ペアリングがない場合)、それを連結してハッシュします。 ハッシュが1つだけ残るまで続行します。 それはあなたのメルクルの根です。

Pythonの例:  import hashlib  def dblsha(data):   hashlib.sha256(hashlib.sha256(data).digest())。digest()    テンプレート内のtxnlist = [coinbase] + [binascii.a2b_hex(a ['data'])['transactions']]  merklehashes = [txnlistのtのdblsha(t)]  len(merklehashes)> 1:  もしlen(merklehashes)%2:  merklehashes.append(merklehashes [-1])   範囲(0、len(merklehashes)、2)のiについてmerklehashes = [dblsha(merklehashes [i] + merklehashes [i + 1])]  merkleroot = merklehashes [0]

ブロックヘッダを構築する方法[編集]

ブロックテンプレートで提供されたデータを独自のMerkleルートと共に使用して、Bitcoin ブロックハッシュアルゴリズムにレイアウトされたブロックヘッダーをアセンブルします。 鉱夫は "バージョン"番号を確認することが期待され、サーバーが "バージョン/フォース"または "バージョン/リダクション"の突然変異でそうするように指示しない限り、理解できないバージョンのブロックを作成すべきではないことに注意してください。 それらをサポートする必要がありますが、サーバーが提供しているバージョンをサポートしていない場合、未知の将来のルールに合致しない場合、サーバーが送信を拒否する可能性があることを理解してください。

Pythonの例:   構造体をインポートする   blkheader = struct.pack( '<I'、テンプレート['version'])+ \               binascii.a2b_hex(テンプレート['previousblockhash'])+ \               merkleroot + \               struct.pack( '<I'、template ['curtime'])+ \               binascii.a2b_hex(テンプレート['bits'])+ \               b'NONC '

あなたが採掘している間[編集]

すべてのブロックを自分で作成しているので、無効になるまで別のテンプレートを取得する必要はありません。 一般的には、より多くのトランザクションを取得するためには、もっと頻繁にリフレッシュすることをお勧めしますが、その間に何が変更されたかを知っているため、プールでいつ行うかを決定する方がよいでしょう。

テンプレートに "longpollid"キーが含まれている場合は、変更する必要があるとプールが判断した時点で新しいテンプレートのリクエストをキューに入れることができます。 これは、他のテンプレート要求と同じですが、要求にプールが提供する "longpollid"パラメータを含めることを除いては同じです。 すでに新しいテンプレートがある場合は、プールがすぐに応答する可能性があるので、遅延に頼らないようにしてください。

したがって、最初に使用したテンプレート要求を修正するために、次のように使用します。   {"id":0、 "method": "getblocktemplate"、 "params":[{       "能力":["coinbasetxn"、 "workid"、 "coinbase / append"]、       "longpollid": "何かばかげた"   }]}

株式の提出[編集]

鉱夫は、要求された難易度を満たすジョブを見つけると、そのブロックをシェアとしてサーバに提出することができます:  {"id":0、 "method": "submitblock"、 "params":[       "020000003c48a294584f90e58325c60ca82896d071826b45680a661cec4d424d00000000  de6433d46c0c7f50d84a05aec77be0199176cdd47f77e344b6f50c84380fddba66dc47501d00ff  ff0000010001010000000100000000000000000000000000000000000000000000000000000000  00000000ffffffff1302955d0f00456c6967697573005047dc66085fffffffff02fff1052a0100  00001976a9144ebeb1cd26d6227635828d60d3e0ed7d0da248fb88ac01000000000000001976a9  147c866aee1fa2f3b3d5effad576df3dbf1f07475588ac00000000 "  ]}

ブロックデータをアセンブルするには、ブロックヘッダ、[[プロトコル仕様#可変長整数| Bitcoin varint形式]でエンコードされたトランザクションの数を連結し、ブロック内の各トランザクション(コインベースで始まります)を続けます。 サーバが "mutable"キーに "submit / coinbase"と表示されている場合は、コインベースの後にトランザクションを省略することもできます。

Pythonの例:  def varintEncode(n):    n <0xfdの場合:      戻り値struct.pack( '<B'、n)    #注:技術的には、より大きい数字のためのより多くのエンコーディングがあります。    #16ビット、トランザクション数はバージョン2のそれほど高くないBitcoin    #ブロック    return b '\ xfd' + struct.pack( '<H'、n)  blkdata = blkheader + varintEncode(len(txnlist))+ coinbase  template.get( 'mutable'、())にない 'submit / coinbase'の場合:    txnlist [1:]のtxnの場合:      blkdata + = txn

プールサーバーソフトウェア[編集]

推奨される基準(重要度順):

技術仕様[編集]

歴史[編集]

Getblocktemplateの起源は、forrestrestのgetmemorypoolに向かい、ビットコインドのためのJSON-RPCメソッドをトレースします。 Bitcoinネットワークに害を与えないように、彼のプール([P2Pool])がビットコンドにピギーバックできるように作成しました(この時点までは、決してトランザクションを確認しなかった空のブロックだけを採掘しました)。 Luke-Jrはプッシュプール/ビットコンドのスケーラビリティ問題を数ヶ月間彼のプール([[Eligius])と戦ってきたので、getmemorypoolを使って高速プールサーバーを実装して独自のブロック生産を行った(これは[Eloipool] 、この最初のオープンソースは独自のブロックプールサーバーを作ります)。 他のプール・サーバーも、次の月にgetmemorypoolを使用してブロック作成を実装しました。

ほぼ同じ時期に、プール鉱業の分散化への関心が注目されました。 BitPennyは最初に数ヶ月前に独自の分散型鉱業プロキシをリリースしていたが[P2Pool]の実装は急速に普及した。 Bitcoinのマイニングプロトコルに関わる人なら誰でも、ブロック作成の制御を鉱夫の手に戻す必要があることが分かります。 残念ながら、BitPennyP2Poolの両方は、分散化を実装するために非常にプール固有のプロプライエタリプロトコルを使用していました。 一方で、getmemorypoolは、タスクに完全に適合していました。これは、時間の経過とともにネットワークプロトコルを中心に開発された現在普及しているプールされたマイニング拡張をサポートしていませんでした。

2012年2月、LukeはEloipool(および[[Eligius])でgetmemorypoolマイニングのサポートの最初の草案を実装し、[https://bitcointalk.org/?topic=23768.msg774497#msg774497を展開しました)概念実証ネットワークプロキシ(現在はgmp-proxyと呼ばれています)を使用して、汎用分散型マイニングプロトコルとして機能するために必要に応じてリビジョンを追加します。 彼はそれが働いていたことを確認した後、2月28日のレビューのためにBitcoin開発メーリングリストに文書化して提案しました。そこでは何が欠落していて何が変更され、明確化されるべきかについて議論が始まりました。 数ヶ月の間に、開発者とテスターの両方の多くの人々が建設的な批判と示唆を提供し、それが標準に組み込まれました。 Lukeはまた、プール運営者やプールサーバーの作者の間でも、特にASICの「マイニング・ジェネレーション」に移行する必要が生じたときに、標準の開発への参加を積極的に促しました。 最終的に、より適切な "getblocktemplate"という名前に名前を変更し、簡単にするためにgetmemorypoolとの後方互換性を落とすことが最善であると判断されました。 標準は2つに分割され、技術仕様は BIP 22 BIP 23にあります。

関連項目[編集]