Skip to content

Commit

Permalink
feat: expose wasm c_bind to allow creation of an ultra prover
Browse files Browse the repository at this point in the history
  • Loading branch information
TomAFrench committed Apr 6, 2023
1 parent 887ed39 commit 497d652
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 20 deletions.
48 changes: 28 additions & 20 deletions cpp/src/barretenberg/dsl/acir_proofs/acir_proofs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#include "acir_proofs.hpp"
#include "barretenberg/plonk/proof_system/proving_key/serialize.hpp"
#include "barretenberg/dsl/acir_format/acir_format.hpp"
#include "barretenberg/stdlib/types/types.hpp"
#include "barretenberg/srs/reference_string/pippenger_reference_string.hpp"
#include "barretenberg/plonk/proof_system/verification_key/sol_gen.hpp"

Expand Down Expand Up @@ -100,26 +99,8 @@ size_t new_proof(void* pippenger,
uint8_t const* witness_buf,
uint8_t** proof_data_buf)
{
auto constraint_system = from_buffer<acir_format::acir_format>(constraint_system_buf);

std::shared_ptr<ProverReferenceString> crs;
plonk::proving_key_data pk_data;
read(pk_buf, pk_data);
auto proving_key = std::make_shared<plonk::proving_key>(std::move(pk_data), crs);

auto witness = from_buffer<std::vector<fr>>(witness_buf);

auto crs_factory = std::make_unique<PippengerReferenceStringFactory>(
reinterpret_cast<scalar_multiplication::Pippenger*>(pippenger), g2x);
proving_key->reference_string = crs_factory->get_prover_crs(proving_key->circuit_size);

Composer composer(proving_key, nullptr);

create_circuit_with_witness(composer, constraint_system, witness);

auto prover = composer.create_prover();
auto heapProver = new_prover(pippenger, g2x, pk_buf, constraint_system_buf, witness_buf);

auto heapProver = new stdlib::types::Prover(std::move(prover));
auto& proof_data = heapProver->construct_proof().proof_data;
*proof_data_buf = proof_data.data();

Expand Down Expand Up @@ -156,4 +137,31 @@ bool verify_proof(
return verified;
}

stdlib::types::Prover* new_prover(void* pippenger,
uint8_t const* g2x,
uint8_t const* pk_buf,
uint8_t const* constraint_system_buf,
uint8_t const* witness_buf)
{
auto constraint_system = from_buffer<acir_format::acir_format>(constraint_system_buf);

std::shared_ptr<ProverReferenceString> crs;
plonk::proving_key_data pk_data;
read(pk_buf, pk_data);
auto proving_key = std::make_shared<plonk::proving_key>(std::move(pk_data), crs);

auto witness = from_buffer<std::vector<fr>>(witness_buf);

auto crs_factory = std::make_unique<PippengerReferenceStringFactory>(
reinterpret_cast<scalar_multiplication::Pippenger*>(pippenger), g2x);
proving_key->reference_string = crs_factory->get_prover_crs(proving_key->circuit_size);

Composer composer(proving_key, nullptr);

create_circuit_with_witness(composer, constraint_system, witness);

auto prover = composer.create_prover();
auto heapProver = new stdlib::types::Prover(std::move(prover));
return heapProver;
}
} // namespace acir_proofs
6 changes: 6 additions & 0 deletions cpp/src/barretenberg/dsl/acir_proofs/acir_proofs.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <cstdint>
#include <cstddef>
#include "barretenberg/stdlib/types/types.hpp"

namespace acir_proofs {

Expand All @@ -16,5 +17,10 @@ size_t new_proof(void* pippenger,
uint8_t** proof_data_buf);
bool verify_proof(
uint8_t const* g2x, uint8_t const* vk_buf, uint8_t const* constraint_system_buf, uint8_t* proof, uint32_t length);
proof_system::plonk::stdlib::types::Prover* new_prover(void* pippenger,
uint8_t const* g2x,
uint8_t const* pk_buf,
uint8_t const* constraint_system_buf,
uint8_t const* witness_buf);

} // namespace acir_proofs
14 changes: 14 additions & 0 deletions cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,18 @@ WASM_EXPORT bool acir_proofs_verify_proof(
{
return acir_proofs::verify_proof(g2x, vk_buf, constraint_system_buf, proof, length);
}

WASM_EXPORT void* acir_proofs_new_prover(void* pippenger,
uint8_t const* g2x,
uint8_t const* pk_buf,
uint8_t const* constraint_system_buf,
uint8_t const* witness_buf)
{
return acir_proofs::new_prover(pippenger, g2x, pk_buf, constraint_system_buf, witness_buf);
};

WASM_EXPORT void acir_proofs_delete_prover(void* prover)
{
delete reinterpret_cast<proof_system::plonk::stdlib::types::Prover*>(prover);
}
}
6 changes: 6 additions & 0 deletions cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@ WASM_EXPORT size_t acir_proofs_new_proof(void* pippenger,
uint8_t** proof_data_buf);
WASM_EXPORT bool acir_proofs_verify_proof(
uint8_t const* g2x, uint8_t const* vk_buf, uint8_t const* constraint_system_buf, uint8_t* proof, uint32_t length);
WASM_EXPORT void* acir_proofs_new_prover(void* pippenger,
uint8_t const* g2x,
uint8_t const* pk_buf,
uint8_t const* constraint_system_buf,
uint8_t const* witness_buf);
WASM_EXPORT void acir_proofs_delete_prover(void* prover);
}

0 comments on commit 497d652

Please sign in to comment.