🎴

proto-danksharding(EIP-4844)の概要

2023/06/26に公開

proto-danksharding (EIP-4844)とは、Ethereumにshard blob transactionと呼ばれる新しいトランザクション形式を追加する提案です。shard blob transactionはblobと呼ばれる新しい形式のデータを持っているトランザクションで、大きなデータをEthereumに安価に公開するために利用できます。

また、EIP-4844はEthereumのスケーラビリティを大幅に向上させるdankshardingと呼ばれる構想に向けた最初のステップという側面もあります。

モチベーション

EIP-4844はrollupのための技術です。

Rollupとはoff chainの取引データを効率よく圧縮してEthereumで検証することで、Ethereumと同等のセキュリティを保ちながら安価な取引手数料を実現するスケーリングソリューションです。

Rollupは取引データの検証方式が異議申し立て方式に基づくoptimistic rollupと、ゼロ知識証明に基づくzkrollupに大別できますが、いずれにしても取引データをEthereum上に公開する必要があります。これは取引データが利用できなくなってしまうと

  1. optimistic rollupの場合は異議申し立てができずに資産が盗まれる
  2. zkrollupの場合は新しくゼロ知識証明が作れず資産がロックされる

という問題が発生するためです(data availability problem)。現状は最も安価なcalldataと呼ばれる形式で取引データが公開されているのですが、それでもまだ高価であるという問題があります。

EIP-4844はcalldataよりもより安価に利用できるblobと呼ばれるデータ形式を導入することで、この問題を緩和できると考えられています。

blobとは

blobはp = 52435875175126190479447740508185965837690552500527637822603658699938581184513として0\le x_i < pを満たす4096個の整数[x_0, \ldots, x_{4095}]からなります。

\frac{4096 \times \log_2 p}{8 \times 1024} = 127.4...なので、blob 1個あたり約127KBです。

EVMからblobの中身を直接読み取ることはできません。代わりにversioned_hashと呼ばれる256bitの値にアクセスできます。

versioned_hashはblobのcommitment(後に説明します)のハッシュを取ったものに、バージョン情報0x01を添付したものです。現在バージョンは0x01しかありませんが、今後異なるcommitmentスキームが導入された場合はこの値を変えて表現します。

EVMはBLOBHASHというopcodeでトランザクションが持っているblobのversioned_hashを取得することができます。

blobのgas fee

blobはEVMのfee marketとは独立したfee marketを持ちます。つまり、EIP-4844導入後は2つの独立したfee marketが存在することになります。

既存のgasと区別するために、blobに関するgasをdata gasと呼ぶことにします。

1つのblobは2**17data gasを消費します。1ブロックあたりの目標ガスはTARGET_DATA_GAS_PER_BLOCK = 3*(2**17)に設定されています。これは1 blockに3 blob未満なら次ブロックのdata gas priceは下がり、4 blob以上なら上がることを意味します。また1ブロックの最大ガスはMAX_DATA_GAS_PER_BLOCK = 6*(2**17)に設定されており、最大で6個のblobが入ります。

calldataと比較して具体的にどれほど安くなるかは、EIP-4844が導入され市場原理でgas priceが決まるまでわかりませんが、calldataと比べ用途が限定的なので、特に最初のうちは安価になると考えられます。

EIP-4844で導入されるprecompile contract

precompile contractとは、プロトコルで定められた固定のaddressを持つ、固有の機能が実装されたcontractのことです。EIP-4844ではaddress0x0Aを持つpoint evaluation precompileと呼ばれるものが導入されます。

その前に、EIP-4844で利用されているコミットメント(KZG commitment)について概要を解説します。

blobは0\le x_i < pを満たす4096個の整数[x_0, \ldots, x_{4095}]からなるのでした。これを多項式で表します。w^{4096} \equiv 1 \mod pを満たすような整数w (1 < w < p)を決め、f(w^i) \equiv x_i \mod pとなるように多項式fを作ります。以降は合同式をイコールとして略記することにします[1]

