ビットコイン専門会社として、エンジニア視点からなるべく正確にBCHのハードフォークについて解説してみる②

こんにちは。@akifujiです。

Yenomメンバーによる11/15のBCHハードフォーク解説記事第2弾です。

今回のハードフォークでは、リプレイプロテクションがBitcoin ABC、Bitcoin SV双方のチェーンに実装されていないのが問題となっています。
この記事では、リプレイプロテクションがないことによって、どんな問題が引き起こるかについて解説します。

昨日のおさらい

まず、昨日のおさらいになりますが、今回のハードフォークの概要を確認しましょう。

  • Bitcoin ABC(以下ABC)がハードフォーク
  • Bitcoin SV(以下SV)がハードフォーク
  • リプレイプロテクションなし
  • ブロックチェーンのスプリットは高確率で起きる
  • コインの分裂も恐らく起きる

この記事では、リプレイプロテクションなしコインの分裂も恐らく起きるという2つの項目に注目したいと思います。

なお、昨日は「フォークとスプリット」「ハードフォークとソフトフォークの違い」「ブロックチェーンの分裂(スプリット)とは?」などについて解説しました。今日の記事はこちらの知識を前提としております。これらの用語が曖昧な方は、前日の記事を読むことをお勧めします。

リプレイプロテクションとは

概要

リプレイプロテクションとは、コインが2つに分かれた時に、それぞれのコインを別々に送金できるようにする仕組みのことです。

何だか当たり前のように聞こえますが、それが当たり前ではない状況も存在するのです。

リプレイプロテクションを理解するためには、まずは「リプレイプロテクションがないとどうなるか」を理解していきましょう。

トランザクションリプレイとは

リプレイプロテクションがないと、コインAを送金したときに、同時にコインBも同じ額同じ宛先に送信されてしまうという現象が起こります。これをトランザクションリプレイと呼びます。

トランザクションとは、「差出人」「宛先」「金額」などをまとめた情報のことで、振込用紙のようなものです。

トランザクションリプレイが起きる原因は、コインAのトランザクションがコインBでも利用可能だからです。

リプレイプロテクションの仕組み

リプレイプロテクションとはトランザクションの形式をそれぞれのコインで異なるものに変更することです。

先ほどの振込用紙の例で考えてみましょう。

例えば、銀行が異なれば振込用紙も見た目が違いますよね。これがリプレイプロテクションです。

コインAとコインBで同じ振込用紙を使用しなければならない状況、それがリプレイプロテクションがないという状況です。(しかも、ビットコインの場合は使用した振込用紙を全世界に公開しないといけないのです。そして誰でもコピーして使い回せる・・・!)

今回のハードフォークでは、このリプレイプロテクションをどちらのチェーンも実装していません。従って、ハードフォーク後に、一方のチェーンでコインを送金すると、もう一方でも送金できてしまいます。このような場合、コインが分離しない可能性があります。次項からはコインの分離について説明していきます。

コインの分離とは

概要

コインの分離とは、2つのコインをそれぞれ別々に送金できるようにすることです。リプレイプロテクションがある場合と無い場合で分離し易さが変わります。

リプレイプロテクションがある時

リプレイプロテクションがある時は、何もしなくても自動的に別々に送金できます。つまりコインは必ず分離します。

リプレイプロテクションがない時

リプレイプロテクションがない時は、普通の送金はどちらのチェーンでも有効になります。つまりコインが分離するのは難しいです。

しかし、実は頑張れば別々に送金する方法がないわけではありません。

例えば、片方のチェーンでしか存在しない宛先にコインを送るなどしているトランザクションは、もう片方では無効になってしまいます。

詳しくは次の章で説明します。

cf. コインの分裂との違い

「コインの分離」と似た概念に、「コインの分裂」がありますが、私たちはこの2つを異なるものとして区別して捉えています。

コインの分裂とは、今まで同じであったコインが、別々のコインとしてどちらも価値を持つようになることです1。事例としては、昨年のBTCとBCHの分裂があります。どちらも今では価格が付き、取引所で扱われています。

チェーンが分岐しても、コインが分裂しない場合はあり得ます。そのコインに価値がつくかは、技術的な要因もありますが、社会的なコンセンサスの要因も大きいです。

今回のハードフォークで、どちらのチェーンのコインも価値がつくかは誰にも分かりません。フォーク後に、みんなの意見で、分裂するかどうかが時間をかけて決まるでしょう。

自分でコインを分離させる方法

自分でコインを分離させるためには、意図的に一方のチェーンでしか有効ではないトランザクションを作ります。

例えば、 OP_CHECKDATASIGという要素が入ったトランザクションはABCでは有効ですが、SVでは有効ではありません。

その逆に、 OP_MULという要素が入ったトランザクションはSVでは有効ですが、ABCでは有効ではありません。

前者のポイントを使って、コインを分離させてみましょう。
以下の手順を踏めばコインが分離します。

  1. 自分のウォレットにOP_CHECKDATASIGが入ったトランザクションを送金する
  2. 受け取ったコインを含めて全額を自分のウォレットに再度送る

こうすることで、所有する全てのコインは分離します。

分離の仕組み

手順1で作ったトランザクションは、OP_CHECKDATASIGが入っているので、ABC側でしか有効ではありません。さらに、そのトランザクションで受け取ったコインを使って作った手順2のトランザクションもABC側でしか有効ではないです。何故なら、使用するコインのトランザクションがSV側のチェーンには無いからです。

f:id:akifuji510:20181109134340p:plain

この結果、自分の全てのコインの存在を証明する手順2のトランザクションは、ABC側のチェーンにしかありません。一方、SVのチェーンでは、分離するまでのトランザクションの履歴が残っています。

こうして全ての履歴が食い違ったことでコインが分離されました。

スプリットツール

Coin Splitter というツールは、OP_CHECKDATASIGVERIFYを付与したトランザクションを作って、ABCのみで有効なコインを作ってくれます。もし、自分でコインを分離してみたい方がいましたら、使ってみると良いでしょう。

しかし、分離は慎重に行うことを強くお勧めします。コインを分離させるのは危険です。最後にコインを分離するリスクについて解説したいと思います。

コインの分離することによるリスク

一部のBCHのサービス業者の中には、ABC、SVにかかわらず、分離したコインは受け取らないとアナウンスしているところがあります。一度分離したコインは元に戻すことができないため、このようなリスクがあることは十分に理解した方が良いです。

また、今回のハードフォークでは、コインの分裂の結果がどうなるか予想し難いです。それぞれのチェーンのコインがどれだけ価値を持つようになるのか分かりません。分離させて所有していたコインの価値が無くなってしまう可能性があります。逆に、ちゃんと保管していなかった方のコインが高い価値を持つ可能性もあります。

したがって、コインを分離させるには十分慎重にやることをお勧めします。

終わりに

今回は、リプレイプロテクションを中心に解説しながら、コインの分離について説明しました。今回はリプレイプロテクションのないハードフォークなので、フォーク以降、送金する際にはくれぐれもご注意してください。また、何度も書きますが、自分でコインを分離させる方は慎重に行ってください。


  1. コインの分裂の定義は、正式なものはなく曖昧な概念です。今回は、私の解釈を使用しています。