Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
8bcf3bd
chore: workspace scaffold, pinned toolchain, CI
thiagorochatr Jul 25, 2026
cb35da0
docs: implementation plan and verified Groth16 integration reference
thiagorochatr Jul 25, 2026
ee0b25d
feat(core): canonical field, domain-separated Poseidon, Merkle accumu…
thiagorochatr Jul 25, 2026
e7ea6b3
feat(circuit): R1CS Poseidon gadget with verified three-way parity
thiagorochatr Jul 25, 2026
e7a2e26
feat(circuit): membership statement, prover, and on-chain byte layout
thiagorochatr Jul 25, 2026
830eea3
fix: implement the action binding the docs promised; scope the reprod…
thiagorochatr Jul 25, 2026
0747dbf
perf(core): bake the zero ladder, guarded by a drift test
thiagorochatr Jul 25, 2026
3e86da2
feat(program): pool account layout and the accounting invariant
thiagorochatr Jul 25, 2026
ad3be2b
feat(program): instruction encoding, fail-closed on shape
thiagorochatr Jul 25, 2026
e506844
feat(program): init_pool and deposit, with the accumulator parity ass…
thiagorochatr Jul 25, 2026
5521b99
feat(program): submit_spend with on-chain Groth16 verification
thiagorochatr Jul 25, 2026
ff0cf51
test(program): end-to-end suite against the real compiled program
thiagorochatr Jul 25, 2026
2e4ffb1
feat(program): settle_epoch, the synchronised crowd
thiagorochatr Jul 25, 2026
9f8334b
test(program): pin the permissionless exit, which needs no new instru…
thiagorochatr Jul 25, 2026
ecdff38
feat(provenance): anonymity metrics, verified against reference vectors
thiagorochatr Jul 25, 2026
018eb62
feat(provenance): edge extraction, failure taxonomy, and a fail-close…
thiagorochatr Jul 25, 2026
09fdc51
feat(provenance): all five terminal rules, classified in a second pass
thiagorochatr Jul 25, 2026
fe91079
feat(provenance): birth-edge traversal, sample cache, and the collect…
thiagorochatr Jul 25, 2026
2f01896
feat(provenance): member-weighted frame construction from a pool's de…
thiagorochatr Jul 25, 2026
06664aa
docs: README
thiagorochatr Jul 25, 2026
019d197
feat(program): behavioural actions — the pool invokes real programs o…
thiagorochatr Jul 25, 2026
6639bed
feat: devnet deployment and live-cluster evidence
thiagorochatr Jul 25, 2026
202ba35
fix(provenance): two defects the first real analysis exposed, and the…
thiagorochatr Jul 25, 2026
4627a3d
docs: state why there is no mainnet deployment
thiagorochatr Jul 25, 2026
1d14804
fix: two griefing vectors that destroyed deposits, and a verify that …
thiagorochatr Jul 25, 2026
b09185c
test(program): exercise the action path with a non-empty account list
thiagorochatr Jul 25, 2026
0f0368b
docs: correct every falsifiable claim a reader can check
thiagorochatr Jul 25, 2026
6e8daf0
fix(cli): verify-setup now verifies the deployed key, and pin every n…
thiagorochatr Jul 25, 2026
0b256b1
docs: record all three measurement runs, including the two that produ…
thiagorochatr Jul 25, 2026
c3dc321
fix(program): a bystander could brick any note for the price of rent
thiagorochatr Jul 26, 2026
2706b21
docs: pre-register Run 4's budget before the run can see its result
thiagorochatr Jul 26, 2026
0610951
measure: Run 4 clears the informativeness gate, and the tail gets worse
thiagorochatr Jul 26, 2026
665d22c
docs: argue from the failure mode, not from anyone else's repository
thiagorochatr Jul 26, 2026
9d84413
fix: delete two errors that could never fire, and one magic index
thiagorochatr Jul 26, 2026
6527eb6
fix(program): refuse a nonzero entry fee instead of documenting the trap
thiagorochatr Jul 26, 2026
6da01f4
proof: regenerate the devnet evidence so its central claim is checkable
thiagorochatr Jul 26, 2026
9e31d31
proof: two more on-chain rejections, and say what each one establishes
thiagorochatr Jul 26, 2026
d0f2b6c
docs: state what the measurement does not support, now that it suppor…
thiagorochatr Jul 26, 2026
74873f9
docs: pre-register Run 5, a control population that is not seeking pr…
thiagorochatr Jul 26, 2026
36f6f3b
measure: quantify the sampling error in rho, and compare two populati…
thiagorochatr Jul 26, 2026
eeb0877
fix(provenance): the birth edge is the oldest CREDIT, which is not wh…
thiagorochatr Jul 26, 2026
b79c4b2
docs: pre-register the two re-collections the tracer fix forces
thiagorochatr Jul 26, 2026
011a94e
docs: record the birth-edge bug in the method, beside everyone else's
thiagorochatr Jul 26, 2026
810fef4
measure: corrected headline from the re-collected privacy pool, rho =…
thiagorochatr Jul 26, 2026
420b281
measure: the control run, the refused comparison, and the gate we add…
thiagorochatr Jul 26, 2026
38e6e0d
docs: the control comparison in the README, refusal and all
thiagorochatr Jul 26, 2026
facf530
measure: test the missing-at-random assumption instead of hoping for it
thiagorochatr Jul 26, 2026
3b85ffd
docs: pre-register Run 8, and disclose why it is the weakest pre-regi…
thiagorochatr Jul 26, 2026
e3472fa
docs: the selection check in the README and the method
thiagorochatr Jul 26, 2026
a3cf16e
measure: Run 8 fails its own prediction, and the comparison stays una…
thiagorochatr Jul 26, 2026
5975a3e
docs: correct three claims a reader could have falsified in one command
thiagorochatr Jul 26, 2026
c522e91
docs: the three uncertainties and how each is kept apart, in ARCHITEC…
thiagorochatr Jul 26, 2026
6ed96d2
docs: drop the comparative claims a reader cannot check
thiagorochatr Jul 26, 2026
73c8208
feat: the pool can sign as a member's authority, which we had called …
thiagorochatr Jul 26, 2026
b49bbbe
fix: a signed action could not settle in a batch, which devnet found …
thiagorochatr Jul 26, 2026
8a291d7
docs: reconcile the claims the new selector changed
thiagorochatr Jul 26, 2026
328ec9b
feat: the pool delegates real stake on devnet, as a member's authority
thiagorochatr Jul 26, 2026
32bc2a0
docs: the last comparative claim, in the file that predates the sweep
thiagorochatr Jul 26, 2026
7734b44
docs: name the pool the headline number is about
thiagorochatr Jul 26, 2026
3838862
docs: take the internal development record out of the deliverable
thiagorochatr Jul 26, 2026
95a464e
feat: a member can actually use the pool, from a machine that has nev…
thiagorochatr Jul 26, 2026
40e33fb
measure: ten spends per settlement, and the packet is what stops the …
thiagorochatr Jul 26, 2026
0bcb177
chore: run state is not deliverable, and it was being published
thiagorochatr Jul 27, 2026
abe00f0
measure: a crowd that diverges is a smaller crowd, and it costs a member
thiagorochatr Jul 27, 2026
4ccbf4e
fix: numbers that do not reproduce, and claims wider than their evidence
thiagorochatr Jul 27, 2026
0df3675
chore: group the ignore rules by what they protect against
thiagorochatr Jul 27, 2026
c71db97
docs: the label-resolution ladder was specified and not built, and no…
thiagorochatr Jul 27, 2026
cd55de2
feat: the packet was never the ceiling, and anonymity you cannot give…
thiagorochatr Jul 27, 2026
0077af8
fix: a member could not spend their own note against a busy pool
thiagorochatr Jul 27, 2026
8843aaa
fix: three ways settlement could build a transaction the cluster refuses
thiagorochatr Jul 27, 2026
21ff6ce
docs: the measured settlement, and a claim the lookup table falsified
thiagorochatr Jul 27, 2026
57715e2
docs: the lookup table is a disclosure, and the threat model now says so
thiagorochatr Jul 27, 2026
aa14e7f
docs: the disclosure and the table close, as they actually ran
thiagorochatr Jul 27, 2026
3c99e41
fix: a mixed-fee batch was an anonymity set an observer could partition
thiagorochatr Jul 27, 2026
15c56de
docs: the batching trade named, and the metric turned on ourselves
thiagorochatr Jul 27, 2026
4b0bc35
fix: a proof bound the fee but not who collects it
thiagorochatr Jul 28, 2026
66479e2
docs: the incentives, which were enforced but never written down
thiagorochatr Jul 28, 2026
0279fa5
feat: the delegation ceiling through a lookup table, which CROWD.md h…
thiagorochatr Jul 28, 2026
e4a3c78
docs: a README that answers the brief before it explains itself
thiagorochatr Jul 28, 2026
04043f5
docs: the scale question, the setup check, and how to add a protocol
thiagorochatr Jul 28, 2026
f73fe7c
fix: a settlement figure quoted from the run before last
thiagorochatr Jul 28, 2026
4b50dbe
docs: the run tally was undersold, and the gates were described wrong
thiagorochatr Jul 28, 2026
9eafd70
docs: put the paper where a reader arrives
thiagorochatr Jul 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: CI