多項式fは4096個の指定された点を通るので、次数を4095に制限すると一意的に決まります[2]。多項式fをある方法(割愛します)で処理したものがKZG commitmentになります。

ある整数0 \le z < pに対して、f(z)の値をyと置きましょう。

公開情報をKZG commitmentと整数0 \le z < p, 0 \le y < pとしたときに、証明者が生成したproofを検証者がチェックすることで、検証者がf(z) = yが成り立つことを効率よく確認できる手法があります(Kate proof)。

この検証者の役割を担うのがpoint evaluation precompileです。point evaluation precompileはversioned_hash, z, y, commitment, proofを連結した入力を受け取り、検証に成功した場合はFIELD_ELEMENTS_PER_BLOB (4096)とBLS_MODULUS(p)を連結した値を返します。

point evaluation precompileの使用用途

point evaluation precompileを利用してf(w^i) = x_iを示すことで、与えられたversioned_hashに対応するblobのi番目の要素がx_iであることを証明することができます。EVMからはversioned_hashにしかアクセスできませんが、point evaluation precompileを使うとblobの中身をEVMに対して証明することができるのです。blob transaction内でこれを使うこともできますし、blob transactionではversioned_hashをストレージに保存する処理のみ行っておき、しばらく後の通常のtransactionでblobの内容を証明することもできます。

また、同じfに対する別のcommitmentが与えられたとき、blobとの同値性を示す効率的なテクニックが知られています(proof of equivalence)[3]。このテクニックを使えば、zk-snarkの公開入力としてblobを利用することができ、zkrollupのdata availabilityとしてblobが利用できるようになります。

なお、KGZ commitmentやKate proofの詳細は次の記事がおすすめです。

https://zenn.dev/dantehrani/articles/e8882dd72b514e#言語としての多項式

なぜblobなのか?

なぜcalldataなどの既存のデータ領域を増やすのではなく、わざわざblobのようなデータ形式を導入するのでしょうか?

いくつかの理由があります。

最大ブロックサイズが大きくなりすぎない
calldataのgasを安くすると、calldataが大部分を占めるブロックが生成された場合、ブロックのサイズが大きくなりすぎてしまいます。大きいブロックはネットワークでの伝搬が間に合わず、コンセンサスの失敗を引き起こす可能性があります。blobは1ブロックあたりの最大数が決まっており、ワーストケースでもブロックサイズが大きくなりすぎることはないのでこの問題が発生しません。

一定期間後に消去できる
blob本体はEVMからアクセスできないため、コンセンサスが終わればblob本体は不要になります。そのため、blobは一定期間(典型的には18日)後に消去することができます。

point evaluationができる
point evaluation precompileによってblobの中身を効率的に証明したり、zk-SANRKsと組み合わせることができます。

DAS(data availability sampling)と相性が良い
DAS(data availability sampling)とは、blobがダウンロード可能なことをblob全てをダウンロードせずに確認する技術です[4]。EIP-4844ではDASは実装されませんが、将来的にはDASによってblobの検証が高速化されます。blobを現在の段階で採用することで、DASをスムーズに導入できます。

参考文献

https://eips.ethereum.org/EIPS/eip-4844
https://www.eip4844.com/#faq

脚注
  1. これは演算を有限体\mathbb{F}_p上で行うということを意味します ↩︎

  2. 一般的にn個の指定された点を通る多項式はn-1次必要です。これはn=1のときfは定数であり、n=2のときfは直線であることを考えるとわかりやすいと思います ↩︎

  3. 詳しくは https://ethresear.ch/t/easy-proof-of-equivalence-between-multiple-polynomial-commitment-schemes-to-the-same-data/8188 ↩︎

  4. 詳しくは https://a16zcrypto.com/posts/article/an-overview-of-danksharding-and-a-proposal-for-improvement-of-das/ ↩︎

Discussion