Skip to content

Commit

Permalink
Merge pull request #529 from kroma-network/feat/enable-rust-binding-f…
Browse files Browse the repository at this point in the history
…or-two-adic-fri-pcs-open

feat: enable rust binding for `TwoAdicFriPcs::Open()`
  • Loading branch information
chokobole authored Sep 3, 2024
2 parents f92f034 + 12388a0 commit e72fd3e
Show file tree
Hide file tree
Showing 52 changed files with 1,621 additions and 175 deletions.
10 changes: 9 additions & 1 deletion Cargo.Bazel.lock
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"checksum": "9871a4efaf95d41779221d5e5a0d86242b4e5832107cd0c8e50ccc004fb34199",
"checksum": "a9fbed09c049bf53d1422ae2fb19a3cea5955abe3cd56efe8444f998567af7ee",
"crates": {
"addchain 0.2.0": {
"name": "addchain",
Expand Down Expand Up @@ -18221,6 +18221,10 @@
"id": "p3-util 0.1.3-succinct",
"target": "p3_util"
},
{
"id": "serde 1.0.204",
"target": "serde"
},
{
"id": "sp1-core 1.0.1",
"target": "sp1_core"
Expand All @@ -18232,6 +18236,10 @@
{
"id": "sp1-prover 1.0.1",
"target": "sp1_prover"
},
{
"id": "tracing 0.1.40",
"target": "tracing"
}
],
"selects": {}
Expand Down
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 31 additions & 0 deletions tachyon/base/strings/string_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,21 @@ std::string Container3DToString(const Container& data) {
return ss.str();
}

template <typename Container>
std::string Container4DToString(const Container& data) {
size_t size = std::size(data);

if (size == 0) return "[]";

std::stringstream ss;
ss << "[";
for (size_t i = 0; i < size - 1; ++i) {
ss << Container3DToString(data[i]) << ", ";
}
ss << Container3DToString(data[size - 1]) << "]";
return ss.str();
}

template <typename Container>
std::string ContainerToHexString(const Container& data, bool pad_zero = false) {
size_t size = std::size(data);
Expand Down Expand Up @@ -230,6 +245,22 @@ std::string Container3DToHexString(const Container& data,
return ss.str();
}

template <typename Container>
std::string Container4DToHexString(const Container& data,
bool pad_zero = false) {
size_t size = std::size(data);

if (size == 0) return "[]";

std::stringstream ss;
ss << "[";
for (size_t i = 0; i < size - 1; ++i) {
ss << Container3DToHexString(data[i], pad_zero) << ", ";
}
ss << Container3DToHexString(data[size - 1], pad_zero) << "]";
return ss.str();
}

} // namespace tachyon::base

#endif // TACHYON_BASE_STRINGS_STRING_UTIL_H_
5 changes: 4 additions & 1 deletion tachyon/c/crypto/commitments/fri/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,8 @@ package(default_visibility = ["//visibility:public"])
tachyon_cc_library(
name = "two_adic_fri_impl",
hdrs = ["two_adic_fri_impl.h"],
deps = ["//tachyon/crypto/commitments/fri:two_adic_fri"],
deps = [
"//tachyon/base/containers:container_util",
"//tachyon/crypto/commitments/fri:two_adic_fri",
],
)
29 changes: 26 additions & 3 deletions tachyon/c/crypto/commitments/fri/two_adic_fri_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <utility>
#include <vector>

#include "tachyon/base/containers/container_util.h"
#include "tachyon/crypto/commitments/fri/two_adic_fri.h"

namespace tachyon::c::crypto {
Expand All @@ -21,6 +22,9 @@ class TwoAdicFRIImpl
using Commitment = typename Base::Commitment;
using ProverData = typename Base::ProverData;
using Domain = typename Base::Domain;
using OpeningPoints = typename Base::OpeningPoints;
using OpenedValues = typename Base::OpenedValues;
using FRIProof = typename Base::FRIProof;

using Base::Base;

Expand All @@ -39,16 +43,35 @@ class TwoAdicFRIImpl

using Base::Commit;

void Commit(Commitment* commitment, ProverData** prover_data_out) {
void Commit(Commitment* commitment, ProverData** prover_data_out,
std::vector<std::unique_ptr<ProverData>>* prover_data_by_round) {
std::unique_ptr<ProverData> prover_data(new ProverData);
CHECK(this->mmcs_.Commit(std::move(ldes_), commitment, prover_data.get()));
*prover_data_out = prover_data.get();
prover_data_by_round_.push_back(std::move(prover_data));
prover_data_by_round->push_back(std::move(prover_data));
}

void CreateOpeningProof(
const std::vector<std::unique_ptr<ProverData>>& prover_data_by_round_in,
const OpeningPoints& points_by_round, Challenger& challenger,
OpenedValues* opened_values_by_round, FRIProof* proof) {
auto& prover_data_by_round =
const_cast<std::vector<std::unique_ptr<ProverData>>&>(
prover_data_by_round_in);
std::vector<ProverData> prover_data_by_round_tmp = tachyon::base::Map(
prover_data_by_round, [](std::unique_ptr<ProverData>& prover_data) {
return ProverData(std::move(*prover_data));
});
CHECK(Base::CreateOpeningProof(prover_data_by_round_tmp, points_by_round,
challenger, opened_values_by_round, proof));
prover_data_by_round = tachyon::base::Map(
prover_data_by_round_tmp, [](ProverData& prover_data) {
return std::make_unique<ProverData>(std::move(prover_data));
});
}

protected:
std::vector<math::RowMajorMatrix<F>> ldes_;
std::vector<std::unique_ptr<ProverData>> prover_data_by_round_;
};

} // namespace tachyon::c::crypto
Expand Down
71 changes: 65 additions & 6 deletions tachyon/c/zk/air/sp1/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ filegroup(
srcs = [
"baby_bear_poseidon2_constants.h",
"baby_bear_poseidon2_duplex_challenger.h",
"baby_bear_poseidon2_field_merkle_tree.h",
"baby_bear_poseidon2_field_merkle_tree_vec.h",
"baby_bear_poseidon2_fri_proof.h",
"baby_bear_poseidon2_opened_values.h",
"baby_bear_poseidon2_opening_points.h",
"baby_bear_poseidon2_two_adic_fri.h",
],
)
Expand Down Expand Up @@ -51,20 +56,77 @@ tachyon_cc_library(
],
)

