Skip to content

Commit 5b30c6a

Browse files
JuArceMauroToscano
andauthored
fix: improve sp1 proof handling (#2037)
Co-authored-by: Mauro Toscano <[email protected]>
1 parent 5fdb723 commit 5b30c6a

File tree

26 files changed

+6107
-21
lines changed

26 files changed

+6107
-21
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ batcher_send_sp1_task: ## Send a SP1 fibonacci proof to Batcher. Parameters: RPC
529529
--proving_system SP1 \
530530
--proof ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.proof \
531531
--vm_program ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.elf \
532+
--public_input ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.pub \
532533
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
533534
--rpc_url $(RPC_URL) \
534535
--network $(NETWORK)
@@ -539,6 +540,7 @@ batcher_send_sp1_burst: ## Send a burst of SP1 fibonacci proofs to Batcher. Para
539540
--proving_system SP1 \
540541
--proof ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.proof \
541542
--vm_program ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.elf \
543+
--public_input ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.pub \
542544
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
543545
--repetitions $(BURST_SIZE) \
544546
--rpc_url $(RPC_URL) \
@@ -763,6 +765,10 @@ generate_sp1_fibonacci_proof: ## Run the SP1 Fibonacci proof generator script
763765
@cd scripts/test_files/sp1/fibonacci_proof_generator/script && RUST_LOG=info cargo run --release
764766
@echo "Fibonacci proof and ELF generated in scripts/test_files/sp1 folder"
765767

768+
generate_sp1_fibonacci_proof_no_pub_input: ## Run the SP1 Fibonacci proof generator script with empty journal
769+
@cd scripts/test_files/sp1/no_public_inputs/script && RUST_LOG=info cargo run --release
770+
@echo "Fibonacci proof and ELF with no public inputs generated in scripts/test_files/sp1 folder"
771+
766772
generate_risc_zero_fibonacci_proof: ## Run the Risc0 Fibonacci proof generator script
767773
@cd scripts/test_files/risc_zero/fibonacci_proof_generator && \
768774
RUST_LOG=info cargo run --release && \
@@ -1073,6 +1079,7 @@ docker_batcher_send_sp1_burst:
10731079
--proving_system SP1 \
10741080
--proof ./scripts/test_files/sp1/sp1_fibonacci_5_0_0.proof \
10751081
--vm_program ./scripts/test_files/sp1/sp1_fibonacci_5_0_0.elf \
1082+
--public_input ./scripts/test_files/sp1/sp1_fibonacci_5_0_0.pub \
10761083
--repetitions $(DOCKER_BURST_SIZE) \
10771084
--proof_generator_addr $(PROOF_GENERATOR_ADDRESS) \
10781085
--rpc_url $(DOCKER_RPC_URL) \

crates/batcher/src/sp1/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use log::{debug, error, warn};
2-
use sp1_sdk::{EnvProver, ProverClient};
2+
use sp1_sdk::{EnvProver, ProverClient, SP1ProofWithPublicValues};
33
use std::sync::OnceLock;
44

55
static SP1_PROVER_CLIENT: OnceLock<EnvProver> = OnceLock::new();
66

7-
pub fn verify_sp1_proof(proof: &[u8], elf: &[u8]) -> bool {
7+
pub fn verify_sp1_proof(proof: &[u8], public_inputs: &[u8], elf: &[u8]) -> bool {
88
if proof.is_empty() || elf.is_empty() {
99
error!("SP1 Input buffers zero size");
1010
return false;
@@ -14,8 +14,11 @@ pub fn verify_sp1_proof(proof: &[u8], elf: &[u8]) -> bool {
1414
let prover_client = SP1_PROVER_CLIENT.get_or_init(ProverClient::from_env);
1515

1616
let (_pk, vk) = prover_client.setup(elf);
17-
if let Ok(proof) = bincode::deserialize(proof) {
18-
//client.verify(&proof, &vk).expect("failed to verify proof");
17+
if let Ok(proof) = bincode::deserialize::<SP1ProofWithPublicValues>(proof) {
18+
if *proof.public_values.as_slice() != *public_inputs {
19+
warn!("SP1 public inputs do not match proof public values");
20+
return false;
21+
}
1922
let res = prover_client.verify(&proof, &vk).is_ok();
2023
debug!("SP1 proof is valid: {}", res);
2124
if res {

crates/batcher/src/zk_utils/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@ fn verify_internal(verification_data: &VerificationData) -> bool {
2020
warn!("Trying to verify SP1 proof but ELF was not provided. Returning invalid");
2121
return false;
2222
};
23-
verify_sp1_proof(verification_data.proof.as_slice(), elf.as_slice())
23+
let pub_inputs = &verification_data.pub_input.clone().unwrap_or_default();
24+
verify_sp1_proof(
25+
verification_data.proof.as_slice(),
26+
pub_inputs.as_slice(),
27+
elf.as_slice(),
28+
)
2429
}
2530
ProvingSystemId::Risc0 => {
2631
let Some(image_id_slice) = &verification_data.vm_program_code else {

crates/cli/get_proof_test_files.sh

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ CURRENT_TAG=$(curl -s -L \
88

99
SP1_ELF_URL="https://raw.githubusercontent.com/yetanotherco/aligned_layer/$CURRENT_TAG/scripts/test_files/sp1/sp1_fibonacci_5_0_0.elf"
1010
SP1_PROOF_URL="https://raw.githubusercontent.com/yetanotherco/aligned_layer/$CURRENT_TAG/scripts/test_files/sp1/sp1_fibonacci_5_0_0.proof"
11+
SP1_PUBLIC_INPUT_URL="https://raw.githubusercontent.com/yetanotherco/aligned_layer/$CURRENT_TAG/scripts/test_files/sp1/sp1_fibonacci_5_0_0.pub"
1112

1213
SP1_ELF_NAME="sp1_fibonacci_5_0_0.elf"
1314
SP1_PROOF_NAME="sp1_fibonacci_5_0_0.proof"
15+
SP1_PUBLIC_INPUT_NAME="sp1_fibonacci_5_0_0.pub"
1416

1517
BASE_DIR=$HOME
1618
ALIGNED_DIR="${ALIGNED_DIR-"$BASE_DIR/.aligned"}"
@@ -36,7 +38,17 @@ else
3638
exit 1
3739
fi
3840

41+
echo "Downloading SP1 public inputs file..."
42+
43+
if curl -sSf -L "$SP1_PUBLIC_INPUT_NAME" -o "$ALIGNED_TEST_FILES_DIR/$SP1_PUBLIC_INPUT_NAME"; then
44+
echo "SP1 public inputs downloaded successful"
45+
else
46+
echo "Error: Failed to downloaded $SP1_PUBLIC_INPUT_NAME"
47+
exit 1
48+
fi
49+
3950
chmod +x "$ALIGNED_TEST_FILES_DIR/$SP1_ELF_NAME"
4051
chmod +x "$ALIGNED_TEST_FILES_DIR/$SP1_PROOF_NAME"
52+
chmod +x "$ALIGNED_TEST_FILES_DIR/$SP1_PUBLIC_INPUT_NAME"
4153

42-
echo "SP1 ELF and proof files downloaded successfully in $ALIGNED_TEST_FILES_DIR"
54+
echo "SP1 ELF, proof and public inputs files downloaded successfully in $ALIGNED_TEST_FILES_DIR"

crates/cli/send_proof_with_random_address.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ if [[ $PROOF_TYPE == "sp1" ]]; then
3434
--proving_system SP1 \
3535
--proof ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.proof \
3636
--vm_program ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.elf \
37-
--random_address \
37+
--public_input ../../scripts/test_files/sp1/sp1_fibonacci_5_0_0.pub \
38+
--random_address \
3839
--repetitions $REPETITIONS \
3940
--rpc_url $RPC_URL \
4041
--network $NETWORK

crates/cli/src/main.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,7 @@ fn verification_data_from_args(args: &SubmitArgs) -> Result<VerificationData, Su
877877
// Read proof file
878878
let proof = read_file(args.proof_file_name.clone())?;
879879

880-
let mut pub_input: Option<Vec<u8>> = None;
880+
let pub_input: Option<Vec<u8>>;
881881
let mut verification_key: Option<Vec<u8>> = None;
882882
let mut vm_program_code: Option<Vec<u8>> = None;
883883

@@ -887,6 +887,11 @@ fn verification_data_from_args(args: &SubmitArgs) -> Result<VerificationData, Su
887887
"--vm_program",
888888
args.vm_program_code_file_name.clone(),
889889
)?);
890+
pub_input = args
891+
.pub_input_file_name
892+
.clone()
893+
.map(read_file)
894+
.transpose()?;
890895
}
891896
ProvingSystemId::Risc0 => {
892897
vm_program_code = Some(read_file_option(

docs/1_introduction/1_try_aligned.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ aligned submit \
3333
--proving_system SP1 \
3434
--proof ~/.aligned/test_files/sp1_fibonacci_5_0_0.proof \
3535
--vm_program ~/.aligned/test_files/sp1_fibonacci_5_0_0.elf \
36+
--public_input ~/.aligned/test_files/sp1_fibonacci_5_0_0.pub \
3637
--aligned_verification_data_path ~/.aligned/aligned_verification_data \
3738
--network holesky \
3839
--rpc_url https://ethereum-holesky-rpc.publicnode.com

docs/3_guides/0_submitting_proofs.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ aligned submit \
134134
--proving_system SP1 \
135135
--proof <proof_file> \
136136
--vm_program <vm_program_file> \
137+
--public_input <pub_input_file> \
137138
--proof_generator_addr [proof_generator_addr] \
138139
--batch_inclusion_data_directory_path [batch_inclusion_data_directory_path] \
139140
--keystore_path <path_to_ecdsa_keystore> \
@@ -149,6 +150,7 @@ aligned submit \
149150
--proving_system SP1 \
150151
--proof ./scripts/test_files/sp1/sp1_fibonacci_5_0_0.proof \
151152
--vm_program ./scripts/test_files/sp1/sp1_fibonacci_5_0_0.elf \
153+
--public_input ./scripts/test_files/sp1/sp1_fibonacci_5_0_0.pub \
152154
--keystore_path ~/.aligned_keystore/keystore0 \
153155
--network holesky \
154156
--rpc_url https://ethereum-holesky-rpc.publicnode.com
@@ -166,7 +168,7 @@ aligned submit \
166168
--proving_system Risc0 \
167169
--proof <proof_file> \
168170
--vm_program <vm_program_file> \
169-
--pub_input <pub_input_file> \
171+
--public_input <pub_input_file> \
170172
--proof_generator_addr [proof_generator_addr] \
171173
--batch_inclusion_data_directory_path [batch_inclusion_data_directory_path] \
172174
--keystore_path <path_to_ecdsa_keystore> \

operator/pkg/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ func (o *Operator) verify(verificationData VerificationData, disabledVerifiersBi
510510
results <- verificationResult
511511

512512
case common.SP1:
513-
verificationResult, err := sp1.VerifySp1Proof(verificationData.Proof, verificationData.VmProgramCode)
513+
verificationResult, err := sp1.VerifySp1Proof(verificationData.Proof, verificationData.PubInput, verificationData.VmProgramCode)
514514
o.Logger.Infof("SP1 proof verification result: %t", verificationResult)
515515
o.handleVerificationResult(results, verificationResult, err, "SP1 proof verification")
516516

operator/sp1/lib/sp1.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
#include <stdint.h>
33

44
int32_t verify_sp1_proof_ffi(unsigned char *proof_buffer, uint32_t proof_len,
5-
unsigned char *elf_buffer, uint32_t elf_len);
5+
unsigned char *public_inputs_buffer, uint32_t public_inputs_len,
6+
unsigned char *elf_buffer, uint32_t elf_len);

0 commit comments

Comments
 (0)