Comment on page

Cronosd build with Nix

It is also possible to reproducibly build cronosd binaries locally yourself using nix.

Prerequisites

  • Install nix, following the instructions here: https://nixos.org/download.html
  • Install cachix and enable cronos binary cache:
    nix-env -iA cachix -f https://cachix.org/api/v1/install
    cachix use cronos

Build Type Matrix

Below are listed the different possible parameters
  • Network Type
    • mainnet (default)
    • testnet
  • DB Backend
    • rocksdb (default)
    • goleveldb
  • Build Type
    • normal nix package (default)
    • re-distributable bundle
    • re-distributable tarball, the tarball of the above bundle.

Creating a reproducible build

The package name is constructed by joining the above three properties with a separator -, omitting the default values, for example:
  • cronosd: defaults to the mainnet rocksdb nix package.
  • cronosd-tarball: mainnet rocksdb re-distributable tarball.
  • cronosd-goleveldb-tarball: mainnet goleveldb re-distributable tarball.
  • cronosd-testnet-goleveldb-tarball: testnet goleveldb re-distributable tarball.
The nix flake url is: github:crypto-org-chain/cronos/$TAG_NAME#$PACKAGE_NAME, replace the $TAG_NAME and $PACKAGE_NAME to the one you needed, for example: The full command to build a v0.8.1 rocksdb mainnet re-distributable tarball is:
nix build github:crypto-org-chain/cronos/v0.8.1#cronosd-tarball
result -> /nix/store/dlhqc2ii8jj1ryrgki90l6j92r2by06g-bundle-cronosd-v0.8.1
The result will reside in ./result by default, you can copy the tarball to other machines with the same OS and arch. The re-distributable bundle/tarball has dynamic libraries included, no extra runtime dependencies are needed.
mkdir tmp/cronosd
tar xfz ./result -C /tmp/cronosd/
If you get error: experimental Nix feature 'nix-command' is disabled; use '--extra-experimental-features nix-command' to override, e.g. by adding: --extra-experimental-features nix-command --extra-experimental-features flakes

Tarball Content

To keep the tarball redistributable, it has all the runtime dependencies included, the dynamic linker, and the shared libraries. They are located in a relative path, so it's important that the whole package is moved together.
  • bin/cronosd: the entry point, it's a wrapper script that executes the binary using the included dynamic linker.
  • exe/cronosd: the executable.
  • lib/: all the shared libraries.