tachyon_cc_library(
name = "baby_bear_poseidon2_field_merkle_tree_vec",
srcs = ["baby_bear_poseidon2_field_merkle_tree_vec.cc"],
hdrs = [
"baby_bear_poseidon2_field_merkle_tree_vec.h",
"baby_bear_poseidon2_field_merkle_tree_vec_type_traits.h",
],
deps = [
":baby_bear_poseidon2_constants",
"//tachyon/base/containers:container_util",
"//tachyon/c:export",
"//tachyon/c/base:type_traits_forward",
"//tachyon/crypto/commitments/merkle_tree/field_merkle_tree",
"//tachyon/math/finite_fields/baby_bear",
],
)

tachyon_cc_library(
name = "baby_bear_poseidon2_opened_values",
srcs = ["baby_bear_poseidon2_opened_values.cc"],
hdrs = [
"baby_bear_poseidon2_opened_values.h",
"baby_bear_poseidon2_opened_values_type_traits.h",
],
deps = [
"//tachyon/base:auto_reset",
"//tachyon/base/buffer",
"//tachyon/c:export",
"//tachyon/c/base:type_traits_forward",
"//tachyon/c/math/finite_fields/baby_bear:baby_bear4",
],
)

tachyon_cc_library(
name = "baby_bear_poseidon2_opening_points",
srcs = ["baby_bear_poseidon2_opening_points.cc"],
hdrs = [
"baby_bear_poseidon2_opening_points.h",
"baby_bear_poseidon2_opening_points_type_traits.h",
],
deps = [
"//tachyon/c:export",
"//tachyon/c/base:type_traits_forward",
"//tachyon/c/math/finite_fields/baby_bear:baby_bear4",
],
)

