Greco
概要
zkFHEをリファクタリングしてコードを移管したPSEのzkFHEライブラリ
あくまで実用段階ではなく研究目的なのでzkpのベンチマークを測るコマンドくらいしか用意されていない印象
encryptの部分もsample_polynomial()を使っているし、加算・乗算などの実行は確認できなかった
そもそもbfv-pyのcli.pyとかでも加算・乗算は実行されない..あくまで暗号化・復号化までの導線が目的っぽい
よくみるとEvalAdd()は実装されているが、乗算はまだ未定義のようだ
2. 構成
script:zkpに必要なパラメータを渡すためのスクリプト
circuit_sk.py
utils.py
assign_to_circuit..別にcircuit関係なくね?
src:zkpに関する実装。
poly.py
sk_encryption_circuit.rs
2.1 circuit_sk
まずはsecret key proofに必要なパラメータの生成を行う。これはcircuit_sk.pyに定義されている。
実行結果は以下のようになる。各引数は以下の通り
-n でリング多項式の次数を指定し、-tで平文のmodulesを指定する。
-qisは暗号文のqにおけるi番目のCRT basisである
code:gen_param
$python3 scripts/circuit_sk.py -n 4096 -qis '[
27424203952895201,
27424203952895203
]' -t 65537
Halo2 Circuit Profile:
Total Advice Cells Needed: 1015690
Phase 0 - Assignment:
- Count: 36860, Percentage: 3.63%
Phase 1 - Assignment:
- Count: 5, Percentage: 0.00%
Phase 1 - Range Check:
- Count: 905080, Percentage: 89.11%
Phase 1 - Evaluation at Gamma Constraint:
- Count: 73713, Percentage: 7.26%
Phase 1 - Correct Encryption Constraint:
- Count: 32, Percentage: 0.00%
ENCRYPTION PHASEでFHEにおけるplaintextを渡さないのは何故だろう?
この結果、以下の3つのファイルが生成される。
./src/data/sk_enc_{n}_{qis_len}x{qis_bitsize}_{t}.json
特定のパラメータのテストに使用できる回路への入力を含んで生成される。これには、ランダムな秘密鍵、ランダムな平文メッセージ、秘密鍵の下で暗号化された対応する暗号文が含まれる。
./src/data/sk_enc_{n}_{qis_len}x{qis_bitsize}_{t}_zeroes.json
このファイルでは、入力多項式の係数はすべてゼロに設定されている。この入力は、実際の入力が不明な鍵生成時に使用される
./src/constants/sk_enc_constants_{n}_{qis_len}x{qis_bitsize}_{t}.rs
回路のgeneric constantsを含む。これらはコンパイル時に既知であるべきなので、入力から分離していることに注意
2.2 sk_encryption_circuit
circuit_skで作成したパラーメータを用いてゼロ知識証明を生成する。
code:test_sk_enc_full_prover
pub fn test_sk_enc_full_prover() {
// 1. Define the inputs of the circuit.
// Since we are going to use this circuit instance for key gen, we can use an input file in which all the coefficients are set to 0
let file_path_zeroes = "src/data/sk_enc_4096_2x55_65537_zeroes.json";
let mut file = File::open(file_path_zeroes).unwrap();
let mut data = String::new();
file.read_to_string(&mut data).unwrap();
let empty_sk_enc_circuit = serde_json::from_str::<BfvSkEncryptionCircuit>(&data).unwrap();
// 2. Generate (unsafe) trusted setup parameters
// Here we are setting a small k for optimization purposes
let k = 14;
let kzg_params = gen_srs(k as u32);
// 3. Build the circuit for key generation,
let mut key_gen_builder =
RlcCircuitBuilder::from_stage(CircuitBuilderStage::Keygen, 0).use_k(k);
let rlc_circuit = RlcExecutor::new(key_gen_builder, empty_sk_enc_circuit.clone());
// The parameters are auto configured by halo2 lib to fit all the columns into the k-sized table
let rlc_circuit_params = rlc_circuit.0.calculate_params(Some(9));
// 4. Generate the verification key and the proving key
let vk = keygen_vk(&kzg_params, &rlc_circuit).unwrap();
let pk = keygen_pk(&kzg_params, vk, &rlc_circuit).unwrap();
let break_points = rlc_circuit.0.builder.borrow().break_points();
drop(rlc_circuit);
// 5. Generate the proof, here we pass the actual inputs
let mut proof_gen_builder: RlcCircuitBuilder<Fr> =
RlcCircuitBuilder::from_stage(CircuitBuilderStage::Prover, 0)
.use_params(rlc_circuit_params);
proof_gen_builder.base.set_lookup_bits(k - 1);
let file_path = "src/data/sk_enc_4096_2x55_65537.json";
let mut file = File::open(file_path).unwrap();
let mut data = String::new();
file.read_to_string(&mut data).unwrap();
let sk_enc_circuit = serde_json::from_str::<BfvSkEncryptionCircuit>(&data).unwrap();
let rlc_circuit = RlcExecutor::new(proof_gen_builder, sk_enc_circuit.clone());
rlc_circuit
.0
.builder
.borrow_mut()
.set_break_points(break_points);
let proof = gen_proof(&kzg_params, &pk, rlc_circuit);
// 6. Verify the proof
check_proof(&kzg_params, pk.get_vk(), &proof, true);
}
zkの検証はどうやってる?
調べたいこと
実行結果を暗号化したままスマートコントラクトをトリガーすることは可能か?
TSNのような形をとる場合はValidatorの仕様を変える必要が出そう?
witness encryptionを使えば理論的には可能か
なぜdecryptionが必要なのか?greccoはencryptの証明だけでは?
BFV-py
BFV classとBFVCrt classが存在する。
中国剰余定理(CRT)ってなんだっけ???
Introduction to the BFV FHE Schemeに記述がないので特別なものなのかな?
どうやらAn Improved RNS Variant of the BFV Homomorphic Encryption SchemでCRTを使ったアプローチが展開されたようだ
どちらのクラスにもenc/decが実装されているが、後者にはEvaladdが存在しない。grecoのテストでは前者を使っている(addは実行していない)
sample polynomialを使わずにmessageを指定したいが、そもそもencordingって実装されていないの、それを実装するところからスタートになる。
Evalmulを実装しようとしたが、理論的に理解が足りなかった
SecretKeyEncryptとは?
ブートストラップ で秘密鍵を使ったre-encryptionが行われる。そのためにSecretKeyEncryptが使われる?
Introduction to the BFV FHE SchemeやAn Improved RNS Variant of the BFV Homomorphic Encryption Schemeにはあんまり記述がない
やること
An Improved RNS Variant of the BFV Homomorphic Encryption Schemeを読んでCRTを使ったアプローチの理解を深める
SecretKeyEncryptを参照できる文献を探す
encordingのissueを投げる
FHEからスマコンを発火する方法を知りたい
Circom→FHE circuitでいろんなgeneral application作れますよーってどういうこと?w
参考
試したいこと:sample polynomialを使わずにmessageを指定する
そもそもencordingって実装されていないの、それを実装するところからスタートになる。