From 203e23466c548f2c5fa3004a755957598e05a531 Mon Sep 17 00:00:00 2001 From: "zilong.dai" <2840478265@qq.com> Date: Mon, 4 Nov 2024 17:34:56 +0800 Subject: [PATCH] optimize deserializeVK and precomputeVK --- src/script/interpreter.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index b13e596936a..203e02356de 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1088,21 +1088,26 @@ bool EvalScript(vector >& stack, const CScript& script, un // Deserialize the proof and verifier key input bls12_381_groth16::Groth16ProofWith2PublicInputs proof; - bls12_381_groth16::Groth16VerifierKeyInput vk; - bls12_381_groth16::Groth16VerifierKeyPrecomputedValues precomputed; + static bls12_381_groth16::Groth16VerifierKeyInput vk; + static bls12_381_groth16::Groth16VerifierKeyPrecomputedValues precomputed; + static valtype verfierDataACopy; // Check the proof and verifier key deserialization if(!bls12_381_groth16::deserializeProofWith2PublicInputs(&proof, &piA, &piB0, &piB1, &piC, &public_input_0, &public_input_1)){ return set_error(serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); } - if(!bls12_381_groth16::deserializeVerifierKeyInput(&vk, &verfierDataA, &verfierDataB, &verfierDataC, &verfierDataD, &verfierDataE, &verfierDataF)){ - return set_error(serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); - } + if (verfierDataA.size() != verfierDataACopy.size() || !std::equal(verfierDataA.begin(), verfierDataA.end(), verfierDataACopy.begin())) + { + verfierDataACopy = verfierDataA; + if(!bls12_381_groth16::deserializeVerifierKeyInput(&vk, &verfierDataA, &verfierDataB, &verfierDataC, &verfierDataD, &verfierDataE, &verfierDataF)){ + return set_error(serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); + } - // Precompute the verifier key - if(!bls12_381_groth16::precomputeVerifierKey(&precomputed, &vk)){ - return set_error(serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); + // Precompute the verifier key + if(!bls12_381_groth16::precomputeVerifierKey(&precomputed, &vk)){ + return set_error(serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); + } } // Verify the proof