impl bls encoder

This commit is contained in:
M Alghazwi 2025-06-26 14:09:24 +02:00
parent 22916acf93
commit 181a4e234a
8 changed files with 582 additions and 22 deletions

View File

@ -2,6 +2,7 @@
<module type="EMPTY_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/benches" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>

374
Cargo.lock generated
View File

@ -25,12 +25,27 @@ dependencies = [
"zerocopy",
]
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "allocator-api2"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "anes"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
[[package]]
name = "anstream"
version = "0.6.19"
@ -352,12 +367,24 @@ dependencies = [
"generic-array",
]
[[package]]
name = "bumpalo"
version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "cast"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cc"
version = "1.2.27"
@ -373,6 +400,33 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "ciborium"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
dependencies = [
"ciborium-io",
"ciborium-ll",
"serde",
]
[[package]]
name = "ciborium-io"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
[[package]]
name = "ciborium-ll"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
dependencies = [
"ciborium-io",
"half",
]
[[package]]
name = "clap"
version = "4.5.40"
@ -428,6 +482,42 @@ dependencies = [
"libc",
]
[[package]]
name = "criterion"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
dependencies = [
"anes",
"cast",
"ciborium",
"clap",
"criterion-plot",
"is-terminal",
"itertools 0.10.5",
"num-traits",
"once_cell",
"oorandom",
"plotters",
"rayon",
"regex",
"serde",
"serde_derive",
"serde_json",
"tinytemplate",
"walkdir",
]
[[package]]
name = "criterion-plot"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
dependencies = [
"cast",
"itertools 0.10.5",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
@ -453,6 +543,12 @@ version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
[[package]]
name = "crypto-common"
version = "0.1.6"
@ -499,6 +595,7 @@ dependencies = [
"ark-poly-commit",
"ark-std",
"clap",
"criterion",
"itertools 0.14.0",
"rand 0.9.1",
"reed-solomon-erasure",
@ -581,6 +678,16 @@ dependencies = [
"wasi 0.14.2+wasi-0.2.4",
]
[[package]]
name = "half"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
dependencies = [
"cfg-if",
"crunchy",
]
[[package]]
name = "hashbrown"
version = "0.12.3"
@ -614,6 +721,12 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
[[package]]
name = "instant"
version = "0.1.13"
@ -623,12 +736,32 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "is-terminal"
version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [
"hermit-abi",
"libc",
"windows-sys",
]
[[package]]
name = "is_terminal_polyfill"
version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
"either",
]
[[package]]
name = "itertools"
version = "0.13.0"
@ -647,6 +780,22 @@ dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "js-sys"
version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]]
name = "keccak"
version = "0.1.5"
@ -678,6 +827,12 @@ dependencies = [
"scopeguard",
]
[[package]]
name = "log"
version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "lru"
version = "0.7.8"
@ -687,6 +842,12 @@ dependencies = [
"hashbrown 0.12.3",
]
[[package]]
name = "memchr"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "merlin"
version = "3.0.0"
@ -740,6 +901,12 @@ version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
[[package]]
name = "oorandom"
version = "11.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
[[package]]
name = "parking_lot"
version = "0.11.2"
@ -777,6 +944,34 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
name = "plotters"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
dependencies = [
"num-traits",
"plotters-backend",
"plotters-svg",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "plotters-backend"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
[[package]]
name = "plotters-svg"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
dependencies = [
"plotters-backend",
]
[[package]]
name = "ppv-lite86"
version = "0.2.21"
@ -913,12 +1108,94 @@ dependencies = [
"spin",
]
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "rustversion"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
[[package]]
name = "ryu"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
dependencies = [
"winapi-util",
]
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "serde"
version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.103",
]
[[package]]
name = "serde_json"
version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
]
[[package]]
name = "sha2"
version = "0.10.9"
@ -982,6 +1259,16 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "tinytemplate"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
dependencies = [
"serde",
"serde_json",
]
[[package]]
name = "tracing"
version = "0.1.41"
@ -1041,6 +1328,16 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "walkdir"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
"winapi-util",
]
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
@ -1056,6 +1353,74 @@ dependencies = [
"wit-bindgen-rt",
]
[[package]]
name = "wasm-bindgen"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
"syn 2.0.103",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.103",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
dependencies = [
"unicode-ident",
]
[[package]]
name = "web-sys"
version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "winapi"
version = "0.3.9"
@ -1072,6 +1437,15 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
"windows-sys",
]
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"

View File

@ -20,3 +20,8 @@ ark-poly-commit = "0.5.0"
anyhow = "1.0.95"
reed-solomon-erasure = { version = "6.0.0", features = [ "simd-accel" ] }
ark-crypto-primitives = "0.5.0"
criterion = "0.5.1"
[[bench]]
name = "encoder"
harness = false

View File

