Skip to content

Commit

Permalink
Merge pull request #279 from kroma-network/feat/implement-fibonacci-c…
Browse files Browse the repository at this point in the history
…ircuits

test: implement fibonacci circuits
  • Loading branch information
chokobole committed May 20, 2024
2 parents 3c7e18c + c30661b commit 3439208
Show file tree
Hide file tree
Showing 16 changed files with 3,859 additions and 2 deletions.
9 changes: 9 additions & 0 deletions tachyon/zk/plonk/examples/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ tachyon_cc_library(
"//tachyon/zk/base/commitments:gwc_extension",
"//tachyon/zk/base/commitments:shplonk_extension",
"//tachyon/zk/lookup/halo2:scheme",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci1_circuit",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci2_circuit",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci3_circuit",
"//tachyon/zk/plonk/layout/floor_planner:simple_floor_planner",
"//tachyon/zk/plonk/layout/floor_planner/v1:v1_floor_planner",
],
Expand All @@ -53,6 +56,12 @@ tachyon_cc_library(
"//tachyon/base:array_to_vector",
"//tachyon/math/elliptic_curves/bn/bn254",
"//tachyon/zk/lookup:lookup_pair",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci1_circuit",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci1_circuit_test_data",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci2_circuit",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci2_circuit_test_data",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci3_circuit",
"//tachyon/zk/plonk/examples/fibonacci:fibonacci3_circuit_test_data",
"//tachyon/zk/plonk/halo2:pinned_constraint_system",
"//tachyon/zk/plonk/halo2:pinned_verifying_key",
"//tachyon/zk/plonk/halo2:prover_test",
Expand Down
50 changes: 48 additions & 2 deletions tachyon/zk/plonk/examples/circuit_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
#include "gtest/gtest.h"

#include "tachyon/base/array_to_vector.h"
#include "tachyon/zk/plonk/examples/circuit_test_type_traits.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci1_circuit.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci1_circuit_test_data.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci2_circuit.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci2_circuit_test_data.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci3_circuit.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci3_circuit_test_data.h"
#include "tachyon/zk/plonk/examples/shuffle_circuit.h"
#include "tachyon/zk/plonk/examples/shuffle_circuit_test_data.h"
#include "tachyon/zk/plonk/examples/simple_circuit.h"
Expand Down Expand Up @@ -468,8 +475,11 @@ void CircuitTest<TestArguments, TestData>::VerifyProofTest() {
EXPECT_TRUE(proof.lookup_permuted_table_evals_vec[0].empty());
}

F expected_h_eval = *F::FromHexString(TestData::kHEval);
EXPECT_EQ(h_eval, expected_h_eval);
// TODO(ashjeong): get |h_eval| for fibonacci tests
if constexpr (!IsFibonacci<Circuit>) {
F expected_h_eval = *F::FromHexString(TestData::kHEval);
EXPECT_EQ(h_eval, expected_h_eval);
}
}

namespace {
Expand Down Expand Up @@ -519,4 +529,40 @@ template class CircuitTest<
ShuffleTestData<ShuffleCircuit<BN254SHPlonk::Field, kW, kH, V1FloorPlanner>,
BN254SHPlonk, BN254Halo2LS>>;

template class CircuitTest<
TestArguments<Fibonacci1Circuit<BN254SHPlonk::Field, SimpleFloorPlanner>,
BN254SHPlonk, BN254Halo2LS>,
Fibonacci1TestData<
Fibonacci1Circuit<BN254SHPlonk::Field, SimpleFloorPlanner>,
BN254SHPlonk, BN254Halo2LS>>;
template class CircuitTest<
TestArguments<Fibonacci1Circuit<BN254SHPlonk::Field, V1FloorPlanner>,
BN254SHPlonk, BN254Halo2LS>,
Fibonacci1TestData<Fibonacci1Circuit<BN254SHPlonk::Field, V1FloorPlanner>,
BN254SHPlonk, BN254Halo2LS>>;

template class CircuitTest<
TestArguments<Fibonacci2Circuit<BN254SHPlonk::Field, SimpleFloorPlanner>,
BN254SHPlonk, BN254Halo2LS>,
Fibonacci2TestData<
Fibonacci2Circuit<BN254SHPlonk::Field, SimpleFloorPlanner>,
BN254SHPlonk, BN254Halo2LS>>;
template class CircuitTest<
TestArguments<Fibonacci2Circuit<BN254SHPlonk::Field, V1FloorPlanner>,
BN254SHPlonk, BN254Halo2LS>,
Fibonacci2TestData<Fibonacci2Circuit<BN254SHPlonk::Field, V1FloorPlanner>,
BN254SHPlonk, BN254Halo2LS>>;

template class CircuitTest<
TestArguments<Fibonacci3Circuit<BN254SHPlonk::Field, SimpleFloorPlanner>,
BN254SHPlonk, BN254Halo2LS>,
Fibonacci3TestData<
Fibonacci3Circuit<BN254SHPlonk::Field, SimpleFloorPlanner>,
BN254SHPlonk, BN254Halo2LS>>;
template class CircuitTest<
TestArguments<Fibonacci3Circuit<BN254SHPlonk::Field, V1FloorPlanner>,
BN254SHPlonk, BN254Halo2LS>,
Fibonacci3TestData<Fibonacci3Circuit<BN254SHPlonk::Field, V1FloorPlanner>,
BN254SHPlonk, BN254Halo2LS>>;

} // namespace tachyon::zk::plonk
26 changes: 26 additions & 0 deletions tachyon/zk/plonk/examples/circuit_test_type_traits.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
#include "tachyon/zk/base/commitments/gwc_extension.h"
#include "tachyon/zk/base/commitments/shplonk_extension.h"
#include "tachyon/zk/lookup/halo2/scheme.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci1_circuit.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci2_circuit.h"
#include "tachyon/zk/plonk/examples/fibonacci/fibonacci3_circuit.h"
#include "tachyon/zk/plonk/layout/floor_planner/simple_floor_planner.h"
#include "tachyon/zk/plonk/layout/floor_planner/v1/v1_floor_planner.h"

