{"id":14525292,"url":"https://github.com/lurk-lab/lurk-beta","last_synced_at":"2026-01-23T01:28:16.866Z","repository":{"id":37590020,"uuid":"383963627","full_name":"lurk-lab/lurk-beta","owner":"lurk-lab","description":"Lurk is a Turing-complete programming language for recursive zk-SNARKs. This is the prior, elliptic curve based variant of Lurk (contact: @porcuquine)","archived":false,"fork":false,"pushed_at":"2025-02-25T00:01:15.000Z","size":127421,"stargazers_count":452,"open_issues_count":95,"forks_count":60,"subscribers_count":11,"default_branch":"main","last_synced_at":"2026-01-22T08:56:01.570Z","etag":null,"topics":["compiler","cryptography","programming-language","rust","zero-knowledge","zk-snarks"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lurk-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-07-08T01:07:22.000Z","updated_at":"2025-12-13T00:43:14.000Z","dependencies_parsed_at":"2022-07-12T16:32:35.780Z","dependency_job_id":"355a27da-ee5a-40af-b106-a6a15a9eae49","html_url":"https://github.com/lurk-lab/lurk-beta","commit_stats":null,"previous_names":["lurk-lang/lurk-rs","argumentcomputer/lurk-rs","lurk-lab/lurk-rs","argumentcomputer/lurk-beta","lurk-lab/lurk-beta"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/lurk-lab/lurk-beta","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lurk-lab%2Flurk-beta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lurk-lab%2Flurk-beta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lurk-lab%2Flurk-beta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lurk-lab%2Flurk-beta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lurk-lab","download_url":"https://codeload.github.com/lurk-lab/lurk-beta/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lurk-lab%2Flurk-beta/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28677445,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T01:00:35.747Z","status":"ssl_error","status_checked_at":"2026-01-23T01:00:19.529Z","response_time":144,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","cryptography","programming-language","rust","zero-knowledge","zk-snarks"],"created_at":"2024-09-04T14:01:33.635Z","updated_at":"2026-01-23T01:28:16.842Z","avatar_url":"https://github.com/lurk-lab.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# Lurk\n\n![lurk-beta](https://github.com/argumentcomputer/lurk-beta/actions/workflows/ci.yml/badge.svg)\n![minimum rustc 1.70][msrv-image]\n[![dependency status](https://deps.rs/repo/github/argumentcomputer/lurk-beta/status.svg)](https://deps.rs/repo/github/argumentcomputer/lurk-beta)\n![crates.io][crates-image]\n\n[msrv-image]: https://img.shields.io/badge/rustc-1.70+-blue.svg\n[crates-image]: https://img.shields.io/crates/v/lurk.svg\n\n# Status\n\u003e [!NOTE]\n\u003e This repository is in maintenance mode. Development has moved to https://github.com/argumentcomputer/lurk.\n\nThis repository contains the implementation for [Lurk Beta](https://argument.xyz/blog/lurk-beta/), which is backwards compatible with code that ran in Lurk Alpha and is expected to be compatible with Lurk 1.0. However, some low-level data representations are anticipated to change, and we will be refactoring the evaluation model (and consequently its circuit) for efficiency purposes. Also note that since Lurk inherits some security properties from the underlying proving system, those who would rely on Lurk should investigate the security and status of Nova/SuperNova itself. We encourage early adopters to begin writing real applications taking advantage of Lurk so you can begin to familiarize yourself with the programming model. Likewise, we welcome your feedback -- which will help ensure ongoing development meets user need.\n\nFor support and discussions, please visit our [Zulip forum](https://zulip.argument.xyz/).\n\n# Overview\n\nLurk is a statically scoped dialect of Lisp, influenced by Scheme and Common Lisp. A reference implementation focused on describing and developing the core language can be found in the [`lurk-lisp`](https://github.com/argumentcomputer/lurk-lisp) repo.\n\nLurk's distinguishing feature relative to most programming languages is that correct execution of Lurk programs can be directly proved using zk-SNARKs. The resulting proofs are succinct: they are relatively small, can be verified quickly, and they reveal only the information explicitly contained in the statement to be proved.\n\nFor more detailed information, refer to the paper: [https://eprint.iacr.org/2023/369](https://eprint.iacr.org/2023/369)\n\nLurk's distinguishing feature relative to most zk-SNARK authoring languages is that Lurk is Turing complete, so arbitrary computational claims can be made and proved (subject to resource limitations, obviously). Because Lurk is a Lisp, its code is simply Lurk data, and any Lurk data can be directly evaluated as a Lurk program. Lurk constructs compound data using SNARK-friendly Poseidon hashes (provided by [Neptune](https://github.com/argumentcomputer/neptune)), so its data is naturally content-addressable.\n\n# Proofs\n\nIntegration with backend proving systems and tooling for proof generation are both still very early. Performance and user experience still have room for significant optimization and improvement, but simple examples can be found in the [demo example directory](demo/).\n\n# Backends\n- Nova is Lurk's officially-supported IVC backend. It uses Argument's Arecibo fork of the [Nova proving system](https://github.com/argumentcomputer/arecibo) and the Pasta Curves.\n- SuperNova is Lurk's in-development NIVC backend. It uses Arecibo's [SuperNova extension to the Nova proving system](https://github.com/argumentcomputer/arecibo/tree/dev/src/supernova) and the Pasta Curves.\n- Future work may target Halo2 or other proving systems.\n\nIt is an explicit design goal that statements about the evaluation of Lurk programs have identical semantic meaning across backends, with the qualification that Lurk language instances are themselves parameterized on scalar field and hash function. When backends use the same scalar field and hash function, they can be used to generate equivalent proofs. This is because the concrete representation of content-addressed data is fixed.\n\n# Performance\n\nLurk backend integration is still immature, so current performance is not representative. As a rough approximation, we estimate that for entirely general computation using Lurk's universal circuit, Nova proving throughput will be on the order of 1,000 iterations per second per GPU. We expect that most compute-heavy applications will use optimized 'coprocessor' circuits, which will  dramatically improve performance. Planned improvements to Nova will allow for smaller inner circuits, further improving throughput -- and for full parallelization of reduction proofs.\n\n# Specs\n- [Evaluation Spec](notes/eval.md)\n- [Reduction Notes](notes/reduction-notes.md)\n\n# Security Audit\nLurk's Alpha release has undergone a [security audit](https://argument.xyz/inference-security-assessment-3-2023.pdf) as of 03/29/2023, performed by [Inference](https://inference.ag/about-us/).\n\n# Versioning\n\nPlease note that the Lurk language and spec will be versioned independently from the crates that implement the spec. This is necessary because semantic versioning implies different requirements for the language and its implementation. For example, Lurk Alpha is released as crate `lurk 0.2.0` and Lurk Beta is released as crate `lurk 0.3.0`. It is our intention for these two versioning systems to coincide at 1.0.\n\n---\n\n# Build\n\n## Submodules\n\nLurk source files used in tests are in the [lurk-lib](https://github.com/argumentcomputer/lurk-lib) submodule. You must\ninitialize and update submodules before test will pass:\n\n```ignore\ngit submodule update --init --recursive\n```\n\n## Wasm\n\n### Prerequisites\n- [clang](https://clang.llvm.org/get_started.html)\n\nLurk can be compiled to Wasm with\n```ignore\ncargo build --target wasm32-unknown-unknown\n```\n\nIf using Nix without a system-wide `clang` install (e.g. NixOS):\n```ignore\nCC=clang cargo build --target wasm32-unknown-unknown\n```\n\n## Repl\n\n```ignore\ncargo run --release\n```\n\nOr use the wrapper script:\n\n```ignore\nbin/lurk\n```\n\nSet the environment variable `LURK_FIELD` to specify the scalar field of the Lurk language instance:\n- `LURK_FIELD=PALLAS` (default): scalar field of Pallas\n- `LURK_FIELD=VESTA`: scalar field of Vesta\n\n```ignore\n➜  lurk-beta ✗ bin/lurk\n    Finished release [optimized] target(s) in 0.06s\n     Running `target/release/lurk`\nLurk REPL welcomes you.\n\u003e (let ((square (lambda (x) (* x x)))) (square 8))\n[9 iterations] =\u003e 64\n\u003e\n```\n\nOr enable `info` log-level for a trace of reduction frames:\n```ignore\n➜  lurk-beta ✗ RUST_LOG=lurk::lem::eval=info bin/lurk\n    Finished release [optimized] target(s) in 0.05s\n     Running `target/release/lurk`\nLurk REPL welcomes you.\nuser\u003e (let ((square (lambda (x) (* x x)))) (square 8))\n  2023-12-10T15:58:21.902414Z  INFO lurk::lem::eval: Frame: 0\n\tExpr: (let ((.lurk.user.square (lambda (.lurk.user.x) (* .lurk.user.x .lurk.user.x)))) (.lurk.user.square 8))\n\tEnv:  nil\n\tCont: Outermost\n    at src/lem/eval.rs:99\n\n  2023-12-10T15:58:21.902943Z  INFO lurk::lem::eval: Frame: 1\n\tExpr: (lambda (.lurk.user.x) (* .lurk.user.x .lurk.user.x))\n\tEnv:  nil\n\tCont: Let{ var: .lurk.user.square, saved_env: nil, body: (.lurk.user.square 8), continuation: Outermost }\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903170Z  INFO lurk::lem::eval: Frame: 2\n\tExpr: (.lurk.user.square 8)\n\tEnv:  ((.lurk.user.square . \u003cFUNCTION (.lurk.user.x) (* .lurk.user.x .lurk.user.x)\u003e))\n\tCont: Tail{ saved_env: nil, continuation: Outermost }\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903649Z  INFO lurk::lem::eval: Frame: 3\n\tExpr: .lurk.user.square\n\tEnv:  ((.lurk.user.square . \u003cFUNCTION (.lurk.user.x) (* .lurk.user.x .lurk.user.x)\u003e))\n\tCont: Call{ unevaled_arg: 8, saved_env: ((.lurk.user.square . \u003cFUNCTION (.lurk.user.x) (* .lurk.user.x .lurk.user.x)\u003e)), continuation: Tail{ saved_env: nil, continuation: Outermost } }\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903678Z  INFO lurk::lem::eval: Frame: 4\n\tExpr: 8\n\tEnv:  ((.lurk.user.square . \u003cFUNCTION (.lurk.user.x) (* .lurk.user.x .lurk.user.x)\u003e))\n\tCont: Call2{ function: \u003cFUNCTION (.lurk.user.x) (* .lurk.user.x .lurk.user.x)\u003e, saved_env: ((.lurk.user.square . \u003cFUNCTION (.lurk.user.x) (* .lurk.user.x .lurk.user.x)\u003e)), continuation: Tail{ saved_env: nil, continuation: Outermost } }\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903696Z  INFO lurk::lem::eval: Frame: 5\n\tExpr: (* .lurk.user.x .lurk.user.x)\n\tEnv:  ((.lurk.user.x . 8))\n\tCont: Tail{ saved_env: nil, continuation: Outermost }\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903772Z  INFO lurk::lem::eval: Frame: 6\n\tExpr: .lurk.user.x\n\tEnv:  ((.lurk.user.x . 8))\n\tCont: Binop{ operator: product#, saved_env: ((.lurk.user.x . 8)), unevaled_args: (.lurk.user.x), continuation: Tail{ saved_env: nil, continuation: Outermost } }\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903844Z  INFO lurk::lem::eval: Frame: 7\n\tExpr: .lurk.user.x\n\tEnv:  ((.lurk.user.x . 8))\n\tCont: Binop2{ operator: product#, evaled_arg: 8, continuation: Tail{ saved_env: nil, continuation: Outermost } }\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903866Z  INFO lurk::lem::eval: Frame: 8\n\tExpr: Thunk{ value: 64 =\u003e cont: Outermost }\n\tEnv:  nil\n\tCont: Dummy\n    at src/lem/eval.rs:107\n\n  2023-12-10T15:58:21.903878Z  INFO lurk::lem::eval: Frame: 9\n\tExpr: 64\n\tEnv:  nil\n\tCont: Terminal\n    at src/lem/eval.rs:107\n\n[9 iterations] =\u003e 64\nuser\u003e \n```\n\n## Install\n\nYou can install the `lurk` Repl on your machine with\n```ignore\n$ cargo install --path .\n```\n\n## Nix\n\nInstall [Nix](https://nixos.org) and [enable Nix flakes](https://nixos.wiki/wiki/Flakes). Then, you can enter into a Nix devshell with the appropriate dependencies for Lurk with\n\n```ignore\n$ nix develop\n```\nor\n\n```ignore\n$ direnv allow\n```\n\nAnd then build with Cargo as usual:\n\n```ignore\n$ cargo build\n```\n\n## License\n\nMIT or Apache 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flurk-lab%2Flurk-beta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flurk-lab%2Flurk-beta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flurk-lab%2Flurk-beta/lists"}