2024.04.08
EIP-648トランザクションの並列化
こんにちは。次世代システム研究室のT.M です。
はじめに
先日、Ethereum においてDencun ハードフォークが実施されました。このハードフォークでは、EIP-4844 であるproto-danksharding が実現し、rollup の取引手数料が100倍以上削減されました。これを受けて、Ethereum の開発者であるVitalik 氏がEthereum のスケーリングに関するブログを発表されました。そのブログでは、今後のスケーリングの方向性やスケーリングによりもたらされるアプリケーションについて書かれていました。私はスケーリングの方法の一つである、EIP-648 の並列化について興味を持ち、調査しました。
既存のトランザクションの仕様
トランザクションはブロック内で直列に並べられており、順番に処理されます。トランザクションT にはgas が設定され、ブロックのgas_limit を超えないという条件があります。このとき、gas、gas_limit は以下を満たします。ただし、total_gas_used をT より前のトランザクションのgas の和とします。
T.gas + T.total_gas_used < gas_limit
並列化のアイデア
トランザクションにranges というアドレス空間の配列を用意します。トランザクションは、ranges の空間内のアドレスに対してのみ、CALL、CREATE、CALLCODE、DELEGATECALL、STATICCALL をすることができます。トランザクションの処理において、ranges の空間外のアドレスにそれらを実行した場合、エラーとなります。ranges が交差しない場合において、トランザクションを並列で処理をすることができます。
具体的な仕様
最大並列数をMAX_THREADS と定義します。
gas_height
starting_gas_height、finishing_gas_height を以下のように定義します。ただし、トランザクションT’ はT よりMAX_THREADS 以上インデックスが小さいトランザクションまたはT と交差するトランザクションのうち、finishing_gas_height が最大のトランザクションです。
T.finishing_gas_height = T.starting_gas_height + T.gas
T.starting_gas_height = T’.finishing_gas_height
ブロック全体のtotal_gas_used ではなく、各スレッドのgas_height を計算します。
gas_limit
gas_limit の条件が以下のように変更になります。
T.gas + T.starting_gas_height > gas_limit
gas_height は各スレッドのgas の合計であり、それを超えないようにブロックを生成します。
ranges
reader_ranges、writer_ranges をそれぞれ読み取りができるアドレス空間、書き込みができるアドレス空間とします。このとき、T とT’ が交差する、とは、T の読み書きのアドレス空間とT’ の書き込みのアドレス空間が交差する、と定義します。書き込みのアドレス空間は読み書きのアドレス空間より小さいため、トランザクションの交差するケースが減り、並列に処理することができるトランザクションを増やすことができます。
さいごに
EIP-648 で提案されているトランザクションの並列化の仕様について解説をしました。アイデアとしては、シンプルで簡単なものでした。これがそのまま実装されるわけではないかと思いますが、このアイデアをもとにしたスケーリング技術は今後出てくるかと思いますので、注目したいです。
次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。
皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD