diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 265db95..7f4686a 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,6 +4,7 @@ - [Guides](./guides/index.md) - [Build Valence Contracts](./guides/build-valence-contracts.md) - [Upload Contracts](./guides/upload-contracts.md) + - [ZK Development](./guides/zk-development.md) - [Flake Modules Reference](./reference/flake-modules/index.md) - [Upload Contracts Options](./reference/flake-modules/upload-contracts.md) - [Valence Contracts Options](./reference/flake-modules/valence-contracts.md) diff --git a/docs/guides/index.md b/docs/guides/index.md index 224bd1c..a091e00 100644 --- a/docs/guides/index.md +++ b/docs/guides/index.md @@ -1,4 +1,5 @@ # Guides - [Build Valence Contracts](./build-valence-contracts.md) - [Upload Contracts](./upload-contracts.md) +- [ZK Development](./zk-development.md) diff --git a/docs/guides/zk-development.md b/docs/guides/zk-development.md new file mode 100644 index 0000000..015dc65 --- /dev/null +++ b/docs/guides/zk-development.md @@ -0,0 +1,18 @@ +# ZK Development + +Zero.nix provides the `sp1` and `sp1-rust` packages to make it +easy to setup a nix development shell with sp1 tooling. + +To use them create a flake.nix with the following contents: +```nix +{{#include ../../templates/zk-development/flake.nix}} +``` +You can also run the following command to initialize the template. +```bash +nix flake init -t github:timewave-computer/zero.nix#zk-dev + +``` + +Then run `nix develop` to enter a devshell with the packages. + + diff --git a/flake.nix b/flake.nix index aee1cb9..ac55db7 100644 --- a/flake.nix +++ b/flake.nix @@ -22,6 +22,7 @@ ./packages/default.nix ./tools/default.nix ./docs/default.nix + ./templates/default.nix ./flakeModules/valence-contracts.nix ]; }; diff --git a/packages/default.nix b/packages/default.nix index 71b52f9..87bf224 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -1,4 +1,3 @@ -{ inputs, lib, ... }: { imports = [ ./valence-contracts.nix @@ -7,6 +6,10 @@ packages = { upload-contract = pkgs.callPackage ./upload-contract {}; local-ic = pkgs.callPackage ./local-ic.nix {}; + sp1-rust = pkgs.callPackage ./sp1-rust.nix {}; + sp1 = pkgs.callPackage ./sp1.nix { + inherit (config.packages) sp1-rust; + }; }; }; } diff --git a/packages/sp1-rust.nix b/packages/sp1-rust.nix new file mode 100644 index 0000000..943dff4 --- /dev/null +++ b/packages/sp1-rust.nix @@ -0,0 +1,63 @@ +{ + stdenv, + autoPatchelfHook, + fixDarwinDylibNames, + fetchzip, + zlib, + ... +}: +let + fetchGitHubReleaseAsset = + { + owner, + repo, + tag, + asset, + hash, + }: + fetchzip { + url = "https://github.com/${owner}/${repo}/releases/download/${tag}/${asset}"; + inherit hash; + stripRoot = false; + }; + +in +stdenv.mkDerivation rec { + name = "sp1-rust"; + version = "1.82.0"; + + nativeBuildInputs = [ + stdenv.cc.cc.lib + zlib + ] ++ (if stdenv.isDarwin then [ fixDarwinDylibNames ] else [ autoPatchelfHook ]); + + installPhase = '' + runHook preInstall + mkdir -p $out + cp -r ./* $out/ + runHook postInstall + ''; + + src = fetchGitHubReleaseAsset ({ + owner = "succinctlabs"; + repo = "rust"; + tag = "succinct-${version}"; + } // { + "x86_64-linux" = { + asset = "rust-toolchain-x86_64-unknown-linux-gnu.tar.gz"; + hash = "sha256-wXI2zVwfrVk28CR8PLq4xyepdlu65uamzt/+jER2M2k="; + }; + "aarch64-linux" = { + asset = "rust-toolchain-aarch64-unknown-linux-gnu.tar.gz"; + hash = ""; + }; + "x86_64-darwin" = { + asset = "rust-toolchain-x86_64-apple-darwin.tar.gz"; + hash = "sha256-sPQW8eo+qItsmgK1uxRh1r73DBLUXUtmtVUvjacGzp0="; + }; + "aarch64-darwin" = { + asset = "rust-toolchain-aarch64-apple-darwin.tar.gz"; + hash = "sha256-R4D7hj2DcZ3vfCejvXwJ68YDOlgWGDPcb08GZNXz1Cg="; + }; + }.${stdenv.system}); +} diff --git a/packages/sp1.nix b/packages/sp1.nix new file mode 100644 index 0000000..4006aba --- /dev/null +++ b/packages/sp1.nix @@ -0,0 +1,30 @@ +{ + lib, + sp1-rust, + rustPlatform, + fetchFromGitHub, + pkg-config, + openssl, + ... +}: +rustPlatform.buildRustPackage { + pname = "sp1"; + version = "unstable-2025-03-06"; + + nativeBuildInputs = [ + sp1-rust + pkg-config + openssl + ]; + cargoBuildFlags = [ "--package sp1-cli" ]; + cargoHash = "sha256-gI/N381IfIWnF4tfXM1eKLI93eCjEELg/a5gWQn/3EA="; + + src = fetchFromGitHub { + owner = "succinctlabs"; + repo = "sp1"; + rev = "9f202bf603b3cab5b7c9db0e8cf5524a3428fbee"; + hash = "sha256-RpllsIlrGyYw6dInN0tTs7K1y4FiFmrxFSyt3/Xelkg="; + fetchSubmodules = true; + }; + doCheck = false; +} diff --git a/templates/default.nix b/templates/default.nix new file mode 100644 index 0000000..d4c11bf --- /dev/null +++ b/templates/default.nix @@ -0,0 +1,22 @@ +let + commonWelcome = '' + ## More info + - Zero.nix Docs: https://timewave.computer/zero.nix + ''; +in +{ + flake.templates = { + zk-dev = { + path = ./zk-development; + description = "Simple ZK development environment"; + welcomeText = '' + # Simple ZK development environment + ## Provided packages + - sp1 (cargo prove) + - rust-sp1 + + ${commonWelcome} + ''; + }; + }; +} diff --git a/templates/zk-development/flake.nix b/templates/zk-development/flake.nix new file mode 100644 index 0000000..ee27240 --- /dev/null +++ b/templates/zk-development/flake.nix @@ -0,0 +1,50 @@ +{ + description = "Valence ZK development environment"; + + nixConfig.extra-experimental-features = "nix-command flakes"; + nixConfig.extra-substituters = "https://timewave.cachix.org"; + nixConfig.extra-trusted-public-keys = '' + colmena.cachix.org-1:7BzpDnjjH8ki2CT3f6GdOk7QAzPOl+1t3LvTLXqYcSg= + cosmos-nix.cachix.org-1:I9dmz4kn5+JExjPxOd9conCzQVHPl0Jo1Cdp6s+63d4= + nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs= + ''; + + + inputs = { + nixpkgs.url = "nixpkgs/nixos-24.11"; + + flake-parts.url = "github:hercules-ci/flake-parts"; + + devshell.url = "github:numtide/devshell"; + + zero-nix.url = "github:timewave-computer/zero.nix"; + }; + + outputs = { + self, + flake-parts, + ... + } @ inputs: + flake-parts.lib.mkFlake {inherit inputs;} { + imports = [ + inputs.devshell.flakeModule + ]; + + systems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"]; + + perSystem = { + pkgs, + inputs, + ... + }: { + devshells.workshop = {pkgs, ...}: { + commands = [ + {package = pkgs.cargo;} + {package = pkgs.rustc;} + {package = inputs'.packages.sp1-rust;} + {package = inputs'.packages.sp1;} + ]; + }; + }; + }; +}