ビットコインの情報サイトの運営者ブログ

サイトには掲載していない仮想通貨に関する時事的な情報や個人的な感想など。中級者以上向け。

Ethereum ClassicのReplay Attackとは何か?

先日コミュニティの多くの支持を受けてイーサリアムがハードフォークしました。一部がEthereum Classicとしてハードフォークに反対するバージョンを立ち上げブロックチェーンは分岐状態となっていますが、フォーク前には著名な賛同者がいなかったのでほどなく消えるものと思われました。しかし、ここにきて大手取引所のPoloniexがETC(Ethereum Classic, ETHC)のトレードを開始し、大手マイニングプールのF2Poolもマイニングを開始するというニュースが流れ少なくとも今すぐ消えるという状況ではなくなってしまいました。

ETCが無価値=0円になれば何の問題もありませんが、ETCに1円でも価値がある限り、特に取引所においてReplay Attackという危険性があります。

前提

ハードフォークは日本時間の7/20 22:30頃、1920000番目のブロックで行われました。このタイミングでイーサリアムのブロックチェーンはハードフォークを行うETHと行わないETCの二つに分岐しています。つまり、ハードフォーク直前にETHの残高があるアドレスに、誰でも等量のETHとETCを保有していることになります。

ETHとETCは全く同じアドレス・秘密鍵の構造やネットワークを利用しているので、「アドレスAからアドレスBへ10ETHを送信する」というトランザクションを送信すると、Ethereum Classicのノードもこれを受け取って同時に「アドレスAからアドレスBへ10ETCを送信する」トランザクションが送信されることになってしまいます。逆にEthereum Classic上で同じことを行っても同様の現象が発生します。

ただし、ハードフォークが行われたDAO関連のETHは全てEthereum Classicでは無効と見なされるのでETHのブロックチェーン上でしか移動が行われません。先日記事に書いたDAOと交換されたETHはEthereum Classic上のブロックチェーンでは存在し得ない(秘密鍵を所持していない)ことになります。

Replay Attackとは

ハードフォーク直前にあるETH残高はそのままETC残高に反映されるので、取引所のホットウォレット/コールドウォレットにETHがあるということは、同じ量のETCがあることになります。

何の対策もしていない取引所でハードフォーク後にETHの出金処理を実行した場合、同時にETCも引き出されることになります。ETCがただのゴミならいいのですが、現在は価値がついてしまっているのでこれが問題となります。

ETHとETCを個人のウォレットBに引き出してから、ETCだけ別のアドレスCに移しETHを再び取引所のウォレットAに預けた後、もう一回ETHの出金処理を実行すると再度ETCもウォレットBに一緒に引き出せてしまうのです。取引所のウォレットのETC残高が尽きるまで、ウォレットB(ETH)→A(ETH/ETC)→B(ETH/ETC)→C(ETC)へ移していく作業を繰り返せば一定のETHがあるだけで多額のETCを入手することができてしまいます。これがReplay Attackと呼ばれています。

この問題は秘密鍵がなくても自動的にプログラムにより送信処理が行われる取引所のウォレットなどに顕著なもので、ETHまたはETCのどちらかのアドレスの秘密鍵がわからない限り、基本的にReplay Attackはできないので1ユーザーのウォレットへのReplay Attackは心配する必要はありません。

日本の取引所は良く知りませんが(対策されていることを望みますが)、海外の大手Poloniex/Bitfinex/Krakenなどは対策されているようです。

追記:一般的にはETHとETCを同時に送信させること自体を「Replay Attack」と呼びますが、ここでは現実的な「攻撃」の例として取引所への攻撃を挙げています。

ユーザーが気を付けることは?

Ethereum Classicなんてどうでもいい、売って金になるとしてもどうでもいい、という人はいいのですが、そうでない人はハードフォーク後のETHの送信に気を付けなくてはなりません。ETHを送信する裏でETCも同時に送信することになるので、下手に取引所などに送ってしまうとETCが消失する可能性があります。

ETCを売りたいとき、現在のところ唯一対応しているのがPoloniexです。Poloniexの場合、ETHを送信すると同時にETCの残高にも反映してくれます。ただし、たまにETC側のノードが拾ってくれず、送信が遅れたり送信されなかったりすることもあるようなので、慎重に自己責任で行ってください。送信元のアドレスにETCがないともちろんPoloniex側のETCの残高には反映されないので、Ethereum ClassicのブロックエクスプローラーなどでETC残高を確認しておきましょう。

Ethereum Classic Block Explorer

※アドレスは小文字のみで入力しないと正しく表示されないようです。

ユーザーが取引所においてあるETHについて

Poloniexではユーザーが保有しているETH残高と同量のETCを付与することにしたようですが、他の取引所については各取引所側の判断となります。取引所がETCは取引所側の持ち分にすると決めてしまえば、ユーザーがETCを受け取ることは当然できません。ハードフォーク前に取引所にETHを持っていたとしても、そのままETCを持っていることにはならないので注意しましょう。

Ethereum Classicのウォレット

今の時点でEthereum Classicに標準対応しているウォレットはありません。Mistで別の名前のブロックチェーン保存用フォルダを作って、フォークを支持しないオプションを選んでからブロックチェーンをダウンロードすれば、ETHとETCを同時かつ分別して保管することも可能ですが、よくわからない人は触らないほうがいいでしょう。

Ethereum Classicが生き延びるとすればいずれウォレットが対応するはずなので、今の時点は何もしないか対応している取引所上に保管しておくのが無難だと思います。

ETHとETCを分けて送信する方法は?

ノードもウォレットも対応していないので、ETHとETCを分けて送信するにはスマートコントラクトを利用するしかありません。これもよくわからない人は、対応するまでは同時に送信されてしまう仕様だと思って触らないのが無難だと思います。

両方扱いたい場合、不便は不便なのでローカルのETC専用のアドレスを作ってからPoloniexに一度預けてから再度引き出して分別保管するのが安全かもしれません。(ただし上手くETCが送信できるかどうかはわからないので自己責任で。)

いくつかスマートコントラクトのコードが提案されているのでリンクだけ貼っておきます。

How to deal with the Ethereum Replay Attack — Medium

go ethereum - How to conditionally send ethers to another account post-hard-fork to protect yourself from replay attacks - Ethereum Stack Exchange

ttps://www.reddit.com/r/EthereumClassic/comments/4ucxdu/etc_and_eth_keep_them_separated/