25歳海外駐在員の暗号通貨ルポ

25歳海外駐在員の暗号通貨ルポ

25歳の東南アジア某国に居住する駐在員。Bitcoinなどの暗号通貨をメインに、英語や駐在生活に関して情報発信中。

リプレイアタック - Bitcoin Cash導入にあたっての対策 -

Bitcoin Unlimited派のViaBTCが、既存のBitcoinからハードフォークする形で、Bitcoin Cashを導入することを発表しました。Bitcoin Cashは当初8月1日にJihan Wu率いるBitmainが予定していたUAHFベースであり、UAHFのウォレットクライアントであるBitcoin ABCを利用することで使用可能なようです。

最近では、ViaBTCがBitcoinBitcoin Cashに対して中立な立場を表明するなど、状況が混乱しています。

ビットコインますます分裂 | ビットコインの最新情報 BTCN|ビットコインニュース
ViaBTC Claims Neutrality Ahead of Bitcoin Cash's Likely Launch - CoinDesk


ただ、Bitcoin自体への影響としては、フォークの際にReplay Attack対策を導入していることにより、既存のBitcoinネットワークでのトランザクション送信は特に問題なく行えるため、そこまで大きな混乱は広がっていないようです。

今回は、そもそもReplay Attackとは何なのか、またBitcoin CashのReplay Attack対策の概要を整理したいと思います。


Bitcoin Cashの公式サイト
Bitcoin Cash | Home

前提

ブロックチェーンがある時点で、ハードフォークにより完全に分裂したと仮定します。それぞれのブロックチェーンの名前を以下のように定義しておきます。

元のブロックチェーン (Bitcoin):A
分裂したブロックチェーン:A1 (元チェーン、Bitcoin)、A2 (分岐チェーン、Bitcoin Cash)

Replay Attack

攻撃方法

リプレイアタックは、以下の流れで発生します。

  1. 送金者がA1チェーン上で送金
  2. 攻撃者がその送金トランザクションをコピー
  3. 攻撃者がA2チェーン上でも送金


これにより、A1チェーン上でのみ送金しようとしていたにもかかわらず、攻撃者によって意図せずA2チェーンでも送金されてしまうことになります。今回の騒動を例にとると、Bitcoinを送金しようとしただけなのに、攻撃者がそのトランザクションをコピーしてBitcoin Cashも送金させられてしまうという攻撃です。


Bitcoin Cashの価値がほとんどなければリプレイアタック対策がなくても問題ありませんが、BitcoinBitcoin Cashが並存する状況だと、リプレイアタックを恐れてBitcoin利用者が減少してしまうおそれがあります。

Bitcoin Cashにおける対策

この攻撃への対策はシンプルで、A1チェーンとは異なるトランザクションのルールを、ハードフォークしたA2チェーンに導入すれば、A1チェーン上のトランザクションがA2チェーンに取り込まれることはなくなります。逆も然りで、A2チェーンで導入したルールがA1チェーンでは無効なルールであれば、A2チェーン上のトランザクションがA1チェーンに取り込まれることもありません。


今回Bitcoin Cashでは、Sighash Typeと呼ばれるパラメータにSIGHASH_FORKIDという新たなフラグを足すことで、Bitcoin Cashのトランザクションであることを認識しています。Sighash TypeはTransaction Inputに含まれる署名を検証する際 (技術的な話をすると、スタックに積まれた署名を、OP_CHECKSIGによりPublic Keyで検証する際)に、検証の挙動を変更するために利用されています。


この新フラグ(SIGHASH_FORKID)がSighash Typeとしてセットされていると、既存のBitcoinのルールでは正当なトランザクションとは認められなくなるので、Bitcoinブロックチェーンにこのトランザクションが取り込まれることはありません。


Bitcoin Core抜粋
f:id:steinith310:20170722190917p:plain


このコードはBitcoin Coreのクライアントソフト内から抜粋したものですが、「SIGHASH_ALLより小さい」または「SIGHASH_SINGLE」より大きい場合はエラー値が返される仕様になっています。Bitcoin Cashが導入する新たなSighash Typeには、0x40 (=64)をセットする予定ですので、Bitcoin上ではトランザクションが無効として扱われることになります。


Sighash Type
OP_CHECKSIG - Bitcoin Wiki


なお、当たり前ではありますが、このSighash TypeはTransaction Inputに含まれる署名の最終バイトを利用しているため、送金に利用するトランザクションがフォーク前のトランザクションであったとしても、リプレイアタック対策として正しく機能します。

その他のフォーク時の注意事項

UASFが導入されることが取りざたされていた際は、Wipeoutのリスクが騒がれました。Wipeoutを直訳すると「全滅」ですが、その名の通り一度ブロックチェーンに取り込まれたトランザクションが無効化されてしまう事象をさします。これはソフトフォークの場合にのみ発生する事象で、旧チェーンから見て新ルールで作成されたブロックも有効に見えることから発生します。


ざっくりと説明すると、途中までは旧チェーンが新チェーンよりも長く、正当に旧チェーンに取り込まれていたトランザクションがあった際に、新チェーンが旧チェーンより長くなると発生します。旧チェーンのルールでは、新チェーンのブロックも有効に見えるため、ブロックチェーンの長さが長い新チェーンが突如有効になってしまいます(= Reorg)。そうすると、旧チェーンに取り込まれていたトランザクションは無効化されてしまいます。


これに関しては、以下の記事が詳しいので詳細を知りたい方はそちらをご確認ください。
btcnews.jp