マージマイニング入門 1/3をまだご覧になってない方はぜひそちらからご覧ください!
ターゲット・ヒエラルキー
RSKブロックはビットコインブロックよりも生成頻度が高いため、一般に、RSKターゲットはビットコインターゲットよりも高くなります。また、RSKパズルの方が易しくなります。そのため、RSKのPoWパズルを解くビットコインブロック・ヘッダーがビットコインネットワークに受け入れられないこともあります。ただし、パズルの解決のためにビットコインヘッダーとの協力が必要な点、試行錯誤のプロセスが求められる点はどちらも共通しています。つまり、マイナーは難しいビットコインのパズルに挑む傍ら、頻繁に解かれるRSKパズルの検出と情報共有も行わなければならないということになります。不可能に思えるでしょう。しかし実際には、ビットコインの求める難度よりも低いブロックをマイナーが解決しようとし始めているのです。これらの中級難度のブロックは「シェア」と呼ばれ、プールサーバーはマイナーの貢献度を計算にこのシェアを必要とするのです。つまり、プールサーバーソフトウェアがマイナーに対し、よりシンプルなパズルを解くよう指示します。
シェアは本物のビットコインパズルを解くための中間的ソリューションのように思われるかもしれませんが、実態は異なります。シェアを拡張しても本物のブロックソリューションになることはできません。しかし、マイナーが強力であればあるほど、本物のソリューションまでの過程で多くのシェアをプール内で生成できます。つまり、シェアによって、マイナーの貢献度をより高い精度で計算できるようになります。シェアは定期的にプールサーバーに転送され、クライアント間で収益を公平に分割できるよう、サーバーがマイナーのハッシュ貢献度などを比較検討します。また、シェアが(偶然)その際のビットコインPoWパズルのソリューションである可能性もあるため、その発見の意味もありシェアが転送されるのです。そのため、マイナーは実際のビットコインPoW難度(あるいはターゲット)をプールサーバーから受け取る必要はありません。マイナーは通常、プールからお知らせがあるまでビットコインブロックを解いたかどうかもわからないということです。
プールサーバーは受信した全てのシェアをチェックし、ブロックヘッダーを再構築します。ヘッダーのSHA256ダブルハッシュ・ダイジェストが既存のBitcoinの難度に基づくターゲットよりも数値的に低い場合、ブロックは「bitcoindデーモン」に転送されネットワーク中に拡散されます。サイドチェーンはそれぞれ異なる難度を持つため、有能なマージマイニングプールサーバーは1つ1つのサイドチェーンに対しこのチェックを行い、ビットコインヘッダーがRSKブロックチェーンPoWパズルの有効なソリューションを示している場合、そのヘッダーはrskjに送られ、関連するRSKブロックを加えられた後にRSKネットワークに転送されます。
RSKの場合、プールサーバーはビットコインブロックに埋め込まれているタグのSPVプルーフのみをrskjに転送し、処理能力要件を減らすことができます(後ほど詳述します)。
以下の表はビットコイン、RSK、シェアのそれぞれの難度の概算(2019年6月時点でのパズル解決のために反復適用されるワンタイムパスワードの平均数に基づく)を示しています。

