From 73d138609e8bcf7a3a0b59af3e1a633feb2c003c Mon Sep 17 00:00:00 2001 From: "Edward A." Date: Fri, 28 Aug 2026 05:39:14 -0400 Subject: [PATCH 1/7] Add Q8B proof-data acquisition and cache gate --- .github/workflows/proof-data-q8b.yml | 156 ++++++++ .../midnight-ledger-static-9.0.0.json | 1 + catalog/components/midnight-srs-k0.json | 1 + catalog/components/midnight-srs-k1.json | 1 + catalog/components/midnight-srs-k10.json | 1 + catalog/components/midnight-srs-k11.json | 1 + catalog/components/midnight-srs-k12.json | 1 + catalog/components/midnight-srs-k13.json | 1 + catalog/components/midnight-srs-k14.json | 1 + catalog/components/midnight-srs-k15.json | 1 + catalog/components/midnight-srs-k16.json | 1 + catalog/components/midnight-srs-k17.json | 1 + catalog/components/midnight-srs-k18.json | 1 + catalog/components/midnight-srs-k19.json | 1 + catalog/components/midnight-srs-k2.json | 1 + catalog/components/midnight-srs-k3.json | 1 + catalog/components/midnight-srs-k4.json | 1 + catalog/components/midnight-srs-k5.json | 1 + catalog/components/midnight-srs-k6.json | 1 + catalog/components/midnight-srs-k7.json | 1 + catalog/components/midnight-srs-k8.json | 1 + catalog/components/midnight-srs-k9.json | 1 + .../ledger-static-9-member-manifest.json | 1 + catalog/proof-data/q8b-v1.json | 1 + .../phase3p/current-circuit-k-inventory.json | 1 + scripts/generate_proof_catalog.py | 322 +++++++++++++++ scripts/proof_cache_bootstrap.py | 336 ++++++++++++++++ scripts/proof_data_pipeline.py | 366 ++++++++++++++++++ scripts/proof_runtime_docker.py | 309 +++++++++++++++ scripts/validate_compact_direct.py | 19 +- tests/test_proof_data.py | 284 ++++++++++++++ 31 files changed, 1809 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/proof-data-q8b.yml create mode 100644 catalog/components/midnight-ledger-static-9.0.0.json create mode 100644 catalog/components/midnight-srs-k0.json create mode 100644 catalog/components/midnight-srs-k1.json create mode 100644 catalog/components/midnight-srs-k10.json create mode 100644 catalog/components/midnight-srs-k11.json create mode 100644 catalog/components/midnight-srs-k12.json create mode 100644 catalog/components/midnight-srs-k13.json create mode 100644 catalog/components/midnight-srs-k14.json create mode 100644 catalog/components/midnight-srs-k15.json create mode 100644 catalog/components/midnight-srs-k16.json create mode 100644 catalog/components/midnight-srs-k17.json create mode 100644 catalog/components/midnight-srs-k18.json create mode 100644 catalog/components/midnight-srs-k19.json create mode 100644 catalog/components/midnight-srs-k2.json create mode 100644 catalog/components/midnight-srs-k3.json create mode 100644 catalog/components/midnight-srs-k4.json create mode 100644 catalog/components/midnight-srs-k5.json create mode 100644 catalog/components/midnight-srs-k6.json create mode 100644 catalog/components/midnight-srs-k7.json create mode 100644 catalog/components/midnight-srs-k8.json create mode 100644 catalog/components/midnight-srs-k9.json create mode 100644 catalog/proof-data/ledger-static-9-member-manifest.json create mode 100644 catalog/proof-data/q8b-v1.json create mode 100644 evidence/phase3p/current-circuit-k-inventory.json create mode 100755 scripts/generate_proof_catalog.py create mode 100755 scripts/proof_cache_bootstrap.py create mode 100755 scripts/proof_data_pipeline.py create mode 100755 scripts/proof_runtime_docker.py create mode 100644 tests/test_proof_data.py diff --git a/.github/workflows/proof-data-q8b.yml b/.github/workflows/proof-data-q8b.yml new file mode 100644 index 0000000..e8457e6 --- /dev/null +++ b/.github/workflows/proof-data-q8b.yml @@ -0,0 +1,156 @@ +name: Q8B proof-data and offline cache gate + +on: + pull_request: + paths: + - '.github/workflows/proof-data-q8b.yml' + - 'catalog/components/midnight-srs-*.json' + - 'catalog/components/midnight-ledger-static-9.0.0.json' + - 'catalog/proof-data/**' + - 'scripts/generate_proof_catalog.py' + - 'scripts/proof_cache_bootstrap.py' + - 'scripts/proof_data_pipeline.py' + - 'scripts/proof_runtime_docker.py' + - 'scripts/validate_compact_direct.py' + - 'tests/test_proof_data.py' + push: + branches: + - main + paths: + - '.github/workflows/proof-data-q8b.yml' + - 'catalog/components/midnight-srs-*.json' + - 'catalog/components/midnight-ledger-static-9.0.0.json' + - 'catalog/proof-data/**' + - 'scripts/generate_proof_catalog.py' + - 'scripts/proof_cache_bootstrap.py' + - 'scripts/proof_data_pipeline.py' + - 'scripts/proof_runtime_docker.py' + - 'scripts/validate_compact_direct.py' + - 'tests/test_proof_data.py' + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: proof-data-q8b-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + acquire-reproduce: + runs-on: ubuntu-24.04 + timeout-minutes: 60 + steps: + - name: Check out exact source without credentials + uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 + with: + persist-credentials: false + - name: Prove runner capacity and frozen noarch contract + run: | + python3 scripts/check_runner_capability.py --runner-label ubuntu-24.04 --expected-os linux --expected-arch amd64 --require-tool docker --min-free-gib 6 + python3 -m pip install --requirement requirements-ci.txt + python3 scripts/generate_proof_catalog.py check + python3 scripts/proof_data_pipeline.py validate-manifest + python3 scripts/validate_catalog.py all --root . + python3 -m unittest -v tests.test_proof_data + - name: Independently acquire and package Q8B twice + env: + RUNNER_TEMP_ROOT: ${{ runner.temp }} + run: | + set -euo pipefail + out_a="$RUNNER_TEMP_ROOT/q8b-output-a" + out_b="$RUNNER_TEMP_ROOT/q8b-output-b" + work_a="$RUNNER_TEMP_ROOT/q8b-work-a" + work_b="$RUNNER_TEMP_ROOT/q8b-work-b" + mkdir -m 700 "$out_a" "$out_b" "$work_a" "$work_b" + python3 scripts/proof_data_pipeline.py acquire --output-root "$out_a" --work-root "$work_a" + python3 scripts/proof_data_pipeline.py verify-output --output-root "$out_a" + python3 scripts/proof_data_pipeline.py acquire --output-root "$out_b" --work-root "$work_b" + python3 scripts/proof_data_pipeline.py verify-output --output-root "$out_b" + python3 - "$out_a" "$out_b" <<'PY' + import hashlib, json, pathlib, sys + roots = [pathlib.Path(value) for value in sys.argv[1:]] + inventories = [] + for root in roots: + inventory = [] + for path in sorted((root / "payloads").iterdir(), key=lambda value: value.name): + digest = hashlib.sha256(path.read_bytes()).hexdigest() + inventory.append((path.name, path.stat().st_size, digest)) + inventories.append(inventory) + if inventories[0] != inventories[1] or len(inventories[0]) != 21: + raise SystemExit("two independent Q8B acquisitions/packages disagree") + print(json.dumps(inventories[0], separators=(",", ":"))) + PY + test "$(find "$out_a/payloads" -maxdepth 1 -type f | wc -l)" -eq 21 + test "$(find "$out_a/payloads" -maxdepth 1 -type f \( -name '*linux*' -o -name '*macos*' -o -name '*amd64*' -o -name '*arm64*' \) | wc -l)" -eq 0 + test "$(find "$out_a/payloads" -maxdepth 1 -type f -name 'bls_midnight_2p*' | wc -l)" -eq 20 + - name: Retain exact inert Phase-6 proof-data input + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: proof-data-q8b-${{ github.sha }} + path: ${{ runner.temp }}/q8b-output-a + if-no-files-found: error + retention-days: 7 + compression-level: 0 + + runtime-native: + needs: acquire-reproduce + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-24.04 + os: linux + arch: amd64 + - runner: ubuntu-24.04-arm + os: linux + arch: arm64 + runs-on: ${{ matrix.runner }} + timeout-minutes: 50 + steps: + - name: Check out exact source without credentials + uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 + with: + persist-credentials: false + - name: Download exact inert Q8B acquisition + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + with: + name: proof-data-q8b-${{ github.sha }} + path: ${{ runner.temp }}/q8b-candidate + - name: Prove native runner and candidate identity + run: | + python3 scripts/check_runner_capability.py --runner-label '${{ matrix.runner }}' --expected-os '${{ matrix.os }}' --expected-arch '${{ matrix.arch }}' --require-tool docker --min-free-gib 5 + python3 scripts/proof_data_pipeline.py verify-output --output-root '${{ runner.temp }}/q8b-candidate' + - name: Exercise real named-volume atomicity and exact proof-server consumers offline + env: + RUN_KEY: ${{ github.run_id }}-${{ github.run_attempt }} + run: | + set -euo pipefail + mkdir -m 700 '${{ runner.temp }}/q8b-runtime-work' + python3 scripts/proof_runtime_docker.py \ + --candidate-root '${{ runner.temp }}/q8b-candidate' \ + --work-root '${{ runner.temp }}/q8b-runtime-work' \ + --os '${{ matrix.os }}' \ + --arch '${{ matrix.arch }}' \ + --run-key "$RUN_KEY" \ + --output '${{ runner.temp }}/q8b-runtime-result-${{ matrix.arch }}.json' + - name: Compile Compact 0.34 ZKIR v2 and v3 from the same fixed cache generation + run: | + set -euo pipefail + python3 scripts/validate_compact_direct.py native \ + --os '${{ matrix.os }}' \ + --arch '${{ matrix.arch }}' \ + --work-dir '${{ runner.temp }}/compact-q8b-${{ matrix.arch }}' \ + --fixture tests/fixtures/compact/tiny.compact \ + --proof-cache-dir '${{ runner.temp }}/q8b-runtime-work/cache/generation' \ + > '${{ runner.temp }}/compact-q8b-result-${{ matrix.arch }}.json' + - name: Retain non-secret native runtime evidence + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: proof-runtime-q8b-${{ matrix.arch }}-${{ github.sha }} + path: | + ${{ runner.temp }}/q8b-runtime-result-${{ matrix.arch }}.json + ${{ runner.temp }}/compact-q8b-result-${{ matrix.arch }}.json + if-no-files-found: error + retention-days: 14 + compression-level: 9 diff --git a/catalog/components/midnight-ledger-static-9.0.0.json b/catalog/components/midnight-ledger-static-9.0.0.json new file mode 100644 index 0000000..8744b95 --- /dev/null +++ b/catalog/components/midnight-ledger-static-9.0.0.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"cacheNamespace":"9","exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"kind":"ledger-static","ledgerStaticRevision":"manifest-sha256:0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8","ledgerStaticSemver":"9.0.0","memberManifestSha256":"0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8"},"componentId":"midnight-ledger-static-9.0.0","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-ledger-static","install":{"mode":"0644","pathTemplate":"{MIDNIGHT_PP}/{memberPath}"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-ledger/blob/7a89f45d29792be7e09ca5eb246f1e69f0b2a179/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"zip","correctionTemplate":"midnight-ledger-static-noarch-9.0.0-manifest-sha256-{memberManifestSha256}.zip","limits":{"maxCompressedBytes":25165824,"maxExpandedBytes":22020096,"maxExpansionRatio":100,"maxMembers":16},"members":[{"mode":"0755","path":"dust","type":"directory"},{"mode":"0755","path":"dust/9","type":"directory"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"type":"file"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"type":"file"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"type":"file"},{"mode":"0755","path":"zswap","type":"directory"},{"mode":"0755","path":"zswap/9","type":"directory"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"type":"file"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"type":"file"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"type":"file"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"type":"file"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"type":"file"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"type":"file"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"type":"file"},{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"type":"file"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"type":"file"}],"outerTemplate":"midnight-ledger-static-noarch-9.0.0.zip"},"operation":"assemble-data","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"buildFlags":["--deterministic","--member-manifest","--zip-epoch=1980-01-01T00:00:00Z"],"commitSha":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","lockedDependencies":true,"repository":"midnightntwrk/midnight-ledger","toolchain":"docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7","toolchainDigest":"519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7"},"validation":{"probes":["sha256","size","archive-safety","member-contract","proof-compatibility","member-manifest"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k0.json b/catalog/components/midnight-srs-k0.json new file mode 100644 index 0000000..7841ae8 --- /dev/null +++ b/catalog/components/midnight-srs-k0.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p0","k":0,"kind":"srs","officialAlias":null,"srsGeneration":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823"},"componentId":"midnight-srs-k0","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p0","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-ledger/blob/7a89f45d29792be7e09ca5eb246f1e69f0b2a179/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p0-{generation}.bin","outerTemplate":"bls_midnight_2p0","rawName":"bls_midnight_2p0"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","object":{"id":"sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","name":"bls_midnight_2p0","officialName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourcePath":"bls_midnight_2p0","url":"https://srs.midnight.network/bls_midnight_2p0"},"repository":"midnightntwrk/midnight-ledger"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k1.json b/catalog/components/midnight-srs-k1.json new file mode 100644 index 0000000..90b24e4 --- /dev/null +++ b/catalog/components/midnight-srs-k1.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p1","k":1,"kind":"srs","officialAlias":"midnight-srs-2p1","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k1","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p1","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p1-{generation}.bin","outerTemplate":"bls_midnight_2p1","rawName":"bls_midnight_2p1"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","name":"bls_midnight_2p1","officialName":"midnight-srs-2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourcePath":"bls_midnight_2p1","url":"https://srs.midnight.network/bls_midnight_2p1"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k10.json b/catalog/components/midnight-srs-k10.json new file mode 100644 index 0000000..3a6ca22 --- /dev/null +++ b/catalog/components/midnight-srs-k10.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p10","k":10,"kind":"srs","officialAlias":"midnight-srs-2p10","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k10","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p10","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p10-{generation}.bin","outerTemplate":"bls_midnight_2p10","rawName":"bls_midnight_2p10"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","name":"bls_midnight_2p10","officialName":"midnight-srs-2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourcePath":"bls_midnight_2p10","url":"https://srs.midnight.network/bls_midnight_2p10"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k11.json b/catalog/components/midnight-srs-k11.json new file mode 100644 index 0000000..39a1031 --- /dev/null +++ b/catalog/components/midnight-srs-k11.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p11","k":11,"kind":"srs","officialAlias":"midnight-srs-2p11","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k11","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p11","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p11-{generation}.bin","outerTemplate":"bls_midnight_2p11","rawName":"bls_midnight_2p11"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","name":"bls_midnight_2p11","officialName":"midnight-srs-2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourcePath":"bls_midnight_2p11","url":"https://srs.midnight.network/bls_midnight_2p11"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k12.json b/catalog/components/midnight-srs-k12.json new file mode 100644 index 0000000..62eb331 --- /dev/null +++ b/catalog/components/midnight-srs-k12.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p12","k":12,"kind":"srs","officialAlias":"midnight-srs-2p12","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k12","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p12","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p12-{generation}.bin","outerTemplate":"bls_midnight_2p12","rawName":"bls_midnight_2p12"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","name":"bls_midnight_2p12","officialName":"midnight-srs-2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourcePath":"bls_midnight_2p12","url":"https://srs.midnight.network/bls_midnight_2p12"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k13.json b/catalog/components/midnight-srs-k13.json new file mode 100644 index 0000000..73aa6a9 --- /dev/null +++ b/catalog/components/midnight-srs-k13.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p13","k":13,"kind":"srs","officialAlias":"midnight-srs-2p13","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k13","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p13","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p13-{generation}.bin","outerTemplate":"bls_midnight_2p13","rawName":"bls_midnight_2p13"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","name":"bls_midnight_2p13","officialName":"midnight-srs-2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourcePath":"bls_midnight_2p13","url":"https://srs.midnight.network/bls_midnight_2p13"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k14.json b/catalog/components/midnight-srs-k14.json new file mode 100644 index 0000000..0a44845 --- /dev/null +++ b/catalog/components/midnight-srs-k14.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p14","k":14,"kind":"srs","officialAlias":"midnight-srs-2p14","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k14","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p14","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p14-{generation}.bin","outerTemplate":"bls_midnight_2p14","rawName":"bls_midnight_2p14"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","name":"bls_midnight_2p14","officialName":"midnight-srs-2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourcePath":"bls_midnight_2p14","url":"https://srs.midnight.network/bls_midnight_2p14"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k15.json b/catalog/components/midnight-srs-k15.json new file mode 100644 index 0000000..109aa49 --- /dev/null +++ b/catalog/components/midnight-srs-k15.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p15","k":15,"kind":"srs","officialAlias":"midnight-srs-2p15","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k15","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p15","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p15-{generation}.bin","outerTemplate":"bls_midnight_2p15","rawName":"bls_midnight_2p15"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","name":"bls_midnight_2p15","officialName":"midnight-srs-2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourcePath":"bls_midnight_2p15","url":"https://srs.midnight.network/bls_midnight_2p15"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k16.json b/catalog/components/midnight-srs-k16.json new file mode 100644 index 0000000..59633da --- /dev/null +++ b/catalog/components/midnight-srs-k16.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p16","k":16,"kind":"srs","officialAlias":"midnight-srs-2p16","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k16","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p16","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p16-{generation}.bin","outerTemplate":"bls_midnight_2p16","rawName":"bls_midnight_2p16"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","name":"bls_midnight_2p16","officialName":"midnight-srs-2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourcePath":"bls_midnight_2p16","url":"https://srs.midnight.network/bls_midnight_2p16"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k17.json b/catalog/components/midnight-srs-k17.json new file mode 100644 index 0000000..b1cd08a --- /dev/null +++ b/catalog/components/midnight-srs-k17.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p17","k":17,"kind":"srs","officialAlias":"midnight-srs-2p17","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k17","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p17","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p17-{generation}.bin","outerTemplate":"bls_midnight_2p17","rawName":"bls_midnight_2p17"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","name":"bls_midnight_2p17","officialName":"midnight-srs-2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourcePath":"bls_midnight_2p17","url":"https://srs.midnight.network/bls_midnight_2p17"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k18.json b/catalog/components/midnight-srs-k18.json new file mode 100644 index 0000000..36d468f --- /dev/null +++ b/catalog/components/midnight-srs-k18.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p18","k":18,"kind":"srs","officialAlias":"midnight-srs-2p18","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k18","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p18","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p18-{generation}.bin","outerTemplate":"bls_midnight_2p18","rawName":"bls_midnight_2p18"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","name":"bls_midnight_2p18","officialName":"midnight-srs-2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourcePath":"bls_midnight_2p18","url":"https://srs.midnight.network/bls_midnight_2p18"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k19.json b/catalog/components/midnight-srs-k19.json new file mode 100644 index 0000000..7a9ff90 --- /dev/null +++ b/catalog/components/midnight-srs-k19.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p19","k":19,"kind":"srs","officialAlias":"midnight-srs-2p19","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k19","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p19","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p19-{generation}.bin","outerTemplate":"bls_midnight_2p19","rawName":"bls_midnight_2p19"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","name":"bls_midnight_2p19","officialName":"midnight-srs-2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourcePath":"bls_midnight_2p19","url":"https://srs.midnight.network/bls_midnight_2p19"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k2.json b/catalog/components/midnight-srs-k2.json new file mode 100644 index 0000000..322198c --- /dev/null +++ b/catalog/components/midnight-srs-k2.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p2","k":2,"kind":"srs","officialAlias":"midnight-srs-2p2","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k2","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p2","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p2-{generation}.bin","outerTemplate":"bls_midnight_2p2","rawName":"bls_midnight_2p2"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","name":"bls_midnight_2p2","officialName":"midnight-srs-2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourcePath":"bls_midnight_2p2","url":"https://srs.midnight.network/bls_midnight_2p2"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k3.json b/catalog/components/midnight-srs-k3.json new file mode 100644 index 0000000..a9847b9 --- /dev/null +++ b/catalog/components/midnight-srs-k3.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p3","k":3,"kind":"srs","officialAlias":"midnight-srs-2p3","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k3","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p3","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p3-{generation}.bin","outerTemplate":"bls_midnight_2p3","rawName":"bls_midnight_2p3"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","name":"bls_midnight_2p3","officialName":"midnight-srs-2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourcePath":"bls_midnight_2p3","url":"https://srs.midnight.network/bls_midnight_2p3"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k4.json b/catalog/components/midnight-srs-k4.json new file mode 100644 index 0000000..4dec3dd --- /dev/null +++ b/catalog/components/midnight-srs-k4.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p4","k":4,"kind":"srs","officialAlias":"midnight-srs-2p4","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k4","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p4","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p4-{generation}.bin","outerTemplate":"bls_midnight_2p4","rawName":"bls_midnight_2p4"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","name":"bls_midnight_2p4","officialName":"midnight-srs-2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourcePath":"bls_midnight_2p4","url":"https://srs.midnight.network/bls_midnight_2p4"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k5.json b/catalog/components/midnight-srs-k5.json new file mode 100644 index 0000000..e064085 --- /dev/null +++ b/catalog/components/midnight-srs-k5.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p5","k":5,"kind":"srs","officialAlias":"midnight-srs-2p5","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k5","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p5","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p5-{generation}.bin","outerTemplate":"bls_midnight_2p5","rawName":"bls_midnight_2p5"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","name":"bls_midnight_2p5","officialName":"midnight-srs-2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourcePath":"bls_midnight_2p5","url":"https://srs.midnight.network/bls_midnight_2p5"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k6.json b/catalog/components/midnight-srs-k6.json new file mode 100644 index 0000000..569ed53 --- /dev/null +++ b/catalog/components/midnight-srs-k6.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p6","k":6,"kind":"srs","officialAlias":"midnight-srs-2p6","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k6","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p6","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p6-{generation}.bin","outerTemplate":"bls_midnight_2p6","rawName":"bls_midnight_2p6"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","name":"bls_midnight_2p6","officialName":"midnight-srs-2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourcePath":"bls_midnight_2p6","url":"https://srs.midnight.network/bls_midnight_2p6"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k7.json b/catalog/components/midnight-srs-k7.json new file mode 100644 index 0000000..f051931 --- /dev/null +++ b/catalog/components/midnight-srs-k7.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p7","k":7,"kind":"srs","officialAlias":"midnight-srs-2p7","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k7","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p7","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p7-{generation}.bin","outerTemplate":"bls_midnight_2p7","rawName":"bls_midnight_2p7"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","name":"bls_midnight_2p7","officialName":"midnight-srs-2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourcePath":"bls_midnight_2p7","url":"https://srs.midnight.network/bls_midnight_2p7"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k8.json b/catalog/components/midnight-srs-k8.json new file mode 100644 index 0000000..11dd6fe --- /dev/null +++ b/catalog/components/midnight-srs-k8.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p8","k":8,"kind":"srs","officialAlias":"midnight-srs-2p8","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k8","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p8","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p8-{generation}.bin","outerTemplate":"bls_midnight_2p8","rawName":"bls_midnight_2p8"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","name":"bls_midnight_2p8","officialName":"midnight-srs-2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourcePath":"bls_midnight_2p8","url":"https://srs.midnight.network/bls_midnight_2p8"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/components/midnight-srs-k9.json b/catalog/components/midnight-srs-k9.json new file mode 100644 index 0000000..807d978 --- /dev/null +++ b/catalog/components/midnight-srs-k9.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","compatibility":{"exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"installedAlias":"bls_midnight_2p9","k":9,"kind":"srs","officialAlias":"midnight-srs-2p9","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","srsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8"},"componentId":"midnight-srs-k9","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-srs","install":{"alias":"bls_midnight_2p9","mode":"0644"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-trusted-setup/blob/3ea610263b228af24840f7b00661ee22360db6d8/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"raw","correctionTemplate":"midnight-srs-noarch-2p9-{generation}.bin","outerTemplate":"bls_midnight_2p9","rawName":"bls_midnight_2p9"},"operation":"identity-mirror","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"commitSha":"3ea610263b228af24840f7b00661ee22360db6d8","object":{"id":"sha256:b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","name":"bls_midnight_2p9","officialName":"midnight-srs-2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourcePath":"bls_midnight_2p9","url":"https://srs.midnight.network/bls_midnight_2p9"},"repository":"midnightntwrk/midnight-trusted-setup"},"validation":{"probes":["sha256","size","raw-name","raw-mode","proof-alias","proof-compatibility"]}} \ No newline at end of file diff --git a/catalog/proof-data/ledger-static-9-member-manifest.json b/catalog/proof-data/ledger-static-9-member-manifest.json new file mode 100644 index 0000000..529213a --- /dev/null +++ b/catalog/proof-data/ledger-static-9-member-manifest.json @@ -0,0 +1 @@ +{"members":[{"mode":"0755","path":"dust","type":"directory"},{"mode":"0755","path":"dust/9","type":"directory"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"type":"file"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"type":"file"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"type":"file"},{"mode":"0755","path":"zswap","type":"directory"},{"mode":"0755","path":"zswap/9","type":"directory"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"type":"file"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"type":"file"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"type":"file"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"type":"file"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"type":"file"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"type":"file"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"type":"file"},{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"type":"file"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"type":"file"}],"schemaVersion":"member-manifest-v1"} \ No newline at end of file diff --git a/catalog/proof-data/q8b-v1.json b/catalog/proof-data/q8b-v1.json new file mode 100644 index 0000000..58c5b95 --- /dev/null +++ b/catalog/proof-data/q8b-v1.json @@ -0,0 +1 @@ +{"artifactKind":"proof-data","cacheContract":{"bootstrapMount":"read-write","cacheRootResolution":["MIDNIGHT_PP","XDG_CACHE_HOME/midnight/zk-params","$HOME/.cache/midnight/zk-params"],"currentPointer":"/proof-params/current","defaultSourceUrl":"https://srs.midnight.network/","generationTemplate":"/proof-params/generations/{combinedManifestSha256}","githubAsMidnightParamSourceAllowed":false,"lock":"/proof-params/.bootstrap.lock","persistentParent":"/proof-params","readerMount":"read-only"},"compactCompatibility":{"backends":["zkir-v2","zkir-v3"],"ledgerMajor":9,"runtime":"0.19.0","version":"0.34.0","warehousePayloadAllowed":false},"counts":{"canonicalInputBytes":223087290,"ledgerMemberBytes":21753130,"ledgerPayloadCount":1,"payloadCount":21,"srsBytes":201334160,"srsPayloadCount":20},"decision":"Q8=B","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","evidencePolicy":{"legalCertaintyClaimed":false,"lineageMemberManifestRequired":true,"perBlobLicenseFileAvailable":false,"redistributionBasis":"Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload","softwareSbom":"not-applicable-proof-data"},"futureAdmission":{"appendOnly":true,"explicitGenerationRequiredWhenMultiple":true,"explicitMemberManifestRequiredWhenMultiple":true,"implicitLatestAllowed":false,"ledgerSemverBump":"midnight-ledger-static-noarch-{semver}.zip","sameKCorrection":"midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin","sameSemverCorrection":"midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip"},"ledgerStatic":{"aggregateMemberBytes":21753130,"cacheNamespace":"9","componentId":"midnight-ledger-static-9.0.0","ledgerStaticRevision":"manifest-sha256:0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8","ledgerStaticSemver":"9.0.0","memberManifestPath":"catalog/proof-data/ledger-static-9-member-manifest.json","memberManifestSha256":"0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8","members":[{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"sourceUrl":"https://srs.midnight.network/zswap/9/output.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/output.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"sourceUrl":"https://srs.midnight.network/zswap/9/output.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"sourceUrl":"https://srs.midnight.network/dust/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"sourceUrl":"https://srs.midnight.network/dust/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"sourceUrl":"https://srs.midnight.network/dust/9/spend.bzkir","transformation":"unchanged-archive-member"}],"releaseName":"midnight-ledger-static-noarch-9.0.0.zip","transformation":"deterministic-zip-assembly-from-unchanged-members"},"platform":"noarch","proofServerCompatibility":{"accepted":{"cacheNamespace":"9","images":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","version":"9.0.0-rc.5"},"rejectedStatic9":{"cacheNamespace":"10","images":{"linux/amd64":"sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613","linux/arm64":"sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb"},"mayReuseSrsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","publicMultiarchTag":false,"requiresLedgerStaticSemver":"10.0.0","sourceCommit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","version":"9.0.0-rc.7"}},"releaseMutability":"mutable-warehouse","schemaVersion":"proof-data-set-v1","scope":{"customProvingKeysIncluded":false,"directGithubAssetForbiddenK":[24,25],"futureKRequiresReview":[20,21,22,23,24,25],"observedCircuitK":[5,8,9,10,11,12,13,14,15,16,18,19],"srsK":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"startupPrefetchK":[10,11,12,13,14,15]},"setId":"q8b-k0-k19-ledger-static-9","sourcePins":{"ledgerStatic10Negative":{"cacheNamespace":"10","commit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","ledgerStaticSemver":"10.0.0","repository":"midnightntwrk/midnight-ledger","tree":"bfa37732f879bd29b4a67f7a1567260431c0f43b"},"ledgerStatic9":{"cacheNamespace":"9","commit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","ledgerStaticSemver":"9.0.0","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","providerPath":"base-crypto/src/data_provider.rs","providerSha256":"4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a","repository":"midnightntwrk/midnight-ledger","startupPath":"proof-server/src/main.rs","startupSha256":"342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64","tree":"0b39ecaa6502dcb05352786df2b02bb0a622ee38"},"trustedSetup":{"catalogPath":"MIDNIGHT_SRS_CATALOG.md","catalogSha256":"8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f","commit":"3ea610263b228af24840f7b00661ee22360db6d8","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","repository":"midnightntwrk/midnight-trusted-setup","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","tree":"19888a217d9228324dff60b685b50deea4afcac5"}},"srs":[{"artifactKind":"proof-data","componentId":"midnight-srs-k0","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","installName":"bls_midnight_2p0","k":0,"mode":"0644","officialAlias":null,"officialUrl":null,"platform":"noarch","releaseName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p0","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k1","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p1","k":1,"mode":"0644","officialAlias":"midnight-srs-2p1","officialUrl":"https://srs.midnight.network/midnight-srs-2p1","platform":"noarch","releaseName":"bls_midnight_2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p1","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k2","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p2","k":2,"mode":"0644","officialAlias":"midnight-srs-2p2","officialUrl":"https://srs.midnight.network/midnight-srs-2p2","platform":"noarch","releaseName":"bls_midnight_2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p2","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k3","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p3","k":3,"mode":"0644","officialAlias":"midnight-srs-2p3","officialUrl":"https://srs.midnight.network/midnight-srs-2p3","platform":"noarch","releaseName":"bls_midnight_2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p3","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k4","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p4","k":4,"mode":"0644","officialAlias":"midnight-srs-2p4","officialUrl":"https://srs.midnight.network/midnight-srs-2p4","platform":"noarch","releaseName":"bls_midnight_2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p4","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k5","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p5","k":5,"mode":"0644","officialAlias":"midnight-srs-2p5","officialUrl":"https://srs.midnight.network/midnight-srs-2p5","platform":"noarch","releaseName":"bls_midnight_2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p5","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k6","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p6","k":6,"mode":"0644","officialAlias":"midnight-srs-2p6","officialUrl":"https://srs.midnight.network/midnight-srs-2p6","platform":"noarch","releaseName":"bls_midnight_2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p6","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k7","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p7","k":7,"mode":"0644","officialAlias":"midnight-srs-2p7","officialUrl":"https://srs.midnight.network/midnight-srs-2p7","platform":"noarch","releaseName":"bls_midnight_2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p7","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k8","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p8","k":8,"mode":"0644","officialAlias":"midnight-srs-2p8","officialUrl":"https://srs.midnight.network/midnight-srs-2p8","platform":"noarch","releaseName":"bls_midnight_2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p8","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k9","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p9","k":9,"mode":"0644","officialAlias":"midnight-srs-2p9","officialUrl":"https://srs.midnight.network/midnight-srs-2p9","platform":"noarch","releaseName":"bls_midnight_2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p9","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k10","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p10","k":10,"mode":"0644","officialAlias":"midnight-srs-2p10","officialUrl":"https://srs.midnight.network/midnight-srs-2p10","platform":"noarch","releaseName":"bls_midnight_2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p10","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k11","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p11","k":11,"mode":"0644","officialAlias":"midnight-srs-2p11","officialUrl":"https://srs.midnight.network/midnight-srs-2p11","platform":"noarch","releaseName":"bls_midnight_2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p11","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k12","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p12","k":12,"mode":"0644","officialAlias":"midnight-srs-2p12","officialUrl":"https://srs.midnight.network/midnight-srs-2p12","platform":"noarch","releaseName":"bls_midnight_2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p12","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k13","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p13","k":13,"mode":"0644","officialAlias":"midnight-srs-2p13","officialUrl":"https://srs.midnight.network/midnight-srs-2p13","platform":"noarch","releaseName":"bls_midnight_2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p13","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k14","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p14","k":14,"mode":"0644","officialAlias":"midnight-srs-2p14","officialUrl":"https://srs.midnight.network/midnight-srs-2p14","platform":"noarch","releaseName":"bls_midnight_2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p14","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k15","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p15","k":15,"mode":"0644","officialAlias":"midnight-srs-2p15","officialUrl":"https://srs.midnight.network/midnight-srs-2p15","platform":"noarch","releaseName":"bls_midnight_2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p15","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k16","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p16","k":16,"mode":"0644","officialAlias":"midnight-srs-2p16","officialUrl":"https://srs.midnight.network/midnight-srs-2p16","platform":"noarch","releaseName":"bls_midnight_2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p16","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k17","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p17","k":17,"mode":"0644","officialAlias":"midnight-srs-2p17","officialUrl":"https://srs.midnight.network/midnight-srs-2p17","platform":"noarch","releaseName":"bls_midnight_2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p17","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k18","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p18","k":18,"mode":"0644","officialAlias":"midnight-srs-2p18","officialUrl":"https://srs.midnight.network/midnight-srs-2p18","platform":"noarch","releaseName":"bls_midnight_2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p18","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k19","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p19","k":19,"mode":"0644","officialAlias":"midnight-srs-2p19","officialUrl":"https://srs.midnight.network/midnight-srs-2p19","platform":"noarch","releaseName":"bls_midnight_2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p19","transformation":"unchanged-identity-mirror"}],"warning":"DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use."} \ No newline at end of file diff --git a/evidence/phase3p/current-circuit-k-inventory.json b/evidence/phase3p/current-circuit-k-inventory.json new file mode 100644 index 0000000..36077cf --- /dev/null +++ b/evidence/phase3p/current-circuit-k-inventory.json @@ -0,0 +1 @@ +{"cacheEvidence":{"cachePath":".cache/demo-infra-live-38360/midnight/zk-params","cacheSourceClone":"/home/eddie/todo/infra/experiments/00001-midnight-2-offers","mount":"read-only","network":"isolated-internal"},"compact":{"officialVersion":"0.34.0","phase3Evidence":"representative companion-independent ZKIR-v2 and ZKIR-v3 compilation selected K13","status":"covered-by-phase3-pinned-official-asset-gate"},"historicalLowK":{"artifactLocated":false,"assertion":"retained project history records a K5 compilation request","publicationImpact":"Q8=B includes K5 regardless","status":"project-history-assertion-only"},"optionalK18":{"currentArtifactLocated":false,"publicationImpact":"Q8=B includes public K18 SRS regardless","status":"disabled-development-overlay-not-queried"},"proofServer":{"imageDigest":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","logSha256":"755b1b3b4498beb2ceeaca322eec566d712a39e548cec7032ed110d419765abd","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","variant":"experimental","version":"9.0.0-rc.5"},"query":{"allKWithinQ8b":true,"distinctK":[8,9,13,14,16,19],"endpoint":"POST /k","queriedAt":"2026-08-28","rowCount":19,"scope":"every current managed offer-files and AA BZKIR in the isolated live-demo source containers; duplicated offer-files rows retained by family"},"rows":[{"bzkirSha256":"91a418f276d1939b986110cf269ab4a2ed0666776b564528050298f7a73476f2","bzkirSize":1849,"circuit":"accountRecord.bzkir","family":"aa-manager","k":9},{"bzkirSha256":"3d7a068145f0114eda66a325d4457f94d1ff9072971573770b30821d6f7c37dd","bzkirSize":5250,"circuit":"depositShielded.bzkir","family":"aa-manager","k":16},{"bzkirSha256":"019da5ed6b6c9d462d0bc4f2b2cdea0b54fcf2716fe338b9c43833e45eb02e71","bzkirSize":1582,"circuit":"depositUnshielded.bzkir","family":"aa-manager","k":13},{"bzkirSha256":"ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b","bzkirSize":184411,"circuit":"execute.bzkir","family":"aa-manager","k":19},{"bzkirSha256":"9a1c06ca80e4e6b76d1d5000e46a6c262cb74c944f030b55f6f0e380fb362fee","bzkirSize":242,"circuit":"isRegistered.bzkir","family":"aa-manager","k":8},{"bzkirSha256":"dd66af86fa758b35ea4087557020e4c1dc34134639783b78bf548a4331141a1f","bzkirSize":248,"circuit":"poolHasColour.bzkir","family":"aa-manager","k":8},{"bzkirSha256":"94914145af308817183a7246f3ccb62743802a17b8ec27a38f917b28976f81a5","bzkirSize":530,"circuit":"poolValue.bzkir","family":"aa-manager","k":8},{"bzkirSha256":"5adeccf827b1aadd273861d409ad864819196b552edac0174eee3740748cd2cf","bzkirSize":572,"circuit":"shieldedAccountBalance.bzkir","family":"aa-manager","k":13},{"bzkirSha256":"ecd72e35e20b49713c02b70571a5dda12eb138eb01fa0514153d9859a4ebddd3","bzkirSize":576,"circuit":"unshieldedAccountBalance.bzkir","family":"aa-manager","k":13},{"bzkirSha256":"9c9c0ba701949b646936f4e09bd34f461e651c6a66c3744b139f267303d92dbd","bzkirSize":2023,"circuit":"mintShieldedTo.bzkir","family":"aa-minter","k":14},{"bzkirSha256":"aba4855d5fbbdde3d70987efad56052c905aa8963e328fc92d64d0b7884bab24","bzkirSize":2334,"circuit":"mintUnshieldedTo.bzkir","family":"aa-minter","k":13},{"bzkirSha256":"1fdb0a4ec84ade08f81c3b9763e4c095d52ea7c3e8f6c2c17b21ffa174fe7399","bzkirSize":505,"circuit":"shieldedColor.bzkir","family":"aa-minter","k":13},{"bzkirSha256":"6896132052b6ca1cf378bf1eef0028f56f6946b95cf3b3c8c348487ca634a79d","bzkirSize":505,"circuit":"unshieldedColor.bzkir","family":"aa-minter","k":13},{"bzkirSha256":"33465f34039cfaf9a81229bd202182254f653e42faa9e5ad1915af2ed9fa0e68","bzkirSize":117,"circuit":"incrementNoun.bzkir","family":"aa-offerfiles","k":8},{"bzkirSha256":"2778d50b9221d19eb06834ba6fffa17f3a43a02a0c4c6396de7ae878ad25a0c7","bzkirSize":470,"circuit":"mint_shielded.bzkir","family":"aa-offerfiles","k":14},{"bzkirSha256":"0edbeaecb343c9e5395a843c9efa1873918e476625f74c0b021ce5ef95250ef5","bzkirSize":471,"circuit":"mint_unshielded.bzkir","family":"aa-offerfiles","k":13},{"bzkirSha256":"33465f34039cfaf9a81229bd202182254f653e42faa9e5ad1915af2ed9fa0e68","bzkirSize":117,"circuit":"incrementNoun.bzkir","family":"kernel-offerfiles","k":8},{"bzkirSha256":"2778d50b9221d19eb06834ba6fffa17f3a43a02a0c4c6396de7ae878ad25a0c7","bzkirSize":470,"circuit":"mint_shielded.bzkir","family":"kernel-offerfiles","k":14},{"bzkirSha256":"0edbeaecb343c9e5395a843c9efa1873918e476625f74c0b021ce5ef95250ef5","bzkirSize":471,"circuit":"mint_unshielded.bzkir","family":"kernel-offerfiles","k":13}],"schemaVersion":"current-circuit-k-inventory-v1","sourcePins":{"aa":"713a20215f33e02904ea5bd699b7de7f76562e1b","demo":"a9d918a","kernel":"b1420c4af6ed8b2510140418e5138d282365f9c6"}} diff --git a/scripts/generate_proof_catalog.py b/scripts/generate_proof_catalog.py new file mode 100755 index 0000000..35ca7f1 --- /dev/null +++ b/scripts/generate_proof_catalog.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python3 +"""Generate the frozen Q8=B proof-data catalog from independently pinned Phase-0 evidence.""" + +from __future__ import annotations + +import argparse +import hashlib +import sys +from pathlib import Path + +from forge_io import ForgeError, canonical_bytes, create_file_atomic, expect, load_json + + +ROOT = Path(__file__).resolve().parents[1] +PINS_PATH = ROOT / "evidence/phase0/source-and-proof-pins.json" +OUTPUT_ROOT = ROOT / "catalog" +LICENSE_SHA256 = "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" +CATALOG_SHA256 = "8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f" +PROVIDER_SHA256 = "4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a" +STARTUP_SHA256 = "342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64" +ASSEMBLY_TOOLCHAIN_DIGEST = "519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7" +ASSEMBLY_TOOLCHAIN = f"docker.io/library/python:3.12.11-slim-bookworm@sha256:{ASSEMBLY_TOOLCHAIN_DIGEST}" +TRUSTED_SETUP = "3ea610263b228af24840f7b00661ee22360db6d8" +LEDGER9 = "7a89f45d29792be7e09ca5eb246f1e69f0b2a179" +LEDGER10 = "cd652d7f97b34b805bb5f0310ce7434eb883af38" +ROOT_POT = "df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce" +PLAIN = "sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9" +EXPERIMENTAL = "sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1" +RC7_AMD64 = "sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613" +RC7_ARM64 = "sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb" + + +def exact_rc5_consumer() -> dict: + return { + "proofServerVersion": "9.0.0-rc.5", + "sourceCommit": LEDGER9, + "imageDigests": {"experimental": EXPERIMENTAL, "plain": PLAIN}, + "ledgerStaticSemver": "9.0.0", + "cacheNamespace": "9", + } + + +def license_record(repository: str, commit: str) -> dict: + return { + "spdx": "Apache-2.0", + "evidence": [ + { + "url": f"https://github.com/{repository}/blob/{commit}/LICENSE", + "sha256": LICENSE_SHA256, + } + ], + "redistributionStatement": ( + "The Apache-2.0 source repository publicly distributes and hash-pins these unchanged " + "public proof objects. The object endpoint has no per-blob license file; publishing " + "requires an explicit owner acceptance record and makes no broader legal claim." + ), + "perBlobLicenseAvailable": False, + } + + +def ledger_member_manifest(pins: dict) -> dict: + files = {row["path"]: row for row in pins["proofData"]["ledgerStatic"]["members"]} + rows: list[dict] = [] + directories = sorted({part for path in files for part in (path.split("/")[0], "/".join(path.split("/")[:2]))}) + for path in sorted(set(directories) | set(files)): + if path in files: + row = files[path] + rows.append({"path": path, "type": "file", "mode": "0644", "size": row["size"], "sha256": row["sha256"]}) + else: + rows.append({"path": path, "type": "directory", "mode": "0755"}) + return {"schemaVersion": "member-manifest-v1", "members": rows} + + +def srs_component(row: dict) -> dict: + k = row["k"] + is_k0 = k == 0 + repository = "midnightntwrk/midnight-ledger" if is_k0 else "midnightntwrk/midnight-trusted-setup" + commit = LEDGER9 if is_k0 else TRUSTED_SETUP + official_name = row["officialAlias"] or row["releaseName"] + compatibility = { + "kind": "srs", + "k": k, + "srsGeneration": row["generation"], + "officialAlias": row["officialAlias"], + "installedAlias": row["installName"], + "exactConsumers": [exact_rc5_consumer()], + } + if not is_k0: + compatibility["rootPotSha256"] = ROOT_POT + return { + "schemaVersion": "component-v1", + "componentId": f"midnight-srs-k{k}", + "artifactKind": "proof-data", + "family": "midnight-srs", + "operation": "identity-mirror", + "source": { + "repository": repository, + "commitSha": commit, + "object": { + "id": f"sha256:{row['sha256']}", + "name": row["releaseName"], + "url": f"https://srs.midnight.network/{row['releaseName']}", + "size": row["size"], + "sha256": row["sha256"], + "sourcePath": row["releaseName"], + "officialName": official_name, + }, + }, + "destination": {"repository": "effectstream/binaries", "tag": "0.3.120"}, + "distributionTier": "development-only", + "releaseMutability": "mutable-warehouse", + "license": license_record(repository, commit), + "naming": { + "outerTemplate": row["releaseName"], + "container": "raw", + "appendOnly": True, + "rawName": row["releaseName"], + "correctionTemplate": f"midnight-srs-noarch-2p{k}-{{generation}}.bin", + }, + "install": {"mode": "0644", "alias": row["installName"]}, + "platform": "noarch", + "compatibility": compatibility, + "signing": None, + "lineageManifest": {"required": True, "memberDigestsRequired": True}, + "validation": {"probes": ["sha256", "size", "raw-name", "raw-mode", "proof-alias", "proof-compatibility"]}, + } + + +def ledger_component(member_manifest: dict, member_digest: str) -> dict: + return { + "schemaVersion": "component-v1", + "componentId": "midnight-ledger-static-9.0.0", + "artifactKind": "proof-data", + "family": "midnight-ledger-static", + "operation": "assemble-data", + "source": { + "repository": "midnightntwrk/midnight-ledger", + "commitSha": LEDGER9, + "lockedDependencies": True, + "toolchain": ASSEMBLY_TOOLCHAIN, + "toolchainDigest": ASSEMBLY_TOOLCHAIN_DIGEST, + "buildFlags": ["--deterministic", "--member-manifest", "--zip-epoch=1980-01-01T00:00:00Z"], + }, + "destination": {"repository": "effectstream/binaries", "tag": "0.3.120"}, + "distributionTier": "development-only", + "releaseMutability": "mutable-warehouse", + "license": license_record("midnightntwrk/midnight-ledger", LEDGER9), + "naming": { + "outerTemplate": "midnight-ledger-static-noarch-9.0.0.zip", + "container": "zip", + "appendOnly": True, + "correctionTemplate": "midnight-ledger-static-noarch-9.0.0-manifest-sha256-{memberManifestSha256}.zip", + "members": member_manifest["members"], + "limits": { + "maxCompressedBytes": 25165824, + "maxExpandedBytes": 22020096, + "maxMembers": 16, + "maxExpansionRatio": 100, + }, + }, + "install": {"mode": "0644", "pathTemplate": "{MIDNIGHT_PP}/{memberPath}"}, + "platform": "noarch", + "compatibility": { + "kind": "ledger-static", + "ledgerStaticSemver": "9.0.0", + "cacheNamespace": "9", + "memberManifestSha256": member_digest, + "ledgerStaticRevision": f"manifest-sha256:{member_digest}", + "exactConsumers": [exact_rc5_consumer()], + }, + "signing": None, + "lineageManifest": {"required": True, "memberDigestsRequired": True}, + "validation": {"probes": ["sha256", "size", "archive-safety", "member-contract", "proof-compatibility", "member-manifest"]}, + } + + +def proof_set(pins: dict, member_manifest: dict, member_digest: str) -> dict: + srs = [] + for row in pins["proofData"]["srs"]: + item = dict(row) + item.update( + { + "artifactKind": "proof-data", + "platform": "noarch", + "sourceUrl": f"https://srs.midnight.network/{row['releaseName']}", + "officialUrl": None if row["officialAlias"] is None else f"https://srs.midnight.network/{row['officialAlias']}", + "transformation": "unchanged-identity-mirror", + "componentId": f"midnight-srs-k{row['k']}", + } + ) + srs.append(item) + ledger_members = [dict(row, sourceUrl=f"https://srs.midnight.network/{row['path']}", transformation="unchanged-archive-member") for row in pins["proofData"]["ledgerStatic"]["members"]] + return { + "schemaVersion": "proof-data-set-v1", + "setId": "q8b-k0-k19-ledger-static-9", + "decision": "Q8=B", + "artifactKind": "proof-data", + "platform": "noarch", + "distributionTier": "development-only", + "releaseMutability": "mutable-warehouse", + "warning": "DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use.", + "destination": {"repository": "effectstream/binaries", "tag": "0.3.120"}, + "sourcePins": { + "trustedSetup": { + "repository": "midnightntwrk/midnight-trusted-setup", + "commit": TRUSTED_SETUP, + "tree": pins["sources"]["trustedSetup"]["tree"], + "catalogPath": "MIDNIGHT_SRS_CATALOG.md", + "catalogSha256": CATALOG_SHA256, + "licenseSha256": LICENSE_SHA256, + "rootPotSha256": ROOT_POT, + }, + "ledgerStatic9": { + "repository": "midnightntwrk/midnight-ledger", + "commit": LEDGER9, + "tree": pins["sources"]["ledgerStatic9"]["tree"], + "providerPath": "base-crypto/src/data_provider.rs", + "providerSha256": PROVIDER_SHA256, + "startupPath": "proof-server/src/main.rs", + "startupSha256": STARTUP_SHA256, + "licenseSha256": LICENSE_SHA256, + "ledgerStaticSemver": "9.0.0", + "cacheNamespace": "9", + }, + "ledgerStatic10Negative": { + "repository": "midnightntwrk/midnight-ledger", + "commit": LEDGER10, + "tree": pins["sources"]["ledgerStatic10Negative"]["tree"], + "ledgerStaticSemver": "10.0.0", + "cacheNamespace": "10", + }, + }, + "proofServerCompatibility": { + "accepted": {"version": "9.0.0-rc.5", "sourceCommit": LEDGER9, "images": {"plain": PLAIN, "experimental": EXPERIMENTAL}, "ledgerStaticSemver": "9.0.0", "cacheNamespace": "9"}, + "rejectedStatic9": {"version": "9.0.0-rc.7", "sourceCommit": LEDGER10, "images": {"linux/amd64": RC7_AMD64, "linux/arm64": RC7_ARM64}, "publicMultiarchTag": False, "requiresLedgerStaticSemver": "10.0.0", "cacheNamespace": "10", "mayReuseSrsGeneration": f"midnight-trusted-setup@{TRUSTED_SETUP}"}, + }, + "compactCompatibility": {"version": "0.34.0", "runtime": "0.19.0", "ledgerMajor": 9, "backends": ["zkir-v2", "zkir-v3"], "warehousePayloadAllowed": False}, + "cacheContract": { + "defaultSourceUrl": "https://srs.midnight.network/", + "cacheRootResolution": ["MIDNIGHT_PP", "XDG_CACHE_HOME/midnight/zk-params", "$HOME/.cache/midnight/zk-params"], + "persistentParent": "/proof-params", + "lock": "/proof-params/.bootstrap.lock", + "generationTemplate": "/proof-params/generations/{combinedManifestSha256}", + "currentPointer": "/proof-params/current", + "readerMount": "read-only", + "bootstrapMount": "read-write", + "githubAsMidnightParamSourceAllowed": False, + }, + "scope": {"srsK": list(range(20)), "startupPrefetchK": [10, 11, 12, 13, 14, 15], "observedCircuitK": [5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19], "futureKRequiresReview": list(range(20, 26)), "directGithubAssetForbiddenK": [24, 25], "customProvingKeysIncluded": False}, + "srs": srs, + "ledgerStatic": { + "componentId": "midnight-ledger-static-9.0.0", + "releaseName": "midnight-ledger-static-noarch-9.0.0.zip", + "ledgerStaticSemver": "9.0.0", + "cacheNamespace": "9", + "memberManifestPath": "catalog/proof-data/ledger-static-9-member-manifest.json", + "memberManifestSha256": member_digest, + "ledgerStaticRevision": f"manifest-sha256:{member_digest}", + "aggregateMemberBytes": pins["proofData"]["ledgerStatic"]["aggregateMemberBytes"], + "members": ledger_members, + "transformation": "deterministic-zip-assembly-from-unchanged-members", + }, + "counts": {"srsPayloadCount": 20, "ledgerPayloadCount": 1, "payloadCount": 21, "srsBytes": pins["proofData"]["srsAggregateBytes"], "ledgerMemberBytes": pins["proofData"]["ledgerStatic"]["aggregateMemberBytes"], "canonicalInputBytes": pins["proofData"]["initialAggregateCanonicalBytes"]}, + "evidencePolicy": { + "softwareSbom": "not-applicable-proof-data", + "lineageMemberManifestRequired": True, + "perBlobLicenseFileAvailable": False, + "redistributionBasis": "Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload", + "legalCertaintyClaimed": False, + }, + "futureAdmission": { + "sameKCorrection": "midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin", + "ledgerSemverBump": "midnight-ledger-static-noarch-{semver}.zip", + "sameSemverCorrection": "midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip", + "explicitGenerationRequiredWhenMultiple": True, + "explicitMemberManifestRequiredWhenMultiple": True, + "appendOnly": True, + "implicitLatestAllowed": False, + }, + } + + +def generated_files() -> dict[Path, bytes]: + pins = load_json(PINS_PATH) + expect(pins.get("schemaVersion") == "phase0-source-pins-v1", "unexpected Phase-0 pin schema") + expect(pins["proofData"]["initialPayloadCount"] == 21, "Q8=B payload count drift") + expect([row["k"] for row in pins["proofData"]["srs"]] == list(range(20)), "Q8=B K range drift") + manifest = ledger_member_manifest(pins) + member_digest = hashlib.sha256(canonical_bytes(manifest)).hexdigest() + outputs: dict[Path, bytes] = { + OUTPUT_ROOT / "proof-data/ledger-static-9-member-manifest.json": canonical_bytes(manifest), + OUTPUT_ROOT / "proof-data/q8b-v1.json": canonical_bytes(proof_set(pins, manifest, member_digest)), + } + for row in pins["proofData"]["srs"]: + outputs[OUTPUT_ROOT / f"components/midnight-srs-k{row['k']}.json"] = canonical_bytes(srs_component(row)) + outputs[OUTPUT_ROOT / "components/midnight-ledger-static-9.0.0.json"] = canonical_bytes(ledger_component(manifest, member_digest)) + return outputs + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("mode", choices=("write", "check")) + args = parser.parse_args() + try: + outputs = generated_files() + if args.mode == "write": + for path, data in outputs.items(): + path.parent.mkdir(parents=True, exist_ok=True) + create_file_atomic(path, data, 0o644) + else: + for path, data in outputs.items(): + expect(path.is_file() and not path.is_symlink(), f"generated catalog file missing: {path.relative_to(ROOT)}") + expect(path.read_bytes() == data, f"generated catalog drift: {path.relative_to(ROOT)}") + print(f"OK Q8=B generated files={len(outputs)} mode={args.mode}") + return 0 + except (ForgeError, OSError, KeyError, TypeError) as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/proof_cache_bootstrap.py b/scripts/proof_cache_bootstrap.py new file mode 100755 index 0000000..8ec6208 --- /dev/null +++ b/scripts/proof_cache_bootstrap.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +"""Atomically install one reviewed proof-data generation into a persistent volume.""" + +from __future__ import annotations + +import argparse +import fcntl +import hashlib +import os +import secrets +import shutil +import stat +import sys +import time +import zipfile +from pathlib import Path, PurePosixPath + +from forge_io import ForgeError, canonical_bytes, expect, load_json, normalized_mode, safe_basename, safe_member_name, sha256_file, validate_regular_file + + +def fsync_directory(path: Path) -> None: + fd = os.open(path, os.O_RDONLY | getattr(os, "O_DIRECTORY", 0)) + try: + os.fsync(fd) + finally: + os.close(fd) + + +def fsync_tree(root: Path) -> None: + for path in sorted(root.rglob("*"), key=lambda item: len(item.parts), reverse=True): + expect(not path.is_symlink(), f"staging symlink forbidden: {path}") + if path.is_file(): + with path.open("rb") as stream: + os.fsync(stream.fileno()) + elif path.is_dir(): + fsync_directory(path) + else: + raise ForgeError(f"unsupported staging object: {path}") + fsync_directory(root) + + +def load_content(path: Path) -> tuple[dict, str]: + content = load_json(path) + expect(content.get("schemaVersion") == "proof-cache-content-manifest-v1", "unsupported cache content manifest") + claimed = content.get("combinedManifestSha256") + expect(isinstance(claimed, str) and len(claimed) == 64, "combined manifest SHA-256 missing") + projection = dict(content) + projection.pop("combinedManifestSha256", None) + expect(projection.pop("identityProjection", None) == "all fields except combinedManifestSha256 and identityProjection", "unknown generation identity projection") + actual = hashlib.sha256(canonical_bytes(projection)).hexdigest() + expect(actual == claimed, "combined manifest SHA-256 mismatch") + files = content.get("files") + expect(isinstance(files, list) and len(files) == 32 and content.get("fileCount") == 32 and content.get("payloadCount") == 21, "cache file/payload count mismatch") + names = [row.get("path") for row in files] + expect(all(isinstance(name, str) for name in names) and names == sorted(names) and len(set(names)) == len(names), "cache files must be uniquely sorted") + for row in files: + safe_member_name(row["path"]) + expect(row["mode"] == "0644" and row["size"] > 0 and len(row["sha256"]) == 64, f"invalid file contract: {row['path']}") + expect(row["kind"] in {"srs", "ledger-static"}, f"invalid proof-data kind: {row['path']}") + expect(sorted(row["k"] for row in files if row["kind"] == "srs") == list(range(20)), "cache SRS scope must be K0-K19") + expect(len([row for row in files if row["kind"] == "ledger-static"]) == 12, "cache Ledger-static scope must be twelve members") + return content, claimed + + +def acquire_lock(parent: Path, nonblocking: bool): + lock_path = parent / ".bootstrap.lock" + fd = os.open(lock_path, os.O_RDWR | os.O_CREAT | os.O_NOFOLLOW, 0o600) + stream = os.fdopen(fd, "r+") + operation = fcntl.LOCK_EX | (fcntl.LOCK_NB if nonblocking else 0) + try: + fcntl.flock(stream.fileno(), operation) + except BlockingIOError as exc: + stream.close() + raise ForgeError("proof-cache bootstrap lock is held") from exc + stream.seek(0) + stream.truncate() + stream.write(f"pid={os.getpid()} started={int(time.time())}\n") + stream.flush() + os.fsync(stream.fileno()) + return stream + + +def exact_tree(root: Path, content: dict) -> None: + expect(root.is_dir() and not root.is_symlink(), f"generation is not a real directory: {root}") + expected_files = {row["path"]: row for row in content["files"]} + expected_directories = {str(PurePosixPath(path).parent) for path in expected_files if str(PurePosixPath(path).parent) != "."} + for path in list(expected_directories): + parts = PurePosixPath(path).parts + expected_directories.update("/".join(parts[:index]) for index in range(1, len(parts))) + actual_files: set[str] = set() + actual_directories: set[str] = set() + for path in root.rglob("*"): + relative = path.relative_to(root).as_posix() + expect(not path.is_symlink(), f"generation contains a symlink: {relative}") + info = path.lstat() + if stat.S_ISREG(info.st_mode): + actual_files.add(relative) + elif stat.S_ISDIR(info.st_mode): + actual_directories.add(relative) + expect(normalized_mode(info.st_mode) == "0755", f"directory mode mismatch: {relative}") + else: + raise ForgeError(f"generation contains unsupported object: {relative}") + expect(actual_files == set(expected_files), f"generation file set mismatch: missing={sorted(set(expected_files)-actual_files)}, extra={sorted(actual_files-set(expected_files))}") + expect(actual_directories == expected_directories, f"generation directory set mismatch: missing={sorted(expected_directories-actual_directories)}, extra={sorted(actual_directories-expected_directories)}") + for relative, row in expected_files.items(): + path = root / relative + validate_regular_file(path, "0644") + digest, size = sha256_file(path) + expect(size == row["size"] and digest == row["sha256"], f"generation member mismatch: {relative}") + + +def extract_payloads(content: dict, payload_dir: Path, staging: Path) -> None: + expect(payload_dir.is_dir() and not payload_dir.is_symlink(), "payload directory missing") + srs_rows = [row for row in content["files"] if row["kind"] == "srs"] + ledger_rows = [row for row in content["files"] if row["kind"] == "ledger-static"] + expected_payloads = {row["outerPayload"] for row in content["files"]} + actual_payloads = {path.name for path in payload_dir.iterdir()} + expect(actual_payloads == expected_payloads, f"payload directory differs from selected 21 objects: missing={sorted(expected_payloads-actual_payloads)}, extra={sorted(actual_payloads-expected_payloads)}") + for row in srs_rows: + source = payload_dir / safe_basename(row["outerPayload"], "SRS outer payload") + validate_regular_file(source, "0644") + digest, size = sha256_file(source) + expect(size == row["size"] and digest == row["sha256"] and digest == row["outerSha256"], f"SRS outer/raw mismatch: {source.name}") + destination = staging / row["path"] + destination.parent.mkdir(parents=True, exist_ok=True, mode=0o755) + shutil.copyfile(source, destination, follow_symlinks=False) + os.chmod(destination, 0o644) + ledger_outer_names = {row["outerPayload"] for row in ledger_rows} + ledger_outer_hashes = {row["outerSha256"] for row in ledger_rows} + expect(len(ledger_outer_names) == 1 and len(ledger_outer_hashes) == 1, "Ledger-static outer selection is ambiguous") + archive_path = payload_dir / safe_basename(next(iter(ledger_outer_names)), "Ledger-static outer payload") + validate_regular_file(archive_path, "0644") + archive_digest, _ = sha256_file(archive_path) + expect(archive_digest == next(iter(ledger_outer_hashes)), "Ledger-static outer digest mismatch") + expected = {row["path"]: row for row in ledger_rows} + with zipfile.ZipFile(archive_path) as archive: + infos = archive.infolist() + names = [info.filename.rstrip("/") for info in infos] + expect(len(names) == len(set(names)), "Ledger archive has duplicate members") + file_names = {name for info, name in zip(infos, names) if not info.is_dir()} + dir_names = {name for info, name in zip(infos, names) if info.is_dir()} + required_dirs = {str(PurePosixPath(path).parent) for path in expected} + required_dirs.update({path.split("/")[0] for path in expected}) + expect(file_names == set(expected) and dir_names == required_dirs, "Ledger archive path/member mismatch") + for info, name in zip(infos, names): + safe_member_name(name) + mode = (info.external_attr >> 16) & 0o177777 + if info.is_dir(): + expect(stat.S_IFMT(mode) == stat.S_IFDIR and stat.S_IMODE(mode) == 0o755 and info.file_size == 0, f"Ledger archive directory mode/type mismatch: {name}") + (staging / name).mkdir(parents=True, exist_ok=True, mode=0o755) + os.chmod(staging / name, 0o755) + continue + row = expected[name] + expect(stat.S_IFMT(mode) == stat.S_IFREG and stat.S_IMODE(mode) == 0o644 and info.file_size == row["size"], f"Ledger archive file contract mismatch: {name}") + destination = staging / name + destination.parent.mkdir(parents=True, exist_ok=True, mode=0o755) + hasher = hashlib.sha256() + total = 0 + with archive.open(info) as source, destination.open("xb") as output: + while chunk := source.read(1024 * 1024): + total += len(chunk) + expect(total <= row["size"], f"Ledger member exceeds bound: {name}") + output.write(chunk) + hasher.update(chunk) + output.flush() + os.fsync(output.fileno()) + os.chmod(destination, 0o644) + expect(total == row["size"] and hasher.hexdigest() == row["sha256"], f"Ledger member digest mismatch: {name}") + for path in staging.rglob("*"): + if path.is_dir(): + os.chmod(path, 0o755) + + +def current_target(parent: Path) -> str | None: + current = parent / "current" + if not current.exists() and not current.is_symlink(): + return None + expect(current.is_symlink(), "current pointer must be a symbolic link") + target = os.readlink(current) + expect(target == str(PurePosixPath(target)) and not target.startswith("/") and ".." not in PurePosixPath(target).parts, "unsafe current pointer") + expect(target.startswith("generations/") and len(PurePosixPath(target).parts) == 2, "current pointer must select one generation") + return target + + +def atomic_activate(parent: Path, digest: str, fail_before_swap: bool = False) -> None: + target = f"generations/{digest}" + temporary = parent / f".current.tmp-{os.getpid()}-{secrets.token_hex(4)}" + os.symlink(target, temporary) + if fail_before_swap: + temporary.unlink() + raise ForgeError("injected failure before current-pointer swap") + os.replace(temporary, parent / "current") + fsync_directory(parent) + expect(current_target(parent) == target, "current pointer activation failed") + + +def bootstrap(content_path: Path, payload_dir: Path, parent: Path, readers_stopped: bool, nonblocking: bool, fail_stage: str | None) -> str: + content, digest = load_content(content_path) + expect(parent.is_dir() and not parent.is_symlink(), "persistent parent must be a real existing directory") + expect(readers_stopped, "bootstrap/activation requires both readers stopped") + lock = acquire_lock(parent, nonblocking) + staging: Path | None = None + quarantined: Path | None = None + target = parent / "generations" / digest + try: + generations = parent / "generations" + quarantine = parent / "quarantine" + generations.mkdir(mode=0o755, exist_ok=True) + quarantine.mkdir(mode=0o755, exist_ok=True) + os.chmod(generations, 0o755) + os.chmod(quarantine, 0o755) + # Clean only stale, tool-owned staging directories after exclusive-lock acquisition. + for stale in parent.glob(".staging-*"): + expect(stale.is_dir() and not stale.is_symlink(), f"unsafe stale staging object: {stale}") + shutil.rmtree(stale) + prior_pointer = current_target(parent) + if target.exists(): + try: + exact_tree(target, content) + if prior_pointer != f"generations/{digest}": + atomic_activate(parent, digest, fail_stage == "pointer") + print(f"NOOP generation={digest}") + return digest + except ForgeError: + # A canonical-name generation may be replaced only via quiesced quarantine/repair. + quarantined = quarantine / f"{digest}.{int(time.time())}.{secrets.token_hex(4)}" + staging = parent / f".staging-{digest}-{os.getpid()}-{secrets.token_hex(4)}" + staging.mkdir(mode=0o700) + extract_payloads(content, payload_dir, staging) + exact_tree(staging, content) + fsync_tree(staging) + os.chmod(staging, 0o755) + if fail_stage == "after-verify": + raise ForgeError("injected failure after staged verification") + if quarantined is not None: + os.replace(target, quarantined) + fsync_directory(quarantine) + try: + os.replace(staging, target) + staging = None + fsync_directory(generations) + except Exception: + if quarantined is not None and quarantined.exists() and not target.exists(): + os.replace(quarantined, target) + quarantined = None + fsync_directory(generations) + raise + try: + exact_tree(target, content) + atomic_activate(parent, digest, fail_stage == "pointer") + except Exception: + # A same-digest repair has temporarily moved the prior bytes aside. If + # activation fails, restore that exact generation path so the old + # pointer and bytes remain together; readers are required to be stopped. + if quarantined is not None and quarantined.exists(): + if target.exists(): + shutil.rmtree(target) + os.replace(quarantined, target) + quarantined = None + fsync_directory(generations) + raise + print(f"ACTIVATED generation={digest} prior={prior_pointer or 'none'} quarantine={quarantined.name if quarantined else 'none'}") + return digest + finally: + if staging is not None and staging.exists(): + shutil.rmtree(staging) + lock.close() + + +def verify_active(content_path: Path, parent: Path) -> str: + content, digest = load_content(content_path) + target = current_target(parent) + expect(target == f"generations/{digest}", f"active generation mismatch: expected {digest}, got {target}") + generation = parent / target + exact_tree(generation, content) + return str(generation) + + +def gc(parent: Path, referenced: set[str], readers_stopped: bool, nonblocking: bool) -> list[str]: + expect(readers_stopped, "garbage collection requires both readers stopped") + lock = acquire_lock(parent, nonblocking) + removed: list[str] = [] + try: + target = current_target(parent) + current_digest = PurePosixPath(target).name if target else None + generations = parent / "generations" + if not generations.exists(): + return removed + for path in sorted(generations.iterdir(), key=lambda item: item.name): + expect(path.is_dir() and not path.is_symlink() and len(path.name) == 64, f"unsafe generation object: {path}") + if path.name == current_digest or path.name in referenced: + continue + shutil.rmtree(path) + removed.append(path.name) + fsync_directory(generations) + return removed + finally: + lock.close() + + +def main() -> int: + parser = argparse.ArgumentParser() + sub = parser.add_subparsers(dest="command", required=True) + install = sub.add_parser("bootstrap") + install.add_argument("--manifest", required=True, type=Path) + install.add_argument("--payload-dir", required=True, type=Path) + install.add_argument("--parent", required=True, type=Path) + install.add_argument("--readers-stopped", action="store_true") + install.add_argument("--nonblocking-lock", action="store_true") + install.add_argument("--inject-failure", choices=("after-verify", "pointer")) + verify = sub.add_parser("verify-active") + verify.add_argument("--manifest", required=True, type=Path) + verify.add_argument("--parent", required=True, type=Path) + cleanup = sub.add_parser("gc") + cleanup.add_argument("--parent", required=True, type=Path) + cleanup.add_argument("--referenced", action="append", default=[]) + cleanup.add_argument("--readers-stopped", action="store_true") + cleanup.add_argument("--nonblocking-lock", action="store_true") + args = parser.parse_args() + try: + if args.command == "bootstrap": + bootstrap(args.manifest, args.payload_dir, args.parent, args.readers_stopped, args.nonblocking_lock, args.inject_failure) + elif args.command == "verify-active": + path = verify_active(args.manifest, args.parent) + print(f"OK active={path}") + else: + removed = gc(args.parent, set(args.referenced), args.readers_stopped, args.nonblocking_lock) + print(f"OK removed={','.join(removed) if removed else 'none'}") + return 0 + except (ForgeError, OSError, KeyError, TypeError, ValueError, zipfile.BadZipFile) as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/proof_data_pipeline.py b/scripts/proof_data_pipeline.py new file mode 100755 index 0000000..ba40012 --- /dev/null +++ b/scripts/proof_data_pipeline.py @@ -0,0 +1,366 @@ +#!/usr/bin/env python3 +"""Acquire, verify, package, and describe the exact Q8=B proof-data payload set.""" + +from __future__ import annotations + +import argparse +import hashlib +import os +import shutil +import stat +import sys +import time +import urllib.error +import urllib.request +import zipfile +from pathlib import Path, PurePosixPath + +from forge_io import ( + ForgeError, + canonical_bytes, + create_file_atomic, + expect, + load_json, + normalized_mode, + safe_basename, + safe_member_name, + sha256_file, + validate_regular_file, + validate_unique_names, +) + + +ROOT = Path(__file__).resolve().parents[1] +DEFAULT_MANIFEST = ROOT / "catalog/proof-data/q8b-v1.json" +ZIP_EPOCH = (1980, 1, 1, 0, 0, 0) + + +def download(url: str, path: Path, expected_size: int, expected_sha256: str, retries: int = 3) -> None: + expect(url.startswith("https://") and "@" not in url.split("/", 3)[2], "source must be credential-free HTTPS") + expect(path.parent.is_dir() and not path.exists(), f"unsafe or existing download path: {path}") + last_error: Exception | None = None + for attempt in range(1, retries + 1): + temporary = path.parent / f".{path.name}.part-{os.getpid()}-{attempt}" + try: + request = urllib.request.Request(url, headers={"User-Agent": "midnight-binary-forge/proof-data-v1", "Accept-Encoding": "identity"}) + hasher = hashlib.sha256() + total = 0 + with urllib.request.urlopen(request, timeout=180) as response, temporary.open("xb") as output: + expect(response.geturl().startswith("https://"), "source redirected away from HTTPS") + while True: + chunk = response.read(min(1024 * 1024, expected_size - total + 1)) + if not chunk: + break + total += len(chunk) + expect(total <= expected_size, f"download exceeds expected size: {url}") + output.write(chunk) + hasher.update(chunk) + output.flush() + os.fsync(output.fileno()) + expect(total == expected_size, f"download size mismatch for {url}: expected {expected_size}, got {total}") + expect(hasher.hexdigest() == expected_sha256, f"download SHA-256 mismatch for {url}") + os.chmod(temporary, 0o644) + os.link(temporary, path) + temporary.unlink() + return + except (ForgeError, OSError, urllib.error.URLError) as exc: + last_error = exc + try: + temporary.unlink() + except FileNotFoundError: + pass + if attempt != retries: + time.sleep(attempt) + raise ForgeError(f"download failed after {retries} attempts: {url}: {last_error}") + + +def files_equal(first: Path, second: Path) -> bool: + """Compare immutable inputs without loading a complete K19 object into memory.""" + if first.stat().st_size != second.stat().st_size: + return False + with first.open("rb") as left, second.open("rb") as right: + while True: + left_chunk = left.read(1024 * 1024) + right_chunk = right.read(1024 * 1024) + if left_chunk != right_chunk: + return False + if not left_chunk: + return True + + +def validate_manifest(manifest: dict) -> None: + expect(manifest.get("schemaVersion") == "proof-data-set-v1", "unsupported proof-data manifest") + expect(manifest.get("decision") == "Q8=B", "proof-data decision drift") + expect(manifest.get("artifactKind") == "proof-data" and manifest.get("platform") == "noarch", "proof data must be noarch") + expect(manifest["counts"] == {"srsPayloadCount": 20, "ledgerPayloadCount": 1, "payloadCount": 21, "srsBytes": 201334160, "ledgerMemberBytes": 21753130, "canonicalInputBytes": 223087290}, "Q8=B aggregate/count drift") + srs = manifest.get("srs") + expect(isinstance(srs, list) and [row.get("k") for row in srs] == list(range(20)), "Q8=B must contain exactly K0-K19") + expected_names = [f"bls_midnight_2p{k}" for k in range(20)] + expect([row["releaseName"] for row in srs] == expected_names, "literal SRS payload-name drift") + expect(all(row["platform"] == "noarch" and row["mode"] == "0644" and row["transformation"] == "unchanged-identity-mirror" for row in srs), "invalid SRS platform/mode/transformation") + expect(srs[0]["officialAlias"] is None and srs[0]["generation"].startswith("midnight-ledger-provider-compat@"), "K0 must use provider-only provenance") + expect(all(row["officialAlias"] == f"midnight-srs-2p{row['k']}" and row["generation"].startswith("midnight-trusted-setup@") for row in srs[1:]), "K1+ ceremony alias/generation drift") + ledger = manifest.get("ledgerStatic") + expect(ledger["releaseName"] == "midnight-ledger-static-noarch-9.0.0.zip", "Ledger-static payload-name drift") + expect(ledger["ledgerStaticSemver"] == "9.0.0" and ledger["cacheNamespace"] == "9", "Ledger-static version/namespace drift") + members = ledger.get("members") + expect(isinstance(members, list) and len(members) == 12, "Ledger-static must have exactly twelve data members") + paths = [row["path"] for row in members] + validate_unique_names(paths) + expect(len(set(paths)) == 12 and all(path.startswith(("zswap/9/", "dust/9/")) for path in paths), "Ledger-static path scope drift") + expect(sum(row["size"] for row in srs) == manifest["counts"]["srsBytes"], "SRS byte aggregate drift") + expect(sum(row["size"] for row in members) == manifest["counts"]["ledgerMemberBytes"], "Ledger byte aggregate drift") + positive = manifest["proofServerCompatibility"]["accepted"] + negative = manifest["proofServerCompatibility"]["rejectedStatic9"] + expect(positive["version"] == "9.0.0-rc.5" and positive["ledgerStaticSemver"] == "9.0.0" and positive["cacheNamespace"] == "9", "rc.5 positive compatibility drift") + expect(negative["version"] == "9.0.0-rc.7" and negative["requiresLedgerStaticSemver"] == "10.0.0" and negative["cacheNamespace"] == "10" and negative["publicMultiarchTag"] is False, "rc.7 negative compatibility drift") + expect(set(negative["images"]) == {"linux/amd64", "linux/arm64"}, "rc.7 must use architecture-specific image digests") + expect(manifest["cacheContract"]["defaultSourceUrl"] == "https://srs.midnight.network/" and manifest["cacheContract"]["githubAsMidnightParamSourceAllowed"] is False, "official fallback/source contract drift") + expect(manifest["scope"]["customProvingKeysIncluded"] is False, "custom proving keys are forbidden") + + +def build_member_manifest(manifest: dict) -> dict: + reviewed = load_json(ROOT / manifest["ledgerStatic"]["memberManifestPath"]) + digest = hashlib.sha256(canonical_bytes(reviewed)).hexdigest() + expect(digest == manifest["ledgerStatic"]["memberManifestSha256"], "reviewed member-manifest digest drift") + return reviewed + + +def deterministic_zip(source_root: Path, member_manifest: dict, output: Path) -> tuple[str, int]: + expect(not output.exists() and output.parent.is_dir(), "ZIP output must be create-only") + rows = member_manifest["members"] + expected = {row["path"] for row in rows} + actual = {path.relative_to(source_root).as_posix() for path in source_root.rglob("*")} + expect(actual == expected, f"Ledger-static source tree differs from manifest: missing={sorted(expected-actual)}, extra={sorted(actual-expected)}") + temporary = output.parent / f".{output.name}.tmp-{os.getpid()}" + with zipfile.ZipFile(temporary, "x", compression=zipfile.ZIP_DEFLATED, compresslevel=9, strict_timestamps=True) as archive: + archive.comment = b"" + for row in rows: + name = row["path"] + ("/" if row["type"] == "directory" else "") + info = zipfile.ZipInfo(name, ZIP_EPOCH) + info.create_system = 3 + info.flag_bits = 0x800 + mode = int(row["mode"], 8) + if row["type"] == "directory": + source = source_root / row["path"] + expect(source.is_dir() and not source.is_symlink() and normalized_mode(source.stat().st_mode) == "0755", f"directory contract mismatch: {row['path']}") + info.external_attr = ((stat.S_IFDIR | mode) << 16) | 0x10 + info.compress_type = zipfile.ZIP_STORED + archive.writestr(info, b"") + else: + source = source_root / row["path"] + validate_regular_file(source, "0644") + digest, size = sha256_file(source) + expect(size == row["size"] and digest == row["sha256"], f"Ledger-static member identity mismatch: {row['path']}") + info.external_attr = (stat.S_IFREG | mode) << 16 + info.compress_type = zipfile.ZIP_DEFLATED + with source.open("rb") as stream: + archive.writestr(info, stream.read(), compress_type=zipfile.ZIP_DEFLATED, compresslevel=9) + with temporary.open("rb") as stream: + os.fsync(stream.fileno()) + os.chmod(temporary, 0o644) + os.link(temporary, output) + temporary.unlink() + return sha256_file(output) + + +def verify_zip(archive_path: Path, member_manifest: dict) -> None: + validate_regular_file(archive_path, "0644") + with zipfile.ZipFile(archive_path) as archive: + infos = archive.infolist() + expect(archive.comment == b"", "ZIP comment forbidden") + expect(len(infos) == len(member_manifest["members"]), "ZIP member count mismatch") + by_name = {info.filename.rstrip("/"): info for info in infos} + expect(len(by_name) == len(infos), "ZIP duplicate member") + expect(list(by_name) == [row["path"] for row in member_manifest["members"]], "ZIP member order/path mismatch") + for row in member_manifest["members"]: + name = safe_member_name(row["path"]) + info = by_name[name] + expect(info.create_system == 3 and info.date_time == ZIP_EPOCH, f"ZIP platform/timestamp mismatch: {name}") + mode = (info.external_attr >> 16) & 0o177777 + if row["type"] == "directory": + expect(info.is_dir() and stat.S_IFMT(mode) == stat.S_IFDIR and stat.S_IMODE(mode) == 0o755 and info.file_size == 0, f"ZIP directory mismatch: {name}") + else: + expect(not info.is_dir() and stat.S_IFMT(mode) == stat.S_IFREG and stat.S_IMODE(mode) == 0o644, f"ZIP file mode/type mismatch: {name}") + expect(info.file_size == row["size"], f"ZIP member size mismatch: {name}") + hasher = hashlib.sha256() + total = 0 + with archive.open(info) as stream: + while chunk := stream.read(1024 * 1024): + total += len(chunk) + expect(total <= row["size"], f"ZIP member exceeds ceiling: {name}") + hasher.update(chunk) + expect(total == row["size"] and hasher.hexdigest() == row["sha256"], f"ZIP member digest mismatch: {name}") + + +def cache_content_manifest(manifest: dict, ledger_outer: dict) -> dict: + files = [] + for row in manifest["srs"]: + files.append({"path": row["installName"], "kind": "srs", "k": row["k"], "mode": "0644", "size": row["size"], "sha256": row["sha256"], "generation": row["generation"], "outerPayload": row["releaseName"], "outerSha256": row["sha256"]}) + for row in manifest["ledgerStatic"]["members"]: + files.append({"path": row["path"], "kind": "ledger-static", "mode": "0644", "size": row["size"], "sha256": row["sha256"], "ledgerStaticSemver": "9.0.0", "cacheNamespace": "9", "outerPayload": manifest["ledgerStatic"]["releaseName"], "outerSha256": ledger_outer["sha256"]}) + return { + "schemaVersion": "proof-cache-content-manifest-v1", + "canonicalization": "forge-canonical-json-v1", + "selection": manifest["setId"], + "srsGeneration": manifest["proofServerCompatibility"]["accepted"]["sourceCommit"], + "ledgerStaticSemver": "9.0.0", + "cacheNamespace": "9", + "ledgerMemberManifestSha256": manifest["ledgerStatic"]["memberManifestSha256"], + "files": sorted(files, key=lambda row: row["path"]), + "fileCount": 32, + "payloadCount": 21, + } + + +def acquire(manifest_path: Path, output_root: Path, work_root: Path) -> dict: + manifest = load_json(manifest_path) + validate_manifest(manifest) + expect(output_root.is_dir() and not any(output_root.iterdir()), "output root must be an empty existing directory") + expect(work_root.is_dir() and not any(work_root.iterdir()), "work root must be an empty existing directory") + payload_dir = output_root / "payloads" + evidence_dir = output_root / "evidence" + first_dir = work_root / "first" + second_dir = work_root / "second" + ledger_root = work_root / "ledger-tree" + for directory in (payload_dir, evidence_dir, first_dir, second_dir, ledger_root): + directory.mkdir() + fetch_rows = [] + for row in manifest["srs"]: + name = safe_basename(row["releaseName"], "SRS payload name") + first = first_dir / name + second = second_dir / name + download(row["sourceUrl"], first, row["size"], row["sha256"]) + second_url = row["officialUrl"] or row["sourceUrl"] + download(second_url, second, row["size"], row["sha256"]) + expect(files_equal(first, second), f"provider/official or independent SRS bytes disagree: {name}") + os.link(first, payload_dir / name) + fetch_rows.append({"path": name, "firstUrl": row["sourceUrl"], "secondUrl": second_url, "size": row["size"], "sha256": row["sha256"], "aliasComparison": row["officialUrl"] is not None}) + for row in manifest["ledgerStatic"]["members"]: + safe_member_name(row["path"]) + first = first_dir / row["path"] + second = second_dir / row["path"] + first.parent.mkdir(parents=True, exist_ok=True) + second.parent.mkdir(parents=True, exist_ok=True) + download(row["sourceUrl"], first, row["size"], row["sha256"]) + download(row["sourceUrl"], second, row["size"], row["sha256"]) + expect(files_equal(first, second), f"independent Ledger-static bytes disagree: {row['path']}") + destination = ledger_root / row["path"] + destination.parent.mkdir(parents=True, exist_ok=True) + for parent in [destination.parent, *destination.parents]: + if parent == ledger_root.parent: + break + if parent.is_relative_to(ledger_root): + os.chmod(parent, 0o755) + os.link(first, destination) + os.chmod(destination, 0o644) + fetch_rows.append({"path": row["path"], "firstUrl": row["sourceUrl"], "secondUrl": row["sourceUrl"], "size": row["size"], "sha256": row["sha256"], "aliasComparison": False}) + member_manifest = build_member_manifest(manifest) + archive_name = manifest["ledgerStatic"]["releaseName"] + archive_path = payload_dir / archive_name + archive_sha256, archive_size = deterministic_zip(ledger_root, member_manifest, archive_path) + verify_zip(archive_path, member_manifest) + ledger_outer = {"name": archive_name, "size": archive_size, "sha256": archive_sha256} + content = cache_content_manifest(manifest, ledger_outer) + content_bytes = canonical_bytes(content) + generation = hashlib.sha256(content_bytes).hexdigest() + content["combinedManifestSha256"] = generation + # The generation excludes its own self-reference. Bootstrap recomputes it from this exact projection. + content["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" + create_file_atomic(evidence_dir / "proof-cache-content-manifest-v1.json", canonical_bytes(content), 0o644) + payload_rows = [] + for path in sorted(payload_dir.iterdir(), key=lambda value: value.name): + validate_regular_file(path, "0644") + digest, size = sha256_file(path) + payload_rows.append({"name": path.name, "role": "payload", "artifactKind": "proof-data", "platform": "noarch", "size": size, "sha256": digest}) + expect(len(payload_rows) == 21 and len({row["name"] for row in payload_rows}) == 21, "output must contain exactly 21 unique payloads") + expect(not any("linux" in row["name"] or "macos" in row["name"] or "amd64" in row["name"] or "arm64" in row["name"] or "rc.5" in row["name"] for row in payload_rows), "proof payload contains OS/architecture/proof-server duplication") + lineage = { + "schemaVersion": "proof-data-lineage-v1", + "setId": manifest["setId"], + "payloadCount": 21, + "evidenceKind": "proof-data-lineage-member-manifest", + "softwareSbom": "not-applicable", + "memberManifestSha256": manifest["ledgerStatic"]["memberManifestSha256"], + "combinedManifestSha256": generation, + "payloads": payload_rows, + "sourceFetches": sorted(fetch_rows, key=lambda row: row["path"]), + "license": manifest["evidencePolicy"], + "proofServerCompatibility": manifest["proofServerCompatibility"], + "compactCompatibility": manifest["compactCompatibility"], + } + create_file_atomic(evidence_dir / "proof-data-lineage-v1.json", canonical_bytes(lineage), 0o644) + roles = { + "schemaVersion": "asset-roles-v1", + "assets": [ + *[{"name": row["name"], "role": "payload", "artifactKind": "proof-data", "componentId": ("midnight-ledger-static-9.0.0" if row["name"] == archive_name else f"midnight-srs-k{int(row['name'].removeprefix('bls_midnight_2p'))}")} for row in payload_rows], + {"name": "proof-cache-content-manifest-v1.json", "role": "proof-cache-content-manifest"}, + {"name": "proof-data-lineage-v1.json", "role": "proof-data-lineage"}, + ], + } + create_file_atomic(evidence_dir / "asset-roles-proof-data-q8b-v1.json", canonical_bytes(roles), 0o644) + result = {"payloads": payload_rows, "ledgerOuter": ledger_outer, "combinedManifestSha256": generation, "memberManifestSha256": manifest["ledgerStatic"]["memberManifestSha256"]} + print(f"OK Q8=B payloads=21 srs=20 ledger=1 combined={generation} ledgerZip={archive_sha256}") + return result + + +def verify_output(manifest_path: Path, output_root: Path) -> dict: + manifest = load_json(manifest_path) + validate_manifest(manifest) + payload_dir = output_root / "payloads" + evidence_dir = output_root / "evidence" + expect(payload_dir.is_dir() and evidence_dir.is_dir(), "output payload/evidence directories missing") + expected_names = {row["releaseName"] for row in manifest["srs"]} | {manifest["ledgerStatic"]["releaseName"]} + actual_names = {path.name for path in payload_dir.iterdir()} + expect(actual_names == expected_names, f"payload set mismatch: missing={sorted(expected_names-actual_names)}, extra={sorted(actual_names-expected_names)}") + for row in manifest["srs"]: + path = payload_dir / row["releaseName"] + validate_regular_file(path, "0644") + digest, size = sha256_file(path) + expect(size == row["size"] and digest == row["sha256"], f"SRS output mismatch: {path.name}") + member_manifest = build_member_manifest(manifest) + archive_path = payload_dir / manifest["ledgerStatic"]["releaseName"] + verify_zip(archive_path, member_manifest) + archive_sha, archive_size = sha256_file(archive_path) + content = load_json(evidence_dir / "proof-cache-content-manifest-v1.json") + claimed = content.pop("combinedManifestSha256") + content.pop("identityProjection") + actual = hashlib.sha256(canonical_bytes(content)).hexdigest() + expect(actual == claimed, "combined content-manifest identity mismatch") + expect(all(row["outerSha256"] == archive_sha for row in content["files"] if row["kind"] == "ledger-static"), "Ledger outer digest binding mismatch") + lineage = load_json(evidence_dir / "proof-data-lineage-v1.json") + expect(lineage["combinedManifestSha256"] == claimed and lineage["payloadCount"] == 21 and len(lineage["payloads"]) == 21, "lineage count/generation mismatch") + expect(next(row for row in lineage["payloads"] if row["name"] == archive_path.name) == {"name": archive_path.name, "role": "payload", "artifactKind": "proof-data", "platform": "noarch", "size": archive_size, "sha256": archive_sha}, "Ledger archive lineage mismatch") + return {"payloads": lineage["payloads"], "combinedManifestSha256": claimed, "ledgerArchiveSha256": archive_sha, "ledgerArchiveSize": archive_size} + + +def main() -> int: + parser = argparse.ArgumentParser() + sub = parser.add_subparsers(dest="command", required=True) + validate = sub.add_parser("validate-manifest") + validate.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST) + acquire_parser = sub.add_parser("acquire") + acquire_parser.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST) + acquire_parser.add_argument("--output-root", type=Path, required=True) + acquire_parser.add_argument("--work-root", type=Path, required=True) + verify = sub.add_parser("verify-output") + verify.add_argument("--manifest", type=Path, default=DEFAULT_MANIFEST) + verify.add_argument("--output-root", type=Path, required=True) + args = parser.parse_args() + try: + if args.command == "validate-manifest": + validate_manifest(load_json(args.manifest)) + print("OK Q8=B manifest payloads=21 srs=20 ledger=1 platform=noarch") + elif args.command == "acquire": + acquire(args.manifest, args.output_root, args.work_root) + else: + result = verify_output(args.manifest, args.output_root) + print(f"OK Q8=B output payloads=21 combined={result['combinedManifestSha256']} ledgerZip={result['ledgerArchiveSha256']}") + return 0 + except (ForgeError, OSError, KeyError, TypeError, ValueError, zipfile.BadZipFile) as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/proof_runtime_docker.py b/scripts/proof_runtime_docker.py new file mode 100755 index 0000000..db9cc11 --- /dev/null +++ b/scripts/proof_runtime_docker.py @@ -0,0 +1,309 @@ +#!/usr/bin/env python3 +"""Run exact rc.5/static-9 positive and rc.7/static-10 negative gates on a named volume.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import random +import shutil +import socket +import subprocess +import sys +import time +from pathlib import Path + +from forge_io import ForgeError, canonical_bytes, create_file_atomic, expect, load_json + + +ROOT = Path(__file__).resolve().parents[1] +PYTHON_IMAGE = "docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7" + + +def run(arguments: list[str], *, timeout: int = 180, check: bool = True) -> subprocess.CompletedProcess[str]: + result = subprocess.run(arguments, stdin=subprocess.DEVNULL, capture_output=True, text=True, timeout=timeout, check=False) + if check and result.returncode != 0: + raise ForgeError(f"command failed ({result.returncode}): {' '.join(arguments)}\nstdout={result.stdout}\nstderr={result.stderr}") + return result + + +def free_port() -> int: + for _ in range(100): + port = random.SystemRandom().randint(20000, 55000) + with socket.socket() as listener: + try: + listener.bind(("127.0.0.1", port)) + except OSError: + continue + return port + raise ForgeError("could not allocate a random free port above 10000") + + +def fetch(client: str, host: str, port: int, path: str, timeout: int = 5) -> str: + """Query through the internal-network client; the host cannot route to that network.""" + url = f"http://{host}:{port}{path}" + code = "import sys,urllib.request; r=urllib.request.urlopen(sys.argv[1],timeout=int(sys.argv[2])); assert r.status == 200; print(r.read(65536).decode(),end='')" + return run(["docker", "exec", client, "python3", "-c", code, url, str(timeout)], timeout=timeout + 10).stdout + + +def wait_ready(client: str, name: str, port: int, timeout_seconds: int = 180) -> tuple[str, str]: + deadline = time.monotonic() + timeout_seconds + last = "" + while time.monotonic() < deadline: + state = run(["docker", "inspect", "--format", "{{.State.Status}} {{.State.ExitCode}}", name], timeout=10).stdout.strip() + if state.startswith("exited") or state.startswith("dead"): + logs = run(["docker", "logs", name], check=False).stdout + raise ForgeError(f"proof server {name} exited before ready: {state}\n{logs[-8000:]}") + try: + version = fetch(client, name, port, "/version") + health = fetch(client, name, port, "/health") + ready = fetch(client, name, port, "/ready") + return version, json.loads(health)["status"] + ":" + json.loads(ready)["status"] + except (ForgeError, OSError, json.JSONDecodeError, KeyError) as exc: + last = str(exc) + time.sleep(1) + logs = run(["docker", "logs", name], check=False).stdout + raise ForgeError(f"proof server {name} was not ready: {last}\n{logs[-8000:]}") + + +def inspect_reader(name: str, fixed_midnight_pp: str) -> dict: + raw = run(["docker", "inspect", name]).stdout + item = json.loads(raw)[0] + env = dict(row.split("=", 1) for row in item["Config"]["Env"] if "=" in row) + mounts = [row for row in item["Mounts"] if row["Destination"] == "/proof-params"] + expect(env.get("MIDNIGHT_PP") == fixed_midnight_pp, f"reader {name} MIDNIGHT_PP drift") + expect(env.get("MIDNIGHT_PARAM_SOURCE") == "https://srs.midnight.network/", f"reader {name} fallback source drift") + expect(len(mounts) == 1 and mounts[0]["RW"] is False and mounts[0]["Type"] == "volume", f"reader {name} must use one read-only named-volume mount") + return {"name": name, "midnightPp": env["MIDNIGHT_PP"], "mountReadOnly": not mounts[0]["RW"], "mountType": mounts[0]["Type"]} + + +def start_reader(name: str, network: str, volume: str, image_digest: str, fixed_midnight_pp: str, port: int) -> None: + run( + [ + "docker", "run", "--detach", "--name", name, + "--network", network, + "--env", f"PORT={port}", + "--env", f"MIDNIGHT_PP={fixed_midnight_pp}", + "--env", "MIDNIGHT_PARAM_SOURCE=https://srs.midnight.network/", + "--mount", f"type=volume,src={volume},dst=/proof-params,readonly", + f"midnightntwrk/proof-server@{image_digest}", + ], + timeout=120, + ) + + +def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, run_key: str, output: Path) -> dict: + expect(os_name == "linux" and arch in {"amd64", "arm64"}, "proof-server runtime gate requires native Linux amd64/arm64") + expect(candidate_root.is_dir() and work_root.is_dir() and not any(work_root.iterdir()), "candidate/work directory contract failed") + manifest_path = candidate_root / "evidence/proof-cache-content-manifest-v1.json" + payload_dir = candidate_root / "payloads" + content = load_json(manifest_path) + digest = content["combinedManifestSha256"] + fixed = f"/proof-params/generations/{digest}" + proof_set = load_json(ROOT / "catalog/proof-data/q8b-v1.json") + positive = proof_set["proofServerCompatibility"]["accepted"] + negative = proof_set["proofServerCompatibility"]["rejectedStatic9"] + expected_rc7 = negative["images"][f"linux/{arch}"] + volume = f"q8b-proof-{run_key}-{arch}".lower().replace("_", "-") + network = f"q8b-proof-{run_key}-{arch}-offline".lower().replace("_", "-") + readers = [f"{volume}-plain", f"{volume}-experimental"] + negative_name = f"{volume}-rc7-negative" + client_name = f"{volume}-client" + created_volume = False + created_network = False + try: + run(["docker", "volume", "create", volume]) + created_volume = True + run(["docker", "network", "create", "--internal", network]) + created_network = True + run(["docker", "run", "--detach", "--name", client_name, "--network", network, PYTHON_IMAGE, "python3", "-c", "import time; time.sleep(3600)"], timeout=120) + repo = str(ROOT.resolve()) + candidate = str(candidate_root.resolve()) + bootstrap_command = [ + "docker", "run", "--rm", + "--mount", f"type=bind,src={repo},dst=/repo,readonly", + "--mount", f"type=bind,src={candidate},dst=/candidate,readonly", + "--mount", f"type=volume,src={volume},dst=/proof-params", + PYTHON_IMAGE, + "python3", "/repo/scripts/proof_cache_bootstrap.py", "bootstrap", + "--manifest", "/candidate/evidence/proof-cache-content-manifest-v1.json", + "--payload-dir", "/candidate/payloads", + "--parent", "/proof-params", + "--readers-stopped", + ] + first_bootstrap = run(bootstrap_command, timeout=300).stdout.strip() + expect("ACTIVATED" in first_bootstrap, "empty named volume did not activate a generation") + second_bootstrap = run(bootstrap_command, timeout=300).stdout.strip() + expect("NOOP" in second_bootstrap, "identical bootstrap was not a byte-for-byte no-op") + + # Real named-volume lock, same-digest corruption repair, failed activation, stale-pointer, + # and GC gates all run while readers are stopped. + lock_holder = f"{volume}-lock-holder" + run( + [ + "docker", "run", "--detach", "--name", lock_holder, + "--mount", f"type=bind,src={repo},dst=/repo,readonly", + "--mount", f"type=volume,src={volume},dst=/proof-params", + PYTHON_IMAGE, + "python3", "-c", + "import sys,time; sys.path.insert(0,'/repo/scripts'); import proof_cache_bootstrap as b; x=b.acquire_lock(__import__('pathlib').Path('/proof-params'),False); print('LOCKED',flush=True); time.sleep(20)", + ], + timeout=60, + ) + deadline = time.monotonic() + 15 + while "LOCKED" not in run(["docker", "logs", lock_holder], check=False).stdout and time.monotonic() < deadline: + time.sleep(0.5) + locked = run([*bootstrap_command, "--nonblocking-lock"], timeout=60, check=False) + expect(locked.returncode == 2 and "lock is held" in locked.stderr, "concurrent named-volume bootstrap did not fail lock contention") + run(["docker", "rm", "--force", lock_holder], timeout=30, check=False) + + run( + ["docker", "run", "--rm", "--mount", f"type=volume,src={volume},dst=/proof-params", PYTHON_IMAGE, "python3", "-c", f"p='{fixed}/bls_midnight_2p19'; open(p,'wb').write(b'corrupt'); __import__('os').chmod(p,0o644)"], + timeout=60, + ) + repaired = run(bootstrap_command, timeout=300).stdout.strip() + expect("ACTIVATED" in repaired and "quarantine=" in repaired and "quarantine=none" not in repaired, "same-digest named-volume corruption was not quarantined/repaired") + + alternate = dict(content) + alternate["selection"] = alternate["selection"] + "-failed-activation-fixture" + alternate.pop("combinedManifestSha256") + alternate.pop("identityProjection") + alternate_digest = hashlib.sha256(canonical_bytes(alternate)).hexdigest() + alternate["combinedManifestSha256"] = alternate_digest + alternate["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" + alternate_path = work_root / "alternate-content.json" + create_file_atomic(alternate_path, canonical_bytes(alternate), 0o644) + alternate_command = [ + "docker", "run", "--rm", + "--mount", f"type=bind,src={repo},dst=/repo,readonly", + "--mount", f"type=bind,src={candidate},dst=/candidate,readonly", + "--mount", f"type=bind,src={alternate_path.resolve()},dst=/alternate.json,readonly", + "--mount", f"type=volume,src={volume},dst=/proof-params", + PYTHON_IMAGE, + "python3", "/repo/scripts/proof_cache_bootstrap.py", "bootstrap", + "--manifest", "/alternate.json", "--payload-dir", "/candidate/payloads", "--parent", "/proof-params", "--readers-stopped", + "--inject-failure", "pointer", + ] + failed_pointer = run(alternate_command, timeout=300, check=False) + expect(failed_pointer.returncode == 2 and "pointer" in failed_pointer.stderr, "failed pointer-swap fixture did not fail closed") + pointer = run(["docker", "run", "--rm", "--mount", f"type=volume,src={volume},dst=/proof-params,readonly", PYTHON_IMAGE, "python3", "-c", "import os; print(os.readlink('/proof-params/current'))"]).stdout.strip() + expect(pointer == f"generations/{digest}", "failed update changed the active generation") + gc_referenced = run( + ["docker", "run", "--rm", "--mount", f"type=bind,src={repo},dst=/repo,readonly", "--mount", f"type=volume,src={volume},dst=/proof-params", PYTHON_IMAGE, "python3", "/repo/scripts/proof_cache_bootstrap.py", "gc", "--parent", "/proof-params", "--readers-stopped", "--referenced", alternate_digest], + ).stdout.strip() + expect(gc_referenced == "OK removed=none", "GC removed a current or explicitly referenced generation") + gc_unreferenced = run( + ["docker", "run", "--rm", "--mount", f"type=bind,src={repo},dst=/repo,readonly", "--mount", f"type=volume,src={volume},dst=/proof-params", PYTHON_IMAGE, "python3", "/repo/scripts/proof_cache_bootstrap.py", "gc", "--parent", "/proof-params", "--readers-stopped"], + ).stdout.strip() + expect(alternate_digest in gc_unreferenced, "GC did not remove the unreferenced non-current generation") + run(["docker", "run", "--rm", "--mount", f"type=volume,src={volume},dst=/proof-params", PYTHON_IMAGE, "python3", "-c", "import os; p='/proof-params/current.stale'; os.symlink('generations/'+'0'*64,p); os.replace(p,'/proof-params/current')"]) + stale_repair = run(bootstrap_command, timeout=300).stdout.strip() + expect("NOOP" in stale_repair, "stale current pointer did not reactivate the verified generation") + + # Copy only for the native Compact v2/v3 consumer gate; readers continue using the volume. + cache_copy = work_root / "cache" + cache_copy.mkdir() + run( + [ + "docker", "run", "--rm", + "--mount", f"type=volume,src={volume},dst=/proof-params,readonly", + "--mount", f"type=bind,src={cache_copy.resolve()},dst=/out", + PYTHON_IMAGE, + "python3", "-c", + f"import shutil; shutil.copytree('{fixed}', '/out/generation', copy_function=shutil.copyfile)", + ], + timeout=180, + ) + expect((cache_copy / "generation/bls_midnight_2p19").is_file(), "host Compact cache copy is incomplete") + + ports: list[int] = [] + while len(ports) < 2: + candidate_port = free_port() + if candidate_port not in ports: + ports.append(candidate_port) + for name, role, port in zip(readers, ("plain", "experimental"), ports): + start_reader(name, network, volume, positive["images"][role], fixed, port) + reader_evidence = [] + for name, role, port in zip(readers, ("plain", "experimental"), ports): + version, health = wait_ready(client_name, name, port) + expect(version == "9.0.0-rc.5", f"{role} proof-server version drift: {version}") + inspection = inspect_reader(name, fixed) + fetch_results = {str(k): fetch(client_name, name, port, f"/fetch-params/{k}") for k in range(20)} + expect(set(fetch_results.values()) == {"success"}, f"{role} could not resolve every K0-K19 offline") + run(["docker", "restart", name], timeout=60) + restart_version, restart_health = wait_ready(client_name, name, port) + expect(restart_version == version and fetch(client_name, name, port, "/fetch-params/18") == "success" and fetch(client_name, name, port, "/fetch-params/19") == "success", f"{role} restart/K18/K19 cache reuse failed") + logs = run(["docker", "logs", name], check=False).stdout + expect("srs.midnight.network" not in logs and "Downloading" not in logs, f"{role} logged a covered-data origin attempt") + reader_evidence.append({**inspection, "role": role, "imageDigest": positive["images"][role], "port": port, "version": version, "health": health, "restartHealth": restart_health, "kFetched": list(range(20)), "restartK": [18, 19], "originRequestObserved": False}) + + # Stop both readers before any pointer/generation operation. + for name in readers: + run(["docker", "rm", "--force", name], timeout=30) + + # The exact architecture-specific rc.7/static-10 consumer must not become ready on static-9. + negative_port = free_port() + start_reader(negative_name, network, volume, expected_rc7, fixed, negative_port) + became_ready = False + deadline = time.monotonic() + 75 + state = "" + while time.monotonic() < deadline: + state = run(["docker", "inspect", "--format", "{{.State.Status}} {{.State.ExitCode}}", negative_name], timeout=10).stdout.strip() + try: + fetch(client_name, negative_name, negative_port, "/ready", timeout=2) + became_ready = True + break + except (ForgeError, OSError): + pass + if state.startswith("exited") or state.startswith("dead"): + break + time.sleep(1) + logs = run(["docker", "logs", negative_name], check=False).stdout + expect(not became_ready, "rc.7/static-10 incorrectly accepted static-9") + run(["docker", "rm", "--force", negative_name], timeout=30, check=False) + expect(any(token in logs for token in ("/10/", "zswap/10", "dust/10", "failed", "error", "Error", "connect", "resolve")) or state.startswith("exited"), "rc.7 negative did not expose a static-10/missing-origin rejection") + + result = { + "schemaVersion": "proof-runtime-docker-result-v1", + "os": os_name, + "arch": arch, + "volume": {"type": "named", "bootstrapMount": "read-write", "readerMount": "read-only", "combinedManifestSha256": digest, "fixedMidnightPp": fixed, "firstBootstrap": first_bootstrap, "secondBootstrap": second_bootstrap, "lockContention": "rejected", "sameDigestCorruption": "quarantined-and-repaired", "failedPointerSwapRetainedPrior": True, "stalePointerReactivated": True, "gcProtectedCurrentAndReferenced": True}, + "network": {"internal": True, "officialOriginReachable": False}, + "rc5": {"sourceCommit": positive["sourceCommit"], "readers": reader_evidence, "coldStart": "pass", "restart": "pass", "coveredOriginRequests": 0}, + "rc7Negative": {"sourceCommit": negative["sourceCommit"], "imageDigest": expected_rc7, "publicMultiarchTag": False, "requiresLedgerStaticSemver": "10.0.0", "static9Accepted": False, "srsGenerationReusable": negative["mayReuseSrsGeneration"], "containerState": state, "logSha256": __import__("hashlib").sha256(logs.encode()).hexdigest()}, + "compactCacheDirectory": str(cache_copy / "generation"), + } + create_file_atomic(output, canonical_bytes(result), 0o644) + return result + finally: + for name in [*readers, negative_name, f"{volume}-lock-holder", client_name]: + run(["docker", "rm", "--force", name], timeout=30, check=False) + if created_network: + run(["docker", "network", "rm", network], timeout=30, check=False) + if created_volume: + run(["docker", "volume", "rm", volume], timeout=60, check=False) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--candidate-root", required=True, type=Path) + parser.add_argument("--work-root", required=True, type=Path) + parser.add_argument("--os", required=True, choices=("linux",)) + parser.add_argument("--arch", required=True, choices=("amd64", "arm64")) + parser.add_argument("--run-key", required=True) + parser.add_argument("--output", required=True, type=Path) + args = parser.parse_args() + try: + expect(args.run_key.replace("-", "").isalnum() and len(args.run_key) <= 40, "unsafe runtime run key") + result = runtime_gate(args.candidate_root, args.work_root, args.os, args.arch, args.run_key, args.output) + print(json.dumps(result, sort_keys=True, separators=(",", ":"))) + return 0 + except (ForgeError, OSError, KeyError, TypeError, ValueError, subprocess.SubprocessError, json.JSONDecodeError) as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/validate_compact_direct.py b/scripts/validate_compact_direct.py index d74a766..f226df1 100755 --- a/scripts/validate_compact_direct.py +++ b/scripts/validate_compact_direct.py @@ -218,7 +218,7 @@ def validate_runner_identity(os_name: str, arch: str) -> None: expect(observed_arch == arch, f"native architecture mismatch: expected {arch}, observed {platform.machine()}") -def validate_native(manifest: dict[str, Any], os_name: str, arch: str, work_dir: Path, fixture_path: Path) -> dict[str, Any]: +def validate_native(manifest: dict[str, Any], os_name: str, arch: str, work_dir: Path, fixture_path: Path, proof_cache_dir: Path | None = None) -> dict[str, Any]: validate_runner_identity(os_name, arch) validate_live_release(manifest) matches = [row for row in manifest["upstream"]["assets"] if row["os"] == os_name and row["arch"] == arch] @@ -304,11 +304,15 @@ def validate_native(manifest: dict[str, Any], os_name: str, arch: str, work_dir: expect(fixture[f"expected{version.upper()}Mock"] in mock, f"{version} derived K mismatch: {mock}") outputs[version] = zkir_path - cache = work_dir / "proof-cache" - cache.mkdir(mode=0o700) + cache = proof_cache_dir.resolve() if proof_cache_dir is not None else work_dir / "proof-cache" + if proof_cache_dir is None: + cache.mkdir(mode=0o700) + else: + expect(cache.is_dir() and not cache.is_symlink(), "selected proof cache is not a real directory") srs_path = cache / fixture["srsName"] - srs_path.write_bytes(request_bytes(manifest["proofCacheContract"]["defaultSourceUrl"] + fixture["srsName"])) - srs_path.chmod(0o644) + if proof_cache_dir is None: + srs_path.write_bytes(request_bytes(manifest["proofCacheContract"]["defaultSourceUrl"] + fixture["srsName"])) + srs_path.chmod(0o644) expect(srs_path.stat().st_size == fixture["srsSize"] and sha256_file(srs_path) == fixture["srsSha256"], "native K13 cache input mismatch") proof_env = compile_env.copy() proof_env["MIDNIGHT_PP"] = str(cache) @@ -328,7 +332,7 @@ def validate_native(manifest: dict[str, Any], os_name: str, arch: str, work_dir: "members": sorted(expected_members), "file": file_rows, "versions": observed_versions, - "proofCache": {"environment": "MIDNIGHT_PP", "k": fixture["k"], "name": fixture["srsName"], "sha256": fixture["srsSha256"], "backendKeyDigests": key_digests}, + "proofCache": {"environment": "MIDNIGHT_PP", "source": "preseeded-generation" if proof_cache_dir is not None else "official-single-object", "k": fixture["k"], "name": fixture["srsName"], "sha256": fixture["srsSha256"], "backendKeyDigests": key_digests}, "warehouseOutputCount": 0, } @@ -353,6 +357,7 @@ def main() -> int: native.add_argument("--arch", required=True, choices=["amd64", "arm64"]) native.add_argument("--work-dir", required=True, type=Path) native.add_argument("--fixture", required=True, type=Path) + native.add_argument("--proof-cache-dir", type=Path) args = parser.parse_args() try: manifest = load_manifest(args.manifest) @@ -364,7 +369,7 @@ def main() -> int: validate_runtime_gate(manifest, args.runtime, args.ledger_major) result = {"runtime": args.runtime, "ledgerMajor": args.ledger_major, "coordinatedMigration": True} else: - result = validate_native(manifest, args.os, args.arch, args.work_dir, args.fixture) + result = validate_native(manifest, args.os, args.arch, args.work_dir, args.fixture, args.proof_cache_dir) print(json.dumps(result, sort_keys=True, separators=(",", ":"))) return 0 except (ValidationError, OSError, json.JSONDecodeError, KeyError, subprocess.SubprocessError, zipfile.BadZipFile) as exc: diff --git a/tests/test_proof_data.py b/tests/test_proof_data.py new file mode 100644 index 0000000..495b9f1 --- /dev/null +++ b/tests/test_proof_data.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +import contextlib +import copy +import fcntl +import hashlib +import io +import json +import os +import stat +import sys +import tempfile +import unittest +import zipfile +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +SCRIPTS = ROOT / "scripts" +sys.path.insert(0, str(SCRIPTS)) + +import generate_proof_catalog # noqa: E402 +import proof_cache_bootstrap # noqa: E402 +import proof_data_pipeline # noqa: E402 +import validate_catalog # noqa: E402 +from forge_io import ForgeError, canonical_bytes # noqa: E402 + + +LEDGER_PATHS = [ + "dust/9/spend.bzkir", + "dust/9/spend.prover", + "dust/9/spend.verifier", + "zswap/9/output.bzkir", + "zswap/9/output.prover", + "zswap/9/output.verifier", + "zswap/9/sign.bzkir", + "zswap/9/sign.prover", + "zswap/9/sign.verifier", + "zswap/9/spend.bzkir", + "zswap/9/spend.prover", + "zswap/9/spend.verifier", +] + + +def write_json(path: Path, value: dict) -> None: + path.write_bytes(canonical_bytes(value)) + + +def make_fixture(root: Path, salt: bytes = b"a") -> tuple[Path, Path, str]: + payloads = root / "payloads" + parent = root / "proof-params" + payloads.mkdir(parents=True) + parent.mkdir() + rows = [] + for k in range(20): + name = f"bls_midnight_2p{k}" + data = salt + f"-srs-{k}".encode() + path = payloads / name + path.write_bytes(data) + path.chmod(0o644) + digest = hashlib.sha256(data).hexdigest() + rows.append({"path": name, "kind": "srs", "k": k, "mode": "0644", "size": len(data), "sha256": digest, "generation": "fixture", "outerPayload": name, "outerSha256": digest}) + archive = payloads / "midnight-ledger-static-noarch-9.0.0.zip" + ledger_data = {name: salt + b"-ledger-" + name.encode() for name in LEDGER_PATHS} + with zipfile.ZipFile(archive, "w", compression=zipfile.ZIP_DEFLATED) as output: + for directory in ("dust", "dust/9", "zswap", "zswap/9"): + info = zipfile.ZipInfo(directory + "/", (1980, 1, 1, 0, 0, 0)) + info.create_system = 3 + info.external_attr = ((stat.S_IFDIR | 0o755) << 16) | 0x10 + output.writestr(info, b"") + for name in LEDGER_PATHS: + info = zipfile.ZipInfo(name, (1980, 1, 1, 0, 0, 0)) + info.create_system = 3 + info.external_attr = (stat.S_IFREG | 0o644) << 16 + output.writestr(info, ledger_data[name]) + archive.chmod(0o644) + archive_digest = hashlib.sha256(archive.read_bytes()).hexdigest() + for name in LEDGER_PATHS: + data = ledger_data[name] + rows.append({"path": name, "kind": "ledger-static", "mode": "0644", "size": len(data), "sha256": hashlib.sha256(data).hexdigest(), "ledgerStaticSemver": "9.0.0", "cacheNamespace": "9", "outerPayload": archive.name, "outerSha256": archive_digest}) + content = { + "schemaVersion": "proof-cache-content-manifest-v1", + "canonicalization": "forge-canonical-json-v1", + "selection": "fixture", + "srsGeneration": "fixture", + "ledgerStaticSemver": "9.0.0", + "cacheNamespace": "9", + "ledgerMemberManifestSha256": "1" * 64, + "files": sorted(rows, key=lambda row: row["path"]), + "fileCount": 32, + "payloadCount": 21, + } + digest = hashlib.sha256(canonical_bytes(content)).hexdigest() + content["combinedManifestSha256"] = digest + content["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" + manifest = root / "content.json" + write_json(manifest, content) + return manifest, payloads, digest + + +class ProofDataPolicyTest(unittest.TestCase): + def test_generated_catalog_is_canonical_and_all_components_validate(self) -> None: + outputs = generate_proof_catalog.generated_files() + self.assertEqual(len(outputs), 23) + for path, expected in outputs.items(): + self.assertEqual(path.read_bytes(), expected) + manifest = json.loads((ROOT / "catalog/proof-data/q8b-v1.json").read_text()) + proof_data_pipeline.validate_manifest(manifest) + self.assertEqual(manifest["counts"]["payloadCount"], 21) + self.assertEqual([row["k"] for row in manifest["srs"]], list(range(20))) + self.assertEqual(manifest["ledgerStatic"]["memberManifestSha256"], "0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8") + for path in sorted((ROOT / "catalog/components").glob("midnight-*.json")): + validate_catalog.validate_component(json.loads(path.read_text())) + + def test_future_admission_is_append_only_explicit_and_scope_closed(self) -> None: + manifest = json.loads((ROOT / "catalog/proof-data/q8b-v1.json").read_text()) + future = manifest["futureAdmission"] + self.assertEqual(future["sameKCorrection"], "midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin") + self.assertEqual(future["sameSemverCorrection"], "midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip") + self.assertTrue(future["appendOnly"] and future["explicitGenerationRequiredWhenMultiple"] and future["explicitMemberManifestRequiredWhenMultiple"]) + self.assertFalse(future["implicitLatestAllowed"]) + + for mutation in ("k20", "platform", "custom-key", "static10"): + value = copy.deepcopy(manifest) + if mutation == "k20": + value["srs"].append(dict(value["srs"][-1], k=20, releaseName="bls_midnight_2p20", installName="bls_midnight_2p20")) + value["counts"]["srsPayloadCount"] = 21 + value["counts"]["payloadCount"] = 22 + elif mutation == "platform": + value["srs"][1]["platform"] = "linux/amd64" + elif mutation == "custom-key": + value["scope"]["customProvingKeysIncluded"] = True + else: + value["proofServerCompatibility"]["accepted"]["ledgerStaticSemver"] = "10.0.0" + value["proofServerCompatibility"]["accepted"]["cacheNamespace"] = "10" + with self.subTest(mutation=mutation), self.assertRaises(ForgeError): + proof_data_pipeline.validate_manifest(value) + + def test_bootstrap_atomic_noop_repair_pointer_failure_and_gc(self) -> None: + with tempfile.TemporaryDirectory() as text: + root = Path(text) + manifest, payloads, digest = make_fixture(root / "first") + parent = manifest.parent / "proof-params" + activated = proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + self.assertEqual(activated, digest) + fixed = proof_cache_bootstrap.verify_active(manifest, parent) + self.assertEqual(fixed, str(parent / "generations" / digest)) + inode = (parent / "generations" / digest).stat().st_ino + self.assertEqual(proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None), digest) + self.assertEqual((parent / "generations" / digest).stat().st_ino, inode) + + # Same-digest corruption is quarantined and repaired, never changed in place. + corrupt = parent / "generations" / digest / "bls_midnight_2p19" + corrupt.write_bytes(b"corrupt") + corrupt.chmod(0o644) + corrupt_digest = hashlib.sha256(corrupt.read_bytes()).hexdigest() + with self.assertRaisesRegex(ForgeError, "pointer"): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, "pointer") + self.assertEqual(os.readlink(parent / "current"), f"generations/{digest}") + self.assertEqual(hashlib.sha256(corrupt.read_bytes()).hexdigest(), corrupt_digest) + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + self.assertNotEqual((parent / "generations" / digest).stat().st_ino, inode) + self.assertTrue(any((parent / "quarantine").iterdir())) + proof_cache_bootstrap.verify_active(manifest, parent) + + # A fully staged new generation plus failed pointer swap retains the old pointer. + second_root = root / "second" + manifest2, payloads2, digest2 = make_fixture(second_root, b"b") + with self.assertRaisesRegex(ForgeError, "pointer"): + proof_cache_bootstrap.bootstrap(manifest2, payloads2, parent, True, False, "pointer") + self.assertEqual(os.readlink(parent / "current"), f"generations/{digest}") + proof_cache_bootstrap.verify_active(manifest, parent) + self.assertTrue((parent / "generations" / digest2).is_dir()) + self.assertEqual(proof_cache_bootstrap.gc(parent, {digest2}, True, False), []) + self.assertEqual(proof_cache_bootstrap.gc(parent, set(), True, False), [digest2]) + self.assertTrue((parent / "generations" / digest).is_dir()) + + def test_bootstrap_failure_corruption_missing_extra_modes_and_lock_contention_fail_closed(self) -> None: + with tempfile.TemporaryDirectory() as text: + root = Path(text) + manifest, payloads, digest = make_fixture(root) + parent = root / "proof-params" + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + prior = os.readlink(parent / "current") + + with self.assertRaisesRegex(ForgeError, "readers stopped"): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, False, False, None) + with self.assertRaisesRegex(ForgeError, "injected failure"): + # Force a rebuild by corrupting the installed tree, then fail after staged verification. + target = parent / prior / "bls_midnight_2p0" + target.write_bytes(b"bad") + target.chmod(0o644) + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, "after-verify") + self.assertEqual(os.readlink(parent / "current"), prior) + # The prior bytes are corrupt but were not partially overwritten; a normal repair restores them. + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.verify_active(manifest, parent) + + cases = [] + missing = root / "missing" + os.rename(payloads, missing) + payloads.mkdir() + for path in missing.iterdir(): + if path.name != "bls_midnight_2p5": + os.link(path, payloads / path.name) + cases.append("differs") + with self.assertRaisesRegex(ForgeError, cases[-1]): + # Corrupt installed tree so payload validation is reached. + (parent / prior / "bls_midnight_2p0").write_bytes(b"bad") + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + for path in payloads.iterdir(): + path.unlink() + for path in missing.iterdir(): + os.link(path, payloads / path.name) + extra = payloads / "extra" + extra.write_bytes(b"x") + extra.chmod(0o644) + with self.assertRaisesRegex(ForgeError, "differs"): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + extra.unlink() + (payloads / "bls_midnight_2p0").chmod(0o600) + with self.assertRaisesRegex(ForgeError, "mode mismatch"): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + (payloads / "bls_midnight_2p0").chmod(0o644) + + lock_stream = proof_cache_bootstrap.acquire_lock(parent, False) + try: + with self.assertRaisesRegex(ForgeError, "lock is held"): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, True, None) + finally: + lock_stream.close() + + def test_archive_traversal_link_and_alias_substitution_are_rejected(self) -> None: + with tempfile.TemporaryDirectory() as text: + root = Path(text) + manifest, payloads, _ = make_fixture(root) + parent = root / "proof-params" + archive = payloads / "midnight-ledger-static-noarch-9.0.0.zip" + content = json.loads(manifest.read_text()) + + def rebind_archive(mutator) -> None: + with zipfile.ZipFile(archive, "w") as output: + mutator(output) + archive.chmod(0o644) + outer = hashlib.sha256(archive.read_bytes()).hexdigest() + for row in content["files"]: + if row["kind"] == "ledger-static": + row["outerSha256"] = outer + projection = dict(content) + projection.pop("combinedManifestSha256") + projection.pop("identityProjection") + content["combinedManifestSha256"] = hashlib.sha256(canonical_bytes(projection)).hexdigest() + write_json(manifest, content) + + rebind_archive(lambda output: output.writestr("../escape", b"x")) + with self.assertRaises(ForgeError): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + + def link_archive(output: zipfile.ZipFile) -> None: + info = zipfile.ZipInfo("dust/9/spend.bzkir") + info.create_system = 3 + info.external_attr = (stat.S_IFLNK | 0o777) << 16 + output.writestr(info, "target") + + rebind_archive(link_archive) + with self.assertRaises(ForgeError): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + + # An outer alias change cannot shadow the literal payload selection. + original = json.loads(manifest.read_text()) + original["files"][0]["outerPayload"] = "midnight-srs-noarch-2p0-sha256-dead.bin" + projection = dict(original) + projection.pop("combinedManifestSha256") + projection.pop("identityProjection") + original["combinedManifestSha256"] = hashlib.sha256(canonical_bytes(projection)).hexdigest() + write_json(manifest, original) + with self.assertRaisesRegex(ForgeError, "payload directory differs"): + proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + + +if __name__ == "__main__": + unittest.main(verbosity=2) From d4d7d44203b89a7cb97deef99168f5dcc7c10e57 Mon Sep 17 00:00:00 2001 From: "Edward A." Date: Fri, 28 Aug 2026 06:17:02 -0400 Subject: [PATCH 2/7] test: prove stock AA K19 from offline cache --- .github/workflows/proof-data-q8b.yml | 133 ++++++++ catalog/proof-data/stock-aa-k19-v1.json | 117 +++++++ scripts/stock_aa_k19_proof.mjs | 390 ++++++++++++++++++++++++ scripts/stock_aa_k19_runtime.py | 219 +++++++++++++ tests/test_proof_data.py | 31 ++ 5 files changed, 890 insertions(+) create mode 100644 catalog/proof-data/stock-aa-k19-v1.json create mode 100755 scripts/stock_aa_k19_proof.mjs create mode 100755 scripts/stock_aa_k19_runtime.py diff --git a/.github/workflows/proof-data-q8b.yml b/.github/workflows/proof-data-q8b.yml index e8457e6..d30ea8c 100644 --- a/.github/workflows/proof-data-q8b.yml +++ b/.github/workflows/proof-data-q8b.yml @@ -11,6 +11,8 @@ on: - 'scripts/proof_cache_bootstrap.py' - 'scripts/proof_data_pipeline.py' - 'scripts/proof_runtime_docker.py' + - 'scripts/stock_aa_k19_proof.mjs' + - 'scripts/stock_aa_k19_runtime.py' - 'scripts/validate_compact_direct.py' - 'tests/test_proof_data.py' push: @@ -25,6 +27,8 @@ on: - 'scripts/proof_cache_bootstrap.py' - 'scripts/proof_data_pipeline.py' - 'scripts/proof_runtime_docker.py' + - 'scripts/stock_aa_k19_proof.mjs' + - 'scripts/stock_aa_k19_runtime.py' - 'scripts/validate_compact_direct.py' - 'tests/test_proof_data.py' workflow_dispatch: @@ -154,3 +158,132 @@ jobs: if-no-files-found: error retention-days: 14 compression-level: 9 + + stock-aa-k19-proof: + needs: acquire-reproduce + runs-on: ubuntu-24.04 + timeout-minutes: 90 + steps: + - name: Check out exact forge source without credentials + uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 + with: + persist-credentials: false + - name: Install exact Node runtime + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 + with: + node-version: '22.23.2' + - name: Install exact pnpm runtime + uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 + with: + version: '11.24.0' + run_install: false + - name: Download exact inert Q8B acquisition + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 + with: + name: proof-data-q8b-${{ github.sha }} + path: ${{ runner.temp }}/q8b-candidate + - name: Check capacity and acquire exact stock-AA source and compiler + env: + RUNNER_TEMP_ROOT: ${{ runner.temp }} + run: | + set -euo pipefail + python3 scripts/check_runner_capability.py --runner-label ubuntu-24.04 --expected-os linux --expected-arch amd64 --require-tool docker --require-tool git --min-free-gib 10 + python3 scripts/proof_data_pipeline.py verify-output --output-root "$RUNNER_TEMP_ROOT/q8b-candidate" + aa_root="$RUNNER_TEMP_ROOT/stock-aa" + git init -q "$aa_root" + git -C "$aa_root" remote add origin https://github.com/acedward/AA-midnight-evm-experiment-v3.git + git -C "$aa_root" fetch -q --depth 1 origin 713a20215f33e02904ea5bd699b7de7f76562e1b + git -C "$aa_root" checkout -q --detach FETCH_HEAD + test "$(git -C "$aa_root" rev-parse HEAD)" = 713a20215f33e02904ea5bd699b7de7f76562e1b + test "$(git -C "$aa_root" rev-parse 'HEAD^{tree}')" = b80be8377cf97913b9bfef0f3efe3870bdd56274 + test -z "$(git -C "$aa_root" status --porcelain)" + cd "$aa_root" + printf '%s %s\n' \ + 164cf112dc52ba88f1e16cfbd1e63c3bc6b2831539be12e7de229847dd7025c7 contracts/manager.compact \ + 50eafed342d1be2d19dcc72d51c98ce9f69eb41fb0fd47db1018125787424632 tests/package.json \ + 6bd6566c2883da39496e660afd0cdcfc89c0384f868f20d5b13e735dc43c7d90 tests/pnpm-lock.yaml \ + 4934d34892a92332f76bd3bf20eebc8b97f7ad3fcf9e6ff4de4c82fdb1d9991c tests/pnpm-workspace.yaml \ + | sha256sum --check --strict + cd "$RUNNER_TEMP_ROOT" + curl --proto '=https' --tlsv1.2 --fail --location --silent --show-error \ + --output compactc-0.33.0-rc.2.zip \ + https://github.com/LFDT-Minokawa/compact/releases/download/compactc-v0.33.0-rc.2/compactc_v0.33.0-rc.2_x86_64-unknown-linux-musl.zip + printf '%s %s\n' 3055ab92bbc8d5bb0d6282b661b83761d2a0de2ee37e21cf7107e25aaf2a9aad compactc-0.33.0-rc.2.zip | sha256sum --check --strict + mkdir -m 700 compactc-0.33.0-rc.2 + unzip -q compactc-0.33.0-rc.2.zip -d compactc-0.33.0-rc.2 + test -x compactc-0.33.0-rc.2/compactc + test -x compactc-0.33.0-rc.2/zkir + - name: Install only the exact frozen AA dependency graph + env: + RUNNER_TEMP_ROOT: ${{ runner.temp }} + run: | + set -euo pipefail + cd "$RUNNER_TEMP_ROOT/stock-aa/tests" + pnpm install --frozen-lockfile + test "$(node --version)" = v22.23.2 + test "$(pnpm --version)" = 11.24.0 + - name: Generate the stock K19 artifacts from the fixed combined generation offline + env: + RUNNER_TEMP_ROOT: ${{ runner.temp }} + run: | + set -euo pipefail + cache_parent="$RUNNER_TEMP_ROOT/stock-aa-proof-params" + mkdir -m 700 "$cache_parent" + python3 scripts/proof_cache_bootstrap.py bootstrap \ + --manifest "$RUNNER_TEMP_ROOT/q8b-candidate/evidence/proof-cache-content-manifest-v1.json" \ + --payload-dir "$RUNNER_TEMP_ROOT/q8b-candidate/payloads" \ + --parent "$cache_parent" --readers-stopped + combined_digest="$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["combinedManifestSha256"])' "$RUNNER_TEMP_ROOT/q8b-candidate/evidence/proof-cache-content-manifest-v1.json")" + fixed_generation="$cache_parent/generations/$combined_digest" + test -f "$fixed_generation/bls_midnight_2p19" + mkdir -p "$RUNNER_TEMP_ROOT/stock-aa/tests/generated/manager-keys" + docker pull docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7 + docker run --rm --network none \ + --mount "type=bind,src=$RUNNER_TEMP_ROOT/compactc-0.33.0-rc.2,dst=/tool,readonly" \ + docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7 \ + /tool/compactc --version | grep -Fx '0.33.0' + docker run --rm --network none \ + --mount "type=bind,src=$RUNNER_TEMP_ROOT/compactc-0.33.0-rc.2,dst=/tool,readonly" \ + docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7 \ + /tool/compactc --language-version | grep -Fx '0.25.0' + docker run --rm --network none --cpus 4 --memory 12g --memory-swap 12g \ + --env RAYON_NUM_THREADS=4 --env MIDNIGHT_PP=/proof-params \ + --mount "type=bind,src=$RUNNER_TEMP_ROOT/compactc-0.33.0-rc.2,dst=/tool,readonly" \ + --mount "type=bind,src=$RUNNER_TEMP_ROOT/stock-aa/contracts,dst=/contracts,readonly" \ + --mount "type=bind,src=$fixed_generation,dst=/proof-params,readonly" \ + --mount "type=bind,src=$RUNNER_TEMP_ROOT/stock-aa/tests/generated/manager-keys,dst=/out" \ + docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7 \ + /tool/compactc --feature-zkir-v3 /contracts/manager.compact /out + cd "$RUNNER_TEMP_ROOT/stock-aa/tests/generated/manager-keys" + printf '%s %s\n' \ + 382ae4325f239a3e4e9ac292cacbb1ed1eceec71112eefa2f7557f6ecbe6865a keys/execute.prover \ + e24ba5cf69bd494765b5daa79da9b6da55a5385e625b060467184b156035fd3b keys/execute.verifier \ + ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b zkir/execute.bzkir \ + bd8e655895e883a78525dce673ca398d45af84cc21e4c713860b39d5fd7774ec zkir/execute.zkir \ + 9ea2d64810852f853461d90a50090a1a71b4e065256c1c2068e25d1a37b2da33 compiler/contract-manifest.json \ + | sha256sum --check --strict + - name: Execute real rc.5 stock-AA K19 proof with origin egress blocked + env: + RUNNER_TEMP_ROOT: ${{ runner.temp }} + RUN_KEY: ${{ github.run_id }}-${{ github.run_attempt }} + run: | + set -euo pipefail + docker pull docker.io/library/node@sha256:4d676821dff059fd00d277ee4261ef34ea712317fed0737c03941481b5760c96 + docker pull midnightntwrk/proof-server@sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1 + mkdir -m 700 "$RUNNER_TEMP_ROOT/stock-aa-runtime-work" + python3 scripts/stock_aa_k19_runtime.py \ + --candidate-root "$RUNNER_TEMP_ROOT/q8b-candidate" \ + --aa-root "$RUNNER_TEMP_ROOT/stock-aa" \ + --work-root "$RUNNER_TEMP_ROOT/stock-aa-runtime-work" \ + --run-key "$RUN_KEY" \ + --output "$RUNNER_TEMP_ROOT/stock-aa-k19-runtime.json" + - name: Retain non-secret stock-AA K19 proof evidence + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: stock-aa-k19-proof-${{ github.sha }} + path: | + ${{ runner.temp }}/stock-aa-k19-runtime.json + ${{ runner.temp }}/stock-aa-runtime-work/stock-aa-k19-node.json + if-no-files-found: error + retention-days: 14 + compression-level: 9 diff --git a/catalog/proof-data/stock-aa-k19-v1.json b/catalog/proof-data/stock-aa-k19-v1.json new file mode 100644 index 0000000..0b15be9 --- /dev/null +++ b/catalog/proof-data/stock-aa-k19-v1.json @@ -0,0 +1,117 @@ +{ + "schemaVersion": "stock-aa-k19-input-v1", + "purpose": "deterministic non-secret stock-AA K19 proof acceptance fixture", + "scope": { + "productionUse": false, + "capturedRequestAllowed": false, + "walletOrLiveStateAllowed": false, + "k18": "not-applicable-disabled-overlay-not-restored-or-audited" + }, + "source": { + "repository": "acedward/AA-midnight-evm-experiment-v3", + "commit": "713a20215f33e02904ea5bd699b7de7f76562e1b", + "tree": "b80be8377cf97913b9bfef0f3efe3870bdd56274", + "files": [ + { + "path": "contracts/manager.compact", + "sha256": "164cf112dc52ba88f1e16cfbd1e63c3bc6b2831539be12e7de229847dd7025c7" + }, + { + "path": "tests/package.json", + "sha256": "50eafed342d1be2d19dcc72d51c98ce9f69eb41fb0fd47db1018125787424632" + }, + { + "path": "tests/pnpm-lock.yaml", + "sha256": "6bd6566c2883da39496e660afd0cdcfc89c0384f868f20d5b13e735dc43c7d90" + }, + { + "path": "tests/pnpm-workspace.yaml", + "sha256": "4934d34892a92332f76bd3bf20eebc8b97f7ad3fcf9e6ff4de4c82fdb1d9991c" + } + ] + }, + "toolchain": { + "compilerVersion": "0.33.0-rc.2", + "compilerReportedVersion": "0.33.0", + "languageVersion": "0.25.0", + "backend": "zkir-v3", + "release": { + "repository": "LFDT-Minokawa/compact", + "id": 354541158, + "nodeId": "RE_kwDOQnquic4VId5m", + "tag": "compactc-v0.33.0-rc.2", + "immutable": true, + "asset": { + "id": 478090789, + "nodeId": "RA_kwDOQnquic4cfxYl", + "name": "compactc_v0.33.0-rc.2_x86_64-unknown-linux-musl.zip", + "size": 32498268, + "sha256": "3055ab92bbc8d5bb0d6282b661b83761d2a0de2ee37e21cf7107e25aaf2a9aad", + "url": "https://github.com/LFDT-Minokawa/compact/releases/download/compactc-v0.33.0-rc.2/compactc_v0.33.0-rc.2_x86_64-unknown-linux-musl.zip" + } + }, + "node": "22.23.2", + "pnpm": "11.24.0", + "nodeImage": "docker.io/library/node@sha256:4d676821dff059fd00d277ee4261ef34ea712317fed0737c03941481b5760c96" + }, + "dependencies": { + "@midnight-ntwrk/compact-runtime": "0.18.0-rc.1", + "@midnight-ntwrk/compact-js": "2.5.5-rc.7", + "@midnight-ntwrk/midnight-js-contracts": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-http-client-proof-provider": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-node-zk-config-provider": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.6", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@noble/curves": "2.2.0" + }, + "generator": { + "publicSeedSha256": "d9f6eaadd24aa5991480ced52cd3b98eb4bb465e6375dd72f3ac58827f6e40e8", + "publicWitnessLabel": "phase3p-public-k19", + "preimageBytes": 707, + "preimageSha256": "1326dcdf0e667b33571ef2f622b7ed016a34ba93f203642fa3bc3aeca0d6aa26", + "keyLocation": "contract:f814c7a87a346c4dfcd1ea8dc976046714f84c25e292156269822805b3a718be/execute?vk=e24ba5cf69bd494765b5daa79da9b6da55a5385e625b060467184b156035fd3b" + }, + "circuit": { + "id": "execute", + "k": 19, + "artifacts": [ + { + "path": "keys/execute.prover", + "size": 1141041970, + "sha256": "382ae4325f239a3e4e9ac292cacbb1ed1eceec71112eefa2f7557f6ecbe6865a" + }, + { + "path": "keys/execute.verifier", + "size": 3321, + "sha256": "e24ba5cf69bd494765b5daa79da9b6da55a5385e625b060467184b156035fd3b" + }, + { + "path": "zkir/execute.bzkir", + "size": 184411, + "sha256": "ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b" + }, + { + "path": "zkir/execute.zkir", + "size": 605634, + "sha256": "bd8e655895e883a78525dce673ca398d45af84cc21e4c713860b39d5fd7774ec" + }, + { + "path": "compiler/contract-manifest.json", + "size": 6753, + "sha256": "9ea2d64810852f853461d90a50090a1a71b4e065256c1c2068e25d1a37b2da33" + } + ] + }, + "runtime": { + "proofServerVariant": "experimental", + "proofServerVersion": "9.0.0-rc.5", + "proofServerImage": "midnightntwrk/proof-server@sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1", + "parameterContract": "the exact Q8B combined-manifest-addressed generation is mounted read-only and origin egress is blocked", + "requiredEndpoints": [ + "POST /k => 19", + "POST /check => success", + "POST /prove => success" + ] + } +} diff --git a/scripts/stock_aa_k19_proof.mjs b/scripts/stock_aa_k19_proof.mjs new file mode 100755 index 0000000..7c63039 --- /dev/null +++ b/scripts/stock_aa_k19_proof.mjs @@ -0,0 +1,390 @@ +#!/usr/bin/env node +/** + * Generate and prove a deterministic, non-secret stock-AA execute call. + * + * The script is intentionally tied to the exact AA/midnight-js dependency line + * used by the stock K19 Manager. It never reads a wallet, node, indexer, + * captured request, or environment secret. All witness and transaction + * randomness comes from the public seed below, and the inert native-owner + * execute input comes from the AA simulator's public fixture. + */ + +import { createHash } from "node:crypto"; +import { createRequire } from "node:module"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import { createReadStream } from "node:fs"; +import { readFile, stat } from "node:fs/promises"; + +const PUBLIC_RNG_SEED = Buffer.from("midnight-binary-forge/phase3p/stock-aa-k19/v1", "utf8"); +const EXPECTED_EXECUTE_BZKIR_SHA256 = "ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b"; +const EXPECTED_EXECUTE_BZKIR_SIZE = 184411; +const EXPECTED_EXECUTE_PROVER_SIZE = 1141041970; +const EXPECTED_EXECUTE_PROVER_SHA256 = "382ae4325f239a3e4e9ac292cacbb1ed1eceec71112eefa2f7557f6ecbe6865a"; +const EXPECTED_PREIMAGE_BYTES = 707; +const EXPECTED_PREIMAGE_SHA256 = "1326dcdf0e667b33571ef2f622b7ed016a34ba93f203642fa3bc3aeca0d6aa26"; +const EXPECTED_KEY_LOCATION = "contract:f814c7a87a346c4dfcd1ea8dc976046714f84c25e292156269822805b3a718be/execute?vk=e24ba5cf69bd494765b5daa79da9b6da55a5385e625b060467184b156035fd3b"; +const EXPECTED_AA_COMMIT = "713a20215f33e02904ea5bd699b7de7f76562e1b"; +const EXPECTED_AA_TREE = "b80be8377cf97913b9bfef0f3efe3870bdd56274"; +const EXPECTED_PACKAGE_VERSIONS = Object.freeze({ + "@midnight-ntwrk/compact-runtime": "0.18.0-rc.1", + "@midnight-ntwrk/midnight-js-contracts": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-http-client-proof-provider": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-node-zk-config-provider": "5.0.0-beta.6", + "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.6", + "@midnightntwrk/ledger-v9": "1.0.0-rc.3", + "@noble/curves": "2.2.0", +}); + +function fail(message) { + throw new Error(message); +} + +function parseArgs(argv) { + const values = { + dependencyRoot: undefined, + artifactRoot: undefined, + contractModule: undefined, + proofServer: undefined, + expectedAaCommit: EXPECTED_AA_COMMIT, + expectedAaTree: EXPECTED_AA_TREE, + output: undefined, + preflightOnly: false, + }; + for (let index = 0; index < argv.length; index += 1) { + const name = argv[index]; + if (name === "--preflight-only") { + values.preflightOnly = true; + continue; + } + const key = { + "--dependency-root": "dependencyRoot", + "--artifact-root": "artifactRoot", + "--contract-module": "contractModule", + "--proof-server": "proofServer", + "--expected-aa-commit": "expectedAaCommit", + "--expected-aa-tree": "expectedAaTree", + "--output": "output", + }[name]; + if (key === undefined || argv[index + 1] === undefined) fail(`invalid argument: ${name}`); + values[key] = argv[index + 1]; + index += 1; + } + for (const required of ["dependencyRoot", "artifactRoot", "contractModule"]) { + if (values[required] === undefined) fail(`missing --${required.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`); + } + if (!values.preflightOnly && values.proofServer === undefined) fail("missing --proof-server"); + return values; +} + +function sha256(bytes) { + return createHash("sha256").update(bytes).digest("hex"); +} + +function installDeterministicCrypto() { + let counter = 0n; + const original = globalThis.crypto; + const deterministic = Object.create(original); + Object.defineProperty(deterministic, "getRandomValues", { + configurable: false, + enumerable: true, + value(target) { + if (!ArrayBuffer.isView(target) || target instanceof DataView) { + throw new TypeError("getRandomValues target must be an integer TypedArray"); + } + const bytes = new Uint8Array(target.buffer, target.byteOffset, target.byteLength); + let offset = 0; + while (offset < bytes.length) { + const count = Buffer.alloc(8); + count.writeBigUInt64BE(counter); + counter += 1n; + const block = createHash("sha256").update(PUBLIC_RNG_SEED).update(count).digest(); + offset += block.copy(bytes, offset, 0, Math.min(block.length, bytes.length - offset)); + } + return target; + }, + }); + Object.defineProperty(globalThis, "crypto", { configurable: true, value: deterministic }); + return () => { + counter = 0n; + }; +} + +async function sha256File(path) { + const digest = createHash("sha256"); + for await (const chunk of createReadStream(path)) digest.update(chunk); + return digest.digest("hex"); +} + +async function loadPinnedModules(dependencyRoot) { + const requireFromDependencyRoot = createRequire(join(resolve(dependencyRoot), "package.json")); + const packageInfo = new Map(); + const observed = {}; + for (const [packageName, expected] of Object.entries(EXPECTED_PACKAGE_VERSIONS)) { + const packageJsonPath = requireFromDependencyRoot.resolve(`${packageName}/package.json`); + const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8")); + packageInfo.set(packageName, { packageJson, root: dirname(packageJsonPath) }); + const actual = packageJson.version; + if (actual !== expected) fail(`${packageName} version drift: expected ${expected}, got ${actual}`); + observed[packageName] = actual; + } + const protocolPackage = packageInfo.get("@midnight-ntwrk/midnight-js-protocol")?.packageJson; + if (protocolPackage?.dependencies?.["@midnight-ntwrk/compact-js"] !== "2.5.5-rc.7") { + fail("@midnight-ntwrk/compact-js transitive pin drift"); + } + observed["@midnight-ntwrk/compact-js"] = "2.5.5-rc.7"; + const dynamic = async (specifier) => { + const packageName = specifier.startsWith("@") ? specifier.split("/").slice(0, 2).join("/") : specifier.split("/")[0]; + const info = packageInfo.get(packageName); + if (info === undefined) fail(`unversioned dependency import: ${specifier}`); + const suffix = specifier.slice(packageName.length); + const exportKey = suffix === "" ? "." : `.${suffix}`; + let selected = info.packageJson.exports?.[exportKey]; + if (selected !== undefined && typeof selected === "object") { + selected = selected.import ?? selected.default; + } + if (selected === undefined && suffix === "") selected = info.packageJson.module ?? info.packageJson.main; + if (typeof selected !== "string") fail(`cannot resolve ESM export ${specifier}`); + return import(pathToFileURL(resolve(info.root, selected)).href); + }; + return { + observed, + compactJs: await dynamic("@midnight-ntwrk/midnight-js-protocol/compact-js"), + compactRuntime: await dynamic("@midnight-ntwrk/compact-runtime"), + contracts: await dynamic("@midnight-ntwrk/midnight-js-contracts"), + proofClient: await dynamic("@midnight-ntwrk/midnight-js-http-client-proof-provider"), + networkId: await dynamic("@midnight-ntwrk/midnight-js-network-id"), + zkConfig: await dynamic("@midnight-ntwrk/midnight-js-node-zk-config-provider"), + ledger: await dynamic("@midnight-ntwrk/midnight-js-protocol/ledger"), + secp: await dynamic("@noble/curves/secp256k1.js"), + }; +} + +function publicBytes(label) { + const encoded = Buffer.from(label, "utf8"); + if (encoded.length > 32) fail(`public label is longer than 32 bytes: ${label}`); + const result = new Uint8Array(32); + result.set(encoded); + return result; +} + +function defaultExecutePayload() { + const zero32 = () => new Uint8Array(32); + return { + selector: 0n, + authMode: 0n, + account: zero32(), + owner: new Uint8Array(20), + accountSalt: zero32(), + nonce: 0n, + validUntil: 0n, + primaryColor: zero32(), + primaryAmount: 0n, + recipientKind: 0n, + recipient: zero32(), + toAccount: zero32(), + wantNonce: zero32(), + wantColor: zero32(), + wantAmount: 0n, + creditAccount: zero32(), + }; +} + +function inertSignatureAndPoint(secp256k1) { + const publicKey = secp256k1.getPublicKey( + Buffer.from("4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318", "hex"), + false, + ); + return { + signature: { + r: 0x18c8c0b1a03a9d14923824f037423de763035cc9b4ae011b10519473553845fan, + s: 0x4b23d69e009b1b012a044d2651134524419f420f6157d333eda0b3cb2d469f81n, + }, + point: { + x: BigInt(`0x${Buffer.from(publicKey.subarray(1, 33)).toString("hex")}`), + y: BigInt(`0x${Buffer.from(publicKey.subarray(33, 65)).toString("hex")}`), + identity: false, + }, + }; +} + +async function assertArtifactIdentity(artifactRoot, preflightOnly) { + const bzkir = await readFile(join(artifactRoot, "zkir", "execute.bzkir")); + if (bzkir.length !== EXPECTED_EXECUTE_BZKIR_SIZE || sha256(bzkir) !== EXPECTED_EXECUTE_BZKIR_SHA256) { + fail("stock AA execute.bzkir identity drift"); + } + const result = { bzkirBytes: bzkir.length, bzkirSha256: sha256(bzkir) }; + if (!preflightOnly) { + const proverPath = join(artifactRoot, "keys", "execute.prover"); + const proverSize = (await stat(proverPath)).size; + if (proverSize !== EXPECTED_EXECUTE_PROVER_SIZE) fail(`stock AA execute.prover size drift: ${proverSize}`); + const proverDigest = await sha256File(proverPath); + if (proverDigest !== EXPECTED_EXECUTE_PROVER_SHA256) fail(`stock AA execute.prover digest drift: ${proverDigest}`); + result.proverBytes = proverSize; + result.proverSha256 = proverDigest; + } + return result; +} + +async function createStockCall(modules, managerModule, artifactRoot) { + const ownerSecret = publicBytes("phase3p-public-k19"); + const witnesses = { + localOwnerSecret: ({ privateState }) => [privateState, ownerSecret], + }; + const compiledContract = modules.compactJs.CompiledContract.make("contract-manager", managerModule.Contract).pipe( + modules.compactJs.CompiledContract.withWitnesses(witnesses), + modules.compactJs.CompiledContract.withCompiledFileAssets(artifactRoot), + ); + const zkConfigProvider = new modules.zkConfig.NodeZkConfigProvider(artifactRoot); + const coinPublicKey = modules.ledger.sampleCoinPublicKey(); + const encryptionPublicKey = modules.ledger.sampleEncryptionPublicKey(); + const deploy = await modules.contracts.createUnprovenDeployTxFromVerifierKeys( + zkConfigProvider, + coinPublicKey, + { + compiledContract, + signingKey: modules.compactRuntime.sampleSigningKey(), + initialPrivateState: {}, + args: [new Uint8Array(32).fill(0xdd)], + }, + encryptionPublicKey, + ); + const { signature, point } = inertSignatureAndPoint(modules.secp.secp256k1); + const call = await modules.contracts.createUnprovenCallTxFromInitialStates( + zkConfigProvider, + { + compiledContract, + circuitId: "execute", + contractAddress: deploy.public.contractAddress, + args: [defaultExecutePayload(), signature, point], + coinPublicKey, + initialContractState: deploy.public.initialContractState, + initialZswapChainState: new modules.ledger.ZswapChainState(), + ledgerParameters: modules.ledger.LedgerParameters.initialParameters(), + initialPrivateState: {}, + }, + encryptionPublicKey, + ); + return { call, zkConfigProvider }; +} + +function tracingProvider(base, trace, abortAfterCheck) { + return { + async check(serializedPreimage, keyLocation) { + trace.push({ + operation: "check", + keyLocation, + preimageBytes: serializedPreimage.length, + preimageSha256: sha256(serializedPreimage), + }); + if (abortAfterCheck) throw new Error("PHASE3P_DETERMINISM_CAPTURE_COMPLETE"); + return base.check(serializedPreimage, keyLocation); + }, + async prove(serializedPreimage, keyLocation, overwriteBindingInput) { + trace.push({ + operation: "prove", + keyLocation, + overwriteBindingInput: overwriteBindingInput?.toString(), + preimageBytes: serializedPreimage.length, + preimageSha256: sha256(serializedPreimage), + }); + return base.prove(serializedPreimage, keyLocation, overwriteBindingInput); + }, + lookupKey: (keyLocation) => base.lookupKey(keyLocation), + }; +} + +async function capturePreimage(modules, callData) { + const trace = []; + const provider = tracingProvider({ + check: async () => fail("capture check must abort before delegation"), + prove: async () => fail("capture prove must not run"), + lookupKey: async () => undefined, + }, trace, true); + try { + await callData.private.unprovenTx.prove(provider, modules.ledger.CostModel.initialCostModel()); + fail("determinism capture unexpectedly completed a proof"); + } catch (error) { + if (!(error instanceof Error) || !error.message.includes("PHASE3P_DETERMINISM_CAPTURE_COMPLETE")) throw error; + } + if (trace.length !== 1 || trace[0].operation !== "check") fail("expected one captured execute proof preimage"); + return trace[0]; +} + +async function main() { + const args = parseArgs(process.argv.slice(2)); + const resetRng = installDeterministicCrypto(); + const modules = await loadPinnedModules(args.dependencyRoot); + modules.networkId.setNetworkId("undeployed"); + const managerModule = await import(pathToFileURL(resolve(args.contractModule)).href); + const artifactIdentity = await assertArtifactIdentity(resolve(args.artifactRoot), args.preflightOnly); + + resetRng(); + const first = await createStockCall(modules, managerModule, resolve(args.artifactRoot)); + const firstCapture = await capturePreimage(modules, first.call); + resetRng(); + const second = await createStockCall(modules, managerModule, resolve(args.artifactRoot)); + const secondCapture = await capturePreimage(modules, second.call); + if (JSON.stringify(firstCapture) !== JSON.stringify(secondCapture)) fail("stock AA proof preimage is not deterministic"); + if ( + firstCapture.preimageBytes !== EXPECTED_PREIMAGE_BYTES || + firstCapture.preimageSha256 !== EXPECTED_PREIMAGE_SHA256 || + firstCapture.keyLocation !== EXPECTED_KEY_LOCATION + ) { + fail(`stock AA deterministic preimage identity drift: ${JSON.stringify(firstCapture)}`); + } + + const evidence = { + schemaVersion: "stock-aa-k19-proof-v1", + aa: { commit: args.expectedAaCommit, tree: args.expectedAaTree }, + dependencies: modules.observed, + circuit: { id: "execute", k: 19, ...artifactIdentity }, + generator: { + publicSeedSha256: sha256(PUBLIC_RNG_SEED), + publicWitnessLabel: "phase3p-public-k19", + capturedRequest: false, + deterministicPreimage: firstCapture, + }, + proof: { executed: false }, + }; + + if (!args.preflightOnly) { + resetRng(); + const real = await createStockCall(modules, managerModule, resolve(args.artifactRoot)); + const base = modules.proofClient.httpClientProvingProvider(args.proofServer, real.zkConfigProvider, { timeout: 900000 }); + const trace = []; + const started = Date.now(); + const proven = await real.call.private.unprovenTx.prove( + tracingProvider(base, trace, false), + modules.ledger.CostModel.initialCostModel(), + ); + const serialized = proven.serialize(); + if (trace.length !== 2 || trace[0].operation !== "check" || trace[1].operation !== "prove") { + fail(`unexpected real proof trace: ${JSON.stringify(trace)}`); + } + if (trace[0].preimageSha256 !== firstCapture.preimageSha256 || trace[1].preimageSha256 !== firstCapture.preimageSha256) { + fail("real proof did not use the deterministic preimage"); + } + evidence.proof = { + executed: true, + endpoint: "/prove", + elapsedMs: Date.now() - started, + resultBytes: serialized.length, + resultSha256: sha256(serialized), + trace, + }; + } + + const rendered = `${JSON.stringify(evidence, null, 2)}\n`; + if (args.output !== undefined) { + const { writeFile } = await import("node:fs/promises"); + await writeFile(resolve(args.output), rendered, { encoding: "utf8", mode: 0o644 }); + } + process.stdout.write(rendered); +} + +await main().catch((error) => { + process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`); + process.exitCode = 1; +}); diff --git a/scripts/stock_aa_k19_runtime.py b/scripts/stock_aa_k19_runtime.py new file mode 100755 index 0000000..87d2d65 --- /dev/null +++ b/scripts/stock_aa_k19_runtime.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python3 +"""Prove the deterministic stock-AA K19 call against the fixed offline Q8B generation.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import re +import subprocess +import time +from pathlib import Path + +from forge_io import ForgeError, canonical_bytes, create_file_atomic, expect, load_json + + +ROOT = Path(__file__).resolve().parents[1] +PYTHON_IMAGE = "docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7" +NODE_IMAGE = "docker.io/library/node@sha256:4d676821dff059fd00d277ee4261ef34ea712317fed0737c03941481b5760c96" +AA_COMMIT = "713a20215f33e02904ea5bd699b7de7f76562e1b" +AA_TREE = "b80be8377cf97913b9bfef0f3efe3870bdd56274" + + +def run(arguments: list[str], *, timeout: int = 180, check: bool = True) -> subprocess.CompletedProcess[str]: + result = subprocess.run(arguments, stdin=subprocess.DEVNULL, capture_output=True, text=True, timeout=timeout, check=False) + if check and result.returncode != 0: + raise ForgeError( + f"command failed ({result.returncode}): {' '.join(arguments)}\n" + f"stdout={result.stdout[-12000:]}\nstderr={result.stderr[-12000:]}" + ) + return result + + +def docker_exec_fetch(client: str, url: str, *, body: str | None = None, timeout: int = 180) -> str: + if body is None: + code = ( + "import sys,urllib.request;" + "r=urllib.request.urlopen(sys.argv[1],timeout=int(sys.argv[2]));" + "assert r.status==200;print(r.read().decode(),end='')" + ) + arguments = [url, str(timeout)] + else: + code = ( + "import sys,urllib.request;" + "b=open(sys.argv[2],'rb').read();" + "q=urllib.request.Request(sys.argv[1],data=b,method='POST');" + "r=urllib.request.urlopen(q,timeout=int(sys.argv[3]));" + "assert r.status==200;print(r.read().decode(),end='')" + ) + arguments = [url, body, str(timeout)] + return run(["docker", "exec", client, "python3", "-c", code, *arguments], timeout=timeout + 30).stdout + + +def wait_ready(client: str, reader: str, port: int) -> tuple[str, str]: + deadline = time.monotonic() + 180 + last = "" + while time.monotonic() < deadline: + state = run(["docker", "inspect", "--format", "{{.State.Status}} {{.State.ExitCode}}", reader], timeout=10).stdout.strip() + if state.startswith(("exited", "dead")): + raise ForgeError(f"stock-AA proof reader exited before ready: {state}\n{run(['docker', 'logs', reader], check=False).stdout[-8000:]}") + try: + version = docker_exec_fetch(client, f"http://{reader}:{port}/version", timeout=5) + ready = docker_exec_fetch(client, f"http://{reader}:{port}/ready", timeout=5) + return version, ready + except (ForgeError, OSError) as exc: + last = str(exc) + time.sleep(1) + raise ForgeError(f"stock-AA proof reader was not ready: {last}\n{run(['docker', 'logs', reader], check=False).stdout[-8000:]}") + + +def safe_name(value: str) -> str: + rendered = re.sub(r"[^a-z0-9-]", "-", value.lower()).strip("-") + expect(bool(rendered), "run key does not produce a safe Docker name") + return rendered[:48] + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as source: + for chunk in iter(lambda: source.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def execute(candidate_root: Path, aa_root: Path, work_root: Path, run_key: str, output: Path) -> dict: + expect(candidate_root.is_dir(), "candidate root is missing") + expect(aa_root.is_dir() and (aa_root / ".git").exists(), "exact AA checkout is missing") + expect(work_root.is_dir() and not any(work_root.iterdir()), "stock-AA work root must start empty") + expect(run(["git", "-C", str(aa_root), "rev-parse", "HEAD"]).stdout.strip() == AA_COMMIT, "AA commit drift") + expect(run(["git", "-C", str(aa_root), "rev-parse", "HEAD^{tree}"]).stdout.strip() == AA_TREE, "AA tree drift") + expect(not run(["git", "-C", str(aa_root), "status", "--porcelain"]).stdout.strip(), "AA checkout is dirty before generated outputs") + + content = load_json(candidate_root / "evidence/proof-cache-content-manifest-v1.json") + digest = content["combinedManifestSha256"] + fixed = f"/proof-params/generations/{digest}" + proof_catalog = load_json(ROOT / "catalog/proof-data/q8b-v1.json") + image = proof_catalog["proofServerCompatibility"]["accepted"]["images"]["experimental"] + prefix = f"phase3p-aa-{safe_name(run_key)}" + volume = f"{prefix}-proof" + network = f"{prefix}-offline" + reader = f"{prefix}-reader" + client = f"{prefix}-client" + node_client = f"{prefix}-node" + port = 6464 + created_volume = False + created_network = False + try: + run(["docker", "volume", "create", volume]) + created_volume = True + run(["docker", "network", "create", "--internal", network]) + created_network = True + run( + [ + "docker", "run", "--detach", "--name", client, "--network", network, + "--mount", f"type=bind,src={(aa_root / 'tests/generated/manager-keys').resolve()},dst=/artifacts,readonly", + PYTHON_IMAGE, "python3", "-c", "import time; time.sleep(3600)", + ], + timeout=120, + ) + bootstrap = run( + [ + "docker", "run", "--rm", + "--mount", f"type=bind,src={ROOT.resolve()},dst=/forge,readonly", + "--mount", f"type=bind,src={candidate_root.resolve()},dst=/candidate,readonly", + "--mount", f"type=volume,src={volume},dst=/proof-params", + PYTHON_IMAGE, + "python3", "/forge/scripts/proof_cache_bootstrap.py", "bootstrap", + "--manifest", "/candidate/evidence/proof-cache-content-manifest-v1.json", + "--payload-dir", "/candidate/payloads", "--parent", "/proof-params", "--readers-stopped", + ], + timeout=300, + ).stdout.strip() + expect("ACTIVATED" in bootstrap, "stock-AA named volume did not activate the exact generation") + run( + [ + "docker", "run", "--detach", "--name", reader, "--network", network, + "--env", f"PORT={port}", "--env", f"MIDNIGHT_PP={fixed}", + "--env", "MIDNIGHT_PARAM_SOURCE=https://srs.midnight.network/", + "--mount", f"type=volume,src={volume},dst=/proof-params,readonly", + f"midnightntwrk/proof-server@{image}", + ], + timeout=120, + ) + version, ready = wait_ready(client, reader, port) + expect(version == "9.0.0-rc.5", f"stock-AA reader version drift: {version}") + k = docker_exec_fetch(client, f"http://{reader}:{port}/k", body="/artifacts/zkir/execute.bzkir", timeout=240) + expect(k == "19", f"stock AA execute.bzkir selected K{k!r}, expected K19") + + node_evidence = work_root / "stock-aa-k19-node.json" + run( + [ + "docker", "run", "--name", node_client, "--network", network, + "--mount", f"type=bind,src={ROOT.resolve()},dst=/forge,readonly", + "--mount", f"type=bind,src={aa_root.resolve()},dst=/aa,readonly", + "--mount", f"type=bind,src={work_root.resolve()},dst=/evidence", + NODE_IMAGE, + "node", "/forge/scripts/stock_aa_k19_proof.mjs", + "--dependency-root", "/aa/tests", + "--artifact-root", "/aa/tests/generated/manager-keys", + "--contract-module", "/aa/tests/generated/manager-keys/contract/index.js", + "--proof-server", f"http://{reader}:{port}", + "--expected-aa-commit", AA_COMMIT, "--expected-aa-tree", AA_TREE, + "--output", "/evidence/stock-aa-k19-node.json", + ], + timeout=1800, + ) + child = load_json(node_evidence) + expect(child["schemaVersion"] == "stock-aa-k19-proof-v1", "stock-AA child evidence schema drift") + expect(child["circuit"]["k"] == 19 and child["proof"]["executed"] is True, "real stock-AA K19 proof did not execute") + expect(child["generator"]["capturedRequest"] is False, "captured-request fixture is forbidden") + inspect = json.loads(run(["docker", "inspect", reader]).stdout)[0] + mounts = [row for row in inspect["Mounts"] if row["Destination"] == "/proof-params"] + expect(len(mounts) == 1 and mounts[0]["Type"] == "volume" and mounts[0]["RW"] is False, "stock-AA reader cache mount is not a read-only named volume") + expect(json.loads(run(["docker", "network", "inspect", network]).stdout)[0]["Internal"] is True, "stock-AA network is not internal") + logs = run(["docker", "logs", reader], check=False).stdout + expect("srs.midnight.network" not in logs and "Downloading" not in logs, "stock-AA reader logged an origin attempt") + result = { + "schemaVersion": "stock-aa-k19-runtime-evidence-v1", + "aa": {"commit": AA_COMMIT, "tree": AA_TREE, "cleanBeforeGeneration": True}, + "cache": {"combinedManifestSha256": digest, "fixedPath": fixed, "mountReadOnly": True, "mountType": "volume"}, + "reader": {"variant": "experimental", "version": version, "ready": ready, "imageDigest": image, "networkInternal": True, "originRequestObserved": False}, + "kQuery": {"endpoint": "POST /k", "result": 19}, + "proof": child, + "proofEvidenceSha256": sha256_file(node_evidence), + "readerLogSha256": hashlib.sha256(logs.encode()).hexdigest(), + "k18": {"status": "not-applicable", "reason": "disabled overlay has not been restored or audited"}, + } + create_file_atomic(output, canonical_bytes(result), 0o644) + return result + finally: + for name in (node_client, reader, client): + run(["docker", "rm", "--force", name], timeout=60, check=False) + if created_network: + run(["docker", "network", "rm", network], timeout=60, check=False) + if created_volume: + run(["docker", "volume", "rm", volume], timeout=60, check=False) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--candidate-root", required=True, type=Path) + parser.add_argument("--aa-root", required=True, type=Path) + parser.add_argument("--work-root", required=True, type=Path) + parser.add_argument("--run-key", required=True) + parser.add_argument("--output", required=True, type=Path) + args = parser.parse_args() + try: + result = execute( + args.candidate_root.resolve(), args.aa_root.resolve(), args.work_root.resolve(), args.run_key, args.output.resolve() + ) + print(json.dumps({"status": "PASS", "proofResultSha256": result["proof"]["proof"]["resultSha256"], "k": 19}, separators=(",", ":"))) + return 0 + except (ForgeError, OSError, subprocess.TimeoutExpired, KeyError, ValueError, json.JSONDecodeError) as exc: + print(f"ERROR: {exc}", file=__import__("sys").stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_proof_data.py b/tests/test_proof_data.py index 495b9f1..edd87b6 100644 --- a/tests/test_proof_data.py +++ b/tests/test_proof_data.py @@ -101,6 +101,37 @@ def make_fixture(root: Path, salt: bytes = b"a") -> tuple[Path, Path, str]: class ProofDataPolicyTest(unittest.TestCase): + def test_stock_aa_k19_fixture_is_exact_non_secret_and_offline(self) -> None: + fixture = json.loads((ROOT / "catalog/proof-data/stock-aa-k19-v1.json").read_text()) + self.assertEqual(fixture["schemaVersion"], "stock-aa-k19-input-v1") + self.assertEqual(fixture["source"]["commit"], "713a20215f33e02904ea5bd699b7de7f76562e1b") + self.assertEqual(fixture["source"]["tree"], "b80be8377cf97913b9bfef0f3efe3870bdd56274") + self.assertTrue(fixture["toolchain"]["release"]["immutable"]) + self.assertEqual(fixture["toolchain"]["release"]["asset"]["sha256"], "3055ab92bbc8d5bb0d6282b661b83761d2a0de2ee37e21cf7107e25aaf2a9aad") + self.assertEqual(fixture["circuit"]["id"], "execute") + self.assertEqual(fixture["circuit"]["k"], 19) + artifacts = {row["path"]: row for row in fixture["circuit"]["artifacts"]} + self.assertEqual(artifacts["keys/execute.prover"]["size"], 1141041970) + self.assertEqual(artifacts["keys/execute.prover"]["sha256"], "382ae4325f239a3e4e9ac292cacbb1ed1eceec71112eefa2f7557f6ecbe6865a") + self.assertEqual(artifacts["zkir/execute.bzkir"]["sha256"], "ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b") + self.assertEqual(fixture["generator"]["preimageBytes"], 707) + self.assertEqual(fixture["generator"]["preimageSha256"], "1326dcdf0e667b33571ef2f622b7ed016a34ba93f203642fa3bc3aeca0d6aa26") + self.assertFalse(fixture["scope"]["capturedRequestAllowed"]) + self.assertFalse(fixture["scope"]["walletOrLiveStateAllowed"]) + self.assertEqual(fixture["scope"]["k18"], "not-applicable-disabled-overlay-not-restored-or-audited") + + generator = (ROOT / "scripts/stock_aa_k19_proof.mjs").read_text() + runtime = (ROOT / "scripts/stock_aa_k19_runtime.py").read_text() + workflow = (ROOT / ".github/workflows/proof-data-q8b.yml").read_text() + self.assertNotIn("process.env", generator) + self.assertIn('capturedRequest: false', generator) + self.assertIn('"--network", network', runtime) + self.assertIn('"--internal", network', runtime) + self.assertIn("--network none", workflow) + self.assertIn("stock-aa-k19-proof:", workflow) + self.assertIn("POST /k", json.dumps(fixture)) + self.assertIn("POST /prove", json.dumps(fixture)) + def test_generated_catalog_is_canonical_and_all_components_validate(self) -> None: outputs = generate_proof_catalog.generated_files() self.assertEqual(len(outputs), 23) From 9db053833617f8f0ec7fbbade6dcb8dbc3c8322a Mon Sep 17 00:00:00 2001 From: "Edward A." Date: Fri, 28 Aug 2026 06:34:52 -0400 Subject: [PATCH 3/7] fix: canonicalize stock AA compiler manifest --- .github/workflows/proof-data-q8b.yml | 17 ++-- catalog/proof-data/stock-aa-k19-v1.json | 53 +++++++++-- scripts/validate_stock_aa_manifest.py | 121 ++++++++++++++++++++++++ tests/test_proof_data.py | 57 +++++++++++ 4 files changed, 233 insertions(+), 15 deletions(-) create mode 100644 scripts/validate_stock_aa_manifest.py diff --git a/.github/workflows/proof-data-q8b.yml b/.github/workflows/proof-data-q8b.yml index d30ea8c..b136faa 100644 --- a/.github/workflows/proof-data-q8b.yml +++ b/.github/workflows/proof-data-q8b.yml @@ -13,6 +13,7 @@ on: - 'scripts/proof_runtime_docker.py' - 'scripts/stock_aa_k19_proof.mjs' - 'scripts/stock_aa_k19_runtime.py' + - 'scripts/validate_stock_aa_manifest.py' - 'scripts/validate_compact_direct.py' - 'tests/test_proof_data.py' push: @@ -29,6 +30,7 @@ on: - 'scripts/proof_runtime_docker.py' - 'scripts/stock_aa_k19_proof.mjs' - 'scripts/stock_aa_k19_runtime.py' + - 'scripts/validate_stock_aa_manifest.py' - 'scripts/validate_compact_direct.py' - 'tests/test_proof_data.py' workflow_dispatch: @@ -251,17 +253,13 @@ jobs: --mount "type=bind,src=$RUNNER_TEMP_ROOT/compactc-0.33.0-rc.2,dst=/tool,readonly" \ --mount "type=bind,src=$RUNNER_TEMP_ROOT/stock-aa/contracts,dst=/contracts,readonly" \ --mount "type=bind,src=$fixed_generation,dst=/proof-params,readonly" \ - --mount "type=bind,src=$RUNNER_TEMP_ROOT/stock-aa/tests/generated/manager-keys,dst=/out" \ + --mount "type=bind,src=$RUNNER_TEMP_ROOT/stock-aa/tests/generated/manager-keys,dst=/aa/contract-manager/src/managed" \ docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7 \ - /tool/compactc --feature-zkir-v3 /contracts/manager.compact /out + /tool/compactc --feature-zkir-v3 /contracts/manager.compact /aa/contract-manager/src/managed cd "$RUNNER_TEMP_ROOT/stock-aa/tests/generated/manager-keys" - printf '%s %s\n' \ - 382ae4325f239a3e4e9ac292cacbb1ed1eceec71112eefa2f7557f6ecbe6865a keys/execute.prover \ - e24ba5cf69bd494765b5daa79da9b6da55a5385e625b060467184b156035fd3b keys/execute.verifier \ - ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b zkir/execute.bzkir \ - bd8e655895e883a78525dce673ca398d45af84cc21e4c713860b39d5fd7774ec zkir/execute.zkir \ - 9ea2d64810852f853461d90a50090a1a71b4e065256c1c2068e25d1a37b2da33 compiler/contract-manifest.json \ - | sha256sum --check --strict + python3 "$GITHUB_WORKSPACE/scripts/validate_stock_aa_manifest.py" \ + --artifact-root . \ + --output "$RUNNER_TEMP_ROOT/stock-aa-compiler-manifest-validation.json" - name: Execute real rc.5 stock-AA K19 proof with origin egress blocked env: RUNNER_TEMP_ROOT: ${{ runner.temp }} @@ -284,6 +282,7 @@ jobs: path: | ${{ runner.temp }}/stock-aa-k19-runtime.json ${{ runner.temp }}/stock-aa-runtime-work/stock-aa-k19-node.json + ${{ runner.temp }}/stock-aa-compiler-manifest-validation.json if-no-files-found: error retention-days: 14 compression-level: 9 diff --git a/catalog/proof-data/stock-aa-k19-v1.json b/catalog/proof-data/stock-aa-k19-v1.json index 0b15be9..a8079ea 100644 --- a/catalog/proof-data/stock-aa-k19-v1.json +++ b/catalog/proof-data/stock-aa-k19-v1.json @@ -95,13 +95,54 @@ "path": "zkir/execute.zkir", "size": 605634, "sha256": "bd8e655895e883a78525dce673ca398d45af84cc21e4c713860b39d5fd7774ec" - }, - { - "path": "compiler/contract-manifest.json", - "size": 6753, - "sha256": "9ea2d64810852f853461d90a50090a1a71b4e065256c1c2068e25d1a37b2da33" } - ] + ], + "compilerManifest": { + "path": "compiler/contract-manifest.json", + "canonicalization": "forge-canonical-json-v1", + "canonicalSha256": "1c69c61838da1a8a864439883e3f3f708c5150e7ee2b45f8e5294c5676f38a18", + "rawTransportIdentityBearing": false, + "generationPathContract": { + "source": "/contracts/manager.compact", + "output": "/aa/contract-manager/src/managed", + "reason": "the compiler emits a relative sourceRoot into contract/index.js.map; these fixed non-secret container paths reproduce the reviewed semantics while canonical JSON removes member-order variance" + }, + "referencedFileCount": 40, + "directories": [ + "compiler", + "contract", + "zkir", + "keys" + ], + "semanticVersions": { + "manifest-version": "1", + "compiler-version": "0.33.0", + "language-version": "0.25.0", + "runtime-version": "0.18.0-rc.1" + }, + "frozenArtifacts": [ + { + "path": "keys/execute.prover", + "size": 1141041970, + "sha256": "382ae4325f239a3e4e9ac292cacbb1ed1eceec71112eefa2f7557f6ecbe6865a" + }, + { + "path": "keys/execute.verifier", + "size": 3321, + "sha256": "e24ba5cf69bd494765b5daa79da9b6da55a5385e625b060467184b156035fd3b" + }, + { + "path": "zkir/execute.bzkir", + "size": 184411, + "sha256": "ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b" + }, + { + "path": "zkir/execute.zkir", + "size": 605634, + "sha256": "bd8e655895e883a78525dce673ca398d45af84cc21e4c713860b39d5fd7774ec" + } + ] + } }, "runtime": { "proofServerVariant": "experimental", diff --git a/scripts/validate_stock_aa_manifest.py b/scripts/validate_stock_aa_manifest.py new file mode 100644 index 0000000..3fa6180 --- /dev/null +++ b/scripts/validate_stock_aa_manifest.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +"""Validate a stock-AA compiler manifest by canonical semantics and complete file closure.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import stat +import sys +from pathlib import Path + +from forge_io import ( + ForgeError, + canonical_bytes, + create_file_atomic, + expect, + load_json, + parse_sha256, + safe_basename, + sha256_file, + validate_unique_names, +) + + +ROOT = Path(__file__).resolve().parents[1] + + +def validate_contract_manifest(artifact_root: Path, contract: dict) -> dict: + expect(artifact_root.is_dir() and not artifact_root.is_symlink(), "artifact root must be a real directory") + manifest_path = artifact_root / contract["path"] + manifest_info = manifest_path.lstat() + expect(stat.S_ISREG(manifest_info.st_mode) and not manifest_path.is_symlink(), "compiler manifest must be a regular file") + manifest = load_json(manifest_path) + + versions = contract["semanticVersions"] + directories = contract["directories"] + expected_top = set(versions) | set(directories) + expect(set(manifest) == expected_top, "compiler manifest top-level field set drift") + for field, expected in versions.items(): + expect(manifest[field] == expected, f"compiler manifest {field} drift") + + listed: dict[str, dict] = {} + for directory in directories: + safe_basename(directory, "compiler manifest directory") + node = manifest[directory] + expect(isinstance(node, dict) and node.get("type") == "directory", f"compiler manifest {directory} is not a directory node") + for name, entry in node.items(): + if name == "type": + continue + safe_basename(name, "compiler manifest file") + expect(isinstance(entry, dict) and set(entry) == {"type", "size", "hash"}, f"compiler manifest entry shape drift: {directory}/{name}") + expect(entry["type"] == "file", f"compiler manifest entry is not a file: {directory}/{name}") + expect(isinstance(entry["size"], int) and not isinstance(entry["size"], bool) and entry["size"] >= 0, f"invalid compiler manifest size: {directory}/{name}") + parse_sha256(entry["hash"], f"compiler manifest hash for {directory}/{name}") + listed[f"{directory}/{name}"] = entry + + expect(len(listed) == contract["referencedFileCount"], "compiler manifest referenced file count drift") + validate_unique_names(listed) + actual: set[str] = set() + for directory in directories: + directory_path = artifact_root / directory + info = directory_path.lstat() + expect(stat.S_ISDIR(info.st_mode) and not directory_path.is_symlink(), f"compiler artifact directory is not a real directory: {directory}") + for path in directory_path.iterdir(): + relative = path.relative_to(artifact_root).as_posix() + path_info = path.lstat() + expect(stat.S_ISREG(path_info.st_mode) and not path.is_symlink(), f"unexpected non-regular compiler artifact: {relative}") + if relative != contract["path"]: + actual.add(relative) + expect(actual == set(listed), "compiler artifact file set differs from manifest") + + for relative, entry in listed.items(): + digest, size = sha256_file(artifact_root / relative) + expect(size == entry["size"], f"compiler artifact size drift: {relative}") + expect(digest == entry["hash"], f"compiler artifact hash drift: {relative}") + + frozen = {row["path"]: row for row in contract["frozenArtifacts"]} + expect(set(frozen).issubset(listed), "frozen cryptographic artifact missing from compiler manifest") + for relative, expected in frozen.items(): + entry = listed[relative] + expect(entry["size"] == expected["size"], f"frozen cryptographic artifact size drift: {relative}") + expect(entry["hash"] == expected["sha256"], f"frozen cryptographic artifact hash drift: {relative}") + + canonical = hashlib.sha256(canonical_bytes(manifest)).hexdigest() + expect(canonical == contract["canonicalSha256"], "compiler manifest canonical semantic digest drift") + raw_digest, raw_size = sha256_file(manifest_path) + return { + "schemaVersion": "stock-aa-compiler-manifest-validation-v1", + "canonicalization": contract["canonicalization"], + "canonicalSha256": canonical, + "rawTransport": {"sha256": raw_digest, "size": raw_size, "identityBearing": False}, + "semanticVersions": versions, + "referencedFileCount": len(listed), + "fileSetClosed": True, + "allListedFilesVerified": True, + "frozenArtifactCount": len(frozen), + "frozenArtifactsVerified": True, + } + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--artifact-root", required=True, type=Path) + parser.add_argument("--fixture", type=Path, default=ROOT / "catalog/proof-data/stock-aa-k19-v1.json") + parser.add_argument("--output", type=Path) + args = parser.parse_args() + try: + fixture = load_json(args.fixture.resolve()) + result = validate_contract_manifest(args.artifact_root.resolve(), fixture["circuit"]["compilerManifest"]) + if args.output: + create_file_atomic(args.output.resolve(), canonical_bytes(result), 0o644) + print(json.dumps(result, separators=(",", ":"), sort_keys=True)) + return 0 + except (ForgeError, OSError, KeyError, TypeError, ValueError, json.JSONDecodeError) as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_proof_data.py b/tests/test_proof_data.py index edd87b6..db3821c 100644 --- a/tests/test_proof_data.py +++ b/tests/test_proof_data.py @@ -25,6 +25,7 @@ import proof_cache_bootstrap # noqa: E402 import proof_data_pipeline # noqa: E402 import validate_catalog # noqa: E402 +import validate_stock_aa_manifest # noqa: E402 from forge_io import ForgeError, canonical_bytes # noqa: E402 @@ -111,6 +112,7 @@ def test_stock_aa_k19_fixture_is_exact_non_secret_and_offline(self) -> None: self.assertEqual(fixture["circuit"]["id"], "execute") self.assertEqual(fixture["circuit"]["k"], 19) artifacts = {row["path"]: row for row in fixture["circuit"]["artifacts"]} + self.assertEqual(set(artifacts), {"keys/execute.prover", "keys/execute.verifier", "zkir/execute.bzkir", "zkir/execute.zkir"}) self.assertEqual(artifacts["keys/execute.prover"]["size"], 1141041970) self.assertEqual(artifacts["keys/execute.prover"]["sha256"], "382ae4325f239a3e4e9ac292cacbb1ed1eceec71112eefa2f7557f6ecbe6865a") self.assertEqual(artifacts["zkir/execute.bzkir"]["sha256"], "ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b") @@ -119,6 +121,13 @@ def test_stock_aa_k19_fixture_is_exact_non_secret_and_offline(self) -> None: self.assertFalse(fixture["scope"]["capturedRequestAllowed"]) self.assertFalse(fixture["scope"]["walletOrLiveStateAllowed"]) self.assertEqual(fixture["scope"]["k18"], "not-applicable-disabled-overlay-not-restored-or-audited") + manifest = fixture["circuit"]["compilerManifest"] + self.assertEqual(manifest["canonicalization"], "forge-canonical-json-v1") + self.assertEqual(manifest["canonicalSha256"], "1c69c61838da1a8a864439883e3f3f708c5150e7ee2b45f8e5294c5676f38a18") + self.assertEqual(manifest["referencedFileCount"], 40) + self.assertFalse(manifest["rawTransportIdentityBearing"]) + self.assertEqual(manifest["generationPathContract"]["source"], "/contracts/manager.compact") + self.assertEqual(manifest["generationPathContract"]["output"], "/aa/contract-manager/src/managed") generator = (ROOT / "scripts/stock_aa_k19_proof.mjs").read_text() runtime = (ROOT / "scripts/stock_aa_k19_runtime.py").read_text() @@ -128,10 +137,58 @@ def test_stock_aa_k19_fixture_is_exact_non_secret_and_offline(self) -> None: self.assertIn('"--network", network', runtime) self.assertIn('"--internal", network', runtime) self.assertIn("--network none", workflow) + self.assertIn("/aa/contract-manager/src/managed", workflow) self.assertIn("stock-aa-k19-proof:", workflow) self.assertIn("POST /k", json.dumps(fixture)) self.assertIn("POST /prove", json.dumps(fixture)) + def test_stock_aa_manifest_canonical_semantics_and_file_closure(self) -> None: + with tempfile.TemporaryDirectory() as text: + root = Path(text) + rows = {} + frozen = [] + for directory in ("compiler", "contract", "zkir", "keys"): + (root / directory).mkdir() + relative = f"{directory}/fixture.bin" + data = f"public-{directory}".encode() + (root / relative).write_bytes(data) + row = {"type": "file", "size": len(data), "hash": hashlib.sha256(data).hexdigest()} + rows[directory] = row + frozen.append({"path": relative, "size": len(data), "sha256": row["hash"]}) + versions = { + "manifest-version": "1", + "compiler-version": "0.33.0", + "language-version": "0.25.0", + "runtime-version": "0.18.0-rc.1", + } + value = dict(versions) + for directory in ("keys", "zkir", "contract", "compiler"): + value[directory] = {"fixture.bin": rows[directory], "type": "directory"} + contract = { + "path": "compiler/contract-manifest.json", + "canonicalization": "forge-canonical-json-v1", + "canonicalSha256": hashlib.sha256(canonical_bytes(value)).hexdigest(), + "referencedFileCount": 4, + "directories": ["compiler", "contract", "zkir", "keys"], + "semanticVersions": versions, + "frozenArtifacts": frozen, + } + # Deliberately preserve a different transport order from canonical JSON. + (root / contract["path"]).write_text(json.dumps(value, indent=2) + "\n") + result = validate_stock_aa_manifest.validate_contract_manifest(root, contract) + self.assertTrue(result["fileSetClosed"] and result["allListedFilesVerified"]) + self.assertFalse(result["rawTransport"]["identityBearing"]) + self.assertNotEqual(result["rawTransport"]["sha256"], result["canonicalSha256"]) + + extra = root / "keys/extra" + extra.write_bytes(b"extra") + with self.assertRaisesRegex(ForgeError, "file set differs"): + validate_stock_aa_manifest.validate_contract_manifest(root, contract) + extra.unlink() + (root / "keys/fixture.bin").write_bytes(b"corrupt") + with self.assertRaisesRegex(ForgeError, "size drift|hash drift"): + validate_stock_aa_manifest.validate_contract_manifest(root, contract) + def test_generated_catalog_is_canonical_and_all_components_validate(self) -> None: outputs = generate_proof_catalog.generated_files() self.assertEqual(len(outputs), 23) From 67e8149f2b5bc5dcf12cda4075fbdca4ca05c3dd Mon Sep 17 00:00:00 2001 From: "Edward A." Date: Fri, 28 Aug 2026 06:51:57 -0400 Subject: [PATCH 4/7] fix: resolve pinned package metadata safely --- .github/workflows/proof-data-q8b.yml | 7 ++++ scripts/node_package_identity.mjs | 38 +++++++++++++++++++ scripts/stock_aa_k19_proof.mjs | 30 ++++++++++----- scripts/test_node_package_identity.mjs | 38 +++++++++++++++++++ .../no-package-json-export/index.js | 1 + .../no-package-json-export/package.json | 8 ++++ tests/test_proof_data.py | 6 +++ 7 files changed, 119 insertions(+), 9 deletions(-) create mode 100644 scripts/node_package_identity.mjs create mode 100644 scripts/test_node_package_identity.mjs create mode 100644 tests/fixtures/node-package-identity/no-package-json-export/index.js create mode 100644 tests/fixtures/node-package-identity/no-package-json-export/package.json diff --git a/.github/workflows/proof-data-q8b.yml b/.github/workflows/proof-data-q8b.yml index b136faa..0a76f73 100644 --- a/.github/workflows/proof-data-q8b.yml +++ b/.github/workflows/proof-data-q8b.yml @@ -13,7 +13,10 @@ on: - 'scripts/proof_runtime_docker.py' - 'scripts/stock_aa_k19_proof.mjs' - 'scripts/stock_aa_k19_runtime.py' + - 'scripts/node_package_identity.mjs' + - 'scripts/test_node_package_identity.mjs' - 'scripts/validate_stock_aa_manifest.py' + - 'tests/fixtures/node-package-identity/**' - 'scripts/validate_compact_direct.py' - 'tests/test_proof_data.py' push: @@ -30,7 +33,10 @@ on: - 'scripts/proof_runtime_docker.py' - 'scripts/stock_aa_k19_proof.mjs' - 'scripts/stock_aa_k19_runtime.py' + - 'scripts/node_package_identity.mjs' + - 'scripts/test_node_package_identity.mjs' - 'scripts/validate_stock_aa_manifest.py' + - 'tests/fixtures/node-package-identity/**' - 'scripts/validate_compact_direct.py' - 'tests/test_proof_data.py' workflow_dispatch: @@ -224,6 +230,7 @@ jobs: pnpm install --frozen-lockfile test "$(node --version)" = v22.23.2 test "$(pnpm --version)" = 11.24.0 + node "$GITHUB_WORKSPACE/scripts/test_node_package_identity.mjs" - name: Generate the stock K19 artifacts from the fixed combined generation offline env: RUNNER_TEMP_ROOT: ${{ runner.temp }} diff --git a/scripts/node_package_identity.mjs b/scripts/node_package_identity.mjs new file mode 100644 index 0000000..5bc3ebe --- /dev/null +++ b/scripts/node_package_identity.mjs @@ -0,0 +1,38 @@ +/** Resolve exact package metadata without requiring a forbidden `./package.json` export. */ + +import { createRequire } from "node:module"; +import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path"; +import { readFile, realpath } from "node:fs/promises"; + +function contained(base, target) { + const rel = relative(base, target); + return rel === "" || (!isAbsolute(rel) && rel !== ".." && !rel.startsWith(`..${sep}`)); +} + +export async function loadExactPackageMetadata({ dependencyRoot, packageName, exportedSpecifier, expectedVersion }) { + const root = await realpath(resolve(dependencyRoot)); + const requireFromRoot = createRequire(join(root, "package.json")); + const entry = await realpath(requireFromRoot.resolve(exportedSpecifier)); + if (!contained(root, entry)) throw new Error(`resolved package entry escapes dependency root: ${packageName}`); + + let directory = dirname(entry); + while (contained(root, directory)) { + const candidate = join(directory, "package.json"); + try { + const packageJson = JSON.parse(await readFile(candidate, "utf8")); + if (packageJson.name === packageName) { + const transport = await realpath(candidate); + if (!contained(root, transport)) throw new Error(`package metadata escapes dependency root: ${packageName}`); + if (packageJson.version !== expectedVersion) { + throw new Error(`${packageName} version drift: expected ${expectedVersion}, got ${packageJson.version}`); + } + return { packageJson, root: directory, entrypoint: entry, packageJsonPath: transport }; + } + } catch (error) { + if (!(error instanceof Error) || !Object.hasOwn(error, "code") || error.code !== "ENOENT") throw error; + } + if (directory === root) break; + directory = dirname(directory); + } + throw new Error(`cannot find bounded package metadata for exported entry: ${packageName}`); +} diff --git a/scripts/stock_aa_k19_proof.mjs b/scripts/stock_aa_k19_proof.mjs index 7c63039..734a470 100755 --- a/scripts/stock_aa_k19_proof.mjs +++ b/scripts/stock_aa_k19_proof.mjs @@ -10,12 +10,13 @@ */ import { createHash } from "node:crypto"; -import { createRequire } from "node:module"; -import { dirname, join, resolve } from "node:path"; +import { join, resolve } from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; import { createReadStream } from "node:fs"; import { readFile, stat } from "node:fs/promises"; +import { loadExactPackageMetadata } from "./node_package_identity.mjs"; + const PUBLIC_RNG_SEED = Buffer.from("midnight-binary-forge/phase3p/stock-aa-k19/v1", "utf8"); const EXPECTED_EXECUTE_BZKIR_SHA256 = "ab697f15c424d5c5d47c3dbfe114521611bcd28e3c9655d84d388b5f0f16a06b"; const EXPECTED_EXECUTE_BZKIR_SIZE = 184411; @@ -36,6 +37,16 @@ const EXPECTED_PACKAGE_VERSIONS = Object.freeze({ "@midnightntwrk/ledger-v9": "1.0.0-rc.3", "@noble/curves": "2.2.0", }); +const EXPORTED_PACKAGE_ENTRYPOINTS = Object.freeze({ + "@midnight-ntwrk/compact-runtime": "@midnight-ntwrk/compact-runtime", + "@midnight-ntwrk/midnight-js-contracts": "@midnight-ntwrk/midnight-js-contracts", + "@midnight-ntwrk/midnight-js-http-client-proof-provider": "@midnight-ntwrk/midnight-js-http-client-proof-provider", + "@midnight-ntwrk/midnight-js-network-id": "@midnight-ntwrk/midnight-js-network-id", + "@midnight-ntwrk/midnight-js-node-zk-config-provider": "@midnight-ntwrk/midnight-js-node-zk-config-provider", + "@midnight-ntwrk/midnight-js-protocol": "@midnight-ntwrk/midnight-js-protocol/compact-js", + "@midnightntwrk/ledger-v9": "@midnightntwrk/ledger-v9", + "@noble/curves": "@noble/curves/secp256k1.js", +}); function fail(message) { throw new Error(message); @@ -118,16 +129,17 @@ async function sha256File(path) { } async function loadPinnedModules(dependencyRoot) { - const requireFromDependencyRoot = createRequire(join(resolve(dependencyRoot), "package.json")); const packageInfo = new Map(); const observed = {}; for (const [packageName, expected] of Object.entries(EXPECTED_PACKAGE_VERSIONS)) { - const packageJsonPath = requireFromDependencyRoot.resolve(`${packageName}/package.json`); - const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8")); - packageInfo.set(packageName, { packageJson, root: dirname(packageJsonPath) }); - const actual = packageJson.version; - if (actual !== expected) fail(`${packageName} version drift: expected ${expected}, got ${actual}`); - observed[packageName] = actual; + const info = await loadExactPackageMetadata({ + dependencyRoot, + packageName, + exportedSpecifier: EXPORTED_PACKAGE_ENTRYPOINTS[packageName], + expectedVersion: expected, + }); + packageInfo.set(packageName, info); + observed[packageName] = info.packageJson.version; } const protocolPackage = packageInfo.get("@midnight-ntwrk/midnight-js-protocol")?.packageJson; if (protocolPackage?.dependencies?.["@midnight-ntwrk/compact-js"] !== "2.5.5-rc.7") { diff --git a/scripts/test_node_package_identity.mjs b/scripts/test_node_package_identity.mjs new file mode 100644 index 0000000..45d462f --- /dev/null +++ b/scripts/test_node_package_identity.mjs @@ -0,0 +1,38 @@ +#!/usr/bin/env node +/** Self-test the bounded resolver against a package that blocks package.json exports. */ + +import { strict as assert } from "node:assert"; +import { createRequire } from "node:module"; +import { dirname, join } from "node:path"; +import { tmpdir } from "node:os"; +import { fileURLToPath } from "node:url"; +import { cp, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; + +import { loadExactPackageMetadata } from "./node_package_identity.mjs"; + +const root = await mkdtemp(join(tmpdir(), "phase3p-node-package-identity-")); +try { + await writeFile(join(root, "package.json"), '{"name":"phase3p-fixture-root","private":true,"type":"module"}\n'); + const target = join(root, "node_modules", "@phase3p", "no-package-json-export"); + await mkdir(dirname(target), { recursive: true }); + const fixture = fileURLToPath(new URL("../tests/fixtures/node-package-identity/no-package-json-export/", import.meta.url)); + await cp(fixture, target, { recursive: true }); + + const requireFromRoot = createRequire(join(root, "package.json")); + assert.throws( + () => requireFromRoot.resolve("@phase3p/no-package-json-export/package.json"), + (error) => error?.code === "ERR_PACKAGE_PATH_NOT_EXPORTED", + ); + const result = await loadExactPackageMetadata({ + dependencyRoot: root, + packageName: "@phase3p/no-package-json-export", + exportedSpecifier: "@phase3p/no-package-json-export", + expectedVersion: "1.2.3", + }); + assert.equal(result.packageJson.name, "@phase3p/no-package-json-export"); + assert.equal(result.packageJson.version, "1.2.3"); + assert.ok(result.entrypoint.endsWith("/index.js")); + process.stdout.write("OK bounded package identity blocks package.json export\n"); +} finally { + await rm(root, { recursive: true, force: true }); +} diff --git a/tests/fixtures/node-package-identity/no-package-json-export/index.js b/tests/fixtures/node-package-identity/no-package-json-export/index.js new file mode 100644 index 0000000..47f6a6c --- /dev/null +++ b/tests/fixtures/node-package-identity/no-package-json-export/index.js @@ -0,0 +1 @@ +export const fixture = "public-non-secret"; diff --git a/tests/fixtures/node-package-identity/no-package-json-export/package.json b/tests/fixtures/node-package-identity/no-package-json-export/package.json new file mode 100644 index 0000000..d3402b4 --- /dev/null +++ b/tests/fixtures/node-package-identity/no-package-json-export/package.json @@ -0,0 +1,8 @@ +{ + "name": "@phase3p/no-package-json-export", + "version": "1.2.3", + "type": "module", + "exports": { + ".": "./index.js" + } +} diff --git a/tests/test_proof_data.py b/tests/test_proof_data.py index db3821c..982bf68 100644 --- a/tests/test_proof_data.py +++ b/tests/test_proof_data.py @@ -130,9 +130,15 @@ def test_stock_aa_k19_fixture_is_exact_non_secret_and_offline(self) -> None: self.assertEqual(manifest["generationPathContract"]["output"], "/aa/contract-manager/src/managed") generator = (ROOT / "scripts/stock_aa_k19_proof.mjs").read_text() + package_identity = (ROOT / "scripts/node_package_identity.mjs").read_text() runtime = (ROOT / "scripts/stock_aa_k19_runtime.py").read_text() workflow = (ROOT / ".github/workflows/proof-data-q8b.yml").read_text() self.assertNotIn("process.env", generator) + self.assertNotIn('resolve(`${packageName}/package.json`)', generator) + self.assertIn("loadExactPackageMetadata", generator) + self.assertIn("resolved package entry escapes dependency root", package_identity) + self.assertIn("package metadata escapes dependency root", package_identity) + self.assertIn("ERR_PACKAGE_PATH_NOT_EXPORTED", (ROOT / "scripts/test_node_package_identity.mjs").read_text()) self.assertIn('capturedRequest: false', generator) self.assertIn('"--network", network', runtime) self.assertIn('"--internal", network', runtime) From e8f272248be0e9a32ed64654ea6c9d846da1fbab Mon Sep 17 00:00:00 2001 From: "Edward A." Date: Fri, 28 Aug 2026 08:00:27 -0400 Subject: [PATCH 5/7] Remediate proof-data admission and provenance gates --- .github/workflows/proof-data-q8b.yml | 2 + .../midnight-ledger-static-9.0.0.json | 2 +- .../ledger-static-9-member-manifest.json | 2 +- .../ledger-static-9-zip-layout-manifest.json | 1 + .../proof-data/q8b-cache-admission-v1.json | 1 + catalog/proof-data/q8b-v1.json | 2 +- scripts/generate_proof_catalog.py | 211 ++++++++++++++++-- scripts/proof_cache_bootstrap.py | 139 ++++++++++-- scripts/proof_data_pipeline.py | 79 ++++--- scripts/proof_runtime_docker.py | 89 +++++++- scripts/stock_aa_k19_runtime.py | 3 + tests/test_proof_data.py | 197 +++++++++++++--- 12 files changed, 622 insertions(+), 106 deletions(-) create mode 100644 catalog/proof-data/ledger-static-9-zip-layout-manifest.json create mode 100644 catalog/proof-data/q8b-cache-admission-v1.json diff --git a/.github/workflows/proof-data-q8b.yml b/.github/workflows/proof-data-q8b.yml index 0a76f73..b88dddf 100644 --- a/.github/workflows/proof-data-q8b.yml +++ b/.github/workflows/proof-data-q8b.yml @@ -240,6 +240,8 @@ jobs: mkdir -m 700 "$cache_parent" python3 scripts/proof_cache_bootstrap.py bootstrap \ --manifest "$RUNNER_TEMP_ROOT/q8b-candidate/evidence/proof-cache-content-manifest-v1.json" \ + --admission-contract "$GITHUB_WORKSPACE/catalog/proof-data/q8b-cache-admission-v1.json" \ + --expected-combined-manifest-sha256 "$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["cacheContract"]["expectedCombinedManifestSha256"])' "$GITHUB_WORKSPACE/catalog/proof-data/q8b-v1.json")" \ --payload-dir "$RUNNER_TEMP_ROOT/q8b-candidate/payloads" \ --parent "$cache_parent" --readers-stopped combined_digest="$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["combinedManifestSha256"])' "$RUNNER_TEMP_ROOT/q8b-candidate/evidence/proof-cache-content-manifest-v1.json")" diff --git a/catalog/components/midnight-ledger-static-9.0.0.json b/catalog/components/midnight-ledger-static-9.0.0.json index 8744b95..85ce9d0 100644 --- a/catalog/components/midnight-ledger-static-9.0.0.json +++ b/catalog/components/midnight-ledger-static-9.0.0.json @@ -1 +1 @@ -{"artifactKind":"proof-data","compatibility":{"cacheNamespace":"9","exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"kind":"ledger-static","ledgerStaticRevision":"manifest-sha256:0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8","ledgerStaticSemver":"9.0.0","memberManifestSha256":"0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8"},"componentId":"midnight-ledger-static-9.0.0","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-ledger-static","install":{"mode":"0644","pathTemplate":"{MIDNIGHT_PP}/{memberPath}"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-ledger/blob/7a89f45d29792be7e09ca5eb246f1e69f0b2a179/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"zip","correctionTemplate":"midnight-ledger-static-noarch-9.0.0-manifest-sha256-{memberManifestSha256}.zip","limits":{"maxCompressedBytes":25165824,"maxExpandedBytes":22020096,"maxExpansionRatio":100,"maxMembers":16},"members":[{"mode":"0755","path":"dust","type":"directory"},{"mode":"0755","path":"dust/9","type":"directory"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"type":"file"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"type":"file"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"type":"file"},{"mode":"0755","path":"zswap","type":"directory"},{"mode":"0755","path":"zswap/9","type":"directory"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"type":"file"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"type":"file"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"type":"file"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"type":"file"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"type":"file"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"type":"file"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"type":"file"},{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"type":"file"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"type":"file"}],"outerTemplate":"midnight-ledger-static-noarch-9.0.0.zip"},"operation":"assemble-data","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"buildFlags":["--deterministic","--member-manifest","--zip-epoch=1980-01-01T00:00:00Z"],"commitSha":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","lockedDependencies":true,"repository":"midnightntwrk/midnight-ledger","toolchain":"docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7","toolchainDigest":"519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7"},"validation":{"probes":["sha256","size","archive-safety","member-contract","proof-compatibility","member-manifest"]}} \ No newline at end of file +{"artifactKind":"proof-data","compatibility":{"cacheNamespace":"9","exactConsumers":[{"cacheNamespace":"9","imageDigests":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","proofServerVersion":"9.0.0-rc.5","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179"}],"kind":"ledger-static","ledgerStaticRevision":"manifest-sha256:9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c"},"componentId":"midnight-ledger-static-9.0.0","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","family":"midnight-ledger-static","install":{"mode":"0644","pathTemplate":"{MIDNIGHT_PP}/{memberPath}"},"license":{"evidence":[{"sha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","url":"https://github.com/midnightntwrk/midnight-ledger/blob/7a89f45d29792be7e09ca5eb246f1e69f0b2a179/LICENSE"}],"perBlobLicenseAvailable":false,"redistributionStatement":"The Apache-2.0 source repository publicly distributes and hash-pins these unchanged public proof objects. The object endpoint has no per-blob license file; publishing requires an explicit owner acceptance record and makes no broader legal claim.","spdx":"Apache-2.0"},"lineageManifest":{"memberDigestsRequired":true,"required":true},"naming":{"appendOnly":true,"container":"zip","correctionTemplate":"midnight-ledger-static-noarch-9.0.0-manifest-sha256-{memberManifestSha256}.zip","limits":{"maxCompressedBytes":25165824,"maxExpandedBytes":22020096,"maxExpansionRatio":100,"maxMembers":16},"members":[{"mode":"0755","path":"dust","type":"directory"},{"mode":"0755","path":"dust/9","type":"directory"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"type":"file"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"type":"file"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"type":"file"},{"mode":"0755","path":"zswap","type":"directory"},{"mode":"0755","path":"zswap/9","type":"directory"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"type":"file"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"type":"file"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"type":"file"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"type":"file"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"type":"file"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"type":"file"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"type":"file"},{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"type":"file"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"type":"file"}],"outerTemplate":"midnight-ledger-static-noarch-9.0.0.zip"},"operation":"assemble-data","platform":"noarch","releaseMutability":"mutable-warehouse","schemaVersion":"component-v1","signing":null,"source":{"buildFlags":["--deterministic","--member-manifest","--zip-epoch=1980-01-01T00:00:00Z"],"commitSha":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","lockedDependencies":true,"repository":"midnightntwrk/midnight-ledger","toolchain":"docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7","toolchainDigest":"519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7"},"validation":{"probes":["sha256","size","archive-safety","member-contract","proof-compatibility","member-manifest"]}} \ No newline at end of file diff --git a/catalog/proof-data/ledger-static-9-member-manifest.json b/catalog/proof-data/ledger-static-9-member-manifest.json index 529213a..b8e696c 100644 --- a/catalog/proof-data/ledger-static-9-member-manifest.json +++ b/catalog/proof-data/ledger-static-9-member-manifest.json @@ -1 +1 @@ -{"members":[{"mode":"0755","path":"dust","type":"directory"},{"mode":"0755","path":"dust/9","type":"directory"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"type":"file"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"type":"file"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"type":"file"},{"mode":"0755","path":"zswap","type":"directory"},{"mode":"0755","path":"zswap/9","type":"directory"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"type":"file"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"type":"file"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"type":"file"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"type":"file"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"type":"file"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"type":"file"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"type":"file"},{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"type":"file"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"type":"file"}],"schemaVersion":"member-manifest-v1"} \ No newline at end of file +{"members":[{"bytes":2555,"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841"},{"bytes":2175671,"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2"},{"bytes":1351,"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3"},{"bytes":494,"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b"},{"bytes":5730182,"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8"},{"bytes":2311,"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08"},{"bytes":114,"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50"},{"bytes":2814823,"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0"},{"bytes":2023,"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1"},{"bytes":1294,"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205"},{"bytes":11020001,"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45"},{"bytes":2311,"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658"}],"schemaVersion":"ledger-static-member-manifest-v1"} \ No newline at end of file diff --git a/catalog/proof-data/ledger-static-9-zip-layout-manifest.json b/catalog/proof-data/ledger-static-9-zip-layout-manifest.json new file mode 100644 index 0000000..91b7acc --- /dev/null +++ b/catalog/proof-data/ledger-static-9-zip-layout-manifest.json @@ -0,0 +1 @@ +{"members":[{"mode":"0755","path":"dust","type":"directory"},{"mode":"0755","path":"dust/9","type":"directory"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"type":"file"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"type":"file"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"type":"file"},{"mode":"0755","path":"zswap","type":"directory"},{"mode":"0755","path":"zswap/9","type":"directory"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"type":"file"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"type":"file"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"type":"file"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"type":"file"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"type":"file"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"type":"file"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"type":"file"},{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"type":"file"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"type":"file"}],"schemaVersion":"deterministic-zip-layout-manifest-v1"} \ No newline at end of file diff --git a/catalog/proof-data/q8b-cache-admission-v1.json b/catalog/proof-data/q8b-cache-admission-v1.json new file mode 100644 index 0000000..7ec1916 --- /dev/null +++ b/catalog/proof-data/q8b-cache-admission-v1.json @@ -0,0 +1 @@ +{"canonicalization":"forge-canonical-json-v1","contentManifest":{"canonicalization":"forge-canonical-json-v1","combinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","fileCount":32,"files":[{"generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":0,"kind":"srs","mode":"0644","officialAlias":null,"outerPayload":"bls_midnight_2p0","outerSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","path":"bls_midnight_2p0","provenance":"ledger-provider-compatibility","rootPotSha256":null,"sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":1,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p1","outerPayload":"bls_midnight_2p1","outerSha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","path":"bls_midnight_2p1","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":10,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p10","outerPayload":"bls_midnight_2p10","outerSha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","path":"bls_midnight_2p10","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":11,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p11","outerPayload":"bls_midnight_2p11","outerSha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","path":"bls_midnight_2p11","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":12,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p12","outerPayload":"bls_midnight_2p12","outerSha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","path":"bls_midnight_2p12","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":13,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p13","outerPayload":"bls_midnight_2p13","outerSha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","path":"bls_midnight_2p13","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":14,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p14","outerPayload":"bls_midnight_2p14","outerSha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","path":"bls_midnight_2p14","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":15,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p15","outerPayload":"bls_midnight_2p15","outerSha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","path":"bls_midnight_2p15","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":16,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p16","outerPayload":"bls_midnight_2p16","outerSha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","path":"bls_midnight_2p16","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":17,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p17","outerPayload":"bls_midnight_2p17","outerSha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","path":"bls_midnight_2p17","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":18,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p18","outerPayload":"bls_midnight_2p18","outerSha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","path":"bls_midnight_2p18","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":19,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p19","outerPayload":"bls_midnight_2p19","outerSha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","path":"bls_midnight_2p19","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":2,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p2","outerPayload":"bls_midnight_2p2","outerSha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","path":"bls_midnight_2p2","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":3,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p3","outerPayload":"bls_midnight_2p3","outerSha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","path":"bls_midnight_2p3","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":4,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p4","outerPayload":"bls_midnight_2p4","outerSha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","path":"bls_midnight_2p4","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":5,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p5","outerPayload":"bls_midnight_2p5","outerSha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","path":"bls_midnight_2p5","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":6,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p6","outerPayload":"bls_midnight_2p6","outerSha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","path":"bls_midnight_2p6","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":7,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p7","outerPayload":"bls_midnight_2p7","outerSha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","path":"bls_midnight_2p7","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":8,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p8","outerPayload":"bls_midnight_2p8","outerSha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","path":"bls_midnight_2p8","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":9,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p9","outerPayload":"bls_midnight_2p9","outerSha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","path":"bls_midnight_2p9","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311}],"identityProjection":"all fields except combinedManifestSha256 and identityProjection","ledgerStatic":{"cacheNamespace":"9","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","outerSize":21601265,"zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"payloadCount":21,"schemaVersion":"proof-cache-content-manifest-v1","selection":"q8b-k0-k19-ledger-static-9","srsGenerations":[{"canonicalObjectSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":[0],"provenance":"ledger-provider-compatibility","rootPotSha256":null,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"}]},"expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","proofSetSha256":"c7d9dc6b1d790b56fad75cd0bbcd914053d86b7a892d78e0a52606cce7def84d","schemaVersion":"proof-cache-admission-v1","selection":"q8b-k0-k19-ledger-static-9"} \ No newline at end of file diff --git a/catalog/proof-data/q8b-v1.json b/catalog/proof-data/q8b-v1.json index 58c5b95..f232069 100644 --- a/catalog/proof-data/q8b-v1.json +++ b/catalog/proof-data/q8b-v1.json @@ -1 +1 @@ -{"artifactKind":"proof-data","cacheContract":{"bootstrapMount":"read-write","cacheRootResolution":["MIDNIGHT_PP","XDG_CACHE_HOME/midnight/zk-params","$HOME/.cache/midnight/zk-params"],"currentPointer":"/proof-params/current","defaultSourceUrl":"https://srs.midnight.network/","generationTemplate":"/proof-params/generations/{combinedManifestSha256}","githubAsMidnightParamSourceAllowed":false,"lock":"/proof-params/.bootstrap.lock","persistentParent":"/proof-params","readerMount":"read-only"},"compactCompatibility":{"backends":["zkir-v2","zkir-v3"],"ledgerMajor":9,"runtime":"0.19.0","version":"0.34.0","warehousePayloadAllowed":false},"counts":{"canonicalInputBytes":223087290,"ledgerMemberBytes":21753130,"ledgerPayloadCount":1,"payloadCount":21,"srsBytes":201334160,"srsPayloadCount":20},"decision":"Q8=B","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","evidencePolicy":{"legalCertaintyClaimed":false,"lineageMemberManifestRequired":true,"perBlobLicenseFileAvailable":false,"redistributionBasis":"Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload","softwareSbom":"not-applicable-proof-data"},"futureAdmission":{"appendOnly":true,"explicitGenerationRequiredWhenMultiple":true,"explicitMemberManifestRequiredWhenMultiple":true,"implicitLatestAllowed":false,"ledgerSemverBump":"midnight-ledger-static-noarch-{semver}.zip","sameKCorrection":"midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin","sameSemverCorrection":"midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip"},"ledgerStatic":{"aggregateMemberBytes":21753130,"cacheNamespace":"9","componentId":"midnight-ledger-static-9.0.0","ledgerStaticRevision":"manifest-sha256:0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8","ledgerStaticSemver":"9.0.0","memberManifestPath":"catalog/proof-data/ledger-static-9-member-manifest.json","memberManifestSha256":"0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8","members":[{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"sourceUrl":"https://srs.midnight.network/zswap/9/output.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/output.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"sourceUrl":"https://srs.midnight.network/zswap/9/output.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"sourceUrl":"https://srs.midnight.network/dust/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"sourceUrl":"https://srs.midnight.network/dust/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"sourceUrl":"https://srs.midnight.network/dust/9/spend.bzkir","transformation":"unchanged-archive-member"}],"releaseName":"midnight-ledger-static-noarch-9.0.0.zip","transformation":"deterministic-zip-assembly-from-unchanged-members"},"platform":"noarch","proofServerCompatibility":{"accepted":{"cacheNamespace":"9","images":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","version":"9.0.0-rc.5"},"rejectedStatic9":{"cacheNamespace":"10","images":{"linux/amd64":"sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613","linux/arm64":"sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb"},"mayReuseSrsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","publicMultiarchTag":false,"requiresLedgerStaticSemver":"10.0.0","sourceCommit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","version":"9.0.0-rc.7"}},"releaseMutability":"mutable-warehouse","schemaVersion":"proof-data-set-v1","scope":{"customProvingKeysIncluded":false,"directGithubAssetForbiddenK":[24,25],"futureKRequiresReview":[20,21,22,23,24,25],"observedCircuitK":[5,8,9,10,11,12,13,14,15,16,18,19],"srsK":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"startupPrefetchK":[10,11,12,13,14,15]},"setId":"q8b-k0-k19-ledger-static-9","sourcePins":{"ledgerStatic10Negative":{"cacheNamespace":"10","commit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","ledgerStaticSemver":"10.0.0","repository":"midnightntwrk/midnight-ledger","tree":"bfa37732f879bd29b4a67f7a1567260431c0f43b"},"ledgerStatic9":{"cacheNamespace":"9","commit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","ledgerStaticSemver":"9.0.0","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","providerPath":"base-crypto/src/data_provider.rs","providerSha256":"4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a","repository":"midnightntwrk/midnight-ledger","startupPath":"proof-server/src/main.rs","startupSha256":"342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64","tree":"0b39ecaa6502dcb05352786df2b02bb0a622ee38"},"trustedSetup":{"catalogPath":"MIDNIGHT_SRS_CATALOG.md","catalogSha256":"8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f","commit":"3ea610263b228af24840f7b00661ee22360db6d8","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","repository":"midnightntwrk/midnight-trusted-setup","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","tree":"19888a217d9228324dff60b685b50deea4afcac5"}},"srs":[{"artifactKind":"proof-data","componentId":"midnight-srs-k0","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","installName":"bls_midnight_2p0","k":0,"mode":"0644","officialAlias":null,"officialUrl":null,"platform":"noarch","releaseName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p0","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k1","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p1","k":1,"mode":"0644","officialAlias":"midnight-srs-2p1","officialUrl":"https://srs.midnight.network/midnight-srs-2p1","platform":"noarch","releaseName":"bls_midnight_2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p1","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k2","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p2","k":2,"mode":"0644","officialAlias":"midnight-srs-2p2","officialUrl":"https://srs.midnight.network/midnight-srs-2p2","platform":"noarch","releaseName":"bls_midnight_2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p2","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k3","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p3","k":3,"mode":"0644","officialAlias":"midnight-srs-2p3","officialUrl":"https://srs.midnight.network/midnight-srs-2p3","platform":"noarch","releaseName":"bls_midnight_2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p3","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k4","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p4","k":4,"mode":"0644","officialAlias":"midnight-srs-2p4","officialUrl":"https://srs.midnight.network/midnight-srs-2p4","platform":"noarch","releaseName":"bls_midnight_2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p4","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k5","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p5","k":5,"mode":"0644","officialAlias":"midnight-srs-2p5","officialUrl":"https://srs.midnight.network/midnight-srs-2p5","platform":"noarch","releaseName":"bls_midnight_2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p5","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k6","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p6","k":6,"mode":"0644","officialAlias":"midnight-srs-2p6","officialUrl":"https://srs.midnight.network/midnight-srs-2p6","platform":"noarch","releaseName":"bls_midnight_2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p6","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k7","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p7","k":7,"mode":"0644","officialAlias":"midnight-srs-2p7","officialUrl":"https://srs.midnight.network/midnight-srs-2p7","platform":"noarch","releaseName":"bls_midnight_2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p7","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k8","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p8","k":8,"mode":"0644","officialAlias":"midnight-srs-2p8","officialUrl":"https://srs.midnight.network/midnight-srs-2p8","platform":"noarch","releaseName":"bls_midnight_2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p8","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k9","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p9","k":9,"mode":"0644","officialAlias":"midnight-srs-2p9","officialUrl":"https://srs.midnight.network/midnight-srs-2p9","platform":"noarch","releaseName":"bls_midnight_2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p9","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k10","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p10","k":10,"mode":"0644","officialAlias":"midnight-srs-2p10","officialUrl":"https://srs.midnight.network/midnight-srs-2p10","platform":"noarch","releaseName":"bls_midnight_2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p10","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k11","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p11","k":11,"mode":"0644","officialAlias":"midnight-srs-2p11","officialUrl":"https://srs.midnight.network/midnight-srs-2p11","platform":"noarch","releaseName":"bls_midnight_2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p11","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k12","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p12","k":12,"mode":"0644","officialAlias":"midnight-srs-2p12","officialUrl":"https://srs.midnight.network/midnight-srs-2p12","platform":"noarch","releaseName":"bls_midnight_2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p12","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k13","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p13","k":13,"mode":"0644","officialAlias":"midnight-srs-2p13","officialUrl":"https://srs.midnight.network/midnight-srs-2p13","platform":"noarch","releaseName":"bls_midnight_2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p13","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k14","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p14","k":14,"mode":"0644","officialAlias":"midnight-srs-2p14","officialUrl":"https://srs.midnight.network/midnight-srs-2p14","platform":"noarch","releaseName":"bls_midnight_2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p14","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k15","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p15","k":15,"mode":"0644","officialAlias":"midnight-srs-2p15","officialUrl":"https://srs.midnight.network/midnight-srs-2p15","platform":"noarch","releaseName":"bls_midnight_2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p15","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k16","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p16","k":16,"mode":"0644","officialAlias":"midnight-srs-2p16","officialUrl":"https://srs.midnight.network/midnight-srs-2p16","platform":"noarch","releaseName":"bls_midnight_2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p16","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k17","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p17","k":17,"mode":"0644","officialAlias":"midnight-srs-2p17","officialUrl":"https://srs.midnight.network/midnight-srs-2p17","platform":"noarch","releaseName":"bls_midnight_2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p17","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k18","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p18","k":18,"mode":"0644","officialAlias":"midnight-srs-2p18","officialUrl":"https://srs.midnight.network/midnight-srs-2p18","platform":"noarch","releaseName":"bls_midnight_2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p18","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k19","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p19","k":19,"mode":"0644","officialAlias":"midnight-srs-2p19","officialUrl":"https://srs.midnight.network/midnight-srs-2p19","platform":"noarch","releaseName":"bls_midnight_2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p19","transformation":"unchanged-identity-mirror"}],"warning":"DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use."} \ No newline at end of file +{"artifactKind":"proof-data","cacheContract":{"admissionContractPath":"catalog/proof-data/q8b-cache-admission-v1.json","bootstrapMount":"read-write","cacheRootResolution":["MIDNIGHT_PP","XDG_CACHE_HOME/midnight/zk-params","$HOME/.cache/midnight/zk-params"],"currentPointer":"/proof-params/current","defaultSourceUrl":"https://srs.midnight.network/","expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","generationTemplate":"/proof-params/generations/{combinedManifestSha256}","githubAsMidnightParamSourceAllowed":false,"lock":"/proof-params/.bootstrap.lock","persistentParent":"/proof-params","readerMount":"read-only"},"compactCompatibility":{"backends":["zkir-v2","zkir-v3"],"ledgerMajor":9,"runtime":"0.19.0","version":"0.34.0","warehousePayloadAllowed":false},"counts":{"canonicalInputBytes":223087290,"ledgerMemberBytes":21753130,"ledgerPayloadCount":1,"payloadCount":21,"srsBytes":201334160,"srsPayloadCount":20},"decision":"Q8=B","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","evidencePolicy":{"legalCertaintyClaimed":false,"lineageMemberManifestRequired":true,"perBlobLicenseFileAvailable":false,"redistributionBasis":"Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload","softwareSbom":"not-applicable-proof-data"},"futureAdmission":{"appendOnly":true,"explicitGenerationRequiredWhenMultiple":true,"explicitMemberManifestRequiredWhenMultiple":true,"implicitLatestAllowed":false,"ledgerSemverBump":"midnight-ledger-static-noarch-{semver}.zip","sameKCorrection":"midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin","sameSemverCorrection":"midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip"},"ledgerStatic":{"aggregateMemberBytes":21753130,"archiveSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","archiveSize":21601265,"cacheNamespace":"9","componentId":"midnight-ledger-static-9.0.0","ledgerStaticRevision":"manifest-sha256:9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","ledgerStaticSemver":"9.0.0","memberManifestPath":"catalog/proof-data/ledger-static-9-member-manifest.json","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","members":[{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"sourceUrl":"https://srs.midnight.network/zswap/9/output.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/output.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"sourceUrl":"https://srs.midnight.network/zswap/9/output.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"sourceUrl":"https://srs.midnight.network/dust/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"sourceUrl":"https://srs.midnight.network/dust/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"sourceUrl":"https://srs.midnight.network/dust/9/spend.bzkir","transformation":"unchanged-archive-member"}],"releaseName":"midnight-ledger-static-noarch-9.0.0.zip","transformation":"deterministic-zip-assembly-from-unchanged-members","zipLayoutManifestPath":"catalog/proof-data/ledger-static-9-zip-layout-manifest.json","zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"platform":"noarch","proofServerCompatibility":{"accepted":{"cacheNamespace":"9","images":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","version":"9.0.0-rc.5"},"rejectedStatic9":{"cacheNamespace":"10","diagnosticContract":{"reason":"source-pinned-static10-paths-missing-from-static9-generation","requiredMissingPaths":["dust/10/spend.prover","zswap/10/output.prover","zswap/10/sign.prover","zswap/10/spend.prover"],"schemaVersion":"rc7-static10-diagnostic-contract-v1","sourceFiles":[{"path":"proof-server/src/main.rs","sha256":"1a0de2c7b4f68894a50195bf67794faa23205fd6687082b88cbd151d9d0e820f"},{"path":"ledger/src/dust.rs","sha256":"6b3dd3177eefafa55da2d678bb505922d5a41c4d4465e5b2fb42eb400d53d703"},{"path":"zswap/src/prove.rs","sha256":"3ccb32bb5599c097f7f3829441944735ddde2cf199f737222736755d33fc3315"},{"path":"static/version","sha256":"4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5"}]},"images":{"linux/amd64":"sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613","linux/arm64":"sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb"},"mayReuseSrsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","publicMultiarchTag":false,"requiresLedgerStaticSemver":"10.0.0","sourceCommit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","version":"9.0.0-rc.7"}},"releaseMutability":"mutable-warehouse","schemaVersion":"proof-data-set-v1","scope":{"customProvingKeysIncluded":false,"directGithubAssetForbiddenK":[24,25],"futureKRequiresReview":[20,21,22,23,24,25],"observedCircuitK":[5,8,9,10,11,12,13,14,15,16,18,19],"srsK":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"startupPrefetchK":[10,11,12,13,14,15]},"setId":"q8b-k0-k19-ledger-static-9","sourcePins":{"ledgerStatic10Negative":{"cacheNamespace":"10","commit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","ledgerStaticSemver":"10.0.0","repository":"midnightntwrk/midnight-ledger","tree":"bfa37732f879bd29b4a67f7a1567260431c0f43b"},"ledgerStatic9":{"cacheNamespace":"9","commit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","ledgerStaticSemver":"9.0.0","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","providerPath":"base-crypto/src/data_provider.rs","providerSha256":"4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a","repository":"midnightntwrk/midnight-ledger","startupPath":"proof-server/src/main.rs","startupSha256":"342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64","tree":"0b39ecaa6502dcb05352786df2b02bb0a622ee38"},"trustedSetup":{"catalogPath":"MIDNIGHT_SRS_CATALOG.md","catalogSha256":"8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f","commit":"3ea610263b228af24840f7b00661ee22360db6d8","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","repository":"midnightntwrk/midnight-trusted-setup","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","tree":"19888a217d9228324dff60b685b50deea4afcac5"}},"srs":[{"artifactKind":"proof-data","componentId":"midnight-srs-k0","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","installName":"bls_midnight_2p0","k":0,"mode":"0644","officialAlias":null,"officialUrl":null,"platform":"noarch","releaseName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p0","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k1","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p1","k":1,"mode":"0644","officialAlias":"midnight-srs-2p1","officialUrl":"https://srs.midnight.network/midnight-srs-2p1","platform":"noarch","releaseName":"bls_midnight_2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p1","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k2","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p2","k":2,"mode":"0644","officialAlias":"midnight-srs-2p2","officialUrl":"https://srs.midnight.network/midnight-srs-2p2","platform":"noarch","releaseName":"bls_midnight_2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p2","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k3","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p3","k":3,"mode":"0644","officialAlias":"midnight-srs-2p3","officialUrl":"https://srs.midnight.network/midnight-srs-2p3","platform":"noarch","releaseName":"bls_midnight_2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p3","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k4","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p4","k":4,"mode":"0644","officialAlias":"midnight-srs-2p4","officialUrl":"https://srs.midnight.network/midnight-srs-2p4","platform":"noarch","releaseName":"bls_midnight_2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p4","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k5","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p5","k":5,"mode":"0644","officialAlias":"midnight-srs-2p5","officialUrl":"https://srs.midnight.network/midnight-srs-2p5","platform":"noarch","releaseName":"bls_midnight_2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p5","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k6","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p6","k":6,"mode":"0644","officialAlias":"midnight-srs-2p6","officialUrl":"https://srs.midnight.network/midnight-srs-2p6","platform":"noarch","releaseName":"bls_midnight_2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p6","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k7","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p7","k":7,"mode":"0644","officialAlias":"midnight-srs-2p7","officialUrl":"https://srs.midnight.network/midnight-srs-2p7","platform":"noarch","releaseName":"bls_midnight_2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p7","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k8","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p8","k":8,"mode":"0644","officialAlias":"midnight-srs-2p8","officialUrl":"https://srs.midnight.network/midnight-srs-2p8","platform":"noarch","releaseName":"bls_midnight_2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p8","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k9","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p9","k":9,"mode":"0644","officialAlias":"midnight-srs-2p9","officialUrl":"https://srs.midnight.network/midnight-srs-2p9","platform":"noarch","releaseName":"bls_midnight_2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p9","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k10","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p10","k":10,"mode":"0644","officialAlias":"midnight-srs-2p10","officialUrl":"https://srs.midnight.network/midnight-srs-2p10","platform":"noarch","releaseName":"bls_midnight_2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p10","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k11","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p11","k":11,"mode":"0644","officialAlias":"midnight-srs-2p11","officialUrl":"https://srs.midnight.network/midnight-srs-2p11","platform":"noarch","releaseName":"bls_midnight_2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p11","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k12","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p12","k":12,"mode":"0644","officialAlias":"midnight-srs-2p12","officialUrl":"https://srs.midnight.network/midnight-srs-2p12","platform":"noarch","releaseName":"bls_midnight_2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p12","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k13","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p13","k":13,"mode":"0644","officialAlias":"midnight-srs-2p13","officialUrl":"https://srs.midnight.network/midnight-srs-2p13","platform":"noarch","releaseName":"bls_midnight_2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p13","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k14","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p14","k":14,"mode":"0644","officialAlias":"midnight-srs-2p14","officialUrl":"https://srs.midnight.network/midnight-srs-2p14","platform":"noarch","releaseName":"bls_midnight_2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p14","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k15","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p15","k":15,"mode":"0644","officialAlias":"midnight-srs-2p15","officialUrl":"https://srs.midnight.network/midnight-srs-2p15","platform":"noarch","releaseName":"bls_midnight_2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p15","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k16","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p16","k":16,"mode":"0644","officialAlias":"midnight-srs-2p16","officialUrl":"https://srs.midnight.network/midnight-srs-2p16","platform":"noarch","releaseName":"bls_midnight_2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p16","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k17","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p17","k":17,"mode":"0644","officialAlias":"midnight-srs-2p17","officialUrl":"https://srs.midnight.network/midnight-srs-2p17","platform":"noarch","releaseName":"bls_midnight_2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p17","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k18","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p18","k":18,"mode":"0644","officialAlias":"midnight-srs-2p18","officialUrl":"https://srs.midnight.network/midnight-srs-2p18","platform":"noarch","releaseName":"bls_midnight_2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p18","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k19","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p19","k":19,"mode":"0644","officialAlias":"midnight-srs-2p19","officialUrl":"https://srs.midnight.network/midnight-srs-2p19","platform":"noarch","releaseName":"bls_midnight_2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p19","transformation":"unchanged-identity-mirror"}],"warning":"DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use."} \ No newline at end of file diff --git a/scripts/generate_proof_catalog.py b/scripts/generate_proof_catalog.py index 35ca7f1..1756389 100755 --- a/scripts/generate_proof_catalog.py +++ b/scripts/generate_proof_catalog.py @@ -5,10 +5,11 @@ import argparse import hashlib +import os import sys from pathlib import Path -from forge_io import ForgeError, canonical_bytes, create_file_atomic, expect, load_json +from forge_io import ForgeError, canonical_bytes, create_file_atomic, expect, load_json, validate_regular_file ROOT = Path(__file__).resolve().parents[1] @@ -28,6 +29,22 @@ EXPERIMENTAL = "sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1" RC7_AMD64 = "sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613" RC7_ARM64 = "sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb" +LEDGER_ARCHIVE_SHA256 = "d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2" +LEDGER_ARCHIVE_SIZE = 21601265 +K0_GENERATION = f"midnight-ledger-provider-compat@{LEDGER9}/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823" +TRUSTED_GENERATION = f"midnight-trusted-setup@{TRUSTED_SETUP}" +RC7_DIAGNOSTIC_SOURCES = [ + {"path": "proof-server/src/main.rs", "sha256": "1a0de2c7b4f68894a50195bf67794faa23205fd6687082b88cbd151d9d0e820f"}, + {"path": "ledger/src/dust.rs", "sha256": "6b3dd3177eefafa55da2d678bb505922d5a41c4d4465e5b2fb42eb400d53d703"}, + {"path": "zswap/src/prove.rs", "sha256": "3ccb32bb5599c097f7f3829441944735ddde2cf199f737222736755d33fc3315"}, + {"path": "static/version", "sha256": "4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5"}, +] +RC7_REQUIRED_MISSING_PATHS = [ + "dust/10/spend.prover", + "zswap/10/output.prover", + "zswap/10/sign.prover", + "zswap/10/spend.prover", +] def exact_rc5_consumer() -> dict: @@ -58,7 +75,29 @@ def license_record(repository: str, commit: str) -> dict: } -def ledger_member_manifest(pins: dict) -> dict: +def ledger_semantic_member_manifest(pins: dict) -> dict: + """Match the merged warehouse's canonical file-only semantic identity.""" + return { + "schemaVersion": "ledger-static-member-manifest-v1", + "members": [ + { + "path": row["path"], + "bytes": row["size"], + "sha256": row["sha256"], + "mode": "0644", + } + for row in sorted(pins["proofData"]["ledgerStatic"]["members"], key=lambda item: item["path"]) + ], + } + + +def warehouse_semantic_sha256(value: dict) -> str: + """Hash the merged warehouse's canonical JSON encoding, including its final LF.""" + return hashlib.sha256(canonical_bytes(value) + b"\n").hexdigest() + + +def ledger_zip_layout_manifest(pins: dict) -> dict: + """Retain deterministic ZIP directory/type/order evidence separately from semantic identity.""" files = {row["path"]: row for row in pins["proofData"]["ledgerStatic"]["members"]} rows: list[dict] = [] directories = sorted({part for path in files for part in (path.split("/")[0], "/".join(path.split("/")[:2]))}) @@ -68,7 +107,7 @@ def ledger_member_manifest(pins: dict) -> dict: rows.append({"path": path, "type": "file", "mode": "0644", "size": row["size"], "sha256": row["sha256"]}) else: rows.append({"path": path, "type": "directory", "mode": "0755"}) - return {"schemaVersion": "member-manifest-v1", "members": rows} + return {"schemaVersion": "deterministic-zip-layout-manifest-v1", "members": rows} def srs_component(row: dict) -> dict: @@ -126,7 +165,7 @@ def srs_component(row: dict) -> dict: } -def ledger_component(member_manifest: dict, member_digest: str) -> dict: +def ledger_component(zip_layout_manifest: dict, member_digest: str) -> dict: return { "schemaVersion": "component-v1", "componentId": "midnight-ledger-static-9.0.0", @@ -150,7 +189,7 @@ def ledger_component(member_manifest: dict, member_digest: str) -> dict: "container": "zip", "appendOnly": True, "correctionTemplate": "midnight-ledger-static-noarch-9.0.0-manifest-sha256-{memberManifestSha256}.zip", - "members": member_manifest["members"], + "members": zip_layout_manifest["members"], "limits": { "maxCompressedBytes": 25165824, "maxExpandedBytes": 22020096, @@ -174,7 +213,7 @@ def ledger_component(member_manifest: dict, member_digest: str) -> dict: } -def proof_set(pins: dict, member_manifest: dict, member_digest: str) -> dict: +def proof_set(pins: dict, member_digest: str, zip_layout_digest: str) -> dict: srs = [] for row in pins["proofData"]["srs"]: item = dict(row) @@ -232,7 +271,21 @@ def proof_set(pins: dict, member_manifest: dict, member_digest: str) -> dict: }, "proofServerCompatibility": { "accepted": {"version": "9.0.0-rc.5", "sourceCommit": LEDGER9, "images": {"plain": PLAIN, "experimental": EXPERIMENTAL}, "ledgerStaticSemver": "9.0.0", "cacheNamespace": "9"}, - "rejectedStatic9": {"version": "9.0.0-rc.7", "sourceCommit": LEDGER10, "images": {"linux/amd64": RC7_AMD64, "linux/arm64": RC7_ARM64}, "publicMultiarchTag": False, "requiresLedgerStaticSemver": "10.0.0", "cacheNamespace": "10", "mayReuseSrsGeneration": f"midnight-trusted-setup@{TRUSTED_SETUP}"}, + "rejectedStatic9": { + "version": "9.0.0-rc.7", + "sourceCommit": LEDGER10, + "images": {"linux/amd64": RC7_AMD64, "linux/arm64": RC7_ARM64}, + "publicMultiarchTag": False, + "requiresLedgerStaticSemver": "10.0.0", + "cacheNamespace": "10", + "mayReuseSrsGeneration": TRUSTED_GENERATION, + "diagnosticContract": { + "schemaVersion": "rc7-static10-diagnostic-contract-v1", + "sourceFiles": RC7_DIAGNOSTIC_SOURCES, + "requiredMissingPaths": RC7_REQUIRED_MISSING_PATHS, + "reason": "source-pinned-static10-paths-missing-from-static9-generation", + }, + }, }, "compactCompatibility": {"version": "0.34.0", "runtime": "0.19.0", "ledgerMajor": 9, "backends": ["zkir-v2", "zkir-v3"], "warehousePayloadAllowed": False}, "cacheContract": { @@ -256,6 +309,10 @@ def proof_set(pins: dict, member_manifest: dict, member_digest: str) -> dict: "memberManifestPath": "catalog/proof-data/ledger-static-9-member-manifest.json", "memberManifestSha256": member_digest, "ledgerStaticRevision": f"manifest-sha256:{member_digest}", + "zipLayoutManifestPath": "catalog/proof-data/ledger-static-9-zip-layout-manifest.json", + "zipLayoutManifestSha256": zip_layout_digest, + "archiveSize": LEDGER_ARCHIVE_SIZE, + "archiveSha256": LEDGER_ARCHIVE_SHA256, "aggregateMemberBytes": pins["proofData"]["ledgerStatic"]["aggregateMemberBytes"], "members": ledger_members, "transformation": "deterministic-zip-assembly-from-unchanged-members", @@ -280,23 +337,151 @@ def proof_set(pins: dict, member_manifest: dict, member_digest: str) -> dict: } +def cache_content_manifest(manifest: dict, ledger_outer: dict) -> dict: + expect( + ledger_outer == { + "name": manifest["ledgerStatic"]["releaseName"], + "size": manifest["ledgerStatic"]["archiveSize"], + "sha256": manifest["ledgerStatic"]["archiveSha256"], + }, + "Ledger archive identity differs from the reviewed Q8B contract", + ) + files = [] + for row in manifest["srs"]: + is_k0 = row["k"] == 0 + files.append( + { + "path": row["installName"], + "kind": "srs", + "k": row["k"], + "mode": "0644", + "size": row["size"], + "sha256": row["sha256"], + "generation": row["generation"], + "provenance": "ledger-provider-compatibility" if is_k0 else "trusted-setup-ceremony", + "sourceRepository": "midnightntwrk/midnight-ledger" if is_k0 else "midnightntwrk/midnight-trusted-setup", + "sourceCommit": LEDGER9 if is_k0 else TRUSTED_SETUP, + "officialAlias": row["officialAlias"], + "rootPotSha256": None if is_k0 else ROOT_POT, + "outerPayload": row["releaseName"], + "outerSha256": row["sha256"], + } + ) + for row in manifest["ledgerStatic"]["members"]: + files.append( + { + "path": row["path"], + "kind": "ledger-static", + "mode": "0644", + "size": row["size"], + "sha256": row["sha256"], + "ledgerStaticSemver": manifest["ledgerStatic"]["ledgerStaticSemver"], + "cacheNamespace": manifest["ledgerStatic"]["cacheNamespace"], + "memberManifestSha256": manifest["ledgerStatic"]["memberManifestSha256"], + "outerPayload": ledger_outer["name"], + "outerSha256": ledger_outer["sha256"], + } + ) + return { + "schemaVersion": "proof-cache-content-manifest-v1", + "canonicalization": "forge-canonical-json-v1", + "selection": manifest["setId"], + "srsGenerations": [ + { + "k": [0], + "generation": K0_GENERATION, + "provenance": "ledger-provider-compatibility", + "sourceRepository": "midnightntwrk/midnight-ledger", + "sourceCommit": LEDGER9, + "rootPotSha256": None, + "canonicalObjectSha256": manifest["srs"][0]["sha256"], + }, + { + "k": list(range(1, 20)), + "generation": TRUSTED_GENERATION, + "provenance": "trusted-setup-ceremony", + "sourceRepository": "midnightntwrk/midnight-trusted-setup", + "sourceCommit": TRUSTED_SETUP, + "rootPotSha256": ROOT_POT, + }, + ], + "ledgerStatic": { + "ledgerStaticSemver": manifest["ledgerStatic"]["ledgerStaticSemver"], + "cacheNamespace": manifest["ledgerStatic"]["cacheNamespace"], + "memberManifestSha256": manifest["ledgerStatic"]["memberManifestSha256"], + "zipLayoutManifestSha256": manifest["ledgerStatic"]["zipLayoutManifestSha256"], + "outerPayload": ledger_outer["name"], + "outerSize": ledger_outer["size"], + "outerSha256": ledger_outer["sha256"], + }, + "files": sorted(files, key=lambda row: row["path"]), + "fileCount": 32, + "payloadCount": 21, + } + + +def finalize_content_manifest(content: dict) -> tuple[dict, str]: + generation = hashlib.sha256(canonical_bytes(content)).hexdigest() + result = dict(content) + result["combinedManifestSha256"] = generation + result["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" + return result, generation + + +def cache_admission_contract(proof_set_value: dict, content: dict, generation: str) -> dict: + return { + "schemaVersion": "proof-cache-admission-v1", + "canonicalization": "forge-canonical-json-v1", + "selection": proof_set_value["setId"], + "proofSetSha256": hashlib.sha256(canonical_bytes(proof_set_value)).hexdigest(), + "expectedCombinedManifestSha256": generation, + "contentManifest": content, + } + + def generated_files() -> dict[Path, bytes]: pins = load_json(PINS_PATH) expect(pins.get("schemaVersion") == "phase0-source-pins-v1", "unexpected Phase-0 pin schema") expect(pins["proofData"]["initialPayloadCount"] == 21, "Q8=B payload count drift") expect([row["k"] for row in pins["proofData"]["srs"]] == list(range(20)), "Q8=B K range drift") - manifest = ledger_member_manifest(pins) - member_digest = hashlib.sha256(canonical_bytes(manifest)).hexdigest() + semantic_manifest = ledger_semantic_member_manifest(pins) + member_digest = warehouse_semantic_sha256(semantic_manifest) + zip_layout_manifest = ledger_zip_layout_manifest(pins) + zip_layout_digest = hashlib.sha256(canonical_bytes(zip_layout_manifest)).hexdigest() + q8b = proof_set(pins, member_digest, zip_layout_digest) + ledger_outer = {"name": q8b["ledgerStatic"]["releaseName"], "size": LEDGER_ARCHIVE_SIZE, "sha256": LEDGER_ARCHIVE_SHA256} + content, generation = finalize_content_manifest(cache_content_manifest(q8b, ledger_outer)) + q8b["cacheContract"]["admissionContractPath"] = "catalog/proof-data/q8b-cache-admission-v1.json" + q8b["cacheContract"]["expectedCombinedManifestSha256"] = generation + admission = cache_admission_contract(q8b, content, generation) outputs: dict[Path, bytes] = { - OUTPUT_ROOT / "proof-data/ledger-static-9-member-manifest.json": canonical_bytes(manifest), - OUTPUT_ROOT / "proof-data/q8b-v1.json": canonical_bytes(proof_set(pins, manifest, member_digest)), + OUTPUT_ROOT / "proof-data/ledger-static-9-member-manifest.json": canonical_bytes(semantic_manifest), + OUTPUT_ROOT / "proof-data/ledger-static-9-zip-layout-manifest.json": canonical_bytes(zip_layout_manifest), + OUTPUT_ROOT / "proof-data/q8b-v1.json": canonical_bytes(q8b), + OUTPUT_ROOT / "proof-data/q8b-cache-admission-v1.json": canonical_bytes(admission), } for row in pins["proofData"]["srs"]: outputs[OUTPUT_ROOT / f"components/midnight-srs-k{row['k']}.json"] = canonical_bytes(srs_component(row)) - outputs[OUTPUT_ROOT / "components/midnight-ledger-static-9.0.0.json"] = canonical_bytes(ledger_component(manifest, member_digest)) + outputs[OUTPUT_ROOT / "components/midnight-ledger-static-9.0.0.json"] = canonical_bytes(ledger_component(zip_layout_manifest, member_digest)) return outputs +def replace_generated_file(path: Path, data: bytes) -> None: + """Atomically replace only a reviewed regular generated catalog file.""" + if not path.exists(): + create_file_atomic(path, data, 0o644) + return + validate_regular_file(path, "0644") + temporary = path.parent / f".{path.name}.generated-{os.getpid()}" + create_file_atomic(temporary, data, 0o644) + os.replace(temporary, path) + directory_fd = os.open(path.parent, os.O_RDONLY) + try: + os.fsync(directory_fd) + finally: + os.close(directory_fd) + + def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("mode", choices=("write", "check")) @@ -306,7 +491,7 @@ def main() -> int: if args.mode == "write": for path, data in outputs.items(): path.parent.mkdir(parents=True, exist_ok=True) - create_file_atomic(path, data, 0o644) + replace_generated_file(path, data) else: for path, data in outputs.items(): expect(path.is_file() and not path.is_symlink(), f"generated catalog file missing: {path.relative_to(ROOT)}") diff --git a/scripts/proof_cache_bootstrap.py b/scripts/proof_cache_bootstrap.py index 8ec6208..3883d8e 100755 --- a/scripts/proof_cache_bootstrap.py +++ b/scripts/proof_cache_bootstrap.py @@ -15,7 +15,23 @@ import zipfile from pathlib import Path, PurePosixPath -from forge_io import ForgeError, canonical_bytes, expect, load_json, normalized_mode, safe_basename, safe_member_name, sha256_file, validate_regular_file +from forge_io import ForgeError, canonical_bytes, expect, load_json, normalized_mode, parse_sha256, safe_basename, safe_member_name, sha256_file, validate_regular_file + + +LEDGER_PATHS = [ + "dust/9/spend.bzkir", + "dust/9/spend.prover", + "dust/9/spend.verifier", + "zswap/9/output.bzkir", + "zswap/9/output.prover", + "zswap/9/output.verifier", + "zswap/9/sign.bzkir", + "zswap/9/sign.prover", + "zswap/9/sign.verifier", + "zswap/9/spend.bzkir", + "zswap/9/spend.prover", + "zswap/9/spend.verifier", +] def fsync_directory(path: Path) -> None: @@ -39,7 +55,80 @@ def fsync_tree(root: Path) -> None: fsync_directory(root) -def load_content(path: Path) -> tuple[dict, str]: +def validate_admitted_content(content: dict) -> None: + files = content.get("files") + expect(isinstance(files, list) and len(files) == 32 and content.get("fileCount") == 32 and content.get("payloadCount") == 21, "cache file/payload count mismatch") + names = [row.get("path") for row in files] + expect(all(isinstance(name, str) for name in names) and names == sorted(names) and len(set(names)) == len(names), "cache files must be uniquely sorted") + for row in files: + safe_member_name(row["path"]) + expect(row["mode"] == "0644" and row["size"] > 0 and len(row["sha256"]) == 64, f"invalid file contract: {row['path']}") + expect(row["kind"] in {"srs", "ledger-static"}, f"invalid proof-data kind: {row['path']}") + + srs = sorted((row for row in files if row["kind"] == "srs"), key=lambda row: row["k"]) + expect([row["k"] for row in srs] == list(range(20)), "cache SRS scope must be K0-K19") + groups = content.get("srsGenerations") + expect(isinstance(groups, list) and len(groups) == 2, "cache must carry explicit K0 and K1-K19 SRS generations") + expect(groups[0]["k"] == [0] and groups[1]["k"] == list(range(1, 20)), "SRS generation partitions must be exactly K0 and K1-K19") + expect( + groups[0]["provenance"] == "ledger-provider-compatibility" + and groups[0]["rootPotSha256"] is None + and groups[0]["canonicalObjectSha256"] == srs[0]["sha256"], + "K0 generation/provenance mapping is invalid", + ) + expect( + groups[1]["provenance"] == "trusted-setup-ceremony" + and isinstance(groups[1]["rootPotSha256"], str) + and len(groups[1]["rootPotSha256"]) == 64, + "K1-K19 trusted generation/root-PoT mapping is invalid", + ) + for row in srs: + group = groups[0] if row["k"] == 0 else groups[1] + expect(row["path"] == f"bls_midnight_2p{row['k']}" and row["outerPayload"] == row["path"], f"SRS K/path/outer mapping mismatch: K{row['k']}") + expect(row["officialAlias"] == (None if row["k"] == 0 else f"midnight-srs-2p{row['k']}"), f"SRS official alias mismatch: K{row['k']}") + expect(row["outerSha256"] == row["sha256"], f"SRS raw/outer digest mismatch: K{row['k']}") + for field in ("generation", "provenance", "sourceRepository", "sourceCommit", "rootPotSha256"): + expect(row[field] == group[field], f"SRS {field} differs from its explicit generation mapping: K{row['k']}") + + ledger = sorted((row for row in files if row["kind"] == "ledger-static"), key=lambda row: row["path"]) + expect([row["path"] for row in ledger] == LEDGER_PATHS, "cache Ledger-static scope must be the exact twelve static-9 paths") + contract = content.get("ledgerStatic") + expect( + isinstance(contract, dict) + and contract["ledgerStaticSemver"] == "9.0.0" + and contract["cacheNamespace"] == "9" + and contract["outerPayload"] == "midnight-ledger-static-noarch-9.0.0.zip" + and contract["outerSize"] > 0 + and len(contract["outerSha256"]) == 64 + and len(contract["memberManifestSha256"]) == 64 + and len(contract["zipLayoutManifestSha256"]) == 64, + "cache Ledger-static top-level identity is invalid", + ) + semantic = { + "schemaVersion": "ledger-static-member-manifest-v1", + "members": [ + {"path": row["path"], "bytes": row["size"], "sha256": row["sha256"], "mode": row["mode"]} + for row in ledger + ], + } + semantic_digest = hashlib.sha256(canonical_bytes(semantic) + b"\n").hexdigest() + expect(semantic_digest == contract["memberManifestSha256"], "cache Ledger semantic member-manifest identity mismatch") + for row in ledger: + expect( + row["ledgerStaticSemver"] == contract["ledgerStaticSemver"] + and row["cacheNamespace"] == contract["cacheNamespace"] + and row["memberManifestSha256"] == contract["memberManifestSha256"] + and row["outerPayload"] == contract["outerPayload"] + and row["outerSha256"] == contract["outerSha256"], + f"Ledger row differs from admitted static/archive identity: {row['path']}", + ) + expect( + {row["outerPayload"] for row in files} == {*(f"bls_midnight_2p{k}" for k in range(20)), contract["outerPayload"]}, + "cache payload selection differs from the exact 21 admitted objects", + ) + + +def load_content(path: Path, admission_path: Path, expected_digest: str) -> tuple[dict, str]: content = load_json(path) expect(content.get("schemaVersion") == "proof-cache-content-manifest-v1", "unsupported cache content manifest") claimed = content.get("combinedManifestSha256") @@ -49,16 +138,26 @@ def load_content(path: Path) -> tuple[dict, str]: expect(projection.pop("identityProjection", None) == "all fields except combinedManifestSha256 and identityProjection", "unknown generation identity projection") actual = hashlib.sha256(canonical_bytes(projection)).hexdigest() expect(actual == claimed, "combined manifest SHA-256 mismatch") - files = content.get("files") - expect(isinstance(files, list) and len(files) == 32 and content.get("fileCount") == 32 and content.get("payloadCount") == 21, "cache file/payload count mismatch") - names = [row.get("path") for row in files] - expect(all(isinstance(name, str) for name in names) and names == sorted(names) and len(set(names)) == len(names), "cache files must be uniquely sorted") - for row in files: - safe_member_name(row["path"]) - expect(row["mode"] == "0644" and row["size"] > 0 and len(row["sha256"]) == 64, f"invalid file contract: {row['path']}") - expect(row["kind"] in {"srs", "ledger-static"}, f"invalid proof-data kind: {row['path']}") - expect(sorted(row["k"] for row in files if row["kind"] == "srs") == list(range(20)), "cache SRS scope must be K0-K19") - expect(len([row for row in files if row["kind"] == "ledger-static"]) == 12, "cache Ledger-static scope must be twelve members") + expected_digest = parse_sha256(expected_digest, "expected combined manifest SHA-256") + expect(claimed == expected_digest, "content manifest differs from the independently configured expected generation") + admission = load_json(admission_path) + expect(admission.get("schemaVersion") == "proof-cache-admission-v1", "unsupported proof-cache admission contract") + expect(admission.get("canonicalization") == "forge-canonical-json-v1", "unsupported proof-cache admission canonicalization") + expect(admission.get("expectedCombinedManifestSha256") == expected_digest, "admission contract differs from expected generation") + proof_set_path = admission_path.parent / "q8b-v1.json" + proof_set = load_json(proof_set_path) + expect( + proof_set.get("schemaVersion") == "proof-data-set-v1" + and proof_set.get("decision") == "Q8=B" + and proof_set.get("setId") == admission.get("selection"), + "admission sibling is not the reviewed Q8B proof-set contract", + ) + expect(hashlib.sha256(canonical_bytes(proof_set)).hexdigest() == admission.get("proofSetSha256"), "admission proof-set identity mismatch") + expect(proof_set.get("cacheContract", {}).get("expectedCombinedManifestSha256") == expected_digest, "Q8B proof-set expected generation mismatch") + admitted_content = admission.get("contentManifest") + expect(isinstance(admitted_content, dict) and canonical_bytes(admitted_content) == canonical_bytes(content), "content manifest differs from the reviewed Q8B admission contract") + expect(admission.get("selection") == content.get("selection"), "admission/content selection mismatch") + validate_admitted_content(content) return content, claimed @@ -194,8 +293,8 @@ def atomic_activate(parent: Path, digest: str, fail_before_swap: bool = False) - expect(current_target(parent) == target, "current pointer activation failed") -def bootstrap(content_path: Path, payload_dir: Path, parent: Path, readers_stopped: bool, nonblocking: bool, fail_stage: str | None) -> str: - content, digest = load_content(content_path) +def bootstrap(content_path: Path, admission_path: Path, expected_digest: str, payload_dir: Path, parent: Path, readers_stopped: bool, nonblocking: bool, fail_stage: str | None) -> str: + content, digest = load_content(content_path, admission_path, expected_digest) expect(parent.is_dir() and not parent.is_symlink(), "persistent parent must be a real existing directory") expect(readers_stopped, "bootstrap/activation requires both readers stopped") lock = acquire_lock(parent, nonblocking) @@ -267,8 +366,8 @@ def bootstrap(content_path: Path, payload_dir: Path, parent: Path, readers_stopp lock.close() -def verify_active(content_path: Path, parent: Path) -> str: - content, digest = load_content(content_path) +def verify_active(content_path: Path, admission_path: Path, expected_digest: str, parent: Path) -> str: + content, digest = load_content(content_path, admission_path, expected_digest) target = current_target(parent) expect(target == f"generations/{digest}", f"active generation mismatch: expected {digest}, got {target}") generation = parent / target @@ -303,6 +402,8 @@ def main() -> int: sub = parser.add_subparsers(dest="command", required=True) install = sub.add_parser("bootstrap") install.add_argument("--manifest", required=True, type=Path) + install.add_argument("--admission-contract", required=True, type=Path) + install.add_argument("--expected-combined-manifest-sha256", required=True) install.add_argument("--payload-dir", required=True, type=Path) install.add_argument("--parent", required=True, type=Path) install.add_argument("--readers-stopped", action="store_true") @@ -310,6 +411,8 @@ def main() -> int: install.add_argument("--inject-failure", choices=("after-verify", "pointer")) verify = sub.add_parser("verify-active") verify.add_argument("--manifest", required=True, type=Path) + verify.add_argument("--admission-contract", required=True, type=Path) + verify.add_argument("--expected-combined-manifest-sha256", required=True) verify.add_argument("--parent", required=True, type=Path) cleanup = sub.add_parser("gc") cleanup.add_argument("--parent", required=True, type=Path) @@ -319,9 +422,9 @@ def main() -> int: args = parser.parse_args() try: if args.command == "bootstrap": - bootstrap(args.manifest, args.payload_dir, args.parent, args.readers_stopped, args.nonblocking_lock, args.inject_failure) + bootstrap(args.manifest, args.admission_contract, args.expected_combined_manifest_sha256, args.payload_dir, args.parent, args.readers_stopped, args.nonblocking_lock, args.inject_failure) elif args.command == "verify-active": - path = verify_active(args.manifest, args.parent) + path = verify_active(args.manifest, args.admission_contract, args.expected_combined_manifest_sha256, args.parent) print(f"OK active={path}") else: removed = gc(args.parent, set(args.referenced), args.readers_stopped, args.nonblocking_lock) diff --git a/scripts/proof_data_pipeline.py b/scripts/proof_data_pipeline.py index ba40012..1a7ca64 100755 --- a/scripts/proof_data_pipeline.py +++ b/scripts/proof_data_pipeline.py @@ -28,6 +28,7 @@ validate_regular_file, validate_unique_names, ) +import generate_proof_catalog ROOT = Path(__file__).resolve().parents[1] @@ -103,6 +104,11 @@ def validate_manifest(manifest: dict) -> None: ledger = manifest.get("ledgerStatic") expect(ledger["releaseName"] == "midnight-ledger-static-noarch-9.0.0.zip", "Ledger-static payload-name drift") expect(ledger["ledgerStaticSemver"] == "9.0.0" and ledger["cacheNamespace"] == "9", "Ledger-static version/namespace drift") + expect( + ledger["archiveSize"] == generate_proof_catalog.LEDGER_ARCHIVE_SIZE + and ledger["archiveSha256"] == generate_proof_catalog.LEDGER_ARCHIVE_SHA256, + "Ledger-static archive identity drift", + ) members = ledger.get("members") expect(isinstance(members, list) and len(members) == 12, "Ledger-static must have exactly twelve data members") paths = [row["path"] for row in members] @@ -115,15 +121,37 @@ def validate_manifest(manifest: dict) -> None: expect(positive["version"] == "9.0.0-rc.5" and positive["ledgerStaticSemver"] == "9.0.0" and positive["cacheNamespace"] == "9", "rc.5 positive compatibility drift") expect(negative["version"] == "9.0.0-rc.7" and negative["requiresLedgerStaticSemver"] == "10.0.0" and negative["cacheNamespace"] == "10" and negative["publicMultiarchTag"] is False, "rc.7 negative compatibility drift") expect(set(negative["images"]) == {"linux/amd64", "linux/arm64"}, "rc.7 must use architecture-specific image digests") + diagnostic = negative["diagnosticContract"] + expect( + diagnostic["schemaVersion"] == "rc7-static10-diagnostic-contract-v1" + and diagnostic["requiredMissingPaths"] == generate_proof_catalog.RC7_REQUIRED_MISSING_PATHS + and diagnostic["sourceFiles"] == generate_proof_catalog.RC7_DIAGNOSTIC_SOURCES, + "rc.7 source-derived diagnostic contract drift", + ) expect(manifest["cacheContract"]["defaultSourceUrl"] == "https://srs.midnight.network/" and manifest["cacheContract"]["githubAsMidnightParamSourceAllowed"] is False, "official fallback/source contract drift") + expect(manifest["cacheContract"]["admissionContractPath"] == "catalog/proof-data/q8b-cache-admission-v1.json", "Q8B bootstrap admission contract drift") expect(manifest["scope"]["customProvingKeysIncluded"] is False, "custom proving keys are forbidden") -def build_member_manifest(manifest: dict) -> dict: - reviewed = load_json(ROOT / manifest["ledgerStatic"]["memberManifestPath"]) - digest = hashlib.sha256(canonical_bytes(reviewed)).hexdigest() - expect(digest == manifest["ledgerStatic"]["memberManifestSha256"], "reviewed member-manifest digest drift") - return reviewed +def build_member_manifests(manifest: dict) -> tuple[dict, dict]: + semantic = load_json(ROOT / manifest["ledgerStatic"]["memberManifestPath"]) + semantic_digest = generate_proof_catalog.warehouse_semantic_sha256(semantic) + expect(semantic_digest == manifest["ledgerStatic"]["memberManifestSha256"], "reviewed semantic member-manifest digest drift") + expect( + semantic == { + "schemaVersion": "ledger-static-member-manifest-v1", + "members": [ + {"path": row["path"], "bytes": row["size"], "sha256": row["sha256"], "mode": row["mode"]} + for row in sorted(manifest["ledgerStatic"]["members"], key=lambda item: item["path"]) + ], + }, + "semantic member manifest differs from the warehouse canonical projection", + ) + layout = load_json(ROOT / manifest["ledgerStatic"]["zipLayoutManifestPath"]) + layout_digest = hashlib.sha256(canonical_bytes(layout)).hexdigest() + expect(layout_digest == manifest["ledgerStatic"]["zipLayoutManifestSha256"], "reviewed ZIP layout-manifest digest drift") + expect(layout.get("schemaVersion") == "deterministic-zip-layout-manifest-v1", "unsupported ZIP layout manifest") + return semantic, layout def deterministic_zip(source_root: Path, member_manifest: dict, output: Path) -> tuple[str, int]: @@ -194,23 +222,7 @@ def verify_zip(archive_path: Path, member_manifest: dict) -> None: def cache_content_manifest(manifest: dict, ledger_outer: dict) -> dict: - files = [] - for row in manifest["srs"]: - files.append({"path": row["installName"], "kind": "srs", "k": row["k"], "mode": "0644", "size": row["size"], "sha256": row["sha256"], "generation": row["generation"], "outerPayload": row["releaseName"], "outerSha256": row["sha256"]}) - for row in manifest["ledgerStatic"]["members"]: - files.append({"path": row["path"], "kind": "ledger-static", "mode": "0644", "size": row["size"], "sha256": row["sha256"], "ledgerStaticSemver": "9.0.0", "cacheNamespace": "9", "outerPayload": manifest["ledgerStatic"]["releaseName"], "outerSha256": ledger_outer["sha256"]}) - return { - "schemaVersion": "proof-cache-content-manifest-v1", - "canonicalization": "forge-canonical-json-v1", - "selection": manifest["setId"], - "srsGeneration": manifest["proofServerCompatibility"]["accepted"]["sourceCommit"], - "ledgerStaticSemver": "9.0.0", - "cacheNamespace": "9", - "ledgerMemberManifestSha256": manifest["ledgerStatic"]["memberManifestSha256"], - "files": sorted(files, key=lambda row: row["path"]), - "fileCount": 32, - "payloadCount": 21, - } + return generate_proof_catalog.cache_content_manifest(manifest, ledger_outer) def acquire(manifest_path: Path, output_root: Path, work_root: Path) -> dict: @@ -255,18 +267,19 @@ def acquire(manifest_path: Path, output_root: Path, work_root: Path) -> dict: os.link(first, destination) os.chmod(destination, 0o644) fetch_rows.append({"path": row["path"], "firstUrl": row["sourceUrl"], "secondUrl": row["sourceUrl"], "size": row["size"], "sha256": row["sha256"], "aliasComparison": False}) - member_manifest = build_member_manifest(manifest) + _, zip_layout_manifest = build_member_manifests(manifest) archive_name = manifest["ledgerStatic"]["releaseName"] archive_path = payload_dir / archive_name - archive_sha256, archive_size = deterministic_zip(ledger_root, member_manifest, archive_path) - verify_zip(archive_path, member_manifest) + archive_sha256, archive_size = deterministic_zip(ledger_root, zip_layout_manifest, archive_path) + verify_zip(archive_path, zip_layout_manifest) ledger_outer = {"name": archive_name, "size": archive_size, "sha256": archive_sha256} + expect( + ledger_outer == {"name": archive_name, "size": manifest["ledgerStatic"]["archiveSize"], "sha256": manifest["ledgerStatic"]["archiveSha256"]}, + "deterministic Ledger archive differs from the reviewed outer identity", + ) content = cache_content_manifest(manifest, ledger_outer) - content_bytes = canonical_bytes(content) - generation = hashlib.sha256(content_bytes).hexdigest() - content["combinedManifestSha256"] = generation - # The generation excludes its own self-reference. Bootstrap recomputes it from this exact projection. - content["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" + content, generation = generate_proof_catalog.finalize_content_manifest(content) + expect(generation == manifest["cacheContract"]["expectedCombinedManifestSha256"], "combined generation differs from the reviewed Q8B admission identity") create_file_atomic(evidence_dir / "proof-cache-content-manifest-v1.json", canonical_bytes(content), 0o644) payload_rows = [] for path in sorted(payload_dir.iterdir(), key=lambda value: value.name): @@ -318,15 +331,17 @@ def verify_output(manifest_path: Path, output_root: Path) -> dict: validate_regular_file(path, "0644") digest, size = sha256_file(path) expect(size == row["size"] and digest == row["sha256"], f"SRS output mismatch: {path.name}") - member_manifest = build_member_manifest(manifest) + _, zip_layout_manifest = build_member_manifests(manifest) archive_path = payload_dir / manifest["ledgerStatic"]["releaseName"] - verify_zip(archive_path, member_manifest) + verify_zip(archive_path, zip_layout_manifest) archive_sha, archive_size = sha256_file(archive_path) + expect(archive_sha == manifest["ledgerStatic"]["archiveSha256"] and archive_size == manifest["ledgerStatic"]["archiveSize"], "Ledger archive outer identity mismatch") content = load_json(evidence_dir / "proof-cache-content-manifest-v1.json") claimed = content.pop("combinedManifestSha256") content.pop("identityProjection") actual = hashlib.sha256(canonical_bytes(content)).hexdigest() expect(actual == claimed, "combined content-manifest identity mismatch") + expect(claimed == manifest["cacheContract"]["expectedCombinedManifestSha256"], "combined content-manifest differs from reviewed admission identity") expect(all(row["outerSha256"] == archive_sha for row in content["files"] if row["kind"] == "ledger-static"), "Ledger outer digest binding mismatch") lineage = load_json(evidence_dir / "proof-data-lineage-v1.json") expect(lineage["combinedManifestSha256"] == claimed and lineage["payloadCount"] == 21 and len(lineage["payloads"]) == 21, "lineage count/generation mismatch") diff --git a/scripts/proof_runtime_docker.py b/scripts/proof_runtime_docker.py index db9cc11..1ee536d 100755 --- a/scripts/proof_runtime_docker.py +++ b/scripts/proof_runtime_docker.py @@ -79,6 +79,51 @@ def inspect_reader(name: str, fixed_midnight_pp: str) -> dict: return {"name": name, "midnightPp": env["MIDNIGHT_PP"], "mountReadOnly": not mounts[0]["RW"], "mountType": mounts[0]["Type"]} +def container_logs(name: str) -> tuple[str, str, str]: + result = run(["docker", "logs", name], check=False) + combined = result.stdout + "\n---stderr---\n" + result.stderr + return result.stdout, result.stderr, combined + + +def inspect_image_identity(image_digest: str, expected_arch: str) -> dict: + reference = f"midnightntwrk/proof-server@{image_digest}" + item = json.loads(run(["docker", "image", "inspect", reference]).stdout)[0] + expect(item["Os"] == "linux" and item["Architecture"] == expected_arch, "rc.7 image OS/architecture differs from the native lane") + expect(reference in item.get("RepoDigests", []), "rc.7 local image identity is not bound to the reviewed repository digest") + return { + "repositoryDigest": reference, + "imageId": item["Id"], + "os": item["Os"], + "architecture": item["Architecture"], + } + + +def static10_rejection_diagnostic(logs: str, state: str, negative: dict, image_identity: dict, observed_version: str) -> dict: + contract = negative["diagnosticContract"] + required = contract["requiredMissingPaths"] + observed = [path for path in required if path in logs] + expect(observed == required, "rc.7 rejection lacks every exact source-derived static-10 path diagnostic") + parts = state.split() + expect(len(parts) == 2 and parts[0] in {"exited", "dead"} and parts[1].isdigit() and int(parts[1]) != 0, "rc.7 negative must terminate non-zero after the static-10 diagnostic") + expect(observed_version == negative["version"], "rc.7 image version differs from the source-pinned negative contract") + evidence = { + "schemaVersion": "rc7-static10-rejection-diagnostic-v1", + "reason": contract["reason"], + "sourceCommit": negative["sourceCommit"], + "sourceFiles": contract["sourceFiles"], + "proofServerVersion": observed_version, + "requiresLedgerStaticSemver": negative["requiresLedgerStaticSemver"], + "cacheNamespace": negative["cacheNamespace"], + "requiredMissingPaths": required, + "observedMissingPaths": observed, + "containerState": state, + "image": image_identity, + "logSha256": hashlib.sha256(logs.encode()).hexdigest(), + } + evidence["canonicalSha256"] = hashlib.sha256(canonical_bytes(evidence)).hexdigest() + return evidence + + def start_reader(name: str, network: str, volume: str, image_digest: str, fixed_midnight_pp: str, port: int) -> None: run( [ @@ -98,6 +143,7 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, expect(os_name == "linux" and arch in {"amd64", "arm64"}, "proof-server runtime gate requires native Linux amd64/arm64") expect(candidate_root.is_dir() and work_root.is_dir() and not any(work_root.iterdir()), "candidate/work directory contract failed") manifest_path = candidate_root / "evidence/proof-cache-content-manifest-v1.json" + admission_path = ROOT / "catalog/proof-data/q8b-cache-admission-v1.json" payload_dir = candidate_root / "payloads" content = load_json(manifest_path) digest = content["combinedManifestSha256"] @@ -106,10 +152,12 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, positive = proof_set["proofServerCompatibility"]["accepted"] negative = proof_set["proofServerCompatibility"]["rejectedStatic9"] expected_rc7 = negative["images"][f"linux/{arch}"] + expect(digest == proof_set["cacheContract"]["expectedCombinedManifestSha256"], "candidate generation differs from the reviewed Q8B contract") volume = f"q8b-proof-{run_key}-{arch}".lower().replace("_", "-") network = f"q8b-proof-{run_key}-{arch}-offline".lower().replace("_", "-") readers = [f"{volume}-plain", f"{volume}-experimental"] negative_name = f"{volume}-rc7-negative" + negative_probe_name = f"{volume}-rc7-version-probe" client_name = f"{volume}-client" created_volume = False created_network = False @@ -129,6 +177,8 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, PYTHON_IMAGE, "python3", "/repo/scripts/proof_cache_bootstrap.py", "bootstrap", "--manifest", "/candidate/evidence/proof-cache-content-manifest-v1.json", + "--admission-contract", "/repo/catalog/proof-data/q8b-cache-admission-v1.json", + "--expected-combined-manifest-sha256", digest, "--payload-dir", "/candidate/payloads", "--parent", "/proof-params", "--readers-stopped", @@ -175,15 +225,31 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, alternate["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" alternate_path = work_root / "alternate-content.json" create_file_atomic(alternate_path, canonical_bytes(alternate), 0o644) + alternate_admission = load_json(admission_path) + alternate_admission["selection"] = alternate["selection"] + alternate_admission["expectedCombinedManifestSha256"] = alternate_digest + alternate_admission["contentManifest"] = alternate + alternate_proof_set = dict(proof_set) + alternate_proof_set["setId"] = alternate["selection"] + alternate_proof_set["cacheContract"] = dict(alternate_proof_set["cacheContract"]) + alternate_proof_set["cacheContract"]["expectedCombinedManifestSha256"] = alternate_digest + alternate_admission["proofSetSha256"] = hashlib.sha256(canonical_bytes(alternate_proof_set)).hexdigest() + create_file_atomic(work_root / "q8b-v1.json", canonical_bytes(alternate_proof_set), 0o644) + alternate_admission_path = work_root / "alternate-admission.json" + create_file_atomic(alternate_admission_path, canonical_bytes(alternate_admission), 0o644) alternate_command = [ "docker", "run", "--rm", "--mount", f"type=bind,src={repo},dst=/repo,readonly", "--mount", f"type=bind,src={candidate},dst=/candidate,readonly", "--mount", f"type=bind,src={alternate_path.resolve()},dst=/alternate.json,readonly", + "--mount", f"type=bind,src={alternate_admission_path.resolve()},dst=/alternate-admission.json,readonly", + "--mount", f"type=bind,src={(work_root / 'q8b-v1.json').resolve()},dst=/q8b-v1.json,readonly", "--mount", f"type=volume,src={volume},dst=/proof-params", PYTHON_IMAGE, "python3", "/repo/scripts/proof_cache_bootstrap.py", "bootstrap", - "--manifest", "/alternate.json", "--payload-dir", "/candidate/payloads", "--parent", "/proof-params", "--readers-stopped", + "--manifest", "/alternate.json", "--admission-contract", "/alternate-admission.json", + "--expected-combined-manifest-sha256", alternate_digest, + "--payload-dir", "/candidate/payloads", "--parent", "/proof-params", "--readers-stopped", "--inject-failure", "pointer", ] failed_pointer = run(alternate_command, timeout=300, check=False) @@ -244,6 +310,19 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, run(["docker", "rm", "--force", name], timeout=30) # The exact architecture-specific rc.7/static-10 consumer must not become ready on static-9. + probe_port = free_port() + run( + [ + "docker", "run", "--detach", "--name", negative_probe_name, "--network", network, + "--env", f"PORT={probe_port}", "--env", "MIDNIGHT_PROOF_SERVER_NO_FETCH_PARAMS=true", + f"midnightntwrk/proof-server@{expected_rc7}", + ], + timeout=120, + ) + negative_version, _ = wait_ready(client_name, negative_probe_name, probe_port) + expect(negative_version == negative["version"], "rc.7 no-fetch version probe drift") + image_identity = inspect_image_identity(expected_rc7, arch) + run(["docker", "rm", "--force", negative_probe_name], timeout=30) negative_port = free_port() start_reader(negative_name, network, volume, expected_rc7, fixed, negative_port) became_ready = False @@ -260,10 +339,10 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, if state.startswith("exited") or state.startswith("dead"): break time.sleep(1) - logs = run(["docker", "logs", negative_name], check=False).stdout + _, _, logs = container_logs(negative_name) expect(not became_ready, "rc.7/static-10 incorrectly accepted static-9") run(["docker", "rm", "--force", negative_name], timeout=30, check=False) - expect(any(token in logs for token in ("/10/", "zswap/10", "dust/10", "failed", "error", "Error", "connect", "resolve")) or state.startswith("exited"), "rc.7 negative did not expose a static-10/missing-origin rejection") + diagnostic = static10_rejection_diagnostic(logs, state, negative, image_identity, negative_version) result = { "schemaVersion": "proof-runtime-docker-result-v1", @@ -272,13 +351,13 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, "volume": {"type": "named", "bootstrapMount": "read-write", "readerMount": "read-only", "combinedManifestSha256": digest, "fixedMidnightPp": fixed, "firstBootstrap": first_bootstrap, "secondBootstrap": second_bootstrap, "lockContention": "rejected", "sameDigestCorruption": "quarantined-and-repaired", "failedPointerSwapRetainedPrior": True, "stalePointerReactivated": True, "gcProtectedCurrentAndReferenced": True}, "network": {"internal": True, "officialOriginReachable": False}, "rc5": {"sourceCommit": positive["sourceCommit"], "readers": reader_evidence, "coldStart": "pass", "restart": "pass", "coveredOriginRequests": 0}, - "rc7Negative": {"sourceCommit": negative["sourceCommit"], "imageDigest": expected_rc7, "publicMultiarchTag": False, "requiresLedgerStaticSemver": "10.0.0", "static9Accepted": False, "srsGenerationReusable": negative["mayReuseSrsGeneration"], "containerState": state, "logSha256": __import__("hashlib").sha256(logs.encode()).hexdigest()}, + "rc7Negative": {"sourceCommit": negative["sourceCommit"], "imageDigest": expected_rc7, "publicMultiarchTag": False, "requiresLedgerStaticSemver": "10.0.0", "static9Accepted": False, "srsGenerationReusable": negative["mayReuseSrsGeneration"], "containerState": state, "diagnostic": diagnostic}, "compactCacheDirectory": str(cache_copy / "generation"), } create_file_atomic(output, canonical_bytes(result), 0o644) return result finally: - for name in [*readers, negative_name, f"{volume}-lock-holder", client_name]: + for name in [*readers, negative_name, negative_probe_name, f"{volume}-lock-holder", client_name]: run(["docker", "rm", "--force", name], timeout=30, check=False) if created_network: run(["docker", "network", "rm", network], timeout=30, check=False) diff --git a/scripts/stock_aa_k19_runtime.py b/scripts/stock_aa_k19_runtime.py index 87d2d65..28213e8 100755 --- a/scripts/stock_aa_k19_runtime.py +++ b/scripts/stock_aa_k19_runtime.py @@ -94,6 +94,7 @@ def execute(candidate_root: Path, aa_root: Path, work_root: Path, run_key: str, digest = content["combinedManifestSha256"] fixed = f"/proof-params/generations/{digest}" proof_catalog = load_json(ROOT / "catalog/proof-data/q8b-v1.json") + expect(digest == proof_catalog["cacheContract"]["expectedCombinedManifestSha256"], "stock-AA candidate generation differs from reviewed Q8B admission") image = proof_catalog["proofServerCompatibility"]["accepted"]["images"]["experimental"] prefix = f"phase3p-aa-{safe_name(run_key)}" volume = f"{prefix}-proof" @@ -126,6 +127,8 @@ def execute(candidate_root: Path, aa_root: Path, work_root: Path, run_key: str, PYTHON_IMAGE, "python3", "/forge/scripts/proof_cache_bootstrap.py", "bootstrap", "--manifest", "/candidate/evidence/proof-cache-content-manifest-v1.json", + "--admission-contract", "/forge/catalog/proof-data/q8b-cache-admission-v1.json", + "--expected-combined-manifest-sha256", digest, "--payload-dir", "/candidate/payloads", "--parent", "/proof-params", "--readers-stopped", ], timeout=300, diff --git a/tests/test_proof_data.py b/tests/test_proof_data.py index 982bf68..24eb402 100644 --- a/tests/test_proof_data.py +++ b/tests/test_proof_data.py @@ -24,6 +24,7 @@ import generate_proof_catalog # noqa: E402 import proof_cache_bootstrap # noqa: E402 import proof_data_pipeline # noqa: E402 +import proof_runtime_docker # noqa: E402 import validate_catalog # noqa: E402 import validate_stock_aa_manifest # noqa: E402 from forge_io import ForgeError, canonical_bytes # noqa: E402 @@ -49,7 +50,7 @@ def write_json(path: Path, value: dict) -> None: path.write_bytes(canonical_bytes(value)) -def make_fixture(root: Path, salt: bytes = b"a") -> tuple[Path, Path, str]: +def make_fixture(root: Path, salt: bytes = b"a") -> tuple[Path, Path, Path, str]: payloads = root / "payloads" parent = root / "proof-params" payloads.mkdir(parents=True) @@ -62,7 +63,17 @@ def make_fixture(root: Path, salt: bytes = b"a") -> tuple[Path, Path, str]: path.write_bytes(data) path.chmod(0o644) digest = hashlib.sha256(data).hexdigest() - rows.append({"path": name, "kind": "srs", "k": k, "mode": "0644", "size": len(data), "sha256": digest, "generation": "fixture", "outerPayload": name, "outerSha256": digest}) + is_k0 = k == 0 + rows.append({ + "path": name, "kind": "srs", "k": k, "mode": "0644", "size": len(data), "sha256": digest, + "generation": "fixture-provider" if is_k0 else "fixture-trusted", + "provenance": "ledger-provider-compatibility" if is_k0 else "trusted-setup-ceremony", + "sourceRepository": "fixture/provider" if is_k0 else "fixture/trusted", + "sourceCommit": "0" * 40 if is_k0 else "1" * 40, + "officialAlias": None if is_k0 else f"midnight-srs-2p{k}", + "rootPotSha256": None if is_k0 else "2" * 64, + "outerPayload": name, "outerSha256": digest, + }) archive = payloads / "midnight-ledger-static-noarch-9.0.0.zip" ledger_data = {name: salt + b"-ledger-" + name.encode() for name in LEDGER_PATHS} with zipfile.ZipFile(archive, "w", compression=zipfile.ZIP_DEFLATED) as output: @@ -80,15 +91,21 @@ def make_fixture(root: Path, salt: bytes = b"a") -> tuple[Path, Path, str]: archive_digest = hashlib.sha256(archive.read_bytes()).hexdigest() for name in LEDGER_PATHS: data = ledger_data[name] - rows.append({"path": name, "kind": "ledger-static", "mode": "0644", "size": len(data), "sha256": hashlib.sha256(data).hexdigest(), "ledgerStaticSemver": "9.0.0", "cacheNamespace": "9", "outerPayload": archive.name, "outerSha256": archive_digest}) + rows.append({"path": name, "kind": "ledger-static", "mode": "0644", "size": len(data), "sha256": hashlib.sha256(data).hexdigest(), "ledgerStaticSemver": "9.0.0", "cacheNamespace": "9", "memberManifestSha256": "pending", "outerPayload": archive.name, "outerSha256": archive_digest}) + ledger_rows = sorted((row for row in rows if row["kind"] == "ledger-static"), key=lambda row: row["path"]) + semantic = {"schemaVersion": "ledger-static-member-manifest-v1", "members": [{"path": row["path"], "bytes": row["size"], "sha256": row["sha256"], "mode": row["mode"]} for row in ledger_rows]} + member_digest = hashlib.sha256(canonical_bytes(semantic) + b"\n").hexdigest() + for row in ledger_rows: + row["memberManifestSha256"] = member_digest content = { "schemaVersion": "proof-cache-content-manifest-v1", "canonicalization": "forge-canonical-json-v1", "selection": "fixture", - "srsGeneration": "fixture", - "ledgerStaticSemver": "9.0.0", - "cacheNamespace": "9", - "ledgerMemberManifestSha256": "1" * 64, + "srsGenerations": [ + {"k": [0], "generation": "fixture-provider", "provenance": "ledger-provider-compatibility", "sourceRepository": "fixture/provider", "sourceCommit": "0" * 40, "rootPotSha256": None, "canonicalObjectSha256": rows[0]["sha256"]}, + {"k": list(range(1, 20)), "generation": "fixture-trusted", "provenance": "trusted-setup-ceremony", "sourceRepository": "fixture/trusted", "sourceCommit": "1" * 40, "rootPotSha256": "2" * 64}, + ], + "ledgerStatic": {"ledgerStaticSemver": "9.0.0", "cacheNamespace": "9", "memberManifestSha256": member_digest, "zipLayoutManifestSha256": "3" * 64, "outerPayload": archive.name, "outerSize": archive.stat().st_size, "outerSha256": archive_digest}, "files": sorted(rows, key=lambda row: row["path"]), "fileCount": 32, "payloadCount": 21, @@ -98,7 +115,11 @@ def make_fixture(root: Path, salt: bytes = b"a") -> tuple[Path, Path, str]: content["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" manifest = root / "content.json" write_json(manifest, content) - return manifest, payloads, digest + proof_set = {"schemaVersion": "proof-data-set-v1", "decision": "Q8=B", "setId": "fixture", "cacheContract": {"expectedCombinedManifestSha256": digest}} + write_json(root / "q8b-v1.json", proof_set) + admission = root / "admission.json" + write_json(admission, {"schemaVersion": "proof-cache-admission-v1", "canonicalization": "forge-canonical-json-v1", "selection": "fixture", "proofSetSha256": hashlib.sha256(canonical_bytes(proof_set)).hexdigest(), "expectedCombinedManifestSha256": digest, "contentManifest": content}) + return manifest, admission, payloads, digest class ProofDataPolicyTest(unittest.TestCase): @@ -197,14 +218,24 @@ def test_stock_aa_manifest_canonical_semantics_and_file_closure(self) -> None: def test_generated_catalog_is_canonical_and_all_components_validate(self) -> None: outputs = generate_proof_catalog.generated_files() - self.assertEqual(len(outputs), 23) + self.assertEqual(len(outputs), 25) for path, expected in outputs.items(): self.assertEqual(path.read_bytes(), expected) manifest = json.loads((ROOT / "catalog/proof-data/q8b-v1.json").read_text()) proof_data_pipeline.validate_manifest(manifest) self.assertEqual(manifest["counts"]["payloadCount"], 21) self.assertEqual([row["k"] for row in manifest["srs"]], list(range(20))) - self.assertEqual(manifest["ledgerStatic"]["memberManifestSha256"], "0417e65cbd336943aa98c0bed2153f30e175394dd4cf7209bec13376988f4ba8") + self.assertEqual(manifest["ledgerStatic"]["memberManifestSha256"], "9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c") + semantic = json.loads((ROOT / "catalog/proof-data/ledger-static-9-member-manifest.json").read_text()) + self.assertEqual(semantic["schemaVersion"], "ledger-static-member-manifest-v1") + self.assertEqual(len(semantic["members"]), 12) + self.assertEqual(hashlib.sha256(canonical_bytes(semantic) + b"\n").hexdigest(), manifest["ledgerStatic"]["memberManifestSha256"]) + content = json.loads((ROOT / "catalog/proof-data/q8b-cache-admission-v1.json").read_text())["contentManifest"] + self.assertNotIn("srsGeneration", content) + self.assertEqual(content["srsGenerations"][0]["k"], [0]) + self.assertEqual(content["srsGenerations"][1]["k"], list(range(1, 20))) + self.assertIsNone(content["srsGenerations"][0]["rootPotSha256"]) + self.assertEqual(content["srsGenerations"][1]["rootPotSha256"], generate_proof_catalog.ROOT_POT) for path in sorted((ROOT / "catalog/components").glob("midnight-*.json")): validate_catalog.validate_component(json.loads(path.read_text())) @@ -232,17 +263,113 @@ def test_future_admission_is_append_only_explicit_and_scope_closed(self) -> None with self.subTest(mutation=mutation), self.assertRaises(ForgeError): proof_data_pipeline.validate_manifest(value) + def test_bootstrap_requires_reviewed_admission_and_rejects_self_rehashed_substitutions(self) -> None: + with tempfile.TemporaryDirectory() as text: + root = Path(text) + manifest, admission_path, _, digest = make_fixture(root) + admission = json.loads(admission_path.read_text()) + proof_set = json.loads((root / "q8b-v1.json").read_text()) + original_content = json.loads(manifest.read_text()) + + with self.assertRaisesRegex(ForgeError, "expected generation"): + proof_cache_bootstrap.load_content(manifest, admission_path, "f" * 64) + + self_rehashed = copy.deepcopy(original_content) + self_rehashed["selection"] = "foreign-self-rehashed" + projection = dict(self_rehashed) + projection.pop("combinedManifestSha256") + projection.pop("identityProjection") + self_rehashed_digest = hashlib.sha256(canonical_bytes(projection)).hexdigest() + self_rehashed["combinedManifestSha256"] = self_rehashed_digest + self_rehashed["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" + self_rehashed_path = root / "self-rehashed.json" + write_json(self_rehashed_path, self_rehashed) + with self.assertRaisesRegex(ForgeError, "admission contract"): + proof_cache_bootstrap.load_content(self_rehashed_path, admission_path, self_rehashed_digest) + + def assert_rejected(mutator, pattern: str) -> None: + content = copy.deepcopy(original_content) + mutator(content) + projection = dict(content) + projection.pop("combinedManifestSha256") + projection.pop("identityProjection") + changed_digest = hashlib.sha256(canonical_bytes(projection)).hexdigest() + content["combinedManifestSha256"] = changed_digest + content["identityProjection"] = "all fields except combinedManifestSha256 and identityProjection" + changed_admission = copy.deepcopy(admission) + changed_admission["selection"] = content["selection"] + changed_admission["expectedCombinedManifestSha256"] = changed_digest + changed_admission["contentManifest"] = content + changed_proof_set = copy.deepcopy(proof_set) + changed_proof_set["cacheContract"]["expectedCombinedManifestSha256"] = changed_digest + changed_admission["proofSetSha256"] = hashlib.sha256(canonical_bytes(changed_proof_set)).hexdigest() + case_root = root / changed_digest + case_root.mkdir() + write_json(case_root / "q8b-v1.json", changed_proof_set) + changed_manifest_path = case_root / "content.json" + changed_admission_path = case_root / "admission.json" + write_json(changed_manifest_path, content) + write_json(changed_admission_path, changed_admission) + with self.assertRaisesRegex(ForgeError, pattern): + proof_cache_bootstrap.load_content(changed_manifest_path, changed_admission_path, changed_digest) + + def swap_k0_k19(content: dict) -> None: + by_path = {row["path"]: row for row in content["files"]} + first = copy.deepcopy(by_path["bls_midnight_2p0"]) + last = copy.deepcopy(by_path["bls_midnight_2p19"]) + for target, source in ((by_path["bls_midnight_2p0"], last), (by_path["bls_midnight_2p19"], first)): + path = target["path"] + target.clear() + target.update(source) + target["path"] = path + + assert_rejected(swap_k0_k19, "K/path/outer|generation mapping") + assert_rejected(lambda content: content["srsGenerations"][1].update({"rootPotSha256": "e" * 64}), "rootPotSha256") + assert_rejected(lambda content: content["files"][0].update({"outerPayload": "foreign-srs"}), "K/path/outer") + + def wrong_ledger_namespace(content: dict) -> None: + content["ledgerStatic"]["cacheNamespace"] = "10" + for row in content["files"]: + if row["kind"] == "ledger-static": + row["cacheNamespace"] = "10" + + assert_rejected(wrong_ledger_namespace, "top-level identity") + + def wrong_ledger_path(content: dict) -> None: + row = next(row for row in content["files"] if row["path"] == "dust/9/spend.bzkir") + row["path"] = "dust/9/foreign.bzkir" + content["files"].sort(key=lambda item: item["path"]) + + assert_rejected(wrong_ledger_path, "exact twelve") + + def test_static10_negative_requires_specific_source_pinned_reason(self) -> None: + negative = json.loads((ROOT / "catalog/proof-data/q8b-v1.json").read_text())["proofServerCompatibility"]["rejectedStatic9"] + image = { + "repositoryDigest": f"midnightntwrk/proof-server@{negative['images']['linux/amd64']}", + "imageId": "sha256:" + "a" * 64, + "os": "linux", + "architecture": "amd64", + } + with self.assertRaisesRegex(ForgeError, "source-derived"): + proof_runtime_docker.static10_rejection_diagnostic("unrelated error", "exited 1", negative, image, "9.0.0-rc.7") + with self.assertRaisesRegex(ForgeError, "source-derived"): + proof_runtime_docker.static10_rejection_diagnostic("zswap/10/spend.prover", "exited 1", negative, image, "9.0.0-rc.7") + logs = "\n".join(f"failed to fetch https://srs.midnight.network/{path}" for path in negative["diagnosticContract"]["requiredMissingPaths"]) + evidence = proof_runtime_docker.static10_rejection_diagnostic(logs, "exited 1", negative, image, "9.0.0-rc.7") + self.assertEqual(evidence["observedMissingPaths"], negative["diagnosticContract"]["requiredMissingPaths"]) + self.assertEqual(len(evidence["canonicalSha256"]), 64) + def test_bootstrap_atomic_noop_repair_pointer_failure_and_gc(self) -> None: with tempfile.TemporaryDirectory() as text: root = Path(text) - manifest, payloads, digest = make_fixture(root / "first") + manifest, admission, payloads, digest = make_fixture(root / "first") parent = manifest.parent / "proof-params" - activated = proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + activated = proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) self.assertEqual(activated, digest) - fixed = proof_cache_bootstrap.verify_active(manifest, parent) + fixed = proof_cache_bootstrap.verify_active(manifest, admission, digest, parent) self.assertEqual(fixed, str(parent / "generations" / digest)) inode = (parent / "generations" / digest).stat().st_ino - self.assertEqual(proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None), digest) + self.assertEqual(proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None), digest) self.assertEqual((parent / "generations" / digest).stat().st_ino, inode) # Same-digest corruption is quarantined and repaired, never changed in place. @@ -251,21 +378,21 @@ def test_bootstrap_atomic_noop_repair_pointer_failure_and_gc(self) -> None: corrupt.chmod(0o644) corrupt_digest = hashlib.sha256(corrupt.read_bytes()).hexdigest() with self.assertRaisesRegex(ForgeError, "pointer"): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, "pointer") + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, "pointer") self.assertEqual(os.readlink(parent / "current"), f"generations/{digest}") self.assertEqual(hashlib.sha256(corrupt.read_bytes()).hexdigest(), corrupt_digest) - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) self.assertNotEqual((parent / "generations" / digest).stat().st_ino, inode) self.assertTrue(any((parent / "quarantine").iterdir())) - proof_cache_bootstrap.verify_active(manifest, parent) + proof_cache_bootstrap.verify_active(manifest, admission, digest, parent) # A fully staged new generation plus failed pointer swap retains the old pointer. second_root = root / "second" - manifest2, payloads2, digest2 = make_fixture(second_root, b"b") + manifest2, admission2, payloads2, digest2 = make_fixture(second_root, b"b") with self.assertRaisesRegex(ForgeError, "pointer"): - proof_cache_bootstrap.bootstrap(manifest2, payloads2, parent, True, False, "pointer") + proof_cache_bootstrap.bootstrap(manifest2, admission2, digest2, payloads2, parent, True, False, "pointer") self.assertEqual(os.readlink(parent / "current"), f"generations/{digest}") - proof_cache_bootstrap.verify_active(manifest, parent) + proof_cache_bootstrap.verify_active(manifest, admission, digest, parent) self.assertTrue((parent / "generations" / digest2).is_dir()) self.assertEqual(proof_cache_bootstrap.gc(parent, {digest2}, True, False), []) self.assertEqual(proof_cache_bootstrap.gc(parent, set(), True, False), [digest2]) @@ -274,23 +401,23 @@ def test_bootstrap_atomic_noop_repair_pointer_failure_and_gc(self) -> None: def test_bootstrap_failure_corruption_missing_extra_modes_and_lock_contention_fail_closed(self) -> None: with tempfile.TemporaryDirectory() as text: root = Path(text) - manifest, payloads, digest = make_fixture(root) + manifest, admission, payloads, digest = make_fixture(root) parent = root / "proof-params" - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) prior = os.readlink(parent / "current") with self.assertRaisesRegex(ForgeError, "readers stopped"): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, False, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, False, False, None) with self.assertRaisesRegex(ForgeError, "injected failure"): # Force a rebuild by corrupting the installed tree, then fail after staged verification. target = parent / prior / "bls_midnight_2p0" target.write_bytes(b"bad") target.chmod(0o644) - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, "after-verify") + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, "after-verify") self.assertEqual(os.readlink(parent / "current"), prior) # The prior bytes are corrupt but were not partially overwritten; a normal repair restores them. - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) - proof_cache_bootstrap.verify_active(manifest, parent) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) + proof_cache_bootstrap.verify_active(manifest, admission, digest, parent) cases = [] missing = root / "missing" @@ -303,7 +430,7 @@ def test_bootstrap_failure_corruption_missing_extra_modes_and_lock_contention_fa with self.assertRaisesRegex(ForgeError, cases[-1]): # Corrupt installed tree so payload validation is reached. (parent / prior / "bls_midnight_2p0").write_bytes(b"bad") - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) for path in payloads.iterdir(): path.unlink() for path in missing.iterdir(): @@ -312,24 +439,24 @@ def test_bootstrap_failure_corruption_missing_extra_modes_and_lock_contention_fa extra.write_bytes(b"x") extra.chmod(0o644) with self.assertRaisesRegex(ForgeError, "differs"): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) extra.unlink() (payloads / "bls_midnight_2p0").chmod(0o600) with self.assertRaisesRegex(ForgeError, "mode mismatch"): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) (payloads / "bls_midnight_2p0").chmod(0o644) lock_stream = proof_cache_bootstrap.acquire_lock(parent, False) try: with self.assertRaisesRegex(ForgeError, "lock is held"): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, True, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, True, None) finally: lock_stream.close() def test_archive_traversal_link_and_alias_substitution_are_rejected(self) -> None: with tempfile.TemporaryDirectory() as text: root = Path(text) - manifest, payloads, _ = make_fixture(root) + manifest, admission, payloads, digest = make_fixture(root) parent = root / "proof-params" archive = payloads / "midnight-ledger-static-noarch-9.0.0.zip" content = json.loads(manifest.read_text()) @@ -350,7 +477,7 @@ def rebind_archive(mutator) -> None: rebind_archive(lambda output: output.writestr("../escape", b"x")) with self.assertRaises(ForgeError): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) def link_archive(output: zipfile.ZipFile) -> None: info = zipfile.ZipInfo("dust/9/spend.bzkir") @@ -360,7 +487,7 @@ def link_archive(output: zipfile.ZipFile) -> None: rebind_archive(link_archive) with self.assertRaises(ForgeError): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) # An outer alias change cannot shadow the literal payload selection. original = json.loads(manifest.read_text()) @@ -370,8 +497,8 @@ def link_archive(output: zipfile.ZipFile) -> None: projection.pop("identityProjection") original["combinedManifestSha256"] = hashlib.sha256(canonical_bytes(projection)).hexdigest() write_json(manifest, original) - with self.assertRaisesRegex(ForgeError, "payload directory differs"): - proof_cache_bootstrap.bootstrap(manifest, payloads, parent, True, False, None) + with self.assertRaisesRegex(ForgeError, "expected generation|admission contract"): + proof_cache_bootstrap.bootstrap(manifest, admission, digest, payloads, parent, True, False, None) if __name__ == "__main__": From 6f1a188a4a3e7f2c9a67029defaa900a009b337d Mon Sep 17 00:00:00 2001 From: "Edward A." Date: Fri, 28 Aug 2026 08:06:14 -0400 Subject: [PATCH 6/7] Require exact propagated static-10 diagnostic --- catalog/proof-data/q8b-cache-admission-v1.json | 2 +- catalog/proof-data/q8b-v1.json | 2 +- scripts/generate_proof_catalog.py | 13 ++++++++----- scripts/proof_data_pipeline.py | 4 +++- scripts/proof_runtime_docker.py | 11 +++++++---- tests/test_proof_data.py | 8 +++++--- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/catalog/proof-data/q8b-cache-admission-v1.json b/catalog/proof-data/q8b-cache-admission-v1.json index 7ec1916..ae505b7 100644 --- a/catalog/proof-data/q8b-cache-admission-v1.json +++ b/catalog/proof-data/q8b-cache-admission-v1.json @@ -1 +1 @@ -{"canonicalization":"forge-canonical-json-v1","contentManifest":{"canonicalization":"forge-canonical-json-v1","combinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","fileCount":32,"files":[{"generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":0,"kind":"srs","mode":"0644","officialAlias":null,"outerPayload":"bls_midnight_2p0","outerSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","path":"bls_midnight_2p0","provenance":"ledger-provider-compatibility","rootPotSha256":null,"sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":1,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p1","outerPayload":"bls_midnight_2p1","outerSha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","path":"bls_midnight_2p1","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":10,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p10","outerPayload":"bls_midnight_2p10","outerSha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","path":"bls_midnight_2p10","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":11,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p11","outerPayload":"bls_midnight_2p11","outerSha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","path":"bls_midnight_2p11","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":12,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p12","outerPayload":"bls_midnight_2p12","outerSha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","path":"bls_midnight_2p12","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":13,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p13","outerPayload":"bls_midnight_2p13","outerSha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","path":"bls_midnight_2p13","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":14,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p14","outerPayload":"bls_midnight_2p14","outerSha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","path":"bls_midnight_2p14","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":15,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p15","outerPayload":"bls_midnight_2p15","outerSha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","path":"bls_midnight_2p15","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":16,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p16","outerPayload":"bls_midnight_2p16","outerSha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","path":"bls_midnight_2p16","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":17,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p17","outerPayload":"bls_midnight_2p17","outerSha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","path":"bls_midnight_2p17","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":18,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p18","outerPayload":"bls_midnight_2p18","outerSha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","path":"bls_midnight_2p18","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":19,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p19","outerPayload":"bls_midnight_2p19","outerSha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","path":"bls_midnight_2p19","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":2,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p2","outerPayload":"bls_midnight_2p2","outerSha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","path":"bls_midnight_2p2","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":3,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p3","outerPayload":"bls_midnight_2p3","outerSha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","path":"bls_midnight_2p3","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":4,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p4","outerPayload":"bls_midnight_2p4","outerSha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","path":"bls_midnight_2p4","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":5,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p5","outerPayload":"bls_midnight_2p5","outerSha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","path":"bls_midnight_2p5","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":6,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p6","outerPayload":"bls_midnight_2p6","outerSha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","path":"bls_midnight_2p6","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":7,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p7","outerPayload":"bls_midnight_2p7","outerSha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","path":"bls_midnight_2p7","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":8,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p8","outerPayload":"bls_midnight_2p8","outerSha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","path":"bls_midnight_2p8","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":9,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p9","outerPayload":"bls_midnight_2p9","outerSha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","path":"bls_midnight_2p9","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311}],"identityProjection":"all fields except combinedManifestSha256 and identityProjection","ledgerStatic":{"cacheNamespace":"9","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","outerSize":21601265,"zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"payloadCount":21,"schemaVersion":"proof-cache-content-manifest-v1","selection":"q8b-k0-k19-ledger-static-9","srsGenerations":[{"canonicalObjectSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":[0],"provenance":"ledger-provider-compatibility","rootPotSha256":null,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"}]},"expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","proofSetSha256":"c7d9dc6b1d790b56fad75cd0bbcd914053d86b7a892d78e0a52606cce7def84d","schemaVersion":"proof-cache-admission-v1","selection":"q8b-k0-k19-ledger-static-9"} \ No newline at end of file +{"canonicalization":"forge-canonical-json-v1","contentManifest":{"canonicalization":"forge-canonical-json-v1","combinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","fileCount":32,"files":[{"generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":0,"kind":"srs","mode":"0644","officialAlias":null,"outerPayload":"bls_midnight_2p0","outerSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","path":"bls_midnight_2p0","provenance":"ledger-provider-compatibility","rootPotSha256":null,"sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":1,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p1","outerPayload":"bls_midnight_2p1","outerSha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","path":"bls_midnight_2p1","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":10,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p10","outerPayload":"bls_midnight_2p10","outerSha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","path":"bls_midnight_2p10","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":11,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p11","outerPayload":"bls_midnight_2p11","outerSha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","path":"bls_midnight_2p11","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":12,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p12","outerPayload":"bls_midnight_2p12","outerSha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","path":"bls_midnight_2p12","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":13,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p13","outerPayload":"bls_midnight_2p13","outerSha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","path":"bls_midnight_2p13","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":14,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p14","outerPayload":"bls_midnight_2p14","outerSha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","path":"bls_midnight_2p14","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":15,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p15","outerPayload":"bls_midnight_2p15","outerSha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","path":"bls_midnight_2p15","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":16,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p16","outerPayload":"bls_midnight_2p16","outerSha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","path":"bls_midnight_2p16","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":17,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p17","outerPayload":"bls_midnight_2p17","outerSha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","path":"bls_midnight_2p17","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":18,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p18","outerPayload":"bls_midnight_2p18","outerSha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","path":"bls_midnight_2p18","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":19,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p19","outerPayload":"bls_midnight_2p19","outerSha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","path":"bls_midnight_2p19","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":2,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p2","outerPayload":"bls_midnight_2p2","outerSha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","path":"bls_midnight_2p2","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":3,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p3","outerPayload":"bls_midnight_2p3","outerSha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","path":"bls_midnight_2p3","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":4,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p4","outerPayload":"bls_midnight_2p4","outerSha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","path":"bls_midnight_2p4","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":5,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p5","outerPayload":"bls_midnight_2p5","outerSha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","path":"bls_midnight_2p5","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":6,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p6","outerPayload":"bls_midnight_2p6","outerSha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","path":"bls_midnight_2p6","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":7,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p7","outerPayload":"bls_midnight_2p7","outerSha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","path":"bls_midnight_2p7","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":8,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p8","outerPayload":"bls_midnight_2p8","outerSha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","path":"bls_midnight_2p8","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":9,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p9","outerPayload":"bls_midnight_2p9","outerSha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","path":"bls_midnight_2p9","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311}],"identityProjection":"all fields except combinedManifestSha256 and identityProjection","ledgerStatic":{"cacheNamespace":"9","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","outerSize":21601265,"zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"payloadCount":21,"schemaVersion":"proof-cache-content-manifest-v1","selection":"q8b-k0-k19-ledger-static-9","srsGenerations":[{"canonicalObjectSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":[0],"provenance":"ledger-provider-compatibility","rootPotSha256":null,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"}]},"expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","proofSetSha256":"6426f265dc0ac53f51db7ce9194f4db38b785a9b04d1fb795ead97725eff3699","schemaVersion":"proof-cache-admission-v1","selection":"q8b-k0-k19-ledger-static-9"} \ No newline at end of file diff --git a/catalog/proof-data/q8b-v1.json b/catalog/proof-data/q8b-v1.json index f232069..244090f 100644 --- a/catalog/proof-data/q8b-v1.json +++ b/catalog/proof-data/q8b-v1.json @@ -1 +1 @@ -{"artifactKind":"proof-data","cacheContract":{"admissionContractPath":"catalog/proof-data/q8b-cache-admission-v1.json","bootstrapMount":"read-write","cacheRootResolution":["MIDNIGHT_PP","XDG_CACHE_HOME/midnight/zk-params","$HOME/.cache/midnight/zk-params"],"currentPointer":"/proof-params/current","defaultSourceUrl":"https://srs.midnight.network/","expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","generationTemplate":"/proof-params/generations/{combinedManifestSha256}","githubAsMidnightParamSourceAllowed":false,"lock":"/proof-params/.bootstrap.lock","persistentParent":"/proof-params","readerMount":"read-only"},"compactCompatibility":{"backends":["zkir-v2","zkir-v3"],"ledgerMajor":9,"runtime":"0.19.0","version":"0.34.0","warehousePayloadAllowed":false},"counts":{"canonicalInputBytes":223087290,"ledgerMemberBytes":21753130,"ledgerPayloadCount":1,"payloadCount":21,"srsBytes":201334160,"srsPayloadCount":20},"decision":"Q8=B","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","evidencePolicy":{"legalCertaintyClaimed":false,"lineageMemberManifestRequired":true,"perBlobLicenseFileAvailable":false,"redistributionBasis":"Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload","softwareSbom":"not-applicable-proof-data"},"futureAdmission":{"appendOnly":true,"explicitGenerationRequiredWhenMultiple":true,"explicitMemberManifestRequiredWhenMultiple":true,"implicitLatestAllowed":false,"ledgerSemverBump":"midnight-ledger-static-noarch-{semver}.zip","sameKCorrection":"midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin","sameSemverCorrection":"midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip"},"ledgerStatic":{"aggregateMemberBytes":21753130,"archiveSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","archiveSize":21601265,"cacheNamespace":"9","componentId":"midnight-ledger-static-9.0.0","ledgerStaticRevision":"manifest-sha256:9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","ledgerStaticSemver":"9.0.0","memberManifestPath":"catalog/proof-data/ledger-static-9-member-manifest.json","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","members":[{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"sourceUrl":"https://srs.midnight.network/zswap/9/output.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/output.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"sourceUrl":"https://srs.midnight.network/zswap/9/output.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"sourceUrl":"https://srs.midnight.network/dust/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"sourceUrl":"https://srs.midnight.network/dust/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"sourceUrl":"https://srs.midnight.network/dust/9/spend.bzkir","transformation":"unchanged-archive-member"}],"releaseName":"midnight-ledger-static-noarch-9.0.0.zip","transformation":"deterministic-zip-assembly-from-unchanged-members","zipLayoutManifestPath":"catalog/proof-data/ledger-static-9-zip-layout-manifest.json","zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"platform":"noarch","proofServerCompatibility":{"accepted":{"cacheNamespace":"9","images":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","version":"9.0.0-rc.5"},"rejectedStatic9":{"cacheNamespace":"10","diagnosticContract":{"reason":"source-pinned-static10-paths-missing-from-static9-generation","requiredMissingPaths":["dust/10/spend.prover","zswap/10/output.prover","zswap/10/sign.prover","zswap/10/spend.prover"],"schemaVersion":"rc7-static10-diagnostic-contract-v1","sourceFiles":[{"path":"proof-server/src/main.rs","sha256":"1a0de2c7b4f68894a50195bf67794faa23205fd6687082b88cbd151d9d0e820f"},{"path":"ledger/src/dust.rs","sha256":"6b3dd3177eefafa55da2d678bb505922d5a41c4d4465e5b2fb42eb400d53d703"},{"path":"zswap/src/prove.rs","sha256":"3ccb32bb5599c097f7f3829441944735ddde2cf199f737222736755d33fc3315"},{"path":"static/version","sha256":"4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5"}]},"images":{"linux/amd64":"sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613","linux/arm64":"sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb"},"mayReuseSrsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","publicMultiarchTag":false,"requiresLedgerStaticSemver":"10.0.0","sourceCommit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","version":"9.0.0-rc.7"}},"releaseMutability":"mutable-warehouse","schemaVersion":"proof-data-set-v1","scope":{"customProvingKeysIncluded":false,"directGithubAssetForbiddenK":[24,25],"futureKRequiresReview":[20,21,22,23,24,25],"observedCircuitK":[5,8,9,10,11,12,13,14,15,16,18,19],"srsK":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"startupPrefetchK":[10,11,12,13,14,15]},"setId":"q8b-k0-k19-ledger-static-9","sourcePins":{"ledgerStatic10Negative":{"cacheNamespace":"10","commit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","ledgerStaticSemver":"10.0.0","repository":"midnightntwrk/midnight-ledger","tree":"bfa37732f879bd29b4a67f7a1567260431c0f43b"},"ledgerStatic9":{"cacheNamespace":"9","commit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","ledgerStaticSemver":"9.0.0","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","providerPath":"base-crypto/src/data_provider.rs","providerSha256":"4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a","repository":"midnightntwrk/midnight-ledger","startupPath":"proof-server/src/main.rs","startupSha256":"342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64","tree":"0b39ecaa6502dcb05352786df2b02bb0a622ee38"},"trustedSetup":{"catalogPath":"MIDNIGHT_SRS_CATALOG.md","catalogSha256":"8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f","commit":"3ea610263b228af24840f7b00661ee22360db6d8","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","repository":"midnightntwrk/midnight-trusted-setup","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","tree":"19888a217d9228324dff60b685b50deea4afcac5"}},"srs":[{"artifactKind":"proof-data","componentId":"midnight-srs-k0","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","installName":"bls_midnight_2p0","k":0,"mode":"0644","officialAlias":null,"officialUrl":null,"platform":"noarch","releaseName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p0","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k1","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p1","k":1,"mode":"0644","officialAlias":"midnight-srs-2p1","officialUrl":"https://srs.midnight.network/midnight-srs-2p1","platform":"noarch","releaseName":"bls_midnight_2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p1","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k2","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p2","k":2,"mode":"0644","officialAlias":"midnight-srs-2p2","officialUrl":"https://srs.midnight.network/midnight-srs-2p2","platform":"noarch","releaseName":"bls_midnight_2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p2","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k3","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p3","k":3,"mode":"0644","officialAlias":"midnight-srs-2p3","officialUrl":"https://srs.midnight.network/midnight-srs-2p3","platform":"noarch","releaseName":"bls_midnight_2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p3","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k4","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p4","k":4,"mode":"0644","officialAlias":"midnight-srs-2p4","officialUrl":"https://srs.midnight.network/midnight-srs-2p4","platform":"noarch","releaseName":"bls_midnight_2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p4","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k5","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p5","k":5,"mode":"0644","officialAlias":"midnight-srs-2p5","officialUrl":"https://srs.midnight.network/midnight-srs-2p5","platform":"noarch","releaseName":"bls_midnight_2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p5","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k6","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p6","k":6,"mode":"0644","officialAlias":"midnight-srs-2p6","officialUrl":"https://srs.midnight.network/midnight-srs-2p6","platform":"noarch","releaseName":"bls_midnight_2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p6","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k7","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p7","k":7,"mode":"0644","officialAlias":"midnight-srs-2p7","officialUrl":"https://srs.midnight.network/midnight-srs-2p7","platform":"noarch","releaseName":"bls_midnight_2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p7","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k8","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p8","k":8,"mode":"0644","officialAlias":"midnight-srs-2p8","officialUrl":"https://srs.midnight.network/midnight-srs-2p8","platform":"noarch","releaseName":"bls_midnight_2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p8","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k9","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p9","k":9,"mode":"0644","officialAlias":"midnight-srs-2p9","officialUrl":"https://srs.midnight.network/midnight-srs-2p9","platform":"noarch","releaseName":"bls_midnight_2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p9","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k10","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p10","k":10,"mode":"0644","officialAlias":"midnight-srs-2p10","officialUrl":"https://srs.midnight.network/midnight-srs-2p10","platform":"noarch","releaseName":"bls_midnight_2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p10","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k11","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p11","k":11,"mode":"0644","officialAlias":"midnight-srs-2p11","officialUrl":"https://srs.midnight.network/midnight-srs-2p11","platform":"noarch","releaseName":"bls_midnight_2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p11","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k12","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p12","k":12,"mode":"0644","officialAlias":"midnight-srs-2p12","officialUrl":"https://srs.midnight.network/midnight-srs-2p12","platform":"noarch","releaseName":"bls_midnight_2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p12","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k13","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p13","k":13,"mode":"0644","officialAlias":"midnight-srs-2p13","officialUrl":"https://srs.midnight.network/midnight-srs-2p13","platform":"noarch","releaseName":"bls_midnight_2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p13","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k14","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p14","k":14,"mode":"0644","officialAlias":"midnight-srs-2p14","officialUrl":"https://srs.midnight.network/midnight-srs-2p14","platform":"noarch","releaseName":"bls_midnight_2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p14","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k15","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p15","k":15,"mode":"0644","officialAlias":"midnight-srs-2p15","officialUrl":"https://srs.midnight.network/midnight-srs-2p15","platform":"noarch","releaseName":"bls_midnight_2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p15","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k16","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p16","k":16,"mode":"0644","officialAlias":"midnight-srs-2p16","officialUrl":"https://srs.midnight.network/midnight-srs-2p16","platform":"noarch","releaseName":"bls_midnight_2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p16","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k17","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p17","k":17,"mode":"0644","officialAlias":"midnight-srs-2p17","officialUrl":"https://srs.midnight.network/midnight-srs-2p17","platform":"noarch","releaseName":"bls_midnight_2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p17","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k18","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p18","k":18,"mode":"0644","officialAlias":"midnight-srs-2p18","officialUrl":"https://srs.midnight.network/midnight-srs-2p18","platform":"noarch","releaseName":"bls_midnight_2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p18","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k19","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p19","k":19,"mode":"0644","officialAlias":"midnight-srs-2p19","officialUrl":"https://srs.midnight.network/midnight-srs-2p19","platform":"noarch","releaseName":"bls_midnight_2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p19","transformation":"unchanged-identity-mirror"}],"warning":"DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use."} \ No newline at end of file +{"artifactKind":"proof-data","cacheContract":{"admissionContractPath":"catalog/proof-data/q8b-cache-admission-v1.json","bootstrapMount":"read-write","cacheRootResolution":["MIDNIGHT_PP","XDG_CACHE_HOME/midnight/zk-params","$HOME/.cache/midnight/zk-params"],"currentPointer":"/proof-params/current","defaultSourceUrl":"https://srs.midnight.network/","expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","generationTemplate":"/proof-params/generations/{combinedManifestSha256}","githubAsMidnightParamSourceAllowed":false,"lock":"/proof-params/.bootstrap.lock","persistentParent":"/proof-params","readerMount":"read-only"},"compactCompatibility":{"backends":["zkir-v2","zkir-v3"],"ledgerMajor":9,"runtime":"0.19.0","version":"0.34.0","warehousePayloadAllowed":false},"counts":{"canonicalInputBytes":223087290,"ledgerMemberBytes":21753130,"ledgerPayloadCount":1,"payloadCount":21,"srsBytes":201334160,"srsPayloadCount":20},"decision":"Q8=B","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","evidencePolicy":{"legalCertaintyClaimed":false,"lineageMemberManifestRequired":true,"perBlobLicenseFileAvailable":false,"redistributionBasis":"Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload","softwareSbom":"not-applicable-proof-data"},"futureAdmission":{"appendOnly":true,"explicitGenerationRequiredWhenMultiple":true,"explicitMemberManifestRequiredWhenMultiple":true,"implicitLatestAllowed":false,"ledgerSemverBump":"midnight-ledger-static-noarch-{semver}.zip","sameKCorrection":"midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin","sameSemverCorrection":"midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip"},"ledgerStatic":{"aggregateMemberBytes":21753130,"archiveSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","archiveSize":21601265,"cacheNamespace":"9","componentId":"midnight-ledger-static-9.0.0","ledgerStaticRevision":"manifest-sha256:9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","ledgerStaticSemver":"9.0.0","memberManifestPath":"catalog/proof-data/ledger-static-9-member-manifest.json","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","members":[{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"sourceUrl":"https://srs.midnight.network/zswap/9/output.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/output.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"sourceUrl":"https://srs.midnight.network/zswap/9/output.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"sourceUrl":"https://srs.midnight.network/dust/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"sourceUrl":"https://srs.midnight.network/dust/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"sourceUrl":"https://srs.midnight.network/dust/9/spend.bzkir","transformation":"unchanged-archive-member"}],"releaseName":"midnight-ledger-static-noarch-9.0.0.zip","transformation":"deterministic-zip-assembly-from-unchanged-members","zipLayoutManifestPath":"catalog/proof-data/ledger-static-9-zip-layout-manifest.json","zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"platform":"noarch","proofServerCompatibility":{"accepted":{"cacheNamespace":"9","images":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","version":"9.0.0-rc.5"},"rejectedStatic9":{"cacheNamespace":"10","diagnosticContract":{"failurePropagation":"proof-server-join-all-input-order-first-error","reason":"source-pinned-static10-propagated-path-missing-from-static9-generation","requestedProverPaths":["zswap/10/spend.prover","zswap/10/output.prover","zswap/10/sign.prover","dust/10/spend.prover"],"requiredFailurePath":"zswap/10/spend.prover","schemaVersion":"rc7-static10-diagnostic-contract-v1","sourceFiles":[{"path":"proof-server/src/main.rs","sha256":"1a0de2c7b4f68894a50195bf67794faa23205fd6687082b88cbd151d9d0e820f"},{"path":"ledger/src/dust.rs","sha256":"6b3dd3177eefafa55da2d678bb505922d5a41c4d4465e5b2fb42eb400d53d703"},{"path":"zswap/src/prove.rs","sha256":"3ccb32bb5599c097f7f3829441944735ddde2cf199f737222736755d33fc3315"},{"path":"static/version","sha256":"4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5"}]},"images":{"linux/amd64":"sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613","linux/arm64":"sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb"},"mayReuseSrsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","publicMultiarchTag":false,"requiresLedgerStaticSemver":"10.0.0","sourceCommit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","version":"9.0.0-rc.7"}},"releaseMutability":"mutable-warehouse","schemaVersion":"proof-data-set-v1","scope":{"customProvingKeysIncluded":false,"directGithubAssetForbiddenK":[24,25],"futureKRequiresReview":[20,21,22,23,24,25],"observedCircuitK":[5,8,9,10,11,12,13,14,15,16,18,19],"srsK":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"startupPrefetchK":[10,11,12,13,14,15]},"setId":"q8b-k0-k19-ledger-static-9","sourcePins":{"ledgerStatic10Negative":{"cacheNamespace":"10","commit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","ledgerStaticSemver":"10.0.0","repository":"midnightntwrk/midnight-ledger","tree":"bfa37732f879bd29b4a67f7a1567260431c0f43b"},"ledgerStatic9":{"cacheNamespace":"9","commit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","ledgerStaticSemver":"9.0.0","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","providerPath":"base-crypto/src/data_provider.rs","providerSha256":"4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a","repository":"midnightntwrk/midnight-ledger","startupPath":"proof-server/src/main.rs","startupSha256":"342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64","tree":"0b39ecaa6502dcb05352786df2b02bb0a622ee38"},"trustedSetup":{"catalogPath":"MIDNIGHT_SRS_CATALOG.md","catalogSha256":"8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f","commit":"3ea610263b228af24840f7b00661ee22360db6d8","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","repository":"midnightntwrk/midnight-trusted-setup","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","tree":"19888a217d9228324dff60b685b50deea4afcac5"}},"srs":[{"artifactKind":"proof-data","componentId":"midnight-srs-k0","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","installName":"bls_midnight_2p0","k":0,"mode":"0644","officialAlias":null,"officialUrl":null,"platform":"noarch","releaseName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p0","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k1","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p1","k":1,"mode":"0644","officialAlias":"midnight-srs-2p1","officialUrl":"https://srs.midnight.network/midnight-srs-2p1","platform":"noarch","releaseName":"bls_midnight_2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p1","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k2","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p2","k":2,"mode":"0644","officialAlias":"midnight-srs-2p2","officialUrl":"https://srs.midnight.network/midnight-srs-2p2","platform":"noarch","releaseName":"bls_midnight_2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p2","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k3","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p3","k":3,"mode":"0644","officialAlias":"midnight-srs-2p3","officialUrl":"https://srs.midnight.network/midnight-srs-2p3","platform":"noarch","releaseName":"bls_midnight_2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p3","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k4","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p4","k":4,"mode":"0644","officialAlias":"midnight-srs-2p4","officialUrl":"https://srs.midnight.network/midnight-srs-2p4","platform":"noarch","releaseName":"bls_midnight_2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p4","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k5","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p5","k":5,"mode":"0644","officialAlias":"midnight-srs-2p5","officialUrl":"https://srs.midnight.network/midnight-srs-2p5","platform":"noarch","releaseName":"bls_midnight_2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p5","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k6","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p6","k":6,"mode":"0644","officialAlias":"midnight-srs-2p6","officialUrl":"https://srs.midnight.network/midnight-srs-2p6","platform":"noarch","releaseName":"bls_midnight_2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p6","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k7","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p7","k":7,"mode":"0644","officialAlias":"midnight-srs-2p7","officialUrl":"https://srs.midnight.network/midnight-srs-2p7","platform":"noarch","releaseName":"bls_midnight_2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p7","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k8","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p8","k":8,"mode":"0644","officialAlias":"midnight-srs-2p8","officialUrl":"https://srs.midnight.network/midnight-srs-2p8","platform":"noarch","releaseName":"bls_midnight_2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p8","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k9","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p9","k":9,"mode":"0644","officialAlias":"midnight-srs-2p9","officialUrl":"https://srs.midnight.network/midnight-srs-2p9","platform":"noarch","releaseName":"bls_midnight_2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p9","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k10","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p10","k":10,"mode":"0644","officialAlias":"midnight-srs-2p10","officialUrl":"https://srs.midnight.network/midnight-srs-2p10","platform":"noarch","releaseName":"bls_midnight_2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p10","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k11","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p11","k":11,"mode":"0644","officialAlias":"midnight-srs-2p11","officialUrl":"https://srs.midnight.network/midnight-srs-2p11","platform":"noarch","releaseName":"bls_midnight_2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p11","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k12","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p12","k":12,"mode":"0644","officialAlias":"midnight-srs-2p12","officialUrl":"https://srs.midnight.network/midnight-srs-2p12","platform":"noarch","releaseName":"bls_midnight_2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p12","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k13","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p13","k":13,"mode":"0644","officialAlias":"midnight-srs-2p13","officialUrl":"https://srs.midnight.network/midnight-srs-2p13","platform":"noarch","releaseName":"bls_midnight_2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p13","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k14","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p14","k":14,"mode":"0644","officialAlias":"midnight-srs-2p14","officialUrl":"https://srs.midnight.network/midnight-srs-2p14","platform":"noarch","releaseName":"bls_midnight_2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p14","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k15","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p15","k":15,"mode":"0644","officialAlias":"midnight-srs-2p15","officialUrl":"https://srs.midnight.network/midnight-srs-2p15","platform":"noarch","releaseName":"bls_midnight_2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p15","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k16","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p16","k":16,"mode":"0644","officialAlias":"midnight-srs-2p16","officialUrl":"https://srs.midnight.network/midnight-srs-2p16","platform":"noarch","releaseName":"bls_midnight_2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p16","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k17","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p17","k":17,"mode":"0644","officialAlias":"midnight-srs-2p17","officialUrl":"https://srs.midnight.network/midnight-srs-2p17","platform":"noarch","releaseName":"bls_midnight_2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p17","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k18","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p18","k":18,"mode":"0644","officialAlias":"midnight-srs-2p18","officialUrl":"https://srs.midnight.network/midnight-srs-2p18","platform":"noarch","releaseName":"bls_midnight_2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p18","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k19","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p19","k":19,"mode":"0644","officialAlias":"midnight-srs-2p19","officialUrl":"https://srs.midnight.network/midnight-srs-2p19","platform":"noarch","releaseName":"bls_midnight_2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p19","transformation":"unchanged-identity-mirror"}],"warning":"DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use."} \ No newline at end of file diff --git a/scripts/generate_proof_catalog.py b/scripts/generate_proof_catalog.py index 1756389..7739c86 100755 --- a/scripts/generate_proof_catalog.py +++ b/scripts/generate_proof_catalog.py @@ -39,12 +39,13 @@ {"path": "zswap/src/prove.rs", "sha256": "3ccb32bb5599c097f7f3829441944735ddde2cf199f737222736755d33fc3315"}, {"path": "static/version", "sha256": "4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5"}, ] -RC7_REQUIRED_MISSING_PATHS = [ - "dust/10/spend.prover", +RC7_REQUESTED_PROVER_PATHS = [ + "zswap/10/spend.prover", "zswap/10/output.prover", "zswap/10/sign.prover", - "zswap/10/spend.prover", + "dust/10/spend.prover", ] +RC7_REQUIRED_FAILURE_PATH = RC7_REQUESTED_PROVER_PATHS[0] def exact_rc5_consumer() -> dict: @@ -282,8 +283,10 @@ def proof_set(pins: dict, member_digest: str, zip_layout_digest: str) -> dict: "diagnosticContract": { "schemaVersion": "rc7-static10-diagnostic-contract-v1", "sourceFiles": RC7_DIAGNOSTIC_SOURCES, - "requiredMissingPaths": RC7_REQUIRED_MISSING_PATHS, - "reason": "source-pinned-static10-paths-missing-from-static9-generation", + "requestedProverPaths": RC7_REQUESTED_PROVER_PATHS, + "requiredFailurePath": RC7_REQUIRED_FAILURE_PATH, + "failurePropagation": "proof-server-join-all-input-order-first-error", + "reason": "source-pinned-static10-propagated-path-missing-from-static9-generation", }, }, }, diff --git a/scripts/proof_data_pipeline.py b/scripts/proof_data_pipeline.py index 1a7ca64..fb7c370 100755 --- a/scripts/proof_data_pipeline.py +++ b/scripts/proof_data_pipeline.py @@ -124,7 +124,9 @@ def validate_manifest(manifest: dict) -> None: diagnostic = negative["diagnosticContract"] expect( diagnostic["schemaVersion"] == "rc7-static10-diagnostic-contract-v1" - and diagnostic["requiredMissingPaths"] == generate_proof_catalog.RC7_REQUIRED_MISSING_PATHS + and diagnostic["requestedProverPaths"] == generate_proof_catalog.RC7_REQUESTED_PROVER_PATHS + and diagnostic["requiredFailurePath"] == generate_proof_catalog.RC7_REQUIRED_FAILURE_PATH + and diagnostic["failurePropagation"] == "proof-server-join-all-input-order-first-error" and diagnostic["sourceFiles"] == generate_proof_catalog.RC7_DIAGNOSTIC_SOURCES, "rc.7 source-derived diagnostic contract drift", ) diff --git a/scripts/proof_runtime_docker.py b/scripts/proof_runtime_docker.py index 1ee536d..53fc403 100755 --- a/scripts/proof_runtime_docker.py +++ b/scripts/proof_runtime_docker.py @@ -100,9 +100,10 @@ def inspect_image_identity(image_digest: str, expected_arch: str) -> dict: def static10_rejection_diagnostic(logs: str, state: str, negative: dict, image_identity: dict, observed_version: str) -> dict: contract = negative["diagnosticContract"] - required = contract["requiredMissingPaths"] - observed = [path for path in required if path in logs] - expect(observed == required, "rc.7 rejection lacks every exact source-derived static-10 path diagnostic") + requested = contract["requestedProverPaths"] + required = contract["requiredFailurePath"] + observed = [path for path in requested if path in logs] + expect(required in observed, f"rc.7 rejection lacks exact source-derived propagated static-10 path diagnostic: {required}; observed={observed}") parts = state.split() expect(len(parts) == 2 and parts[0] in {"exited", "dead"} and parts[1].isdigit() and int(parts[1]) != 0, "rc.7 negative must terminate non-zero after the static-10 diagnostic") expect(observed_version == negative["version"], "rc.7 image version differs from the source-pinned negative contract") @@ -114,7 +115,9 @@ def static10_rejection_diagnostic(logs: str, state: str, negative: dict, image_i "proofServerVersion": observed_version, "requiresLedgerStaticSemver": negative["requiresLedgerStaticSemver"], "cacheNamespace": negative["cacheNamespace"], - "requiredMissingPaths": required, + "requestedProverPaths": requested, + "requiredFailurePath": required, + "failurePropagation": contract["failurePropagation"], "observedMissingPaths": observed, "containerState": state, "image": image_identity, diff --git a/tests/test_proof_data.py b/tests/test_proof_data.py index 24eb402..985d642 100644 --- a/tests/test_proof_data.py +++ b/tests/test_proof_data.py @@ -353,10 +353,12 @@ def test_static10_negative_requires_specific_source_pinned_reason(self) -> None: with self.assertRaisesRegex(ForgeError, "source-derived"): proof_runtime_docker.static10_rejection_diagnostic("unrelated error", "exited 1", negative, image, "9.0.0-rc.7") with self.assertRaisesRegex(ForgeError, "source-derived"): - proof_runtime_docker.static10_rejection_diagnostic("zswap/10/spend.prover", "exited 1", negative, image, "9.0.0-rc.7") - logs = "\n".join(f"failed to fetch https://srs.midnight.network/{path}" for path in negative["diagnosticContract"]["requiredMissingPaths"]) + proof_runtime_docker.static10_rejection_diagnostic("zswap/10/output.prover", "exited 1", negative, image, "9.0.0-rc.7") + required = negative["diagnosticContract"]["requiredFailurePath"] + logs = f"failed to fetch https://srs.midnight.network/{required}" evidence = proof_runtime_docker.static10_rejection_diagnostic(logs, "exited 1", negative, image, "9.0.0-rc.7") - self.assertEqual(evidence["observedMissingPaths"], negative["diagnosticContract"]["requiredMissingPaths"]) + self.assertEqual(evidence["requiredFailurePath"], required) + self.assertEqual(evidence["observedMissingPaths"], [required]) self.assertEqual(len(evidence["canonicalSha256"]), 64) def test_bootstrap_atomic_noop_repair_pointer_failure_and_gc(self) -> None: From 508aab47ab266344aedd6359fe971928bed309b5 Mon Sep 17 00:00:00 2001 From: "Edward A." Date: Fri, 28 Aug 2026 08:18:18 -0400 Subject: [PATCH 7/7] Bind static-10 rejection to exact read-only diagnostic --- .../proof-data/q8b-cache-admission-v1.json | 2 +- catalog/proof-data/q8b-v1.json | 2 +- scripts/generate_proof_catalog.py | 15 ++++++-- scripts/proof_data_pipeline.py | 6 ++- scripts/proof_runtime_docker.py | 37 ++++++++++++++----- tests/test_proof_data.py | 24 ++++++++---- 6 files changed, 62 insertions(+), 24 deletions(-) diff --git a/catalog/proof-data/q8b-cache-admission-v1.json b/catalog/proof-data/q8b-cache-admission-v1.json index ae505b7..30659a7 100644 --- a/catalog/proof-data/q8b-cache-admission-v1.json +++ b/catalog/proof-data/q8b-cache-admission-v1.json @@ -1 +1 @@ -{"canonicalization":"forge-canonical-json-v1","contentManifest":{"canonicalization":"forge-canonical-json-v1","combinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","fileCount":32,"files":[{"generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":0,"kind":"srs","mode":"0644","officialAlias":null,"outerPayload":"bls_midnight_2p0","outerSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","path":"bls_midnight_2p0","provenance":"ledger-provider-compatibility","rootPotSha256":null,"sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":1,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p1","outerPayload":"bls_midnight_2p1","outerSha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","path":"bls_midnight_2p1","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":10,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p10","outerPayload":"bls_midnight_2p10","outerSha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","path":"bls_midnight_2p10","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":11,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p11","outerPayload":"bls_midnight_2p11","outerSha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","path":"bls_midnight_2p11","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":12,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p12","outerPayload":"bls_midnight_2p12","outerSha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","path":"bls_midnight_2p12","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":13,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p13","outerPayload":"bls_midnight_2p13","outerSha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","path":"bls_midnight_2p13","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":14,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p14","outerPayload":"bls_midnight_2p14","outerSha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","path":"bls_midnight_2p14","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":15,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p15","outerPayload":"bls_midnight_2p15","outerSha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","path":"bls_midnight_2p15","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":16,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p16","outerPayload":"bls_midnight_2p16","outerSha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","path":"bls_midnight_2p16","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":17,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p17","outerPayload":"bls_midnight_2p17","outerSha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","path":"bls_midnight_2p17","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":18,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p18","outerPayload":"bls_midnight_2p18","outerSha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","path":"bls_midnight_2p18","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":19,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p19","outerPayload":"bls_midnight_2p19","outerSha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","path":"bls_midnight_2p19","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":2,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p2","outerPayload":"bls_midnight_2p2","outerSha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","path":"bls_midnight_2p2","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":3,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p3","outerPayload":"bls_midnight_2p3","outerSha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","path":"bls_midnight_2p3","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":4,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p4","outerPayload":"bls_midnight_2p4","outerSha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","path":"bls_midnight_2p4","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":5,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p5","outerPayload":"bls_midnight_2p5","outerSha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","path":"bls_midnight_2p5","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":6,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p6","outerPayload":"bls_midnight_2p6","outerSha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","path":"bls_midnight_2p6","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":7,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p7","outerPayload":"bls_midnight_2p7","outerSha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","path":"bls_midnight_2p7","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":8,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p8","outerPayload":"bls_midnight_2p8","outerSha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","path":"bls_midnight_2p8","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":9,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p9","outerPayload":"bls_midnight_2p9","outerSha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","path":"bls_midnight_2p9","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311}],"identityProjection":"all fields except combinedManifestSha256 and identityProjection","ledgerStatic":{"cacheNamespace":"9","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","outerSize":21601265,"zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"payloadCount":21,"schemaVersion":"proof-cache-content-manifest-v1","selection":"q8b-k0-k19-ledger-static-9","srsGenerations":[{"canonicalObjectSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":[0],"provenance":"ledger-provider-compatibility","rootPotSha256":null,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"}]},"expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","proofSetSha256":"6426f265dc0ac53f51db7ce9194f4db38b785a9b04d1fb795ead97725eff3699","schemaVersion":"proof-cache-admission-v1","selection":"q8b-k0-k19-ledger-static-9"} \ No newline at end of file +{"canonicalization":"forge-canonical-json-v1","contentManifest":{"canonicalization":"forge-canonical-json-v1","combinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","fileCount":32,"files":[{"generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":0,"kind":"srs","mode":"0644","officialAlias":null,"outerPayload":"bls_midnight_2p0","outerSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","path":"bls_midnight_2p0","provenance":"ledger-provider-compatibility","rootPotSha256":null,"sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":1,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p1","outerPayload":"bls_midnight_2p1","outerSha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","path":"bls_midnight_2p1","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":10,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p10","outerPayload":"bls_midnight_2p10","outerSha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","path":"bls_midnight_2p10","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":11,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p11","outerPayload":"bls_midnight_2p11","outerSha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","path":"bls_midnight_2p11","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":12,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p12","outerPayload":"bls_midnight_2p12","outerSha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","path":"bls_midnight_2p12","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":13,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p13","outerPayload":"bls_midnight_2p13","outerSha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","path":"bls_midnight_2p13","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":14,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p14","outerPayload":"bls_midnight_2p14","outerSha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","path":"bls_midnight_2p14","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":15,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p15","outerPayload":"bls_midnight_2p15","outerSha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","path":"bls_midnight_2p15","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":16,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p16","outerPayload":"bls_midnight_2p16","outerSha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","path":"bls_midnight_2p16","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":17,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p17","outerPayload":"bls_midnight_2p17","outerSha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","path":"bls_midnight_2p17","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":18,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p18","outerPayload":"bls_midnight_2p18","outerSha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","path":"bls_midnight_2p18","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":19,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p19","outerPayload":"bls_midnight_2p19","outerSha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","path":"bls_midnight_2p19","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":2,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p2","outerPayload":"bls_midnight_2p2","outerSha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","path":"bls_midnight_2p2","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":3,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p3","outerPayload":"bls_midnight_2p3","outerSha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","path":"bls_midnight_2p3","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":4,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p4","outerPayload":"bls_midnight_2p4","outerSha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","path":"bls_midnight_2p4","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":5,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p5","outerPayload":"bls_midnight_2p5","outerSha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","path":"bls_midnight_2p5","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":6,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p6","outerPayload":"bls_midnight_2p6","outerSha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","path":"bls_midnight_2p6","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":7,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p7","outerPayload":"bls_midnight_2p7","outerSha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","path":"bls_midnight_2p7","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":8,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p8","outerPayload":"bls_midnight_2p8","outerSha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","path":"bls_midnight_2p8","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":9,"kind":"srs","mode":"0644","officialAlias":"midnight-srs-2p9","outerPayload":"bls_midnight_2p9","outerSha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","path":"bls_midnight_2p9","provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001},{"cacheNamespace":"9","kind":"ledger-static","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","mode":"0644","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311}],"identityProjection":"all fields except combinedManifestSha256 and identityProjection","ledgerStatic":{"cacheNamespace":"9","ledgerStaticSemver":"9.0.0","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","outerPayload":"midnight-ledger-static-noarch-9.0.0.zip","outerSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","outerSize":21601265,"zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"payloadCount":21,"schemaVersion":"proof-cache-content-manifest-v1","selection":"q8b-k0-k19-ledger-static-9","srsGenerations":[{"canonicalObjectSha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","k":[0],"provenance":"ledger-provider-compatibility","rootPotSha256":null,"sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","sourceRepository":"midnightntwrk/midnight-ledger"},{"generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","k":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"provenance":"trusted-setup-ceremony","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","sourceCommit":"3ea610263b228af24840f7b00661ee22360db6d8","sourceRepository":"midnightntwrk/midnight-trusted-setup"}]},"expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","proofSetSha256":"ca854fbf98cb0b3ae5343daf8b57524f3b0bb27476ad02731e093d92cc8c66dc","schemaVersion":"proof-cache-admission-v1","selection":"q8b-k0-k19-ledger-static-9"} \ No newline at end of file diff --git a/catalog/proof-data/q8b-v1.json b/catalog/proof-data/q8b-v1.json index 244090f..032e4f3 100644 --- a/catalog/proof-data/q8b-v1.json +++ b/catalog/proof-data/q8b-v1.json @@ -1 +1 @@ -{"artifactKind":"proof-data","cacheContract":{"admissionContractPath":"catalog/proof-data/q8b-cache-admission-v1.json","bootstrapMount":"read-write","cacheRootResolution":["MIDNIGHT_PP","XDG_CACHE_HOME/midnight/zk-params","$HOME/.cache/midnight/zk-params"],"currentPointer":"/proof-params/current","defaultSourceUrl":"https://srs.midnight.network/","expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","generationTemplate":"/proof-params/generations/{combinedManifestSha256}","githubAsMidnightParamSourceAllowed":false,"lock":"/proof-params/.bootstrap.lock","persistentParent":"/proof-params","readerMount":"read-only"},"compactCompatibility":{"backends":["zkir-v2","zkir-v3"],"ledgerMajor":9,"runtime":"0.19.0","version":"0.34.0","warehousePayloadAllowed":false},"counts":{"canonicalInputBytes":223087290,"ledgerMemberBytes":21753130,"ledgerPayloadCount":1,"payloadCount":21,"srsBytes":201334160,"srsPayloadCount":20},"decision":"Q8=B","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","evidencePolicy":{"legalCertaintyClaimed":false,"lineageMemberManifestRequired":true,"perBlobLicenseFileAvailable":false,"redistributionBasis":"Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload","softwareSbom":"not-applicable-proof-data"},"futureAdmission":{"appendOnly":true,"explicitGenerationRequiredWhenMultiple":true,"explicitMemberManifestRequiredWhenMultiple":true,"implicitLatestAllowed":false,"ledgerSemverBump":"midnight-ledger-static-noarch-{semver}.zip","sameKCorrection":"midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin","sameSemverCorrection":"midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip"},"ledgerStatic":{"aggregateMemberBytes":21753130,"archiveSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","archiveSize":21601265,"cacheNamespace":"9","componentId":"midnight-ledger-static-9.0.0","ledgerStaticRevision":"manifest-sha256:9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","ledgerStaticSemver":"9.0.0","memberManifestPath":"catalog/proof-data/ledger-static-9-member-manifest.json","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","members":[{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"sourceUrl":"https://srs.midnight.network/zswap/9/output.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/output.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"sourceUrl":"https://srs.midnight.network/zswap/9/output.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"sourceUrl":"https://srs.midnight.network/dust/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"sourceUrl":"https://srs.midnight.network/dust/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"sourceUrl":"https://srs.midnight.network/dust/9/spend.bzkir","transformation":"unchanged-archive-member"}],"releaseName":"midnight-ledger-static-noarch-9.0.0.zip","transformation":"deterministic-zip-assembly-from-unchanged-members","zipLayoutManifestPath":"catalog/proof-data/ledger-static-9-zip-layout-manifest.json","zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"platform":"noarch","proofServerCompatibility":{"accepted":{"cacheNamespace":"9","images":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","version":"9.0.0-rc.5"},"rejectedStatic9":{"cacheNamespace":"10","diagnosticContract":{"failurePropagation":"proof-server-join-all-input-order-first-error","reason":"source-pinned-static10-propagated-path-missing-from-static9-generation","requestedProverPaths":["zswap/10/spend.prover","zswap/10/output.prover","zswap/10/sign.prover","dust/10/spend.prover"],"requiredFailurePath":"zswap/10/spend.prover","schemaVersion":"rc7-static10-diagnostic-contract-v1","sourceFiles":[{"path":"proof-server/src/main.rs","sha256":"1a0de2c7b4f68894a50195bf67794faa23205fd6687082b88cbd151d9d0e820f"},{"path":"ledger/src/dust.rs","sha256":"6b3dd3177eefafa55da2d678bb505922d5a41c4d4465e5b2fb42eb400d53d703"},{"path":"zswap/src/prove.rs","sha256":"3ccb32bb5599c097f7f3829441944735ddde2cf199f737222736755d33fc3315"},{"path":"static/version","sha256":"4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5"}]},"images":{"linux/amd64":"sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613","linux/arm64":"sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb"},"mayReuseSrsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","publicMultiarchTag":false,"requiresLedgerStaticSemver":"10.0.0","sourceCommit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","version":"9.0.0-rc.7"}},"releaseMutability":"mutable-warehouse","schemaVersion":"proof-data-set-v1","scope":{"customProvingKeysIncluded":false,"directGithubAssetForbiddenK":[24,25],"futureKRequiresReview":[20,21,22,23,24,25],"observedCircuitK":[5,8,9,10,11,12,13,14,15,16,18,19],"srsK":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"startupPrefetchK":[10,11,12,13,14,15]},"setId":"q8b-k0-k19-ledger-static-9","sourcePins":{"ledgerStatic10Negative":{"cacheNamespace":"10","commit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","ledgerStaticSemver":"10.0.0","repository":"midnightntwrk/midnight-ledger","tree":"bfa37732f879bd29b4a67f7a1567260431c0f43b"},"ledgerStatic9":{"cacheNamespace":"9","commit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","ledgerStaticSemver":"9.0.0","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","providerPath":"base-crypto/src/data_provider.rs","providerSha256":"4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a","repository":"midnightntwrk/midnight-ledger","startupPath":"proof-server/src/main.rs","startupSha256":"342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64","tree":"0b39ecaa6502dcb05352786df2b02bb0a622ee38"},"trustedSetup":{"catalogPath":"MIDNIGHT_SRS_CATALOG.md","catalogSha256":"8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f","commit":"3ea610263b228af24840f7b00661ee22360db6d8","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","repository":"midnightntwrk/midnight-trusted-setup","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","tree":"19888a217d9228324dff60b685b50deea4afcac5"}},"srs":[{"artifactKind":"proof-data","componentId":"midnight-srs-k0","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","installName":"bls_midnight_2p0","k":0,"mode":"0644","officialAlias":null,"officialUrl":null,"platform":"noarch","releaseName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p0","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k1","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p1","k":1,"mode":"0644","officialAlias":"midnight-srs-2p1","officialUrl":"https://srs.midnight.network/midnight-srs-2p1","platform":"noarch","releaseName":"bls_midnight_2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p1","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k2","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p2","k":2,"mode":"0644","officialAlias":"midnight-srs-2p2","officialUrl":"https://srs.midnight.network/midnight-srs-2p2","platform":"noarch","releaseName":"bls_midnight_2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p2","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k3","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p3","k":3,"mode":"0644","officialAlias":"midnight-srs-2p3","officialUrl":"https://srs.midnight.network/midnight-srs-2p3","platform":"noarch","releaseName":"bls_midnight_2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p3","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k4","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p4","k":4,"mode":"0644","officialAlias":"midnight-srs-2p4","officialUrl":"https://srs.midnight.network/midnight-srs-2p4","platform":"noarch","releaseName":"bls_midnight_2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p4","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k5","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p5","k":5,"mode":"0644","officialAlias":"midnight-srs-2p5","officialUrl":"https://srs.midnight.network/midnight-srs-2p5","platform":"noarch","releaseName":"bls_midnight_2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p5","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k6","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p6","k":6,"mode":"0644","officialAlias":"midnight-srs-2p6","officialUrl":"https://srs.midnight.network/midnight-srs-2p6","platform":"noarch","releaseName":"bls_midnight_2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p6","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k7","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p7","k":7,"mode":"0644","officialAlias":"midnight-srs-2p7","officialUrl":"https://srs.midnight.network/midnight-srs-2p7","platform":"noarch","releaseName":"bls_midnight_2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p7","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k8","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p8","k":8,"mode":"0644","officialAlias":"midnight-srs-2p8","officialUrl":"https://srs.midnight.network/midnight-srs-2p8","platform":"noarch","releaseName":"bls_midnight_2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p8","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k9","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p9","k":9,"mode":"0644","officialAlias":"midnight-srs-2p9","officialUrl":"https://srs.midnight.network/midnight-srs-2p9","platform":"noarch","releaseName":"bls_midnight_2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p9","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k10","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p10","k":10,"mode":"0644","officialAlias":"midnight-srs-2p10","officialUrl":"https://srs.midnight.network/midnight-srs-2p10","platform":"noarch","releaseName":"bls_midnight_2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p10","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k11","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p11","k":11,"mode":"0644","officialAlias":"midnight-srs-2p11","officialUrl":"https://srs.midnight.network/midnight-srs-2p11","platform":"noarch","releaseName":"bls_midnight_2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p11","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k12","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p12","k":12,"mode":"0644","officialAlias":"midnight-srs-2p12","officialUrl":"https://srs.midnight.network/midnight-srs-2p12","platform":"noarch","releaseName":"bls_midnight_2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p12","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k13","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p13","k":13,"mode":"0644","officialAlias":"midnight-srs-2p13","officialUrl":"https://srs.midnight.network/midnight-srs-2p13","platform":"noarch","releaseName":"bls_midnight_2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p13","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k14","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p14","k":14,"mode":"0644","officialAlias":"midnight-srs-2p14","officialUrl":"https://srs.midnight.network/midnight-srs-2p14","platform":"noarch","releaseName":"bls_midnight_2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p14","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k15","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p15","k":15,"mode":"0644","officialAlias":"midnight-srs-2p15","officialUrl":"https://srs.midnight.network/midnight-srs-2p15","platform":"noarch","releaseName":"bls_midnight_2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p15","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k16","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p16","k":16,"mode":"0644","officialAlias":"midnight-srs-2p16","officialUrl":"https://srs.midnight.network/midnight-srs-2p16","platform":"noarch","releaseName":"bls_midnight_2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p16","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k17","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p17","k":17,"mode":"0644","officialAlias":"midnight-srs-2p17","officialUrl":"https://srs.midnight.network/midnight-srs-2p17","platform":"noarch","releaseName":"bls_midnight_2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p17","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k18","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p18","k":18,"mode":"0644","officialAlias":"midnight-srs-2p18","officialUrl":"https://srs.midnight.network/midnight-srs-2p18","platform":"noarch","releaseName":"bls_midnight_2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p18","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k19","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p19","k":19,"mode":"0644","officialAlias":"midnight-srs-2p19","officialUrl":"https://srs.midnight.network/midnight-srs-2p19","platform":"noarch","releaseName":"bls_midnight_2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p19","transformation":"unchanged-identity-mirror"}],"warning":"DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use."} \ No newline at end of file +{"artifactKind":"proof-data","cacheContract":{"admissionContractPath":"catalog/proof-data/q8b-cache-admission-v1.json","bootstrapMount":"read-write","cacheRootResolution":["MIDNIGHT_PP","XDG_CACHE_HOME/midnight/zk-params","$HOME/.cache/midnight/zk-params"],"currentPointer":"/proof-params/current","defaultSourceUrl":"https://srs.midnight.network/","expectedCombinedManifestSha256":"b73584978fc560bb827fd9df3ad914b37a6f5ea434fe62e9fa0adad809d8486c","generationTemplate":"/proof-params/generations/{combinedManifestSha256}","githubAsMidnightParamSourceAllowed":false,"lock":"/proof-params/.bootstrap.lock","persistentParent":"/proof-params","readerMount":"read-only"},"compactCompatibility":{"backends":["zkir-v2","zkir-v3"],"ledgerMajor":9,"runtime":"0.19.0","version":"0.34.0","warehousePayloadAllowed":false},"counts":{"canonicalInputBytes":223087290,"ledgerMemberBytes":21753130,"ledgerPayloadCount":1,"payloadCount":21,"srsBytes":201334160,"srsPayloadCount":20},"decision":"Q8=B","destination":{"repository":"effectstream/binaries","tag":"0.3.120"},"distributionTier":"development-only","evidencePolicy":{"legalCertaintyClaimed":false,"lineageMemberManifestRequired":true,"perBlobLicenseFileAvailable":false,"redistributionBasis":"Apache-2.0 source/catalog attribution plus public unchanged-object distribution; explicit owner acceptance required before Phase 8 upload","softwareSbom":"not-applicable-proof-data"},"futureAdmission":{"appendOnly":true,"explicitGenerationRequiredWhenMultiple":true,"explicitMemberManifestRequiredWhenMultiple":true,"implicitLatestAllowed":false,"ledgerSemverBump":"midnight-ledger-static-noarch-{semver}.zip","sameKCorrection":"midnight-srs-noarch-2p{k}-{ts-|provider--sha256-|sha256-}.bin","sameSemverCorrection":"midnight-ledger-static-noarch-{semver}-manifest-sha256-{full-member-manifest-digest}.zip"},"ledgerStatic":{"aggregateMemberBytes":21753130,"archiveSha256":"d7e8ccfdbc55a2b7139aadd4797d665f888a4502b63ebae24d23314eeee341b2","archiveSize":21601265,"cacheNamespace":"9","componentId":"midnight-ledger-static-9.0.0","ledgerStaticRevision":"manifest-sha256:9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","ledgerStaticSemver":"9.0.0","memberManifestPath":"catalog/proof-data/ledger-static-9-member-manifest.json","memberManifestSha256":"9ba79d1d49d10465f46db247ffe5e4ae3f779ad06f07d1869169a427a907ac0c","members":[{"mode":"0644","path":"zswap/9/spend.prover","sha256":"19d234b5c68b7212ad6b0ec9334a95594748154128f3704eb576bcc843cc5c45","size":11020001,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.verifier","sha256":"544554effd7ae9fb9063be52a9ec2a986756301071fcd97bb4598fb45a335658","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/spend.bzkir","sha256":"7cb5bbcf67cb212a3336fb439a77e8f32f0aa8a56185c8e1247d6cbfc7300205","size":1294,"sourceUrl":"https://srs.midnight.network/zswap/9/spend.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.prover","sha256":"d992b04f13c3fd432f55fb8bfe6466d87bc181f1a2acf233ec228030bbdd4ed8","size":5730182,"sourceUrl":"https://srs.midnight.network/zswap/9/output.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.verifier","sha256":"72e8074856f2f5c504ade25a86a2b8902c64aeb9497c4c8e6b26dea842a0ab08","size":2311,"sourceUrl":"https://srs.midnight.network/zswap/9/output.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/output.bzkir","sha256":"91dc8b401dd8385e8d29eaac018c70b578505f48c7952452ef319bc397fa1f1b","size":494,"sourceUrl":"https://srs.midnight.network/zswap/9/output.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.prover","sha256":"fe7268dd2bdd107f862f881ac3c5bc71a6df77ce80bfed51cf71514648e660e0","size":2814823,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.verifier","sha256":"e39a727caa0de167e6dd6122a9e3b758fecf48f9093ab77c0309648de8ce07e1","size":2023,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"zswap/9/sign.bzkir","sha256":"37ea2094516e145a738126307cf92bd293f7cb524b1ccd49fa6f3225a9ec3a50","size":114,"sourceUrl":"https://srs.midnight.network/zswap/9/sign.bzkir","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.prover","sha256":"996602da7ca386284e656c78ea03e55bffdba29475e6a67965c50de05e13efc2","size":2175671,"sourceUrl":"https://srs.midnight.network/dust/9/spend.prover","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.verifier","sha256":"3f1569ebcab0655c5c145b28947c74edc4e3f5c6b276e4404b661cf0905b49d3","size":1351,"sourceUrl":"https://srs.midnight.network/dust/9/spend.verifier","transformation":"unchanged-archive-member"},{"mode":"0644","path":"dust/9/spend.bzkir","sha256":"904181287e75b0fb596ba5fcc116c882ee5d28e3115304c93ebd913722ce5841","size":2555,"sourceUrl":"https://srs.midnight.network/dust/9/spend.bzkir","transformation":"unchanged-archive-member"}],"releaseName":"midnight-ledger-static-noarch-9.0.0.zip","transformation":"deterministic-zip-assembly-from-unchanged-members","zipLayoutManifestPath":"catalog/proof-data/ledger-static-9-zip-layout-manifest.json","zipLayoutManifestSha256":"c234479391542c2440e9f4ded1bb7c601365ef433fecb161d80311bc2bcfa2d7"},"platform":"noarch","proofServerCompatibility":{"accepted":{"cacheNamespace":"9","images":{"experimental":"sha256:4f02ca2734649eb238d13924df299b1c82bd5546ec928c5d67bdd0ce86dd0bd1","plain":"sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9"},"ledgerStaticSemver":"9.0.0","sourceCommit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","version":"9.0.0-rc.5"},"rejectedStatic9":{"cacheNamespace":"10","diagnosticContract":{"derivation":"source-static-version-10-first-zswap-spend-create-dir-on-read-only-generation","derivedMissingPath":"zswap/10/spend.prover","reason":"source-pinned-static10-missing-from-read-only-static9-generation","requestedProverPaths":["zswap/10/spend.prover","zswap/10/output.prover","zswap/10/sign.prover","dust/10/spend.prover"],"requiredLogTokens":["Ensuring zswap key material is available...","Error: Os { code: 30, kind: ReadOnlyFilesystem, message: \"Read-only file system\" }"],"schemaVersion":"rc7-static10-diagnostic-contract-v1","sourceFiles":[{"path":"proof-server/src/main.rs","sha256":"1a0de2c7b4f68894a50195bf67794faa23205fd6687082b88cbd151d9d0e820f"},{"path":"ledger/src/dust.rs","sha256":"6b3dd3177eefafa55da2d678bb505922d5a41c4d4465e5b2fb42eb400d53d703"},{"path":"zswap/src/prove.rs","sha256":"3ccb32bb5599c097f7f3829441944735ddde2cf199f737222736755d33fc3315"},{"path":"static/version","sha256":"4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5"}],"static9PeerPath":"zswap/9/spend.prover"},"images":{"linux/amd64":"sha256:c22331706f2ec5e946bb93aa03785b3059f649ac17bfc8e5fb731349f07d9613","linux/arm64":"sha256:d7fbdcb0fd3eeadded75415716f7792f5ea2296c432bdebd97e834a9fef3f1eb"},"mayReuseSrsGeneration":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","publicMultiarchTag":false,"requiresLedgerStaticSemver":"10.0.0","sourceCommit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","version":"9.0.0-rc.7"}},"releaseMutability":"mutable-warehouse","schemaVersion":"proof-data-set-v1","scope":{"customProvingKeysIncluded":false,"directGithubAssetForbiddenK":[24,25],"futureKRequiresReview":[20,21,22,23,24,25],"observedCircuitK":[5,8,9,10,11,12,13,14,15,16,18,19],"srsK":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"startupPrefetchK":[10,11,12,13,14,15]},"setId":"q8b-k0-k19-ledger-static-9","sourcePins":{"ledgerStatic10Negative":{"cacheNamespace":"10","commit":"cd652d7f97b34b805bb5f0310ce7434eb883af38","ledgerStaticSemver":"10.0.0","repository":"midnightntwrk/midnight-ledger","tree":"bfa37732f879bd29b4a67f7a1567260431c0f43b"},"ledgerStatic9":{"cacheNamespace":"9","commit":"7a89f45d29792be7e09ca5eb246f1e69f0b2a179","ledgerStaticSemver":"9.0.0","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","providerPath":"base-crypto/src/data_provider.rs","providerSha256":"4143bc2e003876a33d5179484aee224b150336a08a43e8746768318ea3b2f20a","repository":"midnightntwrk/midnight-ledger","startupPath":"proof-server/src/main.rs","startupSha256":"342498be672cfa4da16766da4e0fabe2212f70753b42d3950a219dc903625e64","tree":"0b39ecaa6502dcb05352786df2b02bb0a622ee38"},"trustedSetup":{"catalogPath":"MIDNIGHT_SRS_CATALOG.md","catalogSha256":"8809d1aa92c82dc694176ae0e7700d1863184846417501c8f868e2257d38582f","commit":"3ea610263b228af24840f7b00661ee22360db6d8","licenseSha256":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","repository":"midnightntwrk/midnight-trusted-setup","rootPotSha256":"df7a1e9fcd6d3f6e8ddd777914c40c44cd29777b769e608c0604fbfbe83121ce","tree":"19888a217d9228324dff60b685b50deea4afcac5"}},"srs":[{"artifactKind":"proof-data","componentId":"midnight-srs-k0","generation":"midnight-ledger-provider-compat@7a89f45d29792be7e09ca5eb246f1e69f0b2a179/sha256:59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","installName":"bls_midnight_2p0","k":0,"mode":"0644","officialAlias":null,"officialUrl":null,"platform":"noarch","releaseName":"bls_midnight_2p0","sha256":"59b30b3114a34ccbbfb599376e178fb8d9b3366cae2174c2f1da20e75847f823","size":580,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p0","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k1","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p1","k":1,"mode":"0644","officialAlias":"midnight-srs-2p1","officialUrl":"https://srs.midnight.network/midnight-srs-2p1","platform":"noarch","releaseName":"bls_midnight_2p1","sha256":"bbe04fe3c70d0c138447cb086b4baddc30cb8bb2a004114bc02e6f739516280e","size":772,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p1","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k2","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p2","k":2,"mode":"0644","officialAlias":"midnight-srs-2p2","officialUrl":"https://srs.midnight.network/midnight-srs-2p2","platform":"noarch","releaseName":"bls_midnight_2p2","sha256":"80e15568fa1a0117db893239be7fa5e34a6bcc3a8c3bfa7709534b9cb88eb6c1","size":1156,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p2","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k3","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p3","k":3,"mode":"0644","officialAlias":"midnight-srs-2p3","officialUrl":"https://srs.midnight.network/midnight-srs-2p3","platform":"noarch","releaseName":"bls_midnight_2p3","sha256":"4be827a6472193df80d8f08b4b25a85baef436fdd1965d89b6af89f4ec4e99e2","size":1924,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p3","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k4","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p4","k":4,"mode":"0644","officialAlias":"midnight-srs-2p4","officialUrl":"https://srs.midnight.network/midnight-srs-2p4","platform":"noarch","releaseName":"bls_midnight_2p4","sha256":"232f401fad10c7ddf8828d2aa4c85c6506c5da09795998cecaeb9f75fc8f6ada","size":3460,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p4","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k5","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p5","k":5,"mode":"0644","officialAlias":"midnight-srs-2p5","officialUrl":"https://srs.midnight.network/midnight-srs-2p5","platform":"noarch","releaseName":"bls_midnight_2p5","sha256":"0a1c9229f315fc1868ff25f668fb83aec4d09f4f23a706b5197c692c619d72c6","size":6532,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p5","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k6","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p6","k":6,"mode":"0644","officialAlias":"midnight-srs-2p6","officialUrl":"https://srs.midnight.network/midnight-srs-2p6","platform":"noarch","releaseName":"bls_midnight_2p6","sha256":"cf2ad6be7d0fedf5bec2aaa35f6be4aca33053d74268fdf5aa54fcb2891ea6df","size":12676,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p6","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k7","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p7","k":7,"mode":"0644","officialAlias":"midnight-srs-2p7","officialUrl":"https://srs.midnight.network/midnight-srs-2p7","platform":"noarch","releaseName":"bls_midnight_2p7","sha256":"e82ae890c080188355f37feaffe91372584cd810615082d9143d4dec0453fd9d","size":24964,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p7","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k8","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p8","k":8,"mode":"0644","officialAlias":"midnight-srs-2p8","officialUrl":"https://srs.midnight.network/midnight-srs-2p8","platform":"noarch","releaseName":"bls_midnight_2p8","sha256":"909b707551eaaea79828e883cde6fc46ab15986c3b1d791bed462c9e2805c933","size":49540,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p8","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k9","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p9","k":9,"mode":"0644","officialAlias":"midnight-srs-2p9","officialUrl":"https://srs.midnight.network/midnight-srs-2p9","platform":"noarch","releaseName":"bls_midnight_2p9","sha256":"b9009f1098bcefffec3c461ab3a5e3a17f7e5599f0f08c70fcdc55a89227bcbd","size":98692,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p9","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k10","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p10","k":10,"mode":"0644","officialAlias":"midnight-srs-2p10","officialUrl":"https://srs.midnight.network/midnight-srs-2p10","platform":"noarch","releaseName":"bls_midnight_2p10","sha256":"46b2290933cbed4c378889e4ba971f1a92888331ffb09466acd4ff61a1e2cb42","size":196996,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p10","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k11","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p11","k":11,"mode":"0644","officialAlias":"midnight-srs-2p11","officialUrl":"https://srs.midnight.network/midnight-srs-2p11","platform":"noarch","releaseName":"bls_midnight_2p11","sha256":"9901589d7956ff58be0d85569b2f455b77b58c3758026ffb5bbe4807000b96d1","size":393604,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p11","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k12","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p12","k":12,"mode":"0644","officialAlias":"midnight-srs-2p12","officialUrl":"https://srs.midnight.network/midnight-srs-2p12","platform":"noarch","releaseName":"bls_midnight_2p12","sha256":"ef08eb3fcf62df8f72c515cffa027e681808b530cb016eea104115545ef6d5c8","size":786820,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p12","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k13","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p13","k":13,"mode":"0644","officialAlias":"midnight-srs-2p13","officialUrl":"https://srs.midnight.network/midnight-srs-2p13","platform":"noarch","releaseName":"bls_midnight_2p13","sha256":"d3324910969c4cc54143b8045b649e5c3a4bd5fb7b8f85fe1b770f640ce1c803","size":1573252,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p13","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k14","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p14","k":14,"mode":"0644","officialAlias":"midnight-srs-2p14","officialUrl":"https://srs.midnight.network/midnight-srs-2p14","platform":"noarch","releaseName":"bls_midnight_2p14","sha256":"fc253016885ec830e97808c9ec920bb5cab5c21af590380a6cb5eb0538e2b244","size":3146116,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p14","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k15","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p15","k":15,"mode":"0644","officialAlias":"midnight-srs-2p15","officialUrl":"https://srs.midnight.network/midnight-srs-2p15","platform":"noarch","releaseName":"bls_midnight_2p15","sha256":"724c7c3d779148bb113c7ee9c034b2f27db16e6bdf315fde90105a9bad00b1de","size":6291844,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p15","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k16","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p16","k":16,"mode":"0644","officialAlias":"midnight-srs-2p16","officialUrl":"https://srs.midnight.network/midnight-srs-2p16","platform":"noarch","releaseName":"bls_midnight_2p16","sha256":"09c877216d6589b370263e18af40a030a901b41a7a7c37ef58c9901db41f05c6","size":12583300,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p16","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k17","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p17","k":17,"mode":"0644","officialAlias":"midnight-srs-2p17","officialUrl":"https://srs.midnight.network/midnight-srs-2p17","platform":"noarch","releaseName":"bls_midnight_2p17","sha256":"4a9ef6c7c0619aab74eede44b13e753e3ba54508a02dd3b7106a949aabb73b74","size":25166212,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p17","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k18","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p18","k":18,"mode":"0644","officialAlias":"midnight-srs-2p18","officialUrl":"https://srs.midnight.network/midnight-srs-2p18","platform":"noarch","releaseName":"bls_midnight_2p18","sha256":"e8436dc5d8b598f169c127c745135d889744007e6d384ff126df8d1332522f86","size":50332036,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p18","transformation":"unchanged-identity-mirror"},{"artifactKind":"proof-data","componentId":"midnight-srs-k19","generation":"midnight-trusted-setup@3ea610263b228af24840f7b00661ee22360db6d8","installName":"bls_midnight_2p19","k":19,"mode":"0644","officialAlias":"midnight-srs-2p19","officialUrl":"https://srs.midnight.network/midnight-srs-2p19","platform":"noarch","releaseName":"bls_midnight_2p19","sha256":"8e8dc15c4362f05c912f1e770559a3945db3e58a374def416ed5d3e65ad5b10e","size":100663684,"sourceUrl":"https://srs.midnight.network/bls_midnight_2p19","transformation":"unchanged-identity-mirror"}],"warning":"DEVELOPMENT ONLY — NOT FOR PRODUCTION USE. Release 0.3.120 is mutable; verify every SHA-256 before installation or use."} \ No newline at end of file diff --git a/scripts/generate_proof_catalog.py b/scripts/generate_proof_catalog.py index 7739c86..51da9f7 100755 --- a/scripts/generate_proof_catalog.py +++ b/scripts/generate_proof_catalog.py @@ -45,7 +45,12 @@ "zswap/10/sign.prover", "dust/10/spend.prover", ] -RC7_REQUIRED_FAILURE_PATH = RC7_REQUESTED_PROVER_PATHS[0] +RC7_DERIVED_MISSING_PATH = RC7_REQUESTED_PROVER_PATHS[0] +RC7_STATIC9_PEER_PATH = RC7_DERIVED_MISSING_PATH.replace("/10/", "/9/") +RC7_REQUIRED_LOG_TOKENS = [ + "Ensuring zswap key material is available...", + 'Error: Os { code: 30, kind: ReadOnlyFilesystem, message: "Read-only file system" }', +] def exact_rc5_consumer() -> dict: @@ -284,9 +289,11 @@ def proof_set(pins: dict, member_digest: str, zip_layout_digest: str) -> dict: "schemaVersion": "rc7-static10-diagnostic-contract-v1", "sourceFiles": RC7_DIAGNOSTIC_SOURCES, "requestedProverPaths": RC7_REQUESTED_PROVER_PATHS, - "requiredFailurePath": RC7_REQUIRED_FAILURE_PATH, - "failurePropagation": "proof-server-join-all-input-order-first-error", - "reason": "source-pinned-static10-propagated-path-missing-from-static9-generation", + "derivedMissingPath": RC7_DERIVED_MISSING_PATH, + "static9PeerPath": RC7_STATIC9_PEER_PATH, + "derivation": "source-static-version-10-first-zswap-spend-create-dir-on-read-only-generation", + "requiredLogTokens": RC7_REQUIRED_LOG_TOKENS, + "reason": "source-pinned-static10-missing-from-read-only-static9-generation", }, }, }, diff --git a/scripts/proof_data_pipeline.py b/scripts/proof_data_pipeline.py index fb7c370..26af715 100755 --- a/scripts/proof_data_pipeline.py +++ b/scripts/proof_data_pipeline.py @@ -125,8 +125,10 @@ def validate_manifest(manifest: dict) -> None: expect( diagnostic["schemaVersion"] == "rc7-static10-diagnostic-contract-v1" and diagnostic["requestedProverPaths"] == generate_proof_catalog.RC7_REQUESTED_PROVER_PATHS - and diagnostic["requiredFailurePath"] == generate_proof_catalog.RC7_REQUIRED_FAILURE_PATH - and diagnostic["failurePropagation"] == "proof-server-join-all-input-order-first-error" + and diagnostic["derivedMissingPath"] == generate_proof_catalog.RC7_DERIVED_MISSING_PATH + and diagnostic["static9PeerPath"] == generate_proof_catalog.RC7_STATIC9_PEER_PATH + and diagnostic["derivation"] == "source-static-version-10-first-zswap-spend-create-dir-on-read-only-generation" + and diagnostic["requiredLogTokens"] == generate_proof_catalog.RC7_REQUIRED_LOG_TOKENS and diagnostic["sourceFiles"] == generate_proof_catalog.RC7_DIAGNOSTIC_SOURCES, "rc.7 source-derived diagnostic contract drift", ) diff --git a/scripts/proof_runtime_docker.py b/scripts/proof_runtime_docker.py index 53fc403..7c1a2e8 100755 --- a/scripts/proof_runtime_docker.py +++ b/scripts/proof_runtime_docker.py @@ -100,10 +100,9 @@ def inspect_image_identity(image_digest: str, expected_arch: str) -> dict: def static10_rejection_diagnostic(logs: str, state: str, negative: dict, image_identity: dict, observed_version: str) -> dict: contract = negative["diagnosticContract"] - requested = contract["requestedProverPaths"] - required = contract["requiredFailurePath"] - observed = [path for path in requested if path in logs] - expect(required in observed, f"rc.7 rejection lacks exact source-derived propagated static-10 path diagnostic: {required}; observed={observed}") + tokens = contract["requiredLogTokens"] + positions = [logs.find(token) for token in tokens] + expect(all(position >= 0 for position in positions) and positions == sorted(positions), "rc.7 rejection lacks the ordered exact startup/read-only-generation diagnostic") parts = state.split() expect(len(parts) == 2 and parts[0] in {"exited", "dead"} and parts[1].isdigit() and int(parts[1]) != 0, "rc.7 negative must terminate non-zero after the static-10 diagnostic") expect(observed_version == negative["version"], "rc.7 image version differs from the source-pinned negative contract") @@ -115,10 +114,12 @@ def static10_rejection_diagnostic(logs: str, state: str, negative: dict, image_i "proofServerVersion": observed_version, "requiresLedgerStaticSemver": negative["requiresLedgerStaticSemver"], "cacheNamespace": negative["cacheNamespace"], - "requestedProverPaths": requested, - "requiredFailurePath": required, - "failurePropagation": contract["failurePropagation"], - "observedMissingPaths": observed, + "requestedProverPaths": contract["requestedProverPaths"], + "derivedMissingPath": contract["derivedMissingPath"], + "static9PeerPath": contract["static9PeerPath"], + "derivation": contract["derivation"], + "requiredLogTokens": tokens, + "observedLogTokens": tokens, "containerState": state, "image": image_identity, "logSha256": hashlib.sha256(logs.encode()).hexdigest(), @@ -154,6 +155,13 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, proof_set = load_json(ROOT / "catalog/proof-data/q8b-v1.json") positive = proof_set["proofServerCompatibility"]["accepted"] negative = proof_set["proofServerCompatibility"]["rejectedStatic9"] + diagnostic_contract = negative["diagnosticContract"] + admitted_paths = {row["path"] for row in content["files"]} + expect( + all(path not in admitted_paths for path in diagnostic_contract["requestedProverPaths"]) + and diagnostic_contract["static9PeerPath"] in admitted_paths, + "trusted Q8B content does not prove exact static-10 absence with its static-9 peer present", + ) expected_rc7 = negative["images"][f"linux/{arch}"] expect(digest == proof_set["cacheContract"]["expectedCombinedManifestSha256"], "candidate generation differs from the reviewed Q8B contract") volume = f"q8b-proof-{run_key}-{arch}".lower().replace("_", "-") @@ -344,8 +352,19 @@ def runtime_gate(candidate_root: Path, work_root: Path, os_name: str, arch: str, time.sleep(1) _, _, logs = container_logs(negative_name) expect(not became_ready, "rc.7/static-10 incorrectly accepted static-9") - run(["docker", "rm", "--force", negative_name], timeout=30, check=False) + negative_mount = inspect_reader(negative_name, fixed) diagnostic = static10_rejection_diagnostic(logs, state, negative, image_identity, negative_version) + diagnostic["trustedContent"] = { + "combinedManifestSha256": digest, + "requestedProverPathsAbsent": True, + "derivedMissingPath": diagnostic_contract["derivedMissingPath"], + "static9PeerPath": diagnostic_contract["static9PeerPath"], + "static9PeerPresent": True, + } + diagnostic["mount"] = negative_mount + diagnostic.pop("canonicalSha256") + diagnostic["canonicalSha256"] = hashlib.sha256(canonical_bytes(diagnostic)).hexdigest() + run(["docker", "rm", "--force", negative_name], timeout=30, check=False) result = { "schemaVersion": "proof-runtime-docker-result-v1", diff --git a/tests/test_proof_data.py b/tests/test_proof_data.py index 985d642..494cba4 100644 --- a/tests/test_proof_data.py +++ b/tests/test_proof_data.py @@ -236,6 +236,10 @@ def test_generated_catalog_is_canonical_and_all_components_validate(self) -> Non self.assertEqual(content["srsGenerations"][1]["k"], list(range(1, 20))) self.assertIsNone(content["srsGenerations"][0]["rootPotSha256"]) self.assertEqual(content["srsGenerations"][1]["rootPotSha256"], generate_proof_catalog.ROOT_POT) + content_paths = {row["path"] for row in content["files"]} + negative = manifest["proofServerCompatibility"]["rejectedStatic9"]["diagnosticContract"] + self.assertNotIn(negative["derivedMissingPath"], content_paths) + self.assertIn(negative["static9PeerPath"], content_paths) for path in sorted((ROOT / "catalog/components").glob("midnight-*.json")): validate_catalog.validate_component(json.loads(path.read_text())) @@ -350,17 +354,23 @@ def test_static10_negative_requires_specific_source_pinned_reason(self) -> None: "os": "linux", "architecture": "amd64", } - with self.assertRaisesRegex(ForgeError, "source-derived"): + with self.assertRaisesRegex(ForgeError, "startup/read-only"): proof_runtime_docker.static10_rejection_diagnostic("unrelated error", "exited 1", negative, image, "9.0.0-rc.7") - with self.assertRaisesRegex(ForgeError, "source-derived"): - proof_runtime_docker.static10_rejection_diagnostic("zswap/10/output.prover", "exited 1", negative, image, "9.0.0-rc.7") - required = negative["diagnosticContract"]["requiredFailurePath"] - logs = f"failed to fetch https://srs.midnight.network/{required}" + with self.assertRaisesRegex(ForgeError, "startup/read-only"): + proof_runtime_docker.static10_rejection_diagnostic('Error: Os { code: 30, kind: ReadOnlyFilesystem, message: "Read-only file system" }', "exited 1", negative, image, "9.0.0-rc.7") + with self.assertRaisesRegex(ForgeError, "startup/read-only"): + proof_runtime_docker.static10_rejection_diagnostic("\n".join(reversed(negative["diagnosticContract"]["requiredLogTokens"])), "exited 1", negative, image, "9.0.0-rc.7") + logs = "\n".join(negative["diagnosticContract"]["requiredLogTokens"]) evidence = proof_runtime_docker.static10_rejection_diagnostic(logs, "exited 1", negative, image, "9.0.0-rc.7") - self.assertEqual(evidence["requiredFailurePath"], required) - self.assertEqual(evidence["observedMissingPaths"], [required]) + self.assertEqual(evidence["derivedMissingPath"], "zswap/10/spend.prover") + self.assertEqual(evidence["observedLogTokens"], negative["diagnosticContract"]["requiredLogTokens"]) self.assertEqual(len(evidence["canonicalSha256"]), 64) + weakened = json.loads((ROOT / "catalog/proof-data/q8b-v1.json").read_text()) + weakened["proofServerCompatibility"]["rejectedStatic9"]["diagnosticContract"]["requiredLogTokens"] = ["Read-only file system"] + with self.assertRaisesRegex(ForgeError, "diagnostic contract drift"): + proof_data_pipeline.validate_manifest(weakened) + def test_bootstrap_atomic_noop_repair_pointer_failure_and_gc(self) -> None: with tempfile.TemporaryDirectory() as text: root = Path(text)