ストラタムプロトコルは現在、マイナーとマイニングプール間で最も一般的に使われているTCP通信プロトコルです。 マイニングのネットワークアーキテクチャを簡単に説明しましょう。
1. マイニングのネットワークアーキテクチャ
ビットコインは、ビットコインデーモンを搭載したノードを設置することで新しい取引やブロックを転送する分散型ネットワークアーキテクチャです。 マイニングマシンやマイニングプールもまた、マイナーネットワークと呼ばれる別のネットワークを形成しています。
マイナーネットワークはマイニングマシン、マイニングプール、ウォレットなど複数の主要な部分に分かれており、時にはマイニングプールソフトウェアがウォレットと一緒にインストールされることもあり、これらは総称してマイニングプールと呼ばれます。
マイニングマシンとマイニングプールソフトウェア間の通信プロトコルはストラタムであり、マイニングプールソフトウェアとウォレット間の通信はビットコインRPCインターフェースです。
stratumはJSONデータ形式であり、具体的なプロトコルは以下の通りです。
2. 層合意
1. タスクのサブスクリプション
マイニングマシンが起動すると、まずmining.subscribeメソッドを使ってマイニングプールに接続し、作業を購読します。
プールはサブスクリプション番号、ExtraNonce1、そしてmining.notifyでExtraNonce2_sizeを返します。
Client:{"id":1,"method":"mining.subscribe","params":[]}
Server:{"id":1,"result":[["mining.notify","ae6812eb4cd7735a302a8a9dd95cf71f"],"08000002",4],"error":null} その中で:
AE6812EB4cd7735A302A8A9DD95CF71Fはサブスクリプション番号です。
08000002はExtraNonce1で、coibaseトランザクションを構築するために使われます。
ExtraNonce2_sizeは4で、マイナーのExtraNonce2カウンターのバイト数を表します。
2. タスク割り当て
このコマンドはマイニングプールから定期的にマイナーに送信され、マイニングマシンがmining.subscribeメソッドで登録すると、マイニングプールは即座にmining.notifyとしてタスクを返します。
Server:{"params":["bf","4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000", "010000000100000000000000000000000000000000000000000000000000000000000000 00ffffffff20020862062f503253482f04b8864e5008", "072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000",["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12"], "00000002","1c2ac4af","504e86b9",false],"id":null,"method":"mining.notify"} その中で:
タスク番号:「bf」;
前回のブロックHASH:
「4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e000000000」; Coinbase パートI:
「010000000100000000000000000000000000000000000000000000000 00000000000000000ffffffff20020862062f503253482f04b8864e5008」; Coinbase パート2:
「072f736c7573682f0000000000100f2052a010000001976a914d23fcdf86f7 e756a64a7a9688ef9903327048ed988ac0000000000」; トランザクションIDリスト:
["C5bd77249E27C2D3A3602dd35C3364a7983900b64a34644d03b930bfdb19C0e5", "049b4e78E2D0B24F7C6A2856AAA7B41811ed961ee52777F9E80043FD2F12"]; ブロックバージョン番号:「00000002」;
nBit:”1c2ac4af”;
現在の時間:「504e86b9」;
清掃作業:もしそうであれば、マイナーはすべての作業を中止し、すぐに新しい作業を開始します。 もし違う場合は、現在のタスクが終了するまで新しいタスクを始めません。
3. マイニングマシンログイン
マイナーはmining.authorizeメソッドを使って特定のアカウントとパスワードでマイニングプールにログインします。パスワードが空でも、マイニングプールがtrueを返してログイン成功します。 この方法は接続を初期化した直後に行う必要があり、そうでなければマイナーはプールタスクを取得できません。
Client:{"params":["miner1","password"],"id":2,"method":"mining.authorize"}
Server:{"error":null,"id":2,"result":true} 4. 結果を提出する
マイナーが正当なシェアを見つけると、「mining.submit」メソッドでタスクをプールに提出します。 プールがtrueを返すとコミットは成功し、失敗すればエラーには特定の理由があります。
Client:{"params":["miner1","bf","00000001","504e86ed","b2957c02"],"id":4,"method":"mining.submit"}
Server:{"error":null,"id":4,"result":true} その中で:
ユーザー名:「miner1」;
タスク番号:「bf」;
ExtraNonce2:「00000001」;
現在の時間:「504e86ed」;
nonce:”b2957c02″;
5. 難易度調整
難易度調整はマイニングプールからマイニングマシンに発行され、難易度をmining.set_difficulty方法で調整し、難易度値はパラメータに表されます。
Server:{"id":null,"method":"mining.set_difficulty","params":[2]} マイナーは新しい難易度を次のタスクに適用し、プールは時折すぐに新しいタスクを発行し、クリーンアップタスクをtrueに設定してマイナーがすぐに新しい難易度に取り組めるようにします。
3. 一般的なコミュニケーションプロセス
マイニングマシンとマイニングプール間の一般的な通信プロセスは以下の通りです。
|