2018.03.20

RSKとBTCPoolにみるサイドチェーンのマージマイニング

こんにちは。F.S.です。
Bitcoinエコシステムでは近年ライトニングネットワーク、サイドチェーンといった2ndレイヤーが技術が進み、β版ながらメインネットで稼働し始めるものが出てきました。

今回は、2018年1月にクローズドでメインネットが稼働し始めたRSK(Rootstock)サイドチェーンに焦点をあてて、サイドチェーンのマージマイニングという仕組みについて見てみたいと思います。

サイドチェーン

サイドチェーンは、Bitcoinに代表されるようなブロックチェーン(メインチェーン)の機能を拡張するためのチェーンです。
双方向ペグ(2-Way peg, 2WP)により、メインチェーンの通貨をサイドチェーンの通貨と相互に行き来できるようにし、メインチェーンの通貨を用いてサイドチェーン側で高速な取引やスマートコントラクトの実行を実現しようとするものです。

2WPのやり方はいくつか提案があります。サイドチェーンの解説も合わせて下記の記事が参考になります。

RSK(Rootstock)

Bitcoinのサイドチェーンとして、Ethereumと互換性のあるスマートコントラクトの実行環境を提供するものです。RSK Labsにて開発されています。
Bitcoinが取引確認時間は平均10分、秒間トランザクション数は3.3tpsなのに対して、RSKは平均10秒、100tps(ホワイトペーパーでは300tps〜1000tps)とスケーラビリティにおけるメリットもあります。

GitHubにあるソースコードやチュートリアルをのぞいてみると、大まかに下記の特徴があることがわかります。

  • EthereumのJava実装である ethereumj をベースにしたブロックチェーンのため、作法がEthereumとほぼ同じ
  • スマートコントラクトの記述言語にSolidity(solcコンパイラ)が使える
  • 2WPやマージマイニングにおけるハッシュやブロックなど、Bitcoinのプロトコルに依存する部分は bitcoinj を利用

RSKはDECOR+GHOSTプロトコルでブロックタイムが平均10秒となる独自のマイニングを実施しますが、チェーンのセキュリティを強固にするために、RSKブロックハッシュをビットコインネットワークのマイナーにコミット(coinbase commitment)してもらうマージマイニングという手法をとっています。RSKは多くのBitcoinマイナーに支持されていますが、マージマイニングによってRSKサイドチェーンにおける手数料報酬がマイナーにも分配されることが、支持される理由の一つであると思われます。

マージマイニング

マージマイニングはNamecoinでも実施されており目新しい技術というわけではありませんが、RSKとBTCPoolの実装からどのようにマージマイニングが行われるのか理解したいと思います。

RSKマージマイニング(RMM)

RSKではどのようにマージマイニングを行うのかを見てみます。

前提として、Bitcoinのマイニングはマイニングプールを構成して行われるようになっています。
一般的に、プールサーバは実際のBitcoinブロック生成難易度よりもかなり低い難易度でProof of Work(PoW)の解を求める命令をマイナーに出しています。これはマイナーへの報酬分配のためにマイナーに簡単なPoWをさせて、マイナーのマイニング速度を計測する必要があるからです。このPoWの解をShareと言い、Shareを発見した数をもとにマイナーの計算力(貢献度)を割り出します。

ShareのSHA256ダブルハッシュがBitcoinブロック生成難易度を満たしていればプールサーバはBitcoinネットワークにブロックをパブリッシュしますが、満たしていないものはBitcoinには使われません。RSKの難易度は一般的にはBitcoinのそれよりも低く設定されるため、Bitcoinに使われないShareがRSKでは有効な場合があります。このShareを活用することでBitcoinマイナーに余計な負荷をかけずにマージマイニングを実施することができます。


RSK Merge Mining (RMM) and Bitcoin Interoperability より引用

上図のように、プールサーバにRSKマージマイニングのための拡張を機能を持たせ、RSKノード(rskd)と連携することでRSKネットワークにブロックをパブリッシュします。
大まかな流れは下記のようにになるようです。

  1. rskdはRSKのプロトコルに従ったブロックを作成し、メモリに保持する
  2. プールサーバのRSKプラグインは getWork RPC で rskd より上記RSKブロックのハッシュ、難易度等を受け取る
  3. プールサーバはRSKタグと言われる ”RSKBLOCK:”+RSKブロックハッシュ のバイト列を coinbaseトランザクションに含めた Bitcoinブロックテンプレートを作る
  4. マイナーは上記のBitcoinブロックテンプレートのPoW解を求めてプールサーバへ送る
  5. プールサーバのRSKプラグインはRSK難易度を満たしたBitcoinブロックを submitBitcoinbBock RPC(上図ではsubmitnonce)で rskd に送る
  6. rskdは受け取ったBitcoinブロックからRSKブロックハッシュを取り出し、メモリ上のブロックと適合することをチェックした上で、BitcoinブロックのSPV証明とともにRSKブロックをRSKネットワークにパブリッシュする

RSKのマイニング部分についてソースコードを覗いてみると、マイニングパッケージ(co.rsk.mine)には MinerServer と MinerClient が存在し、それぞれ下記の役割を持っていることがわかります。

  • MinerServer・・・RSKブロック生成およびRMM RPCの実処理を行う
  • MinerClient・・・Bitcoinマイナーの役割を代替するもの(RegTestだけで使う)

RMM設定ガイドにて、RMMのノードとして稼働させる場合の config 例が記載されています。
rpc 設定で mnr モジュールを有効にするのに加え、miner 設定では MinerServer 機能のみを有効にし、MinerClinet 機能は無効にします。

BTCPoolのRMMプラグイン

BTCPoolの実装から、RMMがどのように組み込まれているかを見てみましょう。
下図はBTCPoolのアーキテクチャですが、図中にRMMに該当する記述はありません。


GitHub – btccom/btcpool より引用

上図に従った形で RMM 処理を記述すると、下図のようになります。

なお、前項に引用した図中ではRSKプラグインと表現されていますが、必ずしもプールソフトがプラガブルであるとは限らず、GitHubのコミットログを見るとRSK Labsのエンジニアが作成したソースコードが内包されているのがわかります。実際、getWork RPC を扱う GWMaker 以外(BlockMaker、JobMaker など)ではBitcoin の処理に RMM処理が混じっていました。

終わりに

RSKおよびBTCPoolの実装を見ることで、サイドチェーンのマージマイニングの流れを理解することができました。

ただ、一つ疑問が残っています。
RSKブロックハッシュの coinbase commitment は Bitcoin ブロックチェーンに記録されて初めてセキュリティ効果があるはずですが、RMM の難易度で有効な Bitcion ブロックは Bitcoin でも有効とは限らないため、そのほとんどは Bitcoin ブロックチェーンに記録されないのではないかという疑問です。
実際に稼動できる環境が整ったら、改めて検証してみたいと思います。

それでは、また。

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクト、またはブロックチェーンのエンジニアを募集しています。次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。