on:
push:
branches: ["**"]
pull_request:

env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -D warnings

# Read-only by default. Nothing here publishes, comments or writes, so nothing
# here needs a token that could.
permissions:
contents: read

# Third-party actions are pinned to commit SHAs rather than tags. A tag is a
# mutable pointer: `@v4` is whatever its owner last moved it to, and a compromised
# or retagged action runs with this workflow's token and this repository's cache.
# The version each SHA corresponds to is in the comment beside it.
jobs:
# One job running `make verify`, which is the command the README tells a reader
# to run. Splitting the host checks from the SBF build let them drift: the
# end-to-end suite needs the .so, so a job without the Solana toolchain ran
# twenty tests that could only panic, and the artifact never crossed between
# runners. If CI and the documented command are the same command, they cannot
# disagree.
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Cache cargo
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

- name: Cache the Solana toolchain
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: ~/.local/share/solana
key: ${{ runner.os }}-solana-stable

- name: Install Agave
run: |
if [ ! -x "$HOME/.local/share/solana/install/active_release/bin/solana" ]; then
sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"
fi
echo "$HOME/.local/share/solana/install/active_release/bin" >> "$GITHUB_PATH"

- run: solana --version

- name: make verify
run: make verify

# The dependency tree is part of the threat surface: a compromised transitive
# crate in the proving path sees the witness and one in the client sees the
# note. Separate from `verify` because it needs no Solana toolchain and because
# a supply-chain failure should be legible as one rather than buried in a test
# log. `deny.toml` carries the policy, and every exception in it is written
# down with the reason it is an exception.
supply-chain:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- uses: EmbarkStudios/cargo-deny-action@3c6349835b2b7b196a839186cb8b78e02f7b5f25 # v2.1.1
with:
command: check advisories bans licenses sources
29 changes: 29 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
target/
**/target/

# Editor and tool state
.DS_Store
.claude/
.idea/
.vscode/

# Never
.env
keys/
*.keypair.json
notes/

# Build artefacts. The one exception is the third-party program the CPI tests
# invoke: it is a fixture the suite loads, not something this repo builds.
*.so
!programs/**/fixtures/*.so

# Vendored source, kept out of the tree
sp4/

# Live-run state, not deliverable. The note ledgers hold the secrets that
# release a pool's escrow, and the plan files record which validator each
# member of a run asked for. Both belong to one operator's run against one
# cluster, and neither means anything to a reader of this repository.
data/*-notes*.json
data/crowd-plan-*.json
Loading