アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

Meta-Transactionのセキュリティを向上させるEIP-1344

今回はIstanbulアップデートで導入されたEIP-1344についてまとめたいと思います。EIP-1344の説明をする前にMeta-Transactionの仕組みとMeta-Transactionが抱える問題を簡単に説明します。その後に、EIP-1344で何が解決されたのかを説明します。

EIPの原文はこちら
github.com

Meta-Transactionとは

Meta-TransactionはエンドユーザがETHを保有することなくDappsにアクセスするために考案された仕組みです。暗号通過の取り扱い(つまりは秘密鍵の管理やETHの購入方法など)に不慣れなユーザでもDappsにより簡単にアクセス可能にするための仕組みでもあります。

簡単に説明すると、エンドユーザの署名つきのデータをリレイヤーと呼ばれる仲介者がエンドユーザの代わりにブロードキャストすることで、データ改ざんがされることなく、手数料をリレイヤー肩代わりできる仕組みとなります。

f:id:y_nakajo:20200113111116p:plain
meta_transaction_overview

Meta-Transactionの処理の流れ

Meta-Transactionは通常以下の流れで処理されます。
1. Contract作成者はMeta-Transaction対応のContractをデプロイする(以降ではこのContractをMetaTxContractと表記する)
2. エンドユーザはMetaTxContractの引数データと、そのデータに対する自身の秘密鍵で作成した署名の2つをリレイヤーに送る
3. リレイヤーは2. で受け取ったエンドユーザのデータと署名をMetaTxContractに送信する
4. MetaTxContractは受け取ったデータと署名をSolidityのecrecover関数を用いてエンドユーザのaddressを復元する
5. MetaTxContractは以降、4. で復元したaddressを送信元として任意の処理を行う。

ecrecoverの使い方については以前の記事でまとめてますのでそちらも参照ください。
y-nakajo.hatenablog.com

Meta-Transactionの適用シナリオ

Meta-Transactionは2017年ごろから利用されている古くからある仕組みです。今日では様々なシーンで使われています。以下で簡単に紹介します。

  • DEXのoff-chain処理
    • 0x protocolやIDEXで用いられているリレイヤーの仕組みなどはmeta-transactionをベースとしている
  • 手数料無料のWallet
    • Agentなどの最近のContract Wallet(Smart ContractでWallet機能を実装したもの。)
  • ERC20トークンでの代理支払いのため
    • ETHの代わりに任意のERC20(例えばDAIなど)でgas代を支払うため

Meta-Transactionが抱える問題

Meta-Transactionは検閲問題とリプレイ攻撃問題の2つの大きな問題を抱えていると考えられています。以下でそれぞれの問題を簡単に説明します。

検閲問題

f:id:y_nakajo:20200113111149p:plain
Censorship Problem

Meta-TransactionはリレイヤーがEthereumへブロードキャストしてくれることを信頼しないといけません。一般的なMeta-Transactionではリレイヤーは一人(例えばサービスプロバイダ自身)が担当することが多いため、検閲の問題が発生します。(今の所、この検閲の問題による大事件というのは聞いたことがないですが。。。)

リプレイ攻撃問題

f:id:y_nakajo:20200113112027p:plain
Replay Attack Problem

Meta-Transactionはその性質上、エンドユーザが対象としているContractであれば、そのContractがデプロイされているnetworkに関係なく、ブロードキャストが可能です。
そのため、エンドユーザがtestnetへデプロイすることを期待していても、悪意のあるリレイヤーによってmainnetにデプロイされる可能性があります。
また根本的問題としてnetworkの分裂した場合のリプレイ攻撃を防ぐことができません。

今回取り上げたEIP-1344ではこのリプレイ攻撃を防ぐために導入されました。

それぞれの解決作

上記2つの問題について、それぞれ解決のための研究が行われています。また、リプレイ攻撃に関してはEIP-1344で防ぐことが可能となりました。以下でそれぞれの解決策について紹介します。

検閲問題の解決策

検閲問題の解決策として、複数人のリレイヤーからなるネットワークを構築し、リレイハブコントラクトを介して任意のリレイヤーにMeta-Transactionを送信してもらうというアイデアが研究されています。
このアイデアはTabookeyによってい提唱され、OpenZeppelinの監修の元、GSN(Gas Station Network)として実装されました。このプロジェクトは現在mainnetで稼働しています。
gsn.openzeppelin.com

リプレイ攻撃の解決策

ようやく本記事の本題です。Meta-Transactionのリプレイ攻撃の対策としてEIP-1344が導入されました。EIP-1344の内容としては、スマートコントラクトが実行されているnetworkのchainIDを取得するためのオペコード:CHAINIDを追加するだけの非常にシンプルなものです。

しかし、このオペコードの追加によって、スマートコントラクトは自身が動作しているnetworkをオラクルに頼ることなく正確に認識できるようになります。

このオペコードを用いたリプレイ保護の仕組みは、Ethereum自体にも導入されているEIP-155のアルゴリズムで行います。
github.com
EIP-155については、以前に解説記事を書いてますので詳細はそちらを参照ください。
y-nakajo.hatenablog.com

EIP-155は簡単に説明すると、Transactionの署名を算出するときに、chainIdも署名の対象に含めるという非常にシンプルなアルゴリズムです。

EIP-1344によって現在稼働しているnetworkのchainIdが取得可能となり、またEIP-155が利用可能になるため強力なリプレイ保護が可能となります。この保護ではたとえネットワークが分裂したとしても新しいネットワークに対するリプレイ攻撃も保護されます。

まとめ

今回はEIP-1344の目的と説明でした。EIP-1344がリプレイ攻撃保護のための仕組みのため、EIP-1344自体の説明というよりもMeta-Transactionの概要、およびMeta-Transactionが抱える問題に対しての説明が長くなってしまいました。

Meta-Transactionは現在では色々なところで使われている、一般的な概念ではありますが、自分自身がMeta-Transactionについてまとめたことがないなぁと思ったので、今回の記事ではMeta-Transactionの解説をメインとしました。
本文でも述べた通り、EIP-1344の導入によってMeta-Transactionをより安全に利用することが可能となりました。今後はエンドユーザのエクスペリエンスのためにMeta-Transactionを用いたアプリがより多く作られていくと思います。