├── .gitignore ├── Cargo.toml ├── LICENSE ├── README.md ├── doc ├── benchmark-results │ ├── 20210615_1core_96bit.txt │ ├── 20210615_32core_96bit.txt │ ├── 20210616_1core_127-255bit.txt │ ├── 20210616_32core_127-255bit.txt │ ├── 20210723_1core_127-255bit.txt │ ├── 20210723_32core_127-255bit.txt │ ├── 20210728_32core_255bit_ligero-29.txt │ ├── 20210728_32core_255bit_ligero-hirate.txt │ ├── 20210728_32core_255bit_sdig-28.txt │ ├── 20210728_32core_255bit_sdig-29.txt │ ├── 20210730_1core_255bit_sdig-ligero.txt │ ├── 20210730_1core_255bit_sdig-ligero_pvs.txt │ ├── 20210730_32core_255bit_sdig-ligero.txt │ ├── 20210730_32core_255bit_sdig-ligero_pvs.txt │ ├── 20210801_1core_255bit_ligero_1:4.txt │ ├── 20210801_1core_255bit_ligero_1:4_pvs.txt │ ├── 20210801_32core_255bit_ligero_1:4.txt │ ├── 20210801_32core_255bit_ligero_1:4_pvs.txt │ ├── 20210804_1core_255bit_ligero_1:2.txt │ ├── 20210804_1core_255bit_ligero_1:2_pvs.txt │ ├── 20210804_32core_255bit_ligero_1:2.txt │ ├── 20210804_32core_255bit_ligero_1:2_pvs.txt │ ├── 20210807_1c_255bit_ligero_dfl.txt │ ├── 20210807_1c_255bit_ligero_dfl_pvs.txt │ ├── 20210807_1c_255bit_ligero_hlf.txt │ ├── 20210807_1c_255bit_ligero_hlf_pvs.txt │ ├── 20210807_1c_255bit_ligero_isz.txt │ ├── 20210807_1c_255bit_ligero_isz_pvs.txt │ ├── 20210807_1c_255bit_sdig.txt │ ├── 20210807_1c_255bit_sdig_pvs.txt │ ├── 20210807_64c_255bit_ligero_dfl.txt │ ├── 20210807_64c_255bit_ligero_dfl_pvs.txt │ ├── 20210807_64c_255bit_ligero_hlf.txt │ ├── 20210807_64c_255bit_ligero_hlf_pvs.txt │ ├── 20210807_64c_255bit_ligero_isz.txt │ ├── 20210807_64c_255bit_ligero_isz_pvs.txt │ ├── 20210807_64c_255bit_sdig.txt │ ├── 20210807_64c_255bit_sdig_pvs.txt │ └── sdig-ligero-isz-microbenchmarks └── encoding.py ├── lcpc-2d ├── Cargo.toml └── src │ ├── lib.rs │ ├── macros.rs │ └── tests.rs ├── lcpc-brakedown-pc ├── Cargo.toml └── src │ ├── bench.rs │ ├── codespec.rs │ ├── encode.rs │ ├── lib.rs │ ├── matgen.rs │ └── tests.rs ├── lcpc-ligero-pc ├── Cargo.toml ├── README.md └── src │ ├── bench.rs │ ├── lib.rs │ └── tests.rs ├── lcpc-test-fields ├── Cargo.toml └── src │ └── lib.rs └── scripts ├── microbench.sh └── print_bench.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | Cargo.lock 3 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ "lcpc-2d", "lcpc-ligero-pc", "lcpc-brakedown-pc", "lcpc-test-fields" ] 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # lcpc 2 | 3 | Polynomial commitment scheme from any linear code with sufficient minimum distance. 4 | 5 | https://eprint.iacr.org/2021/1043 6 | 7 | # repo layout 8 | 9 | - `doc` - misc documentation 10 | 11 | - `lcpc-2d` - "2-dimensional" polynomial commitment parameterized by a linear code 12 | 13 | - `lcpc-brakedown-pc` - an expander-based encoding for use with `lcpc-2d` 14 | 15 | - `lcpc-ligero-pc` - an R-S--based encoding for use with `lcpc-2d` 16 | 17 | - `lcpc-test-fields` - field definitions and misc for testing / benching 18 | 19 | - `scripts` - miscellaneous 20 | 21 | ## license 22 | 23 | Copyright 2021 Riad S. Wahby and lcpc authors 24 | 25 | Licensed under the Apache License, Version 2.0 (the "License"); 26 | you may not use this file except in compliance with the License. 27 | You may obtain a copy of the License at 28 | 29 | http://www.apache.org/licenses/LICENSE-2.0 30 | 31 | Unless required by applicable law or agreed to in writing, software 32 | distributed under the License is distributed on an "AS IS" BASIS, 33 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 34 | See the License for the specific language governing permissions and 35 | limitations under the License. 36 | 37 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210615_1core_96bit.txt: -------------------------------------------------------------------------------- 1 | Finished bench [optimized] target(s) in 0.07s 2 | Running unittests (target/release/deps/lcpc2d-9a30673077f740d3) 3 | 4 | running 7 tests 5 | test tests::commit ... ignored 6 | test tests::end_to_end ... ignored 7 | test tests::end_to_end_two_proofs ... ignored 8 | test tests::eval_outer ... ignored 9 | test tests::log2 ... ignored 10 | test tests::merkleize ... ignored 11 | test tests::open_column ... ignored 12 | 13 | test result: ok. 0 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.00s 14 | 15 | Running unittests (target/release/deps/ligero_pc-74cbc2f02a18a48d) 16 | 17 | running 30 tests 18 | test tests::end_to_end ... ignored 19 | test tests::end_to_end_two_proofs ... ignored 20 | test tests::get_dims ... ignored 21 | test bench::commit_blake2b_16 ... bench: 44,461,572 ns/iter (+/- 758,617) 22 | test bench::commit_blake2b_20 ... bench: 781,387,881 ns/iter (+/- 4,217,894) 23 | test bench::commit_blake2b_24 ... bench: 13,703,048,830 ns/iter (+/- 142,642,714) 24 | test bench::commit_blake3_16 ... bench: 42,984,933 ns/iter (+/- 276,006) 25 | test bench::commit_blake3_20 ... bench: 787,584,715 ns/iter (+/- 3,663,101) 26 | test bench::commit_blake3_24 ... bench: 13,707,434,857 ns/iter (+/- 76,263,841) 27 | test bench::commit_sha3_16 ... bench: 49,670,504 ns/iter (+/- 348,494) 28 | test bench::commit_sha3_20 ... bench: 899,463,120 ns/iter (+/- 15,007,219) 29 | test bench::commit_sha3_24 ... bench: 15,574,229,185 ns/iter (+/- 226,013,493) 30 | test bench::prove_blake2b_16 ... bench: 3,221,656 ns/iter (+/- 71,180) 31 | test bench::prove_blake2b_20 ... bench: 47,834,710 ns/iter (+/- 431,608) 32 | test bench::prove_blake2b_24 ... bench: 869,967,659 ns/iter (+/- 16,999,903) 33 | test bench::prove_blake3_16 ... bench: 3,296,524 ns/iter (+/- 56,380) 34 | test bench::prove_blake3_20 ... bench: 46,582,215 ns/iter (+/- 367,056) 35 | test bench::prove_blake3_24 ... bench: 863,773,568 ns/iter (+/- 14,527,279) 36 | test bench::prove_sha3_16 ... bench: 3,290,357 ns/iter (+/- 37,477) 37 | test bench::prove_sha3_20 ... bench: 46,689,558 ns/iter (+/- 340,306) 38 | test bench::prove_sha3_24 ... bench: 852,816,336 ns/iter (+/- 14,451,909) 39 | test bench::verify_blake2b_16 ... bench: 3,098,578 ns/iter (+/- 57,343) 40 | test bench::verify_blake2b_20 ... bench: 11,228,698 ns/iter (+/- 295,392) 41 | test bench::verify_blake2b_24 ... bench: 43,869,534 ns/iter (+/- 452,763) 42 | test bench::verify_blake3_16 ... bench: 3,165,695 ns/iter (+/- 34,414) 43 | test bench::verify_blake3_20 ... bench: 11,686,303 ns/iter (+/- 220,261) 44 | test bench::verify_blake3_24 ... bench: 45,967,631 ns/iter (+/- 572,662) 45 | test bench::verify_sha3_16 ... bench: 4,322,951 ns/iter (+/- 98,973) 46 | test bench::verify_sha3_20 ... bench: 15,204,802 ns/iter (+/- 308,118) 47 | test bench::verify_sha3_24 ... bench: 58,701,182 ns/iter (+/- 748,758) 48 | 49 | test result: ok. 0 passed; 0 failed; 3 ignored; 27 measured; 0 filtered out; finished in 14749.75s 50 | 51 | Running unittests (target/release/deps/sdig_pc-03dd27a6b477a608) 52 | 53 | running 61 tests 54 | test tests::end_to_end_one_proof ... ignored 55 | test tests::end_to_end_two_proofs ... ignored 56 | test tests::fft_end_to_end_one_proof ... ignored 57 | test tests::fft_end_to_end_two_proofs ... ignored 58 | test tests::sprs_playground ... ignored 59 | test tests::test_matgen_check_seed ... ignored 60 | test tests::test_matgen_encode ... ignored 61 | test bench::commit_blake2b_16 ... bench: 33,849,109 ns/iter (+/- 408,578) 62 | test bench::commit_blake2b_20 ... bench: 545,967,664 ns/iter (+/- 2,430,278) 63 | test bench::commit_blake2b_24 ... bench: 8,648,321,910 ns/iter (+/- 31,368,976) 64 | test bench::commit_blake3_16 ... bench: 32,702,818 ns/iter (+/- 267,201) 65 | test bench::commit_blake3_20 ... bench: 544,326,572 ns/iter (+/- 1,852,161) 66 | test bench::commit_blake3_24 ... bench: 8,734,620,064 ns/iter (+/- 18,939,631) 67 | test bench::commit_fft_blake2b_16 ... bench: 28,761,124 ns/iter (+/- 295,949) 68 | test bench::commit_fft_blake2b_20 ... bench: 511,024,159 ns/iter (+/- 2,107,601) 69 | test bench::commit_fft_blake2b_24 ... bench: 8,646,190,887 ns/iter (+/- 43,800,015) 70 | test bench::commit_fft_blake3_16 ... bench: 28,751,036 ns/iter (+/- 319,821) 71 | test bench::commit_fft_blake3_20 ... bench: 510,635,559 ns/iter (+/- 2,021,602) 72 | test bench::commit_fft_blake3_24 ... bench: 8,761,653,675 ns/iter (+/- 111,422,863) 73 | test bench::commit_fft_sha3_16 ... bench: 32,855,895 ns/iter (+/- 191,468) 74 | test bench::commit_fft_sha3_20 ... bench: 572,882,640 ns/iter (+/- 2,156,960) 75 | test bench::commit_fft_sha3_24 ... bench: 9,661,994,067 ns/iter (+/- 70,634,604) 76 | test bench::commit_sha3_16 ... bench: 36,474,611 ns/iter (+/- 224,602) 77 | test bench::commit_sha3_20 ... bench: 600,506,609 ns/iter (+/- 2,290,119) 78 | test bench::commit_sha3_24 ... bench: 9,636,675,523 ns/iter (+/- 25,499,507) 79 | test bench::prove_blake2b_16 ... bench: 3,161,870 ns/iter (+/- 62,672) 80 | test bench::prove_blake2b_20 ... bench: 47,052,873 ns/iter (+/- 420,799) 81 | test bench::prove_blake2b_24 ... bench: 861,188,854 ns/iter (+/- 15,295,152) 82 | test bench::prove_blake3_16 ... bench: 3,166,932 ns/iter (+/- 62,446) 83 | test bench::prove_blake3_20 ... bench: 47,577,460 ns/iter (+/- 454,125) 84 | test bench::prove_blake3_24 ... bench: 861,335,328 ns/iter (+/- 15,517,420) 85 | test bench::prove_fft_blake2b_16 ... bench: 3,178,034 ns/iter (+/- 60,128) 86 | test bench::prove_fft_blake2b_20 ... bench: 47,281,340 ns/iter (+/- 459,299) 87 | test bench::prove_fft_blake2b_24 ... bench: 887,832,134 ns/iter (+/- 7,290,225) 88 | test bench::prove_fft_blake3_16 ... bench: 3,164,669 ns/iter (+/- 60,072) 89 | test bench::prove_fft_blake3_20 ... bench: 47,149,007 ns/iter (+/- 373,274) 90 | test bench::prove_fft_blake3_24 ... bench: 888,398,297 ns/iter (+/- 7,256,492) 91 | test bench::prove_fft_sha3_16 ... bench: 3,177,491 ns/iter (+/- 62,691) 92 | test bench::prove_fft_sha3_20 ... bench: 47,053,039 ns/iter (+/- 301,150) 93 | test bench::prove_fft_sha3_24 ... bench: 889,670,180 ns/iter (+/- 8,171,556) 94 | test bench::prove_sha3_16 ... bench: 3,189,573 ns/iter (+/- 76,235) 95 | test bench::prove_sha3_20 ... bench: 47,588,392 ns/iter (+/- 592,168) 96 | test bench::prove_sha3_24 ... bench: 860,917,731 ns/iter (+/- 14,799,830) 97 | test bench::verify_blake2b_16 ... bench: 4,499,066 ns/iter (+/- 127,617) 98 | test bench::verify_blake2b_20 ... bench: 12,429,011 ns/iter (+/- 442,885) 99 | test bench::verify_blake2b_24 ... bench: 47,587,280 ns/iter (+/- 3,118,482) 100 | test bench::verify_blake3_16 ... bench: 4,579,380 ns/iter (+/- 97,825) 101 | test bench::verify_blake3_20 ... bench: 12,811,189 ns/iter (+/- 422,925) 102 | test bench::verify_blake3_24 ... bench: 49,312,985 ns/iter (+/- 868,934) 103 | test bench::verify_fft_blake2b_16 ... bench: 3,122,945 ns/iter (+/- 81,255) 104 | test bench::verify_fft_blake2b_20 ... bench: 11,803,952 ns/iter (+/- 465,145) 105 | test bench::verify_fft_blake2b_24 ... bench: 49,007,549 ns/iter (+/- 6,031,631) 106 | test bench::verify_fft_blake3_16 ... bench: 3,155,274 ns/iter (+/- 50,223) 107 | test bench::verify_fft_blake3_20 ... bench: 12,157,882 ns/iter (+/- 482,461) 108 | test bench::verify_fft_blake3_24 ... bench: 51,767,485 ns/iter (+/- 5,975,340) 109 | test bench::verify_fft_sha3_16 ... bench: 4,306,228 ns/iter (+/- 119,316) 110 | test bench::verify_fft_sha3_20 ... bench: 15,660,344 ns/iter (+/- 459,220) 111 | test bench::verify_fft_sha3_24 ... bench: 61,715,723 ns/iter (+/- 2,926,060) 112 | test bench::verify_sha3_16 ... bench: 4,370,306 ns/iter (+/- 167,026) 113 | test bench::verify_sha3_20 ... bench: 16,219,343 ns/iter (+/- 525,174) 114 | test bench::verify_sha3_24 ... bench: 61,281,188 ns/iter (+/- 541,240) 115 | 116 | test result: ok. 0 passed; 0 failed; 7 ignored; 54 measured; 0 filtered out; finished in 19294.83s 117 | 118 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210615_32core_96bit.txt: -------------------------------------------------------------------------------- 1 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 2 | Compiling sdig-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/sdig-pc) 3 | Finished bench [optimized] target(s) in 6.20s 4 | Running unittests (target/release/deps/lcpc2d-9a30673077f740d3) 5 | 6 | running 7 tests 7 | test tests::commit ... ignored 8 | test tests::end_to_end ... ignored 9 | test tests::end_to_end_two_proofs ... ignored 10 | test tests::eval_outer ... ignored 11 | test tests::log2 ... ignored 12 | test tests::merkleize ... ignored 13 | test tests::open_column ... ignored 14 | 15 | test result: ok. 0 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.00s 16 | 17 | Running unittests (target/release/deps/ligero_pc-74cbc2f02a18a48d) 18 | 19 | running 30 tests 20 | test tests::end_to_end ... ignored 21 | test tests::end_to_end_two_proofs ... ignored 22 | test tests::get_dims ... ignored 23 | test bench::commit_blake2b_16 ... bench: 15,004,011 ns/iter (+/- 2,962,539) 24 | test bench::commit_blake2b_20 ... bench: 121,462,300 ns/iter (+/- 7,529,342) 25 | test bench::commit_blake2b_24 ... bench: 1,519,450,139 ns/iter (+/- 41,641,299) 26 | test bench::commit_blake3_16 ... bench: 14,993,120 ns/iter (+/- 2,910,126) 27 | test bench::commit_blake3_20 ... bench: 122,952,512 ns/iter (+/- 8,989,981) 28 | test bench::commit_blake3_24 ... bench: 1,517,129,873 ns/iter (+/- 32,579,079) 29 | test bench::commit_sha3_16 ... bench: 15,473,425 ns/iter (+/- 2,591,210) 30 | test bench::commit_sha3_20 ... bench: 130,716,311 ns/iter (+/- 6,827,712) 31 | test bench::commit_sha3_24 ... bench: 1,630,389,407 ns/iter (+/- 28,806,763) 32 | test bench::prove_blake2b_16 ... bench: 1,924,085 ns/iter (+/- 230,257) 33 | test bench::prove_blake2b_20 ... bench: 7,145,150 ns/iter (+/- 486,254) 34 | test bench::prove_blake2b_24 ... bench: 84,199,890 ns/iter (+/- 1,409,881) 35 | test bench::prove_blake3_16 ... bench: 2,009,864 ns/iter (+/- 263,832) 36 | test bench::prove_blake3_20 ... bench: 7,342,623 ns/iter (+/- 449,653) 37 | test bench::prove_blake3_24 ... bench: 82,296,838 ns/iter (+/- 1,758,116) 38 | test bench::prove_sha3_16 ... bench: 1,955,481 ns/iter (+/- 218,552) 39 | test bench::prove_sha3_20 ... bench: 7,369,919 ns/iter (+/- 895,279) 40 | test bench::prove_sha3_24 ... bench: 78,348,262 ns/iter (+/- 6,930,383) 41 | test bench::verify_blake2b_16 ... bench: 2,244,529 ns/iter (+/- 111,722) 42 | test bench::verify_blake2b_20 ... bench: 4,444,351 ns/iter (+/- 321,136) 43 | test bench::verify_blake2b_24 ... bench: 10,300,510 ns/iter (+/- 812,946) 44 | test bench::verify_blake3_16 ... bench: 2,235,043 ns/iter (+/- 48,258) 45 | test bench::verify_blake3_20 ... bench: 4,465,712 ns/iter (+/- 349,471) 46 | test bench::verify_blake3_24 ... bench: 10,702,833 ns/iter (+/- 802,853) 47 | test bench::verify_sha3_16 ... bench: 2,329,261 ns/iter (+/- 182,778) 48 | test bench::verify_sha3_20 ... bench: 4,729,683 ns/iter (+/- 289,542) 49 | test bench::verify_sha3_24 ... bench: 11,103,968 ns/iter (+/- 838,165) 50 | 51 | test result: ok. 0 passed; 0 failed; 3 ignored; 27 measured; 0 filtered out; finished in 1689.42s 52 | 53 | Running unittests (target/release/deps/sdig_pc-03dd27a6b477a608) 54 | 55 | running 61 tests 56 | test tests::end_to_end_one_proof ... ignored 57 | test tests::end_to_end_two_proofs ... ignored 58 | test tests::fft_end_to_end_one_proof ... ignored 59 | test tests::fft_end_to_end_two_proofs ... ignored 60 | test tests::sprs_playground ... ignored 61 | test tests::test_matgen_check_seed ... ignored 62 | test tests::test_matgen_encode ... ignored 63 | test bench::commit_blake2b_16 ... bench: 5,445,892 ns/iter (+/- 697,409) 64 | test bench::commit_blake2b_20 ... bench: 56,481,116 ns/iter (+/- 5,071,299) 65 | test bench::commit_blake2b_24 ... bench: 648,432,891 ns/iter (+/- 14,838,334) 66 | test bench::commit_blake3_16 ... bench: 5,449,196 ns/iter (+/- 604,359) 67 | test bench::commit_blake3_20 ... bench: 57,261,251 ns/iter (+/- 3,985,551) 68 | test bench::commit_blake3_24 ... bench: 664,550,744 ns/iter (+/- 25,438,884) 69 | test bench::commit_fft_blake2b_16 ... bench: 6,629,748 ns/iter (+/- 904,575) 70 | test bench::commit_fft_blake2b_20 ... bench: 57,525,428 ns/iter (+/- 7,068,886) 71 | test bench::commit_fft_blake2b_24 ... bench: 678,543,679 ns/iter (+/- 23,490,959) 72 | test bench::commit_fft_blake3_16 ... bench: 6,539,062 ns/iter (+/- 799,029) 73 | test bench::commit_fft_blake3_20 ... bench: 56,902,336 ns/iter (+/- 6,120,216) 74 | test bench::commit_fft_blake3_24 ... bench: 669,453,474 ns/iter (+/- 24,608,715) 75 | test bench::commit_fft_sha3_16 ... bench: 6,603,468 ns/iter (+/- 1,433,048) 76 | test bench::commit_fft_sha3_20 ... bench: 59,706,372 ns/iter (+/- 8,195,892) 77 | test bench::commit_fft_sha3_24 ... bench: 745,460,251 ns/iter (+/- 30,231,053) 78 | test bench::commit_sha3_16 ... bench: 5,897,423 ns/iter (+/- 826,681) 79 | test bench::commit_sha3_20 ... bench: 60,218,884 ns/iter (+/- 6,298,818) 80 | test bench::commit_sha3_24 ... bench: 744,283,014 ns/iter (+/- 41,078,151) 81 | test bench::prove_blake2b_16 ... bench: 1,847,995 ns/iter (+/- 190,541) 82 | test bench::prove_blake2b_20 ... bench: 6,900,973 ns/iter (+/- 1,717,212) 83 | test bench::prove_blake2b_24 ... bench: 86,635,599 ns/iter (+/- 19,089,014) 84 | test bench::prove_blake3_16 ... bench: 1,860,287 ns/iter (+/- 254,939) 85 | test bench::prove_blake3_20 ... bench: 6,802,633 ns/iter (+/- 298,801) 86 | test bench::prove_blake3_24 ... bench: 82,169,543 ns/iter (+/- 2,854,636) 87 | test bench::prove_fft_blake2b_16 ... bench: 1,877,153 ns/iter (+/- 256,799) 88 | test bench::prove_fft_blake2b_20 ... bench: 7,191,787 ns/iter (+/- 752,561) 89 | test bench::prove_fft_blake2b_24 ... bench: 79,962,046 ns/iter (+/- 1,458,279) 90 | test bench::prove_fft_blake3_16 ... bench: 1,882,583 ns/iter (+/- 250,477) 91 | test bench::prove_fft_blake3_20 ... bench: 6,569,587 ns/iter (+/- 198,692) 92 | test bench::prove_fft_blake3_24 ... bench: 80,467,456 ns/iter (+/- 1,181,673) 93 | test bench::prove_fft_sha3_16 ... bench: 1,896,344 ns/iter (+/- 207,943) 94 | test bench::prove_fft_sha3_20 ... bench: 6,560,262 ns/iter (+/- 155,173) 95 | test bench::prove_fft_sha3_24 ... bench: 79,600,073 ns/iter (+/- 1,463,308) 96 | test bench::prove_sha3_16 ... bench: 1,812,396 ns/iter (+/- 182,378) 97 | test bench::prove_sha3_20 ... bench: 6,698,506 ns/iter (+/- 494,573) 98 | test bench::prove_sha3_24 ... bench: 83,476,374 ns/iter (+/- 3,266,371) 99 | test bench::verify_blake2b_16 ... bench: 1,025,727 ns/iter (+/- 233,966) 100 | test bench::verify_blake2b_20 ... bench: 3,343,638 ns/iter (+/- 1,494,317) 101 | test bench::verify_blake2b_24 ... bench: 12,055,678 ns/iter (+/- 2,265,761) 102 | test bench::verify_blake3_16 ... bench: 998,865 ns/iter (+/- 201,750) 103 | test bench::verify_blake3_20 ... bench: 3,318,986 ns/iter (+/- 785,100) 104 | test bench::verify_blake3_24 ... bench: 12,287,465 ns/iter (+/- 3,942,785) 105 | test bench::verify_fft_blake2b_16 ... bench: 1,758,352 ns/iter (+/- 133,078) 106 | test bench::verify_fft_blake2b_20 ... bench: 4,344,436 ns/iter (+/- 854,626) 107 | test bench::verify_fft_blake2b_24 ... bench: 13,747,566 ns/iter (+/- 4,825,295) 108 | test bench::verify_fft_blake3_16 ... bench: 1,780,524 ns/iter (+/- 251,175) 109 | test bench::verify_fft_blake3_20 ... bench: 4,878,168 ns/iter (+/- 1,813,755) 110 | test bench::verify_fft_blake3_24 ... bench: 13,893,600 ns/iter (+/- 5,336,229) 111 | test bench::verify_fft_sha3_16 ... bench: 1,887,660 ns/iter (+/- 133,887) 112 | test bench::verify_fft_sha3_20 ... bench: 4,794,769 ns/iter (+/- 493,932) 113 | test bench::verify_fft_sha3_24 ... bench: 16,336,654 ns/iter (+/- 4,365,902) 114 | test bench::verify_sha3_16 ... bench: 1,186,813 ns/iter (+/- 503,931) 115 | test bench::verify_sha3_20 ... bench: 3,793,306 ns/iter (+/- 972,073) 116 | test bench::verify_sha3_24 ... bench: 14,571,840 ns/iter (+/- 4,107,752) 117 | 118 | test result: ok. 0 passed; 0 failed; 7 ignored; 54 measured; 0 filtered out; finished in 1689.62s 119 | 120 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210616_1core_127-255bit.txt: -------------------------------------------------------------------------------- 1 | Finished bench [optimized] target(s) in 0.04s 2 | Running unittests (target/release/deps/lcpc2d-b663df2a57044731) 3 | 4 | running 7 tests 5 | test tests::commit ... ignored 6 | test tests::end_to_end ... ignored 7 | test tests::end_to_end_two_proofs ... ignored 8 | test tests::eval_outer ... ignored 9 | test tests::log2 ... ignored 10 | test tests::merkleize ... ignored 11 | test tests::open_column ... ignored 12 | 13 | test result: ok. 0 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.00s 14 | 15 | Running unittests (target/release/deps/ligero_pc-3b42764d6f488188) 16 | 17 | running 21 tests 18 | test tests::end_to_end ... ignored 19 | test tests::end_to_end_two_proofs ... ignored 20 | test tests::get_dims ... ignored 21 | test bench::commit_Ft127_Blake2b_16 ... bench: 47,110,698 ns/iter (+/- 521,580) 22 | test bench::commit_Ft127_Blake2b_20 ... bench: 823,535,293 ns/iter (+/- 4,556,862) 23 | test bench::commit_Ft127_Blake2b_24 ... bench: 14,532,630,815 ns/iter (+/- 41,817,172) 24 | test bench::commit_Ft255_Blake2b_16 ... bench: 88,408,909 ns/iter (+/- 545,026) 25 | test bench::commit_Ft255_Blake2b_20 ... bench: 1,627,436,407 ns/iter (+/- 8,198,654) 26 | test bench::commit_Ft255_Blake2b_24 ... bench: 28,914,998,031 ns/iter (+/- 205,249,624) 27 | test bench::prove_Ft127_Blake2b_16 ... bench: 3,368,549 ns/iter (+/- 100,864) 28 | test bench::prove_Ft127_Blake2b_20 ... bench: 49,817,321 ns/iter (+/- 440,695) 29 | test bench::prove_Ft127_Blake2b_24 ... bench: 958,857,477 ns/iter (+/- 7,331,929) 30 | test bench::prove_Ft255_Blake2b_16 ... bench: 8,450,456 ns/iter (+/- 143,897) 31 | test bench::prove_Ft255_Blake2b_20 ... bench: 124,735,246 ns/iter (+/- 703,657) 32 | test bench::prove_Ft255_Blake2b_24 ... bench: 2,112,288,992 ns/iter (+/- 12,012,094) 33 | test bench::verify_Ft127_Blake2b_16 ... bench: 3,108,540 ns/iter (+/- 54,496) 34 | test bench::verify_Ft127_Blake2b_20 ... bench: 11,629,715 ns/iter (+/- 206,947) 35 | test bench::verify_Ft127_Blake2b_24 ... bench: 46,101,199 ns/iter (+/- 532,480) 36 | test bench::verify_Ft255_Blake2b_16 ... bench: 6,783,963 ns/iter (+/- 102,187) 37 | test bench::verify_Ft255_Blake2b_20 ... bench: 26,544,710 ns/iter (+/- 435,824) 38 | test bench::verify_Ft255_Blake2b_24 ... bench: 107,060,044 ns/iter (+/- 762,212) 39 | 40 | test result: ok. 0 passed; 0 failed; 3 ignored; 18 measured; 0 filtered out; finished in 15012.78s 41 | 42 | Running unittests (target/release/deps/sdig_pc-cf3876387f6b00ae) 43 | 44 | running 43 tests 45 | test tests::end_to_end_one_proof ... ignored 46 | test tests::end_to_end_two_proofs ... ignored 47 | test tests::fft_end_to_end_one_proof ... ignored 48 | test tests::fft_end_to_end_two_proofs ... ignored 49 | test tests::sprs_playground ... ignored 50 | test tests::test_matgen_check_seed ... ignored 51 | test tests::test_matgen_encode ... ignored 52 | test bench::commit_Ft127_Blake2b_16 ... bench: 35,719,816 ns/iter (+/- 1,969,189) 53 | test bench::commit_Ft127_Blake2b_20 ... bench: 567,159,313 ns/iter (+/- 2,741,278) 54 | test bench::commit_Ft127_Blake2b_24 ... bench: 9,030,005,457 ns/iter (+/- 34,232,005) 55 | test bench::commit_Ft255_Blake2b_16 ... bench: 78,615,628 ns/iter (+/- 530,232) 56 | test bench::commit_Ft255_Blake2b_20 ... bench: 1,321,069,598 ns/iter (+/- 6,553,078) 57 | test bench::commit_Ft255_Blake2b_24 ... bench: 21,455,086,529 ns/iter (+/- 301,188,632) 58 | test bench::commit_fft_Ft127_Blake2b_16 ... bench: 30,420,192 ns/iter (+/- 245,697) 59 | test bench::commit_fft_Ft127_Blake2b_20 ... bench: 539,971,013 ns/iter (+/- 2,322,888) 60 | test bench::commit_fft_Ft127_Blake2b_24 ... bench: 9,121,057,558 ns/iter (+/- 19,033,049) 61 | test bench::commit_fft_Ft255_Blake2b_16 ... bench: 67,841,431 ns/iter (+/- 480,238) 62 | test bench::commit_fft_Ft255_Blake2b_20 ... bench: 1,253,015,164 ns/iter (+/- 3,456,412) 63 | test bench::commit_fft_Ft255_Blake2b_24 ... bench: 21,256,956,137 ns/iter (+/- 161,127,774) 64 | test bench::prove_Ft127_Blake2b_16 ... bench: 3,305,437 ns/iter (+/- 65,448) 65 | test bench::prove_Ft127_Blake2b_20 ... bench: 49,366,275 ns/iter (+/- 399,474) 66 | test bench::prove_Ft127_Blake2b_24 ... bench: 914,972,043 ns/iter (+/- 10,937,232) 67 | test bench::prove_Ft255_Blake2b_16 ... bench: 7,998,331 ns/iter (+/- 106,817) 68 | test bench::prove_Ft255_Blake2b_20 ... bench: 125,597,206 ns/iter (+/- 797,536) 69 | test bench::prove_Ft255_Blake2b_24 ... bench: 2,085,644,624 ns/iter (+/- 13,552,044) 70 | test bench::prove_fft_Ft127_Blake2b_16 ... bench: 3,285,973 ns/iter (+/- 70,297) 71 | test bench::prove_fft_Ft127_Blake2b_20 ... bench: 49,541,777 ns/iter (+/- 439,804) 72 | test bench::prove_fft_Ft127_Blake2b_24 ... bench: 885,081,055 ns/iter (+/- 15,014,273) 73 | test bench::prove_fft_Ft255_Blake2b_16 ... bench: 8,313,892 ns/iter (+/- 113,260) 74 | test bench::prove_fft_Ft255_Blake2b_20 ... bench: 124,188,895 ns/iter (+/- 677,640) 75 | test bench::prove_fft_Ft255_Blake2b_24 ... bench: 2,082,511,212 ns/iter (+/- 16,592,947) 76 | test bench::verify_Ft127_Blake2b_16 ... bench: 3,349,085 ns/iter (+/- 104,837) 77 | test bench::verify_Ft127_Blake2b_20 ... bench: 12,987,384 ns/iter (+/- 401,347) 78 | test bench::verify_Ft127_Blake2b_24 ... bench: 49,765,431 ns/iter (+/- 671,522) 79 | test bench::verify_Ft255_Blake2b_16 ... bench: 7,748,796 ns/iter (+/- 276,463) 80 | test bench::verify_Ft255_Blake2b_20 ... bench: 30,219,870 ns/iter (+/- 448,995) 81 | test bench::verify_Ft255_Blake2b_24 ... bench: 118,230,514 ns/iter (+/- 781,086) 82 | test bench::verify_fft_Ft127_Blake2b_16 ... bench: 3,227,906 ns/iter (+/- 86,871) 83 | test bench::verify_fft_Ft127_Blake2b_20 ... bench: 12,274,050 ns/iter (+/- 357,845) 84 | test bench::verify_fft_Ft127_Blake2b_24 ... bench: 52,562,313 ns/iter (+/- 6,293,240) 85 | test bench::verify_fft_Ft255_Blake2b_16 ... bench: 7,211,659 ns/iter (+/- 171,693) 86 | test bench::verify_fft_Ft255_Blake2b_20 ... bench: 29,450,375 ns/iter (+/- 683,880) 87 | test bench::verify_fft_Ft255_Blake2b_24 ... bench: 124,098,535 ns/iter (+/- 12,129,706) 88 | 89 | test result: ok. 0 passed; 0 failed; 7 ignored; 36 measured; 0 filtered out; finished in 21702.12s 90 | 91 | Running unittests (target/release/deps/test_fields-a87f8429e4fdfa10) 92 | 93 | running 0 tests 94 | 95 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 96 | 97 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210616_32core_127-255bit.txt: -------------------------------------------------------------------------------- 1 | Updating crates.io index 2 | Downloading crates ... 3 | Downloaded paste v1.0.5 4 | Compiling paste v1.0.5 5 | Compiling test-fields v0.1.0 (/home/kwantam/git/github.com/lcpc/test-fields) 6 | Compiling lcpc2d v0.1.0 (/home/kwantam/git/github.com/lcpc/lcpc2d) 7 | Compiling sdig-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/sdig-pc) 8 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 9 | Finished bench [optimized] target(s) in 24.67s 10 | Running unittests (target/release/deps/lcpc2d-b663df2a57044731) 11 | 12 | running 7 tests 13 | test tests::commit ... ignored 14 | test tests::end_to_end ... ignored 15 | test tests::end_to_end_two_proofs ... ignored 16 | test tests::eval_outer ... ignored 17 | test tests::log2 ... ignored 18 | test tests::merkleize ... ignored 19 | test tests::open_column ... ignored 20 | 21 | test result: ok. 0 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.00s 22 | 23 | Running unittests (target/release/deps/ligero_pc-3b42764d6f488188) 24 | 25 | running 21 tests 26 | test tests::end_to_end ... ignored 27 | test tests::end_to_end_two_proofs ... ignored 28 | test tests::get_dims ... ignored 29 | test bench::commit_Ft127_Blake2b_16 ... bench: 16,600,990 ns/iter (+/- 2,878,704) 30 | test bench::commit_Ft127_Blake2b_20 ... bench: 128,112,292 ns/iter (+/- 8,188,157) 31 | test bench::commit_Ft127_Blake2b_24 ... bench: 1,630,135,414 ns/iter (+/- 32,647,328) 32 | test bench::commit_Ft255_Blake2b_16 ... bench: 20,635,748 ns/iter (+/- 3,129,681) 33 | test bench::commit_Ft255_Blake2b_20 ... bench: 196,554,467 ns/iter (+/- 9,651,190) 34 | test bench::commit_Ft255_Blake2b_24 ... bench: 2,669,809,695 ns/iter (+/- 72,998,096) 35 | test bench::prove_Ft127_Blake2b_16 ... bench: 1,895,085 ns/iter (+/- 205,748) 36 | test bench::prove_Ft127_Blake2b_20 ... bench: 7,306,041 ns/iter (+/- 376,819) 37 | test bench::prove_Ft127_Blake2b_24 ... bench: 89,929,167 ns/iter (+/- 1,695,286) 38 | test bench::prove_Ft255_Blake2b_16 ... bench: 3,877,661 ns/iter (+/- 464,621) 39 | test bench::prove_Ft255_Blake2b_20 ... bench: 13,576,977 ns/iter (+/- 802,437) 40 | test bench::prove_Ft255_Blake2b_24 ... bench: 157,553,293 ns/iter (+/- 6,118,472) 41 | test bench::verify_Ft127_Blake2b_16 ... bench: 2,302,357 ns/iter (+/- 74,207) 42 | test bench::verify_Ft127_Blake2b_20 ... bench: 4,596,000 ns/iter (+/- 340,588) 43 | test bench::verify_Ft127_Blake2b_24 ... bench: 10,950,512 ns/iter (+/- 863,512) 44 | test bench::verify_Ft255_Blake2b_16 ... bench: 2,695,979 ns/iter (+/- 176,880) 45 | test bench::verify_Ft255_Blake2b_20 ... bench: 5,863,708 ns/iter (+/- 486,196) 46 | test bench::verify_Ft255_Blake2b_24 ... bench: 16,354,918 ns/iter (+/- 1,910,728) 47 | 48 | test result: ok. 0 passed; 0 failed; 3 ignored; 18 measured; 0 filtered out; finished in 1539.76s 49 | 50 | Running unittests (target/release/deps/sdig_pc-cf3876387f6b00ae) 51 | 52 | running 43 tests 53 | test tests::end_to_end_one_proof ... ignored 54 | test tests::end_to_end_two_proofs ... ignored 55 | test tests::fft_end_to_end_one_proof ... ignored 56 | test tests::fft_end_to_end_two_proofs ... ignored 57 | test tests::sprs_playground ... ignored 58 | test tests::test_matgen_check_seed ... ignored 59 | test tests::test_matgen_encode ... ignored 60 | test bench::commit_Ft127_Blake2b_16 ... bench: 6,556,028 ns/iter (+/- 701,233) 61 | test bench::commit_Ft127_Blake2b_20 ... bench: 62,222,378 ns/iter (+/- 7,704,411) 62 | test bench::commit_Ft127_Blake2b_24 ... bench: 731,596,625 ns/iter (+/- 15,806,704) 63 | test bench::commit_Ft255_Blake2b_16 ... bench: 12,628,265 ns/iter (+/- 2,092,859) 64 | test bench::commit_Ft255_Blake2b_20 ... bench: 124,273,652 ns/iter (+/- 6,240,889) 65 | test bench::commit_Ft255_Blake2b_24 ... bench: 1,730,017,278 ns/iter (+/- 26,848,830) 66 | test bench::commit_fft_Ft127_Blake2b_16 ... bench: 8,067,021 ns/iter (+/- 901,423) 67 | test bench::commit_fft_Ft127_Blake2b_20 ... bench: 65,334,674 ns/iter (+/- 7,653,134) 68 | test bench::commit_fft_Ft127_Blake2b_24 ... bench: 739,048,944 ns/iter (+/- 9,582,995) 69 | test bench::commit_fft_Ft255_Blake2b_16 ... bench: 12,428,585 ns/iter (+/- 1,441,428) 70 | test bench::commit_fft_Ft255_Blake2b_20 ... bench: 123,150,815 ns/iter (+/- 5,665,504) 71 | test bench::commit_fft_Ft255_Blake2b_24 ... bench: 1,735,235,690 ns/iter (+/- 29,751,098) 72 | test bench::prove_Ft127_Blake2b_16 ... bench: 1,944,009 ns/iter (+/- 216,447) 73 | test bench::prove_Ft127_Blake2b_20 ... bench: 6,882,861 ns/iter (+/- 132,254) 74 | test bench::prove_Ft127_Blake2b_24 ... bench: 85,943,358 ns/iter (+/- 1,791,298) 75 | test bench::prove_Ft255_Blake2b_16 ... bench: 3,701,674 ns/iter (+/- 526,608) 76 | test bench::prove_Ft255_Blake2b_20 ... bench: 13,688,847 ns/iter (+/- 1,201,212) 77 | test bench::prove_Ft255_Blake2b_24 ... bench: 149,996,628 ns/iter (+/- 7,372,691) 78 | test bench::prove_fft_Ft127_Blake2b_16 ... bench: 1,845,323 ns/iter (+/- 236,111) 79 | test bench::prove_fft_Ft127_Blake2b_20 ... bench: 6,801,946 ns/iter (+/- 478,572) 80 | test bench::prove_fft_Ft127_Blake2b_24 ... bench: 86,581,161 ns/iter (+/- 2,074,939) 81 | test bench::prove_fft_Ft255_Blake2b_16 ... bench: 4,094,252 ns/iter (+/- 567,884) 82 | test bench::prove_fft_Ft255_Blake2b_20 ... bench: 13,288,261 ns/iter (+/- 337,113) 83 | test bench::prove_fft_Ft255_Blake2b_24 ... bench: 150,178,873 ns/iter (+/- 8,499,325) 84 | test bench::verify_Ft127_Blake2b_16 ... bench: 1,109,183 ns/iter (+/- 529,677) 85 | test bench::verify_Ft127_Blake2b_20 ... bench: 3,475,330 ns/iter (+/- 793,795) 86 | test bench::verify_Ft127_Blake2b_24 ... bench: 12,646,113 ns/iter (+/- 3,500,950) 87 | test bench::verify_Ft255_Blake2b_16 ... bench: 2,227,620 ns/iter (+/- 768,754) 88 | test bench::verify_Ft255_Blake2b_20 ... bench: 7,509,043 ns/iter (+/- 1,433,549) 89 | test bench::verify_Ft255_Blake2b_24 ... bench: 28,287,947 ns/iter (+/- 5,436,283) 90 | test bench::verify_fft_Ft127_Blake2b_16 ... bench: 1,810,729 ns/iter (+/- 147,162) 91 | test bench::verify_fft_Ft127_Blake2b_20 ... bench: 4,540,077 ns/iter (+/- 1,592,046) 92 | test bench::verify_fft_Ft127_Blake2b_24 ... bench: 14,121,705 ns/iter (+/- 4,503,385) 93 | test bench::verify_fft_Ft255_Blake2b_16 ... bench: 3,105,309 ns/iter (+/- 219,907) 94 | test bench::verify_fft_Ft255_Blake2b_20 ... bench: 8,985,088 ns/iter (+/- 3,256,436) 95 | test bench::verify_fft_Ft255_Blake2b_24 ... bench: 31,047,189 ns/iter (+/- 5,340,872) 96 | 97 | test result: ok. 0 passed; 0 failed; 7 ignored; 36 measured; 0 filtered out; finished in 1885.17s 98 | 99 | Running unittests (target/release/deps/test_fields-a87f8429e4fdfa10) 100 | 101 | running 0 tests 102 | 103 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 104 | 105 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210723_1core_127-255bit.txt: -------------------------------------------------------------------------------- 1 | Finished bench [optimized] target(s) in 0.03s 2 | Running unittests (target/release/deps/lcpc2d-b663df2a57044731) 3 | 4 | running 7 tests 5 | test tests::commit ... ignored 6 | test tests::end_to_end ... ignored 7 | test tests::end_to_end_two_proofs ... ignored 8 | test tests::eval_outer ... ignored 9 | test tests::log2 ... ignored 10 | test tests::merkleize ... ignored 11 | test tests::open_column ... ignored 12 | 13 | test result: ok. 0 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.00s 14 | 15 | Running unittests (target/release/deps/ligero_pc-3b42764d6f488188) 16 | 17 | running 21 tests 18 | test tests::end_to_end ... ignored 19 | test tests::end_to_end_two_proofs ... ignored 20 | test tests::get_dims ... ignored 21 | test bench::commit_Ft127_Blake2b_16 ... bench: 57,781,051 ns/iter (+/- 514,373) 22 | test bench::commit_Ft127_Blake2b_20 ... bench: 950,131,380 ns/iter (+/- 13,525,436) 23 | test bench::commit_Ft127_Blake2b_24 ... bench: 16,363,854,286 ns/iter (+/- 215,194,346) 24 | test bench::commit_Ft255_Blake2b_16 ... bench: 106,451,316 ns/iter (+/- 730,839) 25 | test bench::commit_Ft255_Blake2b_20 ... bench: 1,920,065,264 ns/iter (+/- 7,082,923) 26 | test bench::commit_Ft255_Blake2b_24 ... bench: 33,961,354,889 ns/iter (+/- 549,351,566) 27 | test bench::prove_Ft127_Blake2b_16 ... bench: 6,222,894 ns/iter (+/- 353,429) 28 | test bench::prove_Ft127_Blake2b_20 ... bench: 52,934,732 ns/iter (+/- 688,678) 29 | test bench::prove_Ft127_Blake2b_24 ... bench: 834,178,197 ns/iter (+/- 7,896,418) 30 | test bench::prove_Ft255_Blake2b_16 ... bench: 7,053,522 ns/iter (+/- 173,581) 31 | test bench::prove_Ft255_Blake2b_20 ... bench: 87,354,335 ns/iter (+/- 580,421) 32 | test bench::prove_Ft255_Blake2b_24 ... bench: 1,383,555,149 ns/iter (+/- 9,259,138) 33 | test bench::verify_Ft127_Blake2b_16 ... bench: 7,038,291 ns/iter (+/- 158,901) 34 | test bench::verify_Ft127_Blake2b_20 ... bench: 28,618,364 ns/iter (+/- 656,275) 35 | test bench::verify_Ft127_Blake2b_24 ... bench: 137,987,617 ns/iter (+/- 4,829,195) 36 | test bench::verify_Ft255_Blake2b_16 ... bench: 8,840,272 ns/iter (+/- 229,507) 37 | test bench::verify_Ft255_Blake2b_20 ... bench: 36,887,897 ns/iter (+/- 711,049) 38 | test bench::verify_Ft255_Blake2b_24 ... bench: 161,804,807 ns/iter (+/- 12,445,611) 39 | 40 | test result: ok. 0 passed; 0 failed; 3 ignored; 18 measured; 0 filtered out; finished in 17028.17s 41 | 42 | Running unittests (target/release/deps/sdig_pc-7fe71d4644d0c844) 43 | 44 | running 22 tests 45 | test tests::end_to_end_one_proof ... ignored 46 | test tests::end_to_end_two_proofs ... ignored 47 | test tests::sprs_playground ... ignored 48 | test tests::test_matgen_encode ... ignored 49 | test bench::commit_Ft127_Blake2b_16 ... bench: 36,064,273 ns/iter (+/- 532,895) 50 | test bench::commit_Ft127_Blake2b_20 ... bench: 390,433,092 ns/iter (+/- 16,374,057) 51 | test bench::commit_Ft127_Blake2b_24 ... bench: 5,881,895,360 ns/iter (+/- 94,461,665) 52 | test bench::commit_Ft255_Blake2b_16 ... bench: 64,167,899 ns/iter (+/- 381,869) 53 | test bench::commit_Ft255_Blake2b_20 ... bench: 923,117,649 ns/iter (+/- 5,755,222) 54 | test bench::commit_Ft255_Blake2b_24 ... bench: 13,444,141,592 ns/iter (+/- 206,058,545) 55 | test bench::prove_Ft127_Blake2b_16 ... bench: 21,589,323 ns/iter (+/- 401,670) 56 | test bench::prove_Ft127_Blake2b_20 ... bench: 140,948,227 ns/iter (+/- 306,867) 57 | test bench::prove_Ft127_Blake2b_24 ... bench: 922,391,445 ns/iter (+/- 8,259,705) 58 | test bench::prove_Ft255_Blake2b_16 ... bench: 23,891,753 ns/iter (+/- 204,164) 59 | test bench::prove_Ft255_Blake2b_20 ... bench: 163,729,170 ns/iter (+/- 8,620,125) 60 | test bench::prove_Ft255_Blake2b_24 ... bench: 1,430,344,160 ns/iter (+/- 15,053,864) 61 | test bench::verify_Ft127_Blake2b_16 ... bench: 81,402,889 ns/iter (+/- 330,529) 62 | test bench::verify_Ft127_Blake2b_20 ... bench: 130,826,978 ns/iter (+/- 26,306,628) 63 | test bench::verify_Ft127_Blake2b_24 ... bench: 361,199,991 ns/iter (+/- 18,486,813) 64 | test bench::verify_Ft255_Blake2b_16 ... bench: 88,172,128 ns/iter (+/- 264,645) 65 | test bench::verify_Ft255_Blake2b_20 ... bench: 209,203,714 ns/iter (+/- 19,434,439) 66 | test bench::verify_Ft255_Blake2b_24 ... bench: 417,428,283 ns/iter (+/- 24,208,560) 67 | 68 | test result: ok. 0 passed; 0 failed; 4 ignored; 18 measured; 0 filtered out; finished in 7484.39s 69 | 70 | Running unittests (target/release/deps/test_fields-a87f8429e4fdfa10) 71 | 72 | running 0 tests 73 | 74 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 75 | 76 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210723_32core_127-255bit.txt: -------------------------------------------------------------------------------- 1 | Finished bench [optimized] target(s) in 0.03s 2 | Running unittests (target/release/deps/lcpc2d-b663df2a57044731) 3 | 4 | running 7 tests 5 | test tests::commit ... ignored 6 | test tests::end_to_end ... ignored 7 | test tests::end_to_end_two_proofs ... ignored 8 | test tests::eval_outer ... ignored 9 | test tests::log2 ... ignored 10 | test tests::merkleize ... ignored 11 | test tests::open_column ... ignored 12 | 13 | test result: ok. 0 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.00s 14 | 15 | Running unittests (target/release/deps/ligero_pc-3b42764d6f488188) 16 | 17 | running 21 tests 18 | test tests::end_to_end ... ignored 19 | test tests::end_to_end_two_proofs ... ignored 20 | test tests::get_dims ... ignored 21 | test bench::commit_Ft127_Blake2b_16 ... bench: 25,851,868 ns/iter (+/- 8,715,937) 22 | test bench::commit_Ft127_Blake2b_20 ... bench: 161,842,326 ns/iter (+/- 19,613,355) 23 | test bench::commit_Ft127_Blake2b_24 ... bench: 2,030,389,837 ns/iter (+/- 35,300,622) 24 | test bench::commit_Ft255_Blake2b_16 ... bench: 32,378,692 ns/iter (+/- 5,744,767) 25 | test bench::commit_Ft255_Blake2b_20 ... bench: 243,553,935 ns/iter (+/- 22,517,814) 26 | test bench::commit_Ft255_Blake2b_24 ... bench: 3,699,203,785 ns/iter (+/- 91,409,233) 27 | test bench::prove_Ft127_Blake2b_16 ... bench: 2,239,500 ns/iter (+/- 410,770) 28 | test bench::prove_Ft127_Blake2b_20 ... bench: 10,038,318 ns/iter (+/- 1,075,678) 29 | test bench::prove_Ft127_Blake2b_24 ... bench: 78,016,658 ns/iter (+/- 1,756,669) 30 | test bench::prove_Ft255_Blake2b_16 ... bench: 3,390,944 ns/iter (+/- 1,139,735) 31 | test bench::prove_Ft255_Blake2b_20 ... bench: 13,315,440 ns/iter (+/- 1,556,541) 32 | test bench::prove_Ft255_Blake2b_24 ... bench: 99,492,699 ns/iter (+/- 6,756,464) 33 | test bench::verify_Ft127_Blake2b_16 ... bench: 5,683,725 ns/iter (+/- 175,898) 34 | test bench::verify_Ft127_Blake2b_20 ... bench: 13,317,466 ns/iter (+/- 5,488,989) 35 | test bench::verify_Ft127_Blake2b_24 ... bench: 43,623,645 ns/iter (+/- 12,077,961) 36 | test bench::verify_Ft255_Blake2b_16 ... bench: 4,515,914 ns/iter (+/- 630,796) 37 | test bench::verify_Ft255_Blake2b_20 ... bench: 12,881,017 ns/iter (+/- 2,669,030) 38 | test bench::verify_Ft255_Blake2b_24 ... bench: 40,409,763 ns/iter (+/- 5,317,172) 39 | 40 | test result: ok. 0 passed; 0 failed; 3 ignored; 18 measured; 0 filtered out; finished in 1993.29s 41 | 42 | Running unittests (target/release/deps/sdig_pc-7fe71d4644d0c844) 43 | 44 | running 22 tests 45 | test tests::end_to_end_one_proof ... ignored 46 | test tests::end_to_end_two_proofs ... ignored 47 | test tests::sprs_playground ... ignored 48 | test tests::test_matgen_encode ... ignored 49 | test bench::commit_Ft127_Blake2b_16 ... bench: 14,295,883 ns/iter (+/- 2,413,104) 50 | test bench::commit_Ft127_Blake2b_20 ... bench: 79,242,755 ns/iter (+/- 14,802,699) 51 | test bench::commit_Ft127_Blake2b_24 ... bench: 703,527,427 ns/iter (+/- 45,381,716) 52 | test bench::commit_Ft255_Blake2b_16 ... bench: 25,046,785 ns/iter (+/- 4,216,835) 53 | test bench::commit_Ft255_Blake2b_20 ... bench: 164,930,636 ns/iter (+/- 21,763,186) 54 | test bench::commit_Ft255_Blake2b_24 ... bench: 1,508,201,628 ns/iter (+/- 92,070,456) 55 | test bench::prove_Ft127_Blake2b_16 ... bench: 11,063,228 ns/iter (+/- 883,992) 56 | test bench::prove_Ft127_Blake2b_20 ... bench: 34,035,539 ns/iter (+/- 1,903,611) 57 | test bench::prove_Ft127_Blake2b_24 ... bench: 164,027,619 ns/iter (+/- 16,629,748) 58 | test bench::prove_Ft255_Blake2b_16 ... bench: 9,340,008 ns/iter (+/- 754,132) 59 | test bench::prove_Ft255_Blake2b_20 ... bench: 48,049,373 ns/iter (+/- 1,851,112) 60 | test bench::prove_Ft255_Blake2b_24 ... bench: 179,079,293 ns/iter (+/- 15,986,526) 61 | test bench::verify_Ft127_Blake2b_16 ... bench: 21,916,632 ns/iter (+/- 545,526) 62 | test bench::verify_Ft127_Blake2b_20 ... bench: 77,294,905 ns/iter (+/- 1,601,583) 63 | test bench::verify_Ft127_Blake2b_24 ... bench: 298,521,535 ns/iter (+/- 3,661,591) 64 | test bench::verify_Ft255_Blake2b_16 ... bench: 22,690,127 ns/iter (+/- 471,582) 65 | test bench::verify_Ft255_Blake2b_20 ... bench: 153,286,319 ns/iter (+/- 1,804,136) 66 | test bench::verify_Ft255_Blake2b_24 ... bench: 309,024,650 ns/iter (+/- 4,230,409) 67 | 68 | test result: ok. 0 passed; 0 failed; 4 ignored; 18 measured; 0 filtered out; finished in 1169.60s 69 | 70 | Running unittests (target/release/deps/test_fields-a87f8429e4fdfa10) 71 | 72 | running 0 tests 73 | 74 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 75 | 76 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210728_32core_255bit_ligero-29.txt: -------------------------------------------------------------------------------- 1 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 2 | Finished bench [optimized] target(s) in 4.56s 3 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-15fa3e1c702b20a7) 4 | 5 | running 1 test 6 | ................................................................ 7 | test bench::commit_isz_Ft255_Blake2b_29 ... bench: 44,683,695,382 ns/iter (+/- 2,893,870,062) 8 | 9 | test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 32 filtered out; finished in 13512.69s 10 | 11 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210728_32core_255bit_ligero-hirate.txt: -------------------------------------------------------------------------------- 1 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 2 | Finished bench [optimized] target(s) in 4.51s 3 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-15fa3e1c702b20a7) 4 | 5 | running 4 tests 6 | ................................................................ 7 | test bench::commit_isz_Ft255_Blake2b_16 ... bench: 13,022,604 ns/iter (+/- 1,632,479) 8 | ................................................................ 9 | test bench::commit_isz_Ft255_Blake2b_20 ... bench: 107,622,110 ns/iter (+/- 12,472,085) 10 | ................................................................ 11 | test bench::commit_isz_Ft255_Blake2b_24 ... bench: 1,290,029,378 ns/iter (+/- 59,440,365) 12 | ................................................................ 13 | test bench::commit_isz_Ft255_Blake2b_28 ... bench: 22,811,978,812 ns/iter (+/- 862,024,791) 14 | 15 | test result: ok. 0 passed; 0 failed; 0 ignored; 4 measured; 28 filtered out; finished in 7315.78s 16 | 17 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210728_32core_255bit_sdig-28.txt: -------------------------------------------------------------------------------- 1 | Compiling test-fields v0.1.0 (/home/kwantam/git/github.com/lcpc/test-fields) 2 | Compiling sdig-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/sdig-pc) 3 | Finished bench [optimized] target(s) in 19.33s 4 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/sdig_pc-2d58c11272a3e580) 5 | 6 | running 1 test 7 | ................................................................ 8 | test bench::commit_Ft255_Blake2b_28 ... bench: 34,658,886,997 ns/iter (+/- 1,768,134,365) 9 | 10 | test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 23 filtered out; finished in 10859.08s 11 | 12 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210728_32core_255bit_sdig-29.txt: -------------------------------------------------------------------------------- 1 | Compiling sdig-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/sdig-pc) 2 | Finished bench [optimized] target(s) in 4.03s 3 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/sdig_pc-2d58c11272a3e580) 4 | 5 | running 1 test 6 | ................................................................ 7 | test bench::commit_Ft255_Blake2b_29 ... bench: 60,984,943,956 ns/iter (+/- 2,041,717,990) 8 | 9 | test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 24 filtered out; finished in 18429.69s 10 | 11 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210730_1core_255bit_sdig-ligero.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.05s 2 | Running unittests (target/release/deps/lcpc2d-9abad97f6a40fbce) 3 | 4 | running 0 tests 5 | 6 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 0.00s 7 | 8 | Running unittests (target/release/deps/ligero_pc-e1db252e2c439818) 9 | 10 | running 1 test 11 | ................................................................ 12 | 9: 1553087 49 13 | ................................................................ 14 | 11: 4893193 152 15 | ................................................................ 16 | 13: 6846478 22 17 | ................................................................ 18 | 15: 20783628 134 19 | ................................................................ 20 | 17: 74355898 16 21 | ................................................................ 22 | 19: 285808113 5 23 | ................................................................ 24 | 21: 1124843724 94 25 | ................................................................ 26 | test tests::rough_bench has been running for over 60 seconds 27 | 23: 4565809421 61 28 | ................................................................ 29 | 25: 19198538220 29 30 | ................................................................ 31 | 27: 87138177347 206 32 | ................................................................ 33 | 29: 387917568564 235 34 | test tests::rough_bench ... ok 35 | 36 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 5030.32s 37 | 38 | Running unittests (target/release/deps/sdig_pc-cd89259cca859c12) 39 | 40 | running 1 test 41 | ................................................................ 42 | 9: 3011489 60 43 | ................................................................ 44 | 11: 11085282 206 45 | ................................................................ 46 | 13: 14049868 86 47 | ................................................................ 48 | 15: 35754763 205 49 | ................................................................ 50 | 17: 116467632 82 51 | ................................................................ 52 | 19: 463558471 69 53 | ................................................................ 54 | 21: 1748667535 43 55 | ................................................................ 56 | test tests::rough_bench has been running for over 60 seconds 57 | 23: 6766206225 219 58 | ................................................................ 59 | 25: 26171285406 16 60 | ................................................................ 61 | 27: 128087048658 87 62 | ................................................................ 63 | 29: 525070990419 233 64 | test tests::rough_bench ... ok 65 | 66 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 6915.33s 67 | 68 | Running unittests (target/release/deps/test_fields-9d7d8ccc4d62608c) 69 | 70 | running 0 tests 71 | 72 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 73 | 74 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210730_1core_255bit_sdig-ligero_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.07s 2 | Running unittests (target/release/deps/lcpc2d-9abad97f6a40fbce) 3 | 4 | running 0 tests 5 | 6 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 0.00s 7 | 8 | Running unittests (target/release/deps/ligero_pc-e1db252e2c439818) 9 | 10 | running 1 test 11 | ................................................................ 12 | 13: 26908063 31820077 7140296 227 13 | ................................................................ 14 | 15: 35870631 41352586 8355256 123 15 | ................................................................ 16 | 17: 72516677 59363438 10277224 91 17 | ................................................................ 18 | 19: 135631552 115485884 13613272 155 19 | ................................................................ 20 | 21: 266759788 193285395 19777544 179 21 | ................................................................ 22 | 23: 789367152 330882066 31823928 208 23 | ................................................................ 24 | test tests::prove_verify_size_bench has been running for over 60 seconds 25 | 25: 2773759748 587525294 55408744 60 26 | ................................................................ 27 | 27: 10617360991 1130671411 101844760 47 28 | ................................................................ 29 | 29: 44783897464 2227714442 194434696 78 30 | test tests::prove_verify_size_bench ... ok 31 | 32 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 1239.41s 33 | 34 | Running unittests (target/release/deps/sdig_pc-cd89259cca859c12) 35 | 36 | running 1 test 37 | ................................................................ 38 | 13: 26658974 38231545 7144704 184 39 | ................................................................ 40 | 15: 35671499 55079185 8276488 208 41 | ................................................................ 42 | 17: 61873588 90348046 10065424 208 43 | ................................................................ 44 | 19: 157842898 171585725 13836960 31 45 | ................................................................ 46 | 21: 279275600 271914550 19973192 82 47 | ................................................................ 48 | 23: 815697430 503222670 31770960 32 49 | ................................................................ 50 | test tests::prove_verify_size_bench has been running for over 60 seconds 51 | 25: 2773450849 578271369 54345328 15 52 | ................................................................ 53 | 27: 10821144176 2223451149 100447872 157 54 | ................................................................ 55 | 29: 44488456985 2547884049 190745600 118 56 | test tests::prove_verify_size_bench ... ok 57 | 58 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 1426.63s 59 | 60 | Running unittests (target/release/deps/test_fields-9d7d8ccc4d62608c) 61 | 62 | running 0 tests 63 | 64 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 65 | 66 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210730_32core_255bit_sdig-ligero.txt: -------------------------------------------------------------------------------- 1 | Compiling fffft v0.4.0 2 | Compiling test-fields v0.1.0 (/home/kwantam/git/github.com/lcpc/test-fields) 3 | Compiling sdig-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/sdig-pc) 4 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 5 | Compiling lcpc2d v0.1.0 (/home/kwantam/git/github.com/lcpc/lcpc2d) 6 | Finished release [optimized] target(s) in 13.89s 7 | Running unittests (target/release/deps/lcpc2d-9abad97f6a40fbce) 8 | 9 | running 0 tests 10 | 11 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 0.00s 12 | 13 | Running unittests (target/release/deps/ligero_pc-e1db252e2c439818) 14 | 15 | running 1 test 16 | ................................................................ 17 | 9: 2912470 3 18 | ................................................................ 19 | 11: 2287217 111 20 | ................................................................ 21 | 13: 3861011 248 22 | ................................................................ 23 | 15: 8695471 167 24 | ................................................................ 25 | 17: 23108308 145 26 | ................................................................ 27 | 19: 60938802 88 28 | ................................................................ 29 | 21: 162414808 12 30 | ................................................................ 31 | 23: 642395853 185 32 | ................................................................ 33 | 25: 2505004477 183 34 | ................................................................ 35 | test tests::rough_bench has been running for over 60 seconds 36 | 27: 10700575711 189 37 | ................................................................ 38 | 29: 46589241333 158 39 | test tests::rough_bench ... ok 40 | 41 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 634.08s 42 | 43 | Running unittests (target/release/deps/sdig_pc-cd89259cca859c12) 44 | 45 | running 1 test 46 | ................................................................ 47 | 9: 3086552 114 48 | ................................................................ 49 | 11: 5655347 62 50 | ................................................................ 51 | 13: 7353066 191 52 | ................................................................ 53 | 15: 17231114 39 54 | ................................................................ 55 | 17: 40136193 46 56 | ................................................................ 57 | 19: 118996126 26 58 | ................................................................ 59 | 21: 281416821 194 60 | ................................................................ 61 | 23: 959294047 76 62 | ................................................................ 63 | 25: 3185667041 49 64 | ................................................................ 65 | test tests::rough_bench has been running for over 60 seconds 66 | 27: 16845081170 2 67 | ................................................................ 68 | 29: 65208710261 4 69 | test tests::rough_bench ... ok 70 | 71 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 897.30s 72 | 73 | Running unittests (target/release/deps/test_fields-9d7d8ccc4d62608c) 74 | 75 | running 0 tests 76 | 77 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 78 | 79 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210730_32core_255bit_sdig-ligero_pvs.txt: -------------------------------------------------------------------------------- 1 | Compiling sdig-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/sdig-pc) 2 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 3 | Finished release [optimized] target(s) in 3.90s 4 | Running unittests (target/release/deps/lcpc2d-9abad97f6a40fbce) 5 | 6 | running 0 tests 7 | 8 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 0.00s 9 | 10 | Running unittests (target/release/deps/ligero_pc-e1db252e2c439818) 11 | 12 | running 1 test 13 | ................................................................ 14 | 13: 23802218 8912319 7140296 34 15 | ................................................................ 16 | 15: 22927997 11482317 8355256 95 17 | ................................................................ 18 | 17: 36019535 18351928 10277224 24 19 | ................................................................ 20 | 19: 54610828 31829151 13613272 214 21 | ................................................................ 22 | 21: 91137008 48451167 19777544 66 23 | ................................................................ 24 | 23: 161904455 88749381 31823928 79 25 | ................................................................ 26 | 25: 339773403 175715360 55408744 86 27 | ................................................................ 28 | 27: 944876061 309504870 101844760 32 29 | ...............................................test tests::prove_verify_size_bench has been running for over 60 seconds 30 | ................. 31 | 29: 3280366055 616406598 194434696 241 32 | test tests::prove_verify_size_bench ... ok 33 | 34 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 151.72s 35 | 36 | Running unittests (target/release/deps/sdig_pc-cd89259cca859c12) 37 | 38 | running 1 test 39 | ................................................................ 40 | 13: 25534064 10010110 7144704 254 41 | ................................................................ 42 | 15: 31464423 16790609 8276488 255 43 | ................................................................ 44 | 17: 40578748 31052477 10065424 213 45 | ................................................................ 46 | 19: 66189326 114561974 13836960 161 47 | ................................................................ 48 | 21: 109899954 221846089 19973192 101 49 | ................................................................ 50 | 23: 201346128 437153755 31770960 12 51 | ................................................................ 52 | 25: 323073910 445729387 54345328 71 53 | ................................................................ 54 | test tests::prove_verify_size_bench has been running for over 60 seconds 55 | 27: 1140559503 2118506653 100447872 30 56 | ................................................................ 57 | 29: 3221429026 2128598353 190745600 70 58 | test tests::prove_verify_size_bench ... ok 59 | 60 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 231.78s 61 | 62 | Running unittests (target/release/deps/test_fields-9d7d8ccc4d62608c) 63 | 64 | running 0 tests 65 | 66 | test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 67 | 68 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210801_1core_255bit_ligero_1:4.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.12s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 17137754 105 7 | ................................................................ 8 | 15: 57388723 156 9 | ................................................................ 10 | 17: 231709636 87 11 | ................................................................ 12 | 19: 987100403 27 13 | ................................................................ 14 | 21: 4132500066 152 15 | ................................................................ 16 | test tests::rough_bench has been running for over 60 seconds 17 | 23: 17262423026 204 18 | ................................................................ 19 | 25: 73885443724 28 20 | ................................................................ 21 | 27: 329025712393 21 22 | ................................................................ 23 | 29: 1441811061880 90 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 18700.87s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210801_1core_255bit_ligero_1:4_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.02s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 2839126 6881522 280280 82 7 | ................................................................ 8 | 15: 5115475 10466414 407808 102 9 | ................................................................ 10 | 17: 14604677 17535358 649256 176 11 | ................................................................ 12 | 19: 48219740 35178317 1118544 231 13 | ................................................................ 14 | 21: 175519538 73189110 2043512 248 15 | ................................................................ 16 | 23: 667765856 154211155 3879840 47 17 | ................................................................ 18 | test tests::prove_verify_size_bench has been running for over 60 seconds 19 | 25: 2793771754 319589815 7538888 224 20 | ................................................................ 21 | 27: 11232153429 715502449 14843376 89 22 | ................................................................ 23 | 29: 48858547353 1494049519 29438744 207 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 2639.96s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210801_32core_255bit_ligero_1:4.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.02s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 9185978 129 7 | ................................................................ 8 | 15: 19902235 167 9 | ................................................................ 10 | 17: 48691178 2 11 | ................................................................ 12 | 19: 135276251 69 13 | ................................................................ 14 | 21: 485846795 246 15 | ................................................................ 16 | 23: 1921209544 147 17 | ................................................................ 18 | test tests::rough_bench has been running for over 60 seconds 19 | 25: 7834409294 183 20 | ................................................................ 21 | 27: 34509350752 166 22 | ................................................................ 23 | 29: 124063234130 194 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 1717.46s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210801_32core_255bit_ligero_1:4_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.12s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 1751012 3999812 280280 126 7 | ................................................................ 8 | 15: 2428880 5574580 407808 205 9 | ................................................................ 10 | 17: 4120797 8361302 649256 129 11 | ................................................................ 12 | 19: 8837606 13746918 1118544 11 13 | ................................................................ 14 | 21: 23697011 26017375 2043512 232 15 | ................................................................ 16 | 23: 61019382 39713765 3879840 26 17 | ................................................................ 18 | 25: 208019541 73377490 7538888 190 19 | ................................................................ 20 | test tests::prove_verify_size_bench has been running for over 60 seconds 21 | 27: 726692417 140380638 14843376 244 22 | ................................................................ 23 | 29: 2904124157 302148973 29438744 231 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 260.86s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210804_1core_255bit_ligero_1:2.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.08s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 9654878 184 7 | ................................................................ 8 | 15: 27510913 190 9 | ................................................................ 10 | 17: 111437159 24 11 | ................................................................ 12 | 19: 471128774 82 13 | ................................................................ 14 | 21: 1984667498 2 15 | ................................................................ 16 | test tests::rough_bench has been running for over 60 seconds 17 | 23: 8257670208 89 18 | ................................................................ 19 | 25: 34843090710 130 20 | ................................................................ 21 | 27: 148831900317 7 22 | ................................................................ 23 | 29: 684248603923 147 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 8814.82s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210804_1core_255bit_ligero_1:2_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.04s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 1820877 2861885 394352 247 7 | ................................................................ 8 | 15: 6420141 9410552 561240 158 9 | ................................................................ 10 | 17: 14966304 11665568 872768 149 11 | ................................................................ 12 | 19: 49628084 22912662 1473576 155 13 | ................................................................ 14 | 21: 174287055 52115218 2652944 244 15 | ................................................................ 16 | 23: 674645138 113955968 4989432 137 17 | ................................................................ 18 | test tests::prove_verify_size_bench has been running for over 60 seconds 19 | 25: 2763015966 212289306 9640160 224 20 | ................................................................ 21 | 27: 11037939378 406218410 18919368 130 22 | ................................................................ 23 | 29: 47603811309 795650761 37455536 247 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 1581.09s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210804_32core_255bit_ligero_1:2.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.02s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 6405615 2 7 | ................................................................ 8 | 15: 13075800 47 9 | ................................................................ 10 | 17: 26976827 70 11 | ................................................................ 12 | 19: 84528051 98 13 | ................................................................ 14 | 21: 257670467 8 15 | ................................................................ 16 | 23: 959522532 189 17 | ................................................................ 18 | 25: 3928887968 167 19 | ................................................................ 20 | test tests::rough_bench has been running for over 60 seconds 21 | 27: 16085662342 184 22 | ................................................................ 23 | 29: 65427279052 247 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 895.20s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210804_32core_255bit_ligero_1:2_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.05s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-89752d55499b3636) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 2202006 3202015 394352 139 7 | ................................................................ 8 | 15: 2870635 4329254 561240 26 9 | ................................................................ 10 | 17: 4920457 7221831 872768 6 11 | ................................................................ 12 | 19: 10718935 10460972 1473576 242 13 | ................................................................ 14 | 21: 24120795 24018736 2652944 213 15 | ................................................................ 16 | 23: 62266605 30258069 4989432 41 17 | ................................................................ 18 | 25: 229406010 58971989 9640160 202 19 | ................................................................ 20 | 27: 737074724 103607546 18919368 64 21 | ........................................................test tests::prove_verify_size_bench has been running for over 60 seconds 22 | ........ 23 | 29: 2909751468 201550672 37455536 51 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 162.05s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_ligero_dfl.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-238682424c950475) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 15028905 80 7 | ................................................................ 8 | 15: 58395665 191 9 | ................................................................ 10 | 17: 244040225 142 11 | ................................................................ 12 | 19: 1039924341 32 13 | ................................................................ 14 | 21: 4464674408 150 15 | ................................................................ 16 | test tests::rough_bench has been running for over 60 seconds 17 | 23: 19657523557 118 18 | ................................................................ 19 | 25: 83905357941 171 20 | ................................................................ 21 | 27: 355871106371 132 22 | ................................................................ 23 | 29: 1592538714620 4 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 20604.64s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_ligero_dfl_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-238682424c950475) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 1929944 4279062 207704 39 7 | ................................................................ 8 | 15: 4481774 8396864 329184 157 9 | ................................................................ 10 | 17: 14410231 17493724 564584 112 11 | ................................................................ 12 | 19: 51979020 35972687 1027824 139 13 | ................................................................ 14 | 21: 209069454 77382818 1946744 38 15 | ................................................................ 16 | 23: 793259656 159652722 3777024 173 17 | ................................................................ 18 | test tests::prove_verify_size_bench has been running for over 60 seconds 19 | 25: 3134106228 338492204 7430024 5 20 | ................................................................ 21 | 27: 12509832636 713627321 14728464 219 22 | ................................................................ 23 | 29: 51618352703 1574296918 29317784 116 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 2854.25s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_ligero_hlf.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-c5349860a49ae5c5) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 7423998 149 7 | ................................................................ 8 | 15: 28008289 31 9 | ................................................................ 10 | 17: 115487928 228 11 | ................................................................ 12 | 19: 492475430 32 13 | ................................................................ 14 | 21: 2082364787 148 15 | ................................................................ 16 | test tests::rough_bench has been running for over 60 seconds 17 | 23: 8753647566 23 18 | ................................................................ 19 | 25: 39897854557 95 20 | ................................................................ 21 | 27: 168591075019 224 22 | ................................................................ 23 | 29: 716551102185 198 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 9391.41s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_ligero_hlf_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-c5349860a49ae5c5) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 2075826 2985683 285584 7 7 | ................................................................ 8 | 15: 4736777 5534254 442584 93 9 | ................................................................ 10 | 17: 14179033 10620504 744224 66 11 | ................................................................ 12 | 19: 50987077 20754145 1335144 54 13 | ................................................................ 14 | 21: 213639418 44029332 2504624 215 15 | ................................................................ 16 | 23: 799193544 92985667 4831224 235 17 | ................................................................ 18 | test tests::prove_verify_size_bench has been running for over 60 seconds 19 | 25: 3113180060 195535425 9472064 142 20 | ................................................................ 21 | 27: 12429247186 401850603 18741384 62 22 | ................................................................ 23 | 29: 50017153159 845617828 37267664 7 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 1702.03s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_ligero_isz.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-7f28e79553183d13) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 7252575 153 7 | ................................................................ 8 | 15: 21742386 57 9 | ................................................................ 10 | 17: 76145602 106 11 | ................................................................ 12 | 19: 293327861 126 13 | ................................................................ 14 | 21: 1228096995 34 15 | ................................................................ 16 | test tests::rough_bench has been running for over 60 seconds 17 | 23: 5189188817 132 18 | ................................................................ 19 | 25: 22101183529 149 20 | ................................................................ 21 | 27: 92579340808 74 22 | ................................................................ 23 | 29: 405064604087 104 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 5292.15s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_ligero_isz_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-7f28e79553183d13) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 18884177 21376731 4325992 151 7 | ................................................................ 8 | 15: 27403938 30230714 5296520 114 9 | ................................................................ 10 | 17: 50134052 46248105 6962536 21 11 | ................................................................ 12 | 19: 102384023 76957074 10019528 52 13 | ................................................................ 14 | 21: 291412813 143217858 15858472 190 15 | ................................................................ 16 | 23: 911366071 279924466 27481352 242 17 | ................................................................ 18 | test tests::prove_verify_size_bench has been running for over 60 seconds 19 | 25: 3251518541 558667814 50452008 108 20 | ................................................................ 21 | 27: 12296677367 1114360508 95898248 57 22 | ................................................................ 23 | 29: 48138789862 2341033588 186735784 122 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 1308.23s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_sdig.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/sdig_pc-f8bcf0a74b8123d1) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 12625119 128 7 | ................................................................ 8 | 15: 38068860 193 9 | ................................................................ 10 | 17: 123405748 26 11 | ................................................................ 12 | 19: 490796366 59 13 | ................................................................ 14 | 21: 2137608292 62 15 | ................................................................ 16 | test tests::rough_bench has been running for over 60 seconds 17 | 23: 8914967577 222 18 | ................................................................ 19 | 25: 35964173221 63 20 | ................................................................ 21 | 27: 150060168691 182 22 | ................................................................ 23 | 29: 604519985540 68 24 | test tests::rough_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 8052.13s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_1c_255bit_sdig_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/sdig_pc-f8bcf0a74b8123d1) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 21866211 25139121 4402016 71 7 | ................................................................ 8 | 15: 28102189 34966922 5322824 246 9 | ................................................................ 10 | 17: 48453986 55706503 6900784 8 11 | ................................................................ 12 | 19: 112511266 147736551 10250368 253 13 | ................................................................ 14 | 21: 271494741 297821604 16175624 78 15 | ................................................................ 16 | 23: 935024314 612572693 27762416 166 17 | ................................................................ 18 | test tests::prove_verify_size_bench has been running for over 60 seconds 19 | 25: 3210498011 702527490 50336784 157 20 | ................................................................ 21 | 27: 12982826342 2555359368 96017376 199 22 | ................................................................ 23 | 29: 48596141833 2958785570 186315104 233 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 1618.42s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_ligero_dfl.txt: -------------------------------------------------------------------------------- 1 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 2 | Finished release [optimized] target(s) in 2.69s 3 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-238682424c950475) 4 | 5 | running 1 test 6 | ................................................................ 7 | 13: 14895879 85 8 | ................................................................ 9 | 15: 33936108 11 10 | ................................................................ 11 | 17: 94885740 12 12 | ................................................................ 13 | 19: 279961606 173 14 | ................................................................ 15 | 21: 645653947 143 16 | ................................................................ 17 | 23: 1742358985 242 18 | ................................................................ 19 | test tests::rough_bench has been running for over 60 seconds 20 | 25: 5728518198 143 21 | ................................................................ 22 | 27: 21579388115 111 23 | ................................................................ 24 | 29: 94605522744 100 25 | test tests::rough_bench ... ok 26 | 27 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 1274.23s 28 | 29 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_ligero_dfl_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-238682424c950475) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 3761420 6162445 207704 181 7 | ................................................................ 8 | 15: 4092923 8554531 329184 192 9 | ................................................................ 10 | 17: 5881592 12803746 564584 222 11 | ................................................................ 12 | 19: 8933065 18227584 1027824 85 13 | ................................................................ 14 | 21: 18676769 27336201 1946744 126 15 | ................................................................ 16 | 23: 48901571 43107599 3777024 155 17 | ................................................................ 18 | 25: 139549886 75178940 7430024 119 19 | ................................................................ 20 | 27: 420705780 136498126 14728464 247 21 | ...............................................test tests::prove_verify_size_bench has been running for over 60 seconds 22 | ................. 23 | 29: 1513225373 278423508 29317784 220 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 180.20s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_ligero_hlf.txt: -------------------------------------------------------------------------------- 1 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 2 | Finished release [optimized] target(s) in 2.73s 3 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-c5349860a49ae5c5) 4 | 5 | running 1 test 6 | ................................................................ 7 | 13: 9205456 248 8 | ................................................................ 9 | 15: 21882455 36 10 | ................................................................ 11 | 17: 62399046 60 12 | ................................................................ 13 | 19: 174441850 151 14 | ................................................................ 15 | 21: 367245433 221 16 | ................................................................ 17 | 23: 1042569302 169 18 | ................................................................ 19 | 25: 3212414799 75 20 | ................................................................ 21 | test tests::rough_bench has been running for over 60 seconds 22 | 27: 11502276777 105 23 | ................................................................ 24 | 29: 45532418646 211 25 | test tests::rough_bench ... ok 26 | 27 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 646.37s 28 | 29 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_ligero_hlf_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-c5349860a49ae5c5) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 4521849 11820188 285584 172 7 | ................................................................ 8 | 15: 4578159 6497610 442584 110 9 | ................................................................ 10 | 17: 5971775 9595894 744224 219 11 | ................................................................ 12 | 19: 9615804 14363026 1335144 26 13 | ................................................................ 14 | 21: 22248362 22121420 2504624 143 15 | ................................................................ 16 | 23: 48098413 35001391 4831224 237 17 | ................................................................ 18 | 25: 145576573 57710137 9472064 183 19 | ................................................................ 20 | 27: 449147966 105984087 18741384 200 21 | ................................................................ 22 | test tests::prove_verify_size_bench has been running for over 60 seconds 23 | 29: 1539770412 200883674 37267664 233 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 115.84s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_ligero_isz.txt: -------------------------------------------------------------------------------- 1 | Updating crates.io index 2 | Downloading crates ... 3 | Downloaded lazy_static v1.4.0 4 | Downloaded num_cpus v1.13.0 5 | Downloaded generic-array v0.14.4 6 | Downloaded rayon v1.5.1 7 | Downloaded subtle v2.4.1 8 | Downloaded crossbeam-epoch v0.9.5 9 | Downloaded crossbeam-deque v0.8.1 10 | Downloaded getrandom v0.1.16 11 | Downloaded ff v0.10.0 12 | Downloaded num-bigint v0.3.2 13 | Downloaded rayon-core v1.9.1 14 | Downloaded rand_core v0.5.1 15 | Downloaded proc-macro-error-attr v1.0.4 16 | Downloaded radium v0.6.2 17 | Downloaded proc-macro-error v1.0.4 18 | Downloaded merlin v2.0.1 19 | Downloaded itertools v0.10.1 20 | Downloaded ff_derive v0.10.0 21 | Downloaded cfg-if v1.0.0 22 | Downloaded memoffset v0.6.4 23 | Downloaded serde_derive v1.0.127 24 | Downloaded scopeguard v1.1.0 25 | Downloaded unicode-xid v0.2.2 26 | Downloaded rand v0.8.4 27 | Downloaded syn v1.0.74 28 | Downloaded libc v0.2.98 29 | Downloaded typenum v1.13.0 30 | Downloaded zeroize_derive v1.1.0 31 | Downloaded synstructure v0.12.5 32 | Downloaded blake3 v1.0.0 33 | Downloaded crossbeam-channel v0.5.1 34 | Downloaded version_check v0.9.3 35 | Downloaded zeroize v1.4.1 36 | Downloaded wyz v0.4.0 37 | Downloaded tap v1.0.1 38 | Downloaded cc v1.0.69 39 | Downloaded autocfg v1.0.1 40 | Downloaded digest v0.9.0 41 | Downloaded quote v1.0.9 42 | Downloaded ppv-lite86 v0.2.10 43 | Downloaded num-traits v0.2.14 44 | Downloaded serde v1.0.127 45 | Downloaded rand_core v0.6.3 46 | Downloaded crossbeam-utils v0.8.5 47 | Downloaded rand_chacha v0.3.1 48 | Downloaded num-integer v0.1.44 49 | Downloaded getrandom v0.2.3 50 | Downloaded paste v1.0.5 51 | Downloaded rustversion v1.0.5 52 | Downloaded bitvec v0.22.3 53 | Downloaded proc-macro2 v1.0.28 54 | Downloaded serde_bytes v0.11.5 55 | Downloaded fffft v0.4.0 56 | Downloaded addchain v0.2.0 57 | Downloaded either v1.6.1 58 | Downloaded byteorder v1.4.3 59 | Downloaded err-derive v0.2.4 60 | Downloaded funty v1.2.0 61 | Downloaded constant_time_eq v0.1.5 62 | Downloaded arrayvec v0.7.1 63 | Downloaded bincode v1.3.3 64 | Downloaded arrayref v0.3.6 65 | Downloaded keccak v0.1.0 66 | Downloaded crypto-mac v0.11.1 67 | Downloaded ff-derive-num v0.1.2 68 | Compiling autocfg v1.0.1 69 | Compiling proc-macro2 v1.0.28 70 | Compiling unicode-xid v0.2.2 71 | Compiling cfg-if v1.0.0 72 | Compiling syn v1.0.74 73 | Compiling libc v0.2.98 74 | Compiling version_check v0.9.3 75 | Compiling crossbeam-utils v0.8.5 76 | Compiling lazy_static v1.4.0 77 | Compiling typenum v1.13.0 78 | Compiling serde_derive v1.0.127 79 | Compiling crossbeam-epoch v0.9.5 80 | Compiling rustversion v1.0.5 81 | Compiling radium v0.6.2 82 | Compiling rayon-core v1.9.1 83 | Compiling tap v1.0.1 84 | Compiling serde v1.0.127 85 | Compiling subtle v2.4.1 86 | Compiling scopeguard v1.1.0 87 | Compiling funty v1.2.0 88 | Compiling byteorder v1.4.3 89 | Compiling getrandom v0.1.16 90 | Compiling either v1.6.1 91 | Compiling ppv-lite86 v0.2.10 92 | Compiling cc v1.0.69 93 | Compiling keccak v0.1.0 94 | Compiling constant_time_eq v0.1.5 95 | Compiling arrayref v0.3.6 96 | Compiling arrayvec v0.7.1 97 | Compiling paste v1.0.5 98 | Compiling wyz v0.4.0 99 | Compiling itertools v0.10.1 100 | Compiling num-traits v0.2.14 101 | Compiling num-integer v0.1.44 102 | Compiling num-bigint v0.3.2 103 | Compiling memoffset v0.6.4 104 | Compiling rayon v1.5.1 105 | Compiling proc-macro-error-attr v1.0.4 106 | Compiling generic-array v0.14.4 107 | Compiling proc-macro-error v1.0.4 108 | Compiling blake3 v1.0.0 109 | Compiling bitvec v0.22.3 110 | Compiling crossbeam-channel v0.5.1 111 | Compiling quote v1.0.9 112 | Compiling crossbeam-deque v0.8.1 113 | Compiling err-derive v0.2.4 114 | Compiling getrandom v0.2.3 115 | Compiling num_cpus v1.13.0 116 | Compiling rand_core v0.6.3 117 | Compiling rand_core v0.5.1 118 | Compiling rand_chacha v0.3.1 119 | Compiling digest v0.9.0 120 | Compiling crypto-mac v0.11.1 121 | Compiling rand v0.8.4 122 | Compiling addchain v0.2.0 123 | Compiling synstructure v0.12.5 124 | Compiling ff_derive v0.10.0 125 | Compiling zeroize_derive v1.1.0 126 | Compiling ff-derive-num v0.1.2 127 | Compiling zeroize v1.4.1 128 | Compiling merlin v2.0.1 129 | Compiling ff v0.10.0 130 | Compiling fffft v0.4.0 131 | Compiling serde_bytes v0.11.5 132 | Compiling bincode v1.3.3 133 | Compiling test-fields v0.1.0 (/home/kwantam/git/github.com/lcpc/test-fields) 134 | Compiling lcpc2d v0.1.0 (/home/kwantam/git/github.com/lcpc/lcpc2d) 135 | Compiling ligero-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/ligero-pc) 136 | Finished release [optimized] target(s) in 43.98s 137 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-7f28e79553183d13) 138 | 139 | running 1 test 140 | ................................................................ 141 | 13: 13591028 84 142 | ................................................................ 143 | 15: 15077092 135 144 | ................................................................ 145 | 17: 34322354 178 146 | ................................................................ 147 | 19: 92586804 78 148 | ................................................................ 149 | 21: 253772585 167 150 | ................................................................ 151 | 23: 469887785 248 152 | ................................................................ 153 | 25: 2083772214 173 154 | ................................................................ 155 | test tests::rough_bench has been running for over 60 seconds 156 | 27: 7528335169 166 157 | ................................................................ 158 | 29: 28241325982 84 159 | test tests::rough_bench ... ok 160 | 161 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 414.13s 162 | 163 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_ligero_isz_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/ligero_pc-7f28e79553183d13) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 25589276 8471744 4325992 175 7 | ................................................................ 8 | 15: 29035634 12234396 5296520 217 9 | ................................................................ 10 | 17: 37904123 19736200 6962536 58 11 | ................................................................ 12 | 19: 55681892 30643102 10019528 139 13 | ................................................................ 14 | 21: 95162533 50559055 15858472 100 15 | ................................................................ 16 | 23: 161092429 87702809 27481352 125 17 | ................................................................ 18 | 25: 332059602 164201769 50452008 161 19 | ................................................................ 20 | 27: 791721826 324827559 95898248 90 21 | ..............................................................test tests::prove_verify_size_bench has been running for over 60 seconds 22 | .. 23 | 29: 2129788120 646570340 186735784 24 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 117.97s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_sdig.txt: -------------------------------------------------------------------------------- 1 | Downloading crates ... 2 | Downloaded rawpointer v0.2.1 3 | Downloaded alga v0.9.3 4 | Downloaded matrixmultiply v0.2.4 5 | Downloaded smallvec v1.6.1 6 | Downloaded libm v0.2.1 7 | Downloaded num-complex v0.3.1 8 | Downloaded num-complex v0.2.4 9 | Downloaded ndarray v0.14.0 10 | Downloaded sprs v0.10.0 11 | Downloaded approx v0.3.2 12 | Compiling libm v0.2.1 13 | Compiling rawpointer v0.2.1 14 | Compiling ndarray v0.14.0 15 | Compiling smallvec v1.6.1 16 | Compiling num-traits v0.2.14 17 | Compiling num-complex v0.2.4 18 | Compiling num-integer v0.1.44 19 | Compiling matrixmultiply v0.2.4 20 | Compiling approx v0.3.2 21 | Compiling num-complex v0.3.1 22 | Compiling ff-derive-num v0.1.2 23 | Compiling num-bigint v0.3.2 24 | Compiling alga v0.9.3 25 | Compiling addchain v0.2.0 26 | Compiling ff_derive v0.10.0 27 | Compiling sprs v0.10.0 28 | Compiling ff v0.10.0 29 | Compiling lcpc2d v0.1.0 (/home/kwantam/git/github.com/lcpc/lcpc2d) 30 | Compiling test-fields v0.1.0 (/home/kwantam/git/github.com/lcpc/test-fields) 31 | Compiling sdig-pc v0.1.0 (/home/kwantam/git/github.com/lcpc/sdig-pc) 32 | Finished release [optimized] target(s) in 20.20s 33 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/sdig_pc-f8bcf0a74b8123d1) 34 | 35 | running 1 test 36 | ................................................................ 37 | 13: 11823575 110 38 | ................................................................ 39 | 15: 18173418 194 40 | ................................................................ 41 | 17: 24324348 250 42 | ................................................................ 43 | 19: 73817503 105 44 | ................................................................ 45 | 21: 234402678 194 46 | ................................................................ 47 | 23: 682044183 197 48 | ................................................................ 49 | 25: 2243153081 45 50 | ................................................................ 51 | test tests::rough_bench has been running for over 60 seconds 52 | 27: 10689307231 8 53 | ................................................................ 54 | 29: 38837187085 167 55 | test tests::rough_bench ... ok 56 | 57 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 557.54s 58 | 59 | -------------------------------------------------------------------------------- /doc/benchmark-results/20210807_64c_255bit_sdig_pvs.txt: -------------------------------------------------------------------------------- 1 | Finished release [optimized] target(s) in 0.03s 2 | Running unittests (/home/kwantam/git/github.com/lcpc/target/release/deps/sdig_pc-f8bcf0a74b8123d1) 3 | 4 | running 1 test 5 | ................................................................ 6 | 13: 25308040 9701892 4402016 170 7 | ................................................................ 8 | 15: 28148937 16788349 5322824 129 9 | ................................................................ 10 | 17: 38581307 31389258 6900784 131 11 | ................................................................ 12 | 19: 67016377 120017241 10250368 248 13 | ................................................................ 14 | 21: 105131130 270265920 16175624 58 15 | ................................................................ 16 | 23: 188542783 557573042 27762416 191 17 | ................................................................ 18 | 25: 281329504 551108408 50336784 202 19 | ................................................................ 20 | test tests::prove_verify_size_bench has been running for over 60 seconds 21 | 27: 931001114 2371226185 96017376 55 22 | ................................................................ 23 | 29: 2046949426 2400504714 186315104 52 24 | test tests::prove_verify_size_bench ... ok 25 | 26 | test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 187.19s 27 | 28 | -------------------------------------------------------------------------------- /doc/benchmark-results/sdig-ligero-isz-microbenchmarks: -------------------------------------------------------------------------------- 1 | sdig 2 | 3 | 32c 4 | --- 5 | 1: test bench::commit_Ft255_Blake2b_16 ... bench: 26,379,451 ns/iter (+/- 8,264,115) 6 | 2: test bench::commit_Ft255_Blake2b_16 ... bench: 35,494,884 ns/iter (+/- 3,372,785) 7 | 3: test bench::commit_Ft255_Blake2b_16 ... bench: 22,987,334 ns/iter (+/- 7,183,484) 8 | 4: test bench::commit_Ft255_Blake2b_16 ... bench: 36,367,823 ns/iter (+/- 5,880,718) 9 | 5: test bench::commit_Ft255_Blake2b_16 ... bench: 37,450,930 ns/iter (+/- 7,315,157) 10 | 6: test bench::commit_Ft255_Blake2b_16 ... bench: 28,559,379 ns/iter (+/- 4,428,682) 11 | 12 | 1c 13 | --- 14 | 1: test bench::commit_Ft255_Blake2b_16 ... bench: 62,647,387 ns/iter (+/- 861,682) 15 | 2: test bench::commit_Ft255_Blake2b_16 ... bench: 71,792,189 ns/iter (+/- 643,293) 16 | 3: test bench::commit_Ft255_Blake2b_16 ... bench: 65,724,157 ns/iter (+/- 745,570) 17 | 4: test bench::commit_Ft255_Blake2b_16 ... bench: 79,539,748 ns/iter (+/- 786,216) 18 | 5: test bench::commit_Ft255_Blake2b_16 ... bench: 81,302,763 ns/iter (+/- 592,955) 19 | 6: test bench::commit_Ft255_Blake2b_16 ... bench: 85,122,988 ns/iter (+/- 511,559) 20 | 21 | ligero 22 | 23 | 1c 24 | --- 25 | 1 (80/81): test bench::commit_isz_Ft255_Blake2b_16 ... bench: 45,573,144 ns/iter (+/- 647,246) 26 | 2 (54/55): test bench::commit_isz_Ft255_Blake2b_16 ... bench: 45,095,085 ns/iter (+/- 363,401) 27 | 3 (39/40): test bench::commit_isz_Ft255_Blake2b_16 ... bench: 45,327,650 ns/iter (+/- 440,515) 28 | 4 (30/31): test bench::commit_isz_Ft255_Blake2b_16 ... bench: 45,520,218 ns/iter (+/- 708,757) 29 | 5 (25/26): test bench::commit_isz_Ft255_Blake2b_16 ... bench: 45,328,754 ns/iter (+/- 535,677) 30 | 6 (21/22): test bench::commit_isz_Ft255_Blake2b_16 ... bench: 45,302,130 ns/iter (+/- 498,632) 31 | -------------------------------------------------------------------------------- /doc/encoding.py: -------------------------------------------------------------------------------- 1 | # encoding.py 2 | # (C) 2021 Sasha Golovnev 3 | # linear-time encoding with constant relative distance 4 | 5 | import math 6 | import random 7 | 8 | # Auxiliary class to store sparse matrices as lists of non-zero elements 9 | # (I couldn't figure out a simple way to use scipy's sparse matrices for our goals.) 10 | class SparseMatrix: 11 | 12 | # A matrix of size n x m, 13 | # a[i] is a list of pairs (j, val) corresponding to matrix with A[i, j] = val 14 | def __init__(self, n, m): 15 | self.n = n 16 | self.m = m 17 | self.a = [] 18 | for i in range(n): 19 | self.a.append([]) 20 | 21 | # Add a non-zero element to the matrix 22 | def add(self, i, j, val): 23 | if val == 0: 24 | return 25 | assert 0 <= i < self.n 26 | assert 0<= j < self.m 27 | self.a[i].append((j, val)) 28 | 29 | 30 | # Multiply a vector x of length self.n by this matrix 31 | def multiply(self, x): 32 | assert len(x) == self.n 33 | y = [0] * self.m 34 | for i in range(self.n): 35 | for (j, val) in self.a[i]: 36 | y[j] += x[i] * val 37 | return y 38 | 39 | # Generate a matrix of size n x m, where each row has d *distinct* random positions 40 | # filled with random non-zero elements of the field 41 | @staticmethod 42 | def generate_random(n, m, d, p): 43 | matrix = SparseMatrix(n, m) 44 | for i in range(n): 45 | indices = random.sample(range(m), d) 46 | for j in indices: 47 | matrix.add(i, j, random.randint(1, p-1)) 48 | return matrix 49 | 50 | 51 | 52 | 53 | # field size, prime p ~ 2^{256} 54 | p = 90589243044481683682024195529420329427646084220979961316176257384569345097147 55 | n = 2**13 56 | 57 | # the following parameters are taken from Table 1 of the write-up. 58 | alpha = 0.178 59 | beta = 0.0785 60 | # r is the rate of the code 61 | r = 1.57 62 | 63 | # delta is the distance of the code, not really needed for the encoding procedure, used for testing. 64 | delta = beta / r 65 | 66 | # multiply two field elements 67 | def field_mult(a, b): 68 | return (a % p) * (b % p) % p 69 | 70 | 71 | # sum up two field elements 72 | def field_add(a, b): 73 | return (a + b) % p 74 | 75 | 76 | # the binary entropy function 77 | def H(x): 78 | assert 0 < x < 1 79 | return -x*math.log(x,2)-(1-x)*math.log(1-x,2) 80 | 81 | 82 | # I don't implement an efficient encoding by Reed-Solomon, because I assume we already have it. 83 | # Instead I just generate a Vandermonde matrix and multiply it by the input vector x. 84 | # This procedure takes a vector x of length l = len(x), and outputs a vector of length m. 85 | def reed_solomon(x, m): 86 | l = len(x) 87 | # Reed-Solomon requires the field size to be at least the length of the output 88 | assert p > m 89 | y = [0] * m 90 | for i in range(1, m+1): 91 | a = 1 92 | for j in range(l): 93 | y[i-1] = field_add(y[i-1], field_mult(a, x[j])) 94 | a = field_mult(a, i) 95 | return y 96 | 97 | 98 | # The code is given by two lists of sparse matrices, precodes and postcodes. 99 | # Let n0 = n, n1 = alpha n0, n2 = alpha n1,...., nt = alpha n_{t-1}, 100 | # where nt is the first value <= 20. 101 | # 102 | # Each list of matrices will have t matrices. 103 | # The i-th matrix in precodes has dimensions ni x (alpha * ni), where alpha is the parameter fixed above. 104 | # The i-th matrix in postcodes has dimensions (alpha * r * ni) x ((r - 1 - alpha * r) * n_i), 105 | # where alpha and r are the parameters fixed above. 106 | # 107 | # Each matrix in *precodes* is just a random sparse matrix sampled as follows: 108 | # In each row of the matrix we pick cn distinct random indices. 109 | # Then each of the sampled positions of the matrix gets a random non-zero element of the field. 110 | # Since all the matrices are sparse, we store them as lists of non-zero elements. 111 | # 112 | # Matrices in *postcode* are sampled in the same way as in precodes with dn non-zeros per row instead of cn. 113 | def generate(n): 114 | precodes = [] 115 | postcodes = [] 116 | i = 0 117 | ni = n 118 | while ni > 20: 119 | # the current precode matrix has dimensions ni x mi 120 | mi = math.ceil(ni * alpha) 121 | # the current postcode matrix has dimensions niprime x miprime 122 | niprime = math.ceil(r * mi) 123 | miprime = math.ceil(r * ni) - ni - niprime 124 | 125 | # the sparsity of the precode matrix is cn 126 | cn = math.ceil(min( 127 | max(1.2 * beta * ni, beta * ni +3), 128 | (110/ni + H(beta) + alpha * H(1.2 * beta / alpha)) / (beta * math.log(alpha / (1.2 * beta), 2)) 129 | )) 130 | precode = SparseMatrix.generate_random(ni, mi, cn, p) 131 | precodes.append(precode) 132 | 133 | # the sparsity of the postcode matrix is dn 134 | mu = r - 1 - r * alpha 135 | nu = beta + alpha * beta + 0.03 136 | dn = math.ceil(min( 137 | ni * (2 * beta + (r - 1 + 110/ni)/math.log(p, 2) ), 138 | (r * alpha * H(beta / r) + mu * H(nu / mu) + 110/ni) / (alpha * beta * math.log(mu / nu, 2)) 139 | )) 140 | postcode = SparseMatrix.generate_random(niprime, miprime, dn, p) 141 | postcodes.append(postcode) 142 | 143 | i += 1 144 | ni = math.ceil(ni * alpha) 145 | return precodes, postcodes 146 | 147 | 148 | # The encoding procedure. 149 | # If the length of x is at most 20, then we just encode the vector by Reed-Solomon. 150 | # Otherwise we take the next pair of matrices from precodes and postcodes 151 | # y = x * precode 152 | # z = recursive encoding of y 153 | # v = z * postcode 154 | # the resulting encoding is (x, z, v) 155 | def encode(x, code, shift = 0): 156 | if len(x) <= 20: 157 | return reed_solomon(x, math.ceil(r * len(x))) 158 | precodes, postcodes = code 159 | assert precodes[shift].n == len(x) 160 | y = precodes[shift].multiply(x) 161 | z = encode(y, code, shift+1) 162 | assert postcodes[shift].n == len(z) 163 | v = postcodes[shift].multiply(z) 164 | # here '+' denotes the list concatenation operator. 165 | return x + z + v 166 | 167 | 168 | # example 169 | code = generate(n) 170 | 171 | for _ in range(10): 172 | x = [] 173 | # generate a random vector x of length n without using range(p): 174 | for _ in range(n): 175 | x.append(random.randint(0, p-1)) 176 | encoded = encode(x, code) 177 | hammingWeight = sum(1 for element in encoded if element != 0) 178 | print(hammingWeight/len(encoded) >= delta) 179 | -------------------------------------------------------------------------------- /lcpc-2d/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "lcpc-2d" 3 | version = "0.1.1" 4 | authors = ["kwantam "] 5 | edition = "2018" 6 | description = "polynomial commitment scheme from linear codes" 7 | license = "Apache-2.0" 8 | repository = "https://github.com/conroi/lcpc" 9 | 10 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 11 | 12 | [dependencies] 13 | digest = "0.9" 14 | err-derive = "0.2" 15 | ff = "0.12" 16 | merlin = "2.0" 17 | rand = "0.8" 18 | rand_chacha = "0.3" 19 | rayon = "1.5" 20 | serde = { version = "1.0", features = ["derive"] } 21 | serde_bytes = "0.11" 22 | 23 | [dev-dependencies] 24 | bincode = "1.3" 25 | blake3 = { version = "1", features = ["traits-preview"] } 26 | fffft = "0.4" 27 | itertools = "0.10" 28 | lcpc-test-fields = { path = "../lcpc-test-fields" } 29 | -------------------------------------------------------------------------------- /lcpc-2d/src/macros.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-2d, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | /// Define domain separation labels for an LcEncoding trait implementation 11 | /// 12 | /// Use this to conveniently define the LABEL_xx values for domain separation, 13 | /// e.g.: 14 | /// 15 | /// ```ignore 16 | /// impl LcEncoding for ... { 17 | /// ... 18 | /// 19 | /// def_labels!(my_encoding_name); 20 | /// 21 | /// ... 22 | /// } 23 | /// 24 | /// ``` 25 | /// 26 | /// Note that the argument may only contain alphanumerics and underscores, 27 | /// and cannot be just an underscore (same rules as Rust identifiers). 28 | #[macro_export] 29 | macro_rules! def_labels { 30 | ($l:ident) => { 31 | const LABEL_DT: &'static [u8] = b"$l//DT"; 32 | const LABEL_PR: &'static [u8] = b"$l//PR"; 33 | const LABEL_PE: &'static [u8] = b"$l//PE"; 34 | const LABEL_CO: &'static [u8] = b"$l//CO"; 35 | }; 36 | } 37 | -------------------------------------------------------------------------------- /lcpc-2d/src/tests.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-2d, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | use super::{def_labels, FieldHash, LcCommit, LcEncoding, LcEvalProof, LcRoot}; 11 | 12 | use blake3::Hasher as Blake3; 13 | use digest::Output; 14 | use ff::Field; 15 | use fffft::{FFTError, FFTPrecomp, FieldFFT}; 16 | use itertools::iterate; 17 | use merlin::Transcript; 18 | use rand::{Rng, SeedableRng}; 19 | use rand_chacha::ChaCha20Rng; 20 | use std::iter::repeat_with; 21 | use lcpc_test_fields::ft63::*; 22 | 23 | #[derive(Clone, Debug)] 24 | struct LigeroEncoding { 25 | n_per_row: usize, // number of inputs to the encoding 26 | n_cols: usize, // number of outputs from the encoding 27 | pc: FFTPrecomp, 28 | } 29 | 30 | const N_COL_OPENS: usize = 128usize; // arbitrary, not secure 31 | impl LigeroEncoding 32 | where 33 | Ft: FieldFFT, 34 | { 35 | fn _get_dims(len: usize, rho: f64) -> Option<(usize, usize, usize)> { 36 | assert!(rho > 0f64); 37 | assert!(rho < 1f64); 38 | 39 | // compute #cols, which must be a power of 2 because of FFT 40 | let nc = (((len as f64).sqrt() / rho).ceil() as usize) 41 | .checked_next_power_of_two() 42 | .and_then(|nc| { 43 | if nc > (1 << ::S) { 44 | None 45 | } else { 46 | Some(nc) 47 | } 48 | })?; 49 | 50 | // minimize nr subject to #cols and rho 51 | let np = ((nc as f64) * rho).floor() as usize; 52 | let nr = (len + np - 1) / np; 53 | assert!(np * nr >= len); 54 | assert!(np * (nr - 1) < len); 55 | 56 | Some((nr, np, nc)) 57 | } 58 | 59 | fn _dims_ok(n_per_row: usize, n_cols: usize) -> bool { 60 | let sz = n_per_row < n_cols; 61 | let pow = n_cols.is_power_of_two(); 62 | sz && pow 63 | } 64 | 65 | pub fn new(len: usize, rho: f64) -> Self { 66 | let (_, n_per_row, n_cols) = Self::_get_dims(len, rho).unwrap(); 67 | assert!(Self::_dims_ok(n_per_row, n_cols)); 68 | let pc = ::precomp_fft(n_cols).unwrap(); 69 | Self { 70 | n_per_row, 71 | n_cols, 72 | pc, 73 | } 74 | } 75 | 76 | pub fn new_from_dims(n_per_row: usize, n_cols: usize) -> Self { 77 | assert!(Self::_dims_ok(n_per_row, n_cols)); 78 | let pc = ::precomp_fft(n_cols).unwrap(); 79 | assert_eq!(n_cols, 1 << pc.get_log_len()); 80 | Self { 81 | n_per_row, 82 | n_cols, 83 | pc, 84 | } 85 | } 86 | } 87 | 88 | impl LcEncoding for LigeroEncoding 89 | where 90 | Ft: FieldFFT + FieldHash, 91 | { 92 | type F = Ft; 93 | type Err = FFTError; 94 | 95 | def_labels!(lcpc2d_test); 96 | 97 | fn encode>(&self, inp: T) -> Result<(), FFTError> { 98 | ::fft_io_pc(inp, &self.pc) 99 | } 100 | 101 | fn get_dims(&self, len: usize) -> (usize, usize, usize) { 102 | let n_rows = (len + self.n_per_row - 1) / self.n_per_row; 103 | (n_rows, self.n_per_row, self.n_cols) 104 | } 105 | 106 | fn dims_ok(&self, n_per_row: usize, n_cols: usize) -> bool { 107 | let ok = Self::_dims_ok(n_per_row, n_cols); 108 | let pc = n_cols == (1 << self.pc.get_log_len()); 109 | let np = n_per_row == self.n_per_row; 110 | let nc = n_cols == self.n_cols; 111 | ok && pc && np && nc 112 | } 113 | 114 | fn get_n_col_opens(&self) -> usize { 115 | N_COL_OPENS 116 | } 117 | 118 | fn get_n_degree_tests(&self) -> usize { 119 | 2 120 | } 121 | } 122 | 123 | type LigeroCommit = LcCommit>; 124 | 125 | type LigeroEvalProof = LcEvalProof>; 126 | 127 | #[test] 128 | fn log2() { 129 | use super::log2; 130 | 131 | for idx in 0..31 { 132 | assert_eq!(log2(1usize << idx), idx); 133 | } 134 | } 135 | 136 | #[test] 137 | fn merkleize() { 138 | use super::{merkleize, merkleize_ser}; 139 | 140 | let mut test_comm = random_comm(); 141 | let mut test_comm_2 = test_comm.clone(); 142 | 143 | merkleize(&mut test_comm); 144 | merkleize_ser(&mut test_comm_2); 145 | 146 | assert_eq!(&test_comm.comm, &test_comm_2.comm); 147 | assert_eq!(&test_comm.coeffs, &test_comm_2.coeffs); 148 | assert_eq!(&test_comm.hashes, &test_comm_2.hashes); 149 | } 150 | 151 | #[test] 152 | fn eval_outer() { 153 | use super::{eval_outer, eval_outer_ser}; 154 | 155 | let test_comm = random_comm(); 156 | let mut rng = rand::thread_rng(); 157 | let tensor: Vec = repeat_with(|| Ft63::random(&mut rng)) 158 | .take(test_comm.n_rows) 159 | .collect(); 160 | 161 | let res1 = eval_outer(&test_comm, &tensor[..]).unwrap(); 162 | let res2 = eval_outer_ser(&test_comm, &tensor[..]).unwrap(); 163 | 164 | assert_eq!(&res1[..], &res2[..]); 165 | } 166 | 167 | #[test] 168 | fn open_column() { 169 | use super::{merkleize, open_column, verify_column}; 170 | 171 | let mut rng = rand::thread_rng(); 172 | 173 | let test_comm = { 174 | let mut tmp = random_comm(); 175 | merkleize(&mut tmp); 176 | tmp 177 | }; 178 | 179 | let root = test_comm.get_root(); 180 | for _ in 0..64 { 181 | let col_num = rng.gen::() % test_comm.n_cols; 182 | let column = open_column(&test_comm, col_num).unwrap(); 183 | assert!(verify_column::( 184 | &column, 185 | col_num, 186 | root.as_ref(), 187 | &[], 188 | &Ft63::zero(), 189 | )); 190 | } 191 | } 192 | 193 | #[test] 194 | fn commit() { 195 | use super::{commit, eval_outer, eval_outer_fft}; 196 | 197 | let (coeffs, rho) = random_coeffs_rho(); 198 | let enc = LigeroEncoding::::new(coeffs.len(), rho); 199 | let comm = commit::>(&coeffs, &enc).unwrap(); 200 | 201 | let x = Ft63::random(&mut rand::thread_rng()); 202 | 203 | let eval = comm 204 | .coeffs 205 | .iter() 206 | .zip(iterate(Ft63::one(), |&v| v * x).take(coeffs.len())) 207 | .fold(Ft63::zero(), |acc, (c, r)| acc + *c * r); 208 | 209 | let roots_lo: Vec = iterate(Ft63::one(), |&v| v * x) 210 | .take(comm.n_per_row) 211 | .collect(); 212 | let roots_hi: Vec = { 213 | let xr = x * roots_lo.last().unwrap(); 214 | iterate(Ft63::one(), |&v| v * xr) 215 | .take(comm.n_rows) 216 | .collect() 217 | }; 218 | let coeffs_flattened = eval_outer(&comm, &roots_hi[..]).unwrap(); 219 | let eval2 = coeffs_flattened 220 | .iter() 221 | .zip(roots_lo.iter()) 222 | .fold(Ft63::zero(), |acc, (c, r)| acc + *c * r); 223 | assert_eq!(eval, eval2); 224 | 225 | let mut poly_fft = eval_outer_fft(&comm, &roots_hi[..]).unwrap(); 226 | ::ifft_oi(&mut poly_fft).unwrap(); 227 | assert!(poly_fft 228 | .iter() 229 | .skip(comm.n_per_row) 230 | .all(|&v| v == Ft63::zero())); 231 | let eval3 = poly_fft 232 | .iter() 233 | .zip(roots_lo.iter()) 234 | .fold(Ft63::zero(), |acc, (c, r)| acc + *c * r); 235 | assert_eq!(eval2, eval3); 236 | } 237 | 238 | #[test] 239 | fn end_to_end() { 240 | use super::{commit, prove, verify}; 241 | 242 | // commit to a random polynomial at a random rate 243 | let (coeffs, rho) = random_coeffs_rho(); 244 | let enc = LigeroEncoding::::new(coeffs.len(), rho); 245 | let comm = commit::>(&coeffs, &enc).unwrap(); 246 | // this is the polynomial commitment 247 | let root = comm.get_root(); 248 | 249 | // evaluate the random polynomial we just generated at a random point x 250 | let x = Ft63::random(&mut rand::thread_rng()); 251 | let eval = comm 252 | .coeffs 253 | .iter() 254 | .zip(iterate(Ft63::one(), |&v| v * x).take(coeffs.len())) 255 | .fold(Ft63::zero(), |acc, (c, r)| acc + *c * r); 256 | 257 | // compute the outer and inner tensors for powers of x 258 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 259 | // really matter --- the only difference from a multilinear is the 260 | // way we compute outer_tensor and inner_tensor from the eval point 261 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 262 | .take(comm.n_per_row) 263 | .collect(); 264 | let outer_tensor: Vec = { 265 | let xr = x * inner_tensor.last().unwrap(); 266 | iterate(Ft63::one(), |&v| v * xr) 267 | .take(comm.n_rows) 268 | .collect() 269 | }; 270 | 271 | // compute an evaluation proof 272 | let mut tr1 = Transcript::new(b"test transcript"); 273 | tr1.append_message(b"polycommit", root.as_ref()); 274 | tr1.append_message(b"rate", &rho.to_be_bytes()[..]); 275 | tr1.append_message(b"ncols", &(N_COL_OPENS as u64).to_be_bytes()[..]); 276 | let pf: LigeroEvalProof = 277 | prove(&comm, &outer_tensor[..], &enc, &mut tr1).unwrap(); 278 | let encoded: Vec = bincode::serialize(&pf).unwrap(); 279 | let encroot: Vec = bincode::serialize(&LcRoot::> { 280 | root: *root.as_ref(), 281 | _p: Default::default(), 282 | }) 283 | .unwrap(); 284 | 285 | // verify it and finish evaluation 286 | let mut tr2 = Transcript::new(b"test transcript"); 287 | tr2.append_message(b"polycommit", root.as_ref()); 288 | tr2.append_message(b"rate", &rho.to_be_bytes()[..]); 289 | tr2.append_message(b"ncols", &(N_COL_OPENS as u64).to_be_bytes()[..]); 290 | let enc2 = LigeroEncoding::::new_from_dims(pf.get_n_per_row(), pf.get_n_cols()); 291 | let res = verify( 292 | root.as_ref(), 293 | &outer_tensor[..], 294 | &inner_tensor[..], 295 | &pf, 296 | &enc2, 297 | &mut tr2, 298 | ) 299 | .unwrap(); 300 | 301 | let root2 = 302 | bincode::deserialize::>>(&encroot[..]).unwrap(); 303 | let pf2: LigeroEvalProof = bincode::deserialize(&encoded[..]).unwrap(); 304 | let mut tr3 = Transcript::new(b"test transcript"); 305 | tr3.append_message(b"polycommit", root.as_ref()); 306 | tr3.append_message(b"rate", &rho.to_be_bytes()[..]); 307 | tr3.append_message(b"ncols", &(N_COL_OPENS as u64).to_be_bytes()[..]); 308 | let enc3 = LigeroEncoding::::new_from_dims(pf2.get_n_per_row(), pf2.get_n_cols()); 309 | let res2 = verify( 310 | root2.as_ref(), 311 | &outer_tensor[..], 312 | &inner_tensor[..], 313 | &pf2, 314 | &enc3, 315 | &mut tr3, 316 | ) 317 | .unwrap(); 318 | 319 | assert_eq!(res, eval); 320 | assert_eq!(res, res2); 321 | } 322 | 323 | #[test] 324 | fn end_to_end_two_proofs() { 325 | use super::{commit, prove, verify}; 326 | 327 | // commit to a random polynomial at a random rate 328 | let (coeffs, rho) = random_coeffs_rho(); 329 | let enc = LigeroEncoding::::new(coeffs.len(), rho); 330 | let comm = commit::>(&coeffs, &enc).unwrap(); 331 | // this is the polynomial commitment 332 | let root = comm.get_root(); 333 | 334 | // evaluate the random polynomial we just generated at a random point x 335 | let x = Ft63::random(&mut rand::thread_rng()); 336 | let eval = comm 337 | .coeffs 338 | .iter() 339 | .zip(iterate(Ft63::one(), |&v| v * x).take(coeffs.len())) 340 | .fold(Ft63::zero(), |acc, (c, r)| acc + *c * r); 341 | 342 | // compute the outer and inner tensors for powers of x 343 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 344 | // really matter --- the only difference from a multilinear is the 345 | // way we compute outer_tensor and inner_tensor from the eval point 346 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 347 | .take(comm.n_per_row) 348 | .collect(); 349 | let outer_tensor: Vec = { 350 | let xr = x * inner_tensor.last().unwrap(); 351 | iterate(Ft63::one(), |&v| v * xr) 352 | .take(comm.n_rows) 353 | .collect() 354 | }; 355 | 356 | // compute an evaluation proof 357 | let mut tr1 = Transcript::new(b"test transcript"); 358 | tr1.append_message(b"polycommit", root.as_ref()); 359 | tr1.append_message(b"rate", &rho.to_be_bytes()[..]); 360 | tr1.append_message(b"ncols", &(N_COL_OPENS as u64).to_be_bytes()[..]); 361 | let pf = prove::(&comm, &outer_tensor[..], &enc, &mut tr1).unwrap(); 362 | 363 | let challenge_after_first_proof_prover = { 364 | let mut key: ::Seed = Default::default(); 365 | tr1.challenge_bytes(b"ligero-pc//challenge", &mut key); 366 | let mut deg_test_rng = ChaCha20Rng::from_seed(key); 367 | Ft63::random(&mut deg_test_rng) 368 | }; 369 | 370 | // produce a second proof with the same transcript 371 | tr1.append_message(b"polycommit", root.as_ref()); 372 | tr1.append_message(b"rate", &rho.to_be_bytes()[..]); 373 | tr1.append_message(b"ncols", &(N_COL_OPENS as u64).to_be_bytes()[..]); 374 | let pf2 = prove::(&comm, &outer_tensor[..], &enc, &mut tr1).unwrap(); 375 | 376 | // verify it and finish evaluation 377 | let mut tr2 = Transcript::new(b"test transcript"); 378 | tr2.append_message(b"polycommit", root.as_ref()); 379 | tr2.append_message(b"rate", &rho.to_be_bytes()[..]); 380 | tr2.append_message(b"ncols", &(N_COL_OPENS as u64).to_be_bytes()[..]); 381 | let enc2 = LigeroEncoding::::new_from_dims(pf.get_n_per_row(), pf.get_n_cols()); 382 | let res = verify( 383 | root.as_ref(), 384 | &outer_tensor[..], 385 | &inner_tensor[..], 386 | &pf, 387 | &enc2, 388 | &mut tr2, 389 | ) 390 | .unwrap(); 391 | 392 | assert_eq!(res, eval); 393 | let challenge_after_first_proof_verifier = { 394 | let mut key: ::Seed = Default::default(); 395 | tr2.challenge_bytes(b"ligero-pc//challenge", &mut key); 396 | let mut deg_test_rng = ChaCha20Rng::from_seed(key); 397 | Ft63::random(&mut deg_test_rng) 398 | }; 399 | assert_eq!( 400 | challenge_after_first_proof_prover, 401 | challenge_after_first_proof_verifier 402 | ); 403 | 404 | // second proof verification with the same transcript 405 | tr2.append_message(b"polycommit", root.as_ref()); 406 | tr2.append_message(b"rate", &rho.to_be_bytes()[..]); 407 | tr2.append_message(b"ncols", &(N_COL_OPENS as u64).to_be_bytes()[..]); 408 | let enc3 = LigeroEncoding::::new_from_dims(pf2.get_n_per_row(), pf2.get_n_cols()); 409 | let res2 = verify( 410 | root.as_ref(), 411 | &outer_tensor[..], 412 | &inner_tensor[..], 413 | &pf2, 414 | &enc3, 415 | &mut tr2, 416 | ) 417 | .unwrap(); 418 | 419 | assert_eq!(res2, eval); 420 | } 421 | 422 | fn random_coeffs_rho() -> (Vec, f64) { 423 | let mut rng = rand::thread_rng(); 424 | 425 | let lgl = 8 + rng.gen::() % 8; 426 | let len_base = 1 << (lgl - 1); 427 | let len = len_base + (rng.gen::() % len_base); 428 | 429 | ( 430 | repeat_with(|| Ft63::random(&mut rng)).take(len).collect(), 431 | rng.gen_range(0.1f64..0.9f64), 432 | ) 433 | } 434 | 435 | fn random_comm() -> LigeroCommit { 436 | let mut rng = rand::thread_rng(); 437 | 438 | let lgl = 8 + rng.gen::() % 8; 439 | let len_base = 1 << (lgl - 1); 440 | let len = len_base + (rng.gen::() % len_base); 441 | let rho = rng.gen_range(0.1f64..0.9f64); 442 | let (n_rows, n_per_row, n_cols) = LigeroEncoding::::_get_dims(len, rho).unwrap(); 443 | 444 | let coeffs_len = (n_per_row - 1) * n_rows + 1 + (rng.gen::() % n_rows); 445 | let coeffs = { 446 | let mut tmp = repeat_with(|| Ft63::random(&mut rng)) 447 | .take(coeffs_len) 448 | .collect::>(); 449 | tmp.resize(n_per_row * n_rows, Ft63::zero()); 450 | tmp 451 | }; 452 | 453 | let comm_len = n_rows * n_cols; 454 | let comm: Vec = repeat_with(|| Ft63::random(&mut rng)) 455 | .take(comm_len) 456 | .collect(); 457 | 458 | LigeroCommit:: { 459 | comm, 460 | coeffs, 461 | n_rows, 462 | n_cols, 463 | n_per_row, 464 | hashes: vec![ as Default>::default(); 2 * n_cols - 1], 465 | } 466 | } 467 | -------------------------------------------------------------------------------- /lcpc-brakedown-pc/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "lcpc-brakedown-pc" 3 | version = "0.1.1" 4 | authors = ["kwantam "] 5 | edition = "2018" 6 | description = "polynomial commitment scheme from SDIG expander code" 7 | license = "Apache-2.0" 8 | repository = "https://github.com/conroi/lcpc" 9 | 10 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 11 | 12 | [dependencies] 13 | ff = "0.12" 14 | itertools = "0.10" 15 | lcpc-2d = { path = "../lcpc-2d", version = "0.1.1" } 16 | ndarray = ">=0.11.0,<0.15" 17 | num-traits = "0.2" 18 | rand = "0.8" 19 | rand_chacha = "0.3" 20 | rayon = "1.5" 21 | sprs = "0.10" 22 | typenum = "1.13" 23 | 24 | [dev-dependencies] 25 | bincode = "1.3" 26 | blake3 = { version = "1.0", features = ["traits-preview"] } 27 | merlin = "2.0" 28 | paste = "1.0" 29 | lcpc-test-fields = { path = "../lcpc-test-fields", version = "0.1.1" } 30 | 31 | [features] 32 | bench = [] 33 | -------------------------------------------------------------------------------- /lcpc-brakedown-pc/src/bench.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-brakedown-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | use super::{BrakedownCommit, SdigEncoding}; 11 | 12 | use blake3::{Hasher as Blake3, traits::digest::Digest}; 13 | use ff::{Field, PrimeField}; 14 | use itertools::iterate; 15 | use lcpc_2d::{FieldHash, LcEncoding}; 16 | use merlin::Transcript; 17 | use num_traits::Num; 18 | use sprs::MulAcc; 19 | use test::{black_box, Bencher}; 20 | use lcpc_test_fields::{def_bench, ft127::*, ft255::*, random_coeffs}; 21 | 22 | #[bench] 23 | fn matgen_bench(b: &mut Bencher) { 24 | use super::codespec::SdigCode3 as TestCode; 25 | use super::matgen::generate; 26 | 27 | b.iter(|| { 28 | generate::(1048576, 0u64); 29 | }) 30 | } 31 | 32 | fn commit_bench(b: &mut Bencher, log_len: usize) 33 | where 34 | D: Digest, 35 | Ft: Field + FieldHash + MulAcc + Num + PrimeField, 36 | { 37 | let coeffs = random_coeffs(log_len); 38 | let enc = SdigEncoding::new(coeffs.len(), 0); 39 | 40 | b.iter(|| { 41 | black_box(BrakedownCommit::::commit(&coeffs, &enc).unwrap()); 42 | }); 43 | } 44 | 45 | fn prove_bench(b: &mut Bencher, log_len: usize) 46 | where 47 | D: Digest, 48 | Ft: Field + FieldHash + MulAcc + Num + PrimeField, 49 | { 50 | let coeffs = random_coeffs(log_len); 51 | let enc = SdigEncoding::new(coeffs.len(), 0); 52 | let comm = BrakedownCommit::::commit(&coeffs, &enc).unwrap(); 53 | 54 | // random point to eval at 55 | let x = Ft::random(&mut rand::thread_rng()); 56 | let inner_tensor: Vec = iterate(::one(), |&v| v * x) 57 | .take(comm.get_n_per_row()) 58 | .collect(); 59 | let outer_tensor: Vec = { 60 | let xr = x * inner_tensor.last().unwrap(); 61 | iterate(::one(), |&v| v * xr) 62 | .take(comm.get_n_rows()) 63 | .collect() 64 | }; 65 | 66 | b.iter(|| { 67 | let mut tr = Transcript::new(b"bench transcript"); 68 | tr.append_message(b"polycommit", comm.get_root().as_ref()); 69 | tr.append_message(b"rate", &0.25f64.to_be_bytes()[..]); 70 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 71 | tr.append_message( 72 | b"ndegs", 73 | &(enc.get_n_degree_tests() as u64).to_be_bytes()[..], 74 | ); 75 | black_box(comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap()); 76 | }); 77 | } 78 | 79 | fn verify_bench(b: &mut Bencher, log_len: usize) 80 | where 81 | D: Digest, 82 | Ft: Field + FieldHash + MulAcc + Num + PrimeField, 83 | { 84 | let coeffs = random_coeffs(log_len); 85 | let enc = SdigEncoding::new(coeffs.len(), 0); 86 | let comm = BrakedownCommit::::commit(&coeffs, &enc).unwrap(); 87 | 88 | // random point to eval at 89 | let x = Ft::random(&mut rand::thread_rng()); 90 | let inner_tensor: Vec = iterate(::one(), |&v| v * x) 91 | .take(comm.get_n_per_row()) 92 | .collect(); 93 | let outer_tensor: Vec = { 94 | let xr = x * inner_tensor.last().unwrap(); 95 | iterate(::one(), |&v| v * xr) 96 | .take(comm.get_n_rows()) 97 | .collect() 98 | }; 99 | 100 | let mut tr = Transcript::new(b"bench transcript"); 101 | tr.append_message(b"polycommit", comm.get_root().as_ref()); 102 | tr.append_message(b"rate", &0.25f64.to_be_bytes()[..]); 103 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 104 | tr.append_message( 105 | b"ndegs", 106 | &(enc.get_n_degree_tests() as u64).to_be_bytes()[..], 107 | ); 108 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap(); 109 | let root = comm.get_root(); 110 | 111 | b.iter(|| { 112 | let mut tr = Transcript::new(b"bench transcript"); 113 | tr.append_message(b"polycommit", comm.get_root().as_ref()); 114 | tr.append_message(b"rate", &0.25f64.to_be_bytes()[..]); 115 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 116 | tr.append_message( 117 | b"ndegs", 118 | &(enc.get_n_degree_tests() as u64).to_be_bytes()[..], 119 | ); 120 | black_box( 121 | pf.verify( 122 | root.as_ref(), 123 | &outer_tensor[..], 124 | &inner_tensor[..], 125 | &enc, 126 | &mut tr, 127 | ) 128 | .unwrap(), 129 | ); 130 | }); 131 | } 132 | 133 | def_bench!(commit, Ft127, Blake3, 16); 134 | def_bench!(commit, Ft127, Blake3, 20); 135 | def_bench!(commit, Ft127, Blake3, 24); 136 | 137 | def_bench!(prove, Ft127, Blake3, 16); 138 | def_bench!(prove, Ft127, Blake3, 20); 139 | def_bench!(prove, Ft127, Blake3, 24); 140 | 141 | def_bench!(verify, Ft127, Blake3, 16); 142 | def_bench!(verify, Ft127, Blake3, 20); 143 | def_bench!(verify, Ft127, Blake3, 24); 144 | 145 | def_bench!(commit, Ft255, Blake3, 16); 146 | def_bench!(commit, Ft255, Blake3, 20); 147 | def_bench!(commit, Ft255, Blake3, 24); 148 | 149 | def_bench!(prove, Ft255, Blake3, 16); 150 | def_bench!(prove, Ft255, Blake3, 20); 151 | def_bench!(prove, Ft255, Blake3, 24); 152 | 153 | def_bench!(verify, Ft255, Blake3, 16); 154 | def_bench!(verify, Ft255, Blake3, 20); 155 | def_bench!(verify, Ft255, Blake3, 24); 156 | -------------------------------------------------------------------------------- /lcpc-brakedown-pc/src/codespec.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-brakedown-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | /*! specify code parameters */ 11 | 12 | use std::fmt::Debug; 13 | use std::marker::{PhantomData, Sync}; 14 | use std::ops::Add; 15 | use typenum::Unsigned; 16 | 17 | fn ent(z: f64) -> f64 { 18 | assert!(0f64 < z && z < 1f64); 19 | let mzp1 = 1f64 - z; 20 | -z * z.log2() - mzp1 * mzp1.log2() 21 | } 22 | 23 | /// Specify an SDIG code 24 | pub trait SdigSpecification { 25 | /// numerator of alpha 26 | type An: Unsigned; 27 | /// denominator of alpha 28 | type Ad: Unsigned; 29 | 30 | /// numerator of beta 31 | type Bn: Unsigned; 32 | /// denominator of beta 33 | type Bd: Unsigned; 34 | 35 | /// numerator of R 36 | type Rn: Unsigned; 37 | /// denominator of R 38 | type Rd: Unsigned; 39 | 40 | /// base-case code length 41 | type Blen: Unsigned; 42 | 43 | /// distance as f64 { 44 | fn dist() -> f64 { 45 | (Self::Bn::to_usize() * Self::Rd::to_usize()) as f64 46 | / (Self::Bd::to_usize() * Self::Rn::to_usize()) as f64 47 | } 48 | 49 | /// alpha num as usize 50 | fn alpha_num() -> usize { 51 | Self::An::to_usize() 52 | } 53 | 54 | /// alpha den as usize 55 | fn alpha_den() -> usize { 56 | Self::Ad::to_usize() 57 | } 58 | 59 | /// beta num as usize 60 | fn beta_num() -> usize { 61 | Self::Bn::to_usize() 62 | } 63 | 64 | /// beta den as usize 65 | fn beta_den() -> usize { 66 | Self::Bd::to_usize() 67 | } 68 | 69 | /// r num as usize 70 | fn r_num() -> usize { 71 | Self::Rn::to_usize() 72 | } 73 | 74 | /// r den as usize 75 | fn r_den() -> usize { 76 | Self::Rd::to_usize() 77 | } 78 | 79 | /// baselen 80 | fn baselen() -> usize { 81 | Self::Blen::to_usize() 82 | } 83 | 84 | /// alpha as f64 85 | fn alpha() -> f64 { 86 | Self::An::to_usize() as f64 / Self::Ad::to_usize() as f64 87 | } 88 | 89 | /// beta as f64 90 | fn beta() -> f64 { 91 | Self::Bn::to_usize() as f64 / Self::Bd::to_usize() as f64 92 | } 93 | 94 | /// r as f64 95 | fn r() -> f64 { 96 | Self::Rn::to_usize() as f64 / Self::Rd::to_usize() as f64 97 | } 98 | 99 | /// mu = r - 1 - r * alpha 100 | fn mu() -> f64 { 101 | Self::r() - 1f64 - Self::r() * Self::alpha() 102 | } 103 | 104 | /// nu = beta + alpha * beta + 0.03 105 | fn nu() -> f64 { 106 | Self::beta() + Self::alpha() * Self::beta() + 0.03f64 107 | } 108 | 109 | /// constant for cn calculation 110 | fn cnst_cn_1() -> f64 { 111 | ent(Self::beta()) + Self::alpha() * ent(1.28f64 * Self::beta() / Self::alpha()) 112 | } 113 | 114 | /// constant for cn calculation 115 | fn cnst_cn_2() -> f64 { 116 | Self::beta() * (Self::alpha() / (1.28f64 * Self::beta())).log2() 117 | } 118 | 119 | /// constant for dn calculation 120 | fn cnst_dn_1() -> f64 { 121 | Self::r() * Self::alpha() * ent(Self::beta() / Self::r()) 122 | + Self::mu() * ent(Self::nu() / Self::mu()) 123 | } 124 | 125 | /// constant for dn calculation 126 | fn cnst_dn_2() -> f64 { 127 | Self::alpha() * Self::beta() * (Self::mu() / Self::nu()).log2() 128 | } 129 | } 130 | 131 | /// A concrete SdigSpecification object 132 | #[derive(Clone, Debug)] 133 | pub struct SdigSpec 134 | where 135 | An: Unsigned + Debug + Sync, 136 | Ad: Unsigned + Debug + Sync, 137 | Bn: Unsigned + Debug + Sync, 138 | Bd: Unsigned + Debug + Sync, 139 | Rn: Unsigned + Debug + Sync, 140 | Rd: Unsigned + Debug + Sync, 141 | Blen: Unsigned + Debug + Sync, 142 | { 143 | _p: PhantomData<(An, Ad, Bn, Bd, Rn, Rd, Blen)>, 144 | } 145 | 146 | impl SdigSpecification for SdigSpec 147 | where 148 | An: Unsigned + Debug + Sync, 149 | Ad: Unsigned + Debug + Sync, 150 | Bn: Unsigned + Debug + Sync, 151 | Bd: Unsigned + Debug + Sync, 152 | Rn: Unsigned + Debug + Sync, 153 | Rd: Unsigned + Debug + Sync, 154 | Blen: Unsigned + Debug + Sync, 155 | { 156 | type An = An; 157 | type Ad = Ad; 158 | type Bn = Bn; 159 | type Bd = Bd; 160 | type Rn = Rn; 161 | type Rd = Rd; 162 | type Blen = Blen; 163 | } 164 | 165 | type U1521 = >::Output; 166 | type U2000 = >::Output; 167 | type U2500 = >::Output; 168 | /// line 1 from table 169 | pub type SdigCode1 = SdigSpec< 170 | typenum::U239, // alpha = 0.1195 171 | U2000, 172 | typenum::U71, // beta = 0.0284 173 | U2500, 174 | typenum::U71, // r = 1.42 175 | typenum::U50, 176 | typenum::U20, // baselen = 20 177 | >; 178 | 179 | /// line 2 from table 180 | pub type SdigCode2 = SdigSpec< 181 | typenum::U69, // alpha = 0.138 182 | typenum::U500, 183 | typenum::U111, // beta = 0.0444 184 | U2500, 185 | typenum::U147, // r = 1.47 186 | typenum::U100, 187 | typenum::U20, // baselen = 20 188 | >; 189 | 190 | /// line 3 from table 191 | pub type SdigCode3 = SdigSpec< 192 | typenum::U89, // alpha = 0.178 193 | typenum::U500, 194 | typenum::U61, // beta = 0.061 195 | typenum::U1000, 196 | U1521, // r = 1.521 197 | typenum::U1000, 198 | typenum::U20, // baselen = 20 199 | >; 200 | 201 | /// line 4 from table 202 | pub type SdigCode4 = SdigSpec< 203 | typenum::U1, // alpha = 0.2 204 | typenum::U5, 205 | typenum::U41, // beta = 0.082 206 | typenum::U500, 207 | typenum::U41, // r = 1.64 208 | typenum::U25, 209 | typenum::U20, // baselen = 20 210 | >; 211 | 212 | /// line 5 from table 213 | pub type SdigCode5 = SdigSpec< 214 | typenum::U211, // alpha = 0.211 215 | typenum::U1000, 216 | typenum::U97, // beta = 0.097 217 | typenum::U1000, 218 | typenum::U202, // r = 1.616 219 | typenum::U125, 220 | typenum::U20, // baselen = 20 221 | >; 222 | 223 | /// line 6 from table 224 | pub type SdigCode6 = SdigSpec< 225 | typenum::U119, // alpha = 0.238 226 | typenum::U500, 227 | typenum::U241, // beta = 0.1205 228 | U2000, 229 | typenum::U43, // r = 1.72 230 | typenum::U25, 231 | typenum::U20, // baselen = 20 232 | >; 233 | -------------------------------------------------------------------------------- /lcpc-brakedown-pc/src/encode.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-brakedown-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | /*! encode a vector of length n using an expander code */ 11 | 12 | use ff::Field; 13 | use ndarray::{linalg::Dot, ArrayView}; 14 | use num_traits::Num; 15 | use sprs::{CsMat, MulAcc}; 16 | 17 | // given a set of precodes and postcodes, output length of codeword 18 | pub(super) fn codeword_length(precodes: &[CsMat], postcodes: &[CsMat]) -> usize 19 | where 20 | F: Field + Num, 21 | { 22 | assert!(!precodes.is_empty()); 23 | assert_eq!(precodes.len(), postcodes.len()); 24 | 25 | // input 26 | precodes[0].cols() 27 | // R-S result 28 | + postcodes.last().unwrap().cols() 29 | // precode outputs (except input to R-S, which is not part of codeword) 30 | + precodes.iter().take(precodes.len() - 1).map(|pc| pc.rows()).sum::() 31 | // postcode outputs 32 | + postcodes.iter().map(|pc| pc.rows()).sum::() 33 | } 34 | 35 | /// encode a vector given a code of corresponding length 36 | pub fn encode(mut xi: T, precodes: &[CsMat], postcodes: &[CsMat]) 37 | where 38 | F: Field + Num + MulAcc, 39 | T: AsMut<[F]>, 40 | { 41 | // check sizes 42 | assert_eq!(xi.as_mut().len(), codeword_length(precodes, postcodes)); 43 | 44 | // compute precodes all the way down 45 | let mut in_start = 0usize; 46 | for precode in precodes.iter().take(precodes.len() - 1) { 47 | // compute matrix-vector product 48 | let in_end = in_start + precode.cols(); 49 | let (in_arr, out_arr) = xi.as_mut().split_at_mut(in_end); 50 | out_arr[..precode.rows()].copy_from_slice( 51 | precode 52 | .dot(&ArrayView::from(&in_arr[in_start..])) 53 | .as_slice() 54 | .unwrap(), 55 | ); 56 | 57 | in_start = in_end; 58 | } 59 | 60 | // base-case code: Reed-Solomon 61 | let (mut in_start, mut out_start) = { 62 | // first, evaluate last precode into temporary storage 63 | let precode = precodes.last().unwrap(); 64 | let in_end = in_start + precode.cols(); 65 | let in_arr = precode 66 | .dot(&ArrayView::from(&xi.as_mut()[in_start..in_end])) 67 | .into_raw_vec(); 68 | 69 | // now evaluate Reed-Solomon code on the result 70 | let out_end = in_end + postcodes.last().unwrap().cols(); 71 | reed_solomon(in_arr.as_ref(), &mut xi.as_mut()[in_end..out_end]); 72 | 73 | (in_end + precode.rows(), out_end) 74 | }; 75 | 76 | for (precode, postcode) in precodes.iter().rev().zip(postcodes.iter().rev()) { 77 | // move input pointer backward 78 | in_start -= precode.rows(); 79 | 80 | // compute matrix-vector product 81 | let (in_arr, out_arr) = xi.as_mut().split_at_mut(out_start); 82 | out_arr[..postcode.rows()].copy_from_slice( 83 | postcode 84 | .dot(&ArrayView::from(&in_arr[in_start..])) 85 | .as_slice() 86 | .unwrap(), 87 | ); 88 | 89 | out_start += postcode.rows(); 90 | } 91 | 92 | assert_eq!(in_start, precodes[0].cols()); 93 | assert_eq!(out_start, xi.as_mut().len()); 94 | } 95 | 96 | // Compute Reed-Solomon encoding using Vandermonde matrix 97 | fn reed_solomon(xi: &[F], xo: &mut [F]) 98 | where 99 | F: Field, 100 | { 101 | let mut x = ::one(); 102 | for r in xo.as_mut().iter_mut() { 103 | *r = ::zero(); 104 | for j in (0..xi.len()).rev() { 105 | *r *= x; 106 | *r += xi[j]; 107 | } 108 | x += ::one(); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /lcpc-brakedown-pc/src/lib.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-brakedown-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | #![deny(missing_docs)] 10 | 11 | /*! 12 | sdig-pc is a polynomial commitment scheme from the SDIG expander code 13 | */ 14 | 15 | #![feature(test)] 16 | #[cfg(feature = "bench")] 17 | extern crate test; 18 | 19 | use codespec::{SdigCode3 as SdigCodeDflt, SdigSpecification}; 20 | use encode::{codeword_length, encode}; 21 | use matgen::generate; 22 | 23 | use ff::Field; 24 | use lcpc_2d::{ 25 | def_labels, n_degree_tests, FieldHash, LcCommit, LcEncoding, LcEvalProof, SizedField, 26 | }; 27 | use num_traits::Num; 28 | use sprs::{CsMat, MulAcc}; 29 | 30 | pub mod codespec; 31 | pub mod encode; 32 | pub mod matgen; 33 | 34 | #[cfg(all(test, feature = "bench"))] 35 | mod bench; 36 | #[cfg(any(test, feature = "bench"))] 37 | mod tests; 38 | 39 | /// Encoding definition for SDIG expander-based polycommit 40 | #[derive(Clone, Debug)] 41 | pub struct SdigEncodingS { 42 | n_per_row: usize, // number of inputs to the encoding 43 | n_cols: usize, // number of outputs from the encoding 44 | precodes: Vec>, 45 | postcodes: Vec>, 46 | _p: std::marker::PhantomData, 47 | } 48 | 49 | impl SdigEncodingS 50 | where 51 | Ft: Field + Num + SizedField, 52 | S: SdigSpecification, 53 | { 54 | const LAMBDA: usize = 128; 55 | 56 | // number of column openings required for soundness 57 | fn _n_col_opens() -> usize { 58 | let dist_ov_3 = S::dist() / 3f64; 59 | let den = (1f64 - dist_ov_3).log2(); 60 | (-(Self::LAMBDA as f64) / den).ceil() as usize 61 | } 62 | 63 | // number of degree tests required for soundness 64 | fn _n_degree_tests(n_cols: usize) -> usize { 65 | n_degree_tests(Self::LAMBDA, n_cols, Ft::FLOG2 as usize) 66 | } 67 | 68 | // shared between new and new_ml 69 | fn _new_from_np1(len: usize, np1: usize, seed: u64) -> Self { 70 | // n_per_row can't be greater than length! 71 | let np1 = if np1 > len { len } else { np1 }; 72 | 73 | let n_col_opens = Self::_n_col_opens(); 74 | let nr1 = (len + np1 - 1) / np1; 75 | let nd1 = Self::_n_degree_tests(np1 * 2); // approximately 76 | assert!(np1 * nr1 >= len); 77 | assert!(np1 * (nr1 - 1) < len); 78 | 79 | let np2 = np1 / 2; 80 | let nr2 = (len + np2 - 1) / np2; 81 | let nd2 = Self::_n_degree_tests(np2 * 2); // approximately 82 | assert!(np2 * nr2 >= len); 83 | assert!(np2 * (nr2 - 1) < len); 84 | 85 | let sz1 = n_col_opens * nr1 + (1 + nd1) * np1; 86 | let sz2 = n_col_opens * nr2 + (1 + nd2) * np2; 87 | let n_per_row = if sz1 < sz2 { np1 } else { np2 }; 88 | 89 | let (precodes, postcodes) = generate::(n_per_row, seed); 90 | assert_eq!(n_per_row, precodes[0].cols()); 91 | let n_cols = codeword_length(&precodes, &postcodes); 92 | Self { 93 | n_per_row, 94 | n_cols, 95 | precodes, 96 | postcodes, 97 | _p: std::marker::PhantomData::default(), 98 | } 99 | } 100 | 101 | /// Create a new SdigEncoding for a univariate polynomial with `len` coefficients 102 | /// using a random expander code generated with seed `seed`. 103 | pub fn new(len: usize, seed: u64) -> Self { 104 | // compute #cols, optimizing the communication cost 105 | let lncf = (Self::_n_col_opens() * len) as f64; 106 | // approximation of num_degree_tests 107 | let ndt = Self::_n_degree_tests(lncf.sqrt().ceil() as usize * 2) as f64; 108 | let np1 = (lncf / ndt).sqrt().ceil() as usize; 109 | Self::_new_from_np1(len, np1, seed) 110 | } 111 | 112 | /// Create a new SdigEncoding for a multilinear polynomial with `n_vars` variables 113 | /// (i.e., 2^`n_vars` monomials) using a random expander code generated with seed `seed`. 114 | pub fn new_ml(n_vars: usize, seed: u64) -> Self { 115 | let n_monomials = 1 << n_vars; 116 | let lncf = (Self::_n_col_opens() * n_monomials) as f64; 117 | // approximation of num_degree_tests 118 | let ndt = Self::_n_degree_tests(lncf.sqrt().ceil() as usize * 2) as f64; 119 | let np1 = ((lncf / ndt).sqrt().ceil() as usize) 120 | .checked_next_power_of_two() 121 | .unwrap(); 122 | Self::_new_from_np1(n_monomials, np1, seed) 123 | } 124 | 125 | /// Create a new SdigEncoding for a commitment with dimensions `n_per_row` and `n_cols` 126 | pub fn new_from_dims(n_per_row: usize, n_cols: usize, seed: u64) -> Self { 127 | let (precodes, postcodes) = generate::(n_per_row, seed); 128 | assert_eq!(n_per_row, precodes[0].cols()); 129 | assert_eq!(n_cols, codeword_length(&precodes, &postcodes)); 130 | Self { 131 | n_per_row, 132 | n_cols, 133 | precodes, 134 | postcodes, 135 | _p: std::marker::PhantomData::default(), 136 | } 137 | } 138 | } 139 | 140 | impl LcEncoding for SdigEncodingS 141 | where 142 | Ft: Field + FieldHash + MulAcc + Num + SizedField, 143 | S: SdigSpecification + std::fmt::Debug + std::clone::Clone + std::marker::Sync, 144 | { 145 | type F = Ft; 146 | type Err = std::io::Error; 147 | 148 | def_labels!(sdig_pc); 149 | 150 | fn encode>(&self, inp: T) -> Result<(), Self::Err> { 151 | encode(inp, &self.precodes, &self.postcodes); 152 | Ok(()) 153 | } 154 | 155 | fn get_dims(&self, len: usize) -> (usize, usize, usize) { 156 | let n_rows = (len + self.n_per_row - 1) / self.n_per_row; 157 | (n_rows, self.n_per_row, self.n_cols) 158 | } 159 | 160 | fn dims_ok(&self, n_per_row: usize, n_cols: usize) -> bool { 161 | let ok = n_per_row < n_cols; 162 | let np1 = n_per_row == self.n_per_row; 163 | let np2 = n_per_row == self.precodes[0].cols(); 164 | let nc1 = n_cols == self.n_cols; 165 | let nc2 = n_cols == codeword_length(&self.precodes, &self.postcodes); 166 | ok && np1 && np2 && nc1 && nc2 167 | } 168 | 169 | fn get_n_col_opens(&self) -> usize { 170 | Self::_n_col_opens() 171 | } 172 | 173 | fn get_n_degree_tests(&self) -> usize { 174 | Self::_n_degree_tests(self.n_cols) 175 | } 176 | } 177 | 178 | /// default encoding 179 | pub type SdigEncoding = SdigEncodingS; 180 | 181 | /// SDIG expander-based polynomial commitment 182 | pub type BrakedownCommit = LcCommit>; 183 | 184 | /// An evaluation proof for SDIG expander-based polynomial commitment 185 | pub type BrakedownEvalProof = LcEvalProof>; 186 | -------------------------------------------------------------------------------- /lcpc-brakedown-pc/src/matgen.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-brakedown-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | /*! generate a random code for a given n */ 11 | 12 | use crate::codespec::SdigSpecification; 13 | 14 | use ff::Field; 15 | use itertools::iterate; 16 | use lcpc_2d::SizedField; 17 | use num_traits::Num; 18 | use rand::{distributions::Uniform, Rng, SeedableRng}; 19 | use rand_chacha::ChaCha20Rng; 20 | use rayon::prelude::*; 21 | use sprs::CsMat; 22 | 23 | const fn ceil_muldiv(n: usize, num: usize, den: usize) -> usize { 24 | (n * num + den - 1) / den 25 | } 26 | 27 | /// Generate a random code from a given seed 28 | pub fn generate(n: usize, seed: u64) -> (Vec>, Vec>) 29 | where 30 | F: Field + Num + SizedField, 31 | S: SdigSpecification, 32 | { 33 | let (pre_dims, post_dims) = get_dims::(n, F::FLOG2 as f64); 34 | assert!(!pre_dims.is_empty()); 35 | 36 | let mut precodes = Vec::with_capacity(pre_dims.len()); 37 | let mut postcodes = Vec::with_capacity(pre_dims.len()); 38 | pre_dims[..] 39 | .par_iter() 40 | .zip(&post_dims[..]) 41 | .enumerate() 42 | .map(|(i, (&(ni, mi, cn), &(nip, mip, dn)))| { 43 | let mut rng = ChaCha20Rng::seed_from_u64(seed); 44 | rng.set_stream(i as u64); 45 | let precode = gen_code(ni, mi, cn, &mut rng); 46 | let postcode = gen_code(nip, mip, dn, &mut rng); 47 | (precode, postcode) 48 | }) 49 | .unzip_into_vecs(&mut precodes, &mut postcodes); 50 | 51 | (precodes, postcodes) 52 | } 53 | 54 | // compute dimensions for all of the matrices used by this code 55 | #[allow(clippy::type_complexity)] 56 | fn get_dims( 57 | n: usize, 58 | log2p: f64, 59 | ) -> (Vec<(usize, usize, usize)>, Vec<(usize, usize, usize)>) { 60 | use std::cmp::{max, min}; 61 | let baselen = S::baselen(); 62 | assert!(n > baselen); 63 | 64 | // figure out dimensions for the precode and postcode matrices 65 | let pre_dims = { 66 | let mut tmp: Vec<_> = iterate(n, |&ni| ceil_muldiv(ni, S::alpha_num(), S::alpha_den())) 67 | .take_while(|&ni| ni > baselen) 68 | .collect(); 69 | if let Some(&ni) = tmp.last() { 70 | let last = ceil_muldiv(ni, S::alpha_num(), S::alpha_den()); 71 | assert!(last <= baselen); 72 | tmp.push(last); 73 | } 74 | assert!(tmp.len() > 1); 75 | tmp[..] 76 | .windows(2) 77 | .map(|nm| { 78 | let ni = nm[0]; 79 | let mi = nm[1]; 80 | let cn = min( 81 | max( 82 | ceil_muldiv(ni, 32 * S::beta_num(), 25 * S::beta_den()), 83 | 4 + ceil_muldiv(ni, S::beta_num(), S::beta_den()), 84 | ), 85 | ((110f64 / (ni as f64) + S::cnst_cn_1()) / S::cnst_cn_2()).ceil() as usize, 86 | ); 87 | let cn = min(cn, mi); // can't generate more nonzero entries than there are columns 88 | (ni, mi, cn) 89 | }) 90 | .collect::>() 91 | }; 92 | 93 | let post_dims = pre_dims 94 | .iter() 95 | .map(|&(ni, mi, _)| { 96 | let niprime = ceil_muldiv(mi, S::r_num(), S::r_den()); 97 | let miprime = ceil_muldiv(ni, S::r_num(), S::r_den()) - ni - niprime; 98 | let tmp1 = ceil_muldiv(ni, 2 * S::beta_num(), S::beta_den()); // 2 * beta * ni 99 | let tmp2 = ceil_muldiv(ni, S::r_num(), S::r_den()) - ni + 110; // ni * (r - 1 + 110/ni) 100 | let dn = min( 101 | tmp1 + (tmp2 as f64 / log2p).ceil() as usize, 102 | ((110f64 / (ni as f64) + S::cnst_dn_1()) / S::cnst_dn_2()).ceil() as usize, 103 | ); 104 | let dn = min(dn, miprime); // can't generate more nonzero entries than there are columns 105 | (niprime, miprime, dn) 106 | }) 107 | .collect::>(); 108 | 109 | assert_eq!(pre_dims.len(), post_dims.len()); 110 | (pre_dims, post_dims) 111 | } 112 | 113 | // generate a code matrix of a given size with specified row density 114 | fn gen_code(n: usize, m: usize, d: usize, mut rng: R) -> CsMat 115 | where 116 | F: Field + Num, 117 | R: Rng, 118 | { 119 | let dist = Uniform::new(0, m); 120 | let mut data = Vec::::with_capacity(d * n); 121 | let mut idxs = Vec::::with_capacity(d * n); 122 | let mut ptrs = Vec::::with_capacity(1 + n); 123 | ptrs.push(0); // ptrs always starts with 0 124 | 125 | for _ in 0..n { 126 | // for each row, sample d random nonzero columns (without replacement) 127 | let cols = { 128 | /* 129 | let mut nub = HashSet::new(); 130 | let mut tmp = (&mut rng) 131 | .sample_iter(&dist) 132 | .filter(|&x| { 133 | if nub.contains(&x) { 134 | false 135 | } else { 136 | nub.insert(x); 137 | true 138 | } 139 | }) 140 | .take(d) 141 | .collect::>(); 142 | */ 143 | // for small d, the quadratic approach is almost certainly faster 144 | let mut tmp = Vec::with_capacity(d); 145 | assert_eq!( 146 | d, 147 | (&mut rng) 148 | .sample_iter(&dist) 149 | .filter(|&x| { 150 | if tmp.contains(&x) { 151 | false 152 | } else { 153 | tmp.push(x); 154 | true 155 | } 156 | }) 157 | .take(d) 158 | .count() 159 | ); 160 | tmp.sort_unstable(); // need to sort to supply to new_csc below 161 | tmp 162 | }; 163 | assert_eq!(d, cols.len()); 164 | 165 | // sample random elements for each column 166 | let mut last = m + 1; 167 | for &col in &cols[..] { 168 | // detect and skip repeats 169 | if col == last { 170 | continue; 171 | } 172 | last = col; 173 | 174 | let val = { 175 | let mut tmp = F::random(&mut rng); 176 | while ::is_zero(&tmp).into() { 177 | tmp = F::random(&mut rng); 178 | } 179 | tmp 180 | }; 181 | idxs.push(col); 182 | data.push(val); 183 | } 184 | ptrs.push(data.len()); 185 | } 186 | 187 | CsMat::new_csc((m, n), ptrs, idxs, data) 188 | } 189 | -------------------------------------------------------------------------------- /lcpc-brakedown-pc/src/tests.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-brakedown-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | use super::{BrakedownCommit, SdigEncoding, SdigEncodingS}; 11 | 12 | use blake3::Hasher as Blake3; 13 | use ff::Field; 14 | use itertools::iterate; 15 | use lcpc_2d::{LcCommit, LcEncoding}; 16 | use lcpc_test_fields::{ft255::*, ft63::*, random_coeffs}; 17 | use merlin::Transcript; 18 | use ndarray::{linalg::Dot, Array}; 19 | use rand::{thread_rng, Rng, SeedableRng}; 20 | use rand_chacha::ChaCha20Rng; 21 | use sprs::{CsMat, TriMat}; 22 | use std::iter::repeat_with; 23 | 24 | #[test] 25 | fn col_opens() { 26 | use super::codespec::{SdigCode1, SdigCode2, SdigCode3, SdigCode4, SdigCode5, SdigCode6}; 27 | 28 | println!("1: {}", SdigEncodingS::::_n_col_opens()); 29 | println!("2: {}", SdigEncodingS::::_n_col_opens()); 30 | println!("3: {}", SdigEncodingS::::_n_col_opens()); 31 | println!("4: {}", SdigEncodingS::::_n_col_opens()); 32 | println!("5: {}", SdigEncodingS::::_n_col_opens()); 33 | println!("6: {}", SdigEncodingS::::_n_col_opens()); 34 | } 35 | 36 | #[test] 37 | fn sprs_playground() { 38 | let mut rng = thread_rng(); 39 | let n_rows = 65537; 40 | let n_cols = 32749; 41 | 42 | let m: CsMat<_> = { 43 | let mut tmp = TriMat::new((n_rows, n_cols)); 44 | for i in 0..n_rows { 45 | let col1 = rng.gen_range(0..n_cols); 46 | let col2 = { 47 | let mut tmp = rng.gen_range(0..n_cols); 48 | while tmp == col1 { 49 | tmp = rng.gen_range(0..n_cols); 50 | } 51 | tmp 52 | }; 53 | tmp.add_triplet(i, col1, Ft63::random(&mut rng)); 54 | tmp.add_triplet(i, col2, Ft63::random(&mut rng)); 55 | } 56 | // to_csr appears to be considerably faster than to_csc 57 | // (note that because of the transpose, we end up with csc in the end) 58 | tmp.to_csr().transpose_into() 59 | }; 60 | 61 | let v = { 62 | let mut tmp = Vec::with_capacity(n_rows); 63 | for _ in 0..n_rows { 64 | tmp.push(Ft63::random(&mut rng)); 65 | } 66 | Array::from(tmp) 67 | }; 68 | 69 | let mut t = Ft63::zero(); 70 | for i in 0..10 { 71 | let mv = m.dot(&v); 72 | t += mv[i % n_cols]; 73 | } 74 | println!("{:?}", t); 75 | } 76 | 77 | #[test] 78 | fn test_matgen_encode() { 79 | let mut rng = thread_rng(); 80 | use super::codespec::SdigCode3 as TestCode; 81 | use super::encode::{codeword_length, encode}; 82 | use super::matgen::generate; 83 | 84 | let n = 256usize + (rng.gen::() % 4096); 85 | let (precodes, postcodes) = generate::(n, 0u64); 86 | 87 | let xi_len = codeword_length(&precodes, &postcodes); 88 | let mut xi = Vec::with_capacity(xi_len); 89 | for _ in 0..xi_len { 90 | xi.push(Ft63::random(&mut rng)); 91 | } 92 | encode(&mut xi, &precodes, &postcodes); 93 | } 94 | 95 | const N_ITERS: usize = 10; 96 | #[test] 97 | #[ignore] 98 | fn prove_verify_size_bench() { 99 | use super::codespec::SdigCode3 as TestCode; 100 | use ff::PrimeField; 101 | use std::time::Instant; 102 | 103 | for lgl in (13..=29).step_by(2) { 104 | // commit to random poly of specified size 105 | let coeffs = random_coeffs(lgl); 106 | let enc = SdigEncodingS::::new(coeffs.len(), 0); 107 | let comm = LcCommit::::commit(&coeffs, &enc).unwrap(); 108 | let root = comm.get_root(); 109 | 110 | // evaluate the random polynomial we just generated at a random point x 111 | let x = Ft255::random(&mut rand::thread_rng()); 112 | 113 | // compute the outer and inner tensors for powers of x 114 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 115 | // really matter --- the only difference from a multilinear is the 116 | // way we compute outer_tensor and inner_tensor from the eval point 117 | let inner_tensor: Vec = iterate(Ft255::one(), |&v| v * x) 118 | .take(comm.get_n_per_row()) 119 | .collect(); 120 | let outer_tensor: Vec = { 121 | let xr = x * inner_tensor.last().unwrap(); 122 | iterate(Ft255::one(), |&v| v * xr) 123 | .take(comm.get_n_rows()) 124 | .collect() 125 | }; 126 | 127 | let mut xxx = 0u8; 128 | let now = Instant::now(); 129 | for i in 0..N_ITERS { 130 | let mut tr = Transcript::new(b"test transcript"); 131 | tr.append_message(b"polycommit", root.as_ref()); 132 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 133 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap(); 134 | let encoded: Vec = bincode::serialize(&pf).unwrap(); 135 | xxx ^= encoded[i]; 136 | } 137 | let pf_dur = now.elapsed().as_nanos() / N_ITERS as u128; 138 | 139 | let mut tr = Transcript::new(b"test transcript"); 140 | tr.append_message(b"polycommit", root.as_ref()); 141 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 142 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap(); 143 | let encoded: Vec = bincode::serialize(&pf).unwrap(); 144 | let len = encoded.len(); 145 | 146 | let now = Instant::now(); 147 | for i in 0..N_ITERS { 148 | let mut tr = Transcript::new(b"test transcript"); 149 | tr.append_message(b"polycommit", root.as_ref()); 150 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 151 | xxx ^= pf 152 | .verify( 153 | root.as_ref(), 154 | &outer_tensor[..], 155 | &inner_tensor[..], 156 | &enc, 157 | &mut tr, 158 | ) 159 | .unwrap() 160 | .to_repr() 161 | .as_ref()[i]; 162 | } 163 | let vf_dur = now.elapsed().as_nanos() / N_ITERS as u128; 164 | 165 | println!("{}: {} {} {} {}", lgl, pf_dur, vf_dur, len, xxx); 166 | } 167 | } 168 | 169 | #[test] 170 | #[ignore] 171 | fn rough_bench() { 172 | use super::codespec::SdigCode3 as TestCode; 173 | use std::time::Instant; 174 | 175 | for lgl in (13..=29).step_by(2) { 176 | // commit to random poly of specified size 177 | let coeffs = random_coeffs(lgl); 178 | let enc = SdigEncodingS::::new(coeffs.len(), 0); 179 | let mut xxx = 0u8; 180 | 181 | let now = Instant::now(); 182 | for i in 0..N_ITERS { 183 | let comm = LcCommit::::commit(&coeffs, &enc).unwrap(); 184 | let root = comm.get_root(); 185 | xxx ^= root.as_ref()[i]; 186 | } 187 | let dur = now.elapsed().as_nanos() / N_ITERS as u128; 188 | println!("{}: {} {:?}", lgl, dur, xxx); 189 | } 190 | } 191 | 192 | #[test] 193 | fn end_to_end_one_proof() { 194 | // commit to a random polynomial at a random rate 195 | let coeffs = get_random_coeffs(); 196 | let enc = SdigEncoding::new(coeffs.len(), 0); 197 | let comm = BrakedownCommit::::commit(&coeffs, &enc).unwrap(); 198 | // this is the polynomial commitment 199 | let root = comm.get_root(); 200 | 201 | // evaluate the random polynomial we just generated at a random point x 202 | let x = Ft63::random(&mut rand::thread_rng()); 203 | 204 | // compute the outer and inner tensors for powers of x 205 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 206 | // really matter --- the only difference from a multilinear is the 207 | // way we compute outer_tensor and inner_tensor from the eval point 208 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 209 | .take(comm.get_n_per_row()) 210 | .collect(); 211 | let outer_tensor: Vec = { 212 | let xr = x * inner_tensor.last().unwrap(); 213 | iterate(Ft63::one(), |&v| v * xr) 214 | .take(comm.get_n_rows()) 215 | .collect() 216 | }; 217 | 218 | // compute an evaluation proof 219 | let mut tr1 = Transcript::new(b"test transcript"); 220 | tr1.append_message(b"polycommit", root.as_ref()); 221 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 222 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 223 | 224 | // verify it and finish evaluation 225 | let mut tr2 = Transcript::new(b"test transcript"); 226 | tr2.append_message(b"polycommit", root.as_ref()); 227 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 228 | let enc2 = SdigEncoding::new_from_dims(pf.get_n_per_row(), pf.get_n_cols(), 0); 229 | pf.verify( 230 | root.as_ref(), 231 | &outer_tensor[..], 232 | &inner_tensor[..], 233 | &enc2, 234 | &mut tr2, 235 | ) 236 | .unwrap(); 237 | } 238 | 239 | #[test] 240 | fn end_to_end_one_proof_ml() { 241 | let mut rng = rand::thread_rng(); 242 | 243 | // commit to a random polynomial at a random rate 244 | let lgl = 5 + rng.gen::() % 16; 245 | let coeffs = random_coeffs(lgl); 246 | let enc = SdigEncoding::new_ml(lgl, 0); 247 | let comm = BrakedownCommit::::commit(&coeffs, &enc).unwrap(); 248 | // this is the polynomial commitment 249 | let root = comm.get_root(); 250 | assert_eq!(1 << lgl, comm.get_n_rows() * comm.get_n_per_row()); 251 | 252 | // evaluate the random polynomial we just generated at a random point x 253 | let x = Ft63::random(&mut rand::thread_rng()); 254 | 255 | // compute the outer and inner tensors for powers of x 256 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 257 | // really matter --- the only difference from a multilinear is the 258 | // way we compute outer_tensor and inner_tensor from the eval point 259 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 260 | .take(comm.get_n_per_row()) 261 | .collect(); 262 | let outer_tensor: Vec = { 263 | let xr = x * inner_tensor.last().unwrap(); 264 | iterate(Ft63::one(), |&v| v * xr) 265 | .take(comm.get_n_rows()) 266 | .collect() 267 | }; 268 | 269 | // compute an evaluation proof 270 | let mut tr1 = Transcript::new(b"test transcript"); 271 | tr1.append_message(b"polycommit", root.as_ref()); 272 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 273 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 274 | 275 | // verify it and finish evaluation 276 | let mut tr2 = Transcript::new(b"test transcript"); 277 | tr2.append_message(b"polycommit", root.as_ref()); 278 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 279 | let enc2 = SdigEncoding::new_from_dims(pf.get_n_per_row(), pf.get_n_cols(), 0); 280 | pf.verify( 281 | root.as_ref(), 282 | &outer_tensor[..], 283 | &inner_tensor[..], 284 | &enc2, 285 | &mut tr2, 286 | ) 287 | .unwrap(); 288 | } 289 | 290 | #[test] 291 | fn end_to_end_two_proofs() { 292 | // commit to a random polynomial at a random rate 293 | let coeffs = get_random_coeffs(); 294 | let enc = SdigEncoding::new(coeffs.len(), 1); 295 | let comm = BrakedownCommit::::commit(&coeffs, &enc).unwrap(); 296 | // this is the polynomial commitment 297 | let root = comm.get_root(); 298 | 299 | // evaluate the random polynomial we just generated at a random point x 300 | let x = Ft63::random(&mut rand::thread_rng()); 301 | 302 | // compute the outer and inner tensors for powers of x 303 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 304 | // really matter --- the only difference from a multilinear is the 305 | // way we compute outer_tensor and inner_tensor from the eval point 306 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 307 | .take(comm.get_n_per_row()) 308 | .collect(); 309 | let outer_tensor: Vec = { 310 | let xr = x * inner_tensor.last().unwrap(); 311 | iterate(Ft63::one(), |&v| v * xr) 312 | .take(comm.get_n_rows()) 313 | .collect() 314 | }; 315 | 316 | // compute an evaluation proof 317 | let mut tr1 = Transcript::new(b"test transcript"); 318 | tr1.append_message(b"polycommit", root.as_ref()); 319 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 320 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 321 | 322 | let challenge_after_first_proof_prover = { 323 | let mut key: ::Seed = Default::default(); 324 | tr1.challenge_bytes(b"ligero-pc//challenge", &mut key); 325 | let mut deg_test_rng = ChaCha20Rng::from_seed(key); 326 | Ft63::random(&mut deg_test_rng) 327 | }; 328 | 329 | // produce a second proof with the same transcript 330 | tr1.append_message(b"polycommit", root.as_ref()); 331 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 332 | let pf2 = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 333 | 334 | // verify it and finish evaluation 335 | let mut tr2 = Transcript::new(b"test transcript"); 336 | tr2.append_message(b"polycommit", root.as_ref()); 337 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 338 | let enc2 = SdigEncoding::new_from_dims(pf.get_n_per_row(), pf.get_n_cols(), 1); 339 | let res = pf 340 | .verify( 341 | root.as_ref(), 342 | &outer_tensor[..], 343 | &inner_tensor[..], 344 | &enc2, 345 | &mut tr2, 346 | ) 347 | .unwrap(); 348 | 349 | let challenge_after_first_proof_verifier = { 350 | let mut key: ::Seed = Default::default(); 351 | tr2.challenge_bytes(b"ligero-pc//challenge", &mut key); 352 | let mut deg_test_rng = ChaCha20Rng::from_seed(key); 353 | Ft63::random(&mut deg_test_rng) 354 | }; 355 | assert_eq!( 356 | challenge_after_first_proof_prover, 357 | challenge_after_first_proof_verifier 358 | ); 359 | 360 | // second proof verification with the same transcript 361 | tr2.append_message(b"polycommit", root.as_ref()); 362 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 363 | let enc3 = SdigEncoding::new_from_dims(pf2.get_n_per_row(), pf2.get_n_cols(), 1); 364 | let res2 = pf2 365 | .verify( 366 | root.as_ref(), 367 | &outer_tensor[..], 368 | &inner_tensor[..], 369 | &enc3, 370 | &mut tr2, 371 | ) 372 | .unwrap(); 373 | 374 | assert_eq!(res, res2); 375 | } 376 | 377 | fn get_random_coeffs() -> Vec { 378 | let mut rng = rand::thread_rng(); 379 | 380 | let lgl = 16 + rng.gen::() % 8; 381 | let len_base = 1 << (lgl - 1); 382 | let len = len_base + (rng.gen::() % len_base); 383 | 384 | repeat_with(|| Ft63::random(&mut rng)).take(len).collect() 385 | } 386 | -------------------------------------------------------------------------------- /lcpc-ligero-pc/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "lcpc-ligero-pc" 3 | version = "0.1.1" 4 | authors = ["kwantam "] 5 | edition = "2018" 6 | description = "polynomial commitment scheme from R-S codes, as in Ligero (CCS '17)" 7 | license = "Apache-2.0" 8 | repository = "https://github.com/conroi/lcpc" 9 | 10 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 11 | 12 | [dependencies] 13 | fffft = "0.4" 14 | lcpc-2d = { path = "../lcpc-2d", version = "0.1.1" } 15 | typenum = "1.13" 16 | 17 | [dev-dependencies] 18 | bincode = "1.3" 19 | blake3 = { version = "1", features = ["traits-preview"] } 20 | ff = "0.12" 21 | itertools = "0.10" 22 | merlin = "2.0" 23 | paste = "1.0" 24 | rand = "0.8" 25 | rand_chacha = "0.3" 26 | lcpc-test-fields = { path = "../lcpc-test-fields", version = "0.1.1" } 27 | 28 | [features] 29 | bench = [] 30 | isz = [] 31 | hlf = [] 32 | -------------------------------------------------------------------------------- /lcpc-ligero-pc/README.md: -------------------------------------------------------------------------------- 1 | # ligero-pc 2 | 3 | Polynomial commitment scheme based on [Ligero]. 4 | 5 | ## bibilography 6 | 7 | Ames, Hazay, Ishai, Venkitasubramaniam. "Ligero: Lightweight sublinear 8 | arguments without a trusted setup." Proc. ACM CCS, 2017. PDF: [Ligero] 9 | 10 | [Ligero]: https://acmccs.github.io/papers/p2087-amesA.pdf 11 | 12 | ## license 13 | 14 | Copyright 2021 Riad S. Wahby 15 | 16 | Licensed under the Apache License, Version 2.0 (the "License"); 17 | you may not use this file except in compliance with the License. 18 | You may obtain a copy of the License at 19 | 20 | http://www.apache.org/licenses/LICENSE-2.0 21 | 22 | Unless required by applicable law or agreed to in writing, software 23 | distributed under the License is distributed on an "AS IS" BASIS, 24 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 25 | See the License for the specific language governing permissions and 26 | limitations under the License. 27 | 28 | -------------------------------------------------------------------------------- /lcpc-ligero-pc/src/bench.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-ligero-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | use super::LigeroEncodingRho; 11 | 12 | use blake3::{Hasher as Blake3, traits::digest::Digest}; 13 | use fffft::FieldFFT; 14 | use itertools::iterate; 15 | use lcpc_2d::{FieldHash, LcCommit, LcEncoding, SizedField}; 16 | use merlin::Transcript; 17 | use test::{black_box, Bencher}; 18 | use lcpc_test_fields::{def_bench, ft127::*, ft255::*, random_coeffs}; 19 | use typenum::{Unsigned, U39 as TLo}; 20 | 21 | type THi = >::Output; 22 | 23 | fn _commit_bench(b: &mut Bencher, log_len: usize) 24 | where 25 | D: Digest, 26 | Ft: FieldFFT + FieldHash + SizedField, 27 | Rn: Unsigned + std::fmt::Debug + std::marker::Sync, 28 | Rd: Unsigned + std::fmt::Debug + std::marker::Sync, 29 | { 30 | let coeffs = random_coeffs(log_len); 31 | let enc = LigeroEncodingRho::::new(coeffs.len()); 32 | 33 | b.iter(|| { 34 | black_box(LcCommit::::commit(&coeffs, &enc).unwrap()); 35 | }); 36 | } 37 | 38 | fn commit_bench(b: &mut Bencher, log_len: usize) 39 | where 40 | D: Digest, 41 | Ft: FieldFFT + FieldHash + SizedField, 42 | { 43 | _commit_bench::(b, log_len); 44 | } 45 | 46 | fn commit_isz_bench(b: &mut Bencher, log_len: usize) 47 | where 48 | D: Digest, 49 | Ft: FieldFFT + FieldHash + SizedField, 50 | { 51 | _commit_bench::(b, log_len); 52 | } 53 | 54 | fn _prove_bench(b: &mut Bencher, log_len: usize) 55 | where 56 | D: Digest, 57 | Ft: FieldFFT + FieldHash + SizedField, 58 | Rn: Unsigned + std::fmt::Debug + std::marker::Sync, 59 | Rd: Unsigned + std::fmt::Debug + std::marker::Sync, 60 | { 61 | let coeffs = random_coeffs(log_len); 62 | let enc = LigeroEncodingRho::::new(coeffs.len()); 63 | let comm = LcCommit::::commit(&coeffs, &enc).unwrap(); 64 | 65 | // random point to eval at 66 | let x = Ft::random(&mut rand::thread_rng()); 67 | let inner_tensor: Vec = iterate(Ft::one(), |&v| v * x) 68 | .take(comm.get_n_per_row()) 69 | .collect(); 70 | let outer_tensor: Vec = { 71 | let xr = x * inner_tensor.last().unwrap(); 72 | iterate(Ft::one(), |&v| v * xr) 73 | .take(comm.get_n_rows()) 74 | .collect() 75 | }; 76 | 77 | b.iter(|| { 78 | let mut tr = Transcript::new(b"bench transcript"); 79 | tr.append_message(b"polycommit", comm.get_root().as_ref()); 80 | tr.append_message(b"rate", &0.25f64.to_be_bytes()[..]); 81 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 82 | tr.append_message( 83 | b"ndegs", 84 | &(enc.get_n_degree_tests() as u64).to_be_bytes()[..], 85 | ); 86 | black_box(comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap()); 87 | }); 88 | } 89 | 90 | fn prove_bench(b: &mut Bencher, log_len: usize) 91 | where 92 | D: Digest, 93 | Ft: FieldFFT + FieldHash + SizedField, 94 | { 95 | _prove_bench::(b, log_len); 96 | } 97 | 98 | fn prove_isz_bench(b: &mut Bencher, log_len: usize) 99 | where 100 | D: Digest, 101 | Ft: FieldFFT + FieldHash + SizedField, 102 | { 103 | _prove_bench::(b, log_len); 104 | } 105 | 106 | fn _verify_bench(b: &mut Bencher, log_len: usize) 107 | where 108 | D: Digest, 109 | Ft: FieldFFT + FieldHash + SizedField, 110 | Rn: Unsigned + std::fmt::Debug + std::marker::Sync, 111 | Rd: Unsigned + std::fmt::Debug + std::marker::Sync, 112 | { 113 | let coeffs = random_coeffs(log_len); 114 | let enc = LigeroEncodingRho::::new(coeffs.len()); 115 | let comm = LcCommit::::commit(&coeffs, &enc).unwrap(); 116 | 117 | // random point to eval at 118 | let x = Ft::random(&mut rand::thread_rng()); 119 | let inner_tensor: Vec = iterate(Ft::one(), |&v| v * x) 120 | .take(comm.get_n_per_row()) 121 | .collect(); 122 | let outer_tensor: Vec = { 123 | let xr = x * inner_tensor.last().unwrap(); 124 | iterate(Ft::one(), |&v| v * xr) 125 | .take(comm.get_n_rows()) 126 | .collect() 127 | }; 128 | 129 | let mut tr = Transcript::new(b"bench transcript"); 130 | tr.append_message(b"polycommit", comm.get_root().as_ref()); 131 | tr.append_message(b"rate", &0.25f64.to_be_bytes()[..]); 132 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 133 | tr.append_message( 134 | b"ndegs", 135 | &(enc.get_n_degree_tests() as u64).to_be_bytes()[..], 136 | ); 137 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap(); 138 | let root = comm.get_root(); 139 | 140 | b.iter(|| { 141 | let mut tr = Transcript::new(b"bench transcript"); 142 | tr.append_message(b"polycommit", comm.get_root().as_ref()); 143 | tr.append_message(b"rate", &0.25f64.to_be_bytes()[..]); 144 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 145 | tr.append_message( 146 | b"ndegs", 147 | &(enc.get_n_degree_tests() as u64).to_be_bytes()[..], 148 | ); 149 | black_box( 150 | pf.verify( 151 | root.as_ref(), 152 | &outer_tensor[..], 153 | &inner_tensor[..], 154 | &enc, 155 | &mut tr, 156 | ) 157 | .unwrap(), 158 | ); 159 | }); 160 | } 161 | 162 | fn verify_bench(b: &mut Bencher, log_len: usize) 163 | where 164 | D: Digest, 165 | Ft: FieldFFT + FieldHash + SizedField, 166 | { 167 | _verify_bench::(b, log_len); 168 | } 169 | 170 | fn verify_isz_bench(b: &mut Bencher, log_len: usize) 171 | where 172 | D: Digest, 173 | Ft: FieldFFT + FieldHash + SizedField, 174 | { 175 | _verify_bench::(b, log_len); 176 | } 177 | 178 | def_bench!(commit, Ft127, Blake3, 16); 179 | def_bench!(commit, Ft127, Blake3, 20); 180 | def_bench!(commit, Ft127, Blake3, 24); 181 | 182 | def_bench!(prove, Ft127, Blake3, 16); 183 | def_bench!(prove, Ft127, Blake3, 20); 184 | def_bench!(prove, Ft127, Blake3, 24); 185 | 186 | def_bench!(verify, Ft127, Blake3, 16); 187 | def_bench!(verify, Ft127, Blake3, 20); 188 | def_bench!(verify, Ft127, Blake3, 24); 189 | 190 | def_bench!(commit, Ft255, Blake3, 16); 191 | def_bench!(commit, Ft255, Blake3, 20); 192 | def_bench!(commit, Ft255, Blake3, 24); 193 | 194 | def_bench!(prove, Ft255, Blake3, 16); 195 | def_bench!(prove, Ft255, Blake3, 20); 196 | def_bench!(prove, Ft255, Blake3, 24); 197 | 198 | def_bench!(verify, Ft255, Blake3, 16); 199 | def_bench!(verify, Ft255, Blake3, 20); 200 | def_bench!(verify, Ft255, Blake3, 24); 201 | 202 | def_bench!(commit_isz, Ft255, Blake3, 16); 203 | def_bench!(commit_isz, Ft255, Blake3, 20); 204 | def_bench!(commit_isz, Ft255, Blake3, 24); 205 | 206 | def_bench!(prove_isz, Ft255, Blake3, 16); 207 | def_bench!(prove_isz, Ft255, Blake3, 20); 208 | def_bench!(prove_isz, Ft255, Blake3, 24); 209 | 210 | def_bench!(verify_isz, Ft255, Blake3, 16); 211 | def_bench!(verify_isz, Ft255, Blake3, 20); 212 | def_bench!(verify_isz, Ft255, Blake3, 24); 213 | -------------------------------------------------------------------------------- /lcpc-ligero-pc/src/lib.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-ligero-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | #![deny(missing_docs)] 10 | 11 | /*! 12 | ligero-pc is a polynomial commitment based on R-S codes, from Ligero 13 | */ 14 | 15 | #![feature(test)] 16 | #[cfg(feature = "bench")] 17 | extern crate test; 18 | 19 | use fffft::{FFTError, FFTPrecomp, FieldFFT}; 20 | use lcpc_2d::{ 21 | def_labels, n_degree_tests, FieldHash, LcCommit, LcEncoding, LcEvalProof, SizedField, 22 | }; 23 | use typenum::{Unsigned, U1, U2}; 24 | 25 | #[cfg(all(test, feature = "bench"))] 26 | mod bench; 27 | #[cfg(any(test, feature = "bench"))] 28 | mod tests; 29 | 30 | /// Encoding definition for Ligero-based polycommit 31 | #[derive(Clone, Debug)] 32 | pub struct LigeroEncodingRho { 33 | n_per_row: usize, // number of inputs to the encoding 34 | n_cols: usize, // number of outputs from the encoding 35 | pc: FFTPrecomp, 36 | _p: std::marker::PhantomData<(Rn, Rd)>, 37 | } 38 | 39 | impl LigeroEncodingRho 40 | where 41 | Ft: FieldFFT + SizedField, 42 | Rn: Unsigned + std::fmt::Debug + std::marker::Sync, 43 | Rd: Unsigned + std::fmt::Debug + std::marker::Sync, 44 | { 45 | const LAMBDA: usize = 128; 46 | 47 | fn _rho_num() -> usize { 48 | Rn::to_usize() 49 | } 50 | 51 | fn _rho_den() -> usize { 52 | Rd::to_usize() 53 | } 54 | 55 | fn _rho() -> f64 { 56 | assert!(Self::_rho_num() < Self::_rho_den()); 57 | Self::_rho_num() as f64 / Self::_rho_den() as f64 58 | } 59 | 60 | // number of column openings required for soundness 61 | fn _n_col_opens() -> usize { 62 | let den = ((1f64 + Self::_rho()) / 2f64).log2(); 63 | (-(Self::LAMBDA as f64) / den).ceil() as usize 64 | } 65 | 66 | fn _n_degree_tests(n_cols: usize) -> usize { 67 | n_degree_tests(Self::LAMBDA, n_cols, Ft::FLOG2 as usize) 68 | } 69 | 70 | fn _get_dims(len: usize) -> Option<(usize, usize, usize)> { 71 | // compute #cols, which must be a power of 2 because of FFT 72 | let n_col_opens = Self::_n_col_opens(); 73 | let lncf = (n_col_opens * len) as f64; 74 | // approximation of num_degree_tests 75 | let ndt = Self::_n_degree_tests((lncf.sqrt() / Self::_rho()).ceil() as usize) as f64; 76 | let nc1 = (((lncf / ndt).sqrt() / Self::_rho()).ceil() as usize) 77 | .checked_next_power_of_two() 78 | .and_then(|nc| { 79 | if nc > (1 << ::S) { 80 | None 81 | } else { 82 | Some(nc) 83 | } 84 | })?; 85 | 86 | // minimize nr subject to #cols and RHO 87 | let np1 = nc1 * Self::_rho_num() / Self::_rho_den(); 88 | let nr1 = (len + np1 - 1) / np1; 89 | let nd1 = Self::_n_degree_tests(nc1); 90 | //assert!(np1.is_power_of_two()); 91 | assert!(np1 * nr1 >= len); 92 | assert!(np1 * (nr1 - 1) < len); 93 | 94 | let nc2 = nc1 / 2; 95 | let np2 = np1 / 2; 96 | let nr2 = (len + np2 - 1) / np2; 97 | let nd2 = Self::_n_degree_tests(nc2); 98 | //assert!(np2.is_power_of_two()); 99 | assert!(nc2.is_power_of_two()); 100 | assert!(np2 * nr2 >= len); 101 | assert!(np2 * (nr2 - 1) < len); 102 | 103 | let sz1 = n_col_opens * nr1 + (1 + nd1) * np1; 104 | let sz2 = n_col_opens * nr2 + (1 + nd2) * np2; 105 | let (nr, np, nc) = if sz1 < sz2 { 106 | (nr1, np1, nc1) 107 | } else { 108 | (nr2, np2, nc2) 109 | }; 110 | 111 | Some((nr, np, nc)) 112 | } 113 | 114 | fn _dims_ok(n_per_row: usize, n_cols: usize) -> bool { 115 | let sz = n_per_row < n_cols; 116 | let pow = n_cols.is_power_of_two(); 117 | sz && pow 118 | } 119 | 120 | /// Create a new LigeroEncoding for a univariate polynomial with `len` coefficients 121 | pub fn new(len: usize) -> Self { 122 | let (_, n_per_row, n_cols) = Self::_get_dims(len).unwrap(); 123 | Self::new_from_dims(n_per_row, n_cols) 124 | } 125 | 126 | /// Create a new LigeroEncoding for a multilinear polynomial with `n_vars` variables 127 | /// (i.e., 2^`n_vars` monomials). 128 | pub fn new_ml(n_vars: usize) -> Self { 129 | let n_monomials = 1 << n_vars; 130 | let (n_rows, n_per_row, n_cols) = Self::_get_dims(n_monomials).unwrap(); 131 | assert!(n_rows.is_power_of_two()); 132 | assert!(n_per_row.is_power_of_two()); 133 | assert_eq!(n_rows * n_per_row, n_monomials); 134 | Self::new_from_dims(n_per_row, n_cols) 135 | } 136 | 137 | /// Create a new LigeroEncoding for a commitment with dimensions `n_per_row` and `n_cols` 138 | pub fn new_from_dims(n_per_row: usize, n_cols: usize) -> Self { 139 | assert!(Self::_dims_ok(n_per_row, n_cols)); 140 | let pc = ::precomp_fft(n_cols).unwrap(); 141 | assert_eq!(n_cols, 1 << pc.get_log_len()); 142 | Self { 143 | n_per_row, 144 | n_cols, 145 | pc, 146 | _p: std::marker::PhantomData::default(), 147 | } 148 | } 149 | } 150 | 151 | impl LcEncoding for LigeroEncodingRho 152 | where 153 | Ft: FieldFFT + FieldHash + SizedField, 154 | Rn: Unsigned + std::fmt::Debug + std::marker::Sync, 155 | Rd: Unsigned + std::fmt::Debug + std::marker::Sync, 156 | { 157 | type F = Ft; 158 | type Err = FFTError; 159 | 160 | def_labels!(ligero_pc); 161 | 162 | fn encode>(&self, inp: T) -> Result<(), FFTError> { 163 | ::fft_io_pc(inp, &self.pc) 164 | } 165 | 166 | fn get_dims(&self, len: usize) -> (usize, usize, usize) { 167 | let n_rows = (len + self.n_per_row - 1) / self.n_per_row; 168 | (n_rows, self.n_per_row, self.n_cols) 169 | } 170 | 171 | fn dims_ok(&self, n_per_row: usize, n_cols: usize) -> bool { 172 | let ok = Self::_dims_ok(n_per_row, n_cols); 173 | let pc = n_cols == (1 << self.pc.get_log_len()); 174 | let np = n_per_row == self.n_per_row; 175 | let nc = n_cols == self.n_cols; 176 | ok && pc && np && nc 177 | } 178 | 179 | fn get_n_col_opens(&self) -> usize { 180 | Self::_n_col_opens() 181 | } 182 | 183 | fn get_n_degree_tests(&self) -> usize { 184 | Self::_n_degree_tests(self.n_cols) 185 | } 186 | } 187 | 188 | /// Ligero-based polynomial commitment, fixing Rho and Lambda 189 | pub type LigeroEncoding = LigeroEncodingRho; 190 | 191 | /// Ligero-based polynomial commitment 192 | pub type LigeroCommit = LcCommit>; 193 | 194 | /// An evaluation proof for Ligero-based polynomial commitment 195 | pub type LigeroEvalProof = LcEvalProof>; 196 | -------------------------------------------------------------------------------- /lcpc-ligero-pc/src/tests.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-ligero-pc, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | 10 | use super::{LigeroCommit, LigeroEncoding, LigeroEncodingRho}; 11 | 12 | use blake3::Hasher as Blake3; 13 | use ff::Field; 14 | use itertools::iterate; 15 | use lcpc_2d::{LcCommit, LcEncoding}; 16 | use merlin::Transcript; 17 | use rand::{Rng, SeedableRng}; 18 | use rand_chacha::ChaCha20Rng; 19 | use std::iter::repeat_with; 20 | use lcpc_test_fields::{ft255::*, ft63::*, random_coeffs}; 21 | 22 | #[test] 23 | fn get_dims() { 24 | let mut rng = rand::thread_rng(); 25 | 26 | for _ in 0..128 { 27 | let lgl = 8 + rng.gen::() % 8; 28 | for _ in 0..128 { 29 | let len_base = 1 << (lgl - 1); 30 | let len = len_base + (rng.gen::() % len_base); 31 | let (n_rows, n_per_row, n_cols) = LigeroEncoding::::_get_dims(len).unwrap(); 32 | assert!(n_rows * n_per_row >= len); 33 | assert!((n_rows - 1) * n_per_row < len); 34 | assert!( 35 | n_per_row * LigeroEncoding::::_rho_den() / LigeroEncoding::::_rho_num() 36 | <= n_cols 37 | ); 38 | assert!(LigeroEncoding::::_dims_ok(n_per_row, n_cols)); 39 | } 40 | } 41 | } 42 | 43 | #[test] 44 | fn col_opens() { 45 | println!( 46 | "39/40: {}", 47 | LigeroEncodingRho::::_n_col_opens() 48 | ); 49 | println!( 50 | "1/2: {}", 51 | LigeroEncodingRho::::_n_col_opens() 52 | ); 53 | println!( 54 | "1/4: {}", 55 | LigeroEncodingRho::::_n_col_opens() 56 | ); 57 | } 58 | 59 | #[cfg(feature="isz")] 60 | use typenum::U38 as TLo; 61 | #[cfg(not(feature="isz"))] 62 | use typenum::U1 as TLo; 63 | 64 | #[cfg(feature="isz")] 65 | use typenum::U39 as THi; 66 | #[cfg(all(not(feature="isz"), feature="hlf"))] 67 | use typenum::U2 as THi; 68 | #[cfg(all(not(feature="isz"),not(feature="hlf")))] 69 | use typenum::U4 as THi; 70 | 71 | #[test] 72 | fn rate() { 73 | use typenum::Unsigned; 74 | println!("{} {}", TLo::to_usize(), THi::to_usize()); 75 | } 76 | 77 | const N_ITERS: usize = 10; 78 | #[test] 79 | #[ignore] 80 | fn rough_bench() { 81 | use std::time::Instant; 82 | 83 | for lgl in (13..=29).step_by(2) { 84 | // commit to random poly of specified size 85 | let coeffs = random_coeffs(lgl); 86 | let enc = LigeroEncodingRho::::new(coeffs.len()); 87 | let mut xxx = 0u8; 88 | 89 | let now = Instant::now(); 90 | for i in 0..N_ITERS { 91 | let comm = LcCommit::::commit(&coeffs, &enc).unwrap(); 92 | let root = comm.get_root(); 93 | xxx ^= root.as_ref()[i]; 94 | } 95 | let dur = now.elapsed().as_nanos() / N_ITERS as u128; 96 | println!("{}: {} {:?}", lgl, dur, xxx); 97 | } 98 | } 99 | 100 | #[test] 101 | #[ignore] 102 | fn prove_verify_size_bench() { 103 | use ff::PrimeField; 104 | use std::time::Instant; 105 | 106 | for lgl in (13..=29).step_by(2) { 107 | // commit to random poly of specified size 108 | let coeffs = random_coeffs(lgl); 109 | let enc = LigeroEncodingRho::::new(coeffs.len()); 110 | let comm = LcCommit::::commit(&coeffs, &enc).unwrap(); 111 | let root = comm.get_root(); 112 | 113 | // evaluate the random polynomial we just generated at a random point x 114 | let x = Ft255::random(&mut rand::thread_rng()); 115 | 116 | // compute the outer and inner tensors for powers of x 117 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 118 | // really matter --- the only difference from a multilinear is the 119 | // way we compute outer_tensor and inner_tensor from the eval point 120 | let inner_tensor: Vec = iterate(Ft255::one(), |&v| v * x) 121 | .take(comm.get_n_per_row()) 122 | .collect(); 123 | let outer_tensor: Vec = { 124 | let xr = x * inner_tensor.last().unwrap(); 125 | iterate(Ft255::one(), |&v| v * xr) 126 | .take(comm.get_n_rows()) 127 | .collect() 128 | }; 129 | 130 | let mut xxx = 0u8; 131 | let now = Instant::now(); 132 | for i in 0..N_ITERS { 133 | let mut tr = Transcript::new(b"test transcript"); 134 | tr.append_message(b"polycommit", root.as_ref()); 135 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 136 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap(); 137 | let encoded: Vec = bincode::serialize(&pf).unwrap(); 138 | xxx ^= encoded[i]; 139 | } 140 | let pf_dur = now.elapsed().as_nanos() / N_ITERS as u128; 141 | 142 | let mut tr = Transcript::new(b"test transcript"); 143 | tr.append_message(b"polycommit", root.as_ref()); 144 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 145 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr).unwrap(); 146 | let encoded: Vec = bincode::serialize(&pf).unwrap(); 147 | let len = encoded.len(); 148 | 149 | let now = Instant::now(); 150 | for i in 0..N_ITERS { 151 | let mut tr = Transcript::new(b"test transcript"); 152 | tr.append_message(b"polycommit", root.as_ref()); 153 | tr.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 154 | xxx ^= pf 155 | .verify( 156 | root.as_ref(), 157 | &outer_tensor[..], 158 | &inner_tensor[..], 159 | &enc, 160 | &mut tr, 161 | ) 162 | .unwrap() 163 | .to_repr() 164 | .as_ref()[i]; 165 | } 166 | let vf_dur = now.elapsed().as_nanos() / N_ITERS as u128; 167 | 168 | println!("{}: {} {} {} {}", lgl, pf_dur, vf_dur, len, xxx); 169 | } 170 | } 171 | 172 | #[test] 173 | #[ignore] 174 | fn proof_sizes() { 175 | for lgl in (13..=29).step_by(2) { 176 | // Code1 = 80/81 177 | // Code2 = 54/55 178 | // Code3 = 39/40 179 | // Code4 = 30/31 180 | // Code5 = 25/26 181 | // Code6 = 21/22 182 | // commit to random poly of specified size 183 | let coeffs = random_coeffs(lgl); 184 | let enc = LigeroEncodingRho::::new(coeffs.len()); 185 | let comm = LcCommit::::commit(&coeffs, &enc).unwrap(); 186 | let root = comm.get_root(); 187 | 188 | // evaluate the random polynomial we just generated at a random point x 189 | let x = Ft255::random(&mut rand::thread_rng()); 190 | 191 | // compute the outer and inner tensors for powers of x 192 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 193 | // really matter --- the only difference from a multilinear is the 194 | // way we compute outer_tensor and inner_tensor from the eval point 195 | let inner_tensor: Vec = iterate(Ft255::one(), |&v| v * x) 196 | .take(comm.get_n_per_row()) 197 | .collect(); 198 | let outer_tensor: Vec = { 199 | let xr = x * inner_tensor.last().unwrap(); 200 | iterate(Ft255::one(), |&v| v * xr) 201 | .take(comm.get_n_rows()) 202 | .collect() 203 | }; 204 | 205 | // compute an evaluation proof 206 | let mut tr1 = Transcript::new(b"test transcript"); 207 | tr1.append_message(b"polycommit", root.as_ref()); 208 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 209 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 210 | let encoded: Vec = bincode::serialize(&pf).unwrap(); 211 | 212 | println!("{}: {}", lgl, encoded.len()); 213 | } 214 | } 215 | 216 | #[test] 217 | fn end_to_end() { 218 | // commit to a random polynomial at a random rate 219 | let coeffs = get_random_coeffs(); 220 | let enc = LigeroEncoding::new(coeffs.len()); 221 | let comm = LigeroCommit::::commit(&coeffs, &enc).unwrap(); 222 | // this is the polynomial commitment 223 | let root = comm.get_root(); 224 | 225 | // evaluate the random polynomial we just generated at a random point x 226 | let x = Ft63::random(&mut rand::thread_rng()); 227 | 228 | // compute the outer and inner tensors for powers of x 229 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 230 | // really matter --- the only difference from a multilinear is the 231 | // way we compute outer_tensor and inner_tensor from the eval point 232 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 233 | .take(comm.get_n_per_row()) 234 | .collect(); 235 | let outer_tensor: Vec = { 236 | let xr = x * inner_tensor.last().unwrap(); 237 | iterate(Ft63::one(), |&v| v * xr) 238 | .take(comm.get_n_rows()) 239 | .collect() 240 | }; 241 | 242 | // compute an evaluation proof 243 | let mut tr1 = Transcript::new(b"test transcript"); 244 | tr1.append_message(b"polycommit", root.as_ref()); 245 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 246 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 247 | 248 | // verify it and finish evaluation 249 | let mut tr2 = Transcript::new(b"test transcript"); 250 | tr2.append_message(b"polycommit", root.as_ref()); 251 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 252 | let enc2 = LigeroEncoding::new_from_dims(pf.get_n_per_row(), pf.get_n_cols()); 253 | pf.verify( 254 | root.as_ref(), 255 | &outer_tensor[..], 256 | &inner_tensor[..], 257 | &enc2, 258 | &mut tr2, 259 | ) 260 | .unwrap(); 261 | } 262 | 263 | #[test] 264 | fn end_to_end_one_proof_ml() { 265 | let mut rng = rand::thread_rng(); 266 | 267 | // commit to a random polynomial at a random rate 268 | let lgl = 12 + rng.gen::() % 8; 269 | let coeffs = random_coeffs(lgl); 270 | let enc = LigeroEncoding::new_ml(lgl); 271 | let comm = LigeroCommit::::commit(&coeffs, &enc).unwrap(); 272 | // this is the polynomial commitment 273 | let root = comm.get_root(); 274 | assert!(comm.get_n_rows() != 1); 275 | 276 | // evaluate the random polynomial we just generated at a random point x 277 | let x = Ft63::random(&mut rand::thread_rng()); 278 | 279 | // compute the outer and inner tensors for powers of x 280 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 281 | // really matter --- the only difference from a multilinear is the 282 | // way we compute outer_tensor and inner_tensor from the eval point 283 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 284 | .take(comm.get_n_per_row()) 285 | .collect(); 286 | let outer_tensor: Vec = { 287 | let xr = x * inner_tensor.last().unwrap(); 288 | iterate(Ft63::one(), |&v| v * xr) 289 | .take(comm.get_n_rows()) 290 | .collect() 291 | }; 292 | 293 | // compute an evaluation proof 294 | let mut tr1 = Transcript::new(b"test transcript"); 295 | tr1.append_message(b"polycommit", root.as_ref()); 296 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 297 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 298 | 299 | // verify it and finish evaluation 300 | let mut tr2 = Transcript::new(b"test transcript"); 301 | tr2.append_message(b"polycommit", root.as_ref()); 302 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 303 | let enc2 = LigeroEncoding::new_from_dims(pf.get_n_per_row(), pf.get_n_cols()); 304 | pf.verify( 305 | root.as_ref(), 306 | &outer_tensor[..], 307 | &inner_tensor[..], 308 | &enc2, 309 | &mut tr2, 310 | ) 311 | .unwrap(); 312 | } 313 | 314 | #[test] 315 | fn end_to_end_two_proofs() { 316 | // commit to a random polynomial at a random rate 317 | let coeffs = get_random_coeffs(); 318 | let enc = LigeroEncoding::new(coeffs.len()); 319 | let comm = LigeroCommit::::commit(&coeffs, &enc).unwrap(); 320 | // this is the polynomial commitment 321 | let root = comm.get_root(); 322 | 323 | // evaluate the random polynomial we just generated at a random point x 324 | let x = Ft63::random(&mut rand::thread_rng()); 325 | 326 | // compute the outer and inner tensors for powers of x 327 | // NOTE: we treat coeffs as a univariate polynomial, but it doesn't 328 | // really matter --- the only difference from a multilinear is the 329 | // way we compute outer_tensor and inner_tensor from the eval point 330 | let inner_tensor: Vec = iterate(Ft63::one(), |&v| v * x) 331 | .take(comm.get_n_per_row()) 332 | .collect(); 333 | let outer_tensor: Vec = { 334 | let xr = x * inner_tensor.last().unwrap(); 335 | iterate(Ft63::one(), |&v| v * xr) 336 | .take(comm.get_n_rows()) 337 | .collect() 338 | }; 339 | 340 | // compute an evaluation proof 341 | let mut tr1 = Transcript::new(b"test transcript"); 342 | tr1.append_message(b"polycommit", root.as_ref()); 343 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 344 | let pf = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 345 | 346 | let challenge_after_first_proof_prover = { 347 | let mut key: ::Seed = Default::default(); 348 | tr1.challenge_bytes(b"ligero-pc//challenge", &mut key); 349 | let mut deg_test_rng = ChaCha20Rng::from_seed(key); 350 | Ft63::random(&mut deg_test_rng) 351 | }; 352 | 353 | // produce a second proof with the same transcript 354 | tr1.append_message(b"polycommit", root.as_ref()); 355 | tr1.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 356 | let pf2 = comm.prove(&outer_tensor[..], &enc, &mut tr1).unwrap(); 357 | 358 | // verify it and finish evaluation 359 | let mut tr2 = Transcript::new(b"test transcript"); 360 | tr2.append_message(b"polycommit", root.as_ref()); 361 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 362 | let enc2 = LigeroEncoding::new_from_dims(pf.get_n_per_row(), pf.get_n_cols()); 363 | let res = pf 364 | .verify( 365 | root.as_ref(), 366 | &outer_tensor[..], 367 | &inner_tensor[..], 368 | &enc2, 369 | &mut tr2, 370 | ) 371 | .unwrap(); 372 | 373 | let challenge_after_first_proof_verifier = { 374 | let mut key: ::Seed = Default::default(); 375 | tr2.challenge_bytes(b"ligero-pc//challenge", &mut key); 376 | let mut deg_test_rng = ChaCha20Rng::from_seed(key); 377 | Ft63::random(&mut deg_test_rng) 378 | }; 379 | assert_eq!( 380 | challenge_after_first_proof_prover, 381 | challenge_after_first_proof_verifier 382 | ); 383 | 384 | // second proof verification with the same transcript 385 | tr2.append_message(b"polycommit", root.as_ref()); 386 | tr2.append_message(b"ncols", &(enc.get_n_col_opens() as u64).to_be_bytes()[..]); 387 | let enc3 = LigeroEncoding::new_from_dims(pf2.get_n_per_row(), pf2.get_n_cols()); 388 | let res2 = pf2 389 | .verify( 390 | root.as_ref(), 391 | &outer_tensor[..], 392 | &inner_tensor[..], 393 | &enc3, 394 | &mut tr2, 395 | ) 396 | .unwrap(); 397 | 398 | assert_eq!(res, res2); 399 | } 400 | 401 | fn get_random_coeffs() -> Vec { 402 | let mut rng = rand::thread_rng(); 403 | 404 | let lgl = 8 + rng.gen::() % 8; 405 | let len_base = 1 << (lgl - 1); 406 | let len = len_base + (rng.gen::() % len_base); 407 | 408 | repeat_with(|| Ft63::random(&mut rng)).take(len).collect() 409 | } 410 | -------------------------------------------------------------------------------- /lcpc-test-fields/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "lcpc-test-fields" 3 | version = "0.1.1" 4 | edition = "2018" 5 | authors = ["kwantam "] 6 | description = "fields for testing polycommits" 7 | license = "Apache-2.0" 8 | repository = "https://github.com/conroi/lcpc" 9 | 10 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 11 | 12 | [dependencies] 13 | bitvec = "1" 14 | byteorder = "1" 15 | ff = { version = "0.12", features = ["derive"] } 16 | ff-derive-num = "0.2" 17 | num-traits = "0.2" 18 | rand = "0.8" 19 | rand_core = "0.6" 20 | serde = { version = "1.0", features = ["derive"] } 21 | subtle = "2.2" 22 | -------------------------------------------------------------------------------- /lcpc-test-fields/src/lib.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Riad S. Wahby 2 | // 3 | // This file is part of lcpc-test-fields, which is part of lcpc. 4 | // 5 | // Licensed under the Apache License, Version 2.0 (see 6 | // LICENSE or https://www.apache.org/licenses/LICENSE-2.0). 7 | // This file may not be copied, modified, or distributed 8 | // except according to those terms. 9 | #![allow(clippy::too_many_arguments)] 10 | 11 | use ff::Field; 12 | 13 | pub mod ft63 { 14 | use ff::PrimeField; 15 | use ff_derive_num::Num; 16 | use serde::{Deserialize, Serialize}; 17 | 18 | #[derive(PrimeField, Num, Deserialize, Serialize)] 19 | #[PrimeFieldModulus = "5102708120182849537"] 20 | #[PrimeFieldGenerator = "10"] 21 | #[PrimeFieldReprEndianness = "little"] 22 | pub struct Ft63([u64; 1]); 23 | } 24 | 25 | pub mod ft127 { 26 | use ff::PrimeField; 27 | use ff_derive_num::Num; 28 | use serde::{Deserialize, Serialize}; 29 | 30 | #[derive(PrimeField, Num, Deserialize, Serialize)] 31 | #[PrimeFieldModulus = "146823888364060453008360742206866194433"] 32 | #[PrimeFieldGenerator = "3"] 33 | #[PrimeFieldReprEndianness = "little"] 34 | pub struct Ft127([u64; 2]); 35 | } 36 | 37 | pub mod ft191 { 38 | use ff::PrimeField; 39 | use ff_derive_num::Num; 40 | use serde::{Deserialize, Serialize}; 41 | 42 | #[derive(PrimeField, Num, Deserialize, Serialize)] 43 | #[PrimeFieldModulus = "1697146272512170708389931801544665676545308500647389167617"] 44 | #[PrimeFieldGenerator = "5"] 45 | #[PrimeFieldReprEndianness = "little"] 46 | pub struct Ft191([u64; 3]); 47 | } 48 | 49 | pub mod ft255 { 50 | use ff::PrimeField; 51 | use ff_derive_num::Num; 52 | use serde::{Deserialize, Serialize}; 53 | 54 | #[derive(PrimeField, Num, Deserialize, Serialize)] 55 | #[PrimeFieldModulus = "46242760681095663677370860714659204618859642560429202607213929836750194081793"] 56 | #[PrimeFieldGenerator = "5"] 57 | #[PrimeFieldReprEndianness = "little"] 58 | pub struct Ft255([u64; 4]); 59 | } 60 | 61 | /// Define a bench function 62 | #[macro_export] 63 | macro_rules! def_bench { 64 | ($ben: ident, $fld: ident, $dig: ident, $len: literal) => { 65 | ::paste::paste! { 66 | #[bench] 67 | fn [<$ben _ $fld _ $dig _ $len>](b: &mut Bencher) { 68 | [<$ben _ bench>]::<$dig, $fld>(b, $len); 69 | } 70 | } 71 | }; 72 | } 73 | 74 | /// generate random coeffs of length 2^`log_len` 75 | pub fn random_coeffs(log_len: usize) -> Vec { 76 | use std::io::{self, Write}; 77 | use std::iter::repeat_with; 78 | 79 | let mut rng = rand::thread_rng(); 80 | let mut out = io::stderr(); 81 | let spc = 1 << (if log_len > 6 { log_len - 6 } else { log_len }); 82 | 83 | let ret = repeat_with(|| Ft::random(&mut rng)) 84 | .enumerate() 85 | .take(1 << log_len) 86 | .inspect(|(c, _)| { 87 | if c % spc == 0 { 88 | out.write_all(b".").unwrap(); 89 | out.flush().unwrap(); 90 | } 91 | }) 92 | .map(|(_, v)| v) 93 | .collect(); 94 | out.write_all(b"\n").unwrap(); 95 | out.flush().unwrap(); 96 | ret 97 | } 98 | -------------------------------------------------------------------------------- /scripts/microbench.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # (C) 2021 lcpc authors 3 | 4 | set -e 5 | 6 | DATE=$(date +%Y%m%d) 7 | CPUS=$(nproc) 8 | 9 | # cleanup 10 | cargo clean 11 | 12 | # ligero tests 13 | ( 14 | cd ligero-pc 15 | cargo test --release --features isz rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_ligero_isz.txt 16 | cargo test --release --features hlf rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_ligero_hlf.txt 17 | cargo test --release rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_ligero_dfl.txt 18 | 19 | cargo test --release --features isz prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_ligero_isz_pvs.txt 20 | cargo test --release --features hlf prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_ligero_hlf_pvs.txt 21 | cargo test --release prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_ligero_dfl_pvs.txt 22 | 23 | RAYON_NUM_THREADS=1 cargo test --release --features isz rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_ligero_isz.txt 24 | RAYON_NUM_THREADS=1 cargo test --release --features hlf rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_ligero_hlf.txt 25 | RAYON_NUM_THREADS=1 cargo test --release rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_ligero_dfl.txt 26 | 27 | RAYON_NUM_THREADS=1 cargo test --release --features isz prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_ligero_isz_pvs.txt 28 | RAYON_NUM_THREADS=1 cargo test --release --features hlf prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_ligero_hlf_pvs.txt 29 | RAYON_NUM_THREADS=1 cargo test --release prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_ligero_dfl_pvs.txt 30 | ) 31 | 32 | # sdig tests 33 | ( 34 | cd sdig-pc 35 | cargo test --release rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_sdig.txt 36 | cargo test --release prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_${CPUS}c_255bit_sdig_pvs.txt 37 | 38 | RAYON_NUM_THREADS=1 cargo test --release rough_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_sdig.txt 39 | RAYON_NUM_THREADS=1 cargo test --release prove_verify_size_bench -- --ignored --nocapture 2>&1 | tee ../doc/benchmark-results/${DATE}_1c_255bit_sdig_pvs.txt 40 | ) 41 | -------------------------------------------------------------------------------- /scripts/print_bench.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # (C) 2021 lcpc authors 3 | 4 | set -u 5 | 6 | CTN="$1".txt 7 | PVS="$1"_pvs.txt 8 | 9 | grep '^[0-9][0-9]:' $CTN | awk '{print($2/1e9);}' > ~/tmp/foo_ctime 10 | grep '^[0-9][0-9]:' $PVS | awk '{print($2/1e9);}' > ~/tmp/foo_ptime 11 | grep '^[0-9][0-9]:' $PVS | awk '{print($3/1e9);}' > ~/tmp/foo_vtime 12 | grep '^[0-9][0-9]:' $PVS | awk '{print($4/1024);}' > ~/tmp/foo_comm 13 | --------------------------------------------------------------------------------