こんにちは、エンジニアインターンの南条です!

今回は、約1ヶ月前にForkして誕生したBSVとBCHを分割する方法について調査した結果をまとめました。

1. BSVとは

BSVは原初のBitcoinである。BSVは原初のBitcoinプロトコルを復元し、安定性を保ち、大規模に拡張することを可能にする。
BSVは2008年に書かれたサトシナカモトのビジョンを維持し続けます。
(引用:Bitcoinsv | https://bitcoinsv.io/)

BSVとは2018年8月16日にnChain社が発表したBCHのフォークであり、BCHが原初のサトシナカモトが提唱したBitcoinのプロトコル設計から離れていると指摘し下記のような修正を行い、原初のプロトコルに近づけようとするプロジェクトである。

  • オリジナルのオペコードを復元する:OP_MUL、OP_LSHIFT、OP_RSHIFT、OP_INVERT
  • 1スクリプトあたり201オペコードの制限を取り除く
  • 最大ブロックサイズを128MBまで拡大

(参考:Bitcoin SV Full Node Implementation Launched to Fully Restore Original Bitcoin Protocol)

2018年の11月16日にハードフォークしたBSVでしたが、リプレイプロテクションが実装されていないためトランザクションリプレイが起きてしまいます。

リプレイプロテクションに関してはこちらの記事をご参照ください。
https://tech.ginco.io/post/definition-of-txreplay-and-replayattack/

2. BCHとBSVの分割

2018年11月16日のハードフォーク以降、一つの秘密鍵に対しBCHとBSVが紐付いている状態になっています。

BitcoinCash Hard Fork

ハードフォーク後の新通貨の付与に関して勘違いしておられた方もいらっしゃいましたが、
フォークが起きた時点で秘密鍵に自動的に付与されています。

しかし今回のハードフォークではリプレイプロテクションが実装されていません。
したがって、この状態でAさんからBさんに0.5BCHを送ろうとすると0.5BSVもBさんに送られてしまいます。

リプレイプロテクションが実装されている場合

リプレイプロテクションが実装されていない場合

これではBCHとBSVを分けて送るのには不便です。
先日CoinGeek社からハッシュ戦争の終結が発表されリプレイプロテクションを実装するとの発表がありました。
(参考:Original Bitcoin is Reborn with Bitcoin SV (BSV); BCH Hash War Ends)
しかし実装時期についてはまだ定かではありません。

なので今回は秘密鍵に結びついているBSVとBCHを分割し、リプレイプロテクションが未実装でも別々に送る方法について調査しました。

3. nLockTimeを用いた分割

3.1. nLockTimeとは

ロックタイムとはトランザクションの属性のひとつで、ロックタイムに指定した時刻までトランザクションが承認されないようにするものです。トランザクションをロックタイムをつけて作成することで、ロックタイムに達するまではキャンセルが可能になります。

(引用:https://bitflyer.com/ja-jp/glossary/lock_time)

3.2. 仕組み

まずBCHとBSVのうち、より長いチェーンを持つ方を選びます。

2018年12月26日現在ではBCHの方がBSVより長いチェーンを持っているので、以降BCHをLongチェーン、BSVをShortチェーンとします。

2つのチェーン

次に、Longチェーン(BCH)の現在のブロック高をnLockTimeに指定して、Txをブロードキャストします。

nLockTime=8のTxをブロードキャスト

すると、Longチェーン(BCH)の方では承認(ブロックに取り込む)が可能になりますが、Shortチェーン(BSV)の方ではnLockTimeの影響で承認がまだできません。

LongチェーンでConfirm

Longチェーン(BCH)の承認が確認された後、Shortチェーン(BSV)ではまだ承認されていないのでTxを変更し、宛先を異なる秘密鍵で生成したアドレスに変え、そのTxをShortチェーン(BSV)にブロードキャストします。

PendingTxを変更

これでBCHとBSVを異なる秘密鍵に分割することができます。

Shortチェーンで変更したTxがConfirm

しかしこのnLockTimeを使った分割を行うためには、2つのチェーンのブロックの高さの差が十分にないといけません。
参考にしたサイト[1]では最低でも3ブロックは必要とのことでした。

4. DustTransactionを用いた分割

次に紹介するのはDustTransationを用いた分割方法です。
ここでいうDustTransactionとは、BSVとBCHのハードフォーク後に生成されたBCHチェーンにしか存在しない少額のUTXOです。

まずフォーク前のUTXOはハードフォーク後も両方のネットワークに存在しています。画像内では上にOLDとついてあるUTXOです。 フォーク後に、新しくBCHネットワークにしか存在しないUTXOを下記のサイト等から入手します。画像内では上にNEWとついてあるUTXOです。
Bitcoin.com Faucet | https://free.bitcoin.com/

リプレイプロテクションが実装されている場合

次に、OLD_UTXOとNEW_UTXOを含めて自分宛に全額送金します。

リプレイプロテクションが実装されている場合

そうすると、BCHチェーンでは問題なくブロックに取り込まれます。 しかし、BSVでは無効なInputを含んでいるのでブロックに取り込まれません。

リプレイプロテクションが実装されている場合

次に、BSVを異なる秘密鍵で生成したアドレスに送信します。

リプレイプロテクションが実装されている場合

BCHのチェーンではそのUTXOはすでに使われているのでAlreadySpentとなりそのトランザクションは無効となります。

リプレイプロテクションが実装されている場合

これで先ほどのnLockTimeを用いた分割と同様にBCHとBSVを異なる秘密鍵に分割することができました。

5. まとめ

この2つが今現在主流なBCHとBSVの分割方法です。
あくまでも、リプレイプロテクションが実装されてない状態での応急処置のようなものなので、
BCHやBSVを動かす予定のない方は大人しくリプレイプロテクションが実装されるまで待っていた方が良いと思われます。

6. Tip us!

エンジニアチームのブログを書くモチベーションが上がります 💪

address

0xd6d478dCe4585a394834690158cf83581223C08f

7. 参考文献