※この記事は、GAOGAOの公式サイトに2022年6月3日に公開された記事を転載したものです。
https://gaogao.asia/2022/06/03/9426/
こんにちは、GAOGAOのWeb3 Labでブロックチェーンエンジニアをしているこうりんと申します。
DeFi、NFT、DAOなどブロックチェーンを使ったアプリが何かと話題となり、多くの人が一度はこれらの言葉を見たり聞いたりするようになったのではないでしょうか?また、DApps (Decentalized Applications: ブロックチェーン上で動くアプリまたはそれと連携させたアプリ) を使ってみたという方も多いのではないでしょうか?
DAppsではウォレットを使用することが前提になっていたりと、既存のアプリケーションと大きく異なることに気がつくかと思います。特にユーザがリクエストを送った後にそれが反映されるまでに時間がかかるのは、多くの人が体験していることかと思います。これはブロックチェーンの特徴の一つによるものなのですが、ではなぜ時間がかかるのか?この時間を短縮できないのか?というのが今回の記事のテーマです。
このような問題をスケーリング問題と呼びます。今回はスマートコントラクト基盤では一番有名なEthereumブロックチェーンを中心に、スケーラビリティ問題について説明します。
Ethereumのスケーラビリティ問題の現在
スケーラビリティ問題とは、シンプルに言えば、ブロックチェーンのトランザクション処理スピードに関する問題です。
近年、ブロックチェーンが有名になり多くの人が使用するようになったため、より多くのトランザクションが生成されています。一方、ブロックの生成時間やブロックあたりのトランザクション数というものはそこまで変化していません。ブロック生成時間は大体12秒〜14秒と言われています。(ハードフォークのタイミングで急激に変化することがあります。詳しくはディフィカルティ・ボムなどを参照してください)また、1つのブロックに入れることのできるトランザクション数に関しても段階的に増加していますが、そこまで大きな影響を及ぼしていません。
Ethereumメインネットの1秒間あたりのトランザクション処理数 (TPS: Transaction Per Second) は、15TPS前後で推移しています。 一方、カード決済で有名なVisaは平均2000TPS前後と言われています。そう考えると、この処理スピードというのは広く普及する上で大きな壁になっていることが分かります。
(参照: https://blockchair.com/ethereum/charts/transactions-per-second)
また、この問題はトランザクション手数料にも影響します。ブロックチェーンの混雑度に応じて、必要なトランザクション手数料は増減します。そのため、多くのユーザが一度にトランザクションを送ると、ユーザが支払う手数料は大きくなります。2022年6月2日23時現在、ERC20トークンの送金が$7ほど、Uniswapの取引が$27ほどです。
しかし、ついこの間Bored Apeという有名なNFTプロジェクトがセールを行った5月初めにはトランザクションが急増し、ERC20を送金するのに$1150かかるほど急騰してしまいました。
(参照: https://etherscan.io/gastracker)
速度の遅さや手数料の高さはユーザーが利用する上で大きな壁になっています。
Ethereumはなぜ遅いのか
さて、なぜEthereumは遅いのでしょうか?これは基本的にはコンセンサスメカニズムに基づきます。現在、BitcoinやEthereumなどの代表的なパブリックブロックチェーンはPoW (Proof of Work)を採用しています。
PoWではブロックチェーンを運営するたくさんのノードが同時並行でブロックの生成をしています。このブロック生成には時間がかかるような仕組みになっており、Ethereumの場合13秒前後になるよう調整されます。(将来的にマシンスペックが向上して生成時間が短縮するようになったとしても、一定の間隔で調整が発生します)
ブロックが生成できたら他のノードに送信し、他のノードはブロックを検証して正しい場合それを採用します。そして、ブロックを受け入れたら次のブロックの生成に取り掛かります。(厳密に言うと、他のノードのブロック・チェーンを採用する基準はチェーンの長さや計算量に基づきます。詳しくはGHOSTプロトコルなどをご参照ください)そして、このブロックの生成者には一定の報酬が支払われます。
このように、PoWでは多数のノードがブロックチェーンの維持に携わっていますが、同時並行的にトランザクションを処理しているのでは無く、あくまでのシステム全体で一定時間に一つのブロックを生成するようになっています。そして、多数のノードが検証・承認してチェーンに繋がったブロックが正当なものとみなされ、このブロックにトランザクションが入ることで取引が完了したとみなすことができます。
ブロックチェーンのトリレンマ
さて、Ethereumが遅い理由は分かりました、それでは高速化はできないのでしょうか?シンプルなアイデアだと以下が思いつきます。
- ブロックあたりのトランザクション数を増やす (Block Gas Limitの増加)
- ブロック生成時間を減らす
- ブロック生成者を予め決定しておく
しかしながら、上の3つは上手く機能しないかスケールしません。1はブロックサイズが大きくなるにつれてノードの要求スペックは向上し、マイナーとしての参入難易度が高くなります。2は簡単にブロックを生成できるようになり、フォークやチェーンのreorg (最新の数ブロックが書き換わる)が発生しやすくなります。その結果、かえって非効率になったり、セキュリティに影響を及ぼす可能性があります。3に関しては、Ethereumのようなパブリックブロックチェーンでは不特定多数のノードが参加することを前提としているので、まず、Ethereum全体でどのくらいのノードが参加していることを把握するのが難しい問題があります。また、不特定多数のノードがブロックチェーン全体の検証をし信頼性を担保しているという側面もあります。
以上のように、単純にEthereumがスケールするように高速化すると、問題が出てきてしまいます。Ethereumの考案者であるVitalik Buterin氏はブロックチェーンの複数の性質の関係性を表すブロックチェーンのトリレンマを提唱しました。これはブロックチェーンにある3つの性質、分散性・安全性・スケーラビリティのうち2つまでしか高められないことを示しています。つまり、どれか一つの性質を犠牲にする必要があります。簡単に説明すると、分散性とは不特定多数のノードでブロックチェーンを維持できるか、安全性とは十分な攻撃耐性があるか、そしてスケーラビリティとは膨大なトランザクションを処理できるかを表しています。つまり、Ethereumはスケーラビリティを犠牲にして、不特定多数のノードが参加する状況でシステムの安全性を保つことに重きを置いていると言えます。
既存のEthereum向けサイドチェーンやEthereumキラーと呼ばれるブロックチェーンでも、このトリレンマに基づいています。
Ethereum向けサイドチェーンソリューションであるPolygon PoSでは、実際のトランザクションをBorというPoSチェーンで処理しています。このPoSチェーンではMATICトークンをステークしているアカウントからバリデータとブロック提案者が一定期間ごとに選出され、提案者が順番にブロックを提案しバリデータが検証することで短いブロック生成時間を達成しています。しかし、バリデータやブロック提案者の数は限られているため、分散性が高いとは言えません。
Ethereumキラーの一つとも言われるSolanaは、PoHという新たな概念とPBFTコンセンサスを組み合わせたTower BFTを採用したり、いくつかの高速化手法を組み合わせて高いTPSを実現しています。しかしながら、ノードとして参加するには高いマシンスペックが要求されているなど、こちらも分散性が高いとは言えません。
Ethereumの未来
現在Ethereumでは安全性と分散性を高めるために、スケーラビリティが犠牲になっていると説明しました。今後のEthereumではスケーラビリティ問題は解決されるのでしょうか?これを説明する上で重要なワードが2つあります。それは、Ethereum2.0とRollupです。
Ethereum2.0
まず、Ethereum2.0について説明します。Ethereum2.0とはその名の通りEthereumの大規模アップグレードです。これまでにもEthereumは何度かハードフォークを通しアップデートを経験してきましたが、これらはガス代計算などの細かい仕様変更のみでした。しかし、Ethereum2.0では既存のものから大きく変化します。
Ethereum2.0では大きく分けて、BeaconチェーンとShardチェーンの2種類のチェーンがあります。Beaconチェーンはシステム全体を管理するためのチェーンで、主にチェーンを運営するバリデータを管理します。Ethereum2.0はPoS(Proof of Stake)を採用しており、バリデータが掛けているお金の額に応じて影響力が決まります。Beaconチェーンはバリデータのステーク額に基づき、各Shardチェーンのバリデータを選出します。この他に、Beaconチェーンにはバリデータに報酬やペナルティを課したりする責務があります。Shardチェーンは64個のチェーンで、Beaconチェーンで選出されたバリデータにより維持されます。このチェーン毎のバリデータは一定期間ごとに、ステーク額に応じてシャッフルして選出されます。ユーザが送信したトランザクションはこのShardチェーンで処理されます。
一般に多数のチェーンで構成されるシステムの場合、一つのチェーンを攻撃することでシステム全体に影響を及ぼすことが可能です。そして、バリデータが各チェーンに分散されているため、一つのチェーンを攻撃をするために必要な計算量やステーク額は、1チェーン構成のものと比較すると小規模で済みます。しかし、Ethereum2.0のシャーディングの場合は、各チェーンのバリデータの選出はランダムであるため、攻撃をするためにはEthereum2.0全体のステーク額の30%〜40%相当の量をステークしておく必要があります。このため、Ethereum2.0ではセキュリティを維持しつつ、複数のチェーンを同時に実行できるような仕組みになっています。
Ethereum2.0へのアップグレードは3段階で行われます。1つ目はBeaconチェーンの開始が2020年12月にありました。そして、このBeaconチェーンを現在のEthereumチェーンと合体させるThe Mergeが今年の夏に予定しています。そして、最後にシャードチェーンの開始が2023年に予定されています。
Rollup
RollupはEthereumの多数のトランザクションをまとめるLayer 2ソリューションです。ユーザが送信したトランザクションをEthereumのチェーン上ではなく、チェーン外で処理をします。そして、圧縮したトランザクションデータとトランザクション処理後の状態ルート (全状態のハッシュ値)をEthereumのチェーン上に保存します。このようにすることで、Ethereumチェーンでトランザクションを実行せずともトランザクションデータとその実行結果をチェーンに保存することが可能となります。
Rollupを使用すると、ユーザーが送信したトランザクションはブロックに入らずシーケンサーが即座に処理を行います。Ethereum側はユーザのトランザクションを実行すること無く、またユーザのトランザクションは圧縮して保存されるため、一つのブロックに大量のトランザクションを含めることが可能となります。
単一のシーケンサーがトランザクションを処理しているため、もちろんこのシーケンサーが間違った状態遷移をEthereumチェーンに提出しないような仕組みが必要です。Rollupでは大きく分けて、Optimistic RollupとzkRollupの2種類の方法があります。
Optimistic Rollupはシーケンサーが正しく動いていると仮定してEthereumチェーンがシーケンサーの状態遷移を一旦受理します。しかし、不正な状態遷移があった場合、シーケンサーとは別のバリデータノードがこれを監視しており、バリデータノードが不正の証明をEthereumチェーンに提出することで、Ethereumチェーン内のコントラクトで再度状態遷移を実行します。もし、この状態遷移の結果とシーケンサーが提出した結果が一致しない場合は、それ以降の状態遷移も無かったことになります。
zkRollupはゼロ知識証明を使用してシーケンサーの状態遷移の信頼性を担保します。ゼロ知識証明は、自分が特定の情報を持っていることをその情報を明らかにせずに証明する手法のことを指します。zkRollupではトランザクションとその状態遷移が正しいことをゼロ知識証明を使い証明を作成します。Ethereumチェーンではこの証明を検証することで、オフチェーンの処理が正しく行われたと信頼することができます。
zkRollupはEthereumチェーンが状態遷移を受け取った瞬間にそれが正しいことが分かるため、チェーンへの反映は即座に行われます。zkRollupの方が技術的難易度があるため、Optimisitc Rollupの方が先行しています。
Rollupを使用することで100倍ぐらいまでのスケーラビリティ性能が得られると言われています。
Ethereum2.0+Rollup
Ethereum2.0とRollupについて簡単に説明してきましたが、これらは独立した概念なのでしょうか?いいえ、その真髄は両者を組み合わせることで威力を発揮します。事実、Ethereumのロードマップ A rollup-centric ethereum roadmap で述べられている通り、Ethereumはこれらの2つを組み合わせてスケーラビリティを高める方向に進んでいます。つまり、トランザクションの実行をRollupで行い、その結果をEthereum2.0のShardチェーンに保存します。これは、従来一つのチェーンにあった、データの可用性・耐分散性・セキュリティなどをEthereum2.0が担保し、実行レイヤーはRollupが担当することになります。両者を組み合わせることで、最終的には100000TPSほどになると言われています。
このレイヤー分割により、Ethereumはもともとあった分散性や安全性を維持しつつ、スケーラビリティを高める方向へ進んでいます。
まとめ
この記事ではEthereumのスケーラビリティ問題とEthereumの今後について説明しました。この内容は2022年4月19のLayer 2 AmsterdamでのDankrad Feist氏の発表「Keynote – Still no flying cars, but at least we get rollups」を見て、その後いくつか調査し自分なりに流れをシンプルに説明したものです。Layer 2 AmsterdamではEthereumのLayer2に関する色々なトークが行われましたが、Rollupをテーマにしたものが多くEthereum全体でRollupを重視していることを実感しました。それまでは、Rollupは単なるLayer2技術の一つだという認識だったのですが、Ethereum2.0以後も活用されるということで、今後個人的に注視していきたいと思っています。
参考
Keynote – Still no flying cars, but at least we get rollups (Apr 19 Morning sessionの動画の16分から)
A step-by-step roadmap for scaling rollups with calldata expansion and sharding
Solving the Blockchain Trilemma: On Scaling Challenges and their Solutions