Expand Down Expand Up @@ -73,6 +76,29 @@ struct IsHalo2LSImpl<lookup::halo2::Scheme<Poly, Evals, Commitment>> {
template <typename LS>
constexpr bool IsHalo2LS = IsHalo2LSImpl<LS>::value;

template <typename T>
struct IsFibonacciImpl {
static constexpr bool value = false;
};

template <typename F, template <typename> class FloorPlanner>
struct IsFibonacciImpl<Fibonacci1Circuit<F, FloorPlanner>> {
static constexpr bool value = true;
};

template <typename F, template <typename> class FloorPlanner>
struct IsFibonacciImpl<Fibonacci2Circuit<F, FloorPlanner>> {
static constexpr bool value = true;
};

template <typename F, template <typename> class FloorPlanner>
struct IsFibonacciImpl<Fibonacci3Circuit<F, FloorPlanner>> {
static constexpr bool value = true;
};

template <typename T>
constexpr bool IsFibonacci = IsFibonacciImpl<T>::value;

} // namespace tachyon::zk::plonk

#endif // TACHYON_ZK_PLONK_EXAMPLES_CIRCUIT_TEST_TYPE_TRAITS_H_
97 changes: 97 additions & 0 deletions tachyon/zk/plonk/examples/fibonacci/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
load("//bazel:tachyon_cc.bzl", "tachyon_cc_library", "tachyon_cc_unittest")

package(default_visibility = ["//visibility:public"])

COMMON_TEST_DATA_DEPS = [
"//tachyon/zk/plonk/examples:circuit_test_data",
"//tachyon/zk/plonk/examples:circuit_test_type_traits",
"//tachyon/zk/plonk/examples:point",
]

COMMON_TEST_DEPS = [
"//tachyon/zk/plonk/examples:circuit_test",
"//tachyon/zk/plonk/layout/floor_planner:simple_floor_planner",
"//tachyon/zk/plonk/layout/floor_planner/v1:v1_floor_planner",
]

tachyon_cc_library(
name = "fibonacci1_circuit",
hdrs = ["fibonacci1_circuit.h"],
deps = ["//tachyon/zk/plonk/constraint_system:circuit"],
)

tachyon_cc_library(
name = "fibonacci1_circuit_test_data",
testonly = True,
hdrs = ["fibonacci1_circuit_test_data.h"],
deps = COMMON_TEST_DATA_DEPS,
)

tachyon_cc_library(
name = "fibonacci2_circuit",
hdrs = ["fibonacci2_circuit.h"],
deps = ["//tachyon/zk/plonk/constraint_system:circuit"],
)

tachyon_cc_library(
name = "fibonacci2_circuit_test_data",
testonly = True,
hdrs = ["fibonacci2_circuit_test_data.h"],
deps = COMMON_TEST_DATA_DEPS,
)

tachyon_cc_library(
name = "fibonacci3_circuit",
hdrs = ["fibonacci3_circuit.h"],
deps = [
":is_zero_chip",
"//tachyon/zk/plonk/constraint_system:circuit",
],
)

tachyon_cc_library(
name = "fibonacci3_circuit_test_data",
testonly = True,
hdrs = ["fibonacci3_circuit_test_data.h"],
deps = COMMON_TEST_DATA_DEPS,
)

tachyon_cc_library(
name = "is_zero_chip",
hdrs = ["is_zero_chip.h"],
deps = [
"//tachyon/zk/expressions:expression_factory",
"//tachyon/zk/plonk/constraint_system",
"//tachyon/zk/plonk/layout:region",
],
)

tachyon_cc_unittest(
name = "fibonacci1_circuit_test",
testonly = True,
srcs = ["fibonacci1_circuit_test.cc"],
deps = COMMON_TEST_DEPS + [
"fibonacci1_circuit_test_data",
":fibonacci1_circuit",
],
)

tachyon_cc_unittest(
name = "fibonacci2_circuit_test",
testonly = True,
srcs = ["fibonacci2_circuit_test.cc"],
deps = COMMON_TEST_DEPS + [
"fibonacci2_circuit_test_data",
":fibonacci2_circuit",
],
)

tachyon_cc_unittest(
name = "fibonacci3_circuit_test",
testonly = True,
srcs = ["fibonacci3_circuit_test.cc"],
deps = COMMON_TEST_DEPS + [
"fibonacci3_circuit_test_data",
":fibonacci3_circuit",
],
)
9 changes: 9 additions & 0 deletions tachyon/zk/plonk/examples/fibonacci/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Fibonacci Circuits Test

## Acknowledgements

The three circuits and single chip originally come from the [halo2-examples](https://github.com/icemelon/halo2-examples/tree/6b8676487635169367e085a44e3b73c56290883f/src/fibonacci) repository by [icemelon](https://github.com/icemelon), demonstrating four different circuit designs for the Fibonacci sequence. `example4.rs` had not been implemented as it requires a larger evaluation domain for testing.

## License

As of [#279](https://github.com/kroma-network/tachyon/pull/279), the [halo2-examples](https://github.com/icemelon/halo2-examples/tree/6b8676487635169367e085a44e3b73c56290883f/src/fibonacci) repository does not specify a license. Consequently, the legal permissions for using, modifying, and distributing this code are unclear. So please consider the licensing status of this code as pending.

0 comments on commit 3439208

Please sign in to comment.