@ -19,6 +19,30 @@ pub struct Data<T>{
pub matrix: Vec<Vec<T>>,
}
impl<T> Data<T>{
pub fn get_row(&self, idx: usize) -> &Vec<T>{
&self.matrix[idx]
}
pub fn get_row_mut(&mut self, idx: usize) -> &mut Vec<T>{
&mut self.matrix[idx]
}
pub fn get_col(&self, idx: usize) -> Vec<&T> {
self.matrix
.iter()
.map(|row| &row[idx])
.collect()
}
pub fn get_col_mut(&mut self, idx: usize) -> Vec<&mut T> {
self.matrix
.iter_mut()
.map(|row| &mut row[idx])
.collect()
}
}
impl DataMatrix<u8> for Data<u8> {
type Params = Params;

View File

@ -1,8 +1,16 @@
use std::marker::PhantomData;
use anyhow::{anyhow, Result};
use ark_bls12_381::Bls12_381;
use ark_ec::pairing::Pairing;
use ark_ff::PrimeField;
use ark_poly::{DenseUVPolynomial, GeneralEvaluationDomain, Polynomial};
use ark_poly::univariate::DensePolynomial;
use reed_solomon_erasure::galois_8::ReedSolomon;
use crate::byte_data::{Data, Params};
use crate::traits::Encoder;
use ark_poly::domain::EvaluationDomain;
use crate::field_matrix::Matrix;
// ------------- RS Encoder ------------
pub struct RSEncoder<T>{
phantom_data: PhantomData<T>
@ -95,3 +103,92 @@ impl Encoder<u8> for RSEncoder<u8> {
Ok(())
}
}
// ---------------- Bls12_381 Encoder -----------------
pub type E = Bls12_381;
pub type F = <E as Pairing>::ScalarField;
pub type UniPoly381 = DensePolynomial<F>;
pub struct BLSEncoder<T>{
phantom_data: PhantomData<T>
}
impl BLSEncoder<u8>{
pub fn new() -> Self{
Self{
phantom_data: PhantomData::default()
}
}
}
impl Encoder<u8> for BLSEncoder<u8> {
type Params = Params;
type DataMatrix<T> = Data<u8>;
fn encode(data: &mut Self::DataMatrix<u8>) -> Result<()> {
for i in 0..data.params.m {
let _col = Self::encode_col(data, i)?;
}
Ok(())
}
fn encode_col(data: &mut Self::DataMatrix<u8>, c: usize) -> Result<Vec<u8>> {
let n = data.params.n.clone();
let k = data.params.k.clone();
let mut col = data.get_col_mut(c);
let col_f: Vec<F> = col.iter().map(|i| <F as PrimeField>::from_le_bytes_mod_order(&i.clone().to_le_bytes())).collect();
let poly_poly = UniPoly381::from_coefficients_slice(&col_f);
let domain: GeneralEvaluationDomain<F> = EvaluationDomain::<F>::new(n).unwrap();
let mut new_col: Vec<u8> = vec![];
for i in k..n{
let eval = poly_poly.evaluate(&domain.element(i));
new_col.push(eval.0.0[0] as u8);
*col[i] = eval.0.0[0] as u8;
}
Ok(new_col)
}
fn reconstruct(_params: Params, _matrix_opts: &mut Vec<Option<Vec<u8>>>) -> Result<()> {
todo!()
}
}
// --------- BLS Encoder over FieldMatrix ----------------
impl Encoder<F> for BLSEncoder<F> {
type Params = Params;
type DataMatrix<T> = Matrix<F>;
fn encode(data: &mut Matrix<F>) -> Result<()> {
for i in 0..data.params.m {
let _col = Self::encode_col(data, i)?;
}
Ok(())
}
fn encode_col(data: &mut Matrix<F>, c: usize) -> Result<Vec<F>> {
// let n = data.params.n.clone();
// let k = data.params.k.clone();
// let mut col = data.get_col_mut(c);
// let col_f: Vec<F> = col.iter().map(|i| <F as PrimeField>::from_le_bytes_mod_order(&i.clone().to_le_bytes())).collect();
// let poly_poly = UniPoly381::from_coefficients_slice(&col_f);
// let domain: GeneralEvaluationDomain<F> = EvaluationDomain::<F>::new(n).unwrap();
//
// let mut new_col: Vec<u8> = vec![];
// for i in k..n{
// let eval = poly_poly.evaluate(&domain.element(i));
// new_col.push(eval.0.0[0] as u8);
// *col[i] = eval.0.0[0] as u8;
// }
//
// Ok(new_col)
todo!()
}
fn reconstruct(_params: Params, _matrix_opts: &mut Vec<Option<Vec<F>>>) -> Result<()> {
todo!()
}
}

View File

@ -1,32 +1,33 @@
use ark_ff::Field;
use ark_std::rand::Rng;
use ark_std::UniformRand;
use crate::byte_data::Data;
use crate::byte_data::{Data, Params};
/// a Field matrix with `row` number of rows and `cols` number of columns
#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug)]
pub struct Matrix<F: Field + Clone> {
pub rows: usize,
pub cols: usize,
pub data: Vec<Vec<F>>,
pub params: Params,
pub elms: Vec<Vec<F>>,
}
impl<F: Field + Clone> Matrix<F> {
/// Creates a new matrix from given field data.
pub fn new(rows: usize, cols: usize, data: Vec<Vec<F>>) -> Self {
assert!(data.len() == rows, "number of rows must match");
for row in &data {
assert!(row.len() == cols, "each row must have `cols` elements");
pub fn new(params: Params, elms: Vec<Vec<F>>) -> Self {
assert!(elms.len() == params.n, "number of rows must match");
for row in &elms {
assert!(row.len() == params.m, "each row must have `m` elements");
}
Matrix { rows, cols, data }
Matrix { params, elms }
}
/// Generates a random matrix with given dimensions, uses given rng for randomness.
pub fn new_random<R: Rng + ?Sized>(rows: usize, cols: usize, rng: &mut R) -> Self
pub fn new_random<R: Rng + ?Sized>(params: Params, rng: &mut R) -> Self
where
F: UniformRand,
{
let rows = params.n;
let cols = params.m;
let mut data = Vec::with_capacity(rows);
for _ in 0..rows {
let mut row = Vec::with_capacity(cols);
@ -35,7 +36,7 @@ impl<F: Field + Clone> Matrix<F> {
}
data.push(row);
}
Matrix { rows, cols, data }
Matrix { params, elms: data }
}
/// Creates a new matrix from given data struct
@ -51,24 +52,38 @@ impl<F: Field + Clone> Matrix<F> {
}
field_data.push(row);
}
Matrix { rows, cols, data:field_data }
Matrix { params: data.params.clone(), elms:field_data }
}
/// get the row at 0<idx<n
pub fn row(&self, idx: usize) -> Vec<F>{
assert!(idx < self.rows, "Row index out of bounds");
self.data[idx].to_vec()
assert!(idx < self.params.n, "Row index out of bounds");
self.elms[idx].to_vec()
}
/// get mut the row at 0<idx<n
pub fn row_mut(&mut self, idx: usize) -> &mut Vec<F>{
assert!(idx < self.rows, "Row index out of bounds");
&mut self.data[idx]
assert!(idx < self.params.n, "Row index out of bounds");
&mut self.elms[idx]
}
pub fn get_col(&self, idx: usize) -> Vec<&F> {
self.elms
.iter()
.map(|row| &row[idx])
.collect()
}
pub fn get_col_mut(&mut self, idx: usize) -> Vec<&mut F> {
self.elms
.iter_mut()
.map(|row| &mut row[idx])
.collect()
}
/// Print matrix
pub fn pretty_print(&self) {
for (i, shard) in self.data.iter().enumerate() {
for (i, shard) in self.elms.iter().enumerate() {
print!("row {:>2}: ", i);
for &b in shard {
print!("{:>3} ", b);

View File

@ -66,7 +66,7 @@ impl PolynomialCommitmentScheme for KZGPolyComm {
let (ck, _vk) = PCS::trim(&srs.pp, degree, degree, Some(&[degree]))?;
let mut row_polynomials = vec![];
let timer = start_timer!(|| format!("Poly evaluations and interpolation for {} rows", degree));
for i in 0..matrix.rows{
for i in 0..matrix.params.n{
let poly_evals = Evaluations::from_vec_and_domain(matrix.row(i), srs.ploycommit_domain.clone());
let row_poly = poly_evals.interpolate();
let label = String::from(format!("row_poly_{}", i));

View File

@ -2,11 +2,10 @@
mod tests {
use crate::byte_data::{Data, Params};
use ark_poly::{EvaluationDomain};
use reed_solomon_erasure::galois_8::ReedSolomon;
use crate::kzg::{F, KZGPolyComm};
use crate::field_matrix::Matrix;
use ark_poly_commit::{Polynomial};
use crate::encoder::RSEncoder;
use crate::encoder::{BLSEncoder, RSEncoder};
use crate::traits::{DataMatrix, Encoder, PolynomialCommitmentScheme};
#[test]
@ -54,6 +53,51 @@ mod tests {
}
}
#[test]
fn test_bls_encodeer() {
// test parameters
let k = 4;
let p = 4;
let n = k + p;
let m = 8;
// generate Data with random content
let params = Params {
k,
n,
m,
};
let mut data = Data::new_random(params);
println!("data #row ={}", data.matrix.len());
println!("data #col ={}", data.matrix[0].len());
println!("data before encoding:");
data.pretty_print();
// original data matrix
let original: Vec<Vec<u8>> = data.matrix[..k].to_vec();
// encode
BLSEncoder::encode(&mut data).expect("encode failed");
println!("data after encoding:");
data.pretty_print();
// verify data matrix unchanged
assert_eq!(data.matrix[..k], original[..]);
// simulate loss of one data and one parity rows
let mut matrix_opts: Vec<_> = data.matrix.iter().cloned().map(Some).collect();
matrix_opts[1] = None;
matrix_opts[k] = None;
// TODO: reconstruct missing rows
// BLSEncoder::reconstruct(data.params.clone(), &mut matrix_opts).expect("reconstruction should succeed");
// verify reconstruction for data shards
// for i in 0..k {
// let recovered = matrix_opts[i].clone().unwrap();
// assert_eq!(recovered, &original[i][..]);
// }
}
#[test]
fn test_commit_rows() {
// dimensions: 8 rows (4 parity), 8 columns