@@ -4,15 +4,18 @@ mod merkle_tree;
44mod s3;
55mod types;
66
7- use crate :: aggregators:: { lib:: { AggregatedProof , ProofAggregationError } , sp1_aggregator:: { aggregate_proofs, SP1AggregationInput } , AlignedProof , ZKVMEngine } ;
8-
7+ use crate :: aggregators:: {
8+ lib:: { AggregatedProof , ProofAggregationError } ,
9+ sp1_aggregator:: { aggregate_proofs, SP1AggregationInput } ,
10+ AlignedProof , ZKVMEngine ,
11+ } ;
912
1013use alloy:: {
11- consensus:: { Blob , BlobTransactionSidecar } ,
14+ consensus:: BlobTransactionSidecar ,
1215 eips:: eip4844:: BYTES_PER_BLOB ,
1316 hex,
1417 network:: EthereumWallet ,
15- primitives:: { Address , FixedBytes } ,
18+ primitives:: Address ,
1619 providers:: { PendingTransactionError , ProviderBuilder } ,
1720 rpc:: types:: TransactionReceipt ,
1821 signers:: local:: LocalSigner ,
@@ -25,7 +28,6 @@ use std::str::FromStr;
2528use tracing:: { error, info, warn} ;
2629use types:: { AlignedProofAggregationService , AlignedProofAggregationServiceContract } ;
2730
28-
2931#[ derive( Debug ) ]
3032pub enum AggregatedProofSubmissionError {
3133 Aggregation ( ProofAggregationError ) ,
@@ -45,17 +47,17 @@ pub struct ProofAggregator {
4547
4648impl ProofAggregator {
4749 pub fn new ( config : & Config ) -> Self {
48- let rpc_url = config. eth_rpc_url . parse ( ) . expect ( "correct url " ) ;
50+ let rpc_url = config. eth_rpc_url . parse ( ) . expect ( "RPC URL should be valid " ) ;
4951 let signer = LocalSigner :: decrypt_keystore (
5052 config. ecdsa . private_key_store_path . clone ( ) ,
5153 config. ecdsa . private_key_store_password . clone ( ) ,
5254 )
53- . expect ( "Correct keystore signer" ) ;
55+ . expect ( "Keystore signer should be `cast wallet` compliant " ) ;
5456 let wallet = EthereumWallet :: from ( signer) ;
5557 let rpc_provider = ProviderBuilder :: new ( ) . wallet ( wallet) . on_http ( rpc_url) ;
56- let proof_aggregation_service: AlignedProofAggregationService :: AlignedProofAggregationServiceInstance < ( ) , alloy :: providers :: fillers :: FillProvider < alloy :: providers :: fillers :: JoinFill < alloy :: providers :: fillers :: JoinFill < alloy :: providers :: Identity , alloy :: providers :: fillers :: JoinFill < alloy :: providers :: fillers :: GasFiller , alloy :: providers :: fillers :: JoinFill < alloy :: providers :: fillers :: BlobGasFiller , alloy :: providers :: fillers :: JoinFill < alloy :: providers :: fillers :: NonceFiller , alloy :: providers :: fillers :: ChainIdFiller > > > > , alloy :: providers :: fillers :: WalletFiller < EthereumWallet > > , alloy :: providers :: RootProvider > > = AlignedProofAggregationService :: new (
58+ let proof_aggregation_service = AlignedProofAggregationService :: new (
5759 Address :: from_str ( & config. proof_aggregation_service_address )
58- . expect ( "Address to be correct " ) ,
60+ . expect ( "AlignedProofAggregationService address should be valid " ) ,
5961 rpc_provider,
6062 ) ;
6163 let fetcher = ProofsFetcher :: new ( config) ;
@@ -122,8 +124,7 @@ impl ProofAggregator {
122124 merkle_root,
123125 } ;
124126
125- aggregate_proofs ( input)
126- . map_err ( AggregatedProofSubmissionError :: Aggregation ) ?
127+ aggregate_proofs ( input) . map_err ( AggregatedProofSubmissionError :: Aggregation ) ?
127128 }
128129 } ;
129130 info ! ( "Proof aggregation program finished" ) ;
@@ -184,8 +185,17 @@ impl ProofAggregator {
184185 let data: Vec < u8 > = leaves. iter ( ) . flat_map ( |arr| arr. iter ( ) . copied ( ) ) . collect ( ) ;
185186 let mut blob_data: [ u8 ; BYTES_PER_BLOB ] = [ 0u8 ; BYTES_PER_BLOB ] ;
186187
187- for ( i, byte) in data. iter ( ) . enumerate ( ) {
188- blob_data[ i] = * byte;
188+ // We pad the data with 0x0 byte every 31 bytes so that the field elements
189+ // constructed from the bytes are less than BLS_MODULUS.
190+ //
191+ // See https://github.com/ethereum/consensus-specs/blob/86fb82b221474cc89387fa6436806507b3849d88/specs/deneb/polynomial-commitments.md#bytes_to_bls_field
192+ let mut offset = 0 ;
193+ for chunk in data. chunks ( 31 ) {
194+ blob_data[ offset] = 0x00 ;
195+ let start = offset + 1 ;
196+ let end = start + chunk. len ( ) ;
197+ blob_data[ start..end] . copy_from_slice ( chunk) ;
198+ offset += 32 ;
189199 }
190200
191201 // calculate kzg commitments for blob
@@ -197,12 +207,11 @@ impl ProofAggregator {
197207 c_kzg:: KzgProof :: compute_blob_kzg_proof ( & blob, & commitment. to_bytes ( ) , settings)
198208 . map_err ( |_| AggregatedProofSubmissionError :: BuildingBlobProof ) ?;
199209
200- // convert to alloy types
201- let blob = Blob :: from_slice ( & blob_data) ;
202- let commitment: FixedBytes < 48 > = FixedBytes :: from_slice ( commitment. to_bytes ( ) . as_slice ( ) ) ;
203- let proof: FixedBytes < 48 > = FixedBytes :: from_slice ( proof. to_bytes ( ) . as_slice ( ) ) ;
204-
205- let blob = BlobTransactionSidecar :: new ( vec ! [ blob] , vec ! [ commitment] , vec ! [ proof] ) ;
210+ let blob = BlobTransactionSidecar :: from_kzg (
211+ vec ! [ blob] ,
212+ vec ! [ commitment. to_bytes( ) ] ,
213+ vec ! [ proof. to_bytes( ) ] ,
214+ ) ;
206215 let blob_versioned_hash = blob
207216 . versioned_hash_for_blob ( 0 )
208217 . ok_or ( AggregatedProofSubmissionError :: BuildingBlobVersionedHash ) ?
0 commit comments