1+ // ---------------------------------------------------------------------------//
2+ // Copyright (c) 2023 Dmitrii Tabalin <[email protected] >3+ //
4+ // MIT License
5+ //
6+ // Permission is hereby granted, free of charge, to any person obtaining a copy
7+ // of this software and associated documentation files (the "Software"), to deal
8+ // in the Software without restriction, including without limitation the rights
9+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+ // copies of the Software, and to permit persons to whom the Software is
11+ // furnished to do so, subject to the following conditions:
12+ //
13+ // The above copyright notice and this permission notice shall be included in all
14+ // copies or substantial portions of the Software.
15+ //
16+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+ // SOFTWARE.
23+ // ---------------------------------------------------------------------------//
24+
25+ #ifndef CRYPTO3_BLUEPRINT_PRIVATE_INPUT_EXTRACTOR_HPP
26+ #define CRYPTO3_BLUEPRINT_PRIVATE_INPUT_EXTRACTOR_HPP
27+
28+ #include < unordered_map>
29+ #include < unordered_set>
30+
31+ #include < nil/blueprint/blueprint/plonk/assignment.hpp>
32+ #include < nil/blueprint/blueprint/plonk/circuit.hpp>
33+ #include < nil/crypto3/zk/snark/arithmetization/plonk/variable.hpp>
34+
35+ namespace nil {
36+ namespace blueprint {
37+ // So you want to figure out where a variable you pass into the component actually gets assigned to?
38+ // Congratulations! You've come to the right place. You can do that in just 5 easy steps!
39+ // Note that step 2 and 5 are IMPORTANT, and you SHOULD read them!
40+ // Step 1: Instantiate your component.
41+ // Step 2: Fill the input variables you want to assign to with distinct variables.
42+ // IMPORTANT: the variables you want to assign to MUST be distinct from all others!
43+ // They also MUST be outside of the component!
44+ // ENSURE that they are not the same as the default variable (var(0, 0, false, witness)),
45+ // (or fill all of the input values)
46+ // E.g. you could make the variable to have very large witness column number.
47+ // The variable CANNOT be with the legacy private input index: copy constraints
48+ // would not generate for it and it would not be found.
49+ // Step 3: Call input_assignment_variables with the component, the input and the row at which the component
50+ // is going to be based.
51+ // Step 4: The map you got in return maps the variables from instance_input to the variables from the
52+ // component.
53+ // Step 5: IMPORTANT! Be sure to check that the variable is in the map before assinging to it.
54+ // In rare situations the variable might turn out to be unused.
55+ // The map would not contain the variable in this case.
56+ template <typename BlueprintFieldType, typename ComponentType>
57+ std::unordered_map<
58+ crypto3::zk::snark::plonk_variable<typename BlueprintFieldType::value_type>,
59+ crypto3::zk::snark::plonk_variable<typename BlueprintFieldType::value_type>> input_assignment_variables (
60+ const ComponentType &component,
61+ const crypto3::zk::snark::plonk_table_description<BlueprintFieldType> &desc,
62+ typename ComponentType::input_type instance_input,
63+ const std::size_t start_row_index) {
64+
65+ using constraint_system = crypto3::zk::snark::plonk_constraint_system<BlueprintFieldType>;
66+ using var = crypto3::zk::snark::plonk_variable<typename BlueprintFieldType::value_type>;
67+
68+ circuit<constraint_system> bp;
69+ assignment<constraint_system> assignment (desc);
70+ generate_copy_constraints (component, bp, assignment, instance_input, start_row_index);
71+ auto input_vars = instance_input.all_vars ();
72+ std::unordered_set<var> input_vars_set (input_vars.begin (), input_vars.end ());
73+
74+ std::unordered_map<var, var> result;
75+ for (const auto ©_constraint : bp.copy_constraints ()) {
76+ auto &var1 = copy_constraint.first ,
77+ &var2 = copy_constraint.second ;
78+ if (input_vars_set.find (var1) != input_vars_set.end ()) {
79+ result[var1] = var2;
80+ }
81+ if (input_vars_set.find (var2) != input_vars_set.end ()) {
82+ result[var2] = var1;
83+ }
84+ }
85+ return result;
86+ }
87+ } // namespace blueprint
88+ } // namespace nil
89+
90+ #endif // CRYPTO3_BLUEPRINT_PRIVATE_INPUT_EXTRACTOR_HPP
0 commit comments