Skip to content

Commit 935a8fa

Browse files
authored
feat(sol): vk hashing (#16015)
## Overview Perform vk hashing in the solidity verifier Takes a different approach to the traditional verifiers. As the vk is fixed ahead of time, we hash it and include it in the precompiled contract, therefore it is preprocessed and does not need to be recomputed by the verifier.
1 parent 99e70e6 commit 935a8fa

23 files changed

+197
-188
lines changed

barretenberg/cpp/src/barretenberg/dsl/acir_proofs/honk_contract.hpp

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -366,14 +366,12 @@ library TranscriptLib {
366366
function generateTranscript(
367367
Honk.Proof memory proof,
368368
bytes32[] calldata publicInputs,
369-
uint256 circuitSize,
370-
uint256 publicInputsSize,
371-
uint256 pubInputsOffset
369+
uint256 vkHash,
370+
uint256 publicInputsSize
372371
) internal pure returns (Transcript memory t) {
373372
Fr previousChallenge;
374-
(t.relationParameters, previousChallenge) = generateRelationParametersChallenges(
375-
proof, publicInputs, circuitSize, publicInputsSize, pubInputsOffset, previousChallenge
376-
);
373+
(t.relationParameters, previousChallenge) =
374+
generateRelationParametersChallenges(proof, publicInputs, vkHash, publicInputsSize, previousChallenge);
377375
378376
(t.alphas, previousChallenge) = generateAlphaChallenges(previousChallenge, proof);
379377
@@ -403,50 +401,46 @@ library TranscriptLib {
403401
function generateRelationParametersChallenges(
404402
Honk.Proof memory proof,
405403
bytes32[] calldata publicInputs,
406-
uint256 circuitSize,
404+
uint256 vkHash,
407405
uint256 publicInputsSize,
408-
uint256 pubInputsOffset,
409406
Fr previousChallenge
410407
) internal pure returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) {
411408
(rp.eta, rp.etaTwo, rp.etaThree, previousChallenge) =
412-
generateEtaChallenge(proof, publicInputs, circuitSize, publicInputsSize, pubInputsOffset);
409+
generateEtaChallenge(proof, publicInputs, vkHash, publicInputsSize);
413410
414411
(rp.beta, rp.gamma, nextPreviousChallenge) = generateBetaAndGammaChallenges(previousChallenge, proof);
415412
}
416413
417414
function generateEtaChallenge(
418415
Honk.Proof memory proof,
419416
bytes32[] calldata publicInputs,
420-
uint256 circuitSize,
421-
uint256 publicInputsSize,
422-
uint256 pubInputsOffset
417+
uint256 vkHash,
418+
uint256 publicInputsSize
423419
) internal pure returns (Fr eta, Fr etaTwo, Fr etaThree, Fr previousChallenge) {
424-
bytes32[] memory round0 = new bytes32[](3 + publicInputsSize + 12);
425-
round0[0] = bytes32(circuitSize);
426-
round0[1] = bytes32(publicInputsSize);
427-
round0[2] = bytes32(pubInputsOffset);
420+
bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 12);
421+
round0[0] = bytes32(vkHash);
428422
429423
for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) {
430-
round0[3 + i] = bytes32(publicInputs[i]);
424+
round0[1 + i] = bytes32(publicInputs[i]);
431425
}
432426
for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) {
433-
round0[3 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib.toBytes32(proof.pairingPointObject[i]);
427+
round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib.toBytes32(proof.pairingPointObject[i]);
434428
}
435429
436430
// Create the first challenge
437431
// Note: w4 is added to the challenge later on
438-
round0[3 + publicInputsSize] = bytes32(proof.w1.x_0);
439-
round0[3 + publicInputsSize + 1] = bytes32(proof.w1.x_1);
440-
round0[3 + publicInputsSize + 2] = bytes32(proof.w1.y_0);
441-
round0[3 + publicInputsSize + 3] = bytes32(proof.w1.y_1);
442-
round0[3 + publicInputsSize + 4] = bytes32(proof.w2.x_0);
443-
round0[3 + publicInputsSize + 5] = bytes32(proof.w2.x_1);
444-
round0[3 + publicInputsSize + 6] = bytes32(proof.w2.y_0);
445-
round0[3 + publicInputsSize + 7] = bytes32(proof.w2.y_1);
446-
round0[3 + publicInputsSize + 8] = bytes32(proof.w3.x_0);
447-
round0[3 + publicInputsSize + 9] = bytes32(proof.w3.x_1);
448-
round0[3 + publicInputsSize + 10] = bytes32(proof.w3.y_0);
449-
round0[3 + publicInputsSize + 11] = bytes32(proof.w3.y_1);
432+
round0[1 + publicInputsSize] = bytes32(proof.w1.x_0);
433+
round0[1 + publicInputsSize + 1] = bytes32(proof.w1.x_1);
434+
round0[1 + publicInputsSize + 2] = bytes32(proof.w1.y_0);
435+
round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y_1);
436+
round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x_0);
437+
round0[1 + publicInputsSize + 5] = bytes32(proof.w2.x_1);
438+
round0[1 + publicInputsSize + 6] = bytes32(proof.w2.y_0);
439+
round0[1 + publicInputsSize + 7] = bytes32(proof.w2.y_1);
440+
round0[1 + publicInputsSize + 8] = bytes32(proof.w3.x_0);
441+
round0[1 + publicInputsSize + 9] = bytes32(proof.w3.x_1);
442+
round0[1 + publicInputsSize + 10] = bytes32(proof.w3.y_0);
443+
round0[1 + publicInputsSize + 11] = bytes32(proof.w3.y_1);
450444
451445
previousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(round0)));
452446
(eta, etaTwo) = splitChallenge(previousChallenge);
@@ -1730,11 +1724,13 @@ abstract contract BaseHonkVerifier is IVerifier {
17301724
17311725
uint256 immutable $N;
17321726
uint256 immutable $LOG_N;
1727+
uint256 immutable $VK_HASH;
17331728
uint256 immutable $NUM_PUBLIC_INPUTS;
17341729
1735-
constructor(uint256 _N, uint256 _logN, uint256 _numPublicInputs) {
1730+
constructor(uint256 _N, uint256 _logN, uint256 _vkHash, uint256 _numPublicInputs) {
17361731
$N = _N;
17371732
$LOG_N = _logN;
1733+
$VK_HASH = _vkHash;
17381734
$NUM_PUBLIC_INPUTS = _numPublicInputs;
17391735
}
17401736
@@ -1763,9 +1759,7 @@ abstract contract BaseHonkVerifier is IVerifier {
17631759
}
17641760
17651761
// Generate the fiat shamir challenges for the whole protocol
1766-
Transcript memory t = TranscriptLib.generateTranscript(
1767-
p, publicInputs, vk.circuitSize, $NUM_PUBLIC_INPUTS, /*pubInputsOffset=*/ 1
1768-
);
1762+
Transcript memory t = TranscriptLib.generateTranscript(p, publicInputs, $VK_HASH, $NUM_PUBLIC_INPUTS);
17691763
17701764
// Derive public input delta
17711765
t.relationParameters.publicInputsDelta = computePublicInputDelta(
@@ -2169,7 +2163,7 @@ abstract contract BaseHonkVerifier is IVerifier {
21692163
}
21702164
}
21712165
2172-
contract HonkVerifier is BaseHonkVerifier(N, LOG_N, NUMBER_OF_PUBLIC_INPUTS) {
2166+
contract HonkVerifier is BaseHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) {
21732167
function loadVerificationKey() internal pure override returns (Honk.VerificationKey memory) {
21742168
return HonkVerificationKey.loadVerificationKey();
21752169
}

barretenberg/cpp/src/barretenberg/dsl/acir_proofs/honk_zk_contract.hpp

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -368,14 +368,12 @@ library ZKTranscriptLib {
368368
function generateTranscript(
369369
Honk.ZKProof memory proof,
370370
bytes32[] calldata publicInputs,
371-
uint256 circuitSize,
372-
uint256 publicInputsSize,
373-
uint256 pubInputsOffset
371+
uint256 vkHash,
372+
uint256 publicInputsSize
374373
) external pure returns (ZKTranscript memory t) {
375374
Fr previousChallenge;
376-
(t.relationParameters, previousChallenge) = generateRelationParametersChallenges(
377-
proof, publicInputs, circuitSize, publicInputsSize, pubInputsOffset, previousChallenge
378-
);
375+
(t.relationParameters, previousChallenge) =
376+
generateRelationParametersChallenges(proof, publicInputs, vkHash, publicInputsSize, previousChallenge);
379377
380378
(t.alphas, previousChallenge) = generateAlphaChallenges(previousChallenge, proof);
381379
@@ -404,49 +402,46 @@ library ZKTranscriptLib {
404402
function generateRelationParametersChallenges(
405403
Honk.ZKProof memory proof,
406404
bytes32[] calldata publicInputs,
407-
uint256 circuitSize,
405+
uint256 vkHash,
408406
uint256 publicInputsSize,
409-
uint256 pubInputsOffset,
410407
Fr previousChallenge
411408
) internal pure returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) {
412409
(rp.eta, rp.etaTwo, rp.etaThree, previousChallenge) =
413-
generateEtaChallenge(proof, publicInputs, circuitSize, publicInputsSize, pubInputsOffset);
410+
generateEtaChallenge(proof, publicInputs, vkHash, publicInputsSize);
414411
415412
(rp.beta, rp.gamma, nextPreviousChallenge) = generateBetaAndGammaChallenges(previousChallenge, proof);
416413
}
417414
418415
function generateEtaChallenge(
419416
Honk.ZKProof memory proof,
420417
bytes32[] calldata publicInputs,
421-
uint256 circuitSize,
422-
uint256 publicInputsSize,
423-
uint256 pubInputsOffset
418+
uint256 vkHash,
419+
uint256 publicInputsSize
424420
) internal pure returns (Fr eta, Fr etaTwo, Fr etaThree, Fr previousChallenge) {
425-
bytes32[] memory round0 = new bytes32[](3 + publicInputsSize + 12);
426-
round0[0] = bytes32(circuitSize);
427-
round0[1] = bytes32(publicInputsSize);
428-
round0[2] = bytes32(pubInputsOffset);
421+
bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 12);
422+
round0[0] = bytes32(vkHash);
423+
429424
for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) {
430-
round0[3 + i] = bytes32(publicInputs[i]);
425+
round0[1 + i] = bytes32(publicInputs[i]);
431426
}
432427
for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) {
433-
round0[3 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib.toBytes32(proof.pairingPointObject[i]);
428+
round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib.toBytes32(proof.pairingPointObject[i]);
434429
}
435430
436431
// Create the first challenge
437432
// Note: w4 is added to the challenge later on
438-
round0[3 + publicInputsSize] = bytes32(proof.w1.x_0);
439-
round0[3 + publicInputsSize + 1] = bytes32(proof.w1.x_1);
440-
round0[3 + publicInputsSize + 2] = bytes32(proof.w1.y_0);
441-
round0[3 + publicInputsSize + 3] = bytes32(proof.w1.y_1);
442-
round0[3 + publicInputsSize + 4] = bytes32(proof.w2.x_0);
443-
round0[3 + publicInputsSize + 5] = bytes32(proof.w2.x_1);
444-
round0[3 + publicInputsSize + 6] = bytes32(proof.w2.y_0);
445-
round0[3 + publicInputsSize + 7] = bytes32(proof.w2.y_1);
446-
round0[3 + publicInputsSize + 8] = bytes32(proof.w3.x_0);
447-
round0[3 + publicInputsSize + 9] = bytes32(proof.w3.x_1);
448-
round0[3 + publicInputsSize + 10] = bytes32(proof.w3.y_0);
449-
round0[3 + publicInputsSize + 11] = bytes32(proof.w3.y_1);
433+
round0[1 + publicInputsSize] = bytes32(proof.w1.x_0);
434+
round0[1 + publicInputsSize + 1] = bytes32(proof.w1.x_1);
435+
round0[1 + publicInputsSize + 2] = bytes32(proof.w1.y_0);
436+
round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y_1);
437+
round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x_0);
438+
round0[1 + publicInputsSize + 5] = bytes32(proof.w2.x_1);
439+
round0[1 + publicInputsSize + 6] = bytes32(proof.w2.y_0);
440+
round0[1 + publicInputsSize + 7] = bytes32(proof.w2.y_1);
441+
round0[1 + publicInputsSize + 8] = bytes32(proof.w3.x_0);
442+
round0[1 + publicInputsSize + 9] = bytes32(proof.w3.x_1);
443+
round0[1 + publicInputsSize + 10] = bytes32(proof.w3.y_0);
444+
round0[1 + publicInputsSize + 11] = bytes32(proof.w3.y_1);
450445
451446
previousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(round0)));
452447
(eta, etaTwo) = splitChallenge(previousChallenge);
@@ -1792,11 +1787,13 @@ abstract contract BaseZKHonkVerifier is IVerifier {
17921787
17931788
uint256 immutable $N;
17941789
uint256 immutable $LOG_N;
1790+
uint256 immutable $VK_HASH;
17951791
uint256 immutable $NUM_PUBLIC_INPUTS;
17961792
1797-
constructor(uint256 _N, uint256 _logN, uint256 _numPublicInputs) {
1793+
constructor(uint256 _N, uint256 _logN, uint256 _vkHash, uint256 _numPublicInputs) {
17981794
$N = _N;
17991795
$LOG_N = _logN;
1796+
$VK_HASH = _vkHash;
18001797
$NUM_PUBLIC_INPUTS = _numPublicInputs;
18011798
}
18021799
@@ -1833,9 +1830,7 @@ abstract contract BaseZKHonkVerifier is IVerifier {
18331830
}
18341831
18351832
// Generate the fiat shamir challenges for the whole protocol
1836-
ZKTranscript memory t = ZKTranscriptLib.generateTranscript(
1837-
p, publicInputs, vk.circuitSize, $NUM_PUBLIC_INPUTS, /*pubInputsOffset=*/ 1
1838-
);
1833+
ZKTranscript memory t = ZKTranscriptLib.generateTranscript(p, publicInputs, $VK_HASH, $NUM_PUBLIC_INPUTS);
18391834
18401835
// Derive public input delta
18411836
t.relationParameters.publicInputsDelta = computePublicInputDelta(
@@ -2320,7 +2315,7 @@ abstract contract BaseZKHonkVerifier is IVerifier {
23202315
}
23212316
}
23222317
2323-
contract HonkVerifier is BaseZKHonkVerifier(N, LOG_N, NUMBER_OF_PUBLIC_INPUTS) {
2318+
contract HonkVerifier is BaseZKHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) {
23242319
function loadVerificationKey() internal pure override returns (Honk.VerificationKey memory) {
23252320
return HonkVerificationKey.loadVerificationKey();
23262321
}

barretenberg/cpp/src/barretenberg/flavor/flavor.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,10 @@ class NativeVerificationKey_ : public PrecomputedCommitments {
197197
* @details Currently only used in testing.
198198
* @return FF
199199
*/
200-
fr hash()
200+
fr hash() const
201201
{
202-
fr vk_hash = crypto::Poseidon2<crypto::Poseidon2Bn254ScalarFieldParams>::hash(this->to_field_elements());
202+
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1498): should hash be dependent on transcript?
203+
fr vk_hash = Transcript::hash(this->to_field_elements());
203204
return vk_hash;
204205
}
205206

barretenberg/cpp/src/barretenberg/flavor/native_verification_key.test.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,21 @@ TYPED_TEST(NativeVerificationKeyTests, VKHashingConsistency)
6868
{
6969
using Flavor = TypeParam;
7070
using VerificationKey = typename Flavor::VerificationKey;
71+
using Transcript = typename Flavor::Transcript;
7172

7273
VerificationKey vk(TestFixture::create_vk());
7374

7475
// First method of hashing: using to_field_elements and add_to_hash_buffer.
7576
std::vector<fr> vk_field_elements = vk.to_field_elements();
76-
NativeTranscript transcript;
77+
Transcript transcript;
7778
for (const auto& field_element : vk_field_elements) {
7879
transcript.add_to_independent_hash_buffer("vk_element", field_element);
7980
}
8081
fr vkey_hash_1 = transcript.hash_independent_buffer("vk_hash");
8182
// Second method of hashing: using hash().
8283
fr vkey_hash_2 = vk.hash();
8384
EXPECT_EQ(vkey_hash_1, vkey_hash_2);
84-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1427): Solidity verifier does not fiat shamir the full
85-
// verification key. This will be fixed in a followup PR.
86-
if constexpr (!IsAnyOf<Flavor, UltraKeccakFlavor, ECCVMFlavor, TranslatorFlavor>) {
85+
if constexpr (!IsAnyOf<Flavor, ECCVMFlavor, TranslatorFlavor>) {
8786
// Third method of hashing: using add_hash_to_transcript.
8887
typename Flavor::Transcript transcript_2;
8988
fr vkey_hash_3 = vk.add_hash_to_transcript("", transcript_2);

barretenberg/cpp/src/barretenberg/flavor/ultra_keccak_flavor.hpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,11 @@ class UltraKeccakFlavor : public bb::UltraFlavor {
7676
*/
7777
fr add_hash_to_transcript(const std::string& domain_separator, Transcript& transcript) const override
7878
{
79-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1427): We need to update this function to look
80-
// like UltraFlavor's add_hash_to_transcript. Alternatively, the VerificationKey class will go away when we
81-
// add pairing point aggregation to the solidity verifier.
82-
uint64_t circuit_size = 1 << this->log_circuit_size;
83-
transcript.add_to_hash_buffer(domain_separator + "vk_log_circuit_size", circuit_size);
84-
transcript.add_to_hash_buffer(domain_separator + "vk_num_public_inputs", this->num_public_inputs);
85-
transcript.add_to_hash_buffer(domain_separator + "vk_pub_inputs_offset", this->pub_inputs_offset);
86-
return 0;
79+
// This hash contains a hash of the entire vk - including all of the elements
80+
const fr hash = this->hash();
81+
82+
transcript.add_to_hash_buffer(domain_separator + "vk_hash", hash);
83+
return hash;
8784
}
8885

8986
// Don't statically check for object completeness.

barretenberg/cpp/src/barretenberg/honk/utils/honk_key_gen.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ inline void output_vk_sol_ultra_honk(std::ostream& os,
6767
print_u256_const(1 << key->log_circuit_size, "N");
6868
print_u256_const(key->log_circuit_size, "LOG_N");
6969
print_u256_const(key->num_public_inputs, "NUMBER_OF_PUBLIC_INPUTS");
70+
print_u256_const(key->hash(), "VK_HASH");
7071
os << ""
7172
"library " << class_name << " {\n"
7273
" function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) {\n"

barretenberg/cpp/src/barretenberg/transcript/transcript.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,16 @@ template <typename TranscriptParams> class BaseTranscript {
330330
*/
331331
void enable_manifest() { use_manifest = true; }
332332

333+
/**
334+
* @brief Static hash method that forwards to TranscriptParams hash.
335+
* @details This method allows hash to be called on the Transcript class directly,
336+
* which is needed for verification key hashing.
337+
*
338+
* @param data Vector of field elements to hash
339+
* @return Fr Hash result
340+
*/
341+
static Fr hash(const std::vector<Fr>& data) { return TranscriptParams::hash(data); }
342+
333343
/**
334344
* @brief After all the prover messages have been sent, finalize the round by hashing all the data and then
335345
* create the number of requested challenges.

barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,7 @@ template <IsUltraOrMegaHonk Flavor> void OinkProver<Flavor>::execute_preamble_ro
8686
{
8787
PROFILE_THIS_NAME("OinkProver::execute_preamble_round");
8888
fr vkey_hash = honk_vk->add_hash_to_transcript(domain_separator, *transcript);
89-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1427): Add VK FS to solidity verifier.
90-
if constexpr (!IsAnyOf<Flavor, UltraKeccakFlavor, UltraKeccakZKFlavor>) {
91-
vinfo("vk hash in Oink prover: ", vkey_hash);
92-
}
89+
vinfo("vk hash in Oink prover: ", vkey_hash);
9390

9491
for (size_t i = 0; i < proving_key->num_public_inputs(); ++i) {
9592
auto public_input_i = proving_key->public_inputs[i];

barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,7 @@ template <IsUltraOrMegaHonk Flavor> void OinkVerifier<Flavor>::verify()
4646
template <IsUltraOrMegaHonk Flavor> void OinkVerifier<Flavor>::execute_preamble_round()
4747
{
4848
FF vkey_hash = verification_key->vk->add_hash_to_transcript(domain_separator, *transcript);
49-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1427): Update solidity contract to generate vkey hash
50-
// from transcript.
51-
if constexpr (!IsAnyOf<Flavor, UltraKeccakFlavor, UltraKeccakZKFlavor>) {
52-
vinfo("vk hash in Oink verifier: ", vkey_hash);
53-
}
49+
vinfo("vk hash in Oink verifier: ", vkey_hash);
5450

5551
for (size_t i = 0; i < verification_key->vk->num_public_inputs; ++i) {
5652
auto public_input_i =

barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,7 @@ template <typename Flavor> class UltraTranscriptTests : public ::testing::Test {
6363
size_t frs_per_evals = (Flavor::NUM_ALL_ENTITIES)*frs_per_Fr;
6464

6565
size_t round = 0;
66-
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1427): Add VK FS to solidity verifier.
67-
if constexpr (!IsAnyOf<Flavor, UltraKeccakFlavor, UltraKeccakZKFlavor>) {
68-
manifest_expected.add_entry(round, "vk_hash", frs_per_Fr);
69-
} else {
70-
size_t frs_per_uint32 = bb::field_conversion::calc_num_bn254_frs<uint32_t>();
71-
manifest_expected.add_entry(round, "vk_log_circuit_size", frs_per_uint32);
72-
manifest_expected.add_entry(round, "vk_num_public_inputs", frs_per_uint32);
73-
manifest_expected.add_entry(round, "vk_pub_inputs_offset", frs_per_uint32);
74-
}
66+
manifest_expected.add_entry(round, "vk_hash", frs_per_Fr);
7567

7668
manifest_expected.add_entry(round, "public_input_0", frs_per_Fr);
7769
for (size_t i = 0; i < PAIRING_POINTS_SIZE; i++) {

0 commit comments

Comments
 (0)