@@ -29,3 +29,69 @@ impl EcBackend for BlstBackend {
2929
3030#[ cfg( feature = "c_bindings" ) ]
3131kzg:: c_bindings_eip7594!( BlstBackend ) ;
32+
33+ #[ cfg( feature = "c_bindings" ) ]
34+ #[ no_mangle]
35+ pub unsafe extern "C" fn compute_verify_cell_kzg_proof_batch_challenge (
36+ challenge_out : * mut blst:: blst_fr ,
37+ commitment_bytes : * const kzg:: eth:: c_bindings:: Bytes48 ,
38+ num_commitments : u64 ,
39+ commitment_indices : * const u64 ,
40+ cell_indices : * const u64 ,
41+ cells : * const kzg:: eth:: c_bindings:: Cell ,
42+ proofs_bytes : * const kzg:: eth:: c_bindings:: Bytes48 ,
43+ num_cells : u64 ,
44+ ) -> kzg:: eth:: c_bindings:: CKzgRet {
45+ use crate :: handle_ckzg_badargs;
46+ use kzg:: { eip_4844:: BYTES_PER_FIELD_ELEMENT , Fr , G1 } ;
47+
48+ * challenge_out = blst:: blst_fr:: default ( ) ;
49+
50+ let commitment_bytes =
51+ unsafe { core:: slice:: from_raw_parts ( commitment_bytes, num_commitments as usize ) } ;
52+ let commitments = handle_ckzg_badargs ! ( commitment_bytes
53+ . iter( )
54+ . map( |v| FsG1 :: from_bytes( & v. bytes) )
55+ . collect:: <Result <Vec <_>, _>>( ) ) ;
56+
57+ let commitment_indices =
58+ unsafe { core:: slice:: from_raw_parts ( commitment_indices, num_cells as usize ) } ;
59+ let commitment_indices = commitment_indices
60+ . iter ( )
61+ . map ( |v| * v as usize )
62+ . collect :: < Vec < _ > > ( ) ;
63+
64+ let cell_indices = unsafe { core:: slice:: from_raw_parts ( cell_indices, num_cells as usize ) } ;
65+ let cell_indices = cell_indices. iter ( ) . map ( |c| * c as usize ) . collect :: < Vec < _ > > ( ) ;
66+
67+ let cells = unsafe { core:: slice:: from_raw_parts ( cells, num_cells as usize ) } ;
68+ let cells = handle_ckzg_badargs ! ( cells
69+ . iter( )
70+ . flat_map( |c| c
71+ . bytes
72+ . chunks( BYTES_PER_FIELD_ELEMENT )
73+ . map( |bytes| FsFr :: from_bytes( & bytes) ) )
74+ . collect:: <Result <Vec <_>, _>>( ) ) ;
75+
76+ let proofs_bytes = unsafe { core:: slice:: from_raw_parts ( proofs_bytes, num_cells as usize ) } ;
77+ let proofs = handle_ckzg_badargs ! ( proofs_bytes
78+ . iter( )
79+ . map( |b| FsG1 :: from_bytes( & b. bytes) )
80+ . collect:: <Result <Vec <_>, _>>( ) ) ;
81+
82+ let challenge = handle_ckzg_badargs ! (
83+ <FsKZGSettings as kzg:: DAS <BlstBackend >>:: compute_verify_cell_kzg_proof_batch_challenge(
84+ kzg:: eth:: FIELD_ELEMENTS_PER_CELL ,
85+ & commitments,
86+ & commitment_indices,
87+ & cell_indices,
88+ & cells,
89+ & proofs,
90+ kzg:: eth:: FIELD_ELEMENTS_PER_BLOB
91+ )
92+ ) ;
93+
94+ * challenge_out = challenge. 0 ;
95+
96+ kzg:: eth:: c_bindings:: CKzgRet :: Ok
97+ }
0 commit comments