Skip to content

Commit 6ead110

Browse files
fix: circom public inputs commitment (#2077)
Co-authored-by: MauroFab <[email protected]>
1 parent 8b6e173 commit 6ead110

File tree

18 files changed

+428
-33
lines changed

18 files changed

+428
-33
lines changed

Makefile

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,30 @@ batcher_send_circom_groth16_bn256_burst: crates/target/release/aligned ## Send a
681681
--rpc_url $(RPC_URL) \
682682
--network $(NETWORK)
683683

684+
batcher_send_circom_groth16_bn256_burst: crates/target/release/aligned ## Send a burst of Circom Groth16 BN256 proofs to Batcher. Parameters: RPC_URL, NETWORK, BURST_SIZE
685+
@echo "Sending Circom Groth16 BN256 proof to Batcher..."
686+
@cd crates/cli/ && cargo run --release -- submit \
687+
--proving_system CircomGroth16Bn256 \
688+
--proof ../../scripts/test_files/circom_groth16_bn256_script/proof.json \
689+
--public_input ../../scripts/test_files/circom_groth16_bn256_script/public.json \
690+
--vk ../../scripts/test_files/circom_groth16_bn256_script/verification_key.json \
691+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
692+
--repetitions $(BURST_SIZE) \
693+
--rpc_url $(RPC_URL) \
694+
--network $(NETWORK)
695+
696+
batcher_send_circom_groth16_bn256_no_pub_input_burst: crates/target/release/aligned ## Send a burst of Circom Groth16 BN256 proofs to Batcher. Parameters: RPC_URL, NETWORK, BURST_SIZE
697+
@echo "Sending Circom Groth16 BN256 proof to Batcher..."
698+
@cd crates/cli/ && cargo run --release -- submit \
699+
--proving_system CircomGroth16Bn256 \
700+
--proof ../../scripts/test_files/circom_groth16_bn256_no_pub_input_script/proof.json \
701+
--public_input ../../scripts/test_files/circom_groth16_bn256_no_pub_input_script/public.json \
702+
--vk ../../scripts/test_files/circom_groth16_bn256_no_pub_input_script/verification_key.json \
703+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
704+
--repetitions $(BURST_SIZE) \
705+
--rpc_url $(RPC_URL) \
706+
--network $(NETWORK)
707+
684708
batcher_send_proof_with_random_address: ## Send a proof with a random address to Batcher. Parameters: RPC_URL, NETWORK, PROOF_TYPE, REPETITIONS
685709
@cd crates/cli/ && ./send_proof_with_random_address.sh
686710

@@ -802,6 +826,14 @@ generate_circom_groth16_bn256_setup: ## Run the circom_groth16_bn256_script setu
802826
@echo "Running circom_groth16_bn256 script setup..."
803827
@cd scripts/test_files/circom_groth16_bn256_script && ./generate_setup.sh
804828

829+
generate_circom_groth16_bn256_no_pub_input_proof: ## Run the circom_groth16_bn256_script
830+
@echo "Running circom_groth16_bn256 script..."
831+
@cd scripts/test_files/circom_groth16_bn256_no_pub_input_script && ./generate_proof.sh
832+
833+
generate_circom_groth16_bn256_no_pub_input_setup: ## Run the circom_groth16_bn256_script setup
834+
@echo "Running circom_groth16_bn256_no_pub_input_script setup..."
835+
@cd scripts/test_files/circom_groth16_bn256_no_pub_input_script && ./generate_setup.sh
836+
805837
__CONTRACTS_DEPLOYMENT__: ## ____
806838
deploy_aligned_contracts: ## Deploy Aligned Contracts. Parameters: NETWORK=<mainnet|holesky|sepolia>
807839
@echo "Deploying Aligned Contracts on $(NETWORK) network..."
@@ -1150,6 +1182,19 @@ docker_batcher_send_circom_groth16_bn256_burst:
11501182
--rpc_url $(DOCKER_RPC_URL) \
11511183
--max_fee 0.1ether
11521184

1185+
docker_batcher_send_circom_groth16_bn256_no_pub_input_burst:
1186+
@echo "Sending Circom Groth16 BN256 task to Batcher..."
1187+
docker exec $(shell docker ps | grep batcher | awk '{print $$1}') aligned submit \
1188+
--private_key $(DOCKER_PROOFS_PRIVATE_KEY) \
1189+
--proving_system CircomGroth16Bn256 \
1190+
--proof ./scripts/test_files/circom_groth16_bn256_no_pub_input_script/proof.json \
1191+
--public_input ./scripts/test_files/circom_groth16_bn256_no_pub_input_script/public.json \
1192+
--vk ./scripts/test_files/circom_groth16_bn256_no_pub_input_script/verification_key.json \
1193+
--proof_generator_addr $(PROOF_GENERATOR_ADDRESS) \
1194+
--repetitions $(DOCKER_BURST_SIZE) \
1195+
--rpc_url $(DOCKER_RPC_URL) \
1196+
--max_fee 0.1ether
1197+
11531198
# Update target as new proofs are supported.
11541199
docker_batcher_send_all_proofs_burst:
11551200
@$(MAKE) docker_batcher_send_sp1_burst
@@ -1158,6 +1203,7 @@ docker_batcher_send_all_proofs_burst:
11581203
@$(MAKE) docker_batcher_send_gnark_plonk_bls12_381_burst
11591204
@$(MAKE) docker_batcher_send_gnark_groth16_burst
11601205
@$(MAKE) docker_batcher_send_circom_groth16_bn256_burst
1206+
@$(MAKE) docker_batcher_send_circom_groth16_bn256_no_pub_input_burst
11611207

11621208
docker_batcher_send_infinite_groth16:
11631209
docker exec $(shell docker ps | grep batcher | awk '{print $$1}') \
@@ -1195,7 +1241,7 @@ docker_verify_proofs_onchain:
11951241
'
11961242

11971243
DOCKER_PROOFS_WAIT_TIME=60
1198-
DOCKER_SENT_PROOFS=6
1244+
DOCKER_SENT_PROOFS=7
11991245

12001246
docker_verify_proof_submission_success:
12011247
@echo "Verifying proofs were successfully submitted..."

crates/batcher/go_verifiers_lib/go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ module verifier
22

33
go 1.22.3
44

5+
replace github.com/iden3/go-rapidsnark => github.com/yetanotherco/go-rapidsnark v0.0.0-20250829135025-99f9f6b11ecc
6+
7+
replace github.com/iden3/go-rapidsnark/types => github.com/yetanotherco/go-rapidsnark/types v0.0.0-20250829135025-99f9f6b11ecc
8+
9+
replace github.com/iden3/go-rapidsnark/verifier => github.com/yetanotherco/go-rapidsnark/verifier v0.0.0-20250829135025-99f9f6b11ecc
10+
511
require (
612
github.com/consensys/gnark v0.12.0
713
github.com/consensys/gnark-crypto v0.17.0

crates/batcher/go_verifiers_lib/go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73
2121
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
2222
github.com/iden3/go-iden3-crypto v0.0.17 h1:NdkceRLJo/pI4UpcjVah4lN/a3yzxRUGXqxbWcYh9mY=
2323
github.com/iden3/go-iden3-crypto v0.0.17/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E=
24-
github.com/iden3/go-rapidsnark/types v0.0.3 h1:f0s1Qdut1qHe1O67+m+xUVRBPwSXnq5j0xSrBi0jqM4=
25-
github.com/iden3/go-rapidsnark/types v0.0.3/go.mod h1:ApgcaUxKIgSRA6fAeFxK7p+lgXXfG4oA2HN5DhFlfF4=
26-
github.com/iden3/go-rapidsnark/verifier v0.0.5 h1:J7y0ovrEjDQoWtZmlrp4tgGng1A9faMeYsQH4igAEqA=
27-
github.com/iden3/go-rapidsnark/verifier v0.0.5/go.mod h1:KgL3Yr9NehlFDI4EIWVLE3UDUi8ulyjbp7HcXSBfiGI=
2824
github.com/ingonyama-zk/icicle/v3 v3.1.1-0.20241118092657-fccdb2f0921b h1:AvQTK7l0PTHODD06PVQX1Tn2o29sRIaKIDOvTJmKurY=
2925
github.com/ingonyama-zk/icicle/v3 v3.1.1-0.20241118092657-fccdb2f0921b/go.mod h1:e0JHb27/P6WorCJS3YolbY5XffS4PGBuoW38OthLkDs=
3026
github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4=
@@ -50,6 +46,10 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
5046
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
5147
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
5248
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
49+
github.com/yetanotherco/go-rapidsnark/types v0.0.0-20250829135025-99f9f6b11ecc h1:9d0e1bmYz6pv0p1V8zrx7jALDdgAIZ8bZWSCDxemgE4=
50+
github.com/yetanotherco/go-rapidsnark/types v0.0.0-20250829135025-99f9f6b11ecc/go.mod h1:ApgcaUxKIgSRA6fAeFxK7p+lgXXfG4oA2HN5DhFlfF4=
51+
github.com/yetanotherco/go-rapidsnark/verifier v0.0.0-20250829135025-99f9f6b11ecc h1:JLSkcXpSuKb4fzYMF1qNM0nO2oysvOkpNeCSQunTtUA=
52+
github.com/yetanotherco/go-rapidsnark/verifier v0.0.0-20250829135025-99f9f6b11ecc/go.mod h1:KgL3Yr9NehlFDI4EIWVLE3UDUi8ulyjbp7HcXSBfiGI=
5353
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
5454
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
5555
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=

crates/batcher/go_verifiers_lib/verifier.go

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import "C"
1414
import (
1515
"bytes"
1616
"encoding/json"
17-
"github.com/iden3/go-rapidsnark/types"
18-
"github.com/iden3/go-rapidsnark/verifier"
17+
"fmt"
18+
"math/big"
1919

2020
"log"
2121
"unsafe"
@@ -24,6 +24,8 @@ import (
2424
"github.com/consensys/gnark/backend/groth16"
2525
"github.com/consensys/gnark/backend/plonk"
2626
"github.com/consensys/gnark/backend/witness"
27+
"github.com/iden3/go-rapidsnark/types"
28+
"github.com/iden3/go-rapidsnark/verifier"
2729
)
2830

2931
func listRefToBytes(listRef C.ListRef) []byte {
@@ -122,6 +124,20 @@ func verifyGnarkGroth16Proof(proofBytesRef C.ListRef, pubInputBytesRef C.ListRef
122124
return err == nil
123125
}
124126

127+
func bytesToBigInts32(b []byte) ([]*big.Int, error) {
128+
if len(b)%32 != 0 {
129+
return nil, fmt.Errorf("invalid length")
130+
}
131+
132+
inputs := make([]*big.Int, 0, len(b)/32)
133+
for i := 0; i < len(b); i += 32 {
134+
chunk := b[i : i+32]
135+
bi := new(big.Int).SetBytes(chunk)
136+
inputs = append(inputs, bi)
137+
}
138+
return inputs, nil
139+
}
140+
125141
//export VerifyCircomGroth16ProofBN256
126142
func VerifyCircomGroth16ProofBN256(proofBytesRef C.ListRef, pubInputBytesRef C.ListRef, verificationKeyBytesRef C.ListRef) bool {
127143
proofBytes := listRefToBytes(proofBytesRef)
@@ -131,26 +147,40 @@ func VerifyCircomGroth16ProofBN256(proofBytesRef C.ListRef, pubInputBytesRef C.L
131147
proofData := &types.ProofData{}
132148
err := json.Unmarshal(proofBytes, proofData)
133149
if err != nil {
134-
log.Printf("Could not marshal proof: %v", err)
150+
log.Printf("Could not unmarshal proof: %v", err)
151+
return false
152+
}
153+
154+
parsedProofData, err := verifier.ParseProofData(*proofData)
155+
if err != nil {
156+
log.Printf("Could not parse proof: %v", err)
157+
return false
158+
}
159+
160+
var vkStr verifier.VkJSON
161+
err = json.Unmarshal(verificationKeyBytes, &vkStr)
162+
if err != nil {
163+
log.Printf("Could not unmarshal vk: %v", err)
135164
return false
136165
}
137166

138-
var pubSignals []string
139-
err = json.Unmarshal(pubInputBytes, &pubSignals)
167+
vk, err := verifier.ParseVK(vkStr)
140168
if err != nil {
141-
log.Printf("Error unmarshaling JSON: %v", err)
169+
log.Printf("Could not parse vk: %v", err)
142170
return false
143171
}
144172

145-
zkProof := types.ZKProof{
146-
Proof: proofData,
147-
PubSignals: pubSignals,
173+
inputs, err := bytesToBigInts32(pubInputBytes)
174+
if err != nil {
175+
log.Printf("Could not parse pub inputs: %v", err)
176+
return false
148177
}
149178

150-
err = verifier.VerifyGroth16(zkProof, verificationKeyBytes)
179+
err = verifier.VerifyRaw(vk, parsedProofData, inputs)
151180
if err != nil {
152181
log.Printf("Could not verify Groth16 proof: %v", err)
153182
return false
154183
}
184+
155185
return true
156186
}

crates/cli/src/main.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -934,10 +934,17 @@ fn verification_data_from_args(args: &SubmitArgs) -> Result<VerificationData, Su
934934
"--vk",
935935
args.verification_key_file_name.clone(),
936936
)?);
937-
pub_input = Some(read_file_option(
938-
"--public_input",
939-
args.pub_input_file_name.clone(),
940-
)?);
937+
let pub_input_file =
938+
read_file_option("--public_input", args.pub_input_file_name.clone())?;
939+
let pub_inputs: Vec<String> = serde_json::from_slice(&pub_input_file)
940+
.map_err(|e| SubmitError::MissingRequiredParameter(e.to_string()))?;
941+
942+
let decode_inputs = aligned_sdk::common::utils::encode_circom_pub_inputs(&pub_inputs)
943+
.map_err(|_| {
944+
SubmitError::MissingRequiredParameter("Invalid public inputs".into())
945+
})?;
946+
947+
pub_input = Some(decode_inputs);
941948
}
942949
}
943950

crates/sdk/src/common/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pub mod constants;
22
pub mod errors;
33
pub mod types;
4+
pub mod utils;

crates/sdk/src/common/utils.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use ethers::{abi::ethereum_types::FromDecStrErr, types::U256};
2+
3+
/// Encodes Circom public inputs into a single byte vector.
4+
///
5+
/// Circom normally outputs public inputs as a JSON array of strings, where each
6+
/// entry is actually a big integer represented in decimal. For example:
7+
///
8+
/// ```json
9+
/// { "pubInputs": ["123", "456", "789"] }
10+
/// ```
11+
///
12+
/// For on-chain usage (e.g. in Solidity), working with JSON is inefficient.
13+
/// Instead, we prefer the **raw form**: each input is converted to a 32-byte
14+
/// big-endian encoding of the integer, concatenated together. This makes it
15+
/// simple to compute commitments and verify proofs on-chain, since the contract
16+
/// receives a compact `bytes` array rather than parsing JSON.
17+
///
18+
/// Each input must fit in 32 bytes (i.e. < 2^256).
19+
pub fn encode_circom_pub_inputs(input: &[String]) -> Result<Vec<u8>, FromDecStrErr> {
20+
let mut out = Vec::with_capacity(input.len() * 32);
21+
22+
for s in input {
23+
// parse as decimal (base 10). Use from_str_radix(s, 16) if they're hex.
24+
let n = U256::from_dec_str(s)?;
25+
let mut bytes = [0u8; 32];
26+
n.to_big_endian(&mut bytes);
27+
28+
out.extend_from_slice(&bytes);
29+
}
30+
31+
Ok(out)
32+
}

go.mod

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ go 1.22.3
44

55
toolchain go1.23.4
66

7+
// Replace with fork that exposes VerifyRaw function for raw byte public inputs.
8+
// The official iden3/go-rapidsnark only provides VerifyGroth16 which expects JSON string
9+
// public inputs, but we need to commit to the raw bytes and VerifyRaw simplifies this work.
10+
replace github.com/iden3/go-rapidsnark => github.com/yetanotherco/go-rapidsnark v0.0.0-20250829135025-99f9f6b11ecc
11+
12+
replace github.com/iden3/go-rapidsnark/types => github.com/yetanotherco/go-rapidsnark/types v0.0.0-20250829135025-99f9f6b11ecc
13+
14+
replace github.com/iden3/go-rapidsnark/verifier => github.com/yetanotherco/go-rapidsnark/verifier v0.0.0-20250829135025-99f9f6b11ecc
15+
716
require (
817
github.com/Layr-Labs/eigensdk-go v0.2.0-beta.1
918
github.com/ethereum/go-ethereum v1.14.0

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,6 @@ github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck
192192
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
193193
github.com/iden3/go-iden3-crypto v0.0.17 h1:NdkceRLJo/pI4UpcjVah4lN/a3yzxRUGXqxbWcYh9mY=
194194
github.com/iden3/go-iden3-crypto v0.0.17/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E=
195-
github.com/iden3/go-rapidsnark/types v0.0.3 h1:f0s1Qdut1qHe1O67+m+xUVRBPwSXnq5j0xSrBi0jqM4=
196-
github.com/iden3/go-rapidsnark/types v0.0.3/go.mod h1:ApgcaUxKIgSRA6fAeFxK7p+lgXXfG4oA2HN5DhFlfF4=
197-
github.com/iden3/go-rapidsnark/verifier v0.0.5 h1:J7y0ovrEjDQoWtZmlrp4tgGng1A9faMeYsQH4igAEqA=
198-
github.com/iden3/go-rapidsnark/verifier v0.0.5/go.mod h1:KgL3Yr9NehlFDI4EIWVLE3UDUi8ulyjbp7HcXSBfiGI=
199195
github.com/ingonyama-zk/icicle/v3 v3.1.1-0.20241118092657-fccdb2f0921b h1:AvQTK7l0PTHODD06PVQX1Tn2o29sRIaKIDOvTJmKurY=
200196
github.com/ingonyama-zk/icicle/v3 v3.1.1-0.20241118092657-fccdb2f0921b/go.mod h1:e0JHb27/P6WorCJS3YolbY5XffS4PGBuoW38OthLkDs=
201197
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
@@ -323,6 +319,10 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
323319
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
324320
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
325321
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
322+
github.com/yetanotherco/go-rapidsnark/types v0.0.0-20250829135025-99f9f6b11ecc h1:9d0e1bmYz6pv0p1V8zrx7jALDdgAIZ8bZWSCDxemgE4=
323+
github.com/yetanotherco/go-rapidsnark/types v0.0.0-20250829135025-99f9f6b11ecc/go.mod h1:ApgcaUxKIgSRA6fAeFxK7p+lgXXfG4oA2HN5DhFlfF4=
324+
github.com/yetanotherco/go-rapidsnark/verifier v0.0.0-20250829135025-99f9f6b11ecc h1:JLSkcXpSuKb4fzYMF1qNM0nO2oysvOkpNeCSQunTtUA=
325+
github.com/yetanotherco/go-rapidsnark/verifier v0.0.0-20250829135025-99f9f6b11ecc/go.mod h1:KgL3Yr9NehlFDI4EIWVLE3UDUi8ulyjbp7HcXSBfiGI=
326326
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
327327
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
328328
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=

operator/pkg/operator.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"time"
1616

1717
rapidsnark_types "github.com/iden3/go-rapidsnark/types"
18-
"github.com/iden3/go-rapidsnark/verifier"
18+
rapidsnark_verifier "github.com/iden3/go-rapidsnark/verifier"
1919

2020
"github.com/ethereum/go-ethereum/crypto"
2121
"github.com/urfave/cli/v2"
@@ -503,30 +503,58 @@ func (o *Operator) verifyGnarkGroth16Proof(proofBytes []byte, pubInputBytes []by
503503

504504
// verifyCircomGroth16Bn256Proof verifies a Circom Groth16 proof using BN256 curve.
505505
func (o *Operator) verifyCircomGroth16Bn256Proof(proofBytes []byte, pubInputBytes []byte, verificationKeyBytes []byte) bool {
506+
bytesToBigInts32 := func(b []byte) ([]*big.Int, error) {
507+
if len(b)%32 != 0 {
508+
return nil, fmt.Errorf("invalid length")
509+
}
510+
511+
inputs := make([]*big.Int, 0, len(b)/32)
512+
for i := 0; i < len(b); i += 32 {
513+
chunk := b[i : i+32]
514+
bi := new(big.Int).SetBytes(chunk)
515+
inputs = append(inputs, bi)
516+
}
517+
return inputs, nil
518+
}
519+
506520
proofData := &rapidsnark_types.ProofData{}
507521
err := json.Unmarshal(proofBytes, proofData)
508522
if err != nil {
509-
o.Logger.Infof("Could not marshal proof: %v", err)
523+
log.Printf("Could not unmarshal proof: %v", err)
524+
return false
525+
}
526+
527+
parsedProofData, err := rapidsnark_verifier.ParseProofData(*proofData)
528+
if err != nil {
529+
log.Printf("Could not parse proof: %v", err)
530+
return false
531+
}
532+
533+
var vkStr rapidsnark_verifier.VkJSON
534+
err = json.Unmarshal(verificationKeyBytes, &vkStr)
535+
if err != nil {
536+
log.Printf("Could not unmarshal vk: %v", err)
510537
return false
511538
}
512539

513-
var pubSignals []string
514-
err = json.Unmarshal(pubInputBytes, &pubSignals)
540+
vk, err := rapidsnark_verifier.ParseVK(vkStr)
515541
if err != nil {
516-
o.Logger.Infof("Could not marshal public signals: %v", err)
542+
log.Printf("Could not parse vk: %v", err)
517543
return false
518544
}
519545

520-
zkProof := rapidsnark_types.ZKProof{
521-
Proof: proofData,
522-
PubSignals: pubSignals,
546+
inputs, err := bytesToBigInts32(pubInputBytes)
547+
if err != nil {
548+
log.Printf("Could not parse pub inputs: %v", err)
549+
return false
523550
}
524551

525-
err = verifier.VerifyGroth16(zkProof, verificationKeyBytes)
552+
err = rapidsnark_verifier.VerifyRaw(vk, parsedProofData, inputs)
526553
if err != nil {
527-
o.Logger.Infof("Could not verify Circom Groth16 BN256 proof: %v", err)
554+
log.Printf("Could not verify Groth16 proof: %v", err)
528555
return false
529556
}
557+
530558
return true
531559
}
532560

0 commit comments

Comments
 (0)