In August 2017, several incompatible changes were merged into the libsnark master
branch:
We upgraded libsnark’s build process from a shell script and Makefile for installation and compilation to a new CMake-based process (https://cmake.org/). We are making this transition to better address the growing system-level and modularity needs of libsnark.
We have factored out core algebraic components of libsnark to allow developers to use internal classes and functions that are useful in applications beyond libsnark, as well as to simplify the growing directory structure of libsnark.
The two new libraries are:
- libff for finite fields and elliptic curves
- libfqfft for fast polynomial evaluation and interpolation in various finite domains
These libraries are now automatically fetched and installed as Git submodules, in the “depends” (formerly: “third-party”) directory.
As part of this transition, we will maintain a copy of the deprecated version under the monolithic
branch. However, we will not support any future development work for the monolithic
branch. Should a critical vulnerability be found in monolithic
, we will patch it accordingly.
See the the Building section of README.md for the new build instructions.
The compile flags are mostly analogous, but use different and more consistent notation (e.g., instead of make OPTFLAGS=...
use cmake -DOPT_FLAGS=... && make
. Notable changes:
- Use
cmake -DCURVE=curvename ..
instead of the oldmake CURVE=curvename
. - Use
cmake -DLOWMEM=ON
/OFF ..
instead of the oldmake LOWMEM=1
/0
. Similarly forMULTICORE
,MONTGOMERY_OUTPUT
,USE_ASM
,USE_MIXED_ADDITION
andPERFORMANCE
. (The defaults are unchanged.) - Binary output is now enabled by default; use
cmake -DBINARY_OUTPUT=OFF ..
to disable it for streaming-format compatibility with the old default. - Use
cmake -DUSE_PT_COMPRESSION=OFF ..
instead of definingNO_PT_COMPRESSION
(but the default is still to use point compression). - Use
cmake -DWITH_PROCPS=OFF ..
instead of the oldmake NO_PROCPS=1
flag (but the default is still to use procps). Similarly forSUPERCOP
. - Removed
NO_GTEST
(that was used to skip tests that use the Google Test library). - The new
DEPENDS_DIR
flag customizes the dependencies installation directory.
The following explains how we handles dependencies shared with submodules; you may need to understand this if you modify these submodules.
The depends
folder (formerly third-party
) includes libraries that libsnark depends on, such as libff and libfqfft. Observe that libfqfft also includes a depends
folder that depends on libff. To prevent library duplication or versioning issues, we have made the dependency requirements explicit at each level. Namely, when fetching libsnark’s dependencies, we will only fetch and build top-level submodules. We will not recursively fetch submodules. This system of enforcing dependencies will ensure CMake can reliably compile dependencies as native code to libsnark, and prevent hidden, shared-library dependency files from arising.
The CMake compilation scripts include optional flags that pass state about the current calling parent to respective dependencies. This prevents CMake from unnecessarily recompiling dependencies and resetting state. We have built this system to ensure code duplication and library duplication do not arise as part of a developer’s workflow.