Lasso
Last updated
Last updated
Lassoは、ルックアップテーブルTをいくつかの小さなサブテーブルに分解し、サブテーブルのみからルックアップを構築して結果を再構成することで、従来課題だった「テーブルサイズが肥大する」という課題を解決しました。
LassoではIndexed Lookup Tableをサポートします。インデックスbをテーブルTの中から検索し、結果aを取得します:
このインデックスはスパース行列Mとして表されます。
Lassoでは、結果aが正しいことをSumCheckプロトコルによって証明します。
Verifierがランダムにピックアップしたrに対して以下の式を証明します。
~は多重線形拡張を表します。
これはブールハイパーキューブ上で評価することで計算量を削減することができます。
nzはインデックス行列Mに対してこのように対応します。スパース行列を小さな要素のベクトルで表現しています。(Spartanのアイデアに近い)
さらに、テーブルサイズを効率的に表現するために、テーブルTをc個のサブテーブルT1, ..., Tcに分割します。そうすると、証明すべきことはこのようになります。gはサブテーブルを合成するための関数です。ADDやMULのようなオペレーションによって定義されています。
そうすると、コミットメントすべき値のサイズもN^{1/c}になるため、コミットメントコストを小さくすることができます。最終的に、このnzを多重線形表現に直したEi(j)を用いて以下のように定義されます。
上記を実際に証明するには以下のステップを必要とします。
ProverがVerifierにE, read_cts, final_cts, nzのコミットメントを送る
ctsはメモリチェックで使われるcounter polynomial
VerifierがProverにlog(s)個の乱数を送る
Primary SumCheckプロトコルを実行する
メモリ一貫性チェックプロトコルを実行する
Primary SumCheckでは、上記の証明をEi(r)=viの小さな証明に落とし込むために、事前に上記を証明してしまいます。viはSumCheckの最後のラウンドに得られた値です。
しかし、そうするとviが本当にテーブルからルックアップされた値であることを保証できません。なので、それを証明するために追加でメモリ一貫性チェックを実行しています。
メモリにおけるI∪W = R∪Fを証明します。Iは初期の集合、Wは書き込みの集合、Rは読み取りの集合、Fは終了時の集合です。
Lassoではフィンガープリント(ハッシュのようなもの)を利用してこれを効率的に証明します。ある値t,v,aフィンガープリントは以下のように計算されます。これはReed-solomonフィンガープリントと呼ばれます。
もしt,v,aがベクトルのときは、このようにフィンガープリントの積を計算します。
このフィンガープリントを用いることでI∪W = R∪Fを効率的に証明します。
多重線形拡張に直すと、R, W, I, Fは以下のようになります。
ひとつのマルチセットフィンガープリントHに注目すると、フィンガープリントhのバイナリツリーのような乗算回路として表現できます。この乗算回路の証明はを用いて証明できます。