tachyon_cc_library(
name = "baby_bear_poseidon2_two_adic_fri",
srcs = ["baby_bear_poseidon2_two_adic_fri.cc"],
srcs = [
"baby_bear_poseidon2_fri_proof.cc",
"baby_bear_poseidon2_two_adic_fri.cc",
],
hdrs = [
"baby_bear_poseidon2_fri_proof.h",
"baby_bear_poseidon2_fri_proof_type_traits.h",
"baby_bear_poseidon2_two_adic_fri.h",
"baby_bear_poseidon2_two_adic_fri_type_traits.h",
],
deps = [
":baby_bear_poseidon2_constants",
":baby_bear_poseidon2_duplex_challenger",
":baby_bear_poseidon2_field_merkle_tree",
":baby_bear_poseidon2_field_merkle_tree_vec",
":baby_bear_poseidon2_opened_values",
":baby_bear_poseidon2_opening_points",
"//tachyon/c:export",
"//tachyon/c/base:type_traits_forward",
"//tachyon/c/crypto/commitments/fri:two_adic_fri_impl",
"//tachyon/c/math/finite_fields/baby_bear",
"//tachyon/c/math/finite_fields/baby_bear:baby_bear4",
"//tachyon/c/math/matrix:baby_bear_row_major_matrix",
"//tachyon/crypto/challenger:duplex_challenger",
"//tachyon/crypto/commitments/fri:two_adic_fri",
Expand All @@ -75,23 +137,20 @@ tachyon_cc_library(
"//tachyon/crypto/hashes/sponge:truncated_permutation",
"//tachyon/crypto/hashes/sponge/poseidon2",
"//tachyon/crypto/hashes/sponge/poseidon2:poseidon2_plonky3_external_matrix",
"//tachyon/math/finite_fields/baby_bear:baby_bear4",
"//tachyon/math/finite_fields/baby_bear:poseidon2",
],
)

tachyon_cc_library(
name = "sp1",
deps = [
":baby_bear_poseidon2_duplex_challenger",
":baby_bear_poseidon2_two_adic_fri",
],
deps = [":baby_bear_poseidon2_two_adic_fri"],
)

tachyon_cc_unittest(
name = "sp1_unittests",
srcs = [
"baby_bear_poseidon2_duplex_challenger_unittest.cc",
"baby_bear_poseidon2_opened_values_unittest.cc",
"baby_bear_poseidon2_two_adic_fri_unittest.cc",
],
deps = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

using namespace tachyon;

using F = math::BabyBear;
using Tree = c::zk::air::plonky3::baby_bear::Tree;

tachyon_sp1_baby_bear_poseidon2_field_merkle_tree*
Expand Down
10 changes: 5 additions & 5 deletions tachyon/c/zk/air/sp1/baby_bear_poseidon2_field_merkle_tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,21 @@ extern "C" {
*
* Creates a deep copy of the given field merkle tree structure.
*
* @param challenger A const pointer to the field merkle tree structure to
* clone.
* @param tree A const pointer to the field merkle tree structure
* to clone.
* @return A pointer to the cloned field merkle tree structure.
*/
TACHYON_C_EXPORT tachyon_sp1_baby_bear_poseidon2_field_merkle_tree*
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_clone(
const tachyon_sp1_baby_bear_poseidon2_field_merkle_tree* challenger);
const tachyon_sp1_baby_bear_poseidon2_field_merkle_tree* tree);

/**
* @brief Destroys a field merkle tree, freeing its resources.
*
* @param pcs A pointer to the field merkle tree to destroy.
* @param tree A pointer to the field merkle tree to destroy.
*/
TACHYON_C_EXPORT void tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_destroy(
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree* field_merkle_tree);
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree* tree);

#ifdef __cplusplus
} // extern "C"
Expand Down
33 changes: 33 additions & 0 deletions tachyon/c/zk/air/sp1/baby_bear_poseidon2_field_merkle_tree_vec.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "tachyon/c/zk/air/sp1/baby_bear_poseidon2_field_merkle_tree_vec.h"

#include <memory>
#include <vector>

#include "tachyon/base/containers/container_util.h"
#include "tachyon/c/zk/air/sp1/baby_bear_poseidon2_field_merkle_tree_vec_type_traits.h"

using namespace tachyon;

using Tree = c::zk::air::plonky3::baby_bear::Tree;
using TreeVec = std::vector<std::unique_ptr<Tree>>;

tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec*
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec_create() {
return c::base::c_cast(new TreeVec());
}

tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec*
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec_clone(
const tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec* tree_vec) {
const TreeVec& native_tree_vec = c::base::native_cast(*tree_vec);
TreeVec* cloned = new TreeVec();
*cloned = base::Map(native_tree_vec, [](const std::unique_ptr<Tree>& tree) {
return std::make_unique<Tree>(*tree);
});
return c::base::c_cast(cloned);
}

void tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec_destroy(
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec* tree) {
delete c::base::native_cast(tree);
}
52 changes: 52 additions & 0 deletions tachyon/c/zk/air/sp1/baby_bear_poseidon2_field_merkle_tree_vec.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/**
* @file baby_bear_poseidon2_field_merkle_tree_vec.h
* @brief Defines the interface for the field merkle tree used within the
* SP1(BabyBear + Poseidon2) proof system.
*/

#ifndef TACHYON_C_ZK_AIR_SP1_BABY_BEAR_POSEIDON2_FIELD_MERKLE_TREE_VEC_H_
#define TACHYON_C_ZK_AIR_SP1_BABY_BEAR_POSEIDON2_FIELD_MERKLE_TREE_VEC_H_

#include "tachyon/c/export.h"

struct tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec {};

#ifdef __cplusplus
extern "C" {
#endif

/**
* @brief Creates a new field merkle tree vector.
*
* @return A pointer to the newly created field merkle tree vector.
*/
TACHYON_C_EXPORT tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec*
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec_create();

/**
* @brief Clones an existing field merkle tree vector structure.
*
* Creates a deep copy of the given field merkle tree vector structure.
*
* @param tree_vec A const pointer to the field merkle tree vector structure
* to clone.
* @return A pointer to the cloned field merkle tree vector structure.
*/
TACHYON_C_EXPORT tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec*
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec_clone(
const tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec* tree_vec);

/**
* @brief Destroys a field merkle tree vector, freeing its resources.
*
* @param pcs A pointer to the field merkle tree vector to destroy.
*/
TACHYON_C_EXPORT void
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec_destroy(
tachyon_sp1_baby_bear_poseidon2_field_merkle_tree_vec* tree_vec);

#ifdef __cplusplus
} // extern "C"
#endif

#endif // TACHYON_C_ZK_AIR_SP1_BABY_BEAR_POSEIDON2_FIELD_MERKLE_TREE_VEC_H_
Loading

0 comments on commit e72fd3e

Please sign in to comment.