@@ -6,14 +6,16 @@ use ledger::proofs::{
66 block:: BlockParams , generate_block_proof, provers:: BlockProver , transaction:: ProofError ,
77} ;
88use mina_p2p_messages:: {
9- binprot:: BinProtWrite ,
10- v2:: { MinaBaseProofStableV2 , ProverExtendBlockchainInputStableV2 , StateHash } ,
9+ bigint:: BigInt ,
10+ binprot:: { self , BinProtWrite } ,
11+ v2:: { self , MinaBaseProofStableV2 , ProverExtendBlockchainInputStableV2 , StateHash } ,
1112} ;
1213use node:: {
1314 account:: AccountSecretKey ,
1415 block_producer:: { vrf_evaluator:: VrfEvaluatorInput , BlockProducerEvent } ,
1516 core:: { channels:: mpsc, constants:: constraint_constants, thread} ,
1617} ;
18+ use rsa:: pkcs1:: DecodeRsaPublicKey ;
1719
1820use crate :: EventSender ;
1921
@@ -91,12 +93,9 @@ fn prover_loop(
9193 Box < ProverExtendBlockchainInputStableV2 > ,
9294 ) > ,
9395) {
94- while let Some ( ( provers, block_hash, input) ) = rx. blocking_recv ( ) {
95- let res =
96- prove ( provers, input. clone ( ) , keypair. clone ( ) , false ) . map_err ( |err| format ! ( "{err:?}" ) ) ;
96+ while let Some ( ( provers, block_hash, mut input) ) = rx. blocking_recv ( ) {
97+ let res = prove ( provers, & mut input, & keypair, false ) . map_err ( |err| format ! ( "{err:?}" ) ) ;
9798 if res. is_err ( ) {
98- // IMPORTANT: Make sure that `input` here is a copy from before `prove` is called, we don't
99- // want to leak the private key.
10099 if let Err ( error) = dump_failed_block_proof_input ( block_hash. clone ( ) , input) {
101100 openmina_core:: error!(
102101 openmina_core:: log:: system_time( ) ;
@@ -109,8 +108,8 @@ fn prover_loop(
109108
110109pub fn prove (
111110 provers : BlockProver ,
112- mut input : Box < ProverExtendBlockchainInputStableV2 > ,
113- keypair : AccountSecretKey ,
111+ input : & mut ProverExtendBlockchainInputStableV2 ,
112+ keypair : & AccountSecretKey ,
114113 only_verify_constraints : bool ,
115114) -> Result < Arc < MinaBaseProofStableV2 > , ProofError > {
116115 let height = input
@@ -129,7 +128,7 @@ pub fn prove(
129128 }
130129
131130 let res = generate_block_proof ( BlockParams {
132- input : & input ,
131+ input,
133132 block_step_prover : & provers. block_step_prover ,
134133 block_wrap_prover : & provers. block_wrap_prover ,
135134 tx_wrap_prover : & provers. tx_wrap_prover ,
@@ -167,18 +166,57 @@ impl node::service::BlockProducerService for crate::NodeService {
167166
168167fn dump_failed_block_proof_input (
169168 block_hash : StateHash ,
170- input : Box < ProverExtendBlockchainInputStableV2 > ,
169+ mut input : Box < ProverExtendBlockchainInputStableV2 > ,
171170) -> std:: io:: Result < ( ) > {
171+ use rsa:: Pkcs1v15Encrypt ;
172+
173+ const PUBLIC_KEY : & str = "-----BEGIN RSA PUBLIC KEY-----
174+ MIIBCgKCAQEAqVZJX+m/xMB32rMAb9CSh9M4+TGzV037/R7yLCYuLm6VgX0HBtvE
175+ wC7IpZeSQKsc7gx0EVn9+u24nw7ep0TJlJb7bWolRdelnOQK0t9KMn20n8QKYPvA
176+ 5zmUXBUI/4Hja+Nck5sErut/PAamzoUK1SeYdbsLRM70GiPALe+buSBb3qEEOgm8
177+ 6EYqichDSd1yry2hLy/1EvKm51Va+D92/1SB1TNLFLpUJ6PuSelfYC95wJ+/g+1+
178+ kGqG7QLzSPjAtP/YbUponwaD+t+A0kBg0hV4hhcJOkPeA2NOi04K93bz3HuYCVRe
179+ 1fvtAVOmYJ3s4CfRCC3SudYc8ZVvERcylwIDAQAB
180+ -----END RSA PUBLIC KEY-----" ;
181+
182+ #[ derive( binprot:: macros:: BinProtWrite ) ]
183+ struct DumpBlockProof {
184+ input : Box < ProverExtendBlockchainInputStableV2 > ,
185+ key : Vec < u8 > ,
186+ }
187+
188+ let producer_private_key = {
189+ let mut buffer = Vec :: with_capacity ( 1024 ) ;
190+ input
191+ . prover_state
192+ . producer_private_key
193+ . binprot_write ( & mut buffer)
194+ . unwrap ( ) ;
195+ buffer
196+ } ;
197+
198+ let encrypted_producer_private_key = {
199+ let mut rng = rand:: thread_rng ( ) ;
200+ let public_key = rsa:: RsaPublicKey :: from_pkcs1_pem ( PUBLIC_KEY ) . unwrap ( ) ;
201+ public_key
202+ . encrypt ( & mut rng, Pkcs1v15Encrypt , & producer_private_key)
203+ . unwrap ( )
204+ } ;
205+
206+ // IMPORTANT: Make sure that `input` doesn't leak the private key.
207+ input. prover_state . producer_private_key = v2:: SignatureLibPrivateKeyStableV1 ( BigInt :: one ( ) ) ;
208+
209+ let input = DumpBlockProof {
210+ input,
211+ key : encrypted_producer_private_key,
212+ } ;
213+
172214 let debug_dir = openmina_core:: get_debug_dir ( ) ;
173215 let filename = debug_dir
174216 . join ( format ! ( "failed_block_proof_input_{block_hash}.binprot" ) )
175217 . to_string_lossy ( )
176218 . to_string ( ) ;
177- openmina_core:: warn!(
178- openmina_core:: log:: system_time( ) ;
179- message = "Dumping failed block proof." ,
180- filename = filename
181- ) ;
219+ openmina_core:: warn!( message = "Dumping failed block proof." , filename = filename) ;
182220 std:: fs:: create_dir_all ( & debug_dir) ?;
183221 let mut file = std:: fs:: File :: create ( & filename) ?;
184222 input. binprot_write ( & mut file) ?;
0 commit comments