RSKタグ埋め込み
RSKタグは、ASCII識別子である「RSKBLOCK:」で構成されています。これはバイナリ・データ群で連結されており、それにはマイニングされるRSKブロック・ヘッダーのハッシュダイジェストが含まれています。前回述べた通り、タグの位置が確実に特定されなければなりません(2種類のRSKブロックに関連付けられるビットコインブロックは生成できないことを前提とします)。Namecoinはマージ・マイニングされたブロックチェーン用のタグを詰め込む様々なスキームを定義しましたが、スキームの標準化には至りませんでした。よって、将来の互換性の拡張・マイナープールソフトウェアのさらなる汎用性の実現のため、RSKタグをジェネレーショントランザクション(=ブロックの最初のトランザクションで、コインベースとも呼ばれます)のどこにでも配置することが可能です。RSKタグはジェネレーショントランザクションのコインベースフィールド、あるいは、(一般的に、OP_RETURN ペイロードとして)ジェネレーショントランザクションのアウトプットのいずれかに配置可能です。以下の図はその2つの可能性を示しています。
RSKタグがコインベースフィールドに保管される場合
RSKタグがジェネレーショントランザクションのアウトプットのいずれかに保管される場合
現在のRSKタグ・フォーマット
現在のRSKタグ・フォーマットはこちら: RSKBLOCK:RskBlockHeaderHash
「RSKBLOCK:」は以下のバイトから構成されるASCIIストリングです:52 53 4b 42 4c 4f 43 4b 3a
「RskBlockHeaderHash」はバイナリ・フォーマットのRSKブロック・ヘッダーのKeccakハッシュ・ダイジェストで、マージ・マイニングのフィールドを伴わず、PoW解決後に埋められます。RSKタグがアウトプットのスクリプトに含まれる場合、Bitcoin UTXOのスパミングを防ぐためにOP_RETURN OP_PUSHDATA1オペコードの後に含まれていることが望まれますが、これに関する事柄はコンセンサスに明記されていません。
追加の規定は以下の通りです:
- RskBlockHeaderHash直後~コインベーストランザクション終了までのバイト数は128以下でなくてはなりません。
- 末尾のRAWバイトはバイナリ・ストリング「RSKBLOCK:」(52 53 4b 42 4c 4f 43 4b 3a)を含んではいけません。
- RSKタグが末尾以外のアウトプット・スクリプトに配置されている場合、ごくわずかな確率ですが、続くアウトプットのバイト内にRSKタグが偶然現れる可能性があります。そのため、プールサーバーソフトウェアは、ジェネレーショントランザクション内でこのタグを含む不正なビットコインアドレスがマージ・マイニングのヘッダーの有効性を分断する攻撃として利用されることも可能性として考慮しなければなりません。これは、ジェネレーショントランザクション自体に収益を分配する(p2poolのような)分散型プールにとって問題となり得ます。従って、RSKタグには最終のアウトプット・スクリプトを用いることを推奨します。
- RSKタグがコインベースフィールドに配置されている場合、ごくわずかな確率ですが、ExtraNonce2データ・フィールドに「RSKBLOCK:」が偶然現れる可能性があります。ExtraNonce2データ・フィールドはStratumプロトコルの一部として、ブロックを解くマイナーによって内容が提供されるものです。また、マイナーが不正にタグをExtraNonce2に組み入れる可能性もあります。ただし、このような問題は、プールサーバーがRSKBLOCK:タグをExtraNonce2チャンクの後に追加することによって防ぐことができます。
標準的なP2SHアウトプットは34バイトを消費します。トレイル長の制限(タグを通過するバイトの最大数)によって、タグがコインベースフィールド内、あるいは、コインベーストランザクションの最後の4つのアウトプット内に配置される必要があります。
このようなトレーリング・バイト制限によって、RSKフル・ノードが圧縮型のSPVプルーフを創造できるようになります。圧縮型SPVプルーフには以下の内容が含まれます:
- ビットコインヘッダー(80バイト)
- コインベーストランザクションへのMerkle Branch(約320バイト)
- コインベーストランザクションのヘッドを消費するミッドステート(mid-state)のSHA-256(32バイト)
- コインベーストランザクションのトレイルとRSKタグを含む64バイトのアライン・チャンク(最大169バイト)
このトレイルを使うことで、プロトコルは、トレイルが所定のミッドステートから始まるフリースタートのハッシュとしてコインベーストランザクションに属することを証明することができます。
現在のSPV マージ・マイニング・プルーフの最大サイズは780バイトです。
プールサーバーソフトウェアはrskj daemonにフル・ブロック、あるいはこのSPVプルーフを送信することができます。ブロックを受け取ったrskjは、解析してSPVプルーフ構築に必要なフィールドを抽出します。
RskBlockHeaderHashは標準RSKノード(rskj daemon)によって生成され、Rskj はコマンド「getwork」を含むRPC-JSONマイニングインターフェースを公開します。またプールサーバープラグインはrskj daemonをポーリングし、最新のRskBlockHeaderHash値を維持してプールサーバーに提供します。RSK PoWが解決可能なほどシェア・ハッシュが十分に低い場合、プールサーバーはプラグインにこれを報告し、プラグインもまたrskj daemonに通知します。
今後のネットワーク・アップグレード(Armadillo)におけるマージ・マイニングの改良事項
今後のリリース1.0.0 では、ネットワーク・アップグレードによりマージ・マイニングのタグ・フォーマットが改良されます。新たなフォーマットはRSKIP110によって指定され、この改良によりRSKマージ・マイニング・タグに情報が追加され、ユーザーや自動システムは、ネットワークの健全性に関する判断を十分な情報に基づいて行えるようになります。また、タグ・モニタリング・ツールを使用することで、RSKネットワーク・ノードは異常事態に自動で対処しノードの二重支出を防ぐことができます。さらに将来的には、ノードがネットワークの他のノードに対し、異常状態を知らせる簡潔な暗号学的プルーフを送信できるようになるでしょう。
32バイトのブロック・ヘッダー・ハッシュは次のフォーマットの32バイトのバイト配列に置き換えられます
- マージ・マイニング用ハッシュの20バイトのプレフィックス(PREFIX)
- 7バイトのCommit-to-Parents-Vector(CPV)
- 最後の32ブロックに含まれる1バイト数のアンクル(NU)(上限:255)
- 4バイトのブロックナンバー(BN)
この4つのフィールドはコンセンサスでチェックする必要があります。要するに、CPV、NU、BNフィールドにより、ビットコインブロックチェーンを監視しているあらゆるノードが、生成されていくRSKブロックチェーンと競合する並行チェーンのグラフを創ることができるのです。たとえRSKネットワークに伝達されない場合であってもグラフの作成が可能です。タグが32バイトのままであるために、RSKヘッダーのハッシュは20バイトに切り詰められ、プールサーバーソフトウェアとの互換性